ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTNkMjAKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjUyIEBACisjIyBJZ25vcmUgVmlzdWFsIFN0dWRpbyB0ZW1wb3JhcnkgZmlsZXMsIGJ1aWxkIHJlc3VsdHMsIGFuZAorIyMgZmlsZXMgZ2VuZXJhdGVkIGJ5IHBvcHVsYXIgVmlzdWFsIFN0dWRpbyBhZGQtb25zLgorCisjIFVzZXItc3BlY2lmaWMgZmlsZXMKKyouc3VvCisqLnVzZXIKKyoudXNlcm9zc2NhY2hlCisqLnNsbi5kb2NzdGF0ZXMKKworIyBVc2VyLXNwZWNpZmljIGZpbGVzIChNb25vRGV2ZWxvcC9YYW1hcmluIFN0dWRpbykKKyoudXNlcnByZWZzCisKKyMgQnVpbGQgcmVzdWx0cworW0RkXWVidWcvCitbRGRdZWJ1Z1B1YmxpYy8KK1tScl1lbGVhc2UvCitbUnJdZWxlYXNlcy8KK3g2NC8KK3g4Ni8KK2JsZC8KK1tCYl1pbi8KK1tPb11iai8KK1tMbF1vZy8KKworIyBWaXN1YWwgU3R1ZGlvIDIwMTUgY2FjaGUvb3B0aW9ucyBkaXJlY3RvcnkKKy52cy8KKyMgVW5jb21tZW50IGlmIHlvdSBoYXZlIHRhc2tzIHRoYXQgY3JlYXRlIHRoZSBwcm9qZWN0J3Mgc3RhdGljIGZpbGVzIGluIHd3d3Jvb3QKKyN3d3dyb290LworCisjIE1TVGVzdCB0ZXN0IFJlc3VsdHMKK1tUdF1lc3RbUnJdZXN1bHQqLworW0JiXXVpbGRbTGxdb2cuKgorCisjIE5VTklUCisqLlZpc3VhbFN0YXRlLnhtbAorVGVzdFJlc3VsdC54bWwKKworIyBCdWlsZCBSZXN1bHRzIG9mIGFuIEFUTCBQcm9qZWN0CitbRGRdZWJ1Z1BTLworW1JyXWVsZWFzZVBTLworZGxsZGF0YS5jCisKKyMgRE5YCitwcm9qZWN0LmxvY2suanNvbgorYXJ0aWZhY3RzLworCisqX2kuYworKl9wLmMKKypfaS5oCisqLmlsaworKi5tZXRhCisqLm9iagorKi5wY2gKKyoucGRiCisqLnBnYworKi5wZ2QKKyoucnNwCisqLnNicgorKi50bGIKKyoudGxpCisqLnRsaAorKi50bXAKKyoudG1wX3Byb2oKKyoubG9nCisqLnZzcHNjYworKi52c3NzY2MKKy5idWlsZHMKKyoucGlkYgorKi5zdmNsb2cKKyouc2NjCisKKyMgQ2h1dHpwYWggVGVzdCBmaWxlcworX0NodXR6cGFoKgorCisjIFZpc3VhbCBDKysgY2FjaGUgZmlsZXMKK2lwY2gvCisqLmFwcworKi5uY2IKKyoub3BlbmRiCisqLm9wZW5zZGYKKyouc2RmCisqLmNhY2hlZmlsZQorKi5WQy5kYgorKi5WQy5WQy5vcGVuZGIKKworIyBWaXN1YWwgU3R1ZGlvIHByb2ZpbGVyCisqLnBzZXNzCisqLnZzcAorKi52c3B4CisqLnNhcAorCisjIFRGUyAyMDEyIExvY2FsIFdvcmtzcGFjZQorJHRmLworCisjIEd1aWRhbmNlIEF1dG9tYXRpb24gVG9vbGtpdAorKi5ncFN0YXRlCisKKyMgUmVTaGFycGVyIGlzIGEgLk5FVCBjb2RpbmcgYWRkLWluCitfUmVTaGFycGVyKi8KKyouW1JyXWVbU3NdaGFycGVyCisqLkRvdFNldHRpbmdzLnVzZXIKKworIyBKdXN0Q29kZSBpcyBhIC5ORVQgY29kaW5nIGFkZC1pbgorLkp1c3RDb2RlCisKKyMgVGVhbUNpdHkgaXMgYSBidWlsZCBhZGQtaW4KK19UZWFtQ2l0eSoKKworIyBEb3RDb3ZlciBpcyBhIENvZGUgQ292ZXJhZ2UgVG9vbAorKi5kb3RDb3ZlcgorCisjIE5DcnVuY2gKK19OQ3J1bmNoXyoKKy4qY3J1bmNoKi5sb2NhbC54bWwKK25DcnVuY2hUZW1wXyoKKworIyBNaWdodHlNb29zZQorKi5tbS4qCitBdXRvVGVzdC5OZXQvCisKKyMgV2ViIHdvcmtiZW5jaCAoc2FzcykKKy5zYXNzLWNhY2hlLworCisjIEluc3RhbGxzaGllbGQgb3V0cHV0IGZvbGRlcgorW0VlXXhwcmVzcy8KKworIyBEb2NQcm9qZWN0IGlzIGEgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgYWRkLWluCitEb2NQcm9qZWN0L2J1aWxkaGVscC8KK0RvY1Byb2plY3QvSGVscC8qLkh4VAorRG9jUHJvamVjdC9IZWxwLyouSHhDCitEb2NQcm9qZWN0L0hlbHAvKi5oaGMKK0RvY1Byb2plY3QvSGVscC8qLmhoaworRG9jUHJvamVjdC9IZWxwLyouaGhwCitEb2NQcm9qZWN0L0hlbHAvSHRtbDIKK0RvY1Byb2plY3QvSGVscC9odG1sCisKKyMgQ2xpY2stT25jZSBkaXJlY3RvcnkKK3B1Ymxpc2gvCisKKyMgUHVibGlzaCBXZWIgT3V0cHV0CisqLltQcF11Ymxpc2gueG1sCisqLmF6dXJlUHVieG1sCisjIFRPRE86IENvbW1lbnQgdGhlIG5leHQgbGluZSBpZiB5b3Ugd2FudCB0byBjaGVja2luIHlvdXIgd2ViIGRlcGxveSBzZXR0aW5ncworIyBidXQgZGF0YWJhc2UgY29ubmVjdGlvbiBzdHJpbmdzICh3aXRoIHBvdGVudGlhbCBwYXNzd29yZHMpIHdpbGwgYmUgdW5lbmNyeXB0ZWQKKyoucHVieG1sCisqLnB1Ymxpc2hwcm9qCisKKyMgTWljcm9zb2Z0IEF6dXJlIFdlYiBBcHAgcHVibGlzaCBzZXR0aW5ncy4gQ29tbWVudCB0aGUgbmV4dCBsaW5lIGlmIHlvdSB3YW50IHRvCisjIGNoZWNraW4geW91ciBBenVyZSBXZWIgQXBwIHB1Ymxpc2ggc2V0dGluZ3MsIGJ1dCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gY29udGFpbmVkCisjIGluIHRoZXNlIHNjcmlwdHMgd2lsbCBiZSB1bmVuY3J5cHRlZAorUHVibGlzaFNjcmlwdHMvCisKKyMgTnVHZXQgUGFja2FnZXMKKyoubnVwa2cKKyMgVGhlIHBhY2thZ2VzIGZvbGRlciBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIG9mIFBhY2thZ2UgUmVzdG9yZQorKiovcGFja2FnZXMvKgorIyBleGNlcHQgYnVpbGQvLCB3aGljaCBpcyB1c2VkIGFzIGFuIE1TQnVpbGQgdGFyZ2V0LgorISoqL3BhY2thZ2VzL2J1aWxkLworIyBVbmNvbW1lbnQgaWYgbmVjZXNzYXJ5IGhvd2V2ZXIgZ2VuZXJhbGx5IGl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgd2hlbiBuZWVkZWQKKyMhKiovcGFja2FnZXMvcmVwb3NpdG9yaWVzLmNvbmZpZworIyBOdUdldCB2MydzIHByb2plY3QuanNvbiBmaWxlcyBwcm9kdWNlcyBtb3JlIGlnbm9yZWFibGUgZmlsZXMKKyoubnVnZXQucHJvcHMKKyoubnVnZXQudGFyZ2V0cworCisjIE1pY3Jvc29mdCBBenVyZSBCdWlsZCBPdXRwdXQKK2NzeC8KKyouYnVpbGQuY3NkZWYKKworIyBNaWNyb3NvZnQgQXp1cmUgRW11bGF0b3IKK2VjZi8KK3JjZi8KKworIyBXaW5kb3dzIFN0b3JlIGFwcCBwYWNrYWdlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcworQXBwUGFja2FnZXMvCitCdW5kbGVBcnRpZmFjdHMvCitQYWNrYWdlLlN0b3JlQXNzb2NpYXRpb24ueG1sCitfcGtnaW5mby50eHQKKworIyBWaXN1YWwgU3R1ZGlvIGNhY2hlIGZpbGVzCisjIGZpbGVzIGVuZGluZyBpbiAuY2FjaGUgY2FuIGJlIGlnbm9yZWQKKyouW0NjXWFjaGUKKyMgYnV0IGtlZXAgdHJhY2sgb2YgZGlyZWN0b3JpZXMgZW5kaW5nIGluIC5jYWNoZQorISouW0NjXWFjaGUvCisKKyMgT3RoZXJzCitDbGllbnRCaW4vCit+JCoKKyp+CisqLmRibWRsCisqLmRicHJvai5zY2hlbWF2aWV3CisqLnBmeAorKi5wdWJsaXNoc2V0dGluZ3MKK25vZGVfbW9kdWxlcy8KK29ybGVhbnMuY29kZWdlbi5jcworCisjIFNpbmNlIHRoZXJlIGFyZSBtdWx0aXBsZSB3b3JrZmxvd3MsIHVuY29tbWVudCBuZXh0IGxpbmUgdG8gaWdub3JlIGJvd2VyX2NvbXBvbmVudHMKKyMgKGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZ2l0aWdub3JlL3B1bGwvMTUyOSNpc3N1ZWNvbW1lbnQtMTA0MzcyNjIyKQorI2Jvd2VyX2NvbXBvbmVudHMvCisKKyMgUklBL1NpbHZlcmxpZ2h0IHByb2plY3RzCitHZW5lcmF0ZWRfQ29kZS8KKworIyBCYWNrdXAgJiByZXBvcnQgZmlsZXMgZnJvbSBjb252ZXJ0aW5nIGFuIG9sZCBwcm9qZWN0IGZpbGUKKyMgdG8gYSBuZXdlciBWaXN1YWwgU3R1ZGlvIHZlcnNpb24uIEJhY2t1cCBmaWxlcyBhcmUgbm90IG5lZWRlZCwKKyMgYmVjYXVzZSB3ZSBoYXZlIGdpdCA7LSkKK19VcGdyYWRlUmVwb3J0X0ZpbGVzLworQmFja3VwKi8KK1VwZ3JhZGVMb2cqLlhNTAorVXBncmFkZUxvZyouaHRtCisKKyMgU1FMIFNlcnZlciBmaWxlcworKi5tZGYKKyoubGRmCisKKyMgQnVzaW5lc3MgSW50ZWxsaWdlbmNlIHByb2plY3RzCisqLnJkbC5kYXRhCisqLmJpbS5sYXlvdXQKKyouYmltXyouc2V0dGluZ3MKKworIyBNaWNyb3NvZnQgRmFrZXMKK0Zha2VzQXNzZW1ibGllcy8KKworIyBHaG9zdERvYyBwbHVnaW4gc2V0dGluZyBmaWxlCisqLkdob3N0RG9jLnhtbAorCisjIE5vZGUuanMgVG9vbHMgZm9yIFZpc3VhbCBTdHVkaW8KKy5udHZzX2FuYWx5c2lzLmRhdAorCisjIFZpc3VhbCBTdHVkaW8gNiBidWlsZCBsb2cKKyoucGxnCisKKyMgVmlzdWFsIFN0dWRpbyA2IHdvcmtzcGFjZSBvcHRpb25zIGZpbGUKKyoub3B0CisKKyMgVmlzdWFsIFN0dWRpbyBMaWdodFN3aXRjaCBidWlsZCBvdXRwdXQKKyoqLyouSFRNTENsaWVudC9HZW5lcmF0ZWRBcnRpZmFjdHMKKyoqLyouRGVza3RvcENsaWVudC9HZW5lcmF0ZWRBcnRpZmFjdHMKKyoqLyouRGVza3RvcENsaWVudC9Nb2RlbE1hbmlmZXN0LnhtbAorKiovKi5TZXJ2ZXIvR2VuZXJhdGVkQXJ0aWZhY3RzCisqKi8qLlNlcnZlci9Nb2RlbE1hbmlmZXN0LnhtbAorX1B2dF9FeHRlbnNpb25zCisKKyMgUGFrZXQgZGVwZW5kZW5jeSBtYW5hZ2VyCisucGFrZXQvcGFrZXQuZXhlCitwYWtldC1maWxlcy8KKworIyBGQUtFIC0gRiMgTWFrZQorLmZha2UvCisKKyMgSmV0QnJhaW5zIFJpZGVyCisuaWRlYS8KKyouc2xuLmltbApkaWZmIC0tZ2l0IGEvRG9jL0VQUGx1c0RvYy5zaGZicHJvaiBiL0RvYy9FUFBsdXNEb2Muc2hmYnByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MDM2NAotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9FUFBsdXNEb2Muc2hmYnByb2oKQEAgLTAsMCArMSwxMDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiIFRvb2xzVmVyc2lvbj0iNC4wIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPCEtLSBUaGUgY29uZmlndXJhdGlvbiBhbmQgcGxhdGZvcm0gd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaAorICAgICAgICAgYXNzZW1ibGllcyB0byBpbmNsdWRlIGZyb20gc29sdXRpb24gYW5kIHByb2plY3QgZG9jdW1lbnRhdGlvbgorICAgICAgICAgc291cmNlcyAtLT4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57OWIzY2Y5MzAtYTJiYS00ZDhlLWFiMjAtOTk3NTAzYjgwMjRifTwvUHJvamVjdEd1aWQ+CisgICAgPFNIRkJTY2hlbWFWZXJzaW9uPjEuOS45LjA8L1NIRkJTY2hlbWFWZXJzaW9uPgorICAgIDwhLS0gQXNzZW1ibHlOYW1lLCBOYW1lLCBhbmQgUm9vdE5hbWVzcGFjZSBhcmUgbm90IHVzZWQgYnkgU0hGQiBidXQgVmlzdWFsCisgICAgICAgICBTdHVkaW8gYWRkcyB0aGVtIGFueXdheSAtLT4KKyAgICA8QXNzZW1ibHlOYW1lPkRvY3VtZW50YXRpb248L0Fzc2VtYmx5TmFtZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5Eb2N1bWVudGF0aW9uPC9Sb290TmFtZXNwYWNlPgorICAgIDxOYW1lPkRvY3VtZW50YXRpb248L05hbWU+CisgICAgPCEtLSBTSEZCIHByb3BlcnRpZXMgLS0+CisgICAgPE91dHB1dFBhdGg+LlxIZWxwXDwvT3V0cHV0UGF0aD4KKyAgICA8SHRtbEhlbHBOYW1lPkVQUGx1cyA0LjA8L0h0bWxIZWxwTmFtZT4KKyAgICA8RnJhbWV3b3JrVmVyc2lvbj4uTkVUIEZyYW1ld29yayAzLjU8L0ZyYW1ld29ya1ZlcnNpb24+CisgICAgPERvY3VtZW50YXRpb25Tb3VyY2VzPgorICAgICAgPERvY3VtZW50YXRpb25Tb3VyY2Ugc291cmNlRmlsZT0iLi5cRVBQbHVzXGJpblxSZWxlYXNlXEVQUGx1cy5kbGwiIC8+CisgICAgICA8RG9jdW1lbnRhdGlvblNvdXJjZSBzb3VyY2VGaWxlPSIuLlxFUFBsdXNcYmluXFJlbGVhc2VcRVBQbHVzLlhNTCIgLz4KKyAgICA8L0RvY3VtZW50YXRpb25Tb3VyY2VzPgorICAgIDxQcm9qZWN0U3VtbWFyeT5FUFBsdXMgaXMgYSAubmV0IGxpYnJhcnkgdGhhdCByZWFkcyBhbmQgd3JpdGVzIEV4Y2VsIGZpbGVzIHVzaW5nIHRoZSBPcGVuIE9mZmljZSBYbWwgZm9ybWF0LiAKK0VQUGx1cyBzdXBwb3J0cyByYW5nZXMsIGNlbGwgc3R5bGluZywgY2hhcnRzLCBwaWN0dXJlLCBzaGFwZXMsIG5hbWVkIHJhbmdlcywgY29tbWVudHMsdGFibGVzIGFuZCBhIGxvdCBvZiBvdGhlciBzdHVmZi4KK0VQUGx1cyBzdGFydGVkIHdpdGggdGhlIHNvdXJjZSBmcm9tIHRoZSBFeGNlbFBhY2thZ2UgcHJvamVjdCBob3N0ZWQgb24gQ29kZVBsZXguPC9Qcm9qZWN0U3VtbWFyeT4KKyAgICA8TmFtZXNwYWNlU3VtbWFyaWVzPgorICAgICAgPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+VGhpcyBpcyB0aGUgbWFpbiBuYW1lc3BhY2UgZm9yIEVQUGx1czwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5EcmF3aW5nIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGFsbCBjbGFzc2VzIHJlbGF0ZWQgdG8gZHJhd2luZ3MuIERyYXdpbmcgb2JqZWN0cyBhcmUgQ2hhcnRzLCBTaGFwZXMgYW5kIFBpY3R1cmVzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2hhcnQgY2xhc3NlczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5TdHlsZSIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBjbGFzc2VzIGZvciBjZWxsIHN0eWxpbmcgYW5kIG5hbWVkIHN0eWxlczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgdGhlIGNsYXNzZXMgdGhhdCB3cml0ZSB0aGUgc3R5bGUgeG1sPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGNsYXNzZXMgdXNlZCBmb3IgVm1sIGRyYXdpbmdzLiBWbWwgZHJhd2luZ3MgYXJlIHVzZWQgZm9yIGNvbW1lbnRzIGFuZCBiYWNrZ3JvdW5kIGltYWdlczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5UYWJsZSIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyB0aGUgY2xhc3NlcyB1c2VkIGZvciBFeGNlbCB0YWJsZXM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24iIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2xhc3NlcyBmb3IgRGF0YXZhbGlkYXRpb248L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZSIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBjbGFzc2VzIGZvciBFeGNlbCBQaXZvdHRhYmxlczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5VdGlscyIgaXNEb2N1bWVudGVkPSJUcnVlIj5JbnRlcm5hbCB1dGlsaXR5IGNsYXNzZXM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGNsYXNzZXMgZm9yIENvbmRpdGlvbmFsIEZvcm1hdHRpbmc8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuU3R5bGUuRHhmIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGNsYXNzZXMgZm9yIGRpZmZlcmVudGlhbCBzdHlsaW5nLiBFUFBsdXMgb25seSBzdXBwb3J0IGR4ZiBzdHlsaW5nIGluIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYXQgdGhpcyBwb2ludDwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5WQkEiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2xhc3NlcyBmb3IgRXhjZWwgVkJBIHN1cHBvcnQ8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBpbnRlcmZhY2VzIGZvciBDb25kaXRpb25hbCBmb3JtYXR0aW5nPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0cyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBpbnRlcmZhY2VzIGZvciBkYXRhIHZhbGlkYXRpb248L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGludGVyZmFjZXMgZm9yIGRhdGEgdmFsaWRhdGlvbiBmb3JtdWxhczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iSW9uaWMuWmlwIiBpc0RvY3VtZW50ZWQ9IkZhbHNlIj5JbnRlcm5hbCB6aXAgaGFuZGxpbmcgZm9yIHBhY2thZ2luZy4gVGhpcyBpcyBjb2RlIGNvbWVzIGZyb20gdGhlIERvdE5ldFppcCBsaWJyYXJ5Li4uIGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJJb25pYy5abGliIiBpc0RvY3VtZW50ZWQ9IkZhbHNlIj5JbnRlcm5hbCB6aXAgaGFuZGxpbmcgZm9yIHBhY2thZ2luZy4gVGhpcyBpcyBjb2RlIGNvbWVzIGZyb20gdGhlIERvdE5ldFppcCBsaWJyYXJ5Li4uIGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nIiBpc0RvY3VtZW50ZWQ9IlRydWUiPlRvcCBuYW1lc3NwYWNlIGZvciBmb3JtdWxhIHBhcnNpbmc8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuUGFja2FnaW5nIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGNsYXNzZXMgdG8gaGFuZGxlIE9PWE1MIHBhY2thZ2luZy4gVXNlcyB0aGUgRG90TmV0WmlwIGxpYnJhcnkgdG8gaGFuZGxlIGNvbXByZXNzaW9uLjwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkludGVybmFsIHppcCBoYW5kbGluZyBmb3IgcGFja2FnaW5nLiBUaGlzIGlzIGNvZGUgY29tZXMgZnJvbSB0aGUgRG90TmV0WmlwIGxpYnJhcnkuLi4gaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb208L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+SW50ZXJuYWwgemlwIGhhbmRsaW5nIGZvciBwYWNrYWdpbmcuIFRoaXMgaXMgY29kZSBjb21lcyBmcm9tIHRoZSBEb3ROZXRaaXAgbGlicmFyeS4uLiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbTwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZSIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgYnVpbGRpbiBkYXRlIGFuZCB0aW1lIGZ1bmN0aW9uczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24iIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gaW5mb3JtYXRpb24gZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBidWlsZGluIGxvZ2ljYWwgZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBidWlsZGluIG1hdGggZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5OdW1lcmljIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBidWlsZGluIG51bWVyaWMgZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gcmVmZXJlbmNlIGFuZCBsb29rdXAgZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0IiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBidWlsZGluIHRleHQgZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9ycyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgb3BlcmF0b3JzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzIiBpc0RvY3VtZW50ZWQ9IkZhbHNlIj5Gb3JtdWxhIHBhcnNpbmcgaW50ZXJuYWwgdXRpbGl0aWVzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnMiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGV4ZXB0aW9uczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGV4cHJlc3Npb24gZ3JhcGg8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkNvbXBpbGVTdHJhdGVneSIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgZXhwcmVzc2lvbiBncmFwaDwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Cis8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGV4cHJlc3Npb24gZ3JhcGg8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgorPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzIiBpc0RvY3VtZW50ZWQ9IkZhbHNlIj5Gb3JtdWxhIHBhcnNpbmcgbGV4aWFsIGFuYWx5c2lzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KKzxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgaW50ZXJuYWwgdXRpbGl0aWVzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT48L05hbWVzcGFjZVN1bW1hcmllcz4KKyAgICA8SGVscFRpdGxlPkVQUGx1cyA0LjA8L0hlbHBUaXRsZT4KKyAgICA8VmlzaWJsZUl0ZW1zPkluaGVyaXRlZE1lbWJlcnMsIEluaGVyaXRlZEZyYW1ld29ya01lbWJlcnM8L1Zpc2libGVJdGVtcz4KKyAgICA8QnVpbGRMb2dGaWxlIC8+CisgICAgPEh0bWxIZWxwMXhDb21waWxlclBhdGggLz4KKyAgICA8SHRtbEhlbHAyeENvbXBpbGVyUGF0aCAvPgorICAgIDxTYW5kY2FzdGxlUGF0aCAvPgorICAgIDxXb3JraW5nUGF0aCAvPgorICAgIDxNYXhpbXVtR3JvdXBQYXJ0cz4yPC9NYXhpbXVtR3JvdXBQYXJ0cz4KKyAgICA8TmFtZXNwYWNlR3JvdXBpbmc+RmFsc2U8L05hbWVzcGFjZUdyb3VwaW5nPgorICAgIDxTeW50YXhGaWx0ZXJzPlN0YW5kYXJkPC9TeW50YXhGaWx0ZXJzPgorICAgIDxTZGtMaW5rVGFyZ2V0PkJsYW5rPC9TZGtMaW5rVGFyZ2V0PgorICAgIDxSb290TmFtZXNwYWNlQ29udGFpbmVyPkZhbHNlPC9Sb290TmFtZXNwYWNlQ29udGFpbmVyPgorICAgIDxQcmVzZW50YXRpb25TdHlsZT5WUzIwMTA8L1ByZXNlbnRhdGlvblN0eWxlPgorICAgIDxQcmVsaW1pbmFyeT5GYWxzZTwvUHJlbGltaW5hcnk+CisgICAgPE5hbWluZ01ldGhvZD5HdWlkPC9OYW1pbmdNZXRob2Q+CisgICAgPExhbmd1YWdlPmVuLVVTPC9MYW5ndWFnZT4KKyAgICA8Q29udGVudFBsYWNlbWVudD5BYm92ZU5hbWVzcGFjZXM8L0NvbnRlbnRQbGFjZW1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUaGVyZSBhcmUgbm8gcHJvcGVydGllcyBmb3IgdGhlc2UgZ3JvdXBzLiAgQW55Q1BVIG5lZWRzIHRvIGFwcGVhciBpbgorICAgICAgIG9yZGVyIGZvciBWaXN1YWwgU3R1ZGlvIHRvIHBlcmZvcm0gdGhlIGJ1aWxkLiAgVGhlIG90aGVycyBhcmUgb3B0aW9uYWwKKyAgICAgICBjb21tb24gcGxhdGZvcm0gdHlwZXMgdGhhdCBtYXkgYXBwZWFyLiAtLT4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8eDg2JyAiPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8eDY0JyAiPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4NjQnICI+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xXaW4zMicgIj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8V2luMzInICI+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBJbXBvcnQgdGhlIFNIRkIgYnVpbGQgdGFyZ2V0cyAtLT4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFNIRkJST09UKVxTYW5kY2FzdGxlSGVscEZpbGVCdWlsZGVyLnRhcmdldHMiIC8+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzLnNsbiBiL0VQUGx1cy5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwYmUyZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy5zbG4KQEAgLTAsMCArMSwxMjAgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEzCitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTIuMC4zMDExMC4wCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJTb2x1dGlvbiBJdGVtcyIsICJTb2x1dGlvbiBJdGVtcyIsICJ7ODRCQjM3RTktQ0UyNy00OEUwLTg4RjYtQTc0MUE0NkQ1ODgzfSIKKwlQcm9qZWN0U2VjdGlvbihTb2x1dGlvbkl0ZW1zKSA9IHByZVByb2plY3QKKwkJRXhjZWxQYWNrYWdlLnZzbWRpID0gRXhjZWxQYWNrYWdlLnZzbWRpCisJCUxvY2FsVGVzdFJ1bi50ZXN0cnVuY29uZmlnID0gTG9jYWxUZXN0UnVuLnRlc3RydW5jb25maWcKKwlFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJFUFBsdXMiLCAiRVBQbHVzXEVQUGx1cy5jc3Byb2oiLCAiezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkVQUGx1c1NhbXBsZXMiLCAiU2FtcGxlQXBwXEVQUGx1c1NhbXBsZXMuY3Nwcm9qIiwgInswNkJGM0M2OC1FN0Q0LTQ1NzktOTBCRS1FMzZEQUNFNTY0RUZ9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJFUFBsdXNUZXN0IiwgIkVQUGx1c1Rlc3RcRVBQbHVzVGVzdC5jc3Byb2oiLCAie0U3QkNFREUwLUVBREQtNDM3Qi04NkQ1LTQ5RDE5MjIxNjk0OH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkVQUGx1c1dlYlNhbXBsZSIsICJFUFBsdXNXZWJTYW1wbGVcRVBQbHVzV2ViU2FtcGxlLmNzcHJvaiIsICJ7MUJGMzBBNTItNjE0OS00MzJELTgyRjYtNzI1MjUwRTVDNjYyfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiRVBQbHVzRXhjZWxDYWxjdWxhdGlvbkRlbW8iLCAiRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZVxFUFBsdXNFeGNlbENhbGN1bGF0aW9uRGVtby5jc3Byb2oiLCAiezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMgPSBEZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2UgNC4wfEFueSBDUFUgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCVJlbGVhc2UgNC4wfE1peGVkIFBsYXRmb3JtcyA9IFJlbGVhc2UgNC4wfE1peGVkIFBsYXRmb3JtcworCQlSZWxlYXNlIDQuMHx4ODYgPSBSZWxlYXNlIDQuMHx4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zID0gUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30uUmVsZWFzZSA0LjB8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30uUmVsZWFzZSA0LjB8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9LlJlbGVhc2UgNC4wfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30uUmVsZWFzZSA0LjB8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM30uUmVsZWFzZSA0LjB8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MDZCRjNDNjgtRTdENC00NTc5LTkwQkUtRTM2REFDRTU2NEVGfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MDZCRjNDNjgtRTdENC00NTc5LTkwQkUtRTM2REFDRTU2NEVGfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MDZCRjNDNjgtRTdENC00NTc5LTkwQkUtRTM2REFDRTU2NEVGfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uUmVsZWFzZSA0LjB8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXswNkJGM0M2OC1FN0Q0LTQ1NzktOTBCRS1FMzZEQUNFNTY0RUZ9LlJlbGVhc2UgNC4wfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uUmVsZWFzZSA0LjB8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uUmVsZWFzZSA0LjB8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXswNkJGM0M2OC1FN0Q0LTQ1NzktOTBCRS1FMzZEQUNFNTY0RUZ9LlJlbGVhc2UgNC4wfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXswNkJGM0M2OC1FN0Q0LTQ1NzktOTBCRS1FMzZEQUNFNTY0RUZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswNkJGM0M2OC1FN0Q0LTQ1NzktOTBCRS1FMzZEQUNFNTY0RUZ9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezA2QkYzQzY4LUU3RDQtNDU3OS05MEJFLUUzNkRBQ0U1NjRFRn0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFN0JDRURFMC1FQURELTQzN0ItODZENS00OUQxOTIyMTY5NDh9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFN0JDRURFMC1FQURELTQzN0ItODZENS00OUQxOTIyMTY5NDh9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFN0JDRURFMC1FQURELTQzN0ItODZENS00OUQxOTIyMTY5NDh9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5SZWxlYXNlIDQuMHxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJe0U3QkNFREUwLUVBREQtNDM3Qi04NkQ1LTQ5RDE5MjIxNjk0OH0uUmVsZWFzZSA0LjB8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZSA0LjB8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5SZWxlYXNlIDQuMHxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZSA0LjB8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5SZWxlYXNlIDQuMHxNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJe0U3QkNFREUwLUVBREQtNDM3Qi04NkQ1LTQ5RDE5MjIxNjk0OH0uUmVsZWFzZSA0LjB8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJe0U3QkNFREUwLUVBREQtNDM3Qi04NkQ1LTQ5RDE5MjIxNjk0OH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U3QkNFREUwLUVBREQtNDM3Qi04NkQ1LTQ5RDE5MjIxNjk0OH0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezFCRjMwQTUyLTYxNDktNDMyRC04MkY2LTcyNTI1MEU1QzY2Mn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezFCRjMwQTUyLTYxNDktNDMyRC04MkY2LTcyNTI1MEU1QzY2Mn0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezFCRjMwQTUyLTYxNDktNDMyRC04MkY2LTcyNTI1MEU1QzY2Mn0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LlJlbGVhc2UgNC4wfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZSA0LjB8QW55IENQVQorCQl7MUJGMzBBNTItNjE0OS00MzJELTgyRjYtNzI1MjUwRTVDNjYyfS5SZWxlYXNlIDQuMHxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LlJlbGVhc2UgNC4wfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LlJlbGVhc2UgNC4wfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZSA0LjB8QW55IENQVQorCQl7MUJGMzBBNTItNjE0OS00MzJELTgyRjYtNzI1MjUwRTVDNjYyfS5SZWxlYXNlIDQuMHx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZSA0LjB8QW55IENQVQorCQl7MUJGMzBBNTItNjE0OS00MzJELTgyRjYtNzI1MjUwRTVDNjYyfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MUJGMzBBNTItNjE0OS00MzJELTgyRjYtNzI1MjUwRTVDNjYyfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OTRDQkNFRkMtRERCRi00RjU0LThBRUEtNEM0MEJCRDI4ODFCfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OTRDQkNFRkMtRERCRi00RjU0LThBRUEtNEM0MEJCRDI4ODFCfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7OTRDQkNFRkMtRERCRi00RjU0LThBRUEtNEM0MEJCRDI4ODFCfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uUmVsZWFzZSA0LjB8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXs5NENCQ0VGQy1EREJGLTRGNTQtOEFFQS00QzQwQkJEMjg4MUJ9LlJlbGVhc2UgNC4wfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uUmVsZWFzZSA0LjB8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2UgNC4wfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uUmVsZWFzZSA0LjB8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXs5NENCQ0VGQy1EREJGLTRGNTQtOEFFQS00QzQwQkJEMjg4MUJ9LlJlbGVhc2UgNC4wfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlIDQuMHxBbnkgQ1BVCisJCXs5NENCQ0VGQy1EREJGLTRGNTQtOEFFQS00QzQwQkJEMjg4MUJ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5NENCQ0VGQy1EREJGLTRGNTQtOEFFQS00QzQwQkJEMjg4MUJ9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezk0Q0JDRUZDLUREQkYtNEY1NC04QUVBLTRDNDBCQkQyODgxQn0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlWaXN1YWxTVk5Xb3JraW5nQ29weVJvb3QgPSAuCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oVGVzdENhc2VNYW5hZ2VtZW50U2V0dGluZ3MpID0gcG9zdFNvbHV0aW9uCisJCUNhdGVnb3J5RmlsZSA9IEV4Y2VsUGFja2FnZS52c21kaQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvRVBQbHVzLnRlc3RzZXR0aW5ncyBiL0VQUGx1cy50ZXN0c2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0MjdlMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy50ZXN0c2V0dGluZ3MKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFRlc3RTZXR0aW5ncworICBpZD0iNjU4MzYwMGMtYTU5Yy00OTNiLWFkM2EtZTMyYjQ3Zjc2ZDljIgorICBuYW1lPSJFUFBsdXMiCisgIGVuYWJsZURlZmF1bHREYXRhQ29sbGVjdG9ycz0iZmFsc2UiCisgIHhtbG5zPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zY2hlbWFzL1Zpc3VhbFN0dWRpby9UZWFtVGVzdC8yMDEwIj4KKyAgPERlc2NyaXB0aW9uPjwhLS1fbG9jSURfdGV4dD0iRGVzY3JpcHRpb24xIi0tPlRoZXNlIGFyZSBkZWZhdWx0IHRlc3Qgc2V0dGluZ3MgZm9yIGEgbG9jYWwgdGVzdCBydW4uPC9EZXNjcmlwdGlvbj4KKyAgPERlcGxveW1lbnQgZW5hYmxlZD0iZmFsc2UiIC8+Cis8L1Rlc3RTZXR0aW5ncz4KZGlmZiAtLWdpdCBhL0VQUGx1cy9DZWxsU3RvcmUuY3MgYi9FUFBsdXMvQ2VsbFN0b3JlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzg1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ2VsbFN0b3JlLmNzCkBAIC0wLDAgKzEsMTk4MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTItMTEtMjUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKKworaW50ZXJuYWwgY2xhc3MgSW5kZXhCYXNlIDogSUNvbXBhcmFibGU8SW5kZXhCYXNlPgorICAgIHsgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBzaG9ydCBJbmRleDsKKyAgICAgICAgcHVibGljIGludCBDb21wYXJlVG8oSW5kZXhCYXNlIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5kZXggPCBvdGhlci5JbmRleCA/IC0xIDogSW5kZXggPiBvdGhlci5JbmRleCA/IDEgOiAwOworICAgICAgICB9CisgICAgfQorICAgIGludGVybmFsIGNsYXNzIEluZGV4SXRlbSA6ICBJbmRleEJhc2UKKyAgICB7CisgICAgICAgIGludGVybmFsIGludCBJbmRleFBvaW50ZXIgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsgCisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAKKyAgICBpbnRlcm5hbCBjbGFzcyBDb2x1bW5JbmRleCA6IEluZGV4QmFzZSwgSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIGludGVybmFsIEluZGV4QmFzZSBfc2VhcmNoSXg9bmV3IEluZGV4QmFzZSgpOworICAgICAgICBwdWJsaWMgQ29sdW1uSW5kZXggKCkKKwkgICAgeworICAgICAgICAgICAgX3BhZ2VzPW5ldyBQYWdlSW5kZXhbQ2VsbFN0b3JlPGludD4uUGFnZXNQZXJDb2x1bW5NaW5dOworICAgICAgICAgICAgUGFnZUNvdW50PTA7CisJICAgIH0KKyAgICAgICAgfkNvbHVtbkluZGV4KCkKKwkgICAgeworICAgICAgICAgICAgX3BhZ2VzPW51bGw7ICAgICAgICAgICAgCisJICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IEdldFBvc2l0aW9uKGludCBSb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWdlID0gKHNob3J0KShSb3cgPj4gQ2VsbFN0b3JlPGludD4ucGFnZUJpdHMpOworICAgICAgICAgICAgX3NlYXJjaEl4LkluZGV4ID0gcGFnZTsKKyAgICAgICAgICAgIHZhciByZXMgPSBBcnJheS5CaW5hcnlTZWFyY2goX3BhZ2VzLCAwLCBQYWdlQ291bnQsIF9zZWFyY2hJeCk7CisgICAgICAgICAgICBpZiAocmVzID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0UGFnZShSb3csIHJlZiByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSB+cmVzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChHZXRQYWdlKFJvdywgcmVmIHApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIEdldFBhZ2UoaW50IFJvdywgcmVmIGludCByZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZXMgPCBQYWdlQ291bnQgJiYgX3BhZ2VzW3Jlc10uTWluSW5kZXggPD0gUm93ICYmIF9wYWdlc1tyZXNdLk1heEluZGV4ID49IFJvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzICsgMSA8IFBhZ2VDb3VudCAmJiAoX3BhZ2VzW3JlcyArIDFdLk1pbkluZGV4IDw9IFJvdykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzICsgMSA8IFBhZ2VDb3VudCAmJiBfcGFnZXNbcmVzICsgMV0uTWluSW5kZXggPD0gUm93KTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAocmVzICsgMSA8IFBhZ2VDb3VudCAmJiBfcGFnZXNbcmVzICsgMV0uTWF4SW5kZXggPj0gUm93KQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXMgLSAxID49IDAgJiYgX3BhZ2VzW3JlcyAtIDFdLk1heEluZGV4ID49IFJvdykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXMtMSA+IDAgJiYgX3BhZ2VzW3Jlcy0xXS5NYXhJbmRleCA+PSBSb3cpOworICAgICAgICAgICAgICAgICAgICAvL2lmIChyZXMgPiAwKQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IEdldE5leHRSb3coaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgLy92YXIgcGFnZSA9IChpbnQpKCh1bG9uZylyb3cgPj4gQ2VsbFN0b3JlPGludD4ucGFnZUJpdHMpOworICAgICAgICAgICAgdmFyIHAgPSBHZXRQb3NpdGlvbihyb3cpOworICAgICAgICAgICAgaWYgKHAgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSB+cDsKKyAgICAgICAgICAgICAgICBpZiAocCA+PSBQYWdlQ291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9wYWdlc1twXS5JbmRleE9mZnNldCArIF9wYWdlc1twXS5Sb3dzWzBdLkluZGV4IDwgcm93KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCArIDEgPj0gUGFnZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VzW3AgKyAxXS5JbmRleE9mZnNldCArIF9wYWdlc1twXS5Sb3dzWzBdLkluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wYWdlc1twXS5JbmRleE9mZnNldCArIF9wYWdlc1twXS5Sb3dzWzBdLkluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwIDwgUGFnZUNvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBfcGFnZXNbcF0uR2V0TmV4dFJvdyhyb3cpOworICAgICAgICAgICAgICAgICAgICBpZiAociA+PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VzW3BdLkluZGV4T2Zmc2V0ICsgX3BhZ2VzW3BdLlJvd3Nbcl0uSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytwIDwgUGFnZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZXNbcF0uSW5kZXhPZmZzZXQgKyBfcGFnZXNbcF0uUm93c1swXS5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgRmluZE5leHQoaW50IFBhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwID0gR2V0UG9zaXRpb24oUGFnZSk7CisgICAgICAgICAgICBpZiAocCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIH5wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgUGFnZUluZGV4W10gX3BhZ2VzOworICAgICAgICBpbnRlcm5hbCBpbnQgUGFnZUNvdW50OworCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IFBhZ2VDb3VudDsgcCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpX3BhZ2VzW3BdKS5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcGFnZXMgPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisgICAgaW50ZXJuYWwgY2xhc3MgUGFnZUluZGV4IDogSW5kZXhCYXNlLCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgSW5kZXhCYXNlIF9zZWFyY2hJeCA9IG5ldyBJbmRleEJhc2UoKTsKKyAgICAgICAgcHVibGljIFBhZ2VJbmRleCgpCisJICAgIHsKKyAgICAgICAgICAgIFJvd3MgPSBuZXcgSW5kZXhJdGVtW0NlbGxTdG9yZTxpbnQ+LlBhZ2VTaXplTWluXTsKKyAgICAgICAgICAgIFJvd0NvdW50ID0gMDsKKwkgICAgfQorICAgICAgICBwdWJsaWMgUGFnZUluZGV4KEluZGV4SXRlbVtdIHJvd3MsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgUm93cyA9IHJvd3M7CisgICAgICAgICAgICBSb3dDb3VudCA9IGNvdW50OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBQYWdlSW5kZXgoUGFnZUluZGV4IHBhZ2VJdGVtLCBpbnQgc3RhcnQsIGludCBzaXplKQorICAgICAgICAgICAgOnRoaXMocGFnZUl0ZW0sIHN0YXJ0LCBzaXplLCBwYWdlSXRlbS5JbmRleCwgcGFnZUl0ZW0uT2Zmc2V0KQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUGFnZUluZGV4KFBhZ2VJbmRleCBwYWdlSXRlbSwgaW50IHN0YXJ0LCBpbnQgc2l6ZSwgc2hvcnQgaW5kZXgsIGludCBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvd3MgPSBuZXcgSW5kZXhJdGVtW0NlbGxTdG9yZTxpbnQ+LkdldFNpemUoc2l6ZSldOworICAgICAgICAgICAgQXJyYXkuQ29weShwYWdlSXRlbS5Sb3dzLCBzdGFydCwgUm93cywwLHNpemUpOworICAgICAgICAgICAgUm93Q291bnQgPSBzaXplOworICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICB+UGFnZUluZGV4KCkKKwkgICAgeworICAgICAgICAgICAgUm93cz1udWxsOworCSAgICB9CisgICAgICAgIGludGVybmFsIGludCBPZmZzZXQgPSAwOworICAgICAgICBpbnRlcm5hbCBpbnQgSW5kZXhPZmZzZXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEluZGV4RXhwYW5kZWQgKyAoaW50KU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgSW5kZXhFeHBhbmRlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEluZGV4IDw8IENlbGxTdG9yZTxpbnQ+LnBhZ2VCaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBJbmRleEl0ZW1bXSBSb3dzIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgaW50IFJvd0NvdW50OworCisgICAgICAgIGludGVybmFsIGludCBHZXRQb3NpdGlvbihpbnQgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VhcmNoSXguSW5kZXggPSAoc2hvcnQpb2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIEFycmF5LkJpbmFyeVNlYXJjaChSb3dzLCAwLCBSb3dDb3VudCwgX3NlYXJjaEl4KTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgR2V0TmV4dFJvdyhpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gcm93IC0gSW5kZXhPZmZzZXQ7CisgICAgICAgICAgICB2YXIgbz0gR2V0UG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChvIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvID0gfm87CisgICAgICAgICAgICAgICAgaWYgKG8gPCBSb3dDb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IE1pbkluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChSb3dzLkxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5kZXhPZmZzZXQgKyBSb3dzWzBdLkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgTWF4SW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFJvd0NvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbmRleE9mZnNldCArIFJvd3NbUm93Q291bnQtMV0uSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBHZXRJbmRleChpbnQgcG9zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5kZXhPZmZzZXQgKyBSb3dzW3Bvc10uSW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvd3MgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBpcyB0aGUgc3RvcmUgZm9yIGFsbCBSb3dzLCBDb2x1bW5zIGFuZCBDZWxscy4KKyAgICAvLy8gSXQgaXMgYSBEaWN0aW9uYXJ5IGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIEtleSAodGhlIFJvd0lELCBDb2x1bW5JRCBvciBDZWxsSUQgKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgQ2VsbFN0b3JlPFQ+IDogSURpc3Bvc2FibGUvLyA6IElFbnVtZXJhYmxlPHVsb25nPiwgSUVudW1lcmF0b3I8dWxvbmc+CisgICAgeworICAgICAgICAvKioqKiBTaXplIGNvbnN0YW50cyAqKioqLworICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgcGFnZUJpdHMgPSAxMDsgICAvLzEzYml0cz04MTkyICBOb3RlOiBNYXhpbXVtIGlzIDEzIGJpdHMgc2luY2Ugc2hvcnQgaXMgdXNlZCAoUGFnZU1heD0xNkspCisgICAgICAgIGludGVybmFsIGNvbnN0IGludCBQYWdlU2l6ZSA9IDEgPDwgcGFnZUJpdHM7CisgICAgICAgIGludGVybmFsIGNvbnN0IGludCBQYWdlU2l6ZU1pbiA9IDE8PDEwOworICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgUGFnZVNpemVNYXggPSBQYWdlU2l6ZSA8PCAxOyAvL0RvdWJsZSBwYWdlIHNpemUKKyAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IENvbFNpemVNaW4gPSAzMjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IFBhZ2VzUGVyQ29sdW1uTWluID0gMzI7CisKKyAgICAgICAgTGlzdDxUPiBfdmFsdWVzID0gbmV3IExpc3Q8VD4oKTsKKyAgICAgICAgaW50ZXJuYWwgQ29sdW1uSW5kZXhbXSBfY29sdW1uSW5kZXg7CisgICAgICAgIGludGVybmFsIEluZGV4QmFzZSBfc2VhcmNoSXggPSBuZXcgSW5kZXhCYXNlKCk7CisgICAgICAgIGludGVybmFsIGludCBDb2x1bW5Db3VudDsKKyAgICAgICAgcHVibGljIENlbGxTdG9yZSAoKQorCSAgICB7CisgICAgICAgICAgICBfY29sdW1uSW5kZXggPSBuZXcgQ29sdW1uSW5kZXhbQ29sU2l6ZU1pbl07CisJICAgIH0KKyAgICAgICAgfkNlbGxTdG9yZSgpCisJICAgIHsKKyAgICAgICAgICAgIGlmIChfdmFsdWVzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3ZhbHVlcy5DbGVhcigpOworICAgICAgICAgICAgICAgIF92YWx1ZXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2NvbHVtbkluZGV4PW51bGw7CisJICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IEdldFBvc2l0aW9uKGludCBDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZWFyY2hJeC5JbmRleCA9IChzaG9ydClDb2x1bW47CisgICAgICAgICAgICByZXR1cm4gQXJyYXkuQmluYXJ5U2VhcmNoKF9jb2x1bW5JbmRleCwgMCwgQ29sdW1uQ291bnQsIF9zZWFyY2hJeCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPFQ+IENsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJvdyxjb2w7CisgICAgICAgICAgICB2YXIgcmV0PW5ldyBDZWxsU3RvcmU8VD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2wgPSBfY29sdW1uSW5kZXhbY10uSW5kZXg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7cCA8IF9jb2x1bW5JbmRleFtjXS5QYWdlQ291bnQ7IHArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5Sb3dDb3VudDsgcisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBfY29sdW1uSW5kZXhbY10uX3BhZ2VzW3BdLkluZGV4T2Zmc2V0ICsgX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5Sb3dzW3JdLkluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LlNldFZhbHVlKHJvdywgY29sLCBfdmFsdWVzW19jb2x1bW5JbmRleFtjXS5fcGFnZXNbcF0uUm93c1tyXS5JbmRleFBvaW50ZXJdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb3VudD0wOworICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudDsgcCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBfY29sdW1uSW5kZXhbY10uX3BhZ2VzW3BdLlJvd0NvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEdldERpbWVuc2lvbihvdXQgaW50IGZyb21Sb3csIG91dCBpbnQgZnJvbUNvbCwgb3V0IGludCB0b1Jvdywgb3V0IGludCB0b0NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENvbHVtbkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbVJvdyA9IGZyb21Db2wgPSB0b1JvdyA9IHRvQ29sID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbUNvbD1fY29sdW1uSW5kZXhbMF0uSW5kZXg7CisgICAgICAgICAgICAgICAgdmFyIGZyb21JbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGZyb21Db2wgPD0gMCAmJiBDb2x1bW5Db3VudCA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcm9tQ29sID0gX2NvbHVtbkluZGV4WzFdLkluZGV4OworICAgICAgICAgICAgICAgICAgICBmcm9tSW5kZXggPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKENvbHVtbkNvdW50ID09IDEgJiYgZnJvbUNvbCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbVJvdyA9IGZyb21Db2wgPSB0b1JvdyA9IHRvQ29sID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY29sID0gQ29sdW1uQ291bnQgLSAxOworICAgICAgICAgICAgICAgIHdoaWxlIChjb2wgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VDb3VudCA9PSAwIHx8IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1swXS5Sb3dDb3VudCA+IDEgfHwgX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzWzBdLlJvd3NbMF0uSW5kZXggPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2wtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9Db2w9X2NvbHVtbkluZGV4W2NvbF0uSW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKHRvQ29sID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcm9tUm93ID0gZnJvbUNvbCA9IHRvUm93ID0gdG9Db2wgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJvbVJvdyA9IHRvUm93PSAwOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IGZyb21JbmRleDsgYyA8IENvbHVtbkNvdW50OyBjKyspCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdCwgbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2x1bW5JbmRleFtjXS5QYWdlQ291bnQgPT0gMCkgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uUm93Q291bnQgPiAwICYmIF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uUm93c1swXS5JbmRleCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gX2NvbHVtbkluZGV4W2NdLl9wYWdlc1swXS5JbmRleE9mZnNldCArIF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uUm93c1swXS5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uUm93Q291bnQ+MSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd3NbMV0uSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfY29sdW1uSW5kZXhbY10uUGFnZUNvdW50ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzFdLlJvd3NbMF0uSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBscCA9IF9jb2x1bW5JbmRleFtjXS5QYWdlQ291bnQgLSAxOworICAgICAgICAgICAgICAgICAgICB3aGlsZShfY29sdW1uSW5kZXhbY10uX3BhZ2VzW2xwXS5Sb3dDb3VudD09MCAmJiBscCE9MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbHAtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbbHBdOworICAgICAgICAgICAgICAgICAgICBpZiAocC5Sb3dDb3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwLkluZGV4T2Zmc2V0ICsgcC5Sb3dzW3AuUm93Q291bnQgLSAxXS5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBmaXJzdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPiAwICYmIChmaXJzdCA8IGZyb21Sb3cgfHwgZnJvbVJvdyA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVJvdz1maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3Q+MCAmJiAobGFzdCA+IHRvUm93IHx8IHRvUm93ID09IDApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b1Jvdz1sYXN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmcm9tUm93IDw9IDAgfHwgdG9Sb3cgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyb21Sb3cgPSBmcm9tQ29sID0gdG9Sb3cgPSB0b0NvbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBGaW5kTmV4dChpbnQgQ29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYyA9IEdldFBvc2l0aW9uKENvbHVtbik7CisgICAgICAgICAgICBpZiAoYyA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIH5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgVCBHZXRWYWx1ZShpbnQgUm93LCBpbnQgQ29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IEdldFBvaW50ZXIoUm93LCBDb2x1bW4pOworICAgICAgICAgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3ZhciBjb2wgPSBHZXRQb3NpdGlvbihDb2x1bW4pOworICAgICAgICAgICAgLy9pZiAoY29sID49IDApICAKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgdmFyIHBvcyA9IF9jb2x1bW5JbmRleFtjb2xdLkdldFBvc2l0aW9uKFJvdyk7CisgICAgICAgICAgICAvLyAgICBpZiAocG9zID49IDApIAorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHZhciBwYWdlSXRlbSA9IF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VzW3Bvc107CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKHBhZ2VJdGVtLk1pbkluZGV4ID4gUm93KQorICAgICAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChwb3MgPCAwKQorICAgICAgICAgICAgLy8gICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uUGFnZXNbcG9zXTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgICAgIC8vICAgICAgICBzaG9ydCBpeCA9IChzaG9ydCkoUm93IC0gcGFnZUl0ZW0uSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgLy8gICAgICAgIHZhciBjZWxsUG9zID0gQXJyYXkuQmluYXJ5U2VhcmNoKHBhZ2VJdGVtLlJvd3MsIDAsIHBhZ2VJdGVtLlJvd0NvdW50LCBuZXcgSW5kZXhCYXNlKCkgeyBJbmRleCA9IGl4IH0pOworICAgICAgICAgICAgLy8gICAgICAgIGlmIChjZWxsUG9zID49IDApIAorICAgICAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXNbcGFnZUl0ZW0uUm93c1tjZWxsUG9zXS5JbmRleFBvaW50ZXJdOworICAgICAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlIC8vQ2VsbCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy8gICAgZWxzZSAvL1BhZ2UgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlIC8vQ29sdW1uIGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiBkZWZhdWx0KFQpOworICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyAgICAgICAgaW50IEdldFBvaW50ZXIoaW50IFJvdywgaW50IENvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbCA9IEdldFBvc2l0aW9uKENvbHVtbik7CisgICAgICAgICAgICBpZiAoY29sID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBvcyA9IF9jb2x1bW5JbmRleFtjb2xdLkdldFBvc2l0aW9uKFJvdyk7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSAwICYmIHBvcyA8IF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VDb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlSXRlbSA9IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1twb3NdOworICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUl0ZW0uTWluSW5kZXggPiBSb3cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3Bvc107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgaXggPSAoc2hvcnQpKFJvdyAtIHBhZ2VJdGVtLkluZGV4T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgX3NlYXJjaEl4LkluZGV4ID0gaXg7CisgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsUG9zID0gQXJyYXkuQmluYXJ5U2VhcmNoKHBhZ2VJdGVtLlJvd3MsIDAsIHBhZ2VJdGVtLlJvd0NvdW50LCBfc2VhcmNoSXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbFBvcyA+PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFnZUl0ZW0uUm93c1tjZWxsUG9zXS5JbmRleFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvL0NlbGwgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLy9QYWdlIGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL0NvbHVtbiBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEV4aXN0cyhpbnQgUm93LGludCBDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRQb2ludGVyKFJvdywgQ29sdW1uKT49MDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEV4aXN0cyhpbnQgUm93LCBpbnQgQ29sdW1uLCByZWYgVCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHA9R2V0UG9pbnRlcihSb3csIENvbHVtbik7CisgICAgICAgICAgICBpZiAocCA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlID0gX3ZhbHVlc1twXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0VmFsdWUoaW50IFJvdywgaW50IENvbHVtbiwgVCBWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoX2NvbHVtbkluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb2wgPSBBcnJheS5CaW5hcnlTZWFyY2goX2NvbHVtbkluZGV4LCAwLCBDb2x1bW5Db3VudCwgbmV3IEluZGV4QmFzZSgpIHsgSW5kZXggPSAoc2hvcnQpKENvbHVtbikgfSk7CisgICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSAoc2hvcnQpKFJvdyA+PiBwYWdlQml0cyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbCA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy92YXIgcG9zID0gQXJyYXkuQmluYXJ5U2VhcmNoKF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VzLCAwLCBfY29sdW1uSW5kZXhbY29sXS5Db3VudCwgbmV3IEluZGV4QmFzZSgpIHsgSW5kZXggPSBwYWdlIH0pOworICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gX2NvbHVtbkluZGV4W2NvbF0uR2V0UG9zaXRpb24oUm93KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IH5wb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIC0gMSA8IDAgfHwgX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3BvcyAtIDFdLkluZGV4T2Zmc2V0ICsgUGFnZVNpemUgLSAxIDwgUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIHBvcywgcGFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBfY29sdW1uSW5kZXhbY29sXS5QYWdlQ291bnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIHBvcywgcGFnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3Bvc107CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSXRlbS5JbmRleE9mZnNldCA+IFJvdykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLS07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlcnJvciB3aGVuIHNldHRpbmcgdmFsdWUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSXRlbSA9IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1twb3NdOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgaXggPSAoc2hvcnQpKFJvdyAtICgocGFnZUl0ZW0uSW5kZXggPDwgcGFnZUJpdHMpICsgcGFnZUl0ZW0uT2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIF9zZWFyY2hJeC5JbmRleCA9IGl4OworICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFBvcyA9IEFycmF5LkJpbmFyeVNlYXJjaChwYWdlSXRlbS5Sb3dzLCAwLCBwYWdlSXRlbS5Sb3dDb3VudCwgX3NlYXJjaEl4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxQb3MgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUG9zID0gfmNlbGxQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBBZGRDZWxsKF9jb2x1bW5JbmRleFtjb2xdLCBwb3MsIGNlbGxQb3MsIGl4LCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzW3BhZ2VJdGVtLlJvd3NbY2VsbFBvc10uSW5kZXhQb2ludGVyXSA9IFZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLy9Db2x1bW4gZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbCA9IH5jb2w7CisgICAgICAgICAgICAgICAgICAgIEFkZENvbHVtbihjb2wsIENvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIDAsIHBhZ2UpOworICAgICAgICAgICAgICAgICAgICBzaG9ydCBpeCA9IChzaG9ydCkoUm93IC0gKHBhZ2UgPDwgcGFnZUJpdHMpKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkQ2VsbChfY29sdW1uSW5kZXhbY29sXSwgMCwgMCwgaXgsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIEluc2VydChpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCByb3dzLCBpbnQgY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoX2NvbHVtbkluZGV4KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbnMgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IEdldFBvc2l0aW9uKGZyb21Db2wpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29sIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gfmNvbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gY29sOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbHVtbkluZGV4W2NdLkluZGV4ICs9IChzaG9ydCljb2x1bW5zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlID0gZnJvbVJvdyA+PiBwYWdlQml0czsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBDb2x1bW5Db3VudDsgYysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gX2NvbHVtbkluZGV4W2NdOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VQb3MgPSBjb2x1bW4uR2V0UG9zaXRpb24oZnJvbVJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZVBvcyA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tUm93ID49IGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uTWluSW5kZXggJiYgZnJvbVJvdyA8PSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLk1heEluZGV4KSAvL1RoZSByb3cgaXMgaW5zaWRlIHRoZSBwYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZnJvbVJvdyAtIGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uSW5kZXhPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3dQb3MgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLkdldFBvc2l0aW9uKG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dQb3MgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dQb3MgPSB+cm93UG9zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUluZGV4T2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93UG9zLCBmcm9tUm93LCByb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLl9wYWdlc1twYWdlUG9zXS5NaW5JbmRleCA+IGZyb21Sb3cgLSAxICYmIHBhZ2VQb3MgPiAwKSAvL1RoZSByb3cgaXMgb24gdGhlIHBhZ2UgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGZyb21Sb3cgLSAoKHBhZ2UgLSAxKSA8PCBwYWdlQml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3dQb3MgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgLSAxXS5HZXRQb3NpdGlvbihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93UG9zID4gMCAmJiBwYWdlUG9zID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zIC0gMSwgcm93UG9zLCBmcm9tUm93LCByb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4uUGFnZUNvdW50ID49IHBhZ2VQb3MgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGZyb21Sb3cgLSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLkluZGV4T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93UG9zID0gY29sdW1uLl9wYWdlc1twYWdlUG9zXS5HZXRQb3NpdGlvbihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93UG9zIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93UG9zID0gfnJvd1BvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLl9wYWdlc1twYWdlUG9zXS5Sb3dDb3VudCA+IHJvd1BvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCByb3dQb3MsIGZyb21Sb3csIHJvd3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zICsgMSwgMCwgZnJvbVJvdywgcm93cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCB+cGFnZVBvcywgMCwgZnJvbVJvdywgcm93cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDbGVhcihpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCByb3dzLCBpbnQgY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHVtbnMsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZShpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCByb3dzLCBpbnQgY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHVtbnMsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgRGVsZXRlKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHJvd3MsIGludCBjb2x1bW5zLCBib29sIHNoaWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrIChfY29sdW1uSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbnMgPiAwICYmIGZyb21Sb3cgPT0gMSAmJiByb3dzID49IEV4Y2VsUGFja2FnZS5NYXhSb3dzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlQ29sdW1ucyhmcm9tQ29sLCBjb2x1bW5zLCBzaGlmdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB0b0NvbCA9IGZyb21Db2wgKyBjb2x1bW5zIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VGcm9tUm93ID0gZnJvbVJvdyA+PiBwYWdlQml0czsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBDb2x1bW5Db3VudDsgYysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gX2NvbHVtbkluZGV4W2NdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5JbmRleCA+PSBmcm9tQ29sKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uSW5kZXggPiB0b0NvbCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VQb3MgPSBjb2x1bW4uR2V0UG9zaXRpb24oZnJvbVJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VQb3MgPCAwKSBwYWdlUG9zID0gfnBhZ2VQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VQb3MgPCBjb2x1bW4uUGFnZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgJiYgcGFnZS5Sb3dDb3VudCA+IDAgJiYgcGFnZS5NaW5JbmRleCA+IGZyb21Sb3cgJiYgcGFnZS5NYXhJbmRleCA+PSBmcm9tUm93ICsgcm93cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG89cGFnZS5NaW5JbmRleCAtIGZyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA8IHJvd3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyAtPSBvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuT2Zmc2V0IC09IG87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUGFnZU9mZnNldChjb2x1bW4sIHBhZ2VQb3MsIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuT2Zmc2V0IC09IHJvd3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUGFnZU9mZnNldChjb2x1bW4sIHBhZ2VQb3MsIHJvd3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlLlJvd0NvdW50ID4gMCAmJiBwYWdlLk1pbkluZGV4IDw9IGZyb21Sb3crcm93cy0xICYmIHBhZ2UuTWF4SW5kZXggPj0gZnJvbVJvdykgLy9UaGUgcm93IGlzIGluc2lkZSB0aGUgcGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kUm93ID0gZnJvbVJvdyArIHJvd3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsRW5kUm93ID0gRGVsZXRlQ2VsbHMoY29sdW1uLl9wYWdlc1twYWdlUG9zXSwgZnJvbVJvdywgZW5kUm93LCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgJiYgZGVsRW5kUm93ICE9IGZyb21Sb3cpIFVwZGF0ZVBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCBkZWxFbmRSb3cgLSBmcm9tUm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRSb3cgPiBkZWxFbmRSb3cgJiYgcGFnZVBvcyA8IGNvbHVtbi5QYWdlQ291bnQgJiYgY29sdW1uLl9wYWdlc1twYWdlUG9zXS5NaW5JbmRleCA8IGVuZFJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlUG9zID0gKGRlbEVuZFJvdyA9PSBmcm9tUm93ID8gcGFnZVBvcyA6IHBhZ2VQb3MgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93c0xlZnQgPSBEZWxldGVQYWdlKHNoaWZ0ID8gZnJvbVJvdyA6IGRlbEVuZFJvdywgZW5kUm93IC0gZGVsRW5kUm93LCBjb2x1bW4sIHBhZ2VQb3MsIHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChzaGlmdCkgVXBkYXRlUGFnZU9mZnNldChjb2x1bW4sIHBhZ2VQb3MsIGVuZFJvdyAtIGZyb21Sb3cgLSByb3dzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd3NMZWZ0ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmciA9IHNoaWZ0ID8gZnJvbVJvdyA6IGVuZFJvdyAtIHJvd3NMZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlUG9zID0gY29sdW1uLkdldFBvc2l0aW9uKGZyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsRW5kUm93ID0gRGVsZXRlQ2VsbHMoY29sdW1uLl9wYWdlc1twYWdlUG9zXSwgZnIsIHNoaWZ0ID8gZnIgKyByb3dzTGVmdCA6IGVuZFJvdywgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQpIFVwZGF0ZVBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCByb3dzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhZ2VQb3MgPiAwICYmIGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uSW5kZXhPZmZzZXQgPiBmcm9tUm93KSAvL1RoZSByb3cgaXMgb24gdGhlIHBhZ2UgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZnJvbVJvdyArIHJvd3MgLSAxIC0gKChwYWdlRnJvbVJvdyAtIDEpIDw8IHBhZ2VCaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3dQb3MgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgLSAxXS5HZXRQb3NpdGlvbihvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1BvcyA+IDAgJiYgcGFnZVBvcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KSBVcGRhdGVJbmRleE9mZnNldChjb2x1bW4sIHBhZ2VQb3MgLSAxLCByb3dQb3MsIGZyb21Sb3cgKyByb3dzIC0gMSwgLXJvd3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICYmIHBhZ2VQb3MgKyAxIDwgY29sdW1uLlBhZ2VDb3VudCkgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zICsgMSwgMCwgY29sdW1uLl9wYWdlc1twYWdlUG9zICsgMV0uTWluSW5kZXgsIC1yb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlUGFnZU9mZnNldChDb2x1bW5JbmRleCBjb2x1bW4sIGludCBwYWdlUG9zLCBpbnQgcm93cykKKyAgICAgICAgeworICAgICAgICAgICAgLy9VcGRhdGUgUGFnZW9mZnNldAorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKytwYWdlUG9zIDwgY29sdW1uLlBhZ2VDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gcGFnZVBvczsgcCA8IGNvbHVtbi5QYWdlQ291bnQ7IHArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCAtIHJvd3MgPD0gLVBhZ2VTaXplKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4LS07CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCAtPSByb3dzLVBhZ2VTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgLT0gcm93czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChNYXRoLkFicyhjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLk9mZnNldCkgPiBQYWdlU2l6ZSB8fAorICAgICAgICAgICAgICAgICAgICBNYXRoLkFicyhjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLlJvd3NbY29sdW1uLl9wYWdlc1twYWdlUG9zXS5Sb3dDb3VudC0xXS5JbmRleCkgPiBQYWdlU2l6ZU1heCkgLy9TcGxpdCBvciBNZXJnZT8/PworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm93cz1SZXNldFBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCByb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8vL01lcmdlUGFnZXMKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAoY29sdW1uLlBhZ2VzW3BhZ2VQb3MgLSAxXS5JbmRleCArIDEgPT0gY29sdW1uLlBhZ2VzW3BhZ2VQb3NdLkluZGV4KQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgaWYgKGNvbHVtbi5QYWdlc1twYWdlUG9zXS5JbmRleE9mZnNldCArIGNvbHVtbi5QYWdlc1twYWdlUG9zXS5Sb3dzW2NvbHVtbi5QYWdlc1twYWdlUG9zXS5Sb3dDb3VudCAtIDFdLkluZGV4ICsgcm93cyAtCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBjb2x1bW4uUGFnZXNbcGFnZVBvcyAtIDFdLkluZGV4T2Zmc2V0ICsgY29sdW1uLlBhZ2VzW3BhZ2VQb3MgLSAxXS5Sb3dzWzBdLkluZGV4IDw9IFBhZ2VTaXplKQorICAgICAgICAgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAvL01lcmdlCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBNZXJnZVBhZ2UoY29sdW1uLCBwYWdlUG9zIC0gMSwgLXJvd3MpOworICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgLy9TcGxpdAorICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAvL3Jvd3MgLT0gUGFnZVNpemU7CisgICAgICAgICAgICAgICAgICAgIC8vZm9yIChpbnQgcCA9IHBhZ2VQb3M7IHAgPCBjb2x1bW4uUGFnZUNvdW50OyBwKyspCisgICAgICAgICAgICAgICAgICAgIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgY29sdW1uLlBhZ2VzW3BdLkluZGV4IC09IDE7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgUmVzZXRQYWdlT2Zmc2V0KENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBhZ2VQb3MsIGludCByb3dzKQorICAgICAgICB7CisgICAgICAgICAgICBQYWdlSW5kZXggZnJvbVBhZ2U9Y29sdW1uLl9wYWdlc1twYWdlUG9zXTsKKyAgICAgICAgICAgIFBhZ2VJbmRleCB0b1BhZ2U7CisgICAgICAgICAgICBzaG9ydCBwYWdlQWRkID0gMDsKKyAgICAgICAgICAgIGlmIChmcm9tUGFnZS5PZmZzZXQgPCAtUGFnZVNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9QYWdlPWNvbHVtbi5fcGFnZXNbcGFnZVBvcy0xXTsKKyAgICAgICAgICAgICAgICBwYWdlQWRkID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGZyb21QYWdlLkluZGV4IC0gMSA9PSB0b1BhZ2UuSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVBhZ2UuSW5kZXhPZmZzZXQgKyBmcm9tUGFnZS5Sb3dzW2Zyb21QYWdlLlJvd0NvdW50IC0gMV0uSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgdG9QYWdlLkluZGV4T2Zmc2V0ICsgdG9QYWdlLlJvd3NbMF0uSW5kZXggPD0gUGFnZVNpemVNYXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlUGFnZShjb2x1bW4sIHBhZ2VQb3MgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyIG5ld1BhZ2UgPSBuZXcgUGFnZUluZGV4KHRvUGFnZSwgMCwgR2V0U2l6ZShmcm9tUGFnZS5Sb3dDb3VudCArIHRvUGFnZS5Sb3dDb3VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdQYWdlLlJvd0NvdW50ID0gZnJvbVBhZ2UuUm93Q291bnQgKyBmcm9tUGFnZS5Sb3dDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQXJyYXkuQ29weSh0b1BhZ2UuUm93cywgMCwgbmV3UGFnZS5Sb3dzLCAwLCB0b1BhZ2UuUm93Q291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9BcnJheS5Db3B5KGZyb21QYWdlLlJvd3MsIDAsIG5ld1BhZ2UuUm93cywgdG9QYWdlLlJvd0NvdW50LCBmcm9tUGFnZS5Sb3dDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciAoaW50IHIgPSB0b1BhZ2UuUm93Q291bnQ7IHIgPCBuZXdQYWdlLlJvd0NvdW50OyByKyspCisgICAgICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG5ld1BhZ2UuUm93c1tyXS5JbmRleCArPSAoc2hvcnQpKGZyb21QYWdlLkluZGV4T2Zmc2V0IC0gdG9QYWdlLkluZGV4T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAvL05vIHBhZ2UgYWZ0ZXIgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcm9tUGFnZS5JbmRleCAtPSBwYWdlQWRkOworICAgICAgICAgICAgICAgICAgICBmcm9tUGFnZS5PZmZzZXQgKz0gUGFnZVNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZnJvbVBhZ2UuT2Zmc2V0ID4gUGFnZVNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9QYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zICsgMV07CisgICAgICAgICAgICAgICAgcGFnZUFkZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGZyb21QYWdlLkluZGV4ICsgMSA9PSB0b1BhZ2UuSW5kZXgpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyb21QYWdlLkluZGV4ICs9IHBhZ2VBZGQ7CisgICAgICAgICAgICAgICAgICAgIGZyb21QYWdlLk9mZnNldCArPSBQYWdlU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcm93czsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IERlbGV0ZVBhZ2UoaW50IGZyb21Sb3csIGludCByb3dzLCBDb2x1bW5JbmRleCBjb2x1bW4sIGludCBwYWdlUG9zLCBib29sIHNoaWZ0KQorICAgICAgICB7CisgICAgICAgICAgICBQYWdlSW5kZXggcGFnZSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisgICAgICAgICAgICB2YXIgc3RhcnRSb3dzID0gcm93czsKKyAgICAgICAgICAgIHdoaWxlIChwYWdlICE9IG51bGwgJiYgcGFnZS5NaW5JbmRleCA+PSBmcm9tUm93ICYmICgoc2hpZnQgJiYgcGFnZS5NYXhJbmRleCA8IGZyb21Sb3cgKyByb3dzKSB8fCAoIXNoaWZ0ICYmIHBhZ2UuTWF4SW5kZXggPCBmcm9tUm93ICsgc3RhcnRSb3dzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9EZWxldGUgZW50aXJlIHBhZ2UuCisgICAgICAgICAgICAgICAgdmFyIGRlbFNpemU9cGFnZS5NYXhJbmRleCAtIHBhZ2UuTWluSW5kZXgrMTsKKyAgICAgICAgICAgICAgICByb3dzIC09IGRlbFNpemU7CisgICAgICAgICAgICAgICAgdmFyIHByZXZPZmZzZXQgPSBwYWdlLk9mZnNldDsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGNvbHVtbi5fcGFnZXMsIHBhZ2VQb3MgKyAxLCBjb2x1bW4uX3BhZ2VzLCBwYWdlUG9zLCBjb2x1bW4uUGFnZUNvdW50IC0gcGFnZVBvcyArIDEpOworICAgICAgICAgICAgICAgIGNvbHVtbi5QYWdlQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoY29sdW1uLlBhZ2VDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHNoaWZ0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhZ2VQb3M7IGkgPCBjb2x1bW4uUGFnZUNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbaV0uT2Zmc2V0IC09IGRlbFNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLl9wYWdlc1tpXS5PZmZzZXQgPD0gLVBhZ2VTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbaV0uSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW2ldLk9mZnNldCArPSBQYWdlU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5QYWdlQ291bnQgPiBwYWdlUG9zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisgICAgICAgICAgICAgICAgICAgIC8vcGFnZS5PZmZzZXQgPSBwYWdlUG9zID09IDAgPyAxIDogcHJldk9mZnNldDsgIC8vRmlyc3QgcGFnZSBjYW4gb25seSByZWZlcmVuY2UgdG8gcm93cyBzdGFydGluZyBmcm9tIEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9ObyBtb3JlIHBhZ2VzLCByZXR1cm4gMAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcm93czsKKyAgICAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgcHJpdmF0ZSBpbnQgRGVsZXRlQ2VsbHMoUGFnZUluZGV4IHBhZ2UsICBpbnQgZnJvbVJvdywgaW50IHRvUm93LCBib29sIHNoaWZ0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnJvbVBvcyA9IHBhZ2UuR2V0UG9zaXRpb24oZnJvbVJvdyAtIChwYWdlLkluZGV4T2Zmc2V0KSk7CisgICAgICAgICAgICBpZiAoZnJvbVBvcyA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbVBvcyA9IH5mcm9tUG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG1heFJvdyA9IHBhZ2UuTWF4SW5kZXg7CisgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdG9Sb3cgLSBwYWdlLkluZGV4T2Zmc2V0OworICAgICAgICAgICAgaWYgKG9mZnNldCA+IFBhZ2VTaXplTWF4KSBvZmZzZXQgPSBQYWdlU2l6ZU1heDsKKyAgICAgICAgICAgIHZhciB0b1BvcyA9IHBhZ2UuR2V0UG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICh0b1BvcyA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9Qb3MgPSB+dG9Qb3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmcm9tUG9zIDw9IHRvUG9zICYmIGZyb21Qb3MgPCBwYWdlLlJvd0NvdW50ICYmIHBhZ2UuR2V0SW5kZXgoZnJvbVBvcykgPCB0b1JvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodG9Sb3cgPiBwYWdlLk1heEluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Sb3cgPT0gcGFnZS5NaW5JbmRleCkgLy9EZWxldGUgZW50aXJlIHBhZ2UsIGxhdGUgaW4gdGhlIHBhZ2UgZGVsZXRlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHBhZ2UuTWF4SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHZhciBkZWxldGVkUm93ID0gcGFnZS5Sb3dDb3VudCAtIGZyb21Qb3M7IAorICAgICAgICAgICAgICAgICAgICBwYWdlLlJvd0NvdW50IC09IGRlbGV0ZWRSb3c7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByKzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByb3dzID0gdG9Sb3cgLSBmcm9tUm93OworICAgICAgICAgICAgICAgICAgICBpZihzaGlmdCkgVXBkYXRlUm93SW5kZXgocGFnZSwgdG9Qb3MsIHJvd3MpOworICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KHBhZ2UuUm93cywgdG9Qb3MsIHBhZ2UuUm93cywgZnJvbVBvcywgcGFnZS5Sb3dDb3VudCAtIHRvUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFnZS5Sb3dDb3VudCAtPSB0b1Bvcy1mcm9tUG9zOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1JvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNoaWZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVwZGF0ZVJvd0luZGV4KHBhZ2UsIHRvUG9zLCB0b1JvdyAtIGZyb21Sb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRvUm93IDwgbWF4Um93ID8gdG9Sb3cgOiBtYXhSb3c7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFVwZGF0ZVJvd0luZGV4KFBhZ2VJbmRleCBwYWdlLCBpbnQgdG9Qb3MsIGludCByb3dzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByID0gdG9Qb3M7IHIgPCBwYWdlLlJvd0NvdW50OyByKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFnZS5Sb3dzW3JdLkluZGV4IC09IChzaG9ydCkgcm93czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWxldGVDb2x1bW5zKGludCBmcm9tQ29sLCBpbnQgY29sdW1ucywgYm9vbCBzaGlmdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZQb3MgPSBHZXRQb3NpdGlvbihmcm9tQ29sKTsKKyAgICAgICAgICAgIGlmIChmUG9zIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmUG9zID0gfmZQb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgdFBvcyA9IGZQb3M7CisgICAgICAgICAgICBmb3IgKHZhciBjID0gZlBvczsgYyA8PSBDb2x1bW5Db3VudDsgYysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRQb3MgPSBjOworICAgICAgICAgICAgICAgIGlmICh0UG9zPT1Db2x1bW5Db3VudCB8fCBfY29sdW1uSW5kZXhbY10uSW5kZXggPj0gZnJvbUNvbCArIGNvbHVtbnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChDb2x1bW5Db3VudCA8PSBmUG9zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jb2x1bW5JbmRleFtmUG9zXS5JbmRleCA+PSBmcm9tQ29sICYmIF9jb2x1bW5JbmRleFtmUG9zXS5JbmRleCA8PSBmcm9tQ29sICsgY29sdW1ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2lmIChfY29sdW1uSW5kZXhbZlBvc10uSW5kZXggPCBDb2x1bW5Db3VudCkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRQb3MgPCBDb2x1bW5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShfY29sdW1uSW5kZXgsIHRQb3MsIF9jb2x1bW5JbmRleCwgZlBvcywgQ29sdW1uQ291bnQgLSB0UG9zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb2x1bW5Db3VudCAtPSAodFBvcyAtIGZQb3MpOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNoaWZ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBmUG9zOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jb2x1bW5JbmRleFtjXS5JbmRleCAtPSAoc2hvcnQpY29sdW1uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlSW5kZXhPZmZzZXQoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcGFnZVBvcywgaW50IHJvd1BvcywgaW50IHJvdywgaW50IHJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYWdlUG9zID49IGNvbHVtbi5QYWdlQ291bnQpIHJldHVybjsgICAgLy9BIHBhZ2UgYWZ0ZXIgbGFzdCBjZWxsLgorICAgICAgICAgICAgdmFyIHBhZ2UgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdOworICAgICAgICAgICAgaWYgKHJvd3MgPiBQYWdlU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaG9ydCBhZGRQYWdlcyA9IChzaG9ydCkocm93cyA+PiBwYWdlQml0cyk7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9ICsoaW50KShyb3dzIC0gKFBhZ2VTaXplKmFkZFBhZ2VzKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IHBhZ2VQb3MgKyAxOyBwIDwgY29sdW1uLlBhZ2VDb3VudDsgcCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICsgb2Zmc2V0ID4gUGFnZVNpemUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uSW5kZXggKz0gKHNob3J0KShhZGRQYWdlcyArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgKz0gb2Zmc2V0IC0gUGFnZVNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4ICs9IGFkZFBhZ2VzOworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBzaXplID0gcGFnZS5Sb3dDb3VudCAtIHJvd1BvczsKKyAgICAgICAgICAgICAgICBpZiAocGFnZS5Sb3dDb3VudCA+IHJvd1BvcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uUGFnZUNvdW50LTEgPT0gcGFnZVBvcykgLy9ObyBwYWdlIGFmdGVyLCBjcmVhdGUgYSBuZXcgb25lLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0NvcHkgcm93cyB0byBuZXh0IHBhZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFnZSA9IENvcHlOZXcocGFnZSwgcm93UG9zLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhZ2UuSW5kZXggPSAoc2hvcnQpKChyb3cgKyByb3dzKSA+PiBwYWdlQml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlLk9mZnNldCA9IHJvdyArIHJvd3MgLSAobmV3UGFnZS5JbmRleCAqIFBhZ2VTaXplKSAtIG5ld1BhZ2UuUm93c1swXS5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYWdlLk9mZnNldCA+IFBhZ2VTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhZ2UuSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlLk9mZnNldCAtPSBQYWdlU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoY29sdW1uLCBwYWdlUG9zICsgMSwgbmV3UGFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLlJvd0NvdW50ID0gcm93UG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5fcGFnZXNbcGFnZVBvcyArIDFdLlJvd0NvdW50ICsgc2l6ZSA+IFBhZ2VTaXplTWF4KSAvL1NwbGl0IFBhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxpdFBhZ2VJbnNlcnQoY29sdW1uLHBhZ2VQb3MsIHJvd1Bvcywgcm93cywgc2l6ZSwgYWRkUGFnZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvL0NvcHkgUGFnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5TWVyZ2VQYWdlKHBhZ2UsIHJvd1Bvcywgcm93cywgc2l6ZSwgY29sdW1uLl9wYWdlc1twYWdlUG9zICsgMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0FkZCB0byBQYWdlcy4KKyAgICAgICAgICAgICAgICBmb3IgKGludCByID0gcm93UG9zOyByIDwgcGFnZS5Sb3dDb3VudDsgcisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZS5Sb3dzW3JdLkluZGV4ICs9IChzaG9ydClyb3dzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFnZS5PZmZzZXQgKyBwYWdlLlJvd3NbcGFnZS5Sb3dDb3VudC0xXS5JbmRleCA+PSBQYWdlU2l6ZU1heCkgICAvL0NhbiBub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIG1heCBzaXplIG9mIHRoZSBwYWdlLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWRqdXN0SW5kZXgoY29sdW1uLCBwYWdlUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2UuT2Zmc2V0ICsgcGFnZS5Sb3dzW3BhZ2UuUm93Q291bnQgLSAxXS5JbmRleCA+PSBQYWdlU2l6ZU1heCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVBvcz1TcGxpdFBhZ2UoY29sdW1uLCBwYWdlUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvL0luZGV4SXRlbVtdIG5ld1Jvd3MgPSBuZXcgSW5kZXhJdGVtW0dldFNpemUocGFnZS5Sb3dDb3VudCAtIHBhZ2UuUm93c1tyXS5JbmRleCldOworICAgICAgICAgICAgICAgICAgICAvL3ZhciBuZXdQYWdlID0gbmV3IFBhZ2VJbmRleChuZXdSb3dzLCByKTsKKyAgICAgICAgICAgICAgICAgICAgLy9uZXdQYWdlLkluZGV4ID0gKHNob3J0KShwYWdlUG9zICsgMSk7CisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogTW92ZVJvd3MgdG8gbmV4dCBwYWdlLgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSBwYWdlUG9zICsgMTsgcCA8IGNvbHVtbi5QYWdlQ291bnQ7IHArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCArIHJvd3MgPCBQYWdlU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgKz0gcm93czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ID0gKGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0K3Jvd3MpICUgUGFnZVNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU3BsaXRQYWdlSW5zZXJ0KENvbHVtbkluZGV4IGNvbHVtbixpbnQgcGFnZVBvcywgaW50IHJvd1BvcywgaW50IHJvd3MsIGludCBzaXplLCBpbnQgYWRkUGFnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuZXdSb3dzID0gbmV3IEluZGV4SXRlbVtHZXRTaXplKHNpemUpXTsKKyAgICAgICAgICAgIHZhciBwYWdlPWNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisKKyAgICAgICAgICAgIHZhciByU3RhcnQ9LTE7CisgICAgICAgICAgICBmb3IgKGludCByID0gcm93UG9zOyByIDwgcGFnZS5Sb3dDb3VudDsgcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYWdlLkluZGV4RXhwYW5kZWQgLSAocGFnZS5Sb3dzW3JdLkluZGV4ICsgcm93cykgPiBQYWdlU2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJTdGFydCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWdlLlJvd3Nbcl0uSW5kZXggKz0gKHNob3J0KXJvd3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJjID0gcGFnZS5Sb3dDb3VudCAtIHJTdGFydDsKKyAgICAgICAgICAgIHBhZ2UuUm93Q291bnQ9clN0YXJ0OworICAgICAgICAgICAgaWYocmM+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0NvcHkgdG8gYSBuZXcgcGFnZQorICAgICAgICAgICAgICAgIHZhciByb3cgPSBwYWdlLkluZGV4T2Zmc2V0OworICAgICAgICAgICAgICAgIHZhciBuZXdQYWdlPUNvcHlOZXcocGFnZSxyU3RhcnQscmMpOworICAgICAgICAgICAgICAgIHZhciBpeCA9IChzaG9ydCkocGFnZS5JbmRleCArIGFkZFBhZ2VzKTsKKyAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcGFnZS5JbmRleE9mZnNldCArIHJvd3MgLSAoaXggKiBQYWdlU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IFBhZ2VTaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXggKz0gKHNob3J0KShvZmZzZXQgLyBQYWdlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCAlPSBQYWdlU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3UGFnZS5JbmRleCA9IGl4OworICAgICAgICAgICAgICAgIG5ld1BhZ2UuT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgIEFkZFBhZ2UoY29sdW1uLCBwYWdlUG9zICsgMSwgbmV3UGFnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQ29weSBmcm9tIG5leHQgUm93CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ29weU1lcmdlUGFnZShQYWdlSW5kZXggcGFnZSwgaW50IHJvd1BvcywgaW50IHJvd3MsIGludCBzaXplLCBQYWdlSW5kZXggVG9QYWdlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3RhcnRSb3cgPSBwYWdlLkluZGV4T2Zmc2V0ICsgcGFnZS5Sb3dzW3Jvd1Bvc10uSW5kZXggKyByb3dzOworICAgICAgICAgICAgdmFyIG5ld1Jvd3MgPSBuZXcgSW5kZXhJdGVtW0dldFNpemUoVG9QYWdlLlJvd0NvdW50ICsgc2l6ZSldOworICAgICAgICAgICAgcGFnZS5Sb3dDb3VudCAtPSBzaXplOworICAgICAgICAgICAgQXJyYXkuQ29weShwYWdlLlJvd3MsIHJvd1BvcywgbmV3Um93cywgMCwgc2l6ZSk7CisgICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHNpemU7IHIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdSb3dzW3JdLkluZGV4ICs9IChzaG9ydCkocGFnZS5JbmRleE9mZnNldCArIHJvd3MgLSBUb1BhZ2UuSW5kZXhPZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBcnJheS5Db3B5KFRvUGFnZS5Sb3dzLCAwLCBuZXdSb3dzLCBzaXplLCBUb1BhZ2UuUm93Q291bnQpOworICAgICAgICAgICAgVG9QYWdlLlJvd3MgPSBuZXdSb3dzOworICAgICAgICAgICAgVG9QYWdlLlJvd0NvdW50ICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIE1lcmdlUGFnZShDb2x1bW5JbmRleCBjb2x1bW4sIGludCBwYWdlUG9zKQorICAgICAgICB7CisgICAgICAgICAgICBQYWdlSW5kZXggUGFnZTE9Y29sdW1uLl9wYWdlc1twYWdlUG9zXTsKKyAgICAgICAgICAgIFBhZ2VJbmRleCBQYWdlMiA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvcyArIDFdOworCisgICAgICAgICAgICB2YXIgbmV3UGFnZSA9IG5ldyBQYWdlSW5kZXgoUGFnZTEsIDAsIFBhZ2UxLlJvd0NvdW50ICsgUGFnZTIuUm93Q291bnQpOworICAgICAgICAgICAgbmV3UGFnZS5Sb3dDb3VudCA9IFBhZ2UxLlJvd0NvdW50ICsgUGFnZTIuUm93Q291bnQ7CisgICAgICAgICAgICBBcnJheS5Db3B5KFBhZ2UxLlJvd3MsIDAsIG5ld1BhZ2UuUm93cywgMCwgUGFnZTEuUm93Q291bnQpOworICAgICAgICAgICAgQXJyYXkuQ29weShQYWdlMi5Sb3dzLCAwLCBuZXdQYWdlLlJvd3MsIFBhZ2UxLlJvd0NvdW50LCBQYWdlMi5Sb3dDb3VudCk7CisgICAgICAgICAgICBmb3IgKGludCByID0gUGFnZTEuUm93Q291bnQ7IHIgPCBuZXdQYWdlLlJvd0NvdW50OyByKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3UGFnZS5Sb3dzW3JdLkluZGV4ICs9IChzaG9ydCkoUGFnZTIuSW5kZXhPZmZzZXQgLSBQYWdlMS5JbmRleE9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcGFnZVBvc10gPSBuZXdQYWdlOworICAgICAgICAgICAgY29sdW1uLlBhZ2VDb3VudC0tOworCisgICAgICAgICAgICBpZiAoY29sdW1uLlBhZ2VDb3VudCA+IChwYWdlUG9zICsgMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShjb2x1bW4uX3BhZ2VzLCBwYWdlUG9zKzIsIGNvbHVtbi5fcGFnZXMscGFnZVBvcysxLGNvbHVtbi5QYWdlQ291bnQtKHBhZ2VQb3MrMSkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSBwYWdlUG9zICsgMTsgcCA8IGNvbHVtbi5QYWdlQ291bnQ7IHArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgKz0gUGFnZVNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQYWdlSW5kZXggQ29weU5ldyhQYWdlSW5kZXggcGFnZUZyb20sIGludCByb3dQb3MsIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleEl0ZW1bXSBuZXdSb3dzID0gbmV3IEluZGV4SXRlbVtHZXRTaXplKHNpemUpXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkocGFnZUZyb20uUm93cywgcm93UG9zLCBuZXdSb3dzLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZUluZGV4KG5ld1Jvd3MsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBHZXRTaXplKGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbmV3U2l6ZT0yNTY7CisgICAgICAgICAgICB3aGlsZSAobmV3U2l6ZSA8IHNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3U2l6ZSA8PD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXdTaXplOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRDZWxsKENvbHVtbkluZGV4IGNvbHVtbkluZGV4LCBpbnQgcGFnZVBvcywgaW50IHBvcywgc2hvcnQgaXgsIFQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhZ2VJbmRleCBwYWdlSXRlbSA9IGNvbHVtbkluZGV4Ll9wYWdlc1twYWdlUG9zXTsKKyAgICAgICAgICAgIGlmIChwYWdlSXRlbS5Sb3dDb3VudCA9PSBwYWdlSXRlbS5Sb3dzLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFnZUl0ZW0uUm93Q291bnQgPT0gUGFnZVNpemVNYXgpIC8vTWF4IHNpemUtLT5TcGxpdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFnZVBvcz1TcGxpdFBhZ2UoY29sdW1uSW5kZXgsIHBhZ2VQb3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3MgLSAxXS5Sb3dDb3VudCA+IHBvcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVBvcy0tOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zIC09IGNvbHVtbkluZGV4Ll9wYWdlc1twYWdlUG9zIC0gMV0uUm93Q291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFnZUl0ZW0gPSBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLy9FeHBhbmQgdG8gZG91YmxlIHNpemUuCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcm93c1RtcCA9IG5ldyBJbmRleEl0ZW1bcGFnZUl0ZW0uUm93cy5MZW5ndGggPDwgMV07CisgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkocGFnZUl0ZW0uUm93cywgMCwgcm93c1RtcCwgMCwgcGFnZUl0ZW0uUm93Q291bnQpOworICAgICAgICAgICAgICAgICAgICBwYWdlSXRlbS5Sb3dzID0gcm93c1RtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zIDwgcGFnZUl0ZW0uUm93Q291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShwYWdlSXRlbS5Sb3dzLCBwb3MsIHBhZ2VJdGVtLlJvd3MsIHBvcyArIDEsIHBhZ2VJdGVtLlJvd0NvdW50IC0gcG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhZ2VJdGVtLlJvd3NbcG9zXSA9IG5ldyBJbmRleEl0ZW0oKSB7IEluZGV4ID0gaXgsSW5kZXhQb2ludGVyPV92YWx1ZXMuQ291bnQgfTsKKyAgICAgICAgICAgIF92YWx1ZXMuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIHBhZ2VJdGVtLlJvd0NvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBTcGxpdFBhZ2UoQ29sdW1uSW5kZXggY29sdW1uSW5kZXgsIGludCBwYWdlUG9zKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFnZSA9IGNvbHVtbkluZGV4Ll9wYWdlc1twYWdlUG9zXTsKKyAgICAgICAgICAgIGlmIChwYWdlLk9mZnNldCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBwYWdlLk9mZnNldDsKKyAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBwYWdlLlJvd0NvdW50OyByKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYWdlLlJvd3Nbcl0uSW5kZXggLT0gKHNob3J0KW9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0ZpbmQgU3BsaXQgcG9zCisgICAgICAgICAgICBpbnQgc3BsaXRQb3M9MDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgcGFnZS5Sb3dDb3VudDsgcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYWdlLlJvd3Nbcl0uSW5kZXggPiBQYWdlU2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwbGl0UG9zPXI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuZXdQYWdlID0gbmV3IFBhZ2VJbmRleChwYWdlLCAwLCBzcGxpdFBvcyk7CisgICAgICAgICAgICB2YXIgbmV4dFBhZ2UgPSBuZXcgUGFnZUluZGV4KHBhZ2UsIHNwbGl0UG9zLCBwYWdlLlJvd0NvdW50IC0gc3BsaXRQb3MsIChzaG9ydCkocGFnZS5JbmRleCArIDEpLCBwYWdlLk9mZnNldCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgbmV4dFBhZ2UuUm93Q291bnQ7IHIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXh0UGFnZS5Sb3dzW3JdLkluZGV4ID0gKHNob3J0KShuZXh0UGFnZS5Sb3dzW3JdLkluZGV4IC0gUGFnZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvc10gPSBuZXdQYWdlOworICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4LlBhZ2VDb3VudCArIDEgPiBjb2x1bW5JbmRleC5fcGFnZXMuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwYWdlVG1wID0gbmV3IFBhZ2VJbmRleFtjb2x1bW5JbmRleC5fcGFnZXMuTGVuZ3RoIDw8IDFdOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoY29sdW1uSW5kZXguX3BhZ2VzLCAwLCBwYWdlVG1wLCAwLCBjb2x1bW5JbmRleC5QYWdlQ291bnQpOworICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4Ll9wYWdlcyA9IHBhZ2VUbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcnJheS5Db3B5KGNvbHVtbkluZGV4Ll9wYWdlcywgcGFnZVBvcyArIDEsIGNvbHVtbkluZGV4Ll9wYWdlcywgcGFnZVBvcyArIDIsIGNvbHVtbkluZGV4LlBhZ2VDb3VudCAtIHBhZ2VQb3MgLSAxKTsKKyAgICAgICAgICAgIGNvbHVtbkluZGV4Ll9wYWdlc1twYWdlUG9zICsgMV0gPSBuZXh0UGFnZTsKKyAgICAgICAgICAgIHBhZ2UgPSBuZXh0UGFnZTsKKyAgICAgICAgICAgIC8vcG9zIC09IFBhZ2VTaXplOworICAgICAgICAgICAgY29sdW1uSW5kZXguUGFnZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gcGFnZVBvcysxOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQYWdlSW5kZXggQWRqdXN0SW5kZXgoQ29sdW1uSW5kZXggY29sdW1uSW5kZXgsIGludCBwYWdlUG9zKQorICAgICAgICB7CisgICAgICAgICAgICBQYWdlSW5kZXggcGFnZSA9IGNvbHVtbkluZGV4Ll9wYWdlc1twYWdlUG9zXTsKKyAgICAgICAgICAgIC8vRmlyc3QgQWRqdXN0IGluZGV4ZXMKKyAgICAgICAgICAgIGlmIChwYWdlLk9mZnNldCArIHBhZ2UuUm93c1swXS5JbmRleCA+PSBQYWdlU2l6ZSB8fAorICAgICAgICAgICAgICAgIHBhZ2UuT2Zmc2V0ID49IFBhZ2VTaXplIHx8CisgICAgICAgICAgICAgICAgcGFnZS5Sb3dzWzBdLkluZGV4ID49IFBhZ2VTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhZ2UuSW5kZXgrKzsKKyAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCAtPSBQYWdlU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhZ2UuT2Zmc2V0ICsgcGFnZS5Sb3dzWzBdLkluZGV4ICA8PSAtUGFnZVNpemUgfHwgCisgICAgICAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCA8PSAtUGFnZVNpemUgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhZ2UuUm93c1swXS5JbmRleCA8PSAtUGFnZVNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFnZS5JbmRleC0tOworICAgICAgICAgICAgICAgIHBhZ2UuT2Zmc2V0ICs9IFBhZ2VTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9lbHNlIGlmIChwYWdlLlJvd3NbMF0uSW5kZXggPj0gUGFnZVNpemUpIC8vRGVsZXRlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHBhZ2UuSW5kZXgrKzsKKyAgICAgICAgICAgIC8vICAgIEFkZFBhZ2VSb3dPZmZzZXQocGFnZSwgLVBhZ2VTaXplKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlIGlmIChwYWdlLlJvd3NbMF0uSW5kZXggPD0gLVBhZ2VTaXplKSAgIC8vRGVsZXRlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHBhZ2UuSW5kZXgtLTsKKyAgICAgICAgICAgIC8vICAgIEFkZFBhZ2VSb3dPZmZzZXQocGFnZSwgUGFnZVNpemUpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICByZXR1cm4gcGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRQYWdlUm93T2Zmc2V0KFBhZ2VJbmRleCBwYWdlLCBzaG9ydCBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgcGFnZS5Sb3dDb3VudDsgcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhZ2UuUm93c1tyXS5JbmRleCArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZFBhZ2UoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcG9zLCBzaG9ydCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgQWRkUGFnZShjb2x1bW4sIHBvcyk7CisgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3Bvc10gPSBuZXcgUGFnZUluZGV4KCkgeyBJbmRleCA9IGluZGV4IH07CisgICAgICAgICAgICBpZiAocG9zID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcHA9Y29sdW1uLl9wYWdlc1twb3MtMV07CisgICAgICAgICAgICAgICAgaWYocHAuUm93Q291bnQ+MCAmJiBwcC5Sb3dzW3BwLlJvd0NvdW50LTFdLkluZGV4ID4gUGFnZVNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3Bvc10uT2Zmc2V0ID0gcHAuUm93c1twcC5Sb3dDb3VudC0xXS5JbmRleC1QYWdlU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgbmV3IHBhZ2UgdG8gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcyI+UG9zaXRpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhZ2UiPlRoZSBuZXcgcGFnZSBvYmplY3QgdG8gYWRkPC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZFBhZ2UoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcG9zLCBQYWdlSW5kZXggcGFnZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWRkUGFnZShjb2x1bW4sIHBvcyk7CisgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3Bvc10gPSBwYWdlIDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgYSBuZXcgcGFnZSB0byB0aGUgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+VGhlIGNvbHVtbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9zIj5Qb3NpdGlvbjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRQYWdlKENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbHVtbi5QYWdlQ291bnQgPT1jb2x1bW4uX3BhZ2VzLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFnZVRtcCA9IG5ldyBQYWdlSW5kZXhbY29sdW1uLl9wYWdlcy5MZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGNvbHVtbi5fcGFnZXMsIDAsIHBhZ2VUbXAsIDAsIGNvbHVtbi5QYWdlQ291bnQpOworICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXMgPSBwYWdlVG1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA8IGNvbHVtbi5QYWdlQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShjb2x1bW4uX3BhZ2VzLCBwb3MsIGNvbHVtbi5fcGFnZXMsIHBvcyArIDEsIGNvbHVtbi5QYWdlQ291bnQgLSBwb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sdW1uLlBhZ2VDb3VudCsrOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRDb2x1bW4oaW50IHBvcywgaW50IENvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENvbHVtbkNvdW50ID09IF9jb2x1bW5JbmRleC5MZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbFRtcCA9IG5ldyBDb2x1bW5JbmRleFtfY29sdW1uSW5kZXguTGVuZ3RoKjJdOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoX2NvbHVtbkluZGV4LCAwLCBjb2xUbXAsIDAsIENvbHVtbkNvdW50KTsKKyAgICAgICAgICAgICAgICBfY29sdW1uSW5kZXggPSBjb2xUbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zIDwgQ29sdW1uQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShfY29sdW1uSW5kZXgsIHBvcywgX2NvbHVtbkluZGV4LCBwb3MgKyAxLCBDb2x1bW5Db3VudCAtIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY29sdW1uSW5kZXhbcG9zXSA9IG5ldyBDb2x1bW5JbmRleCgpIHsgSW5kZXggPSAoc2hvcnQpKENvbHVtbikgfTsKKyAgICAgICAgICAgIENvbHVtbkNvdW50Kys7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpbnQgX2NvbFBvcyA9IC0xLCBfcm93OworICAgICAgICBwdWJsaWMgdWxvbmcgQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCh1bG9uZylfcm93IDw8IDMyKSB8ICh1aW50KShfY29sdW1uSW5kZXhbX2NvbFBvc10uSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKF92YWx1ZXMhPW51bGwpIF92YWx1ZXMuQ2xlYXIoKTsKKyAgICAgICAgICAgIGZvcih2YXIgYz0wO2M8Q29sdW1uQ291bnQ7YysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY29sdW1uSW5kZXhbY10gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpX2NvbHVtbkluZGV4W2NdKS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX3ZhbHVlcyA9IG51bGw7CisgICAgICAgICAgICBfY29sdW1uSW5kZXggPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy9vYmplY3QgSUVudW1lcmF0b3IuQ3VycmVudAorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0IAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICByZXR1cm4gR2V0VmFsdWUoX3JvdysxLCBfY29sdW1uSW5kZXhbX2NvbFBvc10uSW5kZXgpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgICAgICBwdWJsaWMgYm9vbCBNb3ZlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXROZXh0Q2VsbChyZWYgX3JvdywgcmVmIF9jb2xQb3MsIDAsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBOZXh0Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIE5leHRDZWxsKHJlZiByb3csIHJlZiBjb2wsIDAsMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIE5leHRDZWxsKHJlZiBpbnQgcm93LCByZWYgaW50IGNvbCwgaW50IG1pblJvdywgaW50IG1pbkNvbFBvcyxpbnQgbWF4Um93LCBpbnQgbWF4Q29sUG9zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobWluQ29sUG9zID49IENvbHVtbkNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhDb2xQb3MgPj0gQ29sdW1uQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4Q29sUG9zID0gQ29sdW1uQ291bnQtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBjPUdldFBvc2l0aW9uKGNvbCk7CisgICAgICAgICAgICBpZihjPj0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjID4gbWF4Q29sUG9zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCA8PSBtaW5Db2xQb3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2wgPSBtaW5Db2xQb3M7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZXh0Q2VsbChyZWYgcm93LCByZWYgY29sKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHI9R2V0TmV4dENlbGwocmVmIHJvdywgcmVmIGMsIG1pbkNvbFBvcywgbWF4Um93LCBtYXhDb2xQb3MpOworICAgICAgICAgICAgICAgICAgICBjb2wgPSBfY29sdW1uSW5kZXhbY10uSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjPX5jOworICAgICAgICAgICAgICAgIGlmIChjID4gX2NvbHVtbkluZGV4W2NdLkluZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCA8PSBtaW5Db2xQb3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2wgPSBtaW5Db2xQb3M7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZXh0Q2VsbChyZWYgcm93LCByZWYgY29sLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Um93LCBtYXhDb2xQb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHZhciByPUdldE5leHRDZWxsKHJlZiBjLCByZWYgcm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgY29sID0gX2NvbHVtbkluZGV4W2NdLkluZGV4OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBHZXROZXh0Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2xQb3MsIGludCBzdGFydENvbFBvcywgaW50IGVuZFJvdywgaW50IGVuZENvbFBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENvbHVtbkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgrK2NvbFBvcyA8IENvbHVtbkNvdW50ICYmIGNvbFBvcyA8PWVuZENvbFBvcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByID0gX2NvbHVtbkluZGV4W2NvbFBvc10uR2V0TmV4dFJvdyhyb3cpOworICAgICAgICAgICAgICAgICAgICBpZiAociA9PSByb3cpIC8vRXhpc3RzIG5leHQgUm93CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblJvdywgbWluQ29sOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiByb3cpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2wgPSBjb2xQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gaW50Lk1heFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gY29sUG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjIDwgQ29sdW1uQ291bnQgJiYgYyA8PSBlbmRDb2xQb3MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIHIgPCBtaW5Sb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Sb3cgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2wgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gc3RhcnRDb2xQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93IDwgZW5kUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjIDwgY29sUG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHJvdykgLy9FeGlzdHMgbmV4dCBSb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIChyIDwgbWluUm93IHx8IChyPT1taW5Sb3cgJiYgYzxtaW5Db2wpKSAmJiByIDw9IGVuZFJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJvdyA9PSBpbnQuTWF4VmFsdWUgfHwgbWluUm93ID4gZW5kUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBtaW5Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gbWluQ29sOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xQb3MgPD0gc3RhcnRDb2xQb3MgfHwgcm93Pj1lbmRSb3cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2xQb3MgPSBzdGFydENvbFBvcyAtIDE7CisgICAgICAgICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0TmV4dENlbGwocmVmIHJvdywgcmVmIGNvbFBvcywgc3RhcnRDb2xQb3MsIGVuZFJvdywgZW5kQ29sUG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBHZXROZXh0Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2xQb3MsIGludCBzdGFydENvbFBvcywgaW50IGVuZFJvdywgaW50IGVuZENvbFBvcywgcmVmIGludFtdIHBhZ2VQb3MsIHJlZiBpbnRbXSBjZWxsUG9zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sUG9zID09IGVuZENvbFBvcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2xQb3MgPSBzdGFydENvbFBvczsKKyAgICAgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2xQb3MrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhZ2VQb3NbY29sUG9zXSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocGFnZVBvc1tjb2xQb3NdPT0tMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3NbY29sUG9zXSA9IF9jb2x1bW5JbmRleFtjb2xQb3NdLkdldFBvc2l0aW9uKHJvdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2NvbHVtbkluZGV4W2NvbFBvc10uX3BhZ2VzW3BhZ2VQb3NbY29sUG9zXV0uUm93Q291bnQgPD0gcm93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY29sdW1uSW5kZXhbY29sUG9zXS5QYWdlQ291bnQgPiBwYWdlUG9zW2NvbFBvc10pCisgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3NbY29sUG9zXSsrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3NbY29sUG9zXT0tMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciByID0gX2NvbHVtbkluZGV4W2NvbFBvc10uX3BhZ2VzW3BhZ2VQb3NbY29sUG9zXV0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY29sUG9zXS5fcGFnZXNbcGFnZVBvc1tjb2xQb3NdXS5Sb3dzW2NlbGxQb3NbY29sUG9zXV0uSW5kZXg7CisgICAgICAgICAgICBpZiAociA9PSByb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm93ID0gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgUHJldkNlbGwocmVmIGludCByb3csIHJlZiBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUHJldkNlbGwocmVmIHJvdywgcmVmIGNvbCwgMCwgMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIFByZXZDZWxsKHJlZiBpbnQgcm93LCByZWYgaW50IGNvbCwgaW50IG1pblJvdywgaW50IG1pbkNvbFBvcywgaW50IG1heFJvdywgaW50IG1heENvbFBvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1pbkNvbFBvcyA+PSBDb2x1bW5Db3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4Q29sUG9zID49IENvbHVtbkNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heENvbFBvcyA9IENvbHVtbkNvdW50IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBjID0gR2V0UG9zaXRpb24oY29sKTsKKyAgICAgICAgICAgIGlmKGM+PTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2wgPj0gbWF4Q29sUG9zKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBtaW5Sb3cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByb3ctLTsKKyAgICAgICAgICAgICAgICAgICAgY29sID0gbWF4Q29sUG9zOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcmV2Q2VsbChyZWYgcm93LCByZWYgY29sLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Um93LCBtYXhDb2xQb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcmV0PUdldFByZXZDZWxsKHJlZiByb3csIHJlZiBjLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Q29sUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gX2NvbHVtbkluZGV4W2NdLkluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGM9fmM7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2wgPj0gbWF4Q29sUG9zIHx8IHJvdzw9MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbCA9IG1heENvbFBvczsKKyAgICAgICAgICAgICAgICAgICAgcm93LS07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcmV2Q2VsbChyZWYgcm93LCByZWYgY29sLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Um93LCBtYXhDb2xQb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gR2V0UHJldkNlbGwocmVmIHJvdywgcmVmIGMsIG1pblJvdywgbWluQ29sUG9zLCBtYXhDb2xQb3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBfY29sdW1uSW5kZXhbY10uSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBHZXRQcmV2Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2xQb3MsIGludCBzdGFydFJvdywgaW50IHN0YXJ0Q29sUG9zLCBpbnQgZW5kQ29sUG9zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ29sdW1uQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKC0tY29sUG9zID49IHN0YXJ0Q29sUG9zKQorLy8gICAgICAgICAgICAgICAgaWYgKCsrY29sUG9zIDwgQ29sdW1uQ291bnQgJiYgY29sUG9zIDw9IGVuZENvbFBvcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByID0gX2NvbHVtbkluZGV4W2NvbFBvc10uR2V0TmV4dFJvdyhyb3cpOworICAgICAgICAgICAgICAgICAgICBpZiAociA9PSByb3cpIC8vRXhpc3RzIG5leHQgUm93CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblJvdywgbWluQ29sOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiByb3cgJiYgciA+PSBzdGFydFJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Sb3cgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IGNvbFBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Sb3cgPSBpbnQuTWF4VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ29sID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjb2xQb3MgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gc3RhcnRDb2xQb3MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMgPj0gc3RhcnRDb2xQb3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gX2NvbHVtbkluZGV4W2NdLkdldE5leHRSb3cocm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xQb3MgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiByb3cgJiYgciA8IG1pblJvdyAmJiByID49IHN0YXJ0Um93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Sb3cgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ29sID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA+IHN0YXJ0Um93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBlbmRDb2xQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMgPiBjb2xQb3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gX2NvbHVtbkluZGV4W2NdLkdldE5leHRSb3cocm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xQb3MgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiByb3cgJiYgciA8IG1pblJvdyAmJiByID49IHN0YXJ0Um93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Sb3cgPSByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ29sID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJvdyA9PSBpbnQuTWF4VmFsdWUgfHwgc3RhcnRSb3cgPCBtaW5Sb3cpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IG1pblJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xQb3MgPSBtaW5Db2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gQ29sdW1uQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIHJvdy0tOworICAgICAgICAgICAgICAgICAgICBpZiAocm93IDwgc3RhcnRSb3cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0UHJldkNlbGwocmVmIGNvbFBvcywgcmVmIHJvdywgc3RhcnRSb3csIHN0YXJ0Q29sUG9zLCBlbmRDb2xQb3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NvbFBvcyA9IC0xOyAgICAgICAgICAgIAorICAgICAgICAgICAgX3Jvdz0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vcHVibGljIElFbnVtZXJhdG9yPHVsb25nPiBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHRoaXMuUmVzZXQoKTsKKyAgICAgICAgLy8gICAgcmV0dXJuIHRoaXM7CisgICAgICAgIC8vfQorCisgICAgICAgIC8vSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB0aGlzLlJlc2V0KCk7CisgICAgICAgIC8vICAgIHJldHVybiB0aGlzOworICAgICAgICAvL30KKworICAgIH0KKyAgICBpbnRlcm5hbCBjbGFzcyBDZWxsc1N0b3JlRW51bWVyYXRvcjxUPiA6IElFbnVtZXJhYmxlPFQ+LCBJRW51bWVyYXRvcjxUPgorICAgIHsKKyAgICAgICAgQ2VsbFN0b3JlPFQ+IF9jZWxsU3RvcmU7CisgICAgICAgIGludCByb3csIGNvbFBvczsKKyAgICAgICAgaW50W10gcGFnZVBvcywgY2VsbFBvczsKKyAgICAgICAgaW50IF9zdGFydFJvdywgX3N0YXJ0Q29sLCBfZW5kUm93LCBfZW5kQ29sOworICAgICAgICBpbnQgbWluUm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zOworICAgICAgICBwdWJsaWMgQ2VsbHNTdG9yZUVudW1lcmF0b3IoQ2VsbFN0b3JlPFQ+IGNlbGxTdG9yZSkgOgorICAgICAgICAgICAgdGhpcyhjZWxsU3RvcmUsIDAsMCxFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpICAgICAgICAKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBDZWxsc1N0b3JlRW51bWVyYXRvcihDZWxsU3RvcmU8VD4gY2VsbFN0b3JlLCBpbnQgU3RhcnRSb3csIGludCBTdGFydENvbCwgaW50IEVuZFJvdywgaW50IEVuZENvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NlbGxTdG9yZSA9IGNlbGxTdG9yZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX3N0YXJ0Um93PVN0YXJ0Um93OworICAgICAgICAgICAgX3N0YXJ0Q29sPVN0YXJ0Q29sOworICAgICAgICAgICAgX2VuZFJvdz1FbmRSb3c7CisgICAgICAgICAgICBfZW5kQ29sPUVuZENvbDsKKworICAgICAgICAgICAgSW5pdCgpOworCisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIEluaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBtaW5Sb3cgPSBfc3RhcnRSb3c7CisgICAgICAgICAgICBtYXhSb3cgPSBfZW5kUm93OworCisgICAgICAgICAgICBtaW5Db2xQb3MgPSBfY2VsbFN0b3JlLkdldFBvc2l0aW9uKF9zdGFydENvbCk7CisgICAgICAgICAgICBpZiAobWluQ29sUG9zIDwgMCkgbWluQ29sUG9zID0gfm1pbkNvbFBvczsKKyAgICAgICAgICAgIG1heENvbFBvcyA9IF9jZWxsU3RvcmUuR2V0UG9zaXRpb24oX2VuZENvbCk7CisgICAgICAgICAgICBpZiAobWF4Q29sUG9zIDwgMCkgbWF4Q29sUG9zID0gfm1heENvbFBvcy0xOworICAgICAgICAgICAgcm93ID0gbWluUm93OworICAgICAgICAgICAgY29sUG9zID0gbWluQ29sUG9zIC0gMTsKKworICAgICAgICAgICAgdmFyIGNvbHMgPSBtYXhDb2xQb3MgLSBtaW5Db2xQb3MgKyAxOworICAgICAgICAgICAgcGFnZVBvcyA9IG5ldyBpbnRbY29sc107CisgICAgICAgICAgICBjZWxsUG9zID0gbmV3IGludFtjb2xzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhZ2VQb3NbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICBjZWxsUG9zW2ldID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IFJvdyAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgQ29sdW1uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb2xQb3MgPT0gLTEpIE1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbFBvcyA9PSAtMSkgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsU3RvcmUuX2NvbHVtbkluZGV4W2NvbFBvc10uSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgVCBWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NrIChfY2VsbFN0b3JlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsU3RvcmUuR2V0VmFsdWUocm93LCBDb2x1bW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2sgKF9jZWxsU3RvcmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY2VsbFN0b3JlLlNldFZhbHVlKHJvdywgQ29sdW1uLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcmV0dXJuIF9jZWxsU3RvcmUuR2V0TmV4dENlbGwocmVmIHJvdywgcmVmIGNvbFBvcywgbWluQ29sUG9zLCBtYXhSb3csIG1heENvbFBvcyk7CisgICAgICAgICAgICByZXR1cm4gX2NlbGxTdG9yZS5HZXROZXh0Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIFByZXZpb3VzKCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoX2NlbGxTdG9yZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NlbGxTdG9yZS5HZXRQcmV2Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Q29sUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ2VsbEFkZHJlc3MgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoUm93LCBDb2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICBSZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9fY2VsbFN0b3JlPW51bGw7CisgICAgICAgIH0KKworICAgICAgICBvYmplY3QgSUVudW1lcmF0b3IuQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICB9CisgICAgfQorICAgIGludGVybmFsIGNsYXNzIEZsYWdDZWxsU3RvcmUgOiBDZWxsU3RvcmU8Ynl0ZT4KKyAgICB7CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0RmxhZ1ZhbHVlKGludCBSb3csIGludCBDb2wsIGJvb2wgdmFsdWUsIENlbGxGbGFncyBjZWxsRmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIENlbGxGbGFncyBjdXJyZW50VmFsdWUgPSAoQ2VsbEZsYWdzKSBHZXRWYWx1ZShSb3csIENvbCk7CisgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0VmFsdWUoUm93LCBDb2wsIChieXRlKShjdXJyZW50VmFsdWUgfCBjZWxsRmxhZ3MpKTsgLy8gYWRkIHRoZSBDZWxsRmxhZyBiaXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZShSb3csIENvbCwgKGJ5dGUpKGN1cnJlbnRWYWx1ZSAmIH5jZWxsRmxhZ3MpKTsgLy8gcmVtb3ZlIHRoZSBDZWxsRmxhZyBiaXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEdldEZsYWdWYWx1ZShpbnQgUm93LCBpbnQgQ29sLCBDZWxsRmxhZ3MgY2VsbEZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gISgoKGJ5dGUpY2VsbEZsYWdzICYgR2V0VmFsdWUoUm93LCBDb2wpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ0YgSW1wbGVtZW50YXRpb24uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NGIEltcGxlbWVudGF0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzN2QzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NGIEltcGxlbWVudGF0aW9uLmNzCkBAIC0wLDAgKzEsMzkyIEBACivvu78jcmVnaW9uIFRPRE8KKy8vVE9ETzogQWRkIHRoZSAiRGF0YUJhciIgZXh0ZW5kZWQgb3B0aW9ucworLy9UT0RPOiBBZGQgdGVzdHMgZm9yIGFsbCB0aGUgcnVsZXMKKy8vVE9ETzogQWRkIHRoZSBJY29uU2V0IG9wdGlvbnMKKy8vVE9ETzogQWRkIGFsbCB0aGUgImV4dExpc3QiIG9wdGlvbnMKKyNlbmRyZWdpb24KKworI3JlZ2lvbiDCpzE4LjMuMS4xOCBjb25kaXRpb25hbEZvcm1hdHRpbmcgKENvbmRpdGlvbmFsIEZvcm1hdHRpbmcpCisvL0NoaWxkczoKKy8vY2ZSdWxlICAgICAgICAgIChDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUpIMKnMTguMy4xLjEwCisvL2V4dExzdCAgICAgICAgICAoRnV0dXJlIEZlYXR1cmUgRGF0YSBTdG9yYWdlIEFyZWEpIMKnMTguMi4xMAorCisvL0F0dHJpYnV0ZXM6CisvL3Bpdm90CisvL3NxcmVmICAgICAgICAgICBTVF9TcXJlZiBzaW1wbGUgdHlwZSAowqcxOC4xOC43NikKKyNlbmRyZWdpb24KKworI3JlZ2lvbiDCpzE4LjMuMS4xMCBjZlJ1bGUgKENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSkKKy8vQ2hpbGRzOgorLy9jb2xvclNjYWxlICAgICAgKENvbG9yIFNjYWxlKSDCpzE4LjMuMS4xNgorLy9kYXRhQmFyICAgICAgICAgKERhdGEgQmFyKSDCpzE4LjMuMS4yOAorLy9leHRMc3QgICAgICAgICAgKEZ1dHVyZSBGZWF0dXJlIERhdGEgU3RvcmFnZSBBcmVhKSDCpzE4LjIuMTAKKy8vZm9ybXVsYSAgICAgICAgIChGb3JtdWxhKSDCpzE4LjMuMS40MworLy9pY29uU2V0ICAgICAgICAgKEljb24gU2V0KSDCpzE4LjMuMS40OQorCisvL0F0dHJpYnV0ZXM6CisvLy0tLS0tLS0tLS0tCisvL3ByaW9yaXR5ICAgICAgICAoUHJpb3JpdHkpIFRoZSBwcmlvcml0eSBvZiB0aGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaAorLy8gICAgICAgICAgICAgICAgZm9ybWF0IHNob3VsZCBiZSBldmFsdWF0ZWQgYW5kIHJlbmRlcmVkLiBMb3dlciBudW1lcmljIHZhbHVlcyBhcmUgaGlnaGVyIHByaW9yaXR5IHRoYW4KKy8vICAgICAgICAgICAgICAgIGhpZ2hlciBudW1lcmljIHZhbHVlcywgd2hlcmUgMSBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKy8vc3RvcElmVHJ1ZSAgICAgIChTdG9wIElmIFRydWUpIElmIHRoaXMgZmxhZyBpcyAxLCBubyBydWxlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHNoYWxsIGJlIGFwcGxpZWQgb3ZlciB0aGlzIHJ1bGUsIHdoZW4gdGhpcyBydWxlCisvLyAgICAgICAgICAgICAgICBldmFsdWF0ZXMgdG8gdHJ1ZS4KKy8vdHlwZSAgICAgICAgICAgIChUeXBlKSBUeXBlIG9mIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gU1RfQ2ZUeXBlIMKnMTguMTguMTIuCisvL2Fib3ZlQXZlcmFnZSAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcnVsZSBpcyBhbiAiYWJvdmUgYXZlcmFnZSIgcnVsZS4gMSBpbmRpY2F0ZXMgJ2Fib3ZlIGF2ZXJhZ2UnLgorLy8gICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZiB0eXBlIGlzIG5vdCBlcXVhbCB0byBhYm92ZUF2ZXJhZ2UuCisvL2VxdWFsQXZlcmFnZSAgICAoRXF1YWwgQXZlcmFnZSkKKy8vICAgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSAnYWJvdmVBdmVyYWdlJyBhbmQgJ2JlbG93QXZlcmFnZScgY3JpdGVyaWEgaXMgaW5jbHVzaXZlIG9mIHRoZQorLy8gICAgICAgICAgICAgICAgYXZlcmFnZSBpdHNlbGYsIG9yIGV4Y2x1c2l2ZSBvZiB0aGF0IHZhbHVlLiAxIGluZGljYXRlcyB0byBpbmNsdWRlIHRoZSBhdmVyYWdlIHZhbHVlIGluIHRoZQorLy8gICAgICAgICAgICAgICAgY3JpdGVyaWEuIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gYWJvdmVBdmVyYWdlLgorLy9ib3R0b20gICAgICAgICAgKEJvdHRvbSBOKSBJbmRpY2F0ZXMgd2hldGhlciBhICJ0b3AvYm90dG9tIG4iIHJ1bGUgaXMgYSAiYm90dG9tIG4iIHJ1bGUuIDEgaW5kaWNhdGVzICdib3R0b20nLgorLy8gICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZiB0eXBlIGlzIG5vdCBlcXVhbCB0byB0b3AxMC4KKy8vZHhmSWQgICAgICAgICAgIChEaWZmZXJlbnRpYWwgRm9ybWF0dGluZyBJZCkKKy8vICAgICAgICAgICAgICAgIFRoaXMgaXMgYW4gaW5kZXggdG8gYSBkeGYgZWxlbWVudCBpbiB0aGUgU3R5bGVzIFBhcnQgaW5kaWNhdGluZyB3aGljaCBjZWxsIGZvcm1hdHRpbmcgdG8KKy8vICAgICAgICAgICAgICAgIGFwcGx5IHdoZW4gdGhlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBjcml0ZXJpYSBpcyBtZXQuIFNUX0R4ZklkIHNpbXBsZSB0eXBlICjCpzE4LjE4LjI1KS4KKy8vb3BlcmF0b3IgICAgICAgIChPcGVyYXRvcikgVGhlIG9wZXJhdG9yIGluIGEgImNlbGwgdmFsdWUgaXMiIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZgorLy8gICAgICAgICAgICAgICAgdHlwZSBpcyBub3QgZXF1YWwgdG8gY2VsbElzLiBUaGUgcG9zc2libGUgdmFsdWVzIFNUX0NvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yIHNpbXBsZSB0eXBlICjCpzE4LjE4LjE1KS4KKy8vcGVyY2VudCAgICAgICAgIChUb3AgMTAgUGVyY2VudCkKKy8vICAgICAgICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIGEgInRvcC9ib3R0b20gbiIgcnVsZSBpcyBhICJ0b3AvYm90dG9tIG4gcGVyY2VudCIgcnVsZS4gVGhpcyBhdHRyaWJ1dGUKKy8vICAgICAgICAgICAgICAgIGlzIGlnbm9yZWQgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gdG9wMTAuCisvL3JhbmsgICAgICAgICAgICAoUmFuaykgVGhlIHZhbHVlIG9mICJuIiBpbiBhICJ0b3AvYm90dG9tIG4iIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZAorLy8gICAgICAgICAgICAgICAgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gdG9wMTAuCisvL3N0ZERldiAgICAgICAgICAoU3RkRGV2KSBUaGUgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgdG8gaW5jbHVkZSBhYm92ZSBvciBiZWxvdyB0aGUgYXZlcmFnZSBpbiB0aGUKKy8vICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpZiB0eXBlIGlzIG5vdCBlcXVhbCB0byBhYm92ZUF2ZXJhZ2UuCisvLyAgICAgICAgICAgICAgICBJZiBhIHZhbHVlIGlzIHByZXNlbnQgZm9yIHN0ZERldiBhbmQgdGhlIHJ1bGUgdHlwZSA9IGFib3ZlQXZlcmFnZSwgdGhlbiB0aGlzIHJ1bGUgaXMgYXV0b21hdGljYWxseSBhbgorLy8gICAgICAgICAgICAgICAgImFib3ZlIG9yIGJlbG93IE4gc3RhbmRhcmQgZGV2aWF0aW9ucyIgcnVsZS4KKy8vdGV4dCAgICAgICAgICAgIChUZXh0KSBUaGUgdGV4dCB2YWx1ZSBpbiBhICJ0ZXh0IGNvbnRhaW5zIiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYKKy8vICAgICAgICAgICAgICAgIHR5cGUgaXMgbm90IGVxdWFsIHRvIGNvbnRhaW5zVGV4dC4KKy8vdGltZVBlcmlvZCAgICAgIChUaW1lIFBlcmlvZCkgVGhlIGFwcGxpY2FibGUgdGltZSBwZXJpb2QgaW4gYSAiZGF0ZSBvY2N1cnJpbmfigKYiIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gVGhpcworLy8gICAgICAgICAgICAgICAgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gdGltZVBlcmlvZC4gU1RfVGltZVBlcmlvZCDCpzE4LjE4LjgyLgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgWE1MIGV4YW1wbGVzCisvLyBBbGwgdGhlIGV4YW1wbGVzIGFyZSBhc3N1bWVkIHRvIGJlIGluc2lkZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nIHNxcmVmPSJBMTpBMTAiPgorCisjcmVnaW9uIEV4YW1wbGUgImJlZ2luc1dpdGgiCisvLzx4OmNmUnVsZSB0eXBlPSJiZWdpbnNXaXRoIiBkeGZJZD0iNiIgcHJpb3JpdHk9IjUiIG9wZXJhdG9yPSJiZWdpbnNXaXRoIiB0ZXh0PSJhIj4KKy8vICA8eDpmb3JtdWxhPkxFRlQoQTEsTEVOKCJhIikpPSJhIjwveDpmb3JtdWxhPgorLy88L3g6Y2ZSdWxlPgorCisvLzx4OmNmUnVsZSB0eXBlPSJiZWdpbnNXaXRoIiBkeGZJZD0iNSIgcHJpb3JpdHk9IjE0IiBvcGVyYXRvcj0iYmVnaW5zV2l0aCIgdGV4dD0iJnF1b3Q7Jmx0OyZndDsiPgorLy8gIDx4OmZvcm11bGE+TEVGVChBMyxMRU4oIiIiJmx0OyZndDsiKSk9IiIiJmx0OyZndDsiPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAiYmV0d2VlbiIKKy8vPHg6Y2ZSdWxlIHR5cGU9ImNlbGxJcyIgZHhmSWQ9IjgiIHByaW9yaXR5PSIxMCIgb3BlcmF0b3I9ImJldHdlZW4iPgorLy8gIDx4OmZvcm11bGE+MzwveDpmb3JtdWxhPgorLy8gIDx4OmZvcm11bGE+NzwveDpmb3JtdWxhPgorLy88L3g6Y2ZSdWxlPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGUgImNvbnRhaW5zVGV4dCIKKy8vPHg6Y2ZSdWxlIHR5cGU9ImNvbnRhaW5zVGV4dCIgZHhmSWQ9IjUiIHByaW9yaXR5PSI0IiBvcGVyYXRvcj0iY29udGFpbnNUZXh0IiB0ZXh0PSJjIj4KKy8vICA8eDpmb3JtdWxhPk5PVChJU0VSUk9SKFNFQVJDSCgiYyIsQTEpKSk8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJlbmRzV2l0aCIKKy8vPHg6Y2ZSdWxlIHR5cGU9ImVuZHNXaXRoIiBkeGZJZD0iOSIgcHJpb3JpdHk9IjExIiBvcGVyYXRvcj0iZW5kc1dpdGgiIHRleHQ9ImMiPgorLy8gIDx4OmZvcm11bGE+UklHSFQoQTEsTEVOKCJjIikpPSJjIjwveDpmb3JtdWxhPgorLy88L3g6Y2ZSdWxlPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGUgImVxdWFsIgorLy88eDpjZlJ1bGUgdHlwZT0iY2VsbElzIiBkeGZJZD0iNyIgcHJpb3JpdHk9IjgiIG9wZXJhdG9yPSJlcXVhbCI+CisvLyAgPHg6Zm9ybXVsYT4iYWIiPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAiZ3JlYXRlclRoYW4iCisvLzx4OmNmUnVsZSB0eXBlPSJjZWxsSXMiIGR4ZklkPSI2IiBwcmlvcml0eT0iNyIgb3BlcmF0b3I9ImdyZWF0ZXJUaGFuIj4KKy8vICA8eDpmb3JtdWxhPjQ8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJncmVhdGVyVGhhbk9yRXF1YWwiCisvLzx4OmNmUnVsZSB0eXBlPSJjZWxsSXMiIGR4ZklkPSIzIiBwcmlvcml0eT0iNCIgb3BlcmF0b3I9ImdyZWF0ZXJUaGFuT3JFcXVhbCI+CisvLyAgPHg6Zm9ybXVsYT40PC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAibGVzc1RoYW4iCisvLzx4OmNmUnVsZSB0eXBlPSJjZWxsSXMiIGR4ZklkPSI1IiBwcmlvcml0eT0iNiIgb3BlcmF0b3I9Imxlc3NUaGFuIj4KKy8vICA8eDpmb3JtdWxhPjQ8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJsZXNzVGhhbk9yRXF1YWwiCisvLzx4OmNmUnVsZSB0eXBlPSJjZWxsSXMiIGR4ZklkPSI0IiBwcmlvcml0eT0iNSIgb3BlcmF0b3I9Imxlc3NUaGFuT3JFcXVhbCI+CisvLyAgPHg6Zm9ybXVsYT40PC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAibm90QmV0d2VlbiIKKy8vPHg6Y2ZSdWxlIHR5cGU9ImNlbGxJcyIgZHhmSWQ9IjIiIHByaW9yaXR5PSIzIiBvcGVyYXRvcj0ibm90QmV0d2VlbiI+CisvLyAgPHg6Zm9ybXVsYT4zPC94OmZvcm11bGE+CisvLyAgPHg6Zm9ybXVsYT43PC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAibm90Q29udGFpbnNUZXh0IgorLy88eDpjZlJ1bGUgdHlwZT0ibm90Q29udGFpbnNUZXh0IiBkeGZJZD0iNCIgcHJpb3JpdHk9IjMiIG9wZXJhdG9yPSJub3RDb250YWlucyIgdGV4dD0iYyI+CisvLyAgPHg6Zm9ybXVsYT5JU0VSUk9SKFNFQVJDSCgiYyIsQTEpKTwveDpmb3JtdWxhPgorLy88L3g6Y2ZSdWxlPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGUgIm5vdEVxdWFsIgorLy88eDpjZlJ1bGUgdHlwZT0iY2VsbElzIiBkeGZJZD0iMSIgcHJpb3JpdHk9IjIiIG9wZXJhdG9yPSJub3RFcXVhbCI+CisvLyAgPHg6Zm9ybXVsYT4iYWIiPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAiY29udGFpbnNCbGFua3MiCisvLzx4OmNmUnVsZSB0eXBlPSJjb250YWluc0JsYW5rcyIgZHhmSWQ9IjIwIiBwcmlvcml0eT0iMzciPgorLy8gIDx4OmZvcm11bGE+TEVOKFRSSU0oQTEpKT0wPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAiY29udGFpbnNFcnJvcnMiCisvLzx4OmNmUnVsZSB0eXBlPSJjb250YWluc0Vycm9ycyIgZHhmSWQ9IjE1IiBwcmlvcml0eT0iMTkiPgorLy8gIDx4OmZvcm11bGE+SVNFUlJPUihBMSk8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJleHByZXNzaW9uIgorLy88eDpjZlJ1bGUgdHlwZT0iZXhwcmVzc2lvbiIgZHhmSWQ9IjAiIHByaW9yaXR5PSIxIj4KKy8vICA8eDpmb3JtdWxhPlJJR0hUKEoxNiwxKT0iYiI8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJkdXBsaWNhdGVWYWx1ZXMiCisvLzx4OmNmUnVsZSB0eXBlPSJkdXBsaWNhdGVWYWx1ZXMiIGR4ZklkPSIxNCIgcHJpb3JpdHk9IjE2IiAvPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGUgIm5vdENvbnRhaW5zQmxhbmtzIgorLy88eDpjZlJ1bGUgdHlwZT0ibm90Q29udGFpbnNCbGFua3MiIGR4ZklkPSIxMiIgcHJpb3JpdHk9IjE0Ij4KKy8vICA8eDpmb3JtdWxhPkxFTihUUklNKEExKSkmZ3Q7MDwveDpmb3JtdWxhPgorLy88L3g6Y2ZSdWxlPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGUgIm5vdENvbnRhaW5zRXJyb3JzIgorLy88eDpjZlJ1bGUgdHlwZT0ibm90Q29udGFpbnNFcnJvcnMiIGR4ZklkPSIxMSIgcHJpb3JpdHk9IjM2Ij4KKy8vICA8eDpmb3JtdWxhPk5PVChJU0VSUk9SKEExKSk8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJ1bmlxdWVWYWx1ZXMiCisvLzx4OmNmUnVsZSB0eXBlPSJ1bmlxdWVWYWx1ZXMiIGR4ZklkPSIxMyIgcHJpb3JpdHk9IjE1IiAvPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGUgImxhc3Q3RGF5cyIKKy8vPHg6Y2ZSdWxlIHR5cGU9InRpbWVQZXJpb2QiIGR4ZklkPSIzOSIgcHJpb3JpdHk9IjEwIiB0aW1lUGVyaW9kPSJsYXN0N0RheXMiPgorLy8gIDx4OmZvcm11bGE+QU5EKFRPREFZKCktRkxPT1IoQTEsMSkmbHQ7PTYsRkxPT1IoQTEsMSkmbHQ7PVRPREFZKCkpPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAibGFzdE1vbnRoIgorLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjM4IiBwcmlvcml0eT0iOSIgdGltZVBlcmlvZD0ibGFzdE1vbnRoIj4KKy8vICA8eDpmb3JtdWxhPkFORChNT05USChBMSk9TU9OVEgoRURBVEUoVE9EQVkoKSwwLTEpKSxZRUFSKEExKT1ZRUFSKEVEQVRFKFRPREFZKCksMC0xKSkpPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAibGFzdFdlZWsiCisvLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzciIHByaW9yaXR5PSI4IiB0aW1lUGVyaW9kPSJsYXN0V2VlayI+CisvLyAgPHg6Zm9ybXVsYT5BTkQoVE9EQVkoKS1ST1VORERPV04oQTEsMCkmZ3Q7PShXRUVLREFZKFRPREFZKCkpKSxUT0RBWSgpLVJPVU5ERE9XTihBMSwwKSZsdDsoV0VFS0RBWShUT0RBWSgpKSs3KSk8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJuZXh0TW9udGgiCisvLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzYiIHByaW9yaXR5PSI3IiB0aW1lUGVyaW9kPSJuZXh0TW9udGgiPgorLy8gIDx4OmZvcm11bGE+QU5EKE1PTlRIKEExKT1NT05USChFREFURShUT0RBWSgpLDArMSkpLFlFQVIoQTEpPVlFQVIoRURBVEUoVE9EQVkoKSwwKzEpKSk8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJuZXh0V2VlayIKKy8vPHg6Y2ZSdWxlIHR5cGU9InRpbWVQZXJpb2QiIGR4ZklkPSIzNSIgcHJpb3JpdHk9IjYiIHRpbWVQZXJpb2Q9Im5leHRXZWVrIj4KKy8vICA8eDpmb3JtdWxhPkFORChST1VORERPV04oQTEsMCktVE9EQVkoKSZndDsoNy1XRUVLREFZKFRPREFZKCkpKSxST1VORERPV04oQTEsMCktVE9EQVkoKSZsdDsoMTUtV0VFS0RBWShUT0RBWSgpKSkpPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAidGhpc01vbnRoIgorLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjM0IiBwcmlvcml0eT0iNSIgdGltZVBlcmlvZD0idGhpc01vbnRoIj4KKy8vICA8eDpmb3JtdWxhPkFORChNT05USChBMSk9TU9OVEgoVE9EQVkoKSksWUVBUihBMSk9WUVBUihUT0RBWSgpKSk8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJ0aGlzV2VlayIKKy8vPHg6Y2ZSdWxlIHR5cGU9InRpbWVQZXJpb2QiIGR4ZklkPSIzMyIgcHJpb3JpdHk9IjQiIHRpbWVQZXJpb2Q9InRoaXNXZWVrIj4KKy8vICA8eDpmb3JtdWxhPkFORChUT0RBWSgpLVJPVU5ERE9XTihBMSwwKSZsdDs9V0VFS0RBWShUT0RBWSgpKS0xLFJPVU5ERE9XTihBMSwwKS1UT0RBWSgpJmx0Oz03LVdFRUtEQVkoVE9EQVkoKSkpPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAidG9kYXkiCisvLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzIiIHByaW9yaXR5PSIzIiB0aW1lUGVyaW9kPSJ0b2RheSI+CisvLyAgPHg6Zm9ybXVsYT5GTE9PUihBMSwxKT1UT0RBWSgpPC94OmZvcm11bGE+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZSAidG9tb3Jyb3ciCisvLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzEiIHByaW9yaXR5PSIyIiB0aW1lUGVyaW9kPSJ0b21vcnJvdyI+CisvLyAgPHg6Zm9ybXVsYT5GTE9PUihBMSwxKT1UT0RBWSgpKzE8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJ5ZXN0ZXJkYXkiCisvLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMSIgcHJpb3JpdHk9IjEiIHRpbWVQZXJpb2Q9Inllc3RlcmRheSI+CisvLyAgPHg6Zm9ybXVsYT5GTE9PUihBMSwxKT1UT0RBWSgpLTE8L3g6Zm9ybXVsYT4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlICJ0d29Db2xvclNjYWxlIgorLy88Y2ZSdWxlIHR5cGU9ImNvbG9yU2NhbGUiIHByaW9yaXR5PSIxIj4KKy8vICA8Y29sb3JTY2FsZT4KKy8vICAgIDxjZnZvIHR5cGU9Im1pbiIvPgorLy8gICAgPGNmdm8gdHlwZT0ibWF4Ii8+CisvLyAgICA8Y29sb3IgcmdiPSJGRkY4Njk2QiIvPgorLy8gICAgPGNvbG9yIHJnYj0iRkY2M0JFN0IiLz4KKy8vICA8L2NvbG9yU2NhbGU+CisvLzwvY2ZSdWxlPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGVzICJpY29uU2V0MyIgKHggYWxsIHRoZSAzIEljb25TZXQgb3B0aW9ucykKKy8vPHg6Y2ZSdWxlIHR5cGU9Imljb25TZXQiIHByaW9yaXR5PSIzMCI+CisvLyAgPHg6aWNvblNldD4KKy8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSIwIiAvPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjMzIiAvPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjY3IiAvPgorLy8gIDwveDppY29uU2V0PgorLy88L3g6Y2ZSdWxlPgorCisvLzx4OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMzgiPgorLy8gIDx4Omljb25TZXQgaWNvblNldD0iM0Fycm93cyI+CisvLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iMCIgLz4KKy8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSIzMyIgLz4KKy8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSI2NyIgLz4KKy8vICA8L3g6aWNvblNldD4KKy8vPC94OmNmUnVsZT4KKyNlbmRyZWdpb24KKworI3JlZ2lvbiBFeGFtcGxlcyAiaWNvblNldDQiICh4IGFsbCB0aGUgNCBJY29uU2V0IG9wdGlvbnMpCisvLzx4OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMzQiPgorLy8gIDx4Omljb25TZXQgaWNvblNldD0iNEFycm93c0dyYXkiPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjAiIC8+CisvLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iMjUiIC8+CisvLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iNTAiIC8+CisvLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iNzUiIC8+CisvLyAgPC94Omljb25TZXQ+CisvLzwveDpjZlJ1bGU+CisjZW5kcmVnaW9uCisKKyNyZWdpb24gRXhhbXBsZXMgImljb25TZXQ1IiAoeCBhbGwgdGhlIDUgSWNvblNldCBvcHRpb25zKQorLy88eDpjZlJ1bGUgdHlwZT0iaWNvblNldCIgcHJpb3JpdHk9IjMyIj4KKy8vICA8eDppY29uU2V0IGljb25TZXQ9IjVBcnJvd3NHcmF5Ij4KKy8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSIwIiAvPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjIwIiAvPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjQwIiAvPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjYwIiAvPgorLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjgwIiAvPgorLy8gIDwveDppY29uU2V0PgorLy88L3g6Y2ZSdWxlPgorI2VuZHJlZ2lvbgorCisjcmVnaW9uIEV4YW1wbGVzICJpY29uU2V0IiBFeHRlbmRlZCAobm90IGltcGxlbWVudGVkIHlldCkKKy8vPHg6ZXh0THN0PgorLy8gIDx4OmV4dCB4bWxuczp4MTQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3NwcmVhZHNoZWV0bWwvMjAwOS85L21haW4iIHVyaT0iezc4QzBEOTMxLTY0MzctNDA3ZC1BOEVFLUYwQUFENzUzOUU2NX0iPgorLy8gICAgPHgxNDpjb25kaXRpb25hbEZvcm1hdHRpbmdzPgorLy8gICAgICA8eDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZyB4bWxuczp4bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi9tYWluIj4KKy8vICAgICAgICA8eDE0OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMzUiIGlkPSJ7RjUxMTQzNjktMDgwQS00N0U2LUI3RUUtNDk5MTM3QTNDODk2fSI+CisvLyAgICAgICAgICA8eDE0Omljb25TZXQgaWNvblNldD0iM1RyaWFuZ2xlcyI+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj4wPC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+CisvLyAgICAgICAgICAgICAgPHhtOmY+MzM8L3htOmY+CisvLyAgICAgICAgICAgIDwveDE0OmNmdm8+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj42NzwveG06Zj4KKy8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KKy8vICAgICAgICAgIDwveDE0Omljb25TZXQ+CisvLyAgICAgICAgPC94MTQ6Y2ZSdWxlPgorLy8gICAgICAgIDx4bTpzcXJlZj5DMzpDMTI8L3htOnNxcmVmPgorLy8gICAgICA8L3gxNDpjb25kaXRpb25hbEZvcm1hdHRpbmc+CisvLyAgICAgIDx4MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nIHhtbG5zOnhtPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8yMDA2L21haW4iPgorLy8gICAgICAgIDx4MTQ6Y2ZSdWxlIHR5cGU9Imljb25TZXQiIHByaW9yaXR5PSI2IiBpZD0iezBBMzI3Mzg0LUJGMkYtNEJGNS05NzY3LTEyM0NENjkwQTUzNn0iPgorLy8gICAgICAgICAgPHgxNDppY29uU2V0IGljb25TZXQ9IjNTdGFycyI+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj4wPC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+CisvLyAgICAgICAgICAgICAgPHhtOmY+MzM8L3htOmY+CisvLyAgICAgICAgICAgIDwveDE0OmNmdm8+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj42NzwveG06Zj4KKy8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KKy8vICAgICAgICAgIDwveDE0Omljb25TZXQ+CisvLyAgICAgICAgPC94MTQ6Y2ZSdWxlPgorLy8gICAgICAgIDx4bTpzcXJlZj5BMTY6QTI1PC94bTpzcXJlZj4KKy8vICAgICAgPC94MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgorLy8gICAgICA8eDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZyB4bWxuczp4bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi9tYWluIj4KKy8vICAgICAgICA8eDE0OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMTkiIGlkPSJ7MEREQ0EzRTQtMzUzNi00NEIzLUE2NjMtNDg3NzU4NzI5NUI4fSI+CisvLyAgICAgICAgICA8eDE0Omljb25TZXQgaWNvblNldD0iM1RyaWFuZ2xlcyI+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj4wPC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+CisvLyAgICAgICAgICAgICAgPHhtOmY+MzM8L3htOmY+CisvLyAgICAgICAgICAgIDwveDE0OmNmdm8+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj42NzwveG06Zj4KKy8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KKy8vICAgICAgICAgIDwveDE0Omljb25TZXQ+CisvLyAgICAgICAgPC94MTQ6Y2ZSdWxlPgorLy8gICAgICAgIDx4bTpzcXJlZj5DMTY6QzI1PC94bTpzcXJlZj4KKy8vICAgICAgPC94MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgorLy8gICAgICA8eDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZyB4bWxuczp4bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi9tYWluIj4KKy8vICAgICAgICA8eDE0OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMiIgaWQ9IntFNEVERDdGQi04ODBDLTQwOEYtQjg3Qy1DOERBNDQ2QUVCNzh9Ij4KKy8vICAgICAgICAgIDx4MTQ6aWNvblNldCBpY29uU2V0PSI1Qm94ZXMiPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+CisvLyAgICAgICAgICAgICAgPHhtOmY+MDwveG06Zj4KKy8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KKy8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgorLy8gICAgICAgICAgICAgIDx4bTpmPjIwPC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+CisvLyAgICAgICAgICAgICAgPHhtOmY+NDA8L3htOmY+CisvLyAgICAgICAgICAgIDwveDE0OmNmdm8+CisvLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KKy8vICAgICAgICAgICAgICA8eG06Zj42MDwveG06Zj4KKy8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KKy8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgorLy8gICAgICAgICAgICAgIDx4bTpmPjgwPC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgPC94MTQ6aWNvblNldD4KKy8vICAgICAgICA8L3gxNDpjZlJ1bGU+CisvLyAgICAgICAgPHhtOnNxcmVmPkUxNjpFMjU8L3htOnNxcmVmPgorLy8gICAgICA8L3gxNDpjb25kaXRpb25hbEZvcm1hdHRpbmc+CisvLyAgICAgIDx4MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nIHhtbG5zOnhtPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9leGNlbC8yMDA2L21haW4iPgorLy8gICAgICAgIDx4MTQ6Y2ZSdWxlIHR5cGU9Imljb25TZXQiIHByaW9yaXR5PSIxIiBpZD0iezRDQzgyMDYwLUNCMEEtNEEzMS1BRUYyLUQxQTU4N0FDMTY3NH0iPgorLy8gICAgICAgICAgPHgxNDppY29uU2V0IGljb25TZXQ9IjNTdGFycyIgc2hvd1ZhbHVlPSIwIiBjdXN0b209IjEiPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+CisvLyAgICAgICAgICAgICAgPHhtOmY+MDwveG06Zj4KKy8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KKy8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9ImZvcm11bGEiPgorLy8gICAgICAgICAgICAgIDx4bTpmPiRGJDE3PC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0ibnVtIj4KKy8vICAgICAgICAgICAgICA8eG06Zj40PC94bTpmPgorLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgorLy8gICAgICAgICAgICA8eDE0OmNmSWNvbiBpY29uU2V0PSIzVHJpYW5nbGVzIiBpY29uSWQ9IjEiIC8+CisvLyAgICAgICAgICAgIDx4MTQ6Y2ZJY29uIGljb25TZXQ9IjRSZWRUb0JsYWNrIiBpY29uSWQ9IjMiIC8+CisvLyAgICAgICAgICAgIDx4MTQ6Y2ZJY29uIGljb25TZXQ9IjNTdGFycyIgaWNvbklkPSIyIiAvPgorLy8gICAgICAgICAgPC94MTQ6aWNvblNldD4KKy8vICAgICAgICA8L3gxNDpjZlJ1bGU+CisvLyAgICAgICAgPHhtOnNxcmVmPkYxNjpGMjU8L3htOnNxcmVmPgorLy8gICAgICA8L3gxNDpjb25kaXRpb25hbEZvcm1hdHRpbmc+CisvLyAgICA8L3gxNDpjb25kaXRpb25hbEZvcm1hdHRpbmdzPgorLy8gIDwveDpleHQ+CisvLzwveDpleHRMc3Q+CisjZW5kcmVnaW9uCisKKworI2VuZHJlZ2lvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTViYzgzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwLmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmMxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dAorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODk1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbgorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3NjIxMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cC5jcwpAQCAtMCwwICsxLDQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKwkvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAKKwkvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cAorCQk6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKwl7CisJCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKwkJI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODFlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcy5jcwpAQCAtMCwwICsxLDQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcworICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZTMxNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzLmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzCisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWI5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MKQEAgLTAsMCArMSw1MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dAorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI5MDAyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwLmNzCkBAIC0wLDAgKzEsNjcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisJLy8vIDxzdW1tYXJ5PgorCS8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyCisJLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cAorICAgICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKwl7CisJCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvd1ZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGJvb2wgU2hvd1ZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGF0YWJhciBMb3cgVmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIExvd1ZhbHVlIHsgZ2V0OyAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERhdGFiYXIgSGlnaCBWYWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSGlnaFZhbHVlIHsgZ2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2xvciBvZiB0aGUgZGF0YWJhcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDb2xvciBDb2xvciB7IGdldDsgc2V0O30KKyAgICAgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4YmUzNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcy5jcwpAQCAtMCwwICsxLDQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y1OGQxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGguY3MKQEAgLTAsMCArMSw1MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmNlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbC5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MGRiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbgorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxZDQ5OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0LmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldAorICAvLy8gPC9zdW1tYXJ5PmVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGUKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0IDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNUljb25zU2V0VHlwZT4KKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEljb241IChwYXJ0IG9mIHRoZSA1IEljb24gU2V0KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjUgeyBnZXQ7IH0KKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NmFkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcwpAQCAtMCwwICsxLDUyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0PFQ+IDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PFQ+CisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJY29uNCAocGFydCBvZiB0aGUgNCBvdSA1IEljb24gU2V0KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjQgeyBnZXQ7IH0gICAgICAKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3MzlmYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuCisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhCisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjM2UxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwuY3MKQEAgLTAsMCArMSw1MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU4ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEdyb3VwLmNzCkBAIC0wLDAgKzEsNjMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworCS8vLyA8c3VtbWFyeT4KKwkvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEdyb3VwCisJLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cDxUPgorCQk6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKwl7CisJCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldmVyc2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGJvb2wgUmV2ZXJzZSB7IGdldDsgc2V0OyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNob3dWYWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgYm9vbCBTaG93VmFsdWUgeyBnZXQ7IHNldDsgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJY29uU2V0ICgzLCA0IG91IDUgSWNvblNldCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFQgSWNvblNldCB7IGdldDsgc2V0OyB9CisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTI1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbgorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE4YTJhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2Vlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTgzNWRkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2Vlbi5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4KKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEyCisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTUyOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MuY3MKQEAgLTAsMCArMSw0OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2NmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycy5jcwpAQCAtMCwwICsxLDQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycworICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JjYjRhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZjdjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjg5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCkBAIC0wLDAgKzEsODcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgICAgICAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworCS8vLyA8c3VtbWFyeT4KKwkvLy8gSW50ZXJmYWNlIGZvciBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQorCXsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSAnY2ZSdWxlJyBYTUwgbm9kZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgWG1sTm9kZSBOb2RlIHsgZ2V0OyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFR5cGUgb2YgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlLiBTVF9DZlR5cGUgwqcxOC4xOC4xMi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIFR5cGUgeyBnZXQ7IH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHBhcmE+UmFuZ2Ugb3ZlciB3aGljaCB0aGVzZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGVzIGFwcGx5LjwvcGFyYT4KKyAgICAvLy8gPHBhcmE+VGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgYXJlIGRlZmluZWQgYnkgdGhlCisgICAgLy8vIFNUX1NxcmVmIHNpbXBsZSB0eXBlICjCpzE4LjE4Ljc2KS48L3BhcmE+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBFeGNlbEFkZHJlc3MgQWRkcmVzcyB7IGdldDsgc2V0OyB9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gVGhlIHByaW9yaXR5IG9mIHRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisJCS8vLyB3aGljaCBmb3JtYXQgc2hvdWxkIGJlIGV2YWx1YXRlZCBhbmQgcmVuZGVyZWQuIExvd2VyIG51bWVyaWMgdmFsdWVzIGFyZSBoaWdoZXIKKwkJLy8vIHByaW9yaXR5IHRoYW4gaGlnaGVyIG51bWVyaWMgdmFsdWVzLCB3aGVyZSAxIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorCQkvLy8gPC9zdW1tYXJ5PgorICAgIGludCBQcmlvcml0eSB7IGdldDsgc2V0OyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIElmIHRoaXMgZmxhZyBpcyAxLCBubyBydWxlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHNoYWxsIGJlIGFwcGxpZWQgb3ZlciB0aGlzIHJ1bGUsCisgICAgLy8vIHdoZW4gdGhpcyBydWxlIGV2YWx1YXRlcyB0byB0cnVlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgYm9vbCBTdG9wSWZUcnVlIHsgZ2V0OyBzZXQ7IH0KKworICAgIC8vLy8vIDxzdW1tYXJ5PgorICAgIC8vLy8vIDxwYXJhPlRoaXMgaXMgYW4gaW5kZXggdG8gYSBkeGYgZWxlbWVudCBpbiB0aGUgU3R5bGVzIFBhcnQgaW5kaWNhdGluZyB3aGljaCBjZWxsCisgICAgLy8vLy8gZm9ybWF0dGluZyB0byBhcHBseSB3aGVuIHRoZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgY3JpdGVyaWEgaXMgbWV0LjwvcGFyYT4KKyAgICAvLy8vLyA8cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgZGVmaW5lZCBieSB0aGUgU1RfRHhmSWQgc2ltcGxlIHR5cGUKKyAgICAvLy8vLyAowqcxOC4xOC4yNSkuPC9wYXJhPgorICAgIC8vLy8vIDwvc3VtbWFyeT4KKy8vICAgIGludCBEeGZJZCB7IGdldDsgc2V0OyB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBHaXZlcyBhY2Nlc3MgdG8gdGhlIGRpZmZlcmVuY2lhbCBzdHlsaW5nIChEWEYpIGZvciB0aGUgcnVsZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcgU3R5bGV7IGdldDsgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ3NjhmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAuY3MKQEAgLTAsMCArMSw1MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisJLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAKKwkvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwCisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTdGREZXYKKyAgeworCQkjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisJCSNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmYxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisJLy8vIDxzdW1tYXJ5PgorCS8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlCisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCisJeworCQkjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFRocmVlIENvbG9yIFNjYWxlIE1pZGRsZSBWYWx1ZQorCQkvLy8gPC9zdW1tYXJ5PgorCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBNaWRkbGVWYWx1ZSB7IGdldDsgc2V0OyB9CisJCSNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjFlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MKQEAgLTAsMCArMSw2MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisJLy8vIDxzdW1tYXJ5PgorCS8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PFQ+CisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0R3JvdXA8VD4KKwl7CisJCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEljb24xIChwYXJ0IG9mIHRoZSAzLCA0IG91IDUgSWNvbiBTZXQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24xIHsgZ2V0OyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEljb24yIChwYXJ0IG9mIHRoZSAzLCA0IG91IDUgSWNvbiBTZXQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjIgeyBnZXQ7ICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEljb24zIChwYXJ0IG9mIHRoZSAzLCA0IG91IDUgSWNvbiBTZXQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjMgeyBnZXQ7IH0KKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRlNTVlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwLmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworCS8vLyA8c3VtbWFyeT4KKwkvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZAorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKKwkJOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCisJeworCQkjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisJCSNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKwl9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjgyODMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cC5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmFuaworICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmVkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzCkBAIC0wLDAgKzEsNTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworCS8vLyA8c3VtbWFyeT4KKwkvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZQorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCisJCTogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZUdyb3VwCisJeworCQkjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUd28gQ29sb3IgU2NhbGUgTG93IFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBMb3dWYWx1ZSB7IGdldDsgc2V0OyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFR3byBDb2xvciBTY2FsZSBIaWdoIFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBIaWdoVmFsdWUgeyBnZXQ7IHNldDsgfQorICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YWEwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MKQEAgLTAsMCArMSw0OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcworICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkMGZhMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhLmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhCisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGb3JtdWxhIEF0dHJpYnV0ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHNldDsgfQorICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjRlNzBlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEyLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhCisgIHsKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGb3JtdWxhMiBBdHRyaWJ1dGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHN0cmluZyBGb3JtdWxhMiB7IGdldDsgc2V0OyB9CisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJhbmsuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmFuay5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWIwZjkyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJhbmsuY3MKQEAgLTAsMCArMSw1MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJhbmsKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJhbmsgQXR0cmlidXRlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBVSW50MTYgUmFuayB7IGdldDsgc2V0OyB9CisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJldmVyc2UuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmV2ZXJzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzEwMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJldmVyc2UuY3MKQEAgLTAsMCArMSw1MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJldmVyc2UKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldmVyc2UgQXR0cmlidXRlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBib29sIFJldmVyc2UgeyBnZXQ7IHNldDsgfQorICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTaG93VmFsdWUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmRiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlLmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFNob3dWYWx1ZQorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2hvd1ZhbHVlIEF0dHJpYnV0ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgYm9vbCBTaG93VmFsdWUgeyBnZXQ7IHNldDsgfQorICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTdGREZXYuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWUxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2LmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFN0ZERldgorICB7CisgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3RkRGV2IEF0dHJpYnV0ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgVUludDE2IFN0ZERldiB7IGdldDsgc2V0OyB9CisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAyYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQuY3MKQEAgLTAsMCArMSw1MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRleHQgQXR0cmlidXRlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBzdHJpbmcgVGV4dCB7IGdldDsgc2V0OyB9CisgICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGY4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MKQEAgLTAsMCArMSwzMTMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICAgICBDaGFuZ2UgICAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsCQkgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKwkvLy8gPHN1bW1hcnk+CisJLy8vIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIGFkZGluZyBDb25kaXRpb25hbCBGb3JtYXR0aW5nIHRvIGEgcmFuZ2UgKDxzZWUgY3JlZj0iRXhjZWxSYW5nZUJhc2UiLz4pLgorCS8vLyBFYWNoIG1ldGhvZCB3aWxsIHJldHVybiBhIGNvbmZpZ3VyYWJsZSBjb25kdGlvbmFsIGZvcm1hdHRpbmcgdHlwZS4KKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBpbnRlcmZhY2UgSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nCisJeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIEFib3ZlIEF2ZXJhZ2UgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlQXZlcmFnZSgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgQWJvdmUgT3IgRXF1YWwgQXZlcmFnZSBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQWJvdmVPckVxdWFsQXZlcmFnZSgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgQmVsb3cgQXZlcmFnZSBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQmVsb3dBdmVyYWdlKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBCZWxvdyBPciBFcXVhbCBBdmVyYWdlIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd09yRXF1YWxBdmVyYWdlKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBBYm92ZSBTdGREZXYgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAgQWRkQWJvdmVTdGREZXYoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIEJlbG93IFN0ZERldiBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cCBBZGRCZWxvd1N0ZERldigpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgQm90dG9tIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZEJvdHRvbSgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgQm90dG9tIFBlcmNlbnQgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tUGVyY2VudCgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgVG9wIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZFRvcCgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgVG9wIFBlcmNlbnQgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wUGVyY2VudCgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgTGFzdCA3IERheXMgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3Q3RGF5cygpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgTGFzdCBNb250aCBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdE1vbnRoKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBMYXN0IFdlZWsgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3RXZWVrKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBOZXh0IE1vbnRoIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGROZXh0TW9udGgoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIE5leHQgV2VlayBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTmV4dFdlZWsoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIFRoaXMgTW9udGggcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRoaXNNb250aCgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgVGhpcyBXZWVrIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzV2VlaygpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgVG9kYXkgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvZGF5KCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBUb21vcnJvdyBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9tb3Jyb3coKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIFllc3RlcmRheSBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkWWVzdGVyZGF5KCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBCZWdpbnMgV2l0aCBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoIEFkZEJlZ2luc1dpdGgoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIEJldHdlZW4gcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbiBBZGRCZXR3ZWVuKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBDb250YWluc0JsYW5rcyBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcyBBZGRDb250YWluc0JsYW5rcygpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgQ29udGFpbnNFcnJvcnMgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMgQWRkQ29udGFpbnNFcnJvcnMoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIENvbnRhaW5zVGV4dCBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQgQWRkQ29udGFpbnNUZXh0KCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBEdXBsaWNhdGVWYWx1ZXMgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzIEFkZER1cGxpY2F0ZVZhbHVlcygpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgRW5kc1dpdGggcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGggQWRkRW5kc1dpdGgoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIEVxdWFsIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsIEFkZEVxdWFsKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBFeHByZXNzaW9uIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24gQWRkRXhwcmVzc2lvbigpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgR3JlYXRlclRoYW4gcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4gQWRkR3JlYXRlclRoYW4oKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIEdyZWF0ZXJUaGFuT3JFcXVhbCBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwgQWRkR3JlYXRlclRoYW5PckVxdWFsKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBMZXNzVGhhbiBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbiBBZGRMZXNzVGhhbigpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgTGVzc1RoYW5PckVxdWFsIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCBBZGRMZXNzVGhhbk9yRXF1YWwoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIE5vdEJldHdlZW4gcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbiBBZGROb3RCZXR3ZWVuKCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBOb3RDb250YWluc0JsYW5rcyBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyBBZGROb3RDb250YWluc0JsYW5rcygpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgTm90Q29udGFpbnNFcnJvcnMgcnVsZSB0byB0aGUgcmFuZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMgQWRkTm90Q29udGFpbnNFcnJvcnMoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIE5vdENvbnRhaW5zVGV4dCBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQgQWRkTm90Q29udGFpbnNUZXh0KCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBOb3RFcXVhbCBydWxlIHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCBBZGROb3RFcXVhbCgpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgVW5pcXVlVmFsdWVzIHJ1bGUgdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcyBBZGRVbmlxdWVWYWx1ZXMoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUiLz4gdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSBBZGRUaHJlZUNvbG9yU2NhbGUoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlIi8+IHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlIEFkZFR3b0NvbG9yU2NhbGUoKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0Jmx0O2VFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUmZ3Q7Ii8+IHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJJY29uU2V0Ij48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGU+IEFkZFRocmVlSWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlIEljb25TZXQpOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQmbHQ7ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZSZndDsiLz4gdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiBBZGRGb3VySWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlIEljb25TZXQpOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQiLz4gdG8gdGhlIHJhbmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCBBZGRGaXZlSWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIEljb25TZXQpOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIi8+IHRvIHRoZSByYW5nZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cCBBZGREYXRhYmFyKENvbG9yIGNvbG9yKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjliY2QxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSw5OTkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsCQlDb25kaXRpb25hbCBGb3JtYXR0aW5nICAgICAgICAgICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29sbGVjdGlvbiBvZiA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSIvPi4KKyAgLy8vIFRoaXMgY2xhc3MgaXMgcHJvdmlkaW5nIHRoZSBBUEkgZm9yIEVQUGx1cyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+CisgIC8vLyA8cGFyYT4KKyAgLy8vIFRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIChBZGRbLi4uXUNvbmRpdGlvbmFsRm9ybWF0dGluZykgd2lsbCBjcmVhdGUgYSBDb25kaXRpb25hbEZvcm1hdHRpbmcvQ2ZSdWxlIGVudHJ5IGluIHRoZSB3b3Jrc2hlZXQuIFdoZW4gdGhpcworICAvLy8gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBoYXMgYmVlbiBjcmVhdGVkIGNoYW5nZXMgdG8gdGhlIHByb3BlcnRpZXMgd2lsbCBhZmZlY3QgdGhlIHdvcmtib29rIGltbWVkaWF0ZWx5LgorICAvLy8gPC9wYXJhPgorICAvLy8gPHBhcmE+CisgIC8vLyBFYWNoIHR5cGUgb2YgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIGhhcyBkaWZlcmVudGUgc2V0IG9mIHByb3BlcnRpZXMuCisgIC8vLyA8L3BhcmE+CisgIC8vLyA8Y29kZT4KKyAgLy8vIC8vIEFkZCBhIFRocmVlIENvbG9yIFNjYWxlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcKKyAgLy8vIHZhciBjZiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVGhyZWVDb2xvclNjYWxlKG5ldyBFeGNlbEFkZHJlc3MoIkExOkMxMCIpKTsKKyAgLy8vIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBwcm9wZXJ0aWVzCisgIC8vLyBjZi5Mb3dWYWx1ZS5UeXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluOworICAvLy8gY2YuTG93VmFsdWUuQ29sb3IgPSBDb2xvci5XaGl0ZTsKKyAgLy8vIGNmLk1pZGRsZVZhbHVlLlR5cGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50OworICAvLy8gY2YuTWlkZGxlVmFsdWUuVmFsdWUgPSA1MDsKKyAgLy8vIGNmLk1pZGRsZVZhbHVlLkNvbG9yID0gQ29sb3IuQmx1ZTsKKyAgLy8vIGNmLkhpZ2hWYWx1ZS5UeXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4OworICAvLy8gY2YuSGlnaFZhbHVlLkNvbG9yID0gQ29sb3IuQmxhY2s7CisgIC8vLyA8L2NvZGU+CisgIC8vLyA8L3JlbWFya3M+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24KKyAgICA6IFhtbEhlbHBlciwKKyAgICBJRW51bWVyYWJsZTxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPgorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcworICAgIHByaXZhdGUgTGlzdDxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPiBfcnVsZXMgPSBuZXcgTGlzdDxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPigpOworICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldCA9IG51bGw7CisgICAgI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xsZWN0aW9uIi8+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24oCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IGJhc2UoCisgICAgICAgIHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLAorICAgICAgICB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCkKKyAgICB7CisgICAgICBSZXF1aXJlLkFyZ3VtZW50KHdvcmtzaGVldCkuSXNOb3ROdWxsKCJ3b3Jrc2hlZXQiKTsKKworICAgICAgX3dvcmtzaGVldCA9IHdvcmtzaGVldDsKKyAgICAgIFNjaGVtYU5vZGVPcmRlciA9IF93b3Jrc2hlZXQuU2NoZW1hTm9kZU9yZGVyOworCisgICAgICAvLyBMb29rIGZvciBhbGwgdGhlIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+CisgICAgICB2YXIgY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZXMgPSBUb3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICAiLy8iICsgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLAorICAgICAgICBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgICAvLyBDaGVjayBpZiB3ZSBmb3VuZCBhdCBsZWFzdCAxIG5vZGUKKyAgICAgIGlmICgoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZXMgIT0gbnVsbCkKKyAgICAgICAgJiYgKGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzLkNvdW50ID4gMCkpCisgICAgICB7CisgICAgICAgIC8vIEZvcmVhY2ggPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4KKyAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlIGluIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzKQorICAgICAgICB7CisgICAgICAgICAgLy8gQ2hlY2sgaWYgQHNxcmVmIGF0dHJpYnV0ZSBleGlzdHMKKyAgICAgICAgICBpZiAoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuU3FyZWZdID09IG51bGwpCisgICAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdTcXJlZkF0dHJpYnV0ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gR2V0IHRoZSBAc3FyZWYgYXR0cmlidXRlCisgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKAorICAgICAgICAgICAgY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuU3FyZWZdLlZhbHVlKTsKKworICAgICAgICAgIC8vIENoZWNrIGZvciBhbGwgdGhlIDxjZlJ1bGVzPiBub2RlcyBhbmQgbG9hZCB0aGVtCisgICAgICAgICAgdmFyIGNmUnVsZU5vZGVzID0gY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZS5TZWxlY3ROb2RlcygKKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmUnVsZSwKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAvLyBGb3JlYWNoIDxjZlJ1bGU+IGluc2lkZSB0aGUgY3VycmVudCA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgorICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgY2ZSdWxlTm9kZSBpbiBjZlJ1bGVOb2RlcykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBAdHlwZSBhdHRyaWJ1dGUgZXhpc3RzCisgICAgICAgICAgICBpZiAoY2ZSdWxlTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuVHlwZV0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuTWlzc2luZ1R5cGVBdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayBpZiBAcHJpb3JpdHkgYXR0cmlidXRlIGV4aXN0cworICAgICAgICAgICAgaWYgKGNmUnVsZU5vZGUuQXR0cmlidXRlc1tFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLlByaW9yaXR5XSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5NaXNzaW5nUHJpb3JpdHlBdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBHZXQgdGhlIDxjZlJ1bGU+IG1haW4gYXR0cmlidXRlcworICAgICAgICAgICAgc3RyaW5nIHR5cGVBdHRyaWJ1dGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVTdHJpbmcoCisgICAgICAgICAgICAgIGNmUnVsZU5vZGUsCisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuVHlwZSk7CisKKyAgICAgICAgICAgIGludCBwcmlvcml0eSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLkdldEF0dHJpYnV0ZUludCgKKyAgICAgICAgICAgICAgY2ZSdWxlTm9kZSwKKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5Qcmlvcml0eSk7CisKKyAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgQHR5cGUgYXR0cmlidXRlIHRvIEVQUGx1cyBSdWxlIFR5cGUgKHNsaWdodHkgZGlmZXJlbnRlKQorICAgICAgICAgICAgdmFyIHR5cGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdldFR5cGVCeUF0dHJiaXV0ZSgKKyAgICAgICAgICAgICAgdHlwZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgY2ZSdWxlTm9kZSwKKyAgICAgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBSdWxlIGFjY29yZGluZyB0byB0aGUgY29ycmVjdCB0eXBlLCBhZGRyZXNzIGFuZCBwcmlvcml0eQorICAgICAgICAgICAgdmFyIGNmUnVsZSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZUZhY3RvcnkuQ3JlYXRlKAorICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgX3dvcmtzaGVldCwKKyAgICAgICAgICAgICAgY2ZSdWxlTm9kZSk7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IHJ1bGUgdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIGlmKGNmUnVsZSE9bnVsbCkKKyAgICAgICAgICAgICAgX3J1bGVzLkFkZChjZlJ1bGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIE1ldGhvZHMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCkKKyAgICB7CisgICAgICAvLyBGaW5kIHRoZSA8d29ya3NoZWV0PiBub2RlCisgICAgICBpZiAoX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50ID09IG51bGwpCisgICAgICB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdXb3Jrc2hlZXROb2RlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldFJvb3ROb2RlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHByaXZhdGUgWG1sTm9kZSBHZXRSb290Tm9kZSgpCisgICAgeworICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQ7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYWxpZGF0ZXMgYWRkcmVzcyAtIG5vdCBlbXB0eSAoY29sbGlzaW9ucyBhcmUgYWxsb3dkZWQpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwcml2YXRlIEV4Y2VsQWRkcmVzcyBWYWxpZGF0ZUFkZHJlc3MoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOworCisgICAgICAvL1RPRE86IEFyZSB0aGVyZSBhbnkgb3RoZXIgdmFsaWRhdGlvbiB3ZSBuZWVkIHRvIGRvPworICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBHZXQgdGhlIG5leHQgcHJpb3JpdHkgc2VxdWVuY2lhbCBudW1iZXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHJpdmF0ZSBpbnQgR2V0TmV4dFByaW9yaXR5KCkKKyAgICB7CisgICAgICAvLyBDb25zaWRlciB6ZXJvIGFzIHRoZSBsYXN0IHByaW9yaXR5IHdoZW4gd2UgaGF2ZSBubyBDRiBydWxlcworICAgICAgaW50IGxhc3RQcmlvcml0eSA9IDA7CisKKyAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhc3QgcHJpb3JpdHkKKyAgICAgIGZvcmVhY2ggKHZhciBjZlJ1bGUgaW4gX3J1bGVzKQorICAgICAgeworICAgICAgICBpZiAoY2ZSdWxlLlByaW9yaXR5ID4gbGFzdFByaW9yaXR5KQorICAgICAgICB7CisgICAgICAgICAgbGFzdFByaW9yaXR5ID0gY2ZSdWxlLlByaW9yaXR5OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE91ciBuZXh0IHByaW9yaXR5IGlzIHRoZSBsYXN0IHBsdXMgb25lCisgICAgICByZXR1cm4gbGFzdFByaW9yaXR5ICsgMTsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBNZXRob2RzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gSUVudW1lcmFibGU8SUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nPgorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTnVtYmVyIG9mIHZhbGlkYXRpb25zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50IENvdW50CisgICAgeworICAgICAgZ2V0IHsgcmV0dXJuIF9ydWxlcy5Db3VudDsgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW5kZXggb3BlcmF0b3IsIHJldHVybnMgYnkgMC1iYXNlZCBpbmRleAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIHRoaXNbaW50IGluZGV4XQorICAgIHsKKyAgICAgIGdldCB7IHJldHVybiBfcnVsZXNbaW5kZXhdOyB9CisgICAgICBzZXQgeyBfcnVsZXNbaW5kZXhdID0gdmFsdWU7IH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgJ2NmUnVsZScgZW51bWVyYXRvcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRW51bWVyYXRvcjxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPiBJRW51bWVyYWJsZTxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPi5HZXRFbnVtZXJhdG9yKCkKKyAgICB7CisgICAgICByZXR1cm4gX3J1bGVzLkdldEVudW1lcmF0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgJ2NmUnVsZScgZW51bWVyYXRvcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBJRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgeworICAgICAgcmV0dXJuIF9ydWxlcy5HZXRFbnVtZXJhdG9yKCk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZW1vdmVzIGFsbCAnY2ZSdWxlJyBmcm9tIHRoZSBjb2xsZWN0aW9uIGFuZCBmcm9tIHRoZSBYTUwuCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHJlbW92aW5nIGFsbCB0aGUgJ2NvbmRpdGlvbmFsRm9ybWF0dGluZycgbm9kZXMuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyB2b2lkIFJlbW92ZUFsbCgpCisgICAgeworICAgICAgLy8gTG9vayBmb3IgYWxsIHRoZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBub2RlcworICAgICAgdmFyIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygKKyAgICAgICAgIi8vIiArIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbmRpdGlvbmFsRm9ybWF0dGluZywKKyAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKKworICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gbm9kZXMgb25lIGJ5IG9uZQorICAgICAgZm9yZWFjaCAoWG1sTm9kZSBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlIGluIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzKQorICAgICAgeworICAgICAgICBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZSk7CisgICAgICB9CisKKyAgICAgIC8vIENsZWFyIHRoZSA8Y2ZSdWxlPiBpdGVtIGxpc3QKKyAgICAgIF9ydWxlcy5DbGVhcigpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVtb3ZlIGEgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIGJ5IGl0cyBvYmplY3QKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbSI+PC9wYXJhbT4KKyAgICBwdWJsaWMgdm9pZCBSZW1vdmUoCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIGl0ZW0pCisgICAgeworICAgICAgUmVxdWlyZS5Bcmd1bWVudChpdGVtKS5Jc05vdE51bGwoIml0ZW0iKTsKKworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIC8vIFBvaW50IHRvIHRoZSBwYXJlbnQgbm9kZQorICAgICAgICB2YXIgb2xkUGFyZW50Tm9kZSA9IGl0ZW0uTm9kZS5QYXJlbnROb2RlOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgPGNmUnVsZT4gZnJvbSB0aGUgb2xkIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+IHBhcmVudCBub2RlCisgICAgICAgIG9sZFBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoaXRlbS5Ob2RlKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgb2xkIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+IHBhcmVudCBub2RlIGhhcyA8Y2ZSdWxlPiBub2RlIGluc2lkZSBpdAorICAgICAgICBpZiAoIW9sZFBhcmVudE5vZGUuSGFzQ2hpbGROb2RlcykKKyAgICAgICAgeworICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIHBhcmVudCBub2RlCisgICAgICAgICAgb2xkUGFyZW50Tm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG9sZFBhcmVudE5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgX3J1bGVzLlJlbW92ZShpdGVtKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoCisgICAgICB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLkludmFsaWRSZW1vdmVSdWxlT3BlcmF0aW9uKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJlbW92ZSBhIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSBieSBpdHMgMC1iYXNlZCBpbmRleAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KKyAgICBwdWJsaWMgdm9pZCBSZW1vdmVBdCgKKyAgICAgIGludCBpbmRleCkKKyAgICB7CisgICAgICBSZXF1aXJlLkFyZ3VtZW50KGluZGV4KS5Jc0luUmFuZ2UoMCwgdGhpcy5Db3VudCAtIDEsICJpbmRleCIpOworCisgICAgICBSZW1vdmUodGhpc1tpbmRleF0pOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVtb3ZlIGEgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIGJ5IGl0cyBwcmlvcml0eQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICBwdWJsaWMgdm9pZCBSZW1vdmVCeVByaW9yaXR5KAorICAgICAgaW50IHByaW9yaXR5KQorICAgIHsKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICBSZW1vdmUoUnVsZXNCeVByaW9yaXR5KHByaW9yaXR5KSk7CisgICAgICB9CisgICAgICBjYXRjaAorICAgICAgeworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IGEgcnVsZSBieSBpdHMgcHJpb3JpdHkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSBSdWxlc0J5UHJpb3JpdHkoCisgICAgICBpbnQgcHJpb3JpdHkpCisgICAgeworICAgICAgcmV0dXJuIF9ydWxlcy5GaW5kKHggPT4geC5Qcmlvcml0eSA9PSBwcmlvcml0eSk7CisgICAgfQorICAgICNlbmRyZWdpb24gSUVudW1lcmFibGU8SUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nPgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBydWxlIChpbnRlcm5hbCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5GCisgICAgaW50ZXJuYWwgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSBBZGRSdWxlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7CisKKyAgICAgIGFkZHJlc3MgPSBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworCisgICAgICAvLyBDcmVhdGUgdGhlIFJ1bGUgYWNjb3JkaW5nIHRvIHRoZSBjb3JyZWN0IHR5cGUsIGFkZHJlc3MgYW5kIHByaW9yaXR5CisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIGNmUnVsZSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZUZhY3RvcnkuQ3JlYXRlKAorICAgICAgICB0eXBlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBHZXROZXh0UHJpb3JpdHkoKSwKKyAgICAgICAgX3dvcmtzaGVldCwKKyAgICAgICAgbnVsbCk7CisKKyAgICAgIC8vIEFkZCB0aGUgbmV3bHkgY3JlYXRlZCBydWxlIHRvIHRoZSBsaXN0CisgICAgICBfcnVsZXMuQWRkKGNmUnVsZSk7CisKKyAgICAgIC8vIFJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBydWxlCisgICAgICByZXR1cm4gY2ZSdWxlOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEFib3ZlQXZlcmFnZSBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlQXZlcmFnZSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlQXZlcmFnZSwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlT3JFcXVhbEF2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZU9yRXF1YWxBdmVyYWdlLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBCZWxvd0F2ZXJhZ2UgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd0F2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd0F2ZXJhZ2UsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEJlbG93T3JFcXVhbEF2ZXJhZ2UgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd09yRXF1YWxBdmVyYWdlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dPckVxdWFsQXZlcmFnZSwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQWJvdmVTdGREZXYgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEFib3ZlU3RkRGV2KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZVN0ZERldiwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQmVsb3dTdGREZXYgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEJlbG93U3RkRGV2KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd1N0ZERldiwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQm90dG9tIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRCb3R0b20oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbSwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQm90dG9tUGVyY2VudCBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tUGVyY2VudCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tUGVyY2VudCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVG9wIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3AoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVG9wUGVyY2VudCBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wUGVyY2VudCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9wUGVyY2VudCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgTGFzdDdEYXlzIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdDdEYXlzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdDdEYXlzLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBMYXN0TW9udGggUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRMYXN0TW9udGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0TW9udGgsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIExhc3RXZWVrIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdFdlZWsoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0V2VlaywKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgTmV4dE1vbnRoIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTmV4dE1vbnRoKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dE1vbnRoLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBOZXh0V2VlayBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRXZWVrKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWssCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFRoaXNNb250aCBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRoaXNNb250aCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVGhpc1dlZWsgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzV2VlaygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNXZWVrLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBUb2RheSBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvZGF5KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9kYXksCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFRvbW9ycm93IFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9tb3Jyb3coCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdywKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgWWVzdGVyZGF5IFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkWWVzdGVyZGF5KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5LAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBCZWdpbnNXaXRoIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoIEFkZEJlZ2luc1dpdGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVnaW5zV2l0aCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQmV0d2VlbiBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbiBBZGRCZXR3ZWVuKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW4sCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIENvbnRhaW5zQmxhbmtzIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcyBBZGRDb250YWluc0JsYW5rcygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3MsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIENvbnRhaW5zRXJyb3JzIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycyBBZGRDb250YWluc0Vycm9ycygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnMsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIENvbnRhaW5zVGV4dCBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0IEFkZENvbnRhaW5zVGV4dCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgRHVwbGljYXRlVmFsdWVzIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMgQWRkRHVwbGljYXRlVmFsdWVzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBFbmRzV2l0aCBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGggQWRkRW5kc1dpdGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBFcXVhbCBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwgQWRkRXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVxdWFsLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBFeHByZXNzaW9uIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uIEFkZEV4cHJlc3Npb24oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24pQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXhwcmVzc2lvbiwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgR3JlYXRlclRoYW4gUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuIEFkZEdyZWF0ZXJUaGFuKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbilBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbiwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgR3JlYXRlclRoYW5PckVxdWFsIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwgQWRkR3JlYXRlclRoYW5PckVxdWFsKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW5PckVxdWFsLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBMZXNzVGhhbiBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4gQWRkTGVzc1RoYW4oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBMZXNzVGhhbk9yRXF1YWwgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCBBZGRMZXNzVGhhbk9yRXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWwsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIE5vdEJldHdlZW4gUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4gQWRkTm90QmV0d2VlbigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbilBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBOb3RDb250YWluc0JsYW5rcyBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MgQWRkTm90Q29udGFpbnNCbGFua3MoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zQmxhbmtzLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBOb3RDb250YWluc0Vycm9ycyBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMgQWRkTm90Q29udGFpbnNFcnJvcnMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zRXJyb3JzLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBOb3RDb250YWluc1RleHQgUnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCBBZGROb3RDb250YWluc1RleHQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc1RleHQsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIE5vdEVxdWFsIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCBBZGROb3RFcXVhbCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90RXF1YWwsCisgICAgICAgIGFkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFVuaXF1ZSBSdWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzIEFkZFVuaXF1ZVZhbHVlcygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlcywKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVGhyZWVDb2xvclNjYWxlIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUgQWRkVGhyZWVDb2xvclNjYWxlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlLAorICAgICAgICBhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBUd29Db2xvclNjYWxlIFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlIEFkZFR3b0NvbG9yU2NhbGUoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUpQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZSwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVGhyZWVJY29uU2V0IFJ1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iSWNvblNldCI+VHlwZSBvZiBpY29uc2V0PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZT4gQWRkVGhyZWVJY29uU2V0KEV4Y2VsQWRkcmVzcyBBZGRyZXNzLCBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlIEljb25TZXQpCisgICAgeworICAgICAgICB2YXIgaWNvbiA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZT4pQWRkUnVsZSgKKyAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCwKKyAgICAgICAgICAgIEFkZHJlc3MpOworICAgICAgICBpY29uLkljb25TZXQgPSBJY29uU2V0OworICAgICAgICByZXR1cm4gaWNvbjsKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgRm91ckljb25TZXQgcnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJBZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iSWNvblNldCI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiBBZGRGb3VySWNvblNldChFeGNlbEFkZHJlc3MgQWRkcmVzcywgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZSBJY29uU2V0KQorICAgIHsKKyAgICAgICAgdmFyIGljb24gPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4pQWRkUnVsZSgKKyAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0LAorICAgICAgICAgICAgQWRkcmVzcyk7CisgICAgICAgIGljb24uSWNvblNldCA9IEljb25TZXQ7CisgICAgICAgIHJldHVybiBpY29uOworICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBGaXZlSWNvblNldCBydWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJJY29uU2V0Ij48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0IEFkZEZpdmVJY29uU2V0KEV4Y2VsQWRkcmVzcyBBZGRyZXNzLCBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIEljb25TZXQpCisgICAgeworICAgICAgICB2YXIgaWNvbiA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldClBZGRSdWxlKAorICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQsCisgICAgICAgICAgICBBZGRyZXNzKTsKKyAgICAgICAgaWNvbi5JY29uU2V0ID0gSWNvblNldDsKKyAgICAgICAgcmV0dXJuIGljb247CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIGRhdGFiYXIgcnVsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJBZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIEFkZERhdGFiYXIoRXhjZWxBZGRyZXNzIEFkZHJlc3MsIENvbG9yIGNvbG9yKQorICAgIHsKKyAgICAgICAgdmFyIGRhdGFCYXIgPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwKUFkZFJ1bGUoCisgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyLAorICAgICAgICAgICAgQWRkcmVzcyk7CisgICAgICAgIGRhdGFCYXIuQ29sb3I9Y29sb3I7CisgICAgICAgIHJldHVybiBkYXRhQmFyOworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZXMKKworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxY2RhZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUuY3MKQEAgLTAsMCArMSw1MTEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKwkvLy8gPHN1bW1hcnk+CisJLy8vIDE4LjMuMS4xMSBjZnZvIChDb25kaXRpb25hbCBGb3JtYXQgVmFsdWUgT2JqZWN0KQorCS8vLyBEZXNjcmliZXMgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJwb2xhdGlvbiBwb2ludHMgaW4gYSBncmFkaWVudCBzY2FsZS4KKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZQorCQk6IFhtbEhlbHBlcgorCXsKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKwkJcHJpdmF0ZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIF9wb3NpdGlvbjsKKwkJcHJpdmF0ZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBfcnVsZVR5cGU7CisJCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKwkJI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icG9zaXRpb24iPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+VGhlIGNmdm8gKMKnMTguMy4xLjExKSBub2RlIHBhcmVudC4gQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAgIC8vLyBjb2xvclNjYWxlICjCpzE4LjMuMS4xNik7IGRhdGFCYXIgKMKnMTguMy4xLjI4KTsgaWNvblNldCAowqcxOC4zLjEuNDkpPC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisJCWludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlKAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbiBwb3NpdGlvbiwKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB0eXBlLAorCQkJQ29sb3IgY29sb3IsCisJCQlkb3VibGUgdmFsdWUsCisJCQlzdHJpbmcgZm9ybXVsYSwKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisJCQlFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisJCQlYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKwkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKwkJCTogYmFzZSgKKwkJCQluYW1lc3BhY2VNYW5hZ2VyLAorCQkJCWl0ZW1FbGVtZW50Tm9kZSkKKwkJeworCQkJUmVxdWlyZS5Bcmd1bWVudChwcmlvcml0eSkuSXNJblJhbmdlKDEsIGludC5NYXhWYWx1ZSwgInByaW9yaXR5Iik7CisJCQlSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOworCQkJUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisKKwkJCS8vIFNhdmUgdGhlIHdvcmtzaGVldCBmb3IgcHJpdmF0ZSBtZXRob2RzIHRvIHVzZQorCQkJX3dvcmtzaGVldCA9IHdvcmtzaGVldDsKKworCQkJLy8gU2NoZW1hIG9yZGVyIGxpc3QKKwkJCVNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXQorCQkJeworICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Ob2Rlcy5DZnZvLAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Ob2Rlcy5Db2xvcgorCQkJfTsKKworCQkJLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCBkb2VzIG5vdCBleGlzdHMKKwkJCWlmIChpdGVtRWxlbWVudE5vZGUgPT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBHZXQgdGhlIHBhcmVudCBub2RlIHBhdGggYnkgdGhlIHJ1bGUgdHlwZQorCQkJCXN0cmluZyBwYXJlbnROb2RlUGF0aCA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldFBhcmVudFBhdGhCeVJ1bGVUeXBlKAorCQkJCQlydWxlVHlwZSk7CisKKwkJCQkvLyBDaGVjayBmb3IgZW4gZXJyb3IgKHJ1bGUgdHlwZSBkb2VzIG5vdCBoYXZlIDxjZnZvPikKKwkJCQlpZiAocGFyZW50Tm9kZVBhdGggPT0gc3RyaW5nLkVtcHR5KQorCQkJCXsKKwkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigKKwkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5NaXNzaW5nQ2Z2b1BhcmVudE5vZGUpOworCQkJCX0KKworCQkJCS8vIFBvaW50IHRvIHRoZSA8Y2Z2bz4gcGFyZW50IG5vZGUKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlID0gX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgKKwkJCQkJc3RyaW5nLkZvcm1hdCgKKwkJCQkJCSIvL3swfVt7MX09J3syfSddL3szfVt7NH09J3s1fSddL3s2fSIsCisJCQkJCS8vIHswfQorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLAorCQkJCQkvLyB7MX0KKwkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlNxcmVmQXR0cmlidXRlLAorCQkJCQkvLyB7Mn0KKwkJCQkJCWFkZHJlc3MuQWRkcmVzcywKKwkJCQkJLy8gezN9CisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZlJ1bGUsCisJCQkJCS8vIHs0fQorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUHJpb3JpdHlBdHRyaWJ1dGUsCisJCQkJCS8vIHs1fQorCQkJCQkJcHJpb3JpdHksCisJCQkJCS8vIHs2fQorCQkJCQkJcGFyZW50Tm9kZVBhdGgpLAorCQkJCQlfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworCisJCQkJLy8gQ2hlY2sgZm9yIGVuIGVycm9yIChydWxlIHR5cGUgZG9lcyBub3QgaGF2ZSA8Y2Z2bz4pCisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGUgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuTWlzc2luZ0Nmdm9QYXJlbnROb2RlKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFBvaW50IHRvIHRoZSA8Y2Z2bz4gcGFyZW50IG5vZGUgKDxjb2xvclNjYWxlPiwgPGRhdGFCYXI+IG9yIDxpY29uU2V0PikKKyAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gbm9ybWFsLCBhcyBUb3BOb2RlIGRvZXMgbm90IHBvaW50IHRvIHRoZSBub2RlIGl0c2VsZiBidXQgdG8KKyAgICAgIC8vIGl0cyBQQVJFTlQuIExhdGVyLCBpbiB0aGUgQ3JlYXRlTm9kZUJ5T3JkZW0gbWV0aG9kIHRoZSBUb3BOb2RlIHdpbGwgYmUgdXBkYXRlZC4KKyAgICAgIFRvcE5vZGUgPSBpdGVtRWxlbWVudE5vZGU7CisKKwkJCS8vIFNhdmUgdGhlIGF0dHJpYnV0ZXMKKwkJCVBvc2l0aW9uID0gcG9zaXRpb247CisJCQlSdWxlVHlwZSA9IHJ1bGVUeXBlOworCQkJVHlwZSA9IHR5cGU7CisJCQlDb2xvciA9IGNvbG9yOworCQkJVmFsdWUgPSB2YWx1ZTsKKwkJCUZvcm11bGEgPSBmb3JtdWxhOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSIvPgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorCQlpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSgKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24gcG9zaXRpb24sCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKKwkJCUNvbG9yIGNvbG9yLAorCQkJZG91YmxlIHZhbHVlLAorCQkJc3RyaW5nIGZvcm11bGEsCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorCQkJRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorCQkJWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorCQkJOiB0aGlzKAorCQkJCXBvc2l0aW9uLAorCQkJCXR5cGUsCisJCQkJY29sb3IsCisJCQkJdmFsdWUsCisJCQkJZm9ybXVsYSwKKwkJCQlydWxlVHlwZSwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisJCQkJd29ya3NoZWV0LAorCQkJCW51bGwsCisJCQkJbmFtZXNwYWNlTWFuYWdlcikKKwkJeworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSIvPgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKwkJaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIHBvc2l0aW9uLAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUsCisJCQlDb2xvciBjb2xvciwKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisJCQlFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisJCQlYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisJCQk6IHRoaXMoCisJCQkJcG9zaXRpb24sCisJCQkJdHlwZSwKKwkJCQljb2xvciwKKwkJCQkwLAorCQkJCW51bGwsCisJCQkJcnVsZVR5cGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorCQkJCXdvcmtzaGVldCwKKwkJCQludWxsLAorCQkJCW5hbWVzcGFjZU1hbmFnZXIpCisJCXsKKwkJfQorCQkjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCSNyZWdpb24gTWV0aG9kcworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXQgdGhlIG5vZGUgb3JkZXIgKDEsIDIgb3UgMykgYWNjb3JkaW5nIHRvIHRoZSBQb3NpdGlvbiAoTG93LCBNaWRkbGUgYW5kIEhpZ2gpCisJCS8vLyBhbmQgdGhlIFJ1bGUgVHlwZSAoVHdvQ29sb3JTY2FsZSBvdSBUaHJlZUNvbG9yU2NhbGUpLgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwcml2YXRlIGludCBHZXROb2RlT3JkZXIoKQorCQl7CisJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0T3JkZXJCeVBvc2l0aW9uKAorCQkJCVBvc2l0aW9uLAorCQkJCVJ1bGVUeXBlKTsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIENyZWF0ZSB0aGUgJ2Nmdm8nLydjb2xvcicgbm9kZXMgaW4gdGhlIHJpZ2h0IG9yZGVyLiBUaGV5IHNob3VsZCBhcHBlYXIgbGlrZSB0aGlzOgorCQkvLy8JCSJjZnZvIiAgIC0tPiBMb3cgVmFsdWUgKHZhbHVlIG9iamVjdCkKKwkJLy8vCQkiY2Z2byIgICAtLT4gTWlkZGxlIFZhbHVlICh2YWx1ZSBvYmplY3QpCisJCS8vLwkJImNmdm8iICAgLS0+IEhpZ2ggVmFsdWUgKHZhbHVlIG9iamVjdCkKKwkJLy8vCQkiY29sb3IiICAtLT4gTG93IFZhbHVlIChjb2xvcikKKwkJLy8vCQkiY29sb3IiICAtLT4gTWlkZGxlIFZhbHVlIChjb2xvcikKKwkJLy8vCQkiY29sb3IiICAtLT4gSGlnaCBWYWx1ZSAoY29sb3IpCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ibm9kZVR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlUGF0aCI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGVWYWx1ZSI+PC9wYXJhbT4KKwkJcHJpdmF0ZSB2b2lkIENyZWF0ZU5vZGVCeU9yZGVtKAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZSBub2RlVHlwZSwKKwkJCXN0cmluZyBhdHRyaWJ1dGVQYXRoLAorCQkJc3RyaW5nIGF0dHJpYnV0ZVZhbHVlKQorCQl7CisgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IFRvcE5vZGUKKyAgICAgIFhtbE5vZGUgY3VycmVudFRvcE5vZGUgPSBUb3BOb2RlOworCisgICAgICBzdHJpbmcgbm9kZVBhdGggPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXROb2RlUGF0aEJ5Tm9kZVR5cGUobm9kZVR5cGUpOworCQkJaW50IG5vZGVPcmRlciA9IEdldE5vZGVPcmRlcigpOworCQkJZU5vZGVJbnNlcnRPcmRlciBub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLlNjaGVtYU9yZGVyOworCQkJWG1sTm9kZSByZWZlcmVuY2VOb2RlID0gbnVsbDsKKworCQkJaWYgKG5vZGVPcmRlciA+IDEpCisJCQl7CisJCQkJLy8gRmluZCB0aGUgbm9kZSBqdXN0IGJlZm9yZSB0aGUgb25lIHdlIG5lZWQgdG8gaW5jbHVkZQorCQkJCXJlZmVyZW5jZU5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisJCQkJCXN0cmluZy5Gb3JtYXQoCisJCQkJCQkiezB9W3Bvc2l0aW9uKCk9ezF9XSIsCisJCQkJCS8vIHswfQorCQkJCQkJbm9kZVBhdGgsCisJCQkJCS8vIHsxfQorCQkJCQkJbm9kZU9yZGVyIC0gMSksCisJCQkJCV93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisKKwkJCQkvLyBPbmx5IGlmIHRoZSBwcmVwZW5kIG5vZGUgZXhpc3RzIHRoYW4gaW5zZXJ0IGFmdGVyCisJCQkJaWYgKHJlZmVyZW5jZU5vZGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCW5vZGVJbnNlcnRPcmRlciA9IGVOb2RlSW5zZXJ0T3JkZXIuQWZ0ZXI7CisJCQkJfQorCQkJfQorCisJCQkvLyBDcmVhdGUgdGhlIG5vZGUgaW4gdGhlIHJpZ2h0IG9yZGVyCisJCQl2YXIgbm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorCQkJCVRvcE5vZGUsCisJCQkJc3RyaW5nLkZvcm1hdCgKKwkJCQkJInswfVtwb3NpdGlvbigpPXsxfV0iLAorCQkJCS8vIHswfQorCQkJCQlub2RlUGF0aCwKKwkJCQkvLyB7MX0KKwkJCQkJbm9kZU9yZGVyKSwKKwkJCQlub2RlSW5zZXJ0T3JkZXIsCisJCQkJcmVmZXJlbmNlTm9kZSk7CisKKyAgICAgIC8vIFBvaW50IHRvIHRoZSBuZXcgbm9kZSBhcyB0aGUgdGVtcG9yYXJ5IFRvcE5vZGUgKHdlIG5lZWQgaXQgZm9yIHRoZSBYbWxIZWxwZXIgZnVuY3Rpb25zKQorICAgICAgVG9wTm9kZSA9IG5vZGU7CisKKyAgICAgIC8vIEFkZC9SZW1vdmUgdGhlIGF0dHJpYnV0ZSAoaWYgdGhlIGF0dHJpYnV0ZVZhbHVlIGlzIGVtcHR5IHRoZW4gaXQgd2lsbCBiZSByZW1vdmVkKQorICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgbm9kZSwKKyAgICAgICAgYXR0cmlidXRlUGF0aCwKKyAgICAgICAgYXR0cmlidXRlVmFsdWUsCisgICAgICAgIHRydWUpOworCisgICAgICAvLyBQb2ludCBiYWNrIHRvIHRoZSA8Y2Z2bz4vPGNvbG9yPiBwYXJlbnQgbm9kZQorICAgICAgVG9wTm9kZSA9IGN1cnJlbnRUb3BOb2RlOworCQl9CisJCSNlbmRyZWdpb24gTWV0aG9zCisKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJI3JlZ2lvbiBFeHBvc2VkIFByb3BlcnRpZXMKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24gUG9zaXRpb24KKwkJeworCQkJZ2V0IHsgcmV0dXJuIF9wb3NpdGlvbjsgfQorCQkJc2V0IHsgX3Bvc2l0aW9uID0gdmFsdWU7IH0KKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIAorCQkvLy8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBSdWxlVHlwZQorCQl7CisJCQlnZXQgeyByZXR1cm4gX3J1bGVUeXBlOyB9CisJCQlzZXQgeyBfcnVsZVR5cGUgPSB2YWx1ZTsgfQorCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgVHlwZQorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQl2YXIgdHlwZUF0dHJpYnV0ZSA9IEdldFhtbE5vZGVTdHJpbmcoCisJCQkJCXN0cmluZy5Gb3JtYXQoCisJCQkJCQkiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn0iLAorCQkJCQkvLyB7MH0KKwkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sCisJCQkJCS8vIHsxfQorCQkJCQkJR2V0Tm9kZU9yZGVyKCksCisJCQkJCS8vIHsyfQorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVHlwZUF0dHJpYnV0ZSkpOworCisJCQkJcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldFR5cGVCeUF0dHJiaXV0ZSh0eXBlQXR0cmlidXRlKTsKKwkJCX0KKwkJCXNldAorCQkJeworCQkJCUNyZWF0ZU5vZGVCeU9yZGVtKAorCQkJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlLkNmdm8sCisJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlR5cGVBdHRyaWJ1dGUsCisJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldEF0dHJpYnV0ZUJ5VHlwZSh2YWx1ZSkpOworCisJCQkJYm9vbCByZW1vdmVWYWxBdHRyaWJ1dGUgPSBmYWxzZTsKKworCQkJCS8vIE1ha2Ugc3VyZSB1bm5lY2Vzc2FyeSBhdHRyaWJ1dGVzIGFyZSByZW1vdmVkIChvY2N1cmVzIHdoZW4gd2UgY2hhbmdlCisJCQkJLy8gdGhlIHZhbHVlIG9iamVjdCB0eXBlKQorCQkJCXN3aXRjaCAoVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1pbjoKKwkJCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4OgorCQkJCQkJcmVtb3ZlVmFsQXR0cmlidXRlID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBAdmFsIGF0dHJpYnV0ZQorCQkJCWlmIChyZW1vdmVWYWxBdHRyaWJ1dGUpCisJCQkJeworCQkJCSAgc3RyaW5nIG5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0Tm9kZVBhdGhCeU5vZGVUeXBlKAorCQkJCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5DZnZvKTsKKwkJCQkgIGludCBub2RlT3JkZXIgPSBHZXROb2RlT3JkZXIoKTsKKworCQkJCQkvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSAocmVtb3ZlZCB3aGVuIHRoZSB2YWx1ZSA9ICcnKQorCQkJCSAgQ3JlYXRlQ29tcGxleE5vZGUoCisJCQkJICAgIFRvcE5vZGUsCisJCQkJICAgIHN0cmluZy5Gb3JtYXQoCisJCQkJICAgICAgInswfVtwb3NpdGlvbigpPXsxfV0vezJ9PScnIiwKKwkJCQkgICAgLy8gezB9CisJCQkJICAgICAgbm9kZVBhdGgsCisJCQkJICAgIC8vIHsxfQorCQkJCSAgICAgIG5vZGVPcmRlciwKKwkJCQkgICAgLy8gezJ9CisJCQkJICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBDb2xvciBDb2xvcgorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQkvLyBDb2xvciBDb2RlIGxpa2UgIkZGNUIzNEYyIgorCQkJCXZhciBjb2xvckNvZGUgPSBHZXRYbWxOb2RlU3RyaW5nKAorCQkJCQlzdHJpbmcuRm9ybWF0KAorCQkJCQkJInswfVtwb3NpdGlvbigpPXsxfV0vezJ9IiwKKwkJCQkJLy8gezB9CisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvciwKKwkJCQkJLy8gezF9CisJCQkJCQlHZXROb2RlT3JkZXIoKSwKKwkJCQkJLy8gezJ9CisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5SZ2JBdHRyaWJ1dGUpKTsKKworCQkJCXJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5Db252ZXJ0RnJvbUNvbG9yQ29kZShjb2xvckNvZGUpOworCQkJfQorCQkJc2V0CisJCQl7CisJCQkJLy8gVXNlIHRoZSBjb2xvciBjb2RlIHRvIHN0b3JlIChFeC4gIkZGNUIzNUYyIikKKwkJCQlDcmVhdGVOb2RlQnlPcmRlbSgKKwkJCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5Db2xvciwKKwkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUmdiQXR0cmlidXRlLAorCQkJCQl2YWx1ZS5Ub0FyZ2IoKS5Ub1N0cmluZygieCIpKTsKKwkJCX0KKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEdldC9TZXQgdGhlICdjZnZvJyBub2RlIEB2YWwgYXR0cmlidXRlCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBEb3VibGUgVmFsdWUKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJcmV0dXJuIEdldFhtbE5vZGVEb3VibGUoCisJCQkJCXN0cmluZy5Gb3JtYXQoCisJCQkJCQkiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn0iLAorCQkJCQkvLyB7MH0KKwkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sCisJCQkJCS8vIHsxfQorCQkJCQkJR2V0Tm9kZU9yZGVyKCksCisJCQkJCS8vIHsyfQorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlKSk7CisJCQl9CisJCQlzZXQKKwkJCXsKKwkJCQlzdHJpbmcgdmFsdWVUb1N0b3JlID0gc3RyaW5nLkVtcHR5OworCisJCQkJLy8gT25seSBzb21lIHR5cGVzIHVzZSB0aGUgQHZhbCBhdHRyaWJ1dGUKKwkJCQlpZiAoKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bSkKKwkJCQkJfHwgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQpCisJCQkJCXx8IChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50aWxlKSkKKwkJCQl7CisJCQkJCXZhbHVlVG9TdG9yZSA9IHZhbHVlLlRvU3RyaW5nKCk7CisJCQkJfQorCisJCQkJQ3JlYXRlTm9kZUJ5T3JkZW0oCisJCQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUuQ2Z2bywKKwkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlLAorCQkJCQl2YWx1ZVRvU3RvcmUpOworCQkJfQorCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0L1NldCB0aGUgRm9ybXVsYSBvZiB0aGUgT2JqZWN0IFZhbHVlICh1c2VzIHRoZSBzYW1lIGF0dHJpYnV0ZSBhcyB0aGUgVmFsdWUpCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBzdHJpbmcgRm9ybXVsYQorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQkvLyBSZXR1cm4gZW1wdHkgaWYgdGhlIE9iamVjdCBWYWx1ZSB0eXBlIGlzIG5vdCBGb3JtdWxhCisJCQkJaWYgKFR5cGUgIT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGEpCisJCQkJeworCQkJCQlyZXR1cm4gc3RyaW5nLkVtcHR5OworCQkJCX0KKworCQkJCS8vIEV4Y2VsIHN0b3JlcyB0aGUgZm9ybXVsYSBpbiB0aGUgQHZhbCBhdHRyaWJ1dGUKKwkJCQlyZXR1cm4gR2V0WG1sTm9kZVN0cmluZygKKwkJCQkJc3RyaW5nLkZvcm1hdCgKKwkJCQkJCSJ7MH1bcG9zaXRpb24oKT17MX1dL3syfSIsCisJCQkJCS8vIHswfQorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bywKKwkJCQkJLy8gezF9CisJCQkJCQlHZXROb2RlT3JkZXIoKSwKKwkJCQkJLy8gezJ9CisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUpKTsKKwkJCX0KKwkJCXNldAorCQkJeworCQkJCS8vIE9ubHkgc3RvcmUgdGhlIGZvcm11bGEgaWYgdGhlIE9iamVjdCBWYWx1ZSB0eXBlIGlzIEZvcm11bGEKKwkJCQlpZiAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYSkKKwkJCQl7CisJCQkJCUNyZWF0ZU5vZGVCeU9yZGVtKAorCQkJCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5DZnZvLAorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlLAorCQkJCQkJKHZhbHVlID09IG51bGwpID8gc3RyaW5nLkVtcHR5IDogdmFsdWUuVG9TdHJpbmcoKSk7CisJCQkJfQorCQkJfQorCQl9CisJCSNlbmRyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCisKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODkxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLmNzCkBAIC0wLDAgKzEsMjgzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBjb25zdGFudHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzCisgIHsKKyAgICAjcmVnaW9uIEVycm9ycworICAgIGludGVybmFsIGNsYXNzIEVycm9ycworICAgIHsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDb21tYVNlcGFyYXRlZEFkZHJlc3NlcyA9IEAiTXVsdGlwbGUgYWRkcmVzc2VzIG1heSBub3QgYmUgY29tbWFzZXBhcmF0ZWQsIHVzZSBzcGFjZSBpbnN0ZWFkIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJbnZhbGlkQ2ZydWxlT2JqZWN0ID0gQCJUaGUgc3VwcGxpZWQgaXRlbSBtdXN0IGluaGVyaXQgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJbnZhbGlkQ29uZGl0aW9uYWxGb3JtYXR0aW5nT2JqZWN0ID0gQCJUaGUgc3VwcGxpZWQgaXRlbSBtdXN0IGluaGVyaXQgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmciOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEludmFsaWRQcmlvcml0eSA9IEAiSW52YWxpZCBwcmlvcml0eSBudW1iZXIuIE11c3QgYmUgYmlnZ2VyIHRoYW4gemVybyI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSW52YWxpZFJlbW92ZVJ1bGVPcGVyYXRpb24gPSBAIkludmFsaWQgcmVtb3ZlIHJ1bGUgb3BlcmF0aW9uIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNaXNzaW5nQ2Z2b05vZGUgPSBAIk1pc3NpbmcgJ2Nmdm8nIG5vZGUgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTWlzc2luZ0Nmdm9QYXJlbnROb2RlID0gQCJNaXNzaW5nICdjZnZvJyBwYXJlbnQgbm9kZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNaXNzaW5nQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZSA9IEAiTWlzc2luZyAnY29uZGl0aW9uYWxGb3JtYXR0aW5nJyBub2RlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdJdGVtUnVsZUxpc3QgPSBAIk1pc3NpbmcgaXRlbSB3aXRoIGFkZHJlc3MgJ3swfScgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIExpc3QiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdQcmlvcml0eUF0dHJpYnV0ZSA9IEAiTWlzc2luZyAncHJpb3JpdHknIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdSdWxlVHlwZSA9IEAiTWlzc2luZyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBUeXBlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdTcXJlZkF0dHJpYnV0ZSA9IEAiTWlzc2luZyAnc3FyZWYnIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNaXNzaW5nVHlwZUF0dHJpYnV0ZSA9IEAiTWlzc2luZyAndHlwZScgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTWlzc2luZ1dvcmtzaGVldE5vZGUgPSBAIk1pc3NpbmcgJ3dvcmtzaGVldCcgbm9kZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTm9uU3VwcG9ydGVkUnVsZVR5cGUgPSBAIk5vbiBzdXBwb3J0ZWQgY29uZGl0aW9uYWxGb3JtYXR0aW5nVHlwZTogezB9IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBVbmV4aXN0ZW50Q2Z2b1R5cGVBdHRyaWJ1dGUgPSBAIlVuZXhpc3RlbnQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBVbmV4aXN0ZW50T3BlcmF0b3JUeXBlQXR0cmlidXRlID0gQCJVbmV4aXN0ZW50IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZSBhdHRyaWJ1dGUgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVW5leGlzdGVudFRpbWVQZXJpb2RUeXBlQXR0cmlidXRlID0gQCJVbmV4aXN0ZW50IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBVbmV4cGVjdGVkUnVsZVR5cGVBdHRyaWJ1dGUgPSBAIlVuZXhwZWN0ZWQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVW5leHBlY3RlZFJ1bGVUeXBlTmFtZSA9IEAiVW5leHBlY3RlZCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBUeXBlTmFtZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFdyb25nTnVtYmVyQ2Z2b0NvbG9yTm9kZXMgPSBAIldyb25nIG51bWJlciBvZiAnY2Z2bycvJ2NvbG9yJyBub2RlcyBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUiOworICAgIH0KKyAgICAjZW5kcmVnaW9uIEVycm9ycworCisgICAgI3JlZ2lvbiBOb2RlcworICAgIGludGVybmFsIGNsYXNzIE5vZGVzCisgICAgeworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFdvcmtzaGVldCA9ICJ3b3Jrc2hlZXQiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbmRpdGlvbmFsRm9ybWF0dGluZyA9ICJjb25kaXRpb25hbEZvcm1hdHRpbmciOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENmUnVsZSA9ICJjZlJ1bGUiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbG9yU2NhbGUgPSAiY29sb3JTY2FsZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2Z2byA9ICJjZnZvIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDb2xvciA9ICJjb2xvciI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRGF0YUJhciA9ICJkYXRhQmFyIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJY29uU2V0ID0gImljb25TZXQiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEZvcm11bGEgPSAiZm9ybXVsYSI7CisgICAgfQorICAgICNlbmRyZWdpb24gTm9kZXMKKworICAgICNyZWdpb24gQXR0cmlidXRlcworICAgIGludGVybmFsIGNsYXNzIEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQWJvdmVBdmVyYWdlID0gImFib3ZlQXZlcmFnZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQm90dG9tID0gImJvdHRvbSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRHhmSWQgPSAiZHhmSWQiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVxdWFsQXZlcmFnZSA9ICJlcXVhbEF2ZXJhZ2UiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXQgPSAiaWNvblNldCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgT3BlcmF0b3IgPSAib3BlcmF0b3IiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFBlcmNlbnQgPSAicGVyY2VudCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUHJpb3JpdHkgPSAicHJpb3JpdHkiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFJhbmsgPSAicmFuayI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUmV2ZXJzZSA9ICJyZXZlcnNlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBSZ2IgPSAicmdiIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBTaG93VmFsdWUgPSAic2hvd1ZhbHVlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBTcXJlZiA9ICJzcXJlZiI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgU3RkRGV2ID0gInN0ZERldiI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgU3RvcElmVHJ1ZSA9ICJzdG9wSWZUcnVlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUZXh0ID0gInRleHQiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRoZW1lID0gInRoZW1lIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaW1lUGVyaW9kID0gInRpbWVQZXJpb2QiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRpbnQgPSAidGludCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVHlwZSA9ICJ0eXBlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBWYWwgPSAidmFsIjsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBBdHRyaWJ1dGVzCisKKyAgICAjcmVnaW9uIFhNTCBQYXRocworICAgIGludGVybmFsIGNsYXNzIFBhdGhzCisgICAgeworICAgICAgLy8gTWFpbiBub2RlIGFuZCBhdHRyaWJ1dGVzCisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgV29ya3NoZWV0ID0gImQ6IiArIE5vZGVzLldvcmtzaGVldDsKKworICAgICAgLy8gPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gwqcxOC4zLjEuMTggbm9kZQorICAgICAgLy8gY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhIHdvcmtzaGVldAorICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbmRpdGlvbmFsRm9ybWF0dGluZyA9ICJkOiIgKyBOb2Rlcy5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKyAgICAgIC8vIDxjZlJ1bGU+IMKnMTguMy4xLjEwIG5vZGUKKyAgICAgIC8vIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgorICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENmUnVsZSA9ICJkOiIgKyBOb2Rlcy5DZlJ1bGU7CisKKyAgICAgIC8vIDxjb2xvclNjYWxlPiDCpzE4LjMuMS4xNiBub2RlCisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29sb3JTY2FsZSA9ICJkOiIgKyBOb2Rlcy5Db2xvclNjYWxlOworCisgICAgICAvLyA8Y2Z2bz4gwqcxOC4zLjEuMTEgbm9kZQorICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENmdm8gPSAiZDoiICsgTm9kZXMuQ2Z2bzsKKworICAgICAgLy8gPGNvbG9yPiDCpzE4LjMuMS4xNSBub2RlCisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29sb3IgPSAiZDoiICsgTm9kZXMuQ29sb3I7CisKKyAgICAgIC8vIDxkYXRhQmFyPiDCpzE4LjMuMS4yOCBub2RlCisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRGF0YUJhciA9ICJkOiIgKyBOb2Rlcy5EYXRhQmFyOworCisgICAgICAvLyA8aWNvblNldD4gwqcxOC4zLjEuNDkgbm9kZQorICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXQgPSAiZDoiICsgTm9kZXMuSWNvblNldDsKKworICAgICAgLy8gPGZvcm11bGE+IMKnMTguMy4xLjQzIG5vZGUKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBGb3JtdWxhID0gImQ6IiArIE5vZGVzLkZvcm11bGE7CisKKyAgICAgIC8vIEF0dHJpYnV0ZXMgKGZvciBhbGwgdGhlIG5vZGVzKQorICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEFib3ZlQXZlcmFnZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuQWJvdmVBdmVyYWdlOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEJvdHRvbUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuQm90dG9tOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIER4ZklkQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5EeGZJZDsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFcXVhbEF2ZXJhZ2VBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLkVxdWFsQXZlcmFnZTsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJY29uU2V0QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5JY29uU2V0OworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE9wZXJhdG9yQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5PcGVyYXRvcjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBQZXJjZW50QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5QZXJjZW50OworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFByaW9yaXR5QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5Qcmlvcml0eTsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBSYW5rQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5SYW5rOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFJldmVyc2VBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlJldmVyc2U7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUmdiQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5SZ2I7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgU2hvd1ZhbHVlQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5TaG93VmFsdWU7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgU3FyZWZBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlNxcmVmOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFN0ZERldkF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuU3RkRGV2OworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFN0b3BJZlRydWVBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlN0b3BJZlRydWU7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGV4dEF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuVGV4dDsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaGVtZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuVGhlbWU7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGltZVBlcmlvZEF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuVGltZVBlcmlvZDsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaW50QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5UaW50OworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFR5cGVBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlR5cGU7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVmFsQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5WYWw7CisgICAgfQorICAgICNlbmRyZWdpb24gWE1MIFBhdGhzCisKKyAgICAjcmVnaW9uIFJ1bGUgVHlwZSBTVF9DZlR5cGUgwqcxOC4xOC4xMiAod2l0aCBzbWFsbCBFUFBsdXMgY2hhbmdlcykKKyAgICBpbnRlcm5hbCBjbGFzcyBSdWxlVHlwZQorICAgIHsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBBYm92ZUF2ZXJhZ2UgPSAiYWJvdmVBdmVyYWdlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZWdpbnNXaXRoID0gImJlZ2luc1dpdGgiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENlbGxJcyA9ICJjZWxsSXMiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbG9yU2NhbGUgPSAiY29sb3JTY2FsZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29udGFpbnNCbGFua3MgPSAiY29udGFpbnNCbGFua3MiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbnRhaW5zRXJyb3JzID0gImNvbnRhaW5zRXJyb3JzIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDb250YWluc1RleHQgPSAiY29udGFpbnNUZXh0IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBEYXRhQmFyID0gImRhdGFCYXIiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIER1cGxpY2F0ZVZhbHVlcyA9ICJkdXBsaWNhdGVWYWx1ZXMiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuZHNXaXRoID0gImVuZHNXaXRoIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFeHByZXNzaW9uID0gImV4cHJlc3Npb24iOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXQgPSAiaWNvblNldCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTm90Q29udGFpbnNCbGFua3MgPSAibm90Q29udGFpbnNCbGFua3MiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5vdENvbnRhaW5zRXJyb3JzID0gIm5vdENvbnRhaW5zRXJyb3JzIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb3RDb250YWluc1RleHQgPSAibm90Q29udGFpbnNUZXh0IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaW1lUGVyaW9kID0gInRpbWVQZXJpb2QiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRvcDEwID0gInRvcDEwIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBVbmlxdWVWYWx1ZXMgPSAidW5pcXVlVmFsdWVzIjsKKworICAgICAgLy8gRVBQbHVzIEV4dGVuZGVkIFR5cGVzCisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQWJvdmVPckVxdWFsQXZlcmFnZSA9ICJhYm92ZU9yRXF1YWxBdmVyYWdlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBBYm92ZVN0ZERldiA9ICJhYm92ZVN0ZERldiI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQmVsb3dBdmVyYWdlID0gImJlbG93QXZlcmFnZSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQmVsb3dPckVxdWFsQXZlcmFnZSA9ICJiZWxvd09yRXF1YWxBdmVyYWdlIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZWxvd1N0ZERldiA9ICJiZWxvd1N0ZERldiI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQmV0d2VlbiA9ICJiZXR3ZWVuIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCb3R0b20gPSAiYm90dG9tIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCb3R0b21QZXJjZW50ID0gImJvdHRvbVBlcmNlbnQiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVxdWFsID0gImVxdWFsIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBHcmVhdGVyVGhhbiA9ICJncmVhdGVyVGhhbiI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgR3JlYXRlclRoYW5PckVxdWFsID0gImdyZWF0ZXJUaGFuT3JFcXVhbCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSWNvblNldDMgPSAiaWNvblNldDMiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXQ0ID0gImljb25TZXQ0IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJY29uU2V0NSA9ICJpY29uU2V0NSI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGFzdDdEYXlzID0gImxhc3Q3RGF5cyI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGFzdE1vbnRoID0gImxhc3RNb250aCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGFzdFdlZWsgPSAibGFzdFdlZWsiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIExlc3NUaGFuID0gImxlc3NUaGFuIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMZXNzVGhhbk9yRXF1YWwgPSAibGVzc1RoYW5PckVxdWFsIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOZXh0TW9udGggPSAibmV4dE1vbnRoIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOZXh0V2VlayA9ICJuZXh0V2VlayI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTm90QmV0d2VlbiA9ICJub3RCZXR3ZWVuIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb3RFcXVhbCA9ICJub3RFcXVhbCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGhpc01vbnRoID0gInRoaXNNb250aCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGhpc1dlZWsgPSAidGhpc1dlZWsiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRocmVlQ29sb3JTY2FsZSA9ICJ0aHJlZUNvbG9yU2NhbGUiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRvZGF5ID0gInRvZGF5IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUb21vcnJvdyA9ICJ0b21vcnJvdyI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVG9wID0gInRvcCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVG9wUGVyY2VudCA9ICJ0b3BQZXJjZW50IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUd29Db2xvclNjYWxlID0gInR3b0NvbG9yU2NhbGUiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFllc3RlcmRheSA9ICJ5ZXN0ZXJkYXkiOworICAgIH0KKyAgICAjZW5kcmVnaW9uIFJ1bGUgVHlwZSBTVF9DZlR5cGUgwqcxOC4xOC4xMiAod2l0aCBzbWFsbCBFUFBsdXMgY2hhbmdlcykKKworICAgICNyZWdpb24gQ0ZWTyBUeXBlIFNUX0Nmdm9UeXBlIMKnMTguMTguMTMKKyAgICBpbnRlcm5hbCBjbGFzcyBDZnZvVHlwZQorICAgIHsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNaW4gPSAibWluIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNYXggPSAibWF4IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOdW0gPSAibnVtIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBGb3JtdWxhID0gImZvcm11bGEiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFBlcmNlbnQgPSAicGVyY2VudCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUGVyY2VudGlsZSA9ICJwZXJjZW50aWxlIjsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDRlZPIFR5cGUgU1RfQ2Z2b1R5cGUgwqcxOC4xOC4xMworCisgICAgI3JlZ2lvbiBPcGVyYXRvciBUeXBlIFNUX0NvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yIMKnMTguMTguMTUKKyAgICBpbnRlcm5hbCBjbGFzcyBPcGVyYXRvcnMKKyAgICB7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQmVnaW5zV2l0aCA9ICJiZWdpbnNXaXRoIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZXR3ZWVuID0gImJldHdlZW4iOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbnRhaW5zVGV4dCA9ICJjb250YWluc1RleHQiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuZHNXaXRoID0gImVuZHNXaXRoIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFcXVhbCA9ICJlcXVhbCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgR3JlYXRlclRoYW4gPSAiZ3JlYXRlclRoYW4iOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEdyZWF0ZXJUaGFuT3JFcXVhbCA9ICJncmVhdGVyVGhhbk9yRXF1YWwiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIExlc3NUaGFuID0gImxlc3NUaGFuIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMZXNzVGhhbk9yRXF1YWwgPSAibGVzc1RoYW5PckVxdWFsIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb3RCZXR3ZWVuID0gIm5vdEJldHdlZW4iOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5vdENvbnRhaW5zID0gIm5vdENvbnRhaW5zIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb3RFcXVhbCA9ICJub3RFcXVhbCI7CisgICAgfQorICAgICNlbmRyZWdpb24gT3BlcmF0b3IgVHlwZSBTVF9Db25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvciDCpzE4LjE4LjE1CisKKyAgICAjcmVnaW9uIFRpbWUgUGVyaW9kIFR5cGUgU1RfVGltZVBlcmlvZCDCpzE4LjE4LjgyCisgICAgaW50ZXJuYWwgY2xhc3MgVGltZVBlcmlvZHMKKyAgICB7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGFzdDdEYXlzID0gImxhc3Q3RGF5cyI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGFzdE1vbnRoID0gImxhc3RNb250aCI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGFzdFdlZWsgPSAibGFzdFdlZWsiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5leHRNb250aCA9ICJuZXh0TW9udGgiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5leHRXZWVrID0gIm5leHRXZWVrIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaGlzTW9udGggPSAidGhpc01vbnRoIjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaGlzV2VlayA9ICJ0aGlzV2VlayI7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVG9kYXkgPSAidG9kYXkiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRvbW9ycm93ID0gInRvbW9ycm93IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBZZXN0ZXJkYXkgPSAieWVzdGVyZGF5IjsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBUaW1lIFBlcmlvZCBUeXBlIFNUX1RpbWVQZXJpb2QgwqcxOC4xOC44MgorCisgICAgI3JlZ2lvbiBDb2xvcnMKKyAgICBpbnRlcm5hbCBjbGFzcyBDb2xvcnMKKyAgICB7CisgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2Z2b0xvd1ZhbHVlID0gQCIjRkZGODY5NkIiOworICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENmdm9NaWRkbGVWYWx1ZSA9IEAiI0ZGRkZFQjg0IjsKKyAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDZnZvSGlnaFZhbHVlID0gQCIjRkY2M0JFN0IiOworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbG9ycworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VudW1zLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VudW1zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjk3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW51bXMuY3MKQEAgLTAsMCArMSw3ODQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVudW0gZm9yIENvbmRpdGlvbmFsIEZvcm1hdCBUeXBlIFNUX0NmVHlwZSDCpzE4LjE4LjEyLiBXaXRoIHNvbWUgY2hhbmdlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVudW0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUKKyAgeworICAgICNyZWdpb24gQXZlcmFnZQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBhYm92ZSB0aGUgYXZlcmFnZQorICAgIC8vLyBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBBYm92ZUF2ZXJhZ2UsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBhcmUgYWJvdmUgb3IgZXF1YWwKKyAgICAvLy8gdGhlIGF2ZXJhZ2UgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkFib3ZlQXZlcmFnZSBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgQWJvdmVPckVxdWFsQXZlcmFnZSwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBiZWxvdyB0aGUgYXZlcmFnZQorICAgIC8vLyBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBCZWxvd0F2ZXJhZ2UsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBhcmUgYmVsb3cgb3IgZXF1YWwKKyAgICAvLy8gdGhlIGF2ZXJhZ2UgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkFib3ZlQXZlcmFnZSBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgQmVsb3dPckVxdWFsQXZlcmFnZSwKKyAgICAjZW5kcmVnaW9uCisKKyAgICAjcmVnaW9uIFN0ZERldgorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBhYm92ZSB0aGUgc3RhbmRhcmQKKyAgICAvLy8gZGV2aWF0aW9uYSBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisgICAgLy8vIDxyZW1hcmtzPkFib3ZlQXZlcmFnZSBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBBYm92ZVN0ZERldiwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBiZWxvdyB0aGUgc3RhbmRhcmQKKyAgICAvLy8gZGV2aWF0aW9uYSBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBCZWxvd1N0ZERldiwKKyAgICAjZW5kcmVnaW9uCisKKyAgICAjcmVnaW9uIFRvcEJvdHRvbQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aG9zZSB2YWx1ZXMgZmFsbCBpbiB0aGUKKyAgICAvLy8gYm90dG9tIE4gYnJhY2tldCBhcyBzcGVjaWZpZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+VG9wMTAgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIEJvdHRvbSwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aG9zZSB2YWx1ZXMgZmFsbCBpbiB0aGUKKyAgICAvLy8gYm90dG9tIE4gcGVyY2VudCBhcyBzcGVjaWZpZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+VG9wMTAgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIEJvdHRvbVBlcmNlbnQsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgd2hvc2UgdmFsdWVzIGZhbGwgaW4gdGhlCisgICAgLy8vIHRvcCBOIGJyYWNrZXQgYXMgc3BlY2lmaWVkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPlRvcDEwIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBUb3AsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgd2hvc2UgdmFsdWVzIGZhbGwgaW4gdGhlCisgICAgLy8vIHRvcCBOIHBlcmNlbnQgYXMgc3BlY2lmaWVkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPlRvcDEwIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBUb3BQZXJjZW50LAorICAgICNlbmRyZWdpb24KKworICAgICNyZWdpb24gVGltZVBlcmlvZAorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoZQorICAgIC8vLyBsYXN0IDcgZGF5cy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBMYXN0N0RheXMsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGUKKyAgICAvLy8gbGFzdCBtb250aC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBMYXN0TW9udGgsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGUKKyAgICAvLy8gbGFzdCB3ZWVrLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIExhc3RXZWVrLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhlCisgICAgLy8vIG5leHQgbW9udGguCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgTmV4dE1vbnRoLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhlCisgICAgLy8vIG5leHQgd2Vlay4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBOZXh0V2VlaywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoaXMKKyAgICAvLy8gbW9udGguCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgVGhpc01vbnRoLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhpcworICAgIC8vLyB3ZWVrLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIFRoaXNXZWVrLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgdG9kYXkgZGF0ZXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgVG9kYXksCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyB0b21vcnJvdyBkYXRlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBUb21vcnJvdywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIHllc3RlcmRheSBkYXRlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBZZXN0ZXJkYXksCisgICAgI2VuZHJlZ2lvbgorCisgICAgI3JlZ2lvbiBDZWxsSXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgaW4gdGhlIHJhbmdlIHRoYXQgYmVnaW4gd2l0aAorICAgIC8vLyB0aGUgZ2l2ZW4gdGV4dC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gRXF1aXZhbGVudCB0byB1c2luZyB0aGUgTEVGVCgpIHNoZWV0IGZ1bmN0aW9uIGFuZCBjb21wYXJpbmcgdmFsdWVzLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vIDxyZW1hcmtzPkJlZ2luc1dpdGggRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIEJlZ2luc1dpdGgsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgaW4gdGhlIHJhbmdlIGJldHdlZW4gdGhlCisgICAgLy8vIGdpdmVuIHR3byBmb3JtdWxhcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIEJldHdlZW4sCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBhcmUgY29tcGxldGVseSBibGFuay4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gRXF1aXZhbGVudCBvZiB1c2luZyBMRU4oVFJJTSgpKS4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBjZWxsIGNvbnRhaW5zIG9ubHkKKyAgICAvLy8gY2hhcmFjdGVycyB0aGF0IFRSSU0oKSB3b3VsZCByZW1vdmUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBibGFuay4gQW4gZW1wdHkgY2VsbAorICAgIC8vLyBpcyBhbHNvIGNvbnNpZGVyZWQgYmxhbmsuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8gPHJlbWFya3M+Q29udGFpbnNCbGFua3MgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIENvbnRhaW5zQmxhbmtzLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHdpdGggZm9ybXVsYSBlcnJvcnMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgSVNFUlJPUigpIHNoZWV0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcworICAgIC8vLyBhIGZvcm11bGEgZXJyb3IuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8gPHJlbWFya3M+Q29udGFpbnNFcnJvcnMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIENvbnRhaW5zRXJyb3JzLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGluIHRoZSByYW5nZSB0aGF0IGJlZ2luIHdpdGgKKyAgICAvLy8gdGhlIGdpdmVuIHRleHQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIExFRlQoKSBzaGVldCBmdW5jdGlvbiBhbmQgY29tcGFyaW5nIHZhbHVlcy4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLyA8cmVtYXJrcz5Db250YWluc1RleHQgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIENvbnRhaW5zVGV4dCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBkdXBsaWNhdGVkIHZhbHVlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5EdXBsaWNhdGVWYWx1ZXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIER1cGxpY2F0ZVZhbHVlcywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBlbmRpbmcgd2l0aCBnaXZlbiB0ZXh0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBFcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBSSUdIVCgpIHNoZWV0IGZ1bmN0aW9uIGFuZCBjb21wYXJpbmcgdmFsdWVzLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vIDxyZW1hcmtzPkVuZHNXaXRoIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBFbmRzV2l0aCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBlcXVhbHMgdG8gd2l0aCBnaXZlbiBmb3JtdWxhLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgRXF1YWwsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGNvbnRhaW5zIGEgZm9ybXVsYSB0byBldmFsdWF0ZS4gV2hlbiB0aGUgCisgICAgLy8vIGZvcm11bGEgcmVzdWx0IGlzIHRydWUsIHRoZSBjZWxsIGlzIGhpZ2hsaWdodGVkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkV4cHJlc3Npb24gRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIEV4cHJlc3Npb24sCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBmb3JtdWxhLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgR3JlYXRlclRoYW4sCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZQorICAgIC8vLyBnaXZlbiBmb3JtdWxhLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgR3JlYXRlclRoYW5PckVxdWFsLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gZm9ybXVsYS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIExlc3NUaGFuLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUKKyAgICAvLy8gZ2l2ZW4gZm9ybXVsYS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIExlc3NUaGFuT3JFcXVhbCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBvdXRzaWRlIHRoZSByYW5nZSBpbgorICAgIC8vLyBnaXZlbiB0d28gZm9ybXVsYXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+Q2VsbElzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBOb3RCZXR3ZWVuLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgZG9lcyBub3QgY29udGFpbnMgdGhlCisgICAgLy8vIGdpdmVuIGZvcm11bGEuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+Q2VsbElzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBOb3RDb250YWlucywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBub3QgYmxhbmsuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIEVxdWl2YWxlbnQgb2YgdXNpbmcgTEVOKFRSSU0oKSkuIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgY2VsbCBjb250YWlucyBvbmx5CisgICAgLy8vIGNoYXJhY3RlcnMgdGhhdCBUUklNKCkgd291bGQgcmVtb3ZlLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgYmxhbmsuIEFuIGVtcHR5IGNlbGwKKyAgICAvLy8gaXMgYWxzbyBjb25zaWRlcmVkIGJsYW5rLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vIDxyZW1hcmtzPk5vdENvbnRhaW5zQmxhbmtzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBOb3RDb250YWluc0JsYW5rcywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aXRob3V0IGZvcm11bGEgZXJyb3JzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBFcXVpdmFsZW50IHRvIHVzaW5nIElTRVJST1IoKSBzaGVldCBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYQorICAgIC8vLyBmb3JtdWxhIGVycm9yLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vIDxyZW1hcmtzPk5vdENvbnRhaW5zRXJyb3JzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgICBOb3RDb250YWluc0Vycm9ycywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGRvIG5vdCBjb250YWluCisgICAgLy8vIHRoZSBnaXZlbiB0ZXh0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBFcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBTRUFSQ0goKSBzaGVldCBmdW5jdGlvbi4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLyA8cmVtYXJrcz5Ob3RDb250YWluc1RleHQgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIE5vdENvbnRhaW5zVGV4dCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBub3QgZXF1YWxzIHRvIHdpdGgKKyAgICAvLy8gZ2l2ZW4gZm9ybXVsYS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIE5vdEVxdWFsLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIHVuaXF1ZSB2YWx1ZXMgaW4gdGhlIHJhbmdlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPlVuaXF1ZVZhbHVlcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgVW5pcXVlVmFsdWVzLAorICAgICNlbmRyZWdpb24KKworICAgICNyZWdpb24gQ29sb3JTY2FsZQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhyZWUgQ29sb3IgU2NhbGUgKExvdywgTWlkZGxlIGFuZCBIaWdoIENvbG9yIFNjYWxlKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkNvbG9yU2NhbGUgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIFRocmVlQ29sb3JTY2FsZSwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHdvIENvbG9yIFNjYWxlIChMb3cgYW5kIEhpZ2ggQ29sb3IgU2NhbGUpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+Q29sb3JTY2FsZSBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgVHdvQ29sb3JTY2FsZSwKKyAgICAjZW5kcmVnaW9uCisKKyAgICAjcmVnaW9uIEljb25TZXQKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGFwcGxpZXMgYSAzIHNldCBpY29ucyB0byBjZWxscyBhY2NvcmRpbmcKKyAgICAvLy8gdG8gdGhlaXIgdmFsdWVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkljb25TZXQgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIFRocmVlSWNvblNldCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgYXBwbGllcyBhIDQgc2V0IGljb25zIHRvIGNlbGxzIGFjY29yZGluZworICAgIC8vLyB0byB0aGVpciB2YWx1ZXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+SWNvblNldCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgRm91ckljb25TZXQsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGFwcGxpZXMgYSA1IHNldCBpY29ucyB0byBjZWxscyBhY2NvcmRpbmcKKyAgICAvLy8gdG8gdGhlaXIgdmFsdWVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkljb25TZXQgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICAgIEZpdmVJY29uU2V0LAorICAgICNlbmRyZWdpb24KKworICAgICNyZWdpb24gRGF0YUJhcgorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgZGlzcGxheXMgYSBncmFkYXRlZCBkYXRhIGJhciBpbiB0aGUgcmFuZ2Ugb2YgY2VsbHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+RGF0YUJhciBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgICAgRGF0YUJhcgorICAgICNlbmRyZWdpb24KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVudW0gZm9yIENvbmRpdGlvbmFsIEZvcm1hdCBWYWx1ZSBPYmplY3QgVHlwZSBTVF9DZnZvVHlwZSDCpzE4LjE4LjEzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZQorICB7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGb3JtdWxhCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGb3JtdWxhLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNYXhpbXVtIFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBNYXgsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE1pbmltdW0gVmFsdWUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIE1pbiwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTnVtYmVyIFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBOdW0sCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFBlcmNlbnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFBlcmNlbnQsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFBlcmNlbnRpbGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFBlcmNlbnRpbGUKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVudW0gZm9yIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgVmFsdWUgT2JqZWN0IFBvc2l0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24KKyAgeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGxvd2VyIHBvc2l0aW9uIGZvciBib3RoIFR3b0NvbG9yU2NhbGUgYW5kIFRocmVlQ29sb3JTY2FsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgTG93LAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgbWlkZGxlIHBvc2l0aW9uIG9ubHkgZm9yIFRocmVlQ29sb3JTY2FsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgTWlkZGxlLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgaGlnaGVzdCBwb3NpdGlvbiBmb3IgYm90aCBUd29Db2xvclNjYWxlIGFuZCBUaHJlZUNvbG9yU2NhbGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEhpZ2gKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVudW0gZm9yIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgVmFsdWUgT2JqZWN0IE5vZGUgVHlwZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlCisgIHsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICdjZnZvJyBub2RlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBDZnZvLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAnY29sb3InIG5vZGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIENvbG9yCisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFbnVtIGZvciBDb25kaXRpb25hbCBGb3JtYXR0aW5nIE9wZXJhcnRvciBUeXBlIFNUX0NvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yIMKnMTguMTguMTUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVudW0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlCisgIHsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJlZ2lucyBXaXRoLiAnQmVnaW5zIHdpdGgnIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBCZWdpbnNXaXRoLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCZXR3ZWVuLiAnQmV0d2Vlbicgb3BlcmF0b3IKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEJldHdlZW4sCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbnRhaW5zLiAnQ29udGFpbnMnIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBDb250YWluc1RleHQsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEVuZHMgV2l0aC4gJ0VuZHMgd2l0aCcgb3BlcmF0b3IKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEVuZHNXaXRoLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFcXVhbC4gJ0VxdWFsIHRvJyBvcGVyYXRvcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRXF1YWwsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdyZWF0ZXIgVGhhbi4gJ0dyZWF0ZXIgdGhhbicgb3BlcmF0b3IKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEdyZWF0ZXJUaGFuLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBHcmVhdGVyIFRoYW4gT3IgRXF1YWwuICdHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8nIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBHcmVhdGVyVGhhbk9yRXF1YWwsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIExlc3MgVGhhbi4gJ0xlc3MgdGhhbicgb3BlcmF0b3IKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIExlc3NUaGFuLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBMZXNzIFRoYW4gT3IgRXF1YWwuICdMZXNzIHRoYW4gb3IgZXF1YWwgdG8nIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBMZXNzVGhhbk9yRXF1YWwsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE5vdCBCZXR3ZWVuLiAnTm90IGJldHdlZW4nIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBOb3RCZXR3ZWVuLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEb2VzIE5vdCBDb250YWluLiAnRG9lcyBub3QgY29udGFpbicgb3BlcmF0b3IKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIE5vdENvbnRhaW5zLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBOb3QgRXF1YWwuICdOb3QgZXF1YWwgdG8nIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBOb3RFcXVhbAorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBUaW1lIFBlcmlvZCBUeXBlIFNUX1RpbWVQZXJpb2QgwqcxOC4xOC44MgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZQorICB7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBMYXN0IDcgRGF5cy4gQSBkYXRlIGluIHRoZSBsYXN0IHNldmVuIGRheXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBMYXN0N0RheXMsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIExhc3QgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGUgbGFzdCBjYWxlbmRhciBtb250aC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIExhc3RNb250aCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTGFzdCBXZWVrLiBBIGRhdGUgb2NjdXJpbmcgbGFzdCB3ZWVrLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgTGFzdFdlZWssCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE5leHQgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGUgbmV4dCBjYWxlbmRhciBtb250aC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIE5leHRNb250aCwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTmV4dCBXZWVrLiBBIGRhdGUgb2NjdXJpbmcgbmV4dCB3ZWVrLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgTmV4dFdlZWssCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGlzIGNhbGVuZGFyIG1vbnRoLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgVGhpc01vbnRoLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIFdlZWsuIEEgZGF0ZSBvY2N1cmluZyB0aGlzIHdlZWsuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBUaGlzV2VlaywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVG9kYXkuIFRvZGF5J3MgZGF0ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFRvZGF5LAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUb21vcnJvdy4gVG9tb3Jyb3cncyBkYXRlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgVG9tb3Jyb3csCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFllc3RlcmRheS4gWWVzdGVyZGF5J3MgZGF0ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFllc3RlcmRheQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gMTguMTguNDIgU1RfSWNvblNldFR5cGUgKEljb24gU2V0IFR5cGUpIC0gT25seSAzIGljb25zCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUKKyAgeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDMgQXJyb3dzKSAzIGFycm93cyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEFycm93cywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDMgQXJyb3dzIChHcmF5KSkgMyBncmF5IGFycm93cyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEFycm93c0dyYXksCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICgzIEZsYWdzKSAzIGZsYWdzIGljb24gc2V0LiAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZsYWdzLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAoMyBTaWducykgMyBzaWducyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFNpZ25zLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAoMyBTeW1ib2xzIENpcmNsZWQpIDMgc3ltYm9scyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFN5bWJvbHMsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICgzIFN5bWJvbHMpIDMgU3ltYm9scyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFN5bWJvbHMyLAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAoMyBUcmFmZmljIExpZ2h0cykgMyB0cmFmZmljIGxpZ2h0cyBpY29uIHNldCAoIzEpLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgVHJhZmZpY0xpZ2h0czEsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICgzIFRyYWZmaWMgTGlnaHRzIEJsYWNrKSAzIHRyYWZmaWMgbGlnaHRzIGljb24gc2V0IHdpdGggdGhpY2sgYmxhY2sgYm9yZGVyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgVHJhZmZpY0xpZ2h0czIKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIDE4LjE4LjQyIFNUX0ljb25TZXRUeXBlIChJY29uIFNldCBUeXBlKSAtIE9ubHkgNCBpY29ucworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZW51bSBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlCisgIHsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg0IEFycm93cykgNCBhcnJvd3MgaWNvbiBzZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBBcnJvd3MsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg0IEFycm93cyAoR3JheSkpIDQgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBBcnJvd3NHcmF5LAorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAoNCBSYXRpbmdzKSA0IHJhdGluZ3MgaWNvbiBzZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBSYXRpbmcsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg0IFJlZCBUbyBCbGFjaykgNCAncmVkIHRvIGJsYWNrJyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFJlZFRvQmxhY2ssCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg0IFRyYWZmaWMgTGlnaHRzKSA0IHRyYWZmaWMgbGlnaHRzIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgVHJhZmZpY0xpZ2h0cworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gMTguMTguNDIgU1RfSWNvblNldFR5cGUgKEljb24gU2V0IFR5cGUpIC0gT25seSA1IGljb25zCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzVJY29uc1NldFR5cGUKKyAgeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDUgQXJyb3dzKSA1IGFycm93cyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEFycm93cywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDUgQXJyb3dzIChHcmF5KSkgNSBncmF5IGFycm93cyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEFycm93c0dyYXksCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg1IFF1YXJ0ZXJzKSA1IHF1YXJ0ZXJzIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgUXVhcnRlcnMsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg1IFJhdGluZ3MgSWNvbiBTZXQpIDUgcmF0aW5nIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgUmF0aW5nCisgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gMTguMTguNDIgU1RfSWNvblNldFR5cGUgKEljb24gU2V0IFR5cGUpCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25zU2V0VHlwZQorICB7CisgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAvLy8gKDMgQXJyb3dzKSAzIGFycm93cyBpY29uIHNldC4KKyAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICBUaHJlZUFycm93cywKKworICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgLy8vICgzIEFycm93cyAoR3JheSkpIDMgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgVGhyZWVBcnJvd3NHcmF5LAorCisgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAvLy8gKDMgRmxhZ3MpIDMgZmxhZ3MgaWNvbiBzZXQuIAorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIFRocmVlRmxhZ3MsCisKKyAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgIC8vLyAoMyBTaWducykgMyBzaWducyBpY29uIHNldC4KKyAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICBUaHJlZVNpZ25zLAorCisgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAvLy8gKDMgU3ltYm9scyBDaXJjbGVkKSAzIHN5bWJvbHMgaWNvbiBzZXQuCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgVGhyZWVTeW1ib2xzLAorCisgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAvLy8gKDMgU3ltYm9scykgMyBTeW1ib2xzIGljb24gc2V0LgorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIFRocmVlU3ltYm9sczIsCisKKyAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgIC8vLyAoMyBUcmFmZmljIExpZ2h0cykgMyB0cmFmZmljIGxpZ2h0cyBpY29uIHNldCAoIzEpLgorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIFRocmVlVHJhZmZpY0xpZ2h0czEsCisKKyAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgIC8vLyAoMyBUcmFmZmljIExpZ2h0cyBCbGFjaykgMyB0cmFmZmljIGxpZ2h0cyBpY29uIHNldCB3aXRoIHRoaWNrIGJsYWNrIGJvcmRlci4KKyAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICBUaHJlZVRyYWZmaWNMaWdodHMyLAorIAorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDQgQXJyb3dzKSA0IGFycm93cyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZvdXJBcnJvd3MsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg0IEFycm93cyAoR3JheSkpIDQgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGb3VyQXJyb3dzR3JheSwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDQgUmF0aW5ncykgNCByYXRpbmdzIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRm91clJhdGluZywKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDQgUmVkIFRvIEJsYWNrKSA0ICdyZWQgdG8gYmxhY2snIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRm91clJlZFRvQmxhY2ssCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg0IFRyYWZmaWMgTGlnaHRzKSA0IHRyYWZmaWMgbGlnaHRzIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRm91clRyYWZmaWNMaWdodHMsCisKKyAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDUgQXJyb3dzKSA1IGFycm93cyBpY29uIHNldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZpdmVBcnJvd3MsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg1IEFycm93cyAoR3JheSkpIDUgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGaXZlQXJyb3dzR3JheSwKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gKDUgUXVhcnRlcnMpIDUgcXVhcnRlcnMgaWNvbiBzZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGaXZlUXVhcnRlcnMsCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICg1IFJhdGluZ3MgSWNvbiBTZXQpIDUgcmF0aW5nIGljb24gc2V0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRml2ZVJhdGluZworfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlODZhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLmNzCkBAIC0wLDAgKzEsMjc0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbmRpdGlvbmFsIGZvcm1hdHRpbmcgaGVscGVyCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHN0YXRpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlcgorICB7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDaGVjayBhbmQgZml4IGFuIGFkZHJlc3MgKHN0cmluZyBhZGRyZXNzKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQ2hlY2tBbmRGaXhSYW5nZUFkZHJlc3MoCisgICAgICBzdHJpbmcgYWRkcmVzcykKKyAgICB7CisgICAgICBpZiAoYWRkcmVzcy5Db250YWlucygnLCcpKQorICAgICAgeworICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5Db21tYVNlcGFyYXRlZEFkZHJlc3Nlcyk7CisgICAgICB9CisKKyAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisKKyAgICAgIGlmIChSZWdleC5Jc01hdGNoKGFkZHJlc3MsIEAiW0EtWl0rOltBLVpdKyIpKQorICAgICAgeworICAgICAgICBhZGRyZXNzID0gQWRkcmVzc1V0aWxpdHkuUGFyc2VFbnRpcmVDb2x1bW5TZWxlY3Rpb25zKGFkZHJlc3MpOworICAgICAgfQorCisgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbnZlcnQgYSBjb2xvciBjb2RlIHRvIENvbG9yIE9iamVjdAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvckNvZGUiPkNvbG9yIENvZGUgKEV4LiAiI0ZGQjQzQzUzIiBvciAiRkZCNDNDNTMiKTwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIENvbG9yIENvbnZlcnRGcm9tQ29sb3JDb2RlKAorICAgICAgc3RyaW5nIGNvbG9yQ29kZSkKKyAgICB7CisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKEludDMyLlBhcnNlKGNvbG9yQ29kZS5SZXBsYWNlKCIjIiwgIiIpLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7CisgICAgICB9CisgICAgICBjYXRjaAorICAgICAgeworICAgICAgICAvLyBBc3N1bWUgd2hpdGUgaXMgdGhlIGRlZmF1bHQgY29sb3IgKGluc3RlYWQgb2YgZ2l2aW5nIGFuIGVycm9yKQorICAgICAgICByZXR1cm4gQ29sb3IuV2hpdGU7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZVN0cmluZygKKyAgICAgIFhtbE5vZGUgbm9kZSwKKyAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCisgICAgeworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOworICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID8gc3RyaW5nLkVtcHR5IDogdmFsdWU7CisgICAgICB9CisgICAgICBjYXRjaAorICAgICAgeworICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGludCBHZXRBdHRyaWJ1dGVJbnQoCisgICAgICBYbWxOb2RlIG5vZGUsCisgICAgICBzdHJpbmcgYXR0cmlidXRlKQorICAgIHsKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICB2YXIgdmFsdWUgPSBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXS5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIGludC5QYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkludGVnZXIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgfQorICAgICAgY2F0Y2gKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGludC5NaW5WYWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBpbnQ/IEdldEF0dHJpYnV0ZUludE51bGxhYmxlKAorICAgICAgWG1sTm9kZSBub2RlLAorICAgICAgc3RyaW5nIGF0dHJpYnV0ZSkKKyAgICB7CisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgICBpZiAobm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gPT0gbnVsbCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXS5WYWx1ZTsKKyAgICAgICAgICAgICAgcmV0dXJuIGludC5QYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkludGVnZXIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhdGNoCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlQm9vbCgKKyAgICAgIFhtbE5vZGUgbm9kZSwKKyAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCisgICAgeworICAgICAgdHJ5CisgICAgICB7CisgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOworICAgICAgICByZXR1cm4gKHZhbHVlID09ICIxIiB8fCB2YWx1ZSA9PSAiLTEiIHx8IHZhbHVlLkVxdWFscygiVFJVRSIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoCisgICAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBib29sPyBHZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCisgICAgICBYbWxOb2RlIG5vZGUsCisgICAgICBzdHJpbmcgYXR0cmlidXRlKQorICAgIHsKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICAgIGlmIChub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9PSBudWxsKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOworICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlID09ICIxIiB8fCB2YWx1ZSA9PSAiLTEiIHx8IHZhbHVlLkVxdWFscygiVFJVRSIsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhdGNoCisgICAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBHZXRBdHRyaWJ1dGVEb3VibGUoCisgICAgICBYbWxOb2RlIG5vZGUsCisgICAgICBzdHJpbmcgYXR0cmlidXRlKQorICAgIHsKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICB2YXIgdmFsdWUgPSBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXS5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLk51bWJlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICB9CisgICAgICBjYXRjaAorICAgICAgeworICAgICAgICByZXR1cm4gZG91YmxlLk5hTjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBkZWNpbWFsIEdldEF0dHJpYnV0ZURlY2ltYWwoCisgICAgICBYbWxOb2RlIG5vZGUsCisgICAgICBzdHJpbmcgYXR0cmlidXRlKQorICAgIHsKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICB2YXIgdmFsdWUgPSBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXS5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIGRlY2ltYWwuUGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgfQorICAgICAgY2F0Y2gKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY2ltYWwuTWluVmFsdWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFbmNvZGUgdG8gWE1MIChzcGVjaWFsIGNoYXJhY3RlcmVzOiAmYXBvczsgJnF1b3Q7ICZndDsgJmx0OyAmYW1wOykKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icyI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEVuY29kZVhNTCgKKyAgICAgIHRoaXMgc3RyaW5nIHMpCisgICAgeworICAgICAgcmV0dXJuIHMuUmVwbGFjZSgiJiIsICImYW1wOyIpLlJlcGxhY2UoIjwiLCAiJmx0OyIpLlJlcGxhY2UoIj4iLCAiJmd0OyIpLlJlcGxhY2UoIlwiIiwgIiZxdW90OyIpLlJlcGxhY2UoIiciLCAiJmFwb3M7Iik7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEZWNvZGUgZnJvbSBYTUwgKHNwZWNpYWwgY2hhcmFjdGVyZXM6ICZhcG9zOyAmcXVvdDsgJmd0OyAmbHQ7ICZhbXA7KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgRGVjb2RlWE1MKAorICAgICAgdGhpcyBzdHJpbmcgcykKKyAgICB7CisgICAgICByZXR1cm4gcy5SZXBsYWNlKCInIiwgIiZhcG9zOyIpLlJlcGxhY2UoIlwiIiwgIiZxdW90OyIpLlJlcGxhY2UoIj4iLCAiJmd0OyIpLlJlcGxhY2UoIjwiLCAiJmx0OyIpLlJlcGxhY2UoIiYiLCAiJmFtcDsiKTsKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFiYXJWYWx1ZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YWJhclZhbHVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTBjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFiYXJWYWx1ZS5jcwpAQCAtMCwwICsxLDM1OCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHk7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworCS8vLyA8c3VtbWFyeT4KKwkvLy8gMTguMy4xLjExIGNmdm8gKENvbmRpdGlvbmFsIEZvcm1hdCBWYWx1ZSBPYmplY3QpCisJLy8vIERlc2NyaWJlcyB0aGUgdmFsdWVzIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHBvaW50cyBpbiBhIGdyYWRpZW50IHNjYWxlLgorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZQorCQk6IFhtbEhlbHBlcgorCXsKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKwkJcHJpdmF0ZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBfcnVsZVR5cGU7CisJCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKwkJI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5UaGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUgcGFyZW50LiBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgICAgLy8vIGNvbG9yU2NhbGUgKMKnMTguMy4xLjE2KTsgZGF0YUJhciAowqcxOC4zLjEuMjgpOyBpY29uU2V0ICjCpzE4LjMuMS40OSk8L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKwkJaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUsCisJCQlkb3VibGUgdmFsdWUsCisJCQlzdHJpbmcgZm9ybXVsYSwKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICAgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisJCQlFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisJCQlYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKwkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKwkJCTogdGhpcygKKyAgICAgICAgICAgIHJ1bGVUeXBlLAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKwkJCW5hbWVzcGFjZU1hbmFnZXIpCisJCXsKKwkJCVJlcXVpcmUuQXJndW1lbnQocHJpb3JpdHkpLklzSW5SYW5nZSgxLCBpbnQuTWF4VmFsdWUsICJwcmlvcml0eSIpOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IGRvZXMgbm90IGV4aXN0cworCQkJaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQorCQkJeworCQkJCS8vIEdldCB0aGUgcGFyZW50IG5vZGUgcGF0aCBieSB0aGUgcnVsZSB0eXBlCisJCQkJc3RyaW5nIHBhcmVudE5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCisJCQkJCXJ1bGVUeXBlKTsKKworCQkJCS8vIENoZWNrIGZvciBlbiBlcnJvciAocnVsZSB0eXBlIGRvZXMgbm90IGhhdmUgPGNmdm8+KQorCQkJCWlmIChwYXJlbnROb2RlUGF0aCA9PSBzdHJpbmcuRW1wdHkpCisJCQkJeworCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdDZnZvUGFyZW50Tm9kZSk7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gdGhlIDxjZnZvPiBwYXJlbnQgbm9kZQorICAgICAgICBpdGVtRWxlbWVudE5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKAorCQkJCQlzdHJpbmcuRm9ybWF0KAorCQkJCQkJIi8vezB9W3sxfT0nezJ9J10vezN9W3s0fT0nezV9J10vezZ9IiwKKwkJCQkJLy8gezB9CisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db25kaXRpb25hbEZvcm1hdHRpbmcsCisJCQkJCS8vIHsxfQorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuU3FyZWZBdHRyaWJ1dGUsCisJCQkJCS8vIHsyfQorCQkJCQkJYWRkcmVzcy5BZGRyZXNzLAorCQkJCQkvLyB7M30KKwkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmUnVsZSwKKwkJCQkJLy8gezR9CisJCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Qcmlvcml0eUF0dHJpYnV0ZSwKKwkJCQkJLy8gezV9CisJCQkJCQlwcmlvcml0eSwKKwkJCQkJLy8gezZ9CisJCQkJCQlwYXJlbnROb2RlUGF0aCksCisJCQkJCV93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisKKwkJCQkvLyBDaGVjayBmb3IgZW4gZXJyb3IgKHJ1bGUgdHlwZSBkb2VzIG5vdCBoYXZlIDxjZnZvPikKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlID09IG51bGwpCisJCQkJeworCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAorCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdDZnZvUGFyZW50Tm9kZSk7CisJCQkJfQorCQkJfQorCisgICAgICAgICAgICBUb3BOb2RlID0gaXRlbUVsZW1lbnROb2RlOworCisJCQkvLyBTYXZlIHRoZSBhdHRyaWJ1dGVzCisJCQlSdWxlVHlwZSA9IHJ1bGVUeXBlOworCQkJVHlwZSA9IHR5cGU7CisJCQlWYWx1ZSA9IHZhbHVlOworCQkJRm9ybXVsYSA9IGZvcm11bGE7CisJCX0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluaXRpYWxpemUgdGhlIGNmdm8gKMKnMTguMy4xLjExKSBub2RlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+VGhlIGNmdm8gKMKnMTguMy4xLjExKSBub2RlIHBhcmVudC4gQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAgIC8vLyBjb2xvclNjYWxlICjCpzE4LjMuMS4xNik7IGRhdGFCYXIgKMKnMTguMy4xLjI4KTsgaWNvblNldCAowqcxOC4zLjEuNDkpPC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKyAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICAgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZSgKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGwoImFkZHJlc3MiKTsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOworCisgICAgICAgICAgICAvLyBTYXZlIHRoZSB3b3Jrc2hlZXQgZm9yIHByaXZhdGUgbWV0aG9kcyB0byB1c2UKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7CisKKyAgICAgICAgICAgIC8vIFNjaGVtYSBvcmRlciBsaXN0CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10KKwkJCXsKKyAgICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Ob2Rlcy5DZnZvLAorCQkJfTsKKworICAgICAgICAgICAgLy9DaGVjayBpZiB0aGUgcGFyZW50IGRvZXMgbm90IGV4aXN0cworICAgICAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyZW50IG5vZGUgcGF0aCBieSB0aGUgcnVsZSB0eXBlCisgICAgICAgICAgICAgICAgc3RyaW5nIHBhcmVudE5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCisgICAgICAgICAgICAgICAgICAgIHJ1bGVUeXBlKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbiBlcnJvciAocnVsZSB0eXBlIGRvZXMgbm90IGhhdmUgPGNmdm8+KQorICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlUGF0aCA9PSBzdHJpbmcuRW1wdHkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdDZnZvUGFyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUnVsZVR5cGUgPSBydWxlVHlwZTsgICAgICAgICAgICAKKyAgICAgICAgfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIi8+CisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisJCWludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB0eXBlLAorCQkJZG91YmxlIHZhbHVlLAorCQkJc3RyaW5nIGZvcm11bGEsCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSwKKyAgICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgICAgICAgaW50IHByaW9yaXR5LAorCQkJRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorCQkJWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorCQkJOiB0aGlzKAorCQkJCXR5cGUsCisJCQkJdmFsdWUsCisJCQkJZm9ybXVsYSwKKwkJCQlydWxlVHlwZSwKKyAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgIHByaW9yaXR5LAorCQkJCXdvcmtzaGVldCwKKwkJCQludWxsLAorCQkJCW5hbWVzcGFjZU1hbmFnZXIpCisJCXsKKyAgICAgICAgICAgIAorCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUiLz4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisJCWludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB0eXBlLAorCQkJQ29sb3IgY29sb3IsCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSwKKyAgICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgICAgICAgaW50IHByaW9yaXR5LAorCQkJRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorCQkJWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorCQkJOiB0aGlzKAorCQkJCXR5cGUsCisJCQkJMCwKKwkJCQludWxsLAorCQkJCXJ1bGVUeXBlLAorICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgcHJpb3JpdHksCisJCQkJd29ya3NoZWV0LAorCQkJCW51bGwsCisJCQkJbmFtZXNwYWNlTWFuYWdlcikKKwkJeworCQl9CisJCSNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkJI3JlZ2lvbiBNZXRob2RzCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkjcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIAorCQkvLy8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBSdWxlVHlwZQorCQl7CisJCQlnZXQgeyByZXR1cm4gX3J1bGVUeXBlOyB9CisJCQlzZXQgeyBfcnVsZVR5cGUgPSB2YWx1ZTsgfQorCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgVHlwZQorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQl2YXIgdHlwZUF0dHJpYnV0ZSA9IEdldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVHlwZUF0dHJpYnV0ZSk7CisKKwkJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0VHlwZUJ5QXR0cmJpdXRlKHR5cGVBdHRyaWJ1dGUpOworCQkJfQorCQkJc2V0CisJCQl7CisgICAgICAgICAgICAgICAgaWYgKChfcnVsZVR5cGU9PWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCB8fCBfcnVsZVR5cGU9PWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0IHx8IF9ydWxlVHlwZT09ZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQpICYmCisgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluIHx8IHZhbHVlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NYXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSB0eXBlIGNhbid0IGJlIE1pbiBvciBNYXggZm9yIGljb24gc2V0cyIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UeXBlQXR0cmlidXRlLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOyAgICAgICAgICAgICAgICAKKwkJCX0KKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEdldC9TZXQgdGhlICdjZnZvJyBub2RlIEB2YWwgYXR0cmlidXRlCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBEb3VibGUgVmFsdWUKKwkJeworCQkJZ2V0CisJCQl7CisgICAgICAgICAgICAgICAgaWYgKChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW0pCisgICAgICAgICAgICAgICAgICAgIHx8IChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50KQorICAgICAgICAgICAgICAgICAgICB8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudGlsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZShFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQlzZXQKKwkJCXsKKwkJCQlzdHJpbmcgdmFsdWVUb1N0b3JlID0gc3RyaW5nLkVtcHR5OworCisJCQkJLy8gT25seSBzb21lIHR5cGVzIHVzZSB0aGUgQHZhbCBhdHRyaWJ1dGUKKwkJCQlpZiAoKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bSkKKwkJCQkJfHwgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQpCisJCQkJCXx8IChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50aWxlKSkKKwkJCQl7CisJCQkJCXZhbHVlVG9TdG9yZSA9IHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworCQkJCX0KKworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlLCB2YWx1ZVRvU3RvcmUpOworCQkJfQorCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0L1NldCB0aGUgRm9ybXVsYSBvZiB0aGUgT2JqZWN0IFZhbHVlICh1c2VzIHRoZSBzYW1lIGF0dHJpYnV0ZSBhcyB0aGUgVmFsdWUpCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBzdHJpbmcgRm9ybXVsYQorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQkvLyBSZXR1cm4gZW1wdHkgaWYgdGhlIE9iamVjdCBWYWx1ZSB0eXBlIGlzIG5vdCBGb3JtdWxhCisJCQkJaWYgKFR5cGUgIT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGEpCisJCQkJeworCQkJCQlyZXR1cm4gc3RyaW5nLkVtcHR5OworCQkJCX0KKworCQkJCS8vIEV4Y2VsIHN0b3JlcyB0aGUgZm9ybXVsYSBpbiB0aGUgQHZhbCBhdHRyaWJ1dGUKKwkJCQlyZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUpOworCQkJfQorCQkJc2V0CisJCQl7CisJCQkJLy8gT25seSBzdG9yZSB0aGUgZm9ybXVsYSBpZiB0aGUgT2JqZWN0IFZhbHVlIHR5cGUgaXMgRm9ybXVsYQorCQkJCWlmIChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUsIHZhbHVlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJI2VuZHJlZ2lvbiBFeHBvc2VkIFByb3BlcnRpZXMKKworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMjM3NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuY3MKQEAgLTAsMCArMSwxNDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMTcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisJLy8vIDxzdW1tYXJ5PgorICAvLy8gRnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUiLz4KKwkvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUKKwl7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIAorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCWludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0QXR0cmlidXRlQnlUeXBlKAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIHR5cGUpCisJCXsKKwkJCXN3aXRjaCAodHlwZSkKKwkJCXsKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmVnaW5zV2l0aDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkJlZ2luc1dpdGg7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmV0d2VlbjoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkJldHdlZW47CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQ29udGFpbnNUZXh0OgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuQ29udGFpbnNUZXh0OworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkVuZHNXaXRoOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRW5kc1dpdGg7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuRXF1YWw6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5FcXVhbDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5HcmVhdGVyVGhhbjoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkdyZWF0ZXJUaGFuOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkdyZWF0ZXJUaGFuT3JFcXVhbDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5MZXNzVGhhbjoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkxlc3NUaGFuOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuT3JFcXVhbDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RCZXR3ZWVuOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTm90QmV0d2VlbjsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RDb250YWluczoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdENvbnRhaW5zOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLk5vdEVxdWFsOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTm90RXF1YWw7CisJCQl9CisKKwkJCXJldHVybiBzdHJpbmcuRW1wdHk7CisJCX0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gcGFyYW0gbmFtZT0iYXR0cmlidXRlIgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgaW50ZXJuYWwgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZSBHZXRUeXBlQnlBdHRyaWJ1dGUoCisgICAgICBzdHJpbmcgYXR0cmlidXRlKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYXR0cmlidXRlKQorICAgICAgeworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5CZWdpbnNXaXRoOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmVnaW5zV2l0aDsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5CZXR3ZWVuOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmV0d2VlbjsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5Db250YWluc1RleHQ6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Db250YWluc1RleHQ7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRW5kc1dpdGg6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FbmRzV2l0aDsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5FcXVhbDoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkVxdWFsOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkdyZWF0ZXJUaGFuOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW47CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuR3JlYXRlclRoYW5PckVxdWFsOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW5PckVxdWFsOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkxlc3NUaGFuOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTGVzc1RoYW47CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTGVzc1RoYW5PckVxdWFsOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdEJldHdlZW46CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RCZXR3ZWVuOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdENvbnRhaW5zOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90Q29udGFpbnM7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTm90RXF1YWw6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RFcXVhbDsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLlVuZXhpc3RlbnRPcGVyYXRvclR5cGVBdHRyaWJ1dGUpOworICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODg3OThkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMzg4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwJCSAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nICAgICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisJLy8vIDxzdW1tYXJ5PgorCS8vLyBGYWN0b3J5IGNsYXNzIGZvciBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZy4KKwkvLy8gPC9zdW1tYXJ5PgorCWludGVybmFsIHN0YXRpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVGYWN0b3J5CisJeworCQlwdWJsaWMgc3RhdGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSBDcmVhdGUoCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisJCQlFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisJCQlYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKwkJeworCQkJUmVxdWlyZS5Bcmd1bWVudCh0eXBlKTsKKyAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7CisgICAgICBSZXF1aXJlLkFyZ3VtZW50KHByaW9yaXR5KS5Jc0luUmFuZ2UoMSwgaW50Lk1heFZhbHVlLCAicHJpb3JpdHkiKTsKKwkJCVJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOworCQkJCisJCQkvLyBBY2NvcmRpbmcgdGhlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSB0eXBlCisJCQlzd2l0Y2ggKHR5cGUpCisJCQl7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVPckVxdWFsQXZlcmFnZToKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZSgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd0F2ZXJhZ2U6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZSgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2OgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldigKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd1N0ZERldjoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20oCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tUGVyY2VudDoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudCgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3A6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcCgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50OgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50KAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3Q3RGF5czoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdFdlZWs6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRNb250aDoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dE1vbnRoKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRXZWVrOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2VlaygKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzTW9udGg6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aCgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzV2VlazoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9kYXk6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5KAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvbW9ycm93OgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5ZZXN0ZXJkYXk6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheSgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW46CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3M6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zRXJyb3JzOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycygKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc1RleHQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EdXBsaWNhdGVWYWx1ZXM6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcygKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FbmRzV2l0aDoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWw6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkV4cHJlc3Npb246CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24oCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW46CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbigKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCgKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zQmxhbmtzOgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcygKKyAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9yczoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNUZXh0OgorICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90RXF1YWw6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlczoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZToKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlKAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGU6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUoCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisJCQkJCQl3b3Jrc2hlZXQsCisJCQkJCQlpdGVtRWxlbWVudE5vZGUpOworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldDoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0KAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KAorICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjoKKyAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhcigKKyAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXIsCisgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgICBudWxsKTsKKworCisgICAgICAgIC8vVE9ETzogQWRkIERhdGFCYXIKKwkJCX0KKworCQkJdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk5vblN1cHBvcnRlZFJ1bGVUeXBlLAorICAgICAgICAgIHR5cGUuVG9TdHJpbmcoKSkpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODhkYWZhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLmNzCkBAIC0wLDAgKzEsNTM5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHN0YXRpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlCisgIHsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZVNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRUeXBlQnlBdHRyYml1dGUoCisgICAgICBzdHJpbmcgYXR0cmlidXRlLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgIHN3aXRjaCAoYXR0cmlidXRlKQorICAgICAgeworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkFib3ZlQXZlcmFnZToKKyAgICAgICAgICByZXR1cm4gR2V0QWJvdmVBdmVyYWdlVHlwZSgKKyAgICAgICAgICAgIHRvcE5vZGUsCisgICAgICAgICAgICBuYW1lU3BhY2VNYW5hZ2VyKTsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLlRvcDEwOgorICAgICAgICAgIHJldHVybiBHZXRUb3AxMFR5cGUoCisgICAgICAgICAgICB0b3BOb2RlLAorICAgICAgICAgICAgbmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5UaW1lUGVyaW9kOgorICAgICAgICAgIHJldHVybiBHZXRUaW1lUGVyaW9kVHlwZSgKKyAgICAgICAgICAgIHRvcE5vZGUsCisgICAgICAgICAgICBuYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5DZWxsSXM6CisgICAgICAgICAgcmV0dXJuIEdldENlbGxJcygoWG1sRWxlbWVudCl0b3BOb2RlKTsKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5CZWdpbnNXaXRoOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOworCisgICAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5CZXR3ZWVuOgorICAgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW47CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db250YWluc0JsYW5rczoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3M7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db250YWluc0Vycm9yczoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnM7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db250YWluc1RleHQ6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dDsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlczoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRW5kc1dpdGg6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOworCisgICAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5FcXVhbDoKKyAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbDsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkV4cHJlc3Npb246CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkV4cHJlc3Npb247CisKKyAgICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkdyZWF0ZXJUaGFuOgorICAgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOworCisgICAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWw6CisgICAgICAgIC8vICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW5PckVxdWFsOworCisgICAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5MZXNzVGhhbjoKKyAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbjsKKworICAgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTGVzc1RoYW5PckVxdWFsOgorICAgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbDsKKworICAgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90QmV0d2VlbjoKKyAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNCbGFua3M6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zQmxhbmtzOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNFcnJvcnM6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zRXJyb3JzOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNUZXh0OgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc1RleHQ7CisKKyAgICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLk5vdEVxdWFsOgorICAgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEVxdWFsOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuVW5pcXVlVmFsdWVzOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5VbmlxdWVWYWx1ZXM7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db2xvclNjYWxlOgorICAgICAgICAgIHJldHVybiBHZXRDb2xvclNjYWxlVHlwZSgKKyAgICAgICAgICAgIHRvcE5vZGUsCisgICAgICAgICAgICBuYW1lU3BhY2VNYW5hZ2VyKTsgICAgICAgIAorICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkljb25TZXQ6CisgICAgICAgICAgICByZXR1cm4gR2V0SWNvblNldFR5cGUodG9wTm9kZSwgbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRGF0YUJhcjoKKyAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyOworICAgICB9CisKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5VbmV4cGVjdGVkUnVsZVR5cGVBdHRyaWJ1dGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldENlbGxJcyhYbWxFbGVtZW50IG5vZGUpCisgICAgeworICAgICAgICBzd2l0Y2gobm9kZS5HZXRBdHRyaWJ1dGUoIm9wZXJhdG9yIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkJlZ2luc1dpdGg6CisgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOworICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuQmV0d2VlbjoKKyAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW47CisKKyAgICAgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkNvbnRhaW5zVGV4dDoKKyAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dDsKKworICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRW5kc1dpdGg6CisgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FbmRzV2l0aDsKKworICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRXF1YWw6CisgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbDsKKworICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuR3JlYXRlclRoYW46CisgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbjsKKworICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuR3JlYXRlclRoYW5PckVxdWFsOgorICAgICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW5PckVxdWFsOworCisgICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5MZXNzVGhhbjoKKyAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOworCisgICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWw6CisgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw7CisKKyAgICAgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdEJldHdlZW46CisgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuOworCisgICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5Ob3RDb250YWluczoKKyAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zOworCisgICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5Ob3RFcXVhbDoKKyAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEVxdWFsOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuVW5leGlzdGVudE9wZXJhdG9yVHlwZUF0dHJpYnV0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgR2V0SWNvblNldFR5cGUoWG1sTm9kZSB0b3BOb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICB2YXIgbm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDppY29uU2V0L0BpY29uU2V0IiwgbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdiA9IG5vZGUuVmFsdWU7CisKKyAgICAgICAgICAgIGlmICh2WzBdID09ICczJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodlswXSA9PSAnNCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IHRoZSAiY29sb3JTY2FsZSIgcnVsZSB0eXBlIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mICJjZnZvIiBhbmQgImNvbG9yIiBub2Rlcy4KKyAgICAvLy8gSWYgd2UgaGF2ZSBleGNhdGx5IDIgImNmdm8iIGFuZCAiY29sb3IiIGNoaWxkcywgdGhlbiB3ZSByZXR1cm4gInR3b0NvbG9yU2NhbGUiCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+VHdvQ29sb3JTY2FsZSBvciBUaHJlZUNvbG9yU2NhbGU8L3JldHVybnM+CisgICAgaW50ZXJuYWwgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldENvbG9yU2NhbGVUeXBlKAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgIC8vIEdldCB0aGUgPGNmdm8+IG5vZGVzCisgICAgICB2YXIgY2Z2b05vZGVzID0gdG9wTm9kZS5TZWxlY3ROb2RlcygKKyAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAiezB9L3sxfSIsCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29sb3JTY2FsZSwKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvKSwKKyAgICAgICAgbmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgIC8vIEdldCB0aGUgPGNvbG9yPiBub2RlcworICAgICAgdmFyIGNvbG9yTm9kZXMgPSB0b3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICJ7MH0vezF9IiwKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvclNjYWxlLAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbG9yKSwKKyAgICAgICAgbmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgIC8vIFdlIGRldGVybWluZSBpZiBpdCBpcyAiVHdvQ29sb3JTY2FsZSIgb3IgIlRocmVlQ29sb3JTY2FsZSIgYnkgdGhlCisgICAgICAvLyBudW1iZXIgb2YgPGNmdm8+IGFuZCA8Y29sb3I+IGluc2lkZSB0aGUgPGNvbG9yU2NhbGU+IG5vZGUKKyAgICAgIGlmICgoY2Z2b05vZGVzID09IG51bGwpIHx8IChjZnZvTm9kZXMuQ291bnQgPCAyKSB8fCAoY2Z2b05vZGVzLkNvdW50ID4gMykKKyAgICAgICAgfHwgKGNvbG9yTm9kZXMgPT0gbnVsbCkgfHwgKGNvbG9yTm9kZXMuQ291bnQgPCAyKSB8fCAoY29sb3JOb2Rlcy5Db3VudCA+IDMpCisgICAgICAgIHx8IChjZnZvTm9kZXMuQ291bnQgIT0gY29sb3JOb2Rlcy5Db3VudCkpCisgICAgICB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLldyb25nTnVtYmVyQ2Z2b0NvbG9yTm9kZXMpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcnVsZSB0eXBlIChUd29Db2xvclNjYWxlIG9yIFRocmVlQ29sb3JTY2FsZSkKKyAgICAgIHJldHVybiAoY2Z2b05vZGVzLkNvdW50ID09IDIpCisgICAgICAgID8gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZQorICAgICAgICA6IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgImFib3ZlQXZlcmFnZSIgcnVsZSB0eXBlIGFjY29yZGluZyB0byB0aGUgZm9sbHdvaW5nIGF0dHJpYnV0ZXM6CisgICAgLy8vICJBYm92ZUF2ZXJhZ2UiLCAiRXF1YWxBdmVyYWdlIiBhbmQgIlN0ZERldiIuCisgICAgLy8vIAorICAgIC8vLyBAU3RkRGV2IGdyZWF0ZXIgdGhhbiAiMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBYm92ZVN0ZERldgorICAgIC8vLyBAU3RkRGV2IGxlc3MgdGhhbiAiMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCZWxvd1N0ZERldgorICAgIC8vLyBAQWJvdmVBdmVyYWdlID0gIjEiL251bGwgYW5kIEBFcXVhbEF2ZXJhZ2UgPSAiMCIvbnVsbCA9PSBBYm92ZUF2ZXJhZ2UKKyAgICAvLy8gQEFib3ZlQXZlcmFnZSA9ICIxIi9udWxsIGFuZCBARXF1YWxBdmVyYWdlID0gIjEiICAgICAgPT0gQWJvdmVPckVxdWFsQXZlcmFnZQorICAgIC8vLyBAQWJvdmVBdmVyYWdlID0gIjAiIGFuZCBARXF1YWxBdmVyYWdlID0gIjAiL251bGwgICAgICA9PSBCZWxvd0F2ZXJhZ2UKKyAgICAvLy8gQEFib3ZlQXZlcmFnZSA9ICIwIiBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiAgICAgICAgICAgPT0gQmVsb3dPckVxdWFsQXZlcmFnZQorICAgIC8vLyAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz5BYm92ZUF2ZXJhZ2UsIEFib3ZlT3JFcXVhbEF2ZXJhZ2UsIEJlbG93QXZlcmFnZSBvciBCZWxvd09yRXF1YWxBdmVyYWdlPC9yZXR1cm5zPgorICAgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRBYm92ZUF2ZXJhZ2VUeXBlKAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgIC8vIEdldCBAU3RkRGV2IGF0dHJpYnV0ZQorICAgICAgaW50PyBzdGREZXYgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVJbnROdWxsYWJsZSgKKyAgICAgICAgdG9wTm9kZSwKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5TdGREZXYpOworCisgICAgICBpZiAoc3RkRGV2ID4gMCkKKyAgICAgIHsKKyAgICAgICAgLy8gQFN0ZERldiA+ICIwIiAtLT4gQWJvdmVTdGREZXYKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2OworICAgICAgfQorCisgICAgICBpZiAoc3RkRGV2IDwgMCkKKyAgICAgIHsKKyAgICAgICAgLy8gQFN0ZERldiA8ICIwIiAtLT4gQmVsb3dTdGREZXYKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93U3RkRGV2OworICAgICAgfQorCisgICAgICAvLyBHZXQgQEFib3ZlQXZlcmFnZSBhdHRyaWJ1dGUKKyAgICAgIGJvb2w/IGlzQWJvdmVBdmVyYWdlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlQm9vbE51bGxhYmxlKAorICAgICAgICB0b3BOb2RlLAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLkFib3ZlQXZlcmFnZSk7CisKKyAgICAgIC8vIEdldCBARXF1YWxBdmVyYWdlIGF0dHJpYnV0ZQorICAgICAgYm9vbD8gaXNFcXVhbEF2ZXJhZ2UgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCisgICAgICAgIHRvcE5vZGUsCisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuRXF1YWxBdmVyYWdlKTsKKworICAgICAgaWYgKChpc0Fib3ZlQXZlcmFnZSA9PSBudWxsKSB8fCAoaXNBYm92ZUF2ZXJhZ2UgPT0gdHJ1ZSkpCisgICAgICB7CisgICAgICAgIGlmIChpc0VxdWFsQXZlcmFnZSA9PSB0cnVlKQorICAgICAgICB7CisgICAgICAgICAgLy8gQEFib3ZlQXZlcmFnZSA9ICIxIi9udWxsIGFuZCBARXF1YWxBdmVyYWdlID0gIjEiID09IEFib3ZlT3JFcXVhbEF2ZXJhZ2UKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVPckVxdWFsQXZlcmFnZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEBBYm92ZUF2ZXJhZ2UgPSAiMSIvbnVsbCBhbmQgQEVxdWFsQXZlcmFnZSA9ICIwIi9udWxsID09IEFib3ZlQXZlcmFnZQorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlOworICAgICAgfQorCisgICAgICBpZiAoaXNFcXVhbEF2ZXJhZ2UgPT0gdHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgLy8gQEFib3ZlQXZlcmFnZSA9ICIwIiBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiA9PSBCZWxvd09yRXF1YWxBdmVyYWdlCisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlOworICAgICAgfQorCisgICAgICAvLyBAQWJvdmVBdmVyYWdlID0gIjAiIGFuZCBARXF1YWxBdmVyYWdlID0gIjAiL251bGwgPT0gQmVsb3dBdmVyYWdlCisgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IHRoZSAidG9wMTAiIHJ1bGUgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIGZvbGx3b2luZyBhdHRyaWJ1dGVzOgorICAgIC8vLyAiQm90dG9tIiBhbmQgIlBlcmNlbnQiCisgICAgLy8vIAorICAgIC8vLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsICAgICAgID09IEJvdHRvbQorICAgIC8vLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIxIiAgICAgICAgICAgID09IEJvdHRvbVBlcmNlbnQKKyAgICAvLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsICA9PSBUb3AKKyAgICAvLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIxIiAgICAgICA9PSBUb3BQZXJjZW50CisgICAgLy8vIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPlRvcCwgVG9wUGVyY2VudCwgQm90dG9tIG9yIEJvdHRvbVBlcmNlbnQ8L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRUb3AxMFR5cGUoCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgLy8gR2V0IEBCb3R0b20gYXR0cmlidXRlCisgICAgICBib29sPyBpc0JvdHRvbSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLkdldEF0dHJpYnV0ZUJvb2xOdWxsYWJsZSgKKyAgICAgICAgdG9wTm9kZSwKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5Cb3R0b20pOworCisgICAgICAvLyBHZXQgQFBlcmNlbnQgYXR0cmlidXRlCisgICAgICBib29sPyBpc1BlcmNlbnQgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCisgICAgICAgIHRvcE5vZGUsCisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuUGVyY2VudCk7CisKKyAgICAgIGlmIChpc0JvdHRvbSA9PSB0cnVlKQorICAgICAgeworICAgICAgICBpZiAoaXNQZXJjZW50ID09IHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIxIiA9PSBCb3R0b21QZXJjZW50CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsID09IEJvdHRvbQorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tOworICAgICAgfQorCisgICAgICBpZiAoaXNQZXJjZW50ID09IHRydWUpCisgICAgICB7CisgICAgICAgIC8vIEBCb3R0b20gPSAiMCIvbnVsbCBhbmQgQFBlcmNlbnQgPSAiMSIgPT0gVG9wUGVyY2VudAorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9wUGVyY2VudDsKKyAgICAgIH0KKworICAgICAgLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsID09IFRvcAorICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgInRpbWVQZXJpb2QiIHJ1bGUgdHlwZSBhY2NvcmRpbmcgdG8gIlRpbWVQZXJpb2QiIGF0dHJpYnV0ZS4KKyAgICAvLy8gLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+TGFzdDdEYXlzLCBMYXN0TW9udGggZXRjLjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldFRpbWVQZXJpb2RUeXBlKAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHRpbWVQZXJpb2QgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkdldFR5cGVCeUF0dHJpYnV0ZSgKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlU3RyaW5nKAorICAgICAgICAgIHRvcE5vZGUsCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5UaW1lUGVyaW9kKSk7CisKKyAgICAgIHN3aXRjaCAodGltZVBlcmlvZCkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3Q3RGF5czsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdFdlZWs6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3RXZWVrOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5OZXh0TW9udGg7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5OZXh0V2VlazoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWs7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNXZWVrOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzV2VlazsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvZGF5OgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub2RheTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvbW9ycm93OgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdzsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheToKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5OworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuVW5leGlzdGVudFRpbWVQZXJpb2RUeXBlQXR0cmlidXRlKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QXR0cmlidXRlQnlUeXBlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSkKKyAgICB7CisgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICB7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlT3JFcXVhbEF2ZXJhZ2U6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93T3JFcXVhbEF2ZXJhZ2U6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVTdGREZXY6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dTdGREZXY6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkFib3ZlQXZlcmFnZTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbToKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50OgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50OgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Ub3AxMDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3Q3RGF5czoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0TW9udGg6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdFdlZWs6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dE1vbnRoOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRXZWVrOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aDoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzV2VlazoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub2RheToKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdzoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5ZZXN0ZXJkYXk6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLlRpbWVQZXJpb2Q7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVxdWFsOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbjoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90QmV0d2VlbjoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuQ2VsbElzOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0OgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0OgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5JY29uU2V0OworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlOgorICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGU6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbG9yU2NhbGU7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5CZWdpbnNXaXRoOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3M6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbnRhaW5zQmxhbmtzOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnM6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbnRhaW5zRXJyb3JzOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0OgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db250YWluc1RleHQ7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EdXBsaWNhdGVWYWx1ZXM6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlczsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5FbmRzV2l0aDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkV4cHJlc3Npb246CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkV4cHJlc3Npb247CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rczoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNCbGFua3M7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9yczoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNFcnJvcnM7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc1RleHQ6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLk5vdENvbnRhaW5zVGV4dDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlczoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuVW5pcXVlVmFsdWVzOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRGF0YUJhcjsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdSdWxlVHlwZSk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm4gY2Z2byDCpzE4LjMuMS4xMSBwYXJlbnQgYWNjb3JkaW5nIHRvIHRoZSBydWxlIHR5cGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldENmdm9QYXJlbnRQYXRoQnlUeXBlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSkKKyAgICB7CisgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICB7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZToKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGU6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbG9yU2NhbGU7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ6CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQ6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkljb25TZXQ7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5EYXRhQmFyOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuTWlzc2luZ1J1bGVUeXBlKTsKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkOGFiMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5jcwpAQCAtMCwwICsxLDEzMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0xNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKwkvLy8gPHN1bW1hcnk+CisgIC8vLyBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIi8+CisJLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUKKwl7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIAorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZUJ5VHlwZSgKKwkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHR5cGUpCisJCXsKKwkJCXN3aXRjaCAodHlwZSkKKwkJCXsKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLkxhc3Q3RGF5czsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTGFzdE1vbnRoOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdFdlZWs6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLkxhc3RXZWVrOworCisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5OZXh0TW9udGg7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5OZXh0V2VlazoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTmV4dFdlZWs7CisKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLlRoaXNNb250aDsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNXZWVrOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5UaGlzV2VlazsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvZGF5OgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub2RheTsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvbW9ycm93OgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub21vcnJvdzsKKworICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheToKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuWWVzdGVyZGF5OworCQkJfQorCisJCQlyZXR1cm4gc3RyaW5nLkVtcHR5OworCQl9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIEdldFR5cGVCeUF0dHJpYnV0ZSgKKyAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCisgICAgeworICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpCisgICAgICB7CisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTGFzdDdEYXlzOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5MYXN0TW9udGg6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLkxhc3RXZWVrOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0V2VlazsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLk5leHRNb250aDoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTmV4dFdlZWs6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRXZWVrOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuVGhpc01vbnRoOgorICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5UaGlzV2VlazoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVGhpc1dlZWs7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub2RheToKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9kYXk7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub21vcnJvdzoKKyAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9tb3Jyb3c7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5ZZXN0ZXJkYXk6CisgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLlVuZXhpc3RlbnRUaW1lUGVyaW9kVHlwZUF0dHJpYnV0ZSk7CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyODQ4NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuY3MKQEAgLTAsMCArMSwyMjIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisJLy8vIDxzdW1tYXJ5PgorCS8vLyBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSIvPgorCS8vLyA8L3N1bW1hcnk+CisJaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlCisJeworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXQgdGhlIHNlcXVlbmNpYWwgb3JkZXIgb2YgYSBjZnZvL2NvbG9yIGJ5IGl0cyBwb3NpdGlvbi4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJwb3NpdGlvbiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjEsIDIgb3IgMzwvcmV0dXJucz4KKwkJaW50ZXJuYWwgc3RhdGljIGludCBHZXRPcmRlckJ5UG9zaXRpb24oCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIHBvc2l0aW9uLAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUpCisJCXsKKwkJCXN3aXRjaCAocG9zaXRpb24pCisJCQl7CisJCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uLkxvdzoKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uTWlkZGxlOgorCQkJCQlyZXR1cm4gMjsKKworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbi5IaWdoOgorCQkJCQkvLyBDaGVjayBpZiB0aGUgcnVsZSB0eXBlIGlzIFR3b0NvbG9yU2NhbGUuCisJCQkJCWlmIChydWxlVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ud29Db2xvclNjYWxlKQorCQkJCQl7CisJCQkJCQkvLyBUaGVyZSBhcmUgb25seSAiTG93IiBhbmQgIkhpZ2giLiBTbyAiSGlnaCIgaXMgdGhlIHNlY29uZAorCQkJCQkJcmV0dXJuIDI7CisJCQkJCX0KKworCQkJCQkvLyBUaGVyZSBhcmUgIkxvdyIsICJNaWRkbGUiIGFuZCAiSGlnaCIuIFNvICJIaWdoIiBpcyB0aGUgdGhpcmQKKwkJCQkJcmV0dXJuIDM7CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0IHRoZSBDRlZPIHR5cGUgYnkgaXRzIEB0eXBlIGF0dHJpYnV0ZQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgR2V0VHlwZUJ5QXR0cmJpdXRlKAorCQkJc3RyaW5nIGF0dHJpYnV0ZSkKKwkJeworCQkJc3dpdGNoIChhdHRyaWJ1dGUpCisJCQl7CisJCQkJY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5NaW46CisJCQkJCXJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluOworCisgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuTWF4OgorCQkJCQlyZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heDsKKworICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLk51bToKKwkJCQkJcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5Gb3JtdWxhOgorCQkJCQlyZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGE7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5QZXJjZW50OgorCQkJCQlyZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQ7CisKKyAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5QZXJjZW50aWxlOgorCQkJCQlyZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnRpbGU7CisJCQl9CisKKwkJCXRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5VbmV4aXN0ZW50Q2Z2b1R5cGVBdHRyaWJ1dGUpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0icG9zaXRpb24iPjwvcGFyYW0+CisJCS8vLzxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Im5hbWVTcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBzdGF0aWMgWG1sTm9kZSBHZXRDZnZvTm9kZUJ5UG9zaXRpb24oCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIHBvc2l0aW9uLAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCisJCQlYbWxOb2RlIHRvcE5vZGUsCisJCQlYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisJCXsKKwkJCS8vIEdldCB0aGUgY29ycmVzcG9uZGluZyA8Y2Z2bz4gbm9kZSAoYnkgdGhlIHBvc2l0aW9uKQorCQkJdmFyIG5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisJCQkJc3RyaW5nLkZvcm1hdCgKKwkJCQkJInswfVtwb3NpdGlvbigpPXsxfV0iLAorCQkJCS8vIHswfQorCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLAorCQkJCS8vIHsxfQorCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXRPcmRlckJ5UG9zaXRpb24ocG9zaXRpb24sIHJ1bGVUeXBlKSksCisJCQkJbmFtZVNwYWNlTWFuYWdlcik7CisKKwkJCWlmIChub2RlID09IG51bGwpCisJCQl7CisJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuTWlzc2luZ0Nmdm9Ob2RlKTsKKwkJCX0KKworCQkJcmV0dXJuIG5vZGU7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyAKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBdHRyaWJ1dGVCeVR5cGUoCisJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSkKKwkJeworCQkJc3dpdGNoICh0eXBlKQorCQkJeworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1pbjoKKwkJCQkJcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLk1pbjsKKworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuTWF4OworCisJCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5OdW07CisKKwkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOgorICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5Gb3JtdWxhOworCisJCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuUGVyY2VudDsKKworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnRpbGU6CisgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLlBlcmNlbnRpbGU7CisJCQl9CisKKwkJCXJldHVybiBzdHJpbmcuRW1wdHk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXQgdGhlIGNmdm8gKMKnMTguMy4xLjExKSBub2RlIHBhcmVudCBieSB0aGUgcnVsZSB0eXBlLiBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisJCS8vLyAiY29sb3JTY2FsZSIgKMKnMTguMy4xLjE2KTsgImRhdGFCYXIiICjCpzE4LjMuMS4yOCk7ICJpY29uU2V0IiAowqcxOC4zLjEuNDkpCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldFBhcmVudFBhdGhCeVJ1bGVUeXBlKAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUpCisJCXsKKwkJCXN3aXRjaCAocnVsZVR5cGUpCisJCQl7CisJCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ud29Db2xvclNjYWxlOgorCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlOgorCQkJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29sb3JTY2FsZTsKKworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OgorICAgICAgICAgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ6CisgICAgICAgICAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDoKKwkJCQkJICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuSWNvblNldDsKKworICAgICAgICAgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjoKKyAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5EYXRhQmFyOworICAgICAgICAgICAgICB9CisKKwkJCXJldHVybiBzdHJpbmcuRW1wdHk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyAKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJub2RlVHlwZSI+PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0Tm9kZVBhdGhCeU5vZGVUeXBlKAorCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZSBub2RlVHlwZSkKKwkJeworCQkJc3dpdGNoKG5vZGVUeXBlKQorCQkJeworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5DZnZvOgorCQkJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bzsKKworCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5Db2xvcjoKKwkJCQkJcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbG9yOworCQkJfQorCisJCQlyZXR1cm4gc3RyaW5nLkVtcHR5OworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1JhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MTQ2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1JhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzCkBAIC0wLDAgKzEsNTMxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IgICAgICAgICAgICAgQ2hhbmdlICAgICAgICAgICAgICAgICAgICBEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nICAgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIGludGVybmFsIGNsYXNzIFJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nCisgICAgOiBJUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcKKyAgeworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKyAgICBwdWJsaWMgRXhjZWxBZGRyZXNzIF9hZGRyZXNzOworICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgcHVibGljIFJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCisgICAgeworICAgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisgICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOworCisgICAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgICAgX2FkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgI3JlZ2lvbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgVHlwZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBBYm92ZU9yRXF1YWxBdmVyYWdlIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQWJvdmVBdmVyYWdlKCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQWJvdmVBdmVyYWdlKAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlT3JFcXVhbEF2ZXJhZ2UoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZU9yRXF1YWxBdmVyYWdlKAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQmVsb3dPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93QXZlcmFnZSgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJlbG93QXZlcmFnZSgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEJlbG93T3JFcXVhbEF2ZXJhZ2UgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd09yRXF1YWxBdmVyYWdlKCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dPckVxdWFsQXZlcmFnZSgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEFib3ZlU3RkRGV2IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cCBBZGRBYm92ZVN0ZERldigpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEFib3ZlU3RkRGV2KAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQmVsb3dTdGREZXYgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEJlbG93U3RkRGV2KCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dTdGREZXYoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBCb3R0b20gQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZEJvdHRvbSgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJvdHRvbSgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEJvdHRvbVBlcmNlbnQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZEJvdHRvbVBlcmNlbnQoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCb3R0b21QZXJjZW50KAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVG9wIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3AoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb3AoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBUb3BQZXJjZW50IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3BQZXJjZW50KCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVG9wUGVyY2VudCgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIExhc3Q3RGF5cyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3Q3RGF5cygpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExhc3Q3RGF5cygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIExhc3RNb250aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3RNb250aCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExhc3RNb250aCgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIExhc3RXZWVrIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdFdlZWsoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMYXN0V2VlaygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIE5leHRNb250aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRNb250aCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5leHRNb250aCgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIE5leHRXZWVrIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTmV4dFdlZWsoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROZXh0V2VlaygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFRoaXNNb250aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRoaXNNb250aCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRoaXNNb250aCgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFRoaXNXZWVrIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVGhpc1dlZWsoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaGlzV2VlaygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFRvZGF5IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9kYXkoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb2RheSgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFRvbW9ycm93IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9tb3Jyb3coKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb21vcnJvdygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIFllc3RlcmRheSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFllc3RlcmRheSgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFllc3RlcmRheSgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEJlZ2luc1dpdGggQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGggQWRkQmVnaW5zV2l0aCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJlZ2luc1dpdGgoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBCZXR3ZWVuIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuIEFkZEJldHdlZW4oKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZXR3ZWVuKAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgQ29udGFpbnNCbGFua3MgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzIEFkZENvbnRhaW5zQmxhbmtzKCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQ29udGFpbnNCbGFua3MoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBDb250YWluc0Vycm9ycyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMgQWRkQ29udGFpbnNFcnJvcnMoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc0Vycm9ycygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIENvbnRhaW5zVGV4dCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0IEFkZENvbnRhaW5zVGV4dCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZENvbnRhaW5zVGV4dCgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIER1cGxpY2F0ZVZhbHVlcyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzIEFkZER1cGxpY2F0ZVZhbHVlcygpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZER1cGxpY2F0ZVZhbHVlcygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIEVuZHNXaXRoIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCBBZGRFbmRzV2l0aCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEVuZHNXaXRoKAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgRXF1YWwgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsIEFkZEVxdWFsKCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBFeHByZXNzaW9uIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uIEFkZEV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRFeHByZXNzaW9uKAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgR3JlYXRlclRoYW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuIEFkZEdyZWF0ZXJUaGFuKCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkR3JlYXRlclRoYW4oCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBHcmVhdGVyVGhhbk9yRXF1YWwgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCBBZGRHcmVhdGVyVGhhbk9yRXF1YWwoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRHcmVhdGVyVGhhbk9yRXF1YWwoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBMZXNzVGhhbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4gQWRkTGVzc1RoYW4oKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMZXNzVGhhbigKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIExlc3NUaGFuT3JFcXVhbCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsIEFkZExlc3NUaGFuT3JFcXVhbCgpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExlc3NUaGFuT3JFcXVhbCgKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIE5vdEJldHdlZW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4gQWRkTm90QmV0d2VlbigpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdEJldHdlZW4oCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBOb3RDb250YWluc0JsYW5rcyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MgQWRkTm90Q29udGFpbnNCbGFua3MoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RDb250YWluc0JsYW5rcygKKyAgICAgICAgX2FkZHJlc3MpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIE5vdENvbnRhaW5zRXJyb3JzIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycyBBZGROb3RDb250YWluc0Vycm9ycygpCisgICAgeworICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdENvbnRhaW5zRXJyb3JzKAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgTm90Q29udGFpbnNUZXh0IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQgQWRkTm90Q29udGFpbnNUZXh0KCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90Q29udGFpbnNUZXh0KAorICAgICAgICBfYWRkcmVzcyk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgTm90RXF1YWwgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsIEFkZE5vdEVxdWFsKCkKKyAgICB7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90RXF1YWwoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBVbmlxdWVWYWx1ZXMgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcyBBZGRVbmlxdWVWYWx1ZXMoKQorICAgIHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRVbmlxdWVWYWx1ZXMoCisgICAgICAgIF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZCBUaHJlZUNvbG9yU2NhbGUgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSBBZGRUaHJlZUNvbG9yU2NhbGUoKQorICAgIHsKKyAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlKShfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCisgICAgICAgIF9hZGRyZXNzKSk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgVHdvQ29sb3JTY2FsZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSBBZGRUd29Db2xvclNjYWxlKCkKKyAgICB7CisgICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUpKF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGUsCisgICAgICAgIF9hZGRyZXNzKSk7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgVGhyZWVJY29uU2V0IHJ1bGUgCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGU+IEFkZFRocmVlSWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlIEljb25TZXQpCisgICAgeworICAgICAgICB2YXIgcnVsZSA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZT4pKF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFJ1bGUoCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAorICAgICAgICAgIF9hZGRyZXNzKSk7CisgICAgICAgIHJ1bGUuSWNvblNldCA9IEljb25TZXQ7CisgICAgICAgIHJldHVybiBydWxlOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcyBhIEZvdXJJY29uU2V0IHJ1bGUgCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4gQWRkRm91ckljb25TZXQoZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZSBJY29uU2V0KQorICAgIHsKKyAgICAgICAgdmFyIHJ1bGUgPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4pKF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFJ1bGUoCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQsCisgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgICAgICAgcnVsZS5JY29uU2V0ID0gSWNvblNldDsKKyAgICAgICAgcmV0dXJuIHJ1bGU7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGRzIGEgRml2ZUljb25TZXQgcnVsZSAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iSWNvblNldCI+PC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCBBZGRGaXZlSWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIEljb25TZXQpCisgICAgeworICAgICAgICB2YXIgcnVsZSA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCkoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldCwKKyAgICAgICAgICBfYWRkcmVzcykpOworICAgICAgICBydWxlLkljb25TZXQgPSBJY29uU2V0OworICAgICAgICByZXR1cm4gcnVsZTsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYSBEYXRhYmFyIHJ1bGUgCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IkNvbG9yIj5UaGUgY29sb3Igb2YgdGhlIGRhdGFiYXI8L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cCBBZGREYXRhYmFyKFN5c3RlbS5EcmF3aW5nLkNvbG9yIENvbG9yKQorICAgIHsKKyAgICAgICAgdmFyIHJ1bGUgPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwKShfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRSdWxlKAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXIsCisgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgICAgICAgcnVsZS5Db2xvciA9IENvbG9yOworICAgICAgICByZXR1cm4gcnVsZTsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgVHlwZXMKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNWZlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlLmNzCkBAIC0wLDAgKzEsMTIyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZQorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBBYm92ZUF2ZXJhZ2UgPSB0cnVlOworICAgICAgICAgICAgRXF1YWxBdmVyYWdlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODdlMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UuY3MKQEAgLTAsMCArMSwxMjIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZU9yRXF1YWxBdmVyYWdlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBBYm92ZUF2ZXJhZ2UgPSB0cnVlOworICAgICAgICAgICAgRXF1YWxBdmVyYWdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBmYjMzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2LmNzCkBAIC0wLDAgKzEsMTIzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVTdGREZXYKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVTdGREZXYKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2LAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBBYm92ZUF2ZXJhZ2UgPSB0cnVlOworICAgICAgICAgICAgU3RkRGV2ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxMWViOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MKQEAgLTAsMCArMSwxMjYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgdHlwZSwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIHR5cGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICB0eXBlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEzMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MKQEAgLTAsMCArMSwxNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5CZWdpbnNXaXRoOworICAgICAgICAgICAgVGV4dCA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlRleHRBdHRyaWJ1dGUpOworICAgICAgfQorICAgICAgc2V0CisgICAgICB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSwKKyAgICAgICAgICB2YWx1ZSk7CisKKyAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgIkxFRlQoezB9LExFTihcInsxfVwiKSk9XCJ7MX1cIiIsCisgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzLAorICAgICAgICAgIHZhbHVlLlJlcGxhY2UoIlwiIiwgIlwiXCIiKSk7CisgICAgICB9CisgICAgfQorICAgICNlbmRyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjNiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlLmNzCkBAIC0wLDAgKzEsMTIyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZQorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBBYm92ZUF2ZXJhZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIEVxdWFsQXZlcmFnZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkODhhNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlLmNzCkBAIC0wLDAgKzEsMTIyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dPckVxdWFsQXZlcmFnZSwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgQWJvdmVBdmVyYWdlID0gZmFsc2U7CisgICAgICAgICAgICBFcXVhbEF2ZXJhZ2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmUwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYuY3MKQEAgLTAsMCArMSwxMjMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dTdGREZXYsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIEFib3ZlQXZlcmFnZSA9IGZhbHNlOworICAgICAgICAgICAgU3RkRGV2ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MxNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4uY3MKQEAgLTAsMCArMSwxMjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4KKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5CZXR3ZWVuOworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIEZvcm11bGEyID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNWZkNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20uY3MKQEAgLTAsMCArMSwxMjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBCb3R0b20gPSB0cnVlOworICAgICAgICAgICAgUGVyY2VudCA9IGZhbHNlOworICAgICAgICAgICAgUmFuayA9IDEwOyAgLy8gTGFzdCAxMCB2YWx1ZXMKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NWFkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudC5jcwpAQCAtMCwwICsxLDEyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50LAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBCb3R0b20gPSB0cnVlOworICAgICAgICAgICAgUGVyY2VudCA9IHRydWU7CisgICAgICAgICAgICBSYW5rID0gMTA7ICAvLyBMYXN0IDEwIHBlcmNlbnQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIxYjFmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcworICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zQmxhbmtzLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIkxFTihUUklNKHswfSkpPTAiLAorICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwNmY2NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcwpAQCAtMCwwICsxLDEyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0Vycm9ycywKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJJU0VSUk9SKHswfSkiLAorICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA5NmNmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dC5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0LAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Db250YWluc1RleHQ7CisgICAgICAgICAgICBUZXh0ID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW5zaWRlIHRoZSBjZWxsCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RyaW5nIFRleHQKKyAgICB7CisgICAgICBnZXQKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSk7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UZXh0QXR0cmlidXRlLAorICAgICAgICAgIHZhbHVlKTsKKworICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAiTk9UKElTRVJST1IoU0VBUkNIKFwiezF9XCIsezB9KSkpIiwKKyAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MsCisgICAgICAgICAgdmFsdWUuUmVwbGFjZSgiXCIiLCAiXCJcIiIpKTsKKyAgICAgIH0KKyAgICB9CisgICAgI2VuZHJlZ2lvbiBFeHBvc2VkIFByb3BlcnRpZXMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI5YjAyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIuY3MKQEAgLTAsMCArMSwyMzMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERhdGFiYXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIKKyAgICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyR3JvdXAKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCisKKyAgICAgICAgI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIoCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZSgKKyAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImNmdm8iLCAiY29sb3IiIH07CisgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgPGRhdGFCYXI+IG5vZGUgaW5zaWRlIHRoZSA8Y2ZSdWxlPiBub2RlCisgICAgICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlIT1udWxsICYmIGl0ZW1FbGVtZW50Tm9kZS5IYXNDaGlsZE5vZGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgaGlnaD1mYWxzZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gaXRlbUVsZW1lbnROb2RlLlNlbGVjdE5vZGVzKCJkOmRhdGFCYXIvZDpjZnZvIiwgTmFtZVNwYWNlTWFuYWdlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGlnaCA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTG93VmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBIaWdoVmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpY29uU2V0Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICAgICAgICAgICAgTm9kZSwKKyAgICAgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkRhdGFCYXIpOworCisgICAgICAgICAgICAgICAgdmFyIGxvd05vZGUgPSBpY29uU2V0Tm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bywgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIGljb25TZXROb2RlLkFwcGVuZENoaWxkKGxvd05vZGUpOworICAgICAgICAgICAgICAgIExvd1ZhbHVlID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvd05vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKworICAgICAgICAgICAgICAgIHZhciBoaWdoTm9kZSA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQoaGlnaE5vZGUpOworICAgICAgICAgICAgICAgIEhpZ2hWYWx1ZSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXIsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyKAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICAgICAgaW50IHByaW9yaXR5LAorICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgICAgIDogdGhpcygKKyAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgICAgICBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIoCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgICAgICAgOiB0aGlzKAorICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3Nob3dWYWx1ZVBhdGg9ImQ6ZGF0YUJhci9Ac2hvd1ZhbHVlIjsKKyAgICAgICAgcHVibGljIGJvb2wgU2hvd1ZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfc2hvd1ZhbHVlUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfc2hvd1ZhbHVlUGF0aCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIExvd1ZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSGlnaFZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NvbG9yUGF0aCA9ICJkOmRhdGFCYXIvZDpjb2xvci9AcmdiIjsKKyAgICAgICAgcHVibGljIENvbG9yIENvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZ2I9R2V0WG1sTm9kZVN0cmluZyhfY29sb3JQYXRoKTsKKyAgICAgICAgICAgICAgICBpZighc3RyaW5nLklzTnVsbE9yRW1wdHkocmdiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihpbnQuUGFyc2UocmdiLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5XaGl0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2NvbG9yUGF0aCwgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlZmNhOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MKQEAgLTAsMCArMSwxMTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlcywKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI1OGMzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoLmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FbmRzV2l0aDsKKyAgICAgICAgICAgIFRleHQgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW4gdGhlIGVuZCBvZiB0aGUgY2VsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlRleHRBdHRyaWJ1dGUpOworICAgICAgfQorICAgICAgc2V0CisgICAgICB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSwKKyAgICAgICAgICB2YWx1ZSk7CisKKyAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgIlJJR0hUKHswfSxMRU4oXCJ7MX1cIikpPVwiezF9XCIiLAorICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcywKKyAgICAgICAgICB2YWx1ZS5SZXBsYWNlKCJcIiIsICJcIlwiIikpOworICAgICAgfQorICAgIH0KKyAgICAjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzYTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbC5jcwpAQCAtMCwwICsxLDEyMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbCwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuRXF1YWw7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTM1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbi5jcwpAQCAtMCwwICsxLDEyMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24KKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkV4cHJlc3Npb24sCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3MTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldC5jcwpAQCAtMCwwICsxLDE4MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlPiwgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgICNlbmRyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlICE9IG51bGwgJiYgaXRlbUVsZW1lbnROb2RlLkhhc0NoaWxkTm9kZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGUgaWNvbk5vZGU0ID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmljb25TZXQvZDpjZnZvW3Bvc2l0aW9uKCk9NF0iLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIEljb240ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGU0LAorICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgWG1sTm9kZSBpY29uTm9kZTUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldC9kOmNmdm9bcG9zaXRpb24oKT01XSIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgSWNvbjUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAorICAgICAgICAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldCwKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgICAgICAgICBpY29uTm9kZTUsCisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgWG1sTm9kZSBpY29uU2V0Tm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDppY29uU2V0IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICB2YXIgaWNvbk5vZGU0ID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgIGljb25TZXROb2RlLkFwcGVuZENoaWxkKGljb25Ob2RlNCk7CisKKyAgICAgICAgICAgIEljb240ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgNjAsCisgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICAgIGljb25Ob2RlNCwKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgIHZhciBpY29uTm9kZTUgPSBpY29uU2V0Tm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bywgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQoaWNvbk5vZGU1KTsKKworICAgICAgICAgICAgSWNvbjUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50LAorICAgICAgICAgICAgICAgICAgICA4MCwKKyAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCwKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGU1LAorICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjUKKyAgICB7CisgICAgICAgIGdldDsKKyAgICAgICAgaW50ZXJuYWwgc2V0OworICAgIH0KKworICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjQKKyAgICB7CisgICAgICAgIGdldDsKKyAgICAgICAgaW50ZXJuYWwgc2V0OworICAgIH0KKyAgfQorICB9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NDQxZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcwpAQCAtMCwwICsxLDE1NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiwgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4KKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgICNlbmRyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZihpdGVtRWxlbWVudE5vZGUhPW51bGwgJiYgaXRlbUVsZW1lbnROb2RlLkhhc0NoaWxkTm9kZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGUgaWNvbk5vZGU0ID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmljb25TZXQvZDpjZnZvW3Bvc2l0aW9uKCk9NF0iLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIEljb240ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGU0LAorICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGUgaWNvblNldE5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgdmFyIGljb25Ob2RlNCA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTQpOworCisKKyAgICAgICAgICAgIEljb240ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgNzUsCisgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICAgIGljb25Ob2RlNCwKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb240CisgICAgeworICAgICAgICBnZXQ7CisgICAgICAgIGludGVybmFsIHNldDsKKyAgICB9CisgICAgfQorICB9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZWNhYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbi5jcwpAQCAtMCwwICsxLDEyMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4KKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbiwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW47CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ2NTJiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbC5jcwpAQCAtMCwwICsxLDEyMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW5PckVxdWFsLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWw7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzBhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cworICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdDdEYXlzLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdDdEYXlzOworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJBTkQoVE9EQVkoKS1GTE9PUih7MH0sMSk8PTYsRkxPT1IoezB9LDEpPD1UT0RBWSgpKSIsCisgICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RNb250aC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ODlkNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGguY3MKQEAgLTAsMCArMSwxMjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0TW9udGgsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0TW9udGg7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIkFORChNT05USCh7MH0pPU1PTlRIKEVEQVRFKFRPREFZKCksMC0xKSksWUVBUih7MH0pPVlFQVIoRURBVEUoVE9EQVkoKSwwLTEpKSkiLAorICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2Vlay5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2Vlay5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzU2NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0V2VlaywKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgVGltZVBlcmlvZCA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RXZWVrOworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJBTkQoVE9EQVkoKS1ST1VORERPV04oezB9LDApPj0oV0VFS0RBWShUT0RBWSgpKSksVE9EQVkoKS1ST1VORERPV04oezB9LDApPChXRUVLREFZKFRPREFZKCkpKzcpKSIsCisgICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2VlaygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNiMmFjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuLmNzCkBAIC0wLDAgKzEsMTIzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbgorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGVzc1RoYW4sCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuOworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbigKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3NGNmNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MKQEAgLTAsMCArMSwxMjMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbCwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTGVzc1RoYW5PckVxdWFsOworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dE1vbnRoLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODkzM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aC5jcwpAQCAtMCwwICsxLDEyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRNb250aCwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgVGltZVBlcmlvZCA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRNb250aDsKKyAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiQU5EKE1PTlRIKHswfSk9TU9OVEgoRURBVEUoVE9EQVkoKSwwKzEpKSwgWUVBUih7MH0pPVlFQVIoRURBVEUoVE9EQVkoKSwwKzEpKSkiLAorICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dE1vbnRoKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2Vlay5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2Vlay5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYxMGJkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWssCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5OZXh0V2VlazsKKyAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiQU5EKFJPVU5ERE9XTih7MH0sMCktVE9EQVkoKT4oNy1XRUVLREFZKFRPREFZKCkpKSxST1VORERPV04oezB9LDApLVRPREFZKCk8KDE1LVdFRUtEQVkoVE9EQVkoKSkpKSIsCisgICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2VlaygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2ZGQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90QmV0d2VlbiwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90QmV0d2VlbjsKKyAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBGb3JtdWxhMiA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4oCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA3ZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcworICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zQmxhbmtzLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIkxFTihUUklNKHswfSkpPjAiLAorICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzMDg5NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycy5jcwpAQCAtMCwwICsxLDEyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9ycywKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJOT1QoSVNFUlJPUih7MH0pKSIsCisgICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOGFjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc1RleHQsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLk5vdENvbnRhaW5zOworICAgICAgICAgICAgVGV4dCA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIHRleHQgdG8gc2VhcmNoIGluc2lkZSB0aGUgY2VsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlRleHRBdHRyaWJ1dGUpOworICAgICAgfQorICAgICAgc2V0CisgICAgICB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSwKKyAgICAgICAgICB2YWx1ZSk7CisKKyAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgIklTRVJST1IoU0VBUkNIKFwiezF9XCIsezB9KSkiLAorICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcywKKyAgICAgICAgICB2YWx1ZS5SZXBsYWNlKCJcIiIsICJcIlwiIikpOworICAgICAgfQorICAgIH0KKyAgICAjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkOGQwNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcwpAQCAtMCwwICsxLDEyMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbCwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90RXF1YWw7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjg1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZS5jcwpAQCAtMCwwICsxLDYyOCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGY7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGFic3RyYWN0IGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQorICAgIDogWG1sSGVscGVyLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKyAgICBwcml2YXRlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlPyBfdHlwZTsKKyAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNpbmFsaXplIHRoYXQgd2UgYXJlIGluIGEgQ25hZ2luZyBQcmlvcml0aWVzIG9wZWFydGlvbiBzbyB0aGF0IHdlIHdvbid0IGVudGVyCisgICAgLy8vIGEgcmVjdXJzaXZlIGxvb3AuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcml2YXRlIHN0YXRpYyBib29sIF9jaGFuZ2luZ1ByaW9yaXR5ID0gZmFsc2U7CisgICAgI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIi8+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPlVzZWQgYWxzbyBhcyB0aGUgY2ZSdWxlIHVuaXF1ZSBrZXk8L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgbmFtZXNwYWNlTWFuYWdlciwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlKQorICAgIHsKKyAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7CisgICAgICBSZXF1aXJlLkFyZ3VtZW50KHByaW9yaXR5KS5Jc0luUmFuZ2UoMSwgaW50Lk1heFZhbHVlLCAicHJpb3JpdHkiKTsKKyAgICAgIFJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOworCisgICAgICBfdHlwZSA9IHR5cGU7CisgICAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgICAgU2NoZW1hTm9kZU9yZGVyID0gX3dvcmtzaGVldC5TY2hlbWFOb2RlT3JkZXI7CisKKyAgICAgIGlmIChpdGVtRWxlbWVudE5vZGUgPT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgPGNmUnVsZT4gaW5zaWRlIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+CisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICAgIF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgInswfVt7MX09J3syfSddL3sxfT0nezJ9Jy97M31bezR9PSd7NX0nXS97NH09J3s1fSciLAorICAgICAgICAgIC8vezB9CisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db25kaXRpb25hbEZvcm1hdHRpbmcsCisgICAgICAgICAgLy8gezF9CisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5TcXJlZkF0dHJpYnV0ZSwKKyAgICAgICAgICAvLyB7Mn0KKyAgICAgICAgICAgIGFkZHJlc3MuQWRkcmVzc1NwYWNlU2VwYXJhdGVkLCAgICAgICAgICAvL0NGIG5vZGUgZG9uJ3Qgd2hhdCB0byBoYXZlIGNvbW1hIGJldHdlZW4gbXVsdGkgYWRkcmVzc2VzLCB1c2Ugc3BhY2UgaW5zdGVhZC4KKyAgICAgICAgICAvLyB7M30KKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmUnVsZSwKKyAgICAgICAgICAvL3s0fQorICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUHJpb3JpdHlBdHRyaWJ1dGUsCisgICAgICAgICAgLy97NX0KKyAgICAgICAgICAgIHByaW9yaXR5KSk7CisgICAgICB9CisKKyAgICAgIC8vIFBvaW50IHRvIDxjZlJ1bGU+CisgICAgICBUb3BOb2RlID0gaXRlbUVsZW1lbnROb2RlOworCisgICAgICBBZGRyZXNzID0gYWRkcmVzczsKKyAgICAgIFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgICBUeXBlID0gdHlwZTsKKyAgICAgIGlmIChEeGZJZCA+PSAwKQorICAgICAgeworICAgICAgICAgIHdvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuRHhmc1tEeGZJZF0uQWxsb3dDaGFuZ2UgPSB0cnVlOyAgLy9UaGlzIElkIGlzIHJlZmVyZW5jZWQgYnkgQ0YsIHNvIHdlIGNhbiB1c2UgaXQgd2hlbiB3ZSBzYXZlLgorICAgICAgICAgIF9zdHlsZSA9IHdvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuRHhmc1tEeGZJZF0uQ2xvbmUoKTsgICAgLy9DbG9uZSwgc28gaXQgY2FuIGJlIGFsdGVyZWQgd2l0aG91dCBlZmZlY3Rpbmcgb3RoZXIgZHhmIHN0eWxlcworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUiLz4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiB0aGlzKAorICAgICAgICB0eXBlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBNZXRob2RzCisgICAgI2VuZHJlZ2lvbiBNZXRob2RzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBHZXQgdGhlICZsdDtjZlJ1bGUmZ3Q7IG5vZGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBYbWxOb2RlIE5vZGUKKyAgICB7CisgICAgICBnZXQgeyByZXR1cm4gVG9wTm9kZTsgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkcmVzcyBvZiB0aGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFRoZSBhZGRyZXNzIGlzIHN0b3JlcyBpbiBhIHBhcmVudCBub2RlIGNhbGxlZCAmbHQ7Y29uZGl0aW9uYWxGb3JtYXR0aW5nJmd0OyBpbiB0aGUKKyAgICAvLy8gQHNxcmVmIGF0dHJpYnV0ZS4gRXhjZWwgZ3JvdXBzIHJ1bGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIGluc2lkZSBvbmUgbm9kZS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHB1YmxpYyBFeGNlbEFkZHJlc3MgQWRkcmVzcworICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzcygKKyAgICAgICAgICBOb2RlLlBhcmVudE5vZGUuQXR0cmlidXRlc1tFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLlNxcmVmXS5WYWx1ZSk7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFkZHJlc3MgaXMgdG8gYmUgY2hhbmdlZAorICAgICAgICBpZiAoQWRkcmVzcy5BZGRyZXNzICE9IHZhbHVlLkFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBTYXZlIHRoZSBvbGQgcGFyZW50ZSBub2RlCisgICAgICAgICAgWG1sTm9kZSBvbGROb2RlID0gTm9kZTsKKyAgICAgICAgICBYbWxOb2RlIG9sZFBhcmVudE5vZGUgPSBOb2RlLlBhcmVudE5vZGU7CisKKyAgICAgICAgICAvLyBDcmVhdGUvR2V0IHRoZSBuZXcgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gcGFyZW50IG5vZGUKKyAgICAgICAgICBYbWxOb2RlIG5ld1BhcmVudE5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJ7MH1bezF9PSd7Mn0nXS97MX09J3syfSciLAorICAgICAgICAgICAgLy97MH0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLAorICAgICAgICAgICAgLy8gezF9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlNxcmVmQXR0cmlidXRlLAorICAgICAgICAgICAgLy8gezJ9CisgICAgICAgICAgICAgIHZhbHVlLkFkZHJlc3NTcGFjZVNlcGFyYXRlZCkpOyAKKworICAgICAgICAgIC8vIE1vdmUgdGhlIDxjZlJ1bGU+IG5vZGUgdG8gdGhlIG5ldyA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBwYXJlbnQgbm9kZQorICAgICAgICAgIFRvcE5vZGUgPSBuZXdQYXJlbnROb2RlLkFwcGVuZENoaWxkKE5vZGUpOworCisgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9sZCA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBwYXJlbnQgbm9kZSBoYXMgPGNmUnVsZT4gbm9kZSBpbnNpZGUgaXQKKyAgICAgICAgICBpZiAoIW9sZFBhcmVudE5vZGUuSGFzQ2hpbGROb2RlcykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBwYXJlbnQgbm9kZQorICAgICAgICAgICAgb2xkUGFyZW50Tm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG9sZFBhcmVudE5vZGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHlwZSBvZiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFNUX0NmVHlwZSDCpzE4LjE4LjEyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIFR5cGUKKyAgICB7CisgICAgICBnZXQKKyAgICAgIHsKKyAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBAdHlwZSBhdHRyaWJ1dGUgdG8gRVBQbHVzIFJ1bGUgVHlwZSAoc2xpZ2h0eSBkaWZlcmVudGUpCisgICAgICAgIGlmKF90eXBlPT1udWxsKQorICAgICAgICB7CisgICAgICAgICAgX3R5cGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdldFR5cGVCeUF0dHJiaXV0ZSgKKyAgICAgICAgICBHZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlR5cGVBdHRyaWJ1dGUpLAorICAgICAgICAgIFRvcE5vZGUsCisgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlKV90eXBlOworICAgICAgfQorICAgICAgaW50ZXJuYWwgc2V0CisgICAgICB7CisgICAgICAgICAgX3R5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIEVQUGx1cyBSdWxlIFR5cGUgdG8gQHR5cGUgYXR0cmlidXRlIChzbGlnaHR5IGRpZmVyZW50ZSkKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UeXBlQXR0cmlidXRlLAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR2V0QXR0cmlidXRlQnlUeXBlKHZhbHVlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBwcmlvcml0eSBvZiB0aGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZQorICAgIC8vLyB3aGljaCBmb3JtYXQgc2hvdWxkIGJlIGV2YWx1YXRlZCBhbmQgcmVuZGVyZWQuIExvd2VyIG51bWVyaWMgdmFsdWVzIGFyZSBoaWdoZXIKKyAgICAvLy8gcHJpb3JpdHkgdGhhbiBoaWdoZXIgbnVtZXJpYyB2YWx1ZXMsIHdoZXJlIDEgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50IFByaW9yaXR5CisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlByaW9yaXR5QXR0cmlidXRlKTsKKyAgICAgIH0KKyAgICAgIHNldAorICAgICAgeworICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IENGIHJ1bGUgcHJpb3JpdHkKKyAgICAgICAgaW50IHByaW9yaXR5ID0gUHJpb3JpdHk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBwcmlvcml0eSBpcyB0byBiZSBjaGFuZ2VkCisgICAgICAgIGlmIChwcmlvcml0eSAhPSB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBpbnNpZGUgYSAiQ2hhbmdlIFByaW9yaXR5IiBvcGVyYXRpb24KKyAgICAgICAgICBpZiAoIV9jaGFuZ2luZ1ByaW9yaXR5KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA8IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLkludmFsaWRQcmlvcml0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNpbmFsaXplIHRoYXQgd2UgYXJlIGFscmVhZHkgY2hhbmdpbmcgY2ZSdWxlcyBwcmlvcml0aWVzCisgICAgICAgICAgICBfY2hhbmdpbmdQcmlvcml0eSA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGxvd2VyZWQgdGhlIHByaW9yaXR5CisgICAgICAgICAgICBpZiAocHJpb3JpdHkgPiB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByaW9yaXR5IC0gMTsgaSA+PSB2YWx1ZTsgaS0tKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNmUnVsZSA9IF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJ1bGVzQnlQcmlvcml0eShpKTsKKworICAgICAgICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjZlJ1bGUuUHJpb3JpdHkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByaW9yaXR5ICsgMTsgaSA8PSB2YWx1ZTsgaSsrKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNmUnVsZSA9IF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJ1bGVzQnlQcmlvcml0eShpKTsKKworICAgICAgICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjZlJ1bGUuUHJpb3JpdHktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2luYWxpemUgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGNoYW5naW5nIGNmUnVsZXMgcHJpb3JpdGllcworICAgICAgICAgICAgX2NoYW5naW5nUHJpb3JpdHkgPSBmYWxzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBDaGFuZ2UgdGhlIHByaW9yaXR5IGluIHRoZSBYTUwKKyAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUHJpb3JpdHlBdHRyaWJ1dGUsCisgICAgICAgICAgICB2YWx1ZS5Ub1N0cmluZygpLAorICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIElmIHRoaXMgZmxhZyBpcyB0cnVlLCBubyBydWxlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHNoYWxsIGJlIGFwcGxpZWQgb3ZlciB0aGlzIHJ1bGUsCisgICAgLy8vIHdoZW4gdGhpcyBydWxlIGV2YWx1YXRlcyB0byB0cnVlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGJvb2wgU3RvcElmVHJ1ZQorICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuU3RvcElmVHJ1ZUF0dHJpYnV0ZSk7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5TdG9wSWZUcnVlQXR0cmlidXRlLAorICAgICAgICAgICh2YWx1ZSA9PSB0cnVlKSA/ICIxIiA6IHN0cmluZy5FbXB0eSwKKyAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIER4ZklkIFN0eWxlIEF0dHJpYnV0ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgaW50IER4ZklkCisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkR4ZklkQXR0cmlidXRlKTsKKyAgICAgIH0KKyAgICAgIHNldAorICAgICAgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkR4ZklkQXR0cmlidXRlLAorICAgICAgICAgICh2YWx1ZSA9PSBpbnQuTWluVmFsdWUpID8gc3RyaW5nLkVtcHR5IDogdmFsdWUuVG9TdHJpbmcoKSwKKyAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW50ZXJuYWwgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyBfc3R5bGUgPSBudWxsOworICAgIHB1YmxpYyBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIFN0eWxlCisgICAgeworICAgICAgICBnZXQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHlsZSA9IG5ldyBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nKE5hbWVTcGFjZU1hbmFnZXIsIG51bGwsIF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3R5bGU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTdGREZXYgKHplcm8gaXMgbm90IGFsbG93ZWQgYW5kIHdpbGwgYmUgY29udmVydGVkIHRvIDEpCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgVUludDE2IFN0ZERldgorICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICByZXR1cm4gQ29udmVydC5Ub1VJbnQxNihHZXRYbWxOb2RlSW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlN0ZERldkF0dHJpYnV0ZSkpOworICAgICAgfQorICAgICAgc2V0CisgICAgICB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuU3RkRGV2QXR0cmlidXRlLAorICAgICAgICAgICh2YWx1ZSA9PSAwKSA/ICIxIiA6IHZhbHVlLlRvU3RyaW5nKCksCisgICAgICAgICAgdHJ1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSYW5rICh6ZXJvIGlzIG5vdCBhbGxvd2VkIGFuZCB3aWxsIGJlIGNvbnZlcnRlZCB0byAxKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIFVJbnQxNiBSYW5rCisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBDb252ZXJ0LlRvVUludDE2KEdldFhtbE5vZGVJbnQoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUmFua0F0dHJpYnV0ZSkpOworICAgICAgfQorICAgICAgc2V0CisgICAgICB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUmFua0F0dHJpYnV0ZSwKKyAgICAgICAgICAodmFsdWUgPT0gMCkgPyAiMSIgOiB2YWx1ZS5Ub1N0cmluZygpLAorICAgICAgICAgIHRydWUpOworICAgICAgfQorICAgIH0KKyAgICAjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIEludGVybmFsIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFib3ZlQXZlcmFnZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IEFib3ZlQXZlcmFnZQorICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICBib29sPyBhYm92ZUF2ZXJhZ2UgPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkFib3ZlQXZlcmFnZUF0dHJpYnV0ZSk7CisKKyAgICAgICAgLy8gQWJvdmUgQXZhcmVnZSBpZiBUUlVFIG9yIGlmIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdHMKKyAgICAgICAgcmV0dXJuIChhYm92ZUF2ZXJhZ2UgPT0gdHJ1ZSkgfHwgKGFib3ZlQXZlcmFnZSA9PSBudWxsKTsKKyAgICAgIH0KKyAgICAgIHNldAorICAgICAgeworICAgICAgICBzdHJpbmcgYWJvdmVBdmVyYWdlVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisKKyAgICAgICAgLy8gT25seSB0aGUgdHlwZXMgdGhhdCBuZWVkcyB0aGUgQEFib3ZlQXZlcmFnZQorICAgICAgICBpZiAoKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93QXZlcmFnZSkKKyAgICAgICAgICB8fCAoX3R5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dPckVxdWFsQXZlcmFnZSkKKyAgICAgICAgICB8fCAoX3R5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dTdGREZXYpKQorICAgICAgICB7CisgICAgICAgICAgYWJvdmVBdmVyYWdlVmFsdWUgPSAiMCI7CisgICAgICAgIH0KKworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkFib3ZlQXZlcmFnZUF0dHJpYnV0ZSwKKyAgICAgICAgICBhYm92ZUF2ZXJhZ2VWYWx1ZSwKKyAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEVxdWFsQXZlcmFnZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IEVxdWFsQXZlcmFnZQorICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICBib29sPyBlcXVhbEF2ZXJhZ2UgPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkVxdWFsQXZlcmFnZUF0dHJpYnV0ZSk7CisKKyAgICAgICAgLy8gRXF1YWwgQXZhcmVnZSBvbmx5IGlmIFRSVUUKKyAgICAgICAgcmV0dXJuIChlcXVhbEF2ZXJhZ2UgPT0gdHJ1ZSk7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgc3RyaW5nIGVxdWFsQXZlcmFnZVZhbHVlID0gc3RyaW5nLkVtcHR5OworCisgICAgICAgIC8vIE9ubHkgdGhlIHR5cGVzIHRoYXQgbmVlZHMgdGhlIEBFcXVhbEF2ZXJhZ2UKKyAgICAgICAgaWYgKChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZU9yRXF1YWxBdmVyYWdlKQorICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlKSkKKyAgICAgICAgeworICAgICAgICAgIGVxdWFsQXZlcmFnZVZhbHVlID0gIjEiOworICAgICAgICB9CisKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5FcXVhbEF2ZXJhZ2VBdHRyaWJ1dGUsCisgICAgICAgICAgZXF1YWxBdmVyYWdlVmFsdWUsCisgICAgICAgICAgdHJ1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCb3R0b20gYXR0cmlidXRlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgYm9vbD8gQm90dG9tCisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIGJvb2w/IGJvdHRvbSA9IEdldFhtbE5vZGVCb29sTnVsbGFibGUoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQm90dG9tQXR0cmlidXRlKTsKKworICAgICAgICAvLyBCb3R0b20gaWYgVFJVRQorICAgICAgICByZXR1cm4gKGJvdHRvbSA9PSB0cnVlKTsKKyAgICAgIH0KKyAgICAgIHNldAorICAgICAgeworICAgICAgICBzdHJpbmcgYm90dG9tVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisKKyAgICAgICAgLy8gT25seSB0aGUgdHlwZXMgdGhhdCBuZWVkcyB0aGUgQEJvdHRvbQorICAgICAgICBpZiAoKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbSkKKyAgICAgICAgICB8fCAoX3R5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tUGVyY2VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBib3R0b21WYWx1ZSA9ICIxIjsKKyAgICAgICAgfQorCisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQm90dG9tQXR0cmlidXRlLAorICAgICAgICAgIGJvdHRvbVZhbHVlLAorICAgICAgICAgIHRydWUpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUGVyY2VudCBhdHRyaWJ1dGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHByb3RlY3RlZCBib29sPyBQZXJjZW50CisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIGJvb2w/IHBlcmNlbnQgPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlBlcmNlbnRBdHRyaWJ1dGUpOworCisgICAgICAgIC8vIEJvdHRvbSBpZiBUUlVFCisgICAgICAgIHJldHVybiAocGVyY2VudCA9PSB0cnVlKTsKKyAgICAgIH0KKyAgICAgIHNldAorICAgICAgeworICAgICAgICBzdHJpbmcgcGVyY2VudFZhbHVlID0gc3RyaW5nLkVtcHR5OworCisgICAgICAgIC8vIE9ubHkgdGhlIHR5cGVzIHRoYXQgbmVlZHMgdGhlIEBCb3R0b20KKyAgICAgICAgaWYgKChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50KQorICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50KSkKKyAgICAgICAgeworICAgICAgICAgIHBlcmNlbnRWYWx1ZSA9ICIxIjsKKyAgICAgICAgfQorCisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUGVyY2VudEF0dHJpYnV0ZSwKKyAgICAgICAgICBwZXJjZW50VmFsdWUsCisgICAgICAgICAgdHJ1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaW1lUGVyaW9kCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUgVGltZVBlcmlvZAorICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5HZXRUeXBlQnlBdHRyaWJ1dGUoCisgICAgICAgICAgR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UaW1lUGVyaW9kQXR0cmlidXRlKSk7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UaW1lUGVyaW9kQXR0cmlidXRlLAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuR2V0QXR0cmlidXRlQnlUeXBlKHZhbHVlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIE9wZXJhdG9yCisgICAgeworICAgICAgZ2V0CisgICAgICB7CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5HZXRUeXBlQnlBdHRyaWJ1dGUoCisgICAgICAgICAgR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5PcGVyYXRvckF0dHJpYnV0ZSkpOworICAgICAgfQorICAgICAgc2V0CisgICAgICB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuT3BlcmF0b3JBdHRyaWJ1dGUsCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR2V0QXR0cmlidXRlQnlUeXBlKHZhbHVlKSwKKyAgICAgICAgICB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZvcm11bGEKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYQorICAgIHsKKyAgICAgIGdldAorICAgICAgeworICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKTsKKyAgICAgIH0KKyAgICAgIHNldAorICAgICAgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkZvcm11bGEsCisgICAgICAgICAgdmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRm9ybXVsYTIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYTIKKyAgICB7CisgICAgICBnZXQKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0yXSIsCisgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKSk7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgZmlyc3QgPGZvcm11bGE+IG5vZGUgKGVuc3VyZSB0aGF0IGl0IGV4aXN0cykKKyAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICAgIFRvcE5vZGUsCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0xXSIsCisgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgc2Vjb25kZSA8Zm9ybXVsYT4gbm9kZSAoZW5zdXJlIHRoYXQgaXQgZXhpc3RzKQorICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICAgIFRvcE5vZGUsCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0yXSIsCisgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKSk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgZm9ybXVsYSBpbiB0aGUgc2Vjb25kIDxmb3JtdWxhPiBub2RlCisgICAgICAgIHNlY29uZE5vZGUuSW5uZXJUZXh0ID0gdmFsdWU7CisgICAgICB9CisgICAgfQorICAgICNlbmRyZWdpb24gSW50ZXJuYWwgUHJvcGVydGllcworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwNGNhNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGguY3MKQEAgLTAsMCArMSwxMjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGgKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzTW9udGgsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIkFORChNT05USCh7MH0pPU1PTlRIKFRPREFZKCkpLCBZRUFSKHswfSk9WUVBUihUT0RBWSgpKSkiLAorICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGgoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2Vlay5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2Vlay5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFhOGFkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc1dlZWssCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzV2VlazsKKyAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiQU5EKFRPREFZKCktUk9VTkRET1dOKHswfSwwKTw9V0VFS0RBWShUT0RBWSgpKS0xLFJPVU5ERE9XTih7MH0sMCktVE9EQVkoKTw9Ny1XRUVLREFZKFRPREFZKCkpKSIsCisgICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2VlaygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNmQ0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzCkBAIC0wLDAgKzEsMjA3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZQorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZQorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJpdmF0ZSBMb3cgVmFsdWUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByaXZhdGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgX2xvd1ZhbHVlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcml2YXRlIE1pZGRsZSBWYWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJpdmF0ZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBfbWlkZGxlVmFsdWU7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByaXZhdGUgSGlnaCBWYWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJpdmF0ZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBfaGlnaFZhbHVlOworICAgICNlbmRyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgLy8gQ3JlYXRlIHRoZSA8Y29sb3JTY2FsZT4gbm9kZSBpbnNpZGUgdGhlIDxjZlJ1bGU+IG5vZGUKKyAgICAgIHZhciBjb2xvclNjYWxlTm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICBOb2RlLAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvclNjYWxlKTsKKworICAgICAgLy8gTG93VmFsdWUgZGVmYXVsdAorICAgICAgTG93VmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uTG93LAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluLAorICAgICAgICBDb2xvclRyYW5zbGF0b3IuRnJvbUh0bWwoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ29sb3JzLkNmdm9Mb3dWYWx1ZSksCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZSwKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgIC8vIE1pZGRsZVZhbHVlIGRlZmF1bHQKKyAgICAgIE1pZGRsZVZhbHVlID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uLk1pZGRsZSwKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQsCisgICAgICAgIENvbG9yVHJhbnNsYXRvci5Gcm9tSHRtbChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Db2xvcnMuQ2Z2b01pZGRsZVZhbHVlKSwKKyAgICAgICAgNTAsCisgICAgICAgIHN0cmluZy5FbXB0eSwKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKTsKKworICAgICAgLy8gSGlnaFZhbHVlIGRlZmF1bHQKKyAgICAgIEhpZ2hWYWx1ZSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbi5IaWdoLAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4LAorICAgICAgICBDb2xvclRyYW5zbGF0b3IuRnJvbUh0bWwoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ29sb3JzLkNmdm9IaWdoVmFsdWUpLAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBMb3cgVmFsdWUgZm9yIFRocmVlIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIExvd1ZhbHVlCisgICAgeworICAgICAgZ2V0IHsgcmV0dXJuIF9sb3dWYWx1ZTsgfQorICAgICAgc2V0IHsgX2xvd1ZhbHVlID0gdmFsdWU7IH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE1pZGRsZSBWYWx1ZSBmb3IgVGhyZWUgQ29sb3IgU2NhbGUgT2JqZWN0IFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgTWlkZGxlVmFsdWUKKyAgICB7CisgICAgICBnZXQgeyByZXR1cm4gX21pZGRsZVZhbHVlOyB9CisgICAgICBzZXQgeyBfbWlkZGxlVmFsdWUgPSB2YWx1ZTsgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSGlnaCBWYWx1ZSBmb3IgVGhyZWUgQ29sb3IgU2NhbGUgT2JqZWN0IFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgSGlnaFZhbHVlCisgICAgeworICAgICAgZ2V0IHsgcmV0dXJuIF9oaWdoVmFsdWU7IH0KKyAgICAgIHNldCB7IF9oaWdoVmFsdWUgPSB2YWx1ZTsgfQorICAgIH0KKyAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzE5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzCkBAIC0wLDAgKzEsMzgwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0IDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlPgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQoCisgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZSgKKyAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAorICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEJhc2U8VD4KKyAgICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8VD4KKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCisKKyAgICAgICAgI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRCYXNlKAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICAgICAgaW50IHByaW9yaXR5LAorICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGUgIT0gbnVsbCAmJiBpdGVtRWxlbWVudE5vZGUuSGFzQ2hpbGROb2RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gMTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gaXRlbUVsZW1lbnROb2RlLlNlbGVjdE5vZGVzKCJkOmljb25TZXQvZDpjZnZvIiwgTmFtZVNwYWNlTWFuYWdlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihwb3M9PTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEljb24xID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3MgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSWNvbjIgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvcyA9PSAzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJY29uMyA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGljb25TZXROb2RlID0gQ3JlYXRlQ29tcGxleE5vZGUoCisgICAgICAgICAgICAgICAgICBOb2RlLAorICAgICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuSWNvblNldCk7CisKKyAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgPGljb25TZXQ+IG5vZGUgaW5zaWRlIHRoZSA8Y2ZSdWxlPiBub2RlCisgICAgICAgICAgICAgICAgZG91YmxlIHNwYW5uOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwYW5uID0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwYW5uID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3Bhbm4gPSA1OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBpY29uTm9kZTEgPSBpY29uU2V0Tm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bywgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIGljb25TZXROb2RlLkFwcGVuZENoaWxkKGljb25Ob2RlMSk7CisgICAgICAgICAgICAgICAgSWNvbjEgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICB2YXIgaWNvbk5vZGUyID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTIpOworICAgICAgICAgICAgICAgIEljb24yID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguUm91bmQoMTAwRCAvIHNwYW5uLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICB2YXIgaWNvbk5vZGUzID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTMpOworICAgICAgICAgICAgICAgIEljb24zID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguUm91bmQoMTAwRCAqICgyRCAvIHNwYW5uKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGljb25Ob2RlMywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIFR5cGUgPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZSgKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAorICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgICAgICA6IHRoaXMoCisgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAgICAgbnVsbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRCYXNlKAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICAgICAgaW50IHByaW9yaXR5LAorICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgICAgICAgIDogdGhpcygKKyAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgbnVsbCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0dGluZ3MgZm9yIGljb24gMSBpbiB0aGUgaWNvbnNldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24xCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHRpbmdzIGZvciBpY29uIDIgaW4gdGhlIGljb25zZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBJY29uMgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0dGluZ3MgZm9yIGljb24gMiBpbiB0aGUgaWNvbnNldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfcmV2ZXJzZVBhdGggPSAiZDppY29uU2V0L0ByZXZlcnNlIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGljb25zCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFJldmVyc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9yZXZlcnNlUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX3JldmVyc2VQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc2hvd1ZhbHVlUGF0aCA9ICJkOmljb25TZXQvQHNob3dWYWx1ZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBjZWxsIHZhbHVlcyBhcmUgdmlzaWJsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaG93VmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9zaG93VmFsdWVQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9zaG93VmFsdWVQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2ljb25TZXRQYXRoID0gImQ6aWNvblNldC9AaWNvblNldCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGUgb2YgaWNvbnNldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVCBJY29uU2V0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ID0gR2V0WG1sTm9kZVN0cmluZyhfaWNvblNldFBhdGgpOworICAgICAgICAgICAgICAgIHYgPSB2LlN1YnN0cmluZygxKTsgLy9Ta2lwIGZpcnN0IGljb24uCisgICAgICAgICAgICAgICAgcmV0dXJuIChUKUVudW0uUGFyc2UodHlwZW9mKFQpLCB2LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2ljb25TZXRQYXRoLCBHZXRJY29uU2V0U3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0SWNvblNldFN0cmluZyhUIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd3MiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI0QXJyb3dzIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dzR3JheSI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjRBcnJvd3NHcmF5IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiUmF0aW5nIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiNFJhdGluZyI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIlJlZFRvQmxhY2siOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI0UmVkVG9CbGFjayI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIlRyYWZmaWNMaWdodHMiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI0VHJhZmZpY0xpZ2h0cyI7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd3MiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI1QXJyb3dzIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dzR3JheSI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjVBcnJvd3NHcmF5IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiUXVhcnRlcnMiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI1UXVhcnRlcnMiOworICAgICAgICAgICAgICAgICAgICBjYXNlICJSYXRpbmciOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI1UmF0aW5nIjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5Ub1N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM0Fycm93cyI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkFycm93c0dyYXkiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzQXJyb3dzR3JheSI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkZsYWdzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM0ZsYWdzIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiU2lnbnMiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzU2lnbnMiOworICAgICAgICAgICAgICAgICAgICBjYXNlICJTeW1ib2xzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM1N5bWJvbHMiOworICAgICAgICAgICAgICAgICAgICBjYXNlICJTeW1ib2xzMiI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjNTeW1ib2xzMiI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIlRyYWZmaWNMaWdodHMxIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM1RyYWZmaWNMaWdodHMxIjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiVHJhZmZpY0xpZ2h0czIiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzVHJhZmZpY0xpZ2h0czIiOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdkODM2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcwpAQCAtMCwwICsxLDEyNiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICB0eXBlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICB0eXBlLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIHR5cGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxNzY2NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheS5jcwpAQCAtMCwwICsxLDEyNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5CisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAorICB7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvZGF5LAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9kYXk7CisgICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIkZMT09SKHswfSwxKT1UT0RBWSgpIiwKKyAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzgyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9tb3Jyb3cuY3MKQEAgLTAsMCArMSwxMjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdworICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9tb3Jyb3coCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdywKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKKyAgICAgICAgeworICAgICAgICAgICAgVGltZVBlcmlvZCA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvbW9ycm93OworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJGTE9PUih7MH0sMSk9VE9EQVkoKSsxIiwKKyAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBudWxsLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisgICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3AuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3ZjFjOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3AuY3MKQEAgLTAsMCArMSwxMjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3AKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9wLAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBCb3R0b20gPSBmYWxzZTsKKyAgICAgICAgICAgIFBlcmNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIFJhbmsgPSAxMDsgIC8vIEZpcnN0IDEwIHZhbHVlcworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3AoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyOTljYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50LmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50CisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudCgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcFBlcmNlbnQsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIEJvdHRvbSA9IGZhbHNlOworICAgICAgICAgICAgUGVyY2VudCA9IHRydWU7CisgICAgICAgICAgICBSYW5rID0gMTA7ICAvLyBGaXJzdCAxMCBwZXJjZW50CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzIyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZS5jcwpAQCAtMCwwICsxLDE4MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZworeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZQorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByaXZhdGUgTG93IFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcml2YXRlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIF9sb3dWYWx1ZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJpdmF0ZSBIaWdoIFZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcml2YXRlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIF9oaWdoVmFsdWU7CisgICAgI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgeworICAgICAgLy8gQ3JlYXRlIHRoZSA8Y29sb3JTY2FsZT4gbm9kZSBpbnNpZGUgdGhlIDxjZlJ1bGU+IG5vZGUKKyAgICAgIHZhciBjb2xvclNjYWxlTm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICBOb2RlLAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvclNjYWxlKTsKKworICAgICAgLy8gTG93VmFsdWUgZGVmYXVsdAorICAgICAgTG93VmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uTG93LAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluLAorICAgICAgICBDb2xvclRyYW5zbGF0b3IuRnJvbUh0bWwoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ29sb3JzLkNmdm9Mb3dWYWx1ZSksCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgICAvLyBIaWdoVmFsdWUgZGVmYXVsdAorICAgICAgSGlnaFZhbHVlID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uLkhpZ2gsCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NYXgsCisgICAgICAgIENvbG9yVHJhbnNsYXRvci5Gcm9tSHRtbChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Db2xvcnMuQ2Z2b0hpZ2hWYWx1ZSksCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGUsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIExvdyBWYWx1ZSBmb3IgVHdvIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIExvd1ZhbHVlCisgICAgeworICAgICAgZ2V0IHsgcmV0dXJuIF9sb3dWYWx1ZTsgfQorICAgICAgc2V0IHsgX2xvd1ZhbHVlID0gdmFsdWU7IH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhpZ2ggVmFsdWUgZm9yIFR3byBDb2xvciBTY2FsZSBPYmplY3QgVmFsdWUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBIaWdoVmFsdWUKKyAgICB7CisgICAgICBnZXQgeyByZXR1cm4gX2hpZ2hWYWx1ZTsgfQorICAgICAgc2V0IHsgX2hpZ2hWYWx1ZSA9IHZhbHVlOyB9CisgICAgfQorICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzMjIxMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MKQEAgLTAsMCArMSwxMTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKK3sKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICNyZWdpb24gQ29uc3RydWN0b3JzCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcygKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlcywKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzKAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICBudWxsKQorICAgIHsKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcygKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAgcHJpb3JpdHksCisgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgbnVsbCwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmU4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5LmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCit7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheQorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5LAorICAgICAgICBhZGRyZXNzLAorICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgd29ya3NoZWV0LAorICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAorICAgICAgICB7CisgICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuWWVzdGVyZGF5OworICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJGTE9PUih7MH0sMSk9VE9EQVkoKS0xIiwKKyAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheSgKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgbnVsbCkKKyAgICB7CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IHRoaXMoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIHByaW9yaXR5LAorICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgIG51bGwsCisgICAgICAgIG51bGwpCisgICAgeworICAgIH0KKyAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2MyMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbi5jcwpAQCAtMCwwICsxLDk1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0cworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIGZvciBkYXRhIHZhbGlkYXRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHJlc3Mgb2YgZGF0YSB2YWxpZGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEV4Y2VsQWRkcmVzcyBBZGRyZXNzIHsgZ2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZhbGlkYXRpb24gdHlwZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBWYWxpZGF0aW9uVHlwZSB7IGdldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb250cm9scyBob3cgRXhjZWwgd2lsbCBoYW5kbGUgaW52YWxpZCB2YWx1ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUgRXJyb3JTdHlsZXsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ1ZSBpZiBpbnB1dCBtZXNzYWdlIHNob3VsZCBiZSBzaG93bgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBib29sPyBBbGxvd0JsYW5rIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ1ZSBpZiBpbnB1dCBtZXNzYWdlIHNob3VsZCBiZSBzaG93bgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBib29sPyBTaG93SW5wdXRNZXNzYWdlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ1ZSBpZiBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBzaG93bi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgYm9vbD8gU2hvd0Vycm9yTWVzc2FnZSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpdGxlIG9mIGVycm9yIG1lc3NhZ2UgYm94IChzZWUgcHJvcGVydHkgU2hvd0Vycm9yTWVzc2FnZSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgc3RyaW5nIEVycm9yVGl0bGUgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFcnJvciBtZXNzYWdlIGJveCB0ZXh0IChzZWUgcHJvcGVydHkgU2hvd0Vycm9yTWVzc2FnZSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgc3RyaW5nIEVycm9yIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGl0bGUgb2YgaW5mbyBib3ggaWYgaW5wdXQgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gKHNlZSBwcm9wZXJ0eSBTaG93SW5wdXRNZXNzYWdlKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBzdHJpbmcgUHJvbXB0VGl0bGUgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmZvIG1lc3NhZ2UgdGV4dCAoc2VlIHByb3BlcnR5IFNob3dFcnJvck1lc3NhZ2UpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHN0cmluZyBQcm9tcHQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcnVlIGlmIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gdHlwZSBhbGxvd3Mgb3BlcmF0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGJvb2wgQWxsb3dzT3BlcmF0b3IgeyBnZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWRhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBWYWxpZGF0ZSgpOworCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uQW55LmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkFueS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBkZGFmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkFueS5jcwpAQCAtMCwwICsxLDQ1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYXppcSBZb3JrICAgCQkgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxNC0wOC0wOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEYXRhIHZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBBbnkgdmFsdWUgdmFsaWRhdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ZkYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbS5jcwpAQCAtMCwwICsxLDQ2IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEYXRhIHZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBjdXN0b20gdmFsaWRhdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20gOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYT4sIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTk2YjAzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzCkBAIC0wLDAgKzEsNDYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBkYXRldGltZSB2YWxpZGF0aW9ucworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWU+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhPcGVyYXRvcgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcwpAQCAtMCwwICsxLDQ2IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEYXRhIHZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBkZWNpbWFsIHZhbHVlcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsPiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0ODYzZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAorICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0cworeworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQ+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhPcGVyYXRvcgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWU0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCit7CisgICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3Q+CisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNmRkNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzCkBAIC0wLDAgKzEsNDYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERhdGEgdmFsaWRhdGlvbiBpbnRlcmZhY2UgZm9yIHRpbWUgdmFsaWRhdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZT4sIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFmMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhLmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8VD4gOiBJRXhjZWxEYXRhVmFsaWRhdGlvbgorICAgICAgICB3aGVyZSBUIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCisgICAgeworICAgICAgICBUIEZvcm11bGEgeyBnZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWRhMWVmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcwpAQCAtMCwwICsxLDUyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIHdpdGggdHdvIGZvcm11bGFzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj48L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyPFQ+IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxUPgorICAgICAgICB3aGVyZSBUIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb3JtdWxhIDIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVCBGb3JtdWxhMiB7IGdldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGJkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yLmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB3aXRoIGFuIG9wZXJhdG9yCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPcGVyYXRvciB0eXBlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvciBPcGVyYXRvciB7IGdldDsgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb24uY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJmZGRhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb24uY3MKQEAgLTAsMCArMSwzOTkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRXhjZWwgZGF0YXZhbGlkYXRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uIDogWG1sSGVscGVyLCBJRXhjZWxEYXRhVmFsaWRhdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2l0ZW1FbGVtZW50Tm9kZU5hbWUgPSAiZDpkYXRhVmFsaWRhdGlvbiI7CisKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZXJyb3JTdHlsZVBhdGggPSAiQGVycm9yU3R5bGUiOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZXJyb3JUaXRsZVBhdGggPSAiQGVycm9yVGl0bGUiOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZXJyb3JQYXRoID0gIkBlcnJvciI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9wcm9tcHRUaXRsZVBhdGggPSAiQHByb21wdFRpdGxlIjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Byb21wdFBhdGggPSAiQHByb21wdCI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9vcGVyYXRvclBhdGggPSAiQG9wZXJhdG9yIjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Nob3dFcnJvck1lc3NhZ2VQYXRoID0gIkBzaG93RXJyb3JNZXNzYWdlIjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Nob3dJbnB1dE1lc3NhZ2VQYXRoID0gIkBzaG93SW5wdXRNZXNzYWdlIjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3R5cGVNZXNzYWdlUGF0aCA9ICJAdHlwZSI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9zcXJlZlBhdGggPSAiQHNxcmVmIjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX2FsbG93QmxhbmtQYXRoID0gIkBhbGxvd0JsYW5rIjsKKyAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmluZyBfZm9ybXVsYTFQYXRoID0gImQ6Zm9ybXVsYTEiOworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaW5nIF9mb3JtdWxhMlBhdGggPSAiZDpmb3JtdWxhMiI7CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgICAgICAgIDogdGhpcyh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBudWxsKQorICAgICAgICB7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+d29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgICAgICA6IHRoaXMod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBudWxsKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij53b3Jrc2hlZXQgdGhhdCBvd25zIHRoZSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPlhtbCB0b3Agbm9kZSAoZGF0YVZhbGlkYXRpb25zKSB3aGVuIGltcG9ydGluZyB4bWw8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5YbWwgTmFtZXNwYWNlIG1hbmFnZXI8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIgIT0gbnVsbCA/IG5hbWVzcGFjZU1hbmFnZXIgOiB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGxPckVtcHR5KCJhZGRyZXNzIik7CisgICAgICAgICAgICBhZGRyZXNzID0gQ2hlY2tBbmRGaXhSYW5nZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy92YXIgeG1sRG9jID0gd29ya3NoZWV0LldvcmtzaGVldFhtbDsKKyAgICAgICAgICAgICAgICBUb3BOb2RlID0gd29ya3NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6ZGF0YVZhbGlkYXRpb25zIiwgd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIC8vIGRpZCBub3Qgc3VjY2VlZCB1c2luZyB0aGUgWG1sSGVscGVyIG1ldGhvZHMgaGVyZS4uLiBzbyBJJ20gY3JlYXRpbmcgdGhlIG5ldyBub2RlIHVzaW5nIFhtbERvY3VtZW50Li4uCisgICAgICAgICAgICAgICAgdmFyIG5zVXJpID0gTmFtZVNwYWNlTWFuYWdlci5Mb29rdXBOYW1lc3BhY2UoImQiKTsKKyAgICAgICAgICAgICAgICAvL2l0ZW1FbGVtZW50Tm9kZSA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KF9pdGVtRWxlbWVudE5vZGVOYW1lLCBuc1VyaSk7CisgICAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlID0gVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoX2l0ZW1FbGVtZW50Tm9kZU5hbWUuU3BsaXQoJzonKVsxXSwgbnNVcmkpOworICAgICAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoaXRlbUVsZW1lbnROb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRvcE5vZGUgPSBpdGVtRWxlbWVudE5vZGU7CisgICAgICAgICAgICBWYWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRpb25UeXBlOworICAgICAgICAgICAgQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNldCBzY2hlbWEgbm9kZSBvcmRlcgorICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdeyAKKyAgICAgICAgICAgICAgICAidHlwZSIsIAorICAgICAgICAgICAgICAgICJlcnJvclN0eWxlIiwgCisgICAgICAgICAgICAgICAgIm9wZXJhdG9yIiwgCisgICAgICAgICAgICAgICAgImFsbG93QmxhbmsiLAorICAgICAgICAgICAgICAgICJzaG93SW5wdXRNZXNzYWdlIiwgCisgICAgICAgICAgICAgICAgInNob3dFcnJvck1lc3NhZ2UiLCAKKyAgICAgICAgICAgICAgICAiZXJyb3JUaXRsZSIsIAorICAgICAgICAgICAgICAgICJlcnJvciIsIAorICAgICAgICAgICAgICAgICJwcm9tcHRUaXRsZSIsIAorICAgICAgICAgICAgICAgICJwcm9tcHQiLCAKKyAgICAgICAgICAgICAgICAic3FyZWYiLAorICAgICAgICAgICAgICAgICJmb3JtdWxhMSIsCisgICAgICAgICAgICAgICAgImZvcm11bGEyIgorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIENoZWNrQW5kRml4UmFuZ2VBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWRkcmVzcy5Db250YWlucygnLCcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk11bHRpcGxlIGFkZHJlc3NlcyBtYXkgbm90IGJlIGNvbW1hc2VwYXJhdGVkLCB1c2Ugc3BhY2UgaW5zdGVhZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKGFkZHJlc3MsIEAiW0EtWl0rOltBLVpdKyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXROdWxsYWJsZUJvb2xWYWx1ZShzdHJpbmcgcGF0aCwgYm9vbD8gdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsLkhhc1ZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKHBhdGgsIHZhbC5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgdmFsaWRhdGUgdGhlIHN0YXRlIG9mIHRoZSB2YWxpZGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPklmIHRoZSBzdGF0ZSBicmVha3MgdGhlIHJ1bGVzIG9mIHRoZSB2YWxpZGF0aW9uPC9leGNlcHRpb24+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVmFsaWRhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IEFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIEZvcm11bGExCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybXVsYTFJbnRlcm5hbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZhbGlkYXRpb24gb2YgIiArIGFkZHJlc3MgKyAiIGZhaWxlZDogRm9ybXVsYTEgY2Fubm90IGJlIGVtcHR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFB1YmxpYyBwcm9wZXJ0aWVzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgdmFsaWRhdGlvbiB0eXBlIGFsbG93cyBvcGVyYXRvciB0byBiZSBzZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93c09wZXJhdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0aW9uVHlwZS5BbGxvd09wZXJhdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcmVzcyBvZiBkYXRhIHZhbGlkYXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzcyBBZGRyZXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzKEdldFhtbE5vZGVTdHJpbmcoX3NxcmVmUGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpdmF0ZSBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IEFkZHJlc3NVdGlsaXR5LlBhcnNlRW50aXJlQ29sdW1uU2VsZWN0aW9ucyh2YWx1ZS5BZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zcXJlZlBhdGgsIGFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZhbGlkYXRpb24gdHlwZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgVmFsaWRhdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR5cGVTdHJpbmcgPSBHZXRYbWxOb2RlU3RyaW5nKF90eXBlTWVzc2FnZVBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5HZXRCeVNjaGVtYU5hbWUodHlwZVN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3R5cGVNZXNzYWdlUGF0aCwgdmFsdWUuU2NoZW1hTmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPcGVyYXRvciBmb3IgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBlbnRlcmVkIHZhbHVlIGFuZCBGb3JtdWxhL0Zvcm11bGFzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yIE9wZXJhdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvclN0cmluZyA9IEdldFhtbE5vZGVTdHJpbmcoX29wZXJhdG9yUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShvcGVyYXRvclN0cmluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvcilFbnVtLlBhcnNlKHR5cGVvZihFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IpLCBvcGVyYXRvclN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRpb25UeXBlLkFsbG93T3BlcmF0b3IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiB0eXBlIGRvZXMgbm90IGFsbG93IG9wZXJhdG9yIHRvIGJlIHNldCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9vcGVyYXRvclBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2FybmluZyBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZSBFcnJvclN0eWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlcnJvclN0eWxlU3RyaW5nID0gR2V0WG1sTm9kZVN0cmluZyhfZXJyb3JTdHlsZVBhdGgpOworICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZXJyb3JTdHlsZVN0cmluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZSksIGVycm9yU3R5bGVTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS51bmRlZmluZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS51bmRlZmluZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9lcnJvclN0eWxlUGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Vycm9yU3R5bGVQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRydWUgaWYgYmxhbmtzIHNob3VsZCBiZSBhbGxvd2VkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sPyBBbGxvd0JsYW5rCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKF9hbGxvd0JsYW5rUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXROdWxsYWJsZUJvb2xWYWx1ZShfYWxsb3dCbGFua1BhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRydWUgaWYgaW5wdXQgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2w/IFNob3dJbnB1dE1lc3NhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sTnVsbGFibGUoX3Nob3dJbnB1dE1lc3NhZ2VQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldE51bGxhYmxlQm9vbFZhbHVlKF9zaG93SW5wdXRNZXNzYWdlUGF0aCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ1ZSBpZiBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBzaG93bgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbD8gU2hvd0Vycm9yTWVzc2FnZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShfc2hvd0Vycm9yTWVzc2FnZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0TnVsbGFibGVCb29sVmFsdWUoX3Nob3dFcnJvck1lc3NhZ2VQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaXRsZSBvZiBlcnJvciBtZXNzYWdlIGJveAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEVycm9yVGl0bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX2Vycm9yVGl0bGVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Vycm9yVGl0bGVQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFcnJvciBtZXNzYWdlIGJveCB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRXJyb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX2Vycm9yUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9lcnJvclBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgUHJvbXB0VGl0bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX3Byb21wdFRpdGxlUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9wcm9tcHRUaXRsZVBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgUHJvbXB0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9wcm9tcHRQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3Byb21wdFBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvcm11bGEgMQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIEZvcm11bGExSW50ZXJuYWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX2Zvcm11bGExUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb3JtdWxhIDIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBGb3JtdWxhMkludGVybmFsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9mb3JtdWxhMlBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIFNldFZhbHVlPFQ+KE51bGxhYmxlPFQ+IHZhbCwgc3RyaW5nIHBhdGgpCisgICAgICAgICAgICB3aGVyZSBUIDogc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdmFsLkhhc1ZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgc3RyaW5nVmFsdWUgPSB2YWwuVmFsdWUuVG9TdHJpbmcoKS5SZXBsYWNlKCcsJywgJy4nKTsKKyAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcocGF0aCwgc3RyaW5nVmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkFueS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZhZTFlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MKQEAgLTAsMCArMSw5MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmF6aXEgWW9yayAgIAkJICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTQtMDgtMDgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW55IHZhbHVlIHZhbGlkYXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkFueSA6IEV4Y2VsRGF0YVZhbGlkYXRpb24sIElFeGNlbERhdGFWYWxpZGF0aW9uQW55CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQW55KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQW55KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25BbnkoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIHZhbGlkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBWYWxpZGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTM3OTFiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uLmNzCkBAIC0wLDAgKzEsNDA4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCisgKiBNYXRzIEFsbSAgICAgICAgICAgICAgICAgICAgICAgICBBcHBseWluZyBwYXRjaCBzdWJtaXR0ZWQgICAgMjAxMS0xMS0xNAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgVGVkIEhlYXRoZXJpbmd0b24KKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKiBSYXppcSBZb3JrCQkgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgQW55IHR5cGUgIDIwMTQtMDgtMDgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIENvbGxlY3Rpb24gb2YgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+LiBUaGlzIGNsYXNzIGlzIHByb3ZpZGluZyB0aGUgQVBJIGZvciBFUFBsdXMgZGF0YSB2YWxpZGF0aW9uLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vIDxwYXJhPgorICAgIC8vLyBUaGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyAoQWRkWy4uLl1WYWxpZGF0aW9uKSB3aWxsIGNyZWF0ZSBhIGRhdGF2YWxpZGF0aW9uIGVudHJ5IGluIHRoZSB3b3Jrc2hlZXQuIFdoZW4gdGhpcworICAgIC8vLyB2YWxpZGF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQgY2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyB3aWxsIGFmZmVjdCB0aGUgd29ya2Jvb2sgaW1tZWRpYXRlbHkuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIEVhY2ggdHlwZSBvZiB2YWxpZGF0aW9uIGhhcyBlaXRoZXIgYSBmb3JtdWxhIG9yIGEgdHlwZWQgdmFsdWUvdmFsdWVzLCBleGNlcHQgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHdoaWNoIGhhcyBhIGZvcm11bGEgb25seS4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gLy8gQWRkIGEgZGF0ZSB0aW1lIHZhbGlkYXRpb24KKyAgICAvLy8gdmFyIHZhbGlkYXRpb24gPSB3b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb24uQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOworICAgIC8vLyAvLyBzZXQgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzCisgICAgLy8vIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7CisgICAgLy8vIHZhbGlkYXRpb24uRXJyb3JUaXRsZSA9ICJBbiBpbnZhbGlkIGRhdGUgd2FzIGVudGVyZWQiOworICAgIC8vLyB2YWxpZGF0aW9uLkVycm9yID0gIlRoZSBkYXRlIG11c3QgYmUgYmV0d2VlbiAyMDExLTAxLTMxIGFuZCAyMDExLTEyLTMxIjsKKyAgICAvLy8gdmFsaWRhdGlvbi5Qcm9tcHQgPSAiRW50ZXIgZGF0ZSBoZXJlIjsKKyAgICAvLy8gdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlID0gRGF0ZVRpbWUuUGFyc2UoIjIwMTEtMDEtMDEiKTsKKyAgICAvLy8gdmFsaWRhdGlvbi5Gb3JtdWxhMi5WYWx1ZSA9IERhdGVUaW1lLlBhcnNlKCIyMDExLTEyLTMxIik7CisgICAgLy8vIHZhbGlkYXRpb24uT3BlcmF0b3IgPSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuYmV0d2VlbjsKKyAgICAvLy8gPC9jb2RlPgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxJRXhjZWxEYXRhVmFsaWRhdGlvbj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgTGlzdDxJRXhjZWxEYXRhVmFsaWRhdGlvbj4gX3ZhbGlkYXRpb25zID0gbmV3IExpc3Q8SUV4Y2VsRGF0YVZhbGlkYXRpb24+KCk7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldCA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgRGF0YVZhbGlkYXRpb25QYXRoID0gIi8vZDpkYXRhVmFsaWRhdGlvbnMiOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBEYXRhVmFsaWRhdGlvbkl0ZW1zUGF0aCA9IHN0cmluZy5Gb3JtYXQoInswfS9kOmRhdGFWYWxpZGF0aW9uIiwgRGF0YVZhbGlkYXRpb25QYXRoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gd29ya3NoZWV0LlNjaGVtYU5vZGVPcmRlcjsKKworICAgICAgICAgICAgLy8gY2hlY2sgZXhpc3Rpbmcgbm9kZXMgYW5kIGxvYWQgdGhlbQorICAgICAgICAgICAgdmFyIGRhdGFWYWxpZGF0aW9uTm9kZXMgPSB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLlNlbGVjdE5vZGVzKERhdGFWYWxpZGF0aW9uSXRlbXNQYXRoLCB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb25Ob2RlcyAhPSBudWxsICYmIGRhdGFWYWxpZGF0aW9uTm9kZXMuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBkYXRhVmFsaWRhdGlvbk5vZGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuQXR0cmlidXRlc1sic3FyZWYiXSA9PSBudWxsKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWRkciA9IG5vZGUuQXR0cmlidXRlc1sic3FyZWYiXS5WYWx1ZTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZVNjaGVtYSA9IG5vZGUuQXR0cmlidXRlc1sidHlwZSJdICE9IG51bGwgPyBub2RlLkF0dHJpYnV0ZXNbInR5cGUiXS5WYWx1ZSA6ICIiOworCisgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuR2V0QnlTY2hlbWFOYW1lKHR5cGVTY2hlbWEpOworICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKEV4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5LkNyZWF0ZSh0eXBlLCB3b3Jrc2hlZXQsIGFkZHIsIG5vZGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX3ZhbGlkYXRpb25zLkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBub2RlID0gX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZShEYXRhVmFsaWRhdGlvblBhdGgsIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoRGF0YVZhbGlkYXRpb25QYXRoLlRyaW1TdGFydCgnLycpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKQorICAgICAgICB7CisgICAgICAgICAgICAvL2lmIChUb3BOb2RlICE9IG51bGwpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIFNldFhtbE5vZGVTdHJpbmcoIkBjb3VudCIsIF92YWxpZGF0aW9ucy5Db3VudC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBYbWxOb2RlIEdldFJvb3ROb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICAgICAgICAgIFRvcE5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKERhdGFWYWxpZGF0aW9uUGF0aCwgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIHJldHVybiBUb3BOb2RlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGVzIGFkZHJlc3MgLSBub3QgZW1wdHksIGNvbGxpc2lvbnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpbmdWYWxpZGF0aW9uIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVBZGRyZXNzKHN0cmluZyBhZGRyZXNzLCBJRXhjZWxEYXRhVmFsaWRhdGlvbiB2YWxpZGF0aW5nVmFsaWRhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGxPckVtcHR5KCJhZGRyZXNzIik7CisKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBuZXcgYWRkcmVzcyBkb2VzIG5vdCBjb2xsaWRlIHdpdGggYW4gZXhpc3RpbmcgdmFsaWRhdGlvbi4KKyAgICAgICAgICAgIHZhciBuZXdBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChfdmFsaWRhdGlvbnMuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWxpZGF0aW9uIGluIF92YWxpZGF0aW9ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW5nVmFsaWRhdGlvbiAhPSBudWxsICYmIHZhbGlkYXRpbmdWYWxpZGF0aW9uID09IHZhbGlkYXRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0aW9uLkFkZHJlc3MuQ29sbGlkZShuZXdBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBFeGNlbEFkZHJlc3NCYXNlLmVBZGRyZXNzQ29sbGl0aW9uLk5vKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJUaGUgYWRkcmVzcyAoezB9KSBjb2xsaWRlcyB3aXRoIGFuIGV4aXN0aW5nIHZhbGlkYXRpb24gKHsxfSkiLCBhZGRyZXNzLCB2YWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGVzIGFsbCBkYXRhIHZhbGlkYXRpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCB2b2lkIFZhbGlkYXRlQWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZhbGlkYXRpb24gaW4gX3ZhbGlkYXRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uVmFsaWRhdGUoKTsKKworICAgICAgICAgICAgICAgIFZhbGlkYXRlQWRkcmVzcyh2YWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzcywgdmFsaWRhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQW55Ii8+IHRvIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkgQWRkQW55VmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25BbnkoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQW55KTsKKyAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhbiA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uSW50Ii8+IHRvIHRoZSB3b3Jrc2hlZXQuIFdob2xlIG1lYW5zIHRoYXQgdGhlIG9ubHkgYWNjZXB0ZWQgdmFsdWVzCisgICAgICAgIC8vLyBhcmUgaW50ZWdlciB2YWx1ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgQWRkSW50ZWdlclZhbGlkYXRpb24oc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7CisgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLldob2xlKTsKKyAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkZXMgYW4gPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwiLz4gdG8gdGhlIHdvcmtzaGVldC4gVGhlIG9ubHkgYWNjZXB0ZWQgdmFsdWVzIGFyZQorICAgICAgICAvLy8gZGVjaW1hbCB2YWx1ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIEFkZERlY2ltYWxWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOworICAgICAgICAgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYW4gPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QiLz4gdG8gdGhlIHdvcmtzaGVldC4gVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUgZGVmaW5lZAorICAgICAgICAvLy8gaW4gYSBsaXN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSByYW5nZS9hZGRyZXNzIHRvIHZhbGlkYXRlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCBBZGRMaXN0VmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0KF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkxpc3QpOworICAgICAgICAgICAgX3ZhbGlkYXRpb25zLkFkZChpdGVtKTsKKyAgICAgICAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGFuIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQiLz4gcmVnYXJkaW5nIHRleHQgbGVuZ3RoIHRvIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgQWRkVGV4dExlbmd0aFZhbGlkYXRpb24oc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7CisgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGgpOworICAgICAgICAgICAgX3ZhbGlkYXRpb25zLkFkZChpdGVtKTsKKyAgICAgICAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGFuIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSIvPiB0byB0aGUgd29ya3NoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSByYW5nZS9hZGRyZXNzIHRvIHZhbGlkYXRlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUgQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lKF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lKTsKKyAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIEFkZFRpbWVWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGltZSk7CisgICAgICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOworICAgICAgICAgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIi8+IHRvIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20gQWRkQ3VzdG9tVmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20oX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tKTsKKyAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyBhbiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb24iLz4gZnJvbSB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byByZW1vdmU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VHJ1ZSBpZiByZW1vdmUgc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZTwvcmV0dXJucz4KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5pZiA8cGFyYW1yZWYgbmFtZT0iaXRlbSIvPiBpcyBudWxsPC9leGNlcHRpb24+CisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShJRXhjZWxEYXRhVmFsaWRhdGlvbiBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShpdGVtIGlzIEV4Y2VsRGF0YVZhbGlkYXRpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2FzdEV4Y2VwdGlvbigiVGhlIHN1cHBsaWVkIGl0ZW0gbXVzdCBpbmhlcml0IE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRXhjZWxEYXRhVmFsaWRhdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChpdGVtKS5Jc05vdE51bGwoIml0ZW0iKTsKKyAgICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQ2hpbGQoKChFeGNlbERhdGFWYWxpZGF0aW9uKWl0ZW0pLlRvcE5vZGUpOworICAgICAgICAgICAgdmFyIHJldFZhbCA9IF92YWxpZGF0aW9ucy5SZW1vdmUoaXRlbSk7CisgICAgICAgICAgICBpZiAocmV0VmFsKSBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOdW1iZXIgb2YgdmFsaWRhdGlvbnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3ZhbGlkYXRpb25zLkNvdW50OyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRleCBvcGVyYXRvciwgcmV0dXJucyBieSAwLWJhc2VkIGluZGV4CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbiB0aGlzW2ludCBpbmRleF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWxpZGF0aW9uc1tpbmRleF07IH0KKyAgICAgICAgICAgIHNldCB7IF92YWxpZGF0aW9uc1tpbmRleF0gPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kZXggb3BlcmF0b3IsIHJldHVybnMgYSBkYXRhIHZhbGlkYXRpb24gd2hpY2ggYWRkcmVzcyBwYXJ0bHkgb3IgZXhhY3RseSBtYXRjaGVzIHRoZSBzZWFyY2hlZCBhZGRyZXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPkEgY2VsbCBhZGRyZXNzIG9yIHJhbmdlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+IG9yIG51bGwgaWYgbm8gbWF0Y2g8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbiB0aGlzW3N0cmluZyBhZGRyZXNzXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2VhcmNoZWRBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbGlkYXRpb25zLkZpbmQoeCA9PiB4LkFkZHJlc3MuQ29sbGlkZShzZWFyY2hlZEFkZHJlc3MpICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyBhbGwgdmFsaWRhdGlvbnMgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgPHBhcmFtcmVmIG5hbWU9Im1hdGNoIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1hdGNoIj5wcmVkaWNhdGUgdG8gZmlsdGVyIG91dCBtYXRjaGluZyB2YWxpZGF0aW9uczwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxJRXhjZWxEYXRhVmFsaWRhdGlvbj4gRmluZEFsbChQcmVkaWNhdGU8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IG1hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3ZhbGlkYXRpb25zLkZpbmRBbGwobWF0Y2gpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgdmFsaWRhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXRjaCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uIEZpbmQoUHJlZGljYXRlPElFeGNlbERhdGFWYWxpZGF0aW9uPiBtYXRjaCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5GaW5kKG1hdGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgYWxsIHZhbGlkYXRpb25zIGZyb20gdGhlIGNvbGxlY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlQWxsTm9kZShEYXRhVmFsaWRhdGlvbkl0ZW1zUGF0aC5UcmltU3RhcnQoJy8nKSk7CisgICAgICAgICAgICBfdmFsaWRhdGlvbnMuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgdGhlIHZhbGlkYXRpb25zIHRoYXQgbWF0Y2hlcyB0aGUgcHJlZGljYXRlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF0Y2giPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUFsbChQcmVkaWNhdGU8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IG1hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IF92YWxpZGF0aW9ucy5GaW5kQWxsKG1hdGNoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtIGluIG1hdGNoZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCEobSBpcyBFeGNlbERhdGFWYWxpZGF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2FzdEV4Y2VwdGlvbigiVGhlIHN1cHBsaWVkIGl0ZW0gbXVzdCBpbmhlcml0IE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRXhjZWxEYXRhVmFsaWRhdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoRGF0YVZhbGlkYXRpb25QYXRoLlRyaW1TdGFydCgnLycpLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVDaGlsZCgoKEV4Y2VsRGF0YVZhbGlkYXRpb24pbSkuVG9wTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfdmFsaWRhdGlvbnMuUmVtb3ZlQWxsKG1hdGNoKTsKKyAgICAgICAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IElFbnVtZXJhYmxlPElFeGNlbERhdGFWYWxpZGF0aW9uPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdmFsaWRhdGlvbnMuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDcxOGYzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MKQEAgLTAsMCArMSw4NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ3VzdG9tIHZhbGlkYXRpb24sIGkuZS4gYSBmb3JtdWxhLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20gOiBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhPiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTljYTAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzCkBAIC0wLDAgKzEsOTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRpb24gZm9yIDxzZWUgY3JlZj0iRGF0ZVRpbWUiLz4uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZT4sIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM5YTFlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzCkBAIC0wLDAgKzEsOTEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRGF0YSB2YWxpZGF0aW9uIGZvciBkZWNpbWFsIHZhbHVlcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsPiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPkZvciB0ZXN0IHB1cnBvc2VzPC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRmFjdG9yeS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjNjZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5LmNzCkBAIC0wLDAgKzEsODAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKiBSYXppcSBZb3JrIAkJICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEFueSB0eXBlICAyMDE0LTA4LTA4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRmFjdG9yeSBjbGFzcyBmb3IgRXhjZWxEYXRhVmFsaWRhdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRmFjdG9yeQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb24iLz4gb3V0IG9mIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb24gQ3JlYXRlKEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHR5cGUsIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KHR5cGUpLklzTm90TnVsbCgidmFsaWRhdGlvblR5cGUiKTsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5Bbnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkFueSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGg6CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLldob2xlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsKHdvcmtzaGVldCwgYWRkcmVzcywgdHlwZSwgaXRlbUVsZW1lbnROb2RlKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLlRpbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5DdXN0b206CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5vbiBzdXBwb3J0ZWQgdmFsaWRhdGlvbnR5cGU6ICIgKyB0eXBlLlR5cGUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uSW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWFjODgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcwpAQCAtMCwwICsxLDkwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEYXRhIHZhbGlkYXRpb24gZm9yIGludGVnZXIgdmFsdWVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgOiBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludD4sIElFeGNlbERhdGFWYWxpZGF0aW9uSW50CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uSW50KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQod29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQod29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCh3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCh3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5Gb3IgdGVzdCBwdXJwb3NlczwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2ODkzOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcwpAQCAtMCwwICsxLDg4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gTGlzdCBkYXRhIHZhbGlkYXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QgOiBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdD4sIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdAorICAgIHsKKyAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5OYW1lc3BhY2UgbWFuYWdlciwgZm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uTGlzdChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkYjlkZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gT3BlcmF0b3IgZm9yIGNvbXBhcmlzb24gYmV0d2VlbiBGb3JtdWxhIGFuZCBGb3JtdWxhMiBpbiBhIHZhbGlkYXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IKKyAgICB7CisgICAgICAgIGFueSwKKyAgICAgICAgZXF1YWwsCisgICAgICAgIG5vdEVxdWFsLAorICAgICAgICBsZXNzVGhhbiwKKyAgICAgICAgbGVzc1RoYW5PckVxdWFsLAorICAgICAgICBncmVhdGVyVGhhbiwKKyAgICAgICAgZ3JlYXRlclRoYW5PckVxdWFsLAorICAgICAgICBiZXR3ZWVuLAorICAgICAgICBub3RCZXR3ZWVuCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWY3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUuY3MKQEAgLTAsMCArMSw5MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZhbGlkYXRpb24gZm9yIHRpbWVzICg8c2VlIGNyZWY9Ik9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRXhjZWxUaW1lIi8+KS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uVGltZSA6IEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZT4sIElFeGNlbERhdGFWYWxpZGF0aW9uVGltZQorICAgIHsKKyAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ExNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLmNzCkBAIC0wLDAgKzEsMzE5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICogUmF6aXEgWW9yayAJCSAgICAgICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBBbnkgdHlwZSAgMjAxNC0wOC0wOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFbnVtIGZvciBhdmFpbGFibGUgZGF0YSB2YWxpZGF0aW9uIHR5cGVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlRGF0YVZhbGlkYXRpb25UeXBlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbnkgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQW55LAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnRlZ2VyIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFdob2xlLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWNpbWFsIHZhbHVlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBEZWNpbWFsLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMaXN0IG9mIHZhbHVlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMaXN0LAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXh0IGxlbmd0aCB2YWxpZGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRleHRMZW5ndGgsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERhdGVUaW1lIHZhbGlkYXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRGF0ZVRpbWUsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpbWUgdmFsaWRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUaW1lLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDdXN0b20gdmFsaWRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDdXN0b20KKyAgICB9CisKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcworICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBBbnkgPSAiIjsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBXaG9sZSA9ICJ3aG9sZSI7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgRGVjaW1hbCA9ICJkZWNpbWFsIjsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBMaXN0ID0gImxpc3QiOworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIFRleHRMZW5ndGggPSAidGV4dExlbmd0aCI7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgRGF0ZSA9ICJkYXRlIjsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBUaW1lID0gInRpbWUiOworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEN1c3RvbSA9ICJjdXN0b20iOworICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHlwZXMgb2YgZGF0YXZhbGlkYXRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBib29sIGFsbG93T3BlcmF0b3IsIHN0cmluZyBzY2hlbWFOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdmFsaWRhdGlvblR5cGU7CisgICAgICAgICAgICBBbGxvd09wZXJhdG9yID0gYWxsb3dPcGVyYXRvcjsKKyAgICAgICAgICAgIFNjaGVtYU5hbWUgPSBzY2hlbWFOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGlvbiB0eXBlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlRGF0YVZhbGlkYXRpb25UeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgU2NoZW1hTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgdHlwZSBhbGxvd3Mgb3BlcmF0b3IgdG8gYmUgc2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGJvb2wgQWxsb3dPcGVyYXRvcgorICAgICAgICB7CisKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyBhIHZhbGlkYXRpb24gdHlwZSBieSA8c2VlIGNyZWY9ImVEYXRhVmFsaWRhdGlvblR5cGUiLz4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgR2V0QnlWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuQW55OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQW55OworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLldob2xlOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuTGlzdDsKKyAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuRGVjaW1hbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWw7CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5UZXh0TGVuZ3RoOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5EYXRlVGltZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5UaW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGltZTsKKyAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb24gc3VwcG9ydGVkIFZhbGlkYXRpb250eXBlIDogIiArIHR5cGUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgR2V0QnlTY2hlbWFOYW1lKHN0cmluZyBzY2hlbWFOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNjaGVtYU5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkFueToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkFueTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuV2hvbGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGVjaW1hbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWw7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5UZXh0TGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGV4dExlbmd0aDsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGF0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5UaW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGltZTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuQ3VzdG9tOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzY2hlbWFuYW1lOiAiICsgc2NoZW1hTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPdmVycmlkZGVuIEVxdWFscywgY29tcGFyZXMgb24gaW50ZXJuYWwgdmFsaWRhdGlvbiB0eXBlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2JqIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEob2JqIGlzIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSlvYmopLlR5cGUgPT0gVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE92ZXJyaWRlcyBHZXRIYXNoQ29kZSgpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5HZXRIYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZWdlciB2YWx1ZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgX2FueTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBBbnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9hbnkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hbnkgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZS5BbnksIGZhbHNlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkFueSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfYW55OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZWdlciB2YWx1ZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgX3dob2xlOworICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIFdob2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfd2hvbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF93aG9sZSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlLldob2xlLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLldob2xlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF93aG9sZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExpc3Qgb2YgYWxsb3dlZCB2YWx1ZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgX2xpc3Q7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgTGlzdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0ID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlKGVEYXRhVmFsaWRhdGlvblR5cGUuTGlzdCwgZmFsc2UsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuTGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF9kZWNpbWFsOworICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIERlY2ltYWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kZWNpbWFsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGVjaW1hbCA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWwsIHRydWUsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGVjaW1hbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZGVjaW1hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF90ZXh0TGVuZ3RoOworICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIFRleHRMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF90ZXh0TGVuZ3RoID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGV4dExlbmd0aCA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGgsIHRydWUsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuVGV4dExlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdGV4dExlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF9kYXRlVGltZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBEYXRlVGltZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2RhdGVUaW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGF0ZVRpbWUgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZS5EYXRlVGltZSwgdHJ1ZSwgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5EYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kYXRlVGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF90aW1lOworICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIFRpbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF90aW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGltZSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlLlRpbWUsIHRydWUsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF9jdXN0b207CisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgQ3VzdG9tCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY3VzdG9tID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY3VzdG9tID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlKGVEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkN1c3RvbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfY3VzdG9tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmEwNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuY3MKQEAgLTAsMCArMSw2MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gd2FybmluZyBzdHlsZSwgY29udHJvbHMgaG93IEV4Y2VsIHdpbGwgaGFuZGxlIGludmFsaWQgY2hhbmdlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHdhcm5pbmcgc3R5bGUgd2lsbCBiZSBleGNsdWRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB1bmRlZmluZWQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHN0b3Agd2FybmluZyBzdHlsZSwgaW52YWxpZCBjaGFuZ2VzIHdpbGwgbm90IGJlIGFjY2VwdGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHN0b3AsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHdhcm5pbmcgd2lsbCBiZSBwcmVzZW50ZWQgd2hlbiBhbiBhdHRlbXB0IHRvIGFuIGludmFsaWQgY2hhbmdlIGlzIGRvbmUsIGJ1dCB0aGUgY2hhbmdlIHdpbGwgYmUgYWNjZXB0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHdhcm5pbmcsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIGluZm9ybWF0aW9uIHdhcm5pbmcgc3R5bGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGluZm9ybWF0aW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiNjZkMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MKQEAgLTAsMCArMSwxMDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgdmFsaWRhdGlvbiBjb250YWluaW5nIGEgZm9ybXVsYQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxUPiA6IEV4Y2VsRGF0YVZhbGlkYXRpb24KKyAgICAgICAgd2hlcmUgVCA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQorICAgICAgICAgICAgOiB0aGlzKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIG51bGwpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij5Xb3Jrc2hlZXQgdGhhdCBvd25zIHRoZSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPlhtbCB0b3Agbm9kZSAoZGF0YVZhbGlkYXRpb25zKTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPkRhdGEgdmFsaWRhdGlvbiB0eXBlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5hZGRyZXNzIGZvciBkYXRhIHZhbGlkYXRpb248L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5mb3IgdGVzdCBwdXJwb3NlczwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb3JtdWxhIC0gRWl0aGVyIGEge1R9IHZhbHVlIChleGNlcHQgZm9yIGN1c3RvbSB2YWxpZGF0aW9uKSBvciBhIHNwcmVhZHNoZWV0IGZvcm11bGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFQgRm9ybXVsYQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVmFsaWRhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLlZhbGlkYXRlKCk7CisgICAgICAgICAgICBpZiAoT3BlcmF0b3IgPT0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmJldHdlZW4gfHwgT3BlcmF0b3IgPT0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLm5vdEJldHdlZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KEZvcm11bGEySW50ZXJuYWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZhbGlkYXRpb24gb2YgIiArIEFkZHJlc3MuQWRkcmVzcyArICIgZmFpbGVkOiBGb3JtdWxhMiBtdXN0IGJlIHNldCBpZiBvcGVyYXRvciBpcyAnYmV0d2Vlbicgb3IgJ25vdEJldHdlZW4nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZlY2QzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIuY3MKQEAgLTAsMCArMSw5MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyPFQ+IDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPFQ+CisgICAgICAgIHdoZXJlIFQgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCisgICAgICAgICAgICA6IHRoaXMod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgbnVsbCkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPldvcmtzaGVldCB0aGF0IG93bnMgdGhlIHZhbGlkYXRpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+WG1sIHRvcCBub2RlIChkYXRhVmFsaWRhdGlvbnMpPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5mb3IgdGVzdCBwdXJwb3NlczwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb3JtdWxhIC0gRWl0aGVyIGEge1R9IHZhbHVlIG9yIGEgc3ByZWFkc2hlZXQgZm9ybXVsYQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVCBGb3JtdWxhMgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbFRpbWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwYTVjMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbFRpbWUuY3MKQEAgLTAsMCArMSwyNjkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwcmVzZW50cyBhIHRpbWUgYmV0d2VlbiAwMDowMDowMCBhbmQgMjM6NTk6NTkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFRpbWUKKyAgICB7CisgICAgICAgIHByaXZhdGUgZXZlbnQgRXZlbnRIYW5kbGVyIF90aW1lQ2hhbmdlZDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJEYXkgPSAzNjAwICogMjQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGVjaW1hbCBTZWNvbmRzUGVySG91ciA9IDM2MDA7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGVjaW1hbCBTZWNvbmRzUGVyTWludXRlID0gNjA7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1heCBudW1iZXIgb2YgZGVjaW1hbHMgd2hlbiByb3VuZGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOdW1iZXJPZkRlY2ltYWxzID0gMTU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxUaW1lKCkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5BbiBleGlzdGluZyB0aW1lIGZvciBpbml0aWFsaXphdGlvbjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbFRpbWUoZGVjaW1hbCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlIDwgME0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID49IDFNKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgY2Fubm90IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5pdCh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdChkZWNpbWFsIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBoYW5kbGUgaG91cgorICAgICAgICAgICAgZGVjaW1hbCB0b3RhbFNlY29uZHMgPSB2YWx1ZSAqIFNlY29uZHNQZXJEYXk7CisgICAgICAgICAgICBkZWNpbWFsIGhvdXIgPSBNYXRoLkZsb29yKHRvdGFsU2Vjb25kcyAvIFNlY29uZHNQZXJIb3VyKTsKKyAgICAgICAgICAgIEhvdXIgPSAoaW50KWhvdXI7CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBtaW51dGUKKyAgICAgICAgICAgIGRlY2ltYWwgcmVtYWluaW5nU2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAtIChob3VyICogU2Vjb25kc1BlckhvdXIpOworICAgICAgICAgICAgZGVjaW1hbCBtaW51dGUgPSBNYXRoLkZsb29yKHJlbWFpbmluZ1NlY29uZHMgLyBTZWNvbmRzUGVyTWludXRlKTsKKyAgICAgICAgICAgIE1pbnV0ZSA9IChpbnQpbWludXRlOworCisgICAgICAgICAgICAvLyBoYW5kbGUgc2Vjb25kCisgICAgICAgICAgICByZW1haW5pbmdTZWNvbmRzID0gdG90YWxTZWNvbmRzIC0gKGhvdXIgKiBTZWNvbmRzUGVySG91cikgLSAobWludXRlICogU2Vjb25kc1Blck1pbnV0ZSk7CisgICAgICAgICAgICBkZWNpbWFsIHNlY29uZCA9IE1hdGguUm91bmQocmVtYWluaW5nU2Vjb25kcywgTWlkcG9pbnRSb3VuZGluZy5Bd2F5RnJvbVplcm8pOworICAgICAgICAgICAgLy8gU2Vjb25kIG1pZ2h0IGJlIHJvdW5kZWQgdG8gNjAuLi4gdGhlIFNldFNlY29uZCBtZXRob2QgaGFuZGxlcyB0aGF0LgorICAgICAgICAgICAgU2V0U2Vjb25kKChpbnQpc2Vjb25kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHdlIGFyZSB1bmx1Y2t5IHNlY29uZCBtaWdodCBiZSByb3VuZGVkIHVwIHRvIDYwLiBUaGlzIHdpbGwgaGF2ZSB0aGUgbWludXRlIHRvIGJlIHJhaXNlZCBhbmQgbWlnaHQgYWZmZWN0IHRoZSBob3VyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgU2V0U2Vjb25kKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IDYwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNlY29uZCA9IDA7CisgICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9IE1pbnV0ZSArIDE7CisgICAgICAgICAgICAgICAgU2V0TWludXRlKG1pbnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2Vjb25kID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0TWludXRlKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IDYwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pbnV0ZSA9IDA7CisgICAgICAgICAgICAgICAgdmFyIGhvdXIgPSBIb3VyICsgMTsKKyAgICAgICAgICAgICAgICBTZXRIb3VyKGhvdXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pbnV0ZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEhvdXIoaW50IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSG91ciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBldmVudCBFdmVudEhhbmRsZXIgVGltZUNoYW5nZWQKKyAgICAgICAgeworICAgICAgICAgICAgYWRkIHsgX3RpbWVDaGFuZ2VkICs9IHZhbHVlOyB9CisgICAgICAgICAgICByZW1vdmUgeyBfdGltZUNoYW5nZWQgLT0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBPblRpbWVDaGFuZ2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF90aW1lQ2hhbmdlZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90aW1lQ2hhbmdlZCh0aGlzLCBFdmVudEFyZ3MuRW1wdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2hvdXI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvdXIgYmV0d2VlbiAwIGFuZCAyMworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IEhvdXIgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaG91cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIGhvdXIgY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IDIzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZhbHVlIGZvciBob3VyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMjMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2hvdXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBPblRpbWVDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBfbWludXRlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNaW51dGUgYmV0d2VlbiAwIGFuZCA1OQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IE1pbnV0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX21pbnV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIG1pbnV0ZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gNTkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIG1pbnV0ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDU5Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9taW51dGUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBPblRpbWVDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludD8gX3NlY29uZDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2Vjb25kIGJldHdlZW4gMCBhbmQgNTkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludD8gU2Vjb25kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3Igc2Vjb25kIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiA1OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3Igc2Vjb25kIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gNTkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3NlY29uZCA9IHZhbHVlOworICAgICAgICAgICAgICAgIE9uVGltZUNoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZGVjaW1hbCBSb3VuZChkZWNpbWFsIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5Sb3VuZCh2YWx1ZSwgTnVtYmVyT2ZEZWNpbWFscyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRlY2ltYWwgVG9TZWNvbmRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEhvdXIgKiBTZWNvbmRzUGVySG91cjsKKyAgICAgICAgICAgIHJlc3VsdCArPSBNaW51dGUgKiBTZWNvbmRzUGVyTWludXRlOworICAgICAgICAgICAgcmVzdWx0ICs9IFNlY29uZCA/PyAwOworICAgICAgICAgICAgcmV0dXJuIChkZWNpbWFsKXJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGV4Y2VsIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSB0aW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgZGVjaW1hbCBUb0V4Y2VsVGltZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWNvbmRzID0gVG9TZWNvbmRzKCk7CisgICAgICAgICAgICByZXR1cm4gUm91bmQoc2Vjb25kcyAvIChkZWNpbWFsKVNlY29uZHNQZXJEYXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgZXhjZWwgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIHRpbWUgYXMgYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVG9FeGNlbFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUb0V4Y2VsVGltZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWNvbmQgPSBTZWNvbmQgPz8gMDsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJ7MH06ezF9OnsyfSIsCisgICAgICAgICAgICAgICAgSG91ciA8IDEwID8gIjAiICsgSG91ci5Ub1N0cmluZygpIDogSG91ci5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgIE1pbnV0ZSA8IDEwID8gIjAiICsgTWludXRlLlRvU3RyaW5nKCkgOiBNaW51dGUuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBzZWNvbmQgPCAxMCA/ICIwIiArIHNlY29uZC5Ub1N0cmluZygpIDogc2Vjb25kLlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWMxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcwpAQCAtMCwwICsxLDQ5IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0cworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIGZvciBhIGRhdGEgdmFsaWRhdGlvbiBmb3JtdWxhCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQW4gZXhjZWwgZm9ybXVsYQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBzdHJpbmcgRXhjZWxGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzgwYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcwpAQCAtMCwwICsxLDQ1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0cworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVmFsaWRhdGlvbiBmb3JtdWxhIGludGVyZmFjZSBmb3IgPHNlZSBjcmVmPSJEYXRlVGltZSIvPgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZSA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZTxEYXRlVGltZT8+CisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzc3NjFlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIGZvcm11bGEgb2YgPHNlZSBjcmVmPSJTeXN0ZW0uU2luZ2xlIj5mbG9hdDwvc2VlPiB2YWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPGRvdWJsZT8+CisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50LmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExZDQ3YwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50LmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIGZvcm11bGEgb2YgPHNlZSBjcmVmPSJTeXN0ZW0uSW50MzIiLz4gdmFsdWUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPGludD8+CisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYyYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0LmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIG9mIGxpc3QgdHlwZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGxpc3Qgb2YgdmFsdWUgc3RyaW5ncy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSUxpc3Q8c3RyaW5nPiBWYWx1ZXMgeyBnZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmYzM2YQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHMKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFXaXRoVmFsdWU8RXhjZWxUaW1lPgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjFiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZS5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0cworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIGZvciBhIGZvcm11bGEgd2l0aCBhIHZhbHVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj48L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZTxUPiA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUIFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MzE5MgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcwpAQCAtMCwwICsxLDEzOCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAorICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEVudW1lcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgYW4gPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVle1R9Ii8+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBlbnVtIEZvcm11bGFTdGF0ZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsdWUgaXMgc2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFZhbHVlLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb3JtdWxhIGlzIHNldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBGb3JtdWxhCisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCYXNlIGNsYXNzIGZvciBhIGZvcm11bGEKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGFic3RyYWN0IGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhIDogWG1sSGVscGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPk5hbWVzcGFjZW1hbmdlciBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj52YWxpZGF0aW9uIHRvcCBub2RlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhUGF0aCI+eG1sIHBhdGggb2YgdGhlIGN1cnJlbnQgZm9ybXVsYTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgc3RyaW5nIGZvcm11bGFQYXRoKQorICAgICAgICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoZm9ybXVsYVBhdGgpLklzTm90TnVsbE9yRW1wdHkoImZvcm11bGFQYXRoIik7CisgICAgICAgICAgICBGb3JtdWxhUGF0aCA9IGZvcm11bGFQYXRoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2Zvcm11bGE7CisKKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBGb3JtdWxhUGF0aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0YXRlIG9mIHRoZSB2YWxpZGF0aW9uZm9ybXVsYSwgaS5lLiB0ZWxscyBpZiB2YWx1ZSBvciBmb3JtdWxhIGlzIHNldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgRm9ybXVsYVN0YXRlIFN0YXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgZm9ybXVsYSB3aGljaCBvdXRwdXQgbXVzdCBtYXRjaCB0aGUgY3VycmVudCB2YWxpZGF0aW9uIHR5cGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBFeGNlbEZvcm11bGEKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtdWxhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXNldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIFN0YXRlID0gRm9ybXVsYVN0YXRlLkZvcm11bGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLkxlbmd0aCA+IDI1NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgbGVuZ3RoIG9mIGEgRGF0YVZhbGlkYXRpb24gZm9ybXVsYSBjYW5ub3QgZXhjZWVkIDI1NSBjaGFyYWN0ZXJzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vdmFyIHZhbCA9IFNxUmVmVXRpbGl0eS5Ub1NxUmVmQWRkcmVzcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgX2Zvcm11bGEgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZvcm11bGFQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBhYnN0cmFjdCB2b2lkIFJlc2V0VmFsdWUoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB4bWwuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgdmlydHVhbCBzdHJpbmcgR2V0WG1sVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3RhdGUgPT0gRm9ybXVsYVN0YXRlLkZvcm11bGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRm9ybXVsYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBHZXRWYWx1ZUFzU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHN0cmluZy4gTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc1YzhkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhQ3VzdG9tLmNzCkBAIC0wLDAgKzEsNzIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20gOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYSwgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCisgICAgeworICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20oWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBmb3JtdWxhUGF0aCkKKyAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCB0b3BOb2RlLCBmb3JtdWxhUGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhmb3JtdWxhUGF0aCk7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlbEZvcm11bGEgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXRlID0gRm9ybXVsYVN0YXRlLkZvcm11bGE7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgR2V0WG1sVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRXhjZWxGb3JtdWxhOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBHZXRWYWx1ZUFzU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRm9ybXVsYTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVzZXRWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsRm9ybXVsYSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODFiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcwpAQCAtMCwwICsxLDY4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICBpbnRlcm5hbCBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lIDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxEYXRlVGltZT8+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZQorICAgIHsKKyAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBmb3JtdWxhUGF0aCkKKyAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCB0b3BOb2RlLCBmb3JtdWxhUGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhmb3JtdWxhUGF0aCk7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgb0FEYXRlID0gZGVmYXVsdChkb3VibGUpOworICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBvQURhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKG9BRGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsRm9ybXVsYSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWYWx1ZS5IYXNWYWx1ZSA/IFZhbHVlLlZhbHVlLlRvT0FEYXRlKCkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTRkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzCkBAIC0wLDAgKzEsNzAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwgOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlPGRvdWJsZT8+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsCisgICAgeworICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCisgICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoZm9ybXVsYVBhdGgpOworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZSA9IGRlZmF1bHQoZG91YmxlKTsKKyAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgZFZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gZFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm11bGEgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVmFsdWUuSGFzVmFsdWUgPyBWYWx1ZS5WYWx1ZS5Ub1N0cmluZygiUjE1IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5OGEzOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcwpAQCAtMCwwICsxLDY3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICBpbnRlcm5hbCBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCA6IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWU8aW50Pz4sIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludAorICAgIHsKKyAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCisgICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoZm9ybXVsYVBhdGgpOworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGludFZhbHVlID0gZGVmYXVsdChpbnQpOworICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UodmFsdWUsIG91dCBpbnRWYWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGludFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm11bGEgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVmFsdWUuSGFzVmFsdWUgPyBWYWx1ZS5WYWx1ZS5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1MjdmYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MKQEAgLTAsMCArMSwyNDcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCit7CisgICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0IDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEsIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QKKyAgICB7CisgICAgICAgICNyZWdpb24gY2xhc3MgRGF0YVZhbGlkYXRpb25MaXN0CisgICAgICAgIHByaXZhdGUgY2xhc3MgRGF0YVZhbGlkYXRpb25MaXN0IDogSUxpc3Q8c3RyaW5nPiwgSUNvbGxlY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBJTGlzdDxzdHJpbmc+IF9pdGVtcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIHByaXZhdGUgRXZlbnRIYW5kbGVyPEV2ZW50QXJncz4gX2xpc3RDaGFuZ2VkOworCisgICAgICAgICAgICBwdWJsaWMgZXZlbnQgRXZlbnRIYW5kbGVyPEV2ZW50QXJncz4gTGlzdENoYW5nZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQgeyBfbGlzdENoYW5nZWQgKz0gdmFsdWU7IH0KKyAgICAgICAgICAgICAgICByZW1vdmUgeyBfbGlzdENoYW5nZWQgLT0gdmFsdWU7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIE9uTGlzdENoYW5nZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfbGlzdENoYW5nZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0Q2hhbmdlZCh0aGlzLCBFdmVudEFyZ3MuRW1wdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI3JlZ2lvbiBJTGlzdCBtZW1iZXJzCisgICAgICAgICAgICBpbnQgSUxpc3Q8c3RyaW5nPi5JbmRleE9mKHN0cmluZyBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaXRlbXMuSW5kZXhPZihpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBJTGlzdDxzdHJpbmc+Lkluc2VydChpbnQgaW5kZXgsIHN0cmluZyBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pdGVtcy5JbnNlcnQoaW5kZXgsIGl0ZW0pOworICAgICAgICAgICAgICAgIE9uTGlzdENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBJTGlzdDxzdHJpbmc+LlJlbW92ZUF0KGludCBpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaXRlbXMuUmVtb3ZlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIE9uTGlzdENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nIElMaXN0PHN0cmluZz4udGhpc1tpbnQgaW5kZXhdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2l0ZW1zW2luZGV4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaXRlbXNbaW5kZXhdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIE9uTGlzdENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgSUNvbGxlY3Rpb248c3RyaW5nPi5BZGQoc3RyaW5nIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2l0ZW1zLkFkZChpdGVtKTsKKyAgICAgICAgICAgICAgICBPbkxpc3RDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgSUNvbGxlY3Rpb248c3RyaW5nPi5DbGVhcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2l0ZW1zLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgT25MaXN0Q2hhbmdlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIElDb2xsZWN0aW9uPHN0cmluZz4uQ29udGFpbnMoc3RyaW5nIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pdGVtcy5Db250YWlucyhpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxzdHJpbmc+LkNvcHlUbyhzdHJpbmdbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2l0ZW1zLkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBJQ29sbGVjdGlvbjxzdHJpbmc+LkNvdW50CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pdGVtcy5Db3VudDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIElDb2xsZWN0aW9uPHN0cmluZz4uSXNSZWFkT25seQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIElDb2xsZWN0aW9uPHN0cmluZz4uUmVtb3ZlKHN0cmluZyBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSBfaXRlbXMuUmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgICAgIE9uTGlzdENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJRW51bWVyYXRvcjxzdHJpbmc+IElFbnVtZXJhYmxlPHN0cmluZz4uR2V0RW51bWVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pdGVtcy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pdGVtcy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhBcnJheSBhcnJheSwgaW50IGluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pdGVtcy5Db3B5VG8oKHN0cmluZ1tdKWFycmF5LCBpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBJQ29sbGVjdGlvbi5Db3VudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXRlbXMuQ291bnQ7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgSXNTeW5jaHJvbml6ZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gKChJQ29sbGVjdGlvbilfaXRlbXMpLklzU3luY2hyb25pemVkOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgU3luY1Jvb3QKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gKChJQ29sbGVjdGlvbilfaXRlbXMpLlN5bmNSb290OyB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLCBYbWxOb2RlIGl0ZW1Ob2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCisgICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgaXRlbU5vZGUsIGZvcm11bGFQYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KGZvcm11bGFQYXRoKS5Jc05vdE51bGxPckVtcHR5KCJmb3JtdWxhUGF0aCIpOworICAgICAgICAgICAgX2Zvcm11bGFQYXRoID0gZm9ybXVsYVBhdGg7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gbmV3IERhdGFWYWxpZGF0aW9uTGlzdCgpOworICAgICAgICAgICAgdmFsdWVzLkxpc3RDaGFuZ2VkICs9IG5ldyBFdmVudEhhbmRsZXI8RXZlbnRBcmdzPih2YWx1ZXNfTGlzdENoYW5nZWQpOworICAgICAgICAgICAgVmFsdWVzID0gdmFsdWVzOworICAgICAgICAgICAgU2V0SW5pdGlhbFZhbHVlcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2Zvcm11bGFQYXRoOworCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRJbml0aWFsVmFsdWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIEB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoX2Zvcm11bGFQYXRoKTsKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoQHZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQHZhbHVlLlN0YXJ0c1dpdGgoIlwiIikgJiYgQHZhbHVlLkVuZHNXaXRoKCJcIiIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQHZhbHVlID0gQHZhbHVlLlRyaW1TdGFydCgnIicpLlRyaW1FbmQoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gQHZhbHVlLlNwbGl0KG5ldyBjaGFyW117JywnfSwgU3RyaW5nU3BsaXRPcHRpb25zLlJlbW92ZUVtcHR5RW50cmllcyk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGl0ZW1zKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMuQWRkKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsRm9ybXVsYSA9IEB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHZhbHVlc19MaXN0Q2hhbmdlZChvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFZhbHVlcy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdGUgPSBGb3JtdWxhU3RhdGUuVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgdmFsdWVzQXNTdHJpbmcgPSBHZXRWYWx1ZUFzU3RyaW5nKCk7CisgICAgICAgICAgICAvLyBFeGNlbCBzdXBwb3J0cyBtYXggMjU1IGNoYXJhY3RlcnMgaW4gdGhpcyBmaWVsZC4KKyAgICAgICAgICAgIGlmICh2YWx1ZXNBc1N0cmluZy5MZW5ndGggPiAyNTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSB0b3RhbCBsZW5ndGggb2YgYSBEYXRhVmFsaWRhdGlvbiBsaXN0IGNhbm5vdCBleGNlZWQgMjU1IGNoYXJhY3RlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Zvcm11bGFQYXRoLCB2YWx1ZXNBc1N0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIElMaXN0PHN0cmluZz4gVmFsdWVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyAgR2V0VmFsdWVBc1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsIGluIFZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2IuTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCh2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIix7MH0iLCB2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLkFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBSZXNldFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWVzLkNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUxOTcyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcwpAQCAtMCwwICsxLDg4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCit7CisgICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lIDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxFeGNlbFRpbWU+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lCisgICAgeworICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCisgICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoZm9ybXVsYVBhdGgpOworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVjaW1hbCB0aW1lID0gZGVmYXVsdChkZWNpbWFsKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVjaW1hbC5UcnlQYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBuZXcgRXhjZWxUaW1lKHRpbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IG5ldyBFeGNlbFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxGb3JtdWxhID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlID0gbmV3IEV4Y2VsVGltZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmFsdWUuVGltZUNoYW5nZWQgKz0gbmV3IEV2ZW50SGFuZGxlcihWYWx1ZV9UaW1lQ2hhbmdlZCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIFZhbHVlX1RpbWVDaGFuZ2VkKG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZvcm11bGFQYXRoLCBWYWx1ZS5Ub0V4Y2VsU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBHZXRWYWx1ZUFzU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN0YXRlID09IEZvcm11bGFTdGF0ZS5WYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsdWUuVG9FeGNlbFN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVzZXRWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gbmV3IEV4Y2VsVGltZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE3Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWUuY3MKQEAgLTAsMCArMSw4NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCit7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHZhbGlkYXRpb24gZm9ybXVsYS4gSXRzIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGRhdGF0eXBlIG9yIGFzIGEgZm9ybXVsYS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPjwvdHlwZXBhcmFtPgorICAgIGludGVybmFsIGFic3RyYWN0IGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWU8VD4gOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5OYW1lc3BhY2VtYW5nZXIgb2YgdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+dmFsaWRhdGlvbiB0b3Agbm9kZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYVBhdGgiPnhtbCBwYXRoIG9mIHRoZSBjdXJyZW50IGZvcm11bGE8L3BhcmFtPgorICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgc3RyaW5nIGZvcm11bGFQYXRoKQorICAgICAgICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVCBfdmFsdWU7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGVkIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUIFZhbHVlIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdGUgPSBGb3JtdWxhU3RhdGUuVmFsdWU7CisgICAgICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhGb3JtdWxhUGF0aCwgR2V0VmFsdWVBc1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVzZXRWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gZGVmYXVsdChUKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0lSYW5nZURhdGFWYWxpZGF0aW9uLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0lSYW5nZURhdGFWYWxpZGF0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2IzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vSVJhbmdlRGF0YVZhbGlkYXRpb24uY3MKQEAgLTAsMCArMSw4NSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMy0yMworICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYWRkaW5nIGRhdGF2YWxpZGF0aW9uIHRvIGEgcmFuZ2UgKDxzZWUgY3JlZj0iRXhjZWxSYW5nZUJhc2UiLz4pLiBFYWNoIG1ldGhvZCB3aWxsCisgICAgLy8vIHJldHVybiBhIGNvbmZpZ3VyYWJsZSB2YWxpZGF0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBJUmFuZ2VEYXRhVmFsaWRhdGlvbgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkiLz4gdG8gdGhlIHJhbmdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25BbnkiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgYW55IHZhbGlkYXRpb248L3JldHVybnM+CisgICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uQW55IEFkZEFueURhdGFWYWxpZGF0aW9uKCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uSW50Ii8+IHRvIHRoZSByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25JbnQiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgaW50ZWdlciBkYXRhIHZhbGlkYXRpb248L3JldHVybnM+CisgICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IEFkZEludGVnZXJEYXRhVmFsaWRhdGlvbigpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCIvPiB0byB0aGUgcmFuZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCIvPiB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGZvciBkZWNpbWFsIGRhdGEgdmFsaWRhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIEFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUiLz4gdG8gdGhlIHJhbmdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5BIDxzZWUgY3JlZj0iRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgZGF0ZXRpbWUgZGF0YSB2YWxpZGF0aW9uPC9yZXR1cm5zPgorICAgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIEFkZERhdGVUaW1lRGF0YVZhbGlkYXRpb24oKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0Ii8+IHRvIHRoZSByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0Ii8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGRhdGV0aW1lIGRhdGEgdmFsaWRhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IEFkZExpc3REYXRhVmFsaWRhdGlvbigpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkludCIvPiByZWdhcmRpbmcgdGV4dCBsZW5ndGggdmFsaWRhdGlvbiB0byB0aGUgcmFuZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IEFkZFRleHRMZW5ndGhEYXRhVmFsaWRhdGlvbigpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUiLz4gdG8gdGhlIHJhbmdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uVGltZSIvPiB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGZvciB0aW1lIGRhdGEgdmFsaWRhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIEFkZFRpbWVEYXRhVmFsaWRhdGlvbigpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSIvPiB0byB0aGUgcmFuZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5BIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20iLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgY3VzdG9tIHZhbGlkYXRpb248L3JldHVybnM+CisgICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIEFkZEN1c3RvbURhdGFWYWxpZGF0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL1JhbmdlRGF0YVZhbGlkYXRpb24uY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vUmFuZ2VEYXRhVmFsaWRhdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGM1MTdiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL1JhbmdlRGF0YVZhbGlkYXRpb24uY3MKQEAgLTAsMCArMSw5NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMy0yMworICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgoreworICAgIGludGVybmFsIGNsYXNzIFJhbmdlRGF0YVZhbGlkYXRpb24gOiBJUmFuZ2VEYXRhVmFsaWRhdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFJhbmdlRGF0YVZhbGlkYXRpb24oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisgICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbE9yRW1wdHkoImFkZHJlc3MiKTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7CisgICAgICAgICAgICBfYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworICAgICAgICBzdHJpbmcgX2FkZHJlc3M7CisKKyAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uQW55IEFkZEFueURhdGFWYWxpZGF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEFueVZhbGlkYXRpb24oX2FkZHJlc3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IEFkZEludGVnZXJEYXRhVmFsaWRhdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbihfYWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIEFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbihfYWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSBBZGREYXRlVGltZURhdGFWYWxpZGF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbihfYWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IEFkZExpc3REYXRhVmFsaWRhdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbihfYWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgQWRkVGV4dExlbmd0aERhdGFWYWxpZGF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZFRleHRMZW5ndGhWYWxpZGF0aW9uKF9hZGRyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUgQWRkVGltZURhdGFWYWxpZGF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZFRpbWVWYWxpZGF0aW9uKF9hZGRyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSBBZGRDdXN0b21EYXRhVmFsaWRhdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRDdXN0b21WYWxpZGF0aW9uKF9hZGRyZXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQmFyQ2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJhckNoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTIzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJhckNoYXJ0LmNzCkBAIC0wLDAgKzEsNDkzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFyIGNoYXJ0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQmFyQ2hhcnQgOiBFeGNlbENoYXJ0CisgICAgeworICAgICAgICAjcmVnaW9uICJDb25zdHJ1Y3RvcnMiCisgICAgICAgIC8vaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUpIDoKKyAgICAgICAgLy8gICAgYmFzZShkcmF3aW5ncywgbm9kZS8qLCAxKi8pCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTZXRDaGFydE5vZGVUZXh0KCIiKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSkgOgorICAgICAgICAvLyAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgU2V0Q2hhcnROb2RlVGV4dCgiIik7CisKKyAgICAgICAgLy8gICAgU2V0VHlwZVByb3BlcnRpZXMoZHJhd2luZ3MsIHR5cGUpOworICAgICAgICAvL30KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgRXhjZWxDaGFydCB0b3BDaGFydCwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpIDoKKyAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRDaGFydE5vZGVUZXh0KCIiKTsKKworICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoZHJhd2luZ3MsIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgorICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q2hhcnROb2RlVGV4dChjaGFydE5vZGUuTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBFeGNlbEJhckNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6IAorICAgICAgICAgICAgYmFzZSh0b3BDaGFydCwgY2hhcnROb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRDaGFydE5vZGVUZXh0KGNoYXJ0Tm9kZS5OYW1lKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gIlByaXZhdGUgZnVuY3Rpb25zIgorICAgICAgICAvL3N0cmluZyBfY2hhcnRUb3BQYXRoPSJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfSI7CisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRDaGFydE5vZGVUZXh0KHN0cmluZyBjaGFydE5vZGVUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eShjaGFydE5vZGVUZXh0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFydE5vZGVUZXh0ID0gR2V0Q2hhcnROb2RlVGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9fY2hhcnRUb3BQYXRoID0gc3RyaW5nLkZvcm1hdChfY2hhcnRUb3BQYXRoLCBjaGFydE5vZGVUZXh0KTsKKyAgICAgICAgICAgIC8vX2RpcmVjdGlvblBhdGggPSBzdHJpbmcuRm9ybWF0KF9kaXJlY3Rpb25QYXRoLCBfY2hhcnRUb3BQYXRoKTsKKyAgICAgICAgICAgIC8vX3NoYXBlUGF0aCA9IHN0cmluZy5Gb3JtYXQoX3NoYXBlUGF0aCwgX2NoYXJ0VG9wUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIGVDaGFydFR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKiogQmFyIGRpcmVjdGlvbiAqKioqKioqLworICAgICAgICAgICAgaWYgKHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQzRCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwM0QgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlyZWN0aW9uID0gZURpcmVjdGlvbi5CYXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW4zRCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQzRCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkM0QgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2wgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2wgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXJlY3Rpb24gPSBlRGlyZWN0aW9uLkNvbHVtbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKiBTaGFwZSAqKioqKiovCisgICAgICAgICAgICBpZiAoLyp0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMCB8fCovCisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbjNEIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0QgfHwKKyAgICAgICAgICAgICAgICAvKnR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwIHx8Ki8KKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDNEIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTaGFwZSA9IGVTaGFwZS5Cb3g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNoYXBlID0gZVNoYXBlLkN5bGluZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUNvbCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNoYXBlID0gZVNoYXBlLkNvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2hhcGUgPSBlU2hhcGUuUHlyYW1pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gIlByb3BlcnRpZXMiCisgICAgICAgIHN0cmluZyBfZGlyZWN0aW9uUGF0aCA9ICJjOmJhckRpci9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGlyZWN0aW9uLCBCYXIgb3IgY29sdW1ucworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZURpcmVjdGlvbiBEaXJlY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldERpcmVjdGlvbkVudW0oX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2RpcmVjdGlvblBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9kaXJlY3Rpb25QYXRoLCBHZXREaXJlY3Rpb25UZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9zaGFwZVBhdGggPSAiYzpzaGFwZS9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHNoYXBlIG9mIHRoZSBiYXIvY29sdW1ucworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZVNoYXBlIFNoYXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRTaGFwZUVudW0oX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX3NoYXBlUGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX3NoYXBlUGF0aCwgR2V0U2hhcGVUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDaGFydERhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWNjZXNzIHRvIGRhdGFsYWJlbCBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0RGF0YUxhYmVsIERhdGFMYWJlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0RGF0YUxhYmVsKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiAiRGlyZWN0aW9uIEVudW0gVHJhc2xhdGlvbiIKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0RGlyZWN0aW9uVGV4dChlRGlyZWN0aW9uIGRpcmVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlRGlyZWN0aW9uLkJhcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJiYXIiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29sIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZURpcmVjdGlvbiBHZXREaXJlY3Rpb25FbnVtKHN0cmluZyBkaXJlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgImJhciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlRGlyZWN0aW9uLkJhcjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZURpcmVjdGlvbi5Db2x1bW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uICJTaGFwZSBFbnVtIFRyYW5zbGF0aW9uIgorICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRTaGFwZVRleHQoZVNoYXBlIFNoYXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKFNoYXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVNoYXBlLkJveDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib3giOworICAgICAgICAgICAgICAgIGNhc2UgZVNoYXBlLkNvbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uZSI7CisgICAgICAgICAgICAgICAgY2FzZSBlU2hhcGUuQ29uZVRvTWF4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbmVUb01heCI7CisgICAgICAgICAgICAgICAgY2FzZSBlU2hhcGUuQ3lsaW5kZXI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY3lsaW5kZXIiOworICAgICAgICAgICAgICAgIGNhc2UgZVNoYXBlLlB5cmFtaWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAicHlyYW1pZCI7CisgICAgICAgICAgICAgICAgY2FzZSBlU2hhcGUuUHlyYW1pZFRvTWF4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInB5cmFtaWRUb01heCI7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib3giOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlU2hhcGUgR2V0U2hhcGVFbnVtKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiYm94IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTaGFwZS5Cb3g7CisgICAgICAgICAgICAgICAgY2FzZSAiY29uZSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2hhcGUuQ29uZTsKKyAgICAgICAgICAgICAgICBjYXNlICJjb25lVG9NYXgiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNoYXBlLkNvbmVUb01heDsKKyAgICAgICAgICAgICAgICBjYXNlICJjeWxpbmRlciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2hhcGUuQ3lsaW5kZXI7CisgICAgICAgICAgICAgICAgY2FzZSAicHlyYW1pZCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2hhcGUuUHlyYW1pZDsKKyAgICAgICAgICAgICAgICBjYXNlICJweXJhbWlkVG9NYXgiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNoYXBlLlB5cmFtaWRUb01heDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNoYXBlLkJveDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSAiYmFyQ2hhcnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLkRpcmVjdGlvbiA9PSBlRGlyZWN0aW9uLkJhcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuU3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQmFyU3RhY2tlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lID09ICJiYXIzRENoYXJ0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjcmVnaW9uICJCYXIgU2hhcGUiCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuU2hhcGU9PWVTaGFwZS5Cb3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5EaXJlY3Rpb24gPT0gZURpcmVjdGlvbi5CYXIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuU3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAgICAgICAgICNyZWdpb24gIkNvbmUgU2hhcGUiCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuU2hhcGUgPT0gZVNoYXBlLkNvbmUgfHwgdGhpcy5TaGFwZSA9PSBlU2hhcGUuQ29uZVRvTWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRGlyZWN0aW9uID09IGVEaXJlY3Rpb24uQmFyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuQ2x1c3RlcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuQ2x1c3RlcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUNvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICAgICAgICAgI3JlZ2lvbiAiQ3lsaW5kZXIgU2hhcGUiCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuU2hhcGUgPT0gZVNoYXBlLkN5bGluZGVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRGlyZWN0aW9uID09IGVEaXJlY3Rpb24uQmFyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5DbHVzdGVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5DbHVzdGVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2w7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAgICAgICAgICNyZWdpb24gIlB5cmFtaWRlIFNoYXBlIgorICAgICAgICAgICAgICAgIGlmICh0aGlzLlNoYXBlID09IGVTaGFwZS5QeXJhbWlkIHx8IHRoaXMuU2hhcGUgPT0gZVNoYXBlLlB5cmFtaWRUb01heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkRpcmVjdGlvbiA9PSBlRGlyZWN0aW9uLkJhcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkMTAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLkNsdXN0ZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkMTAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLkNsdXN0ZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sQ2x1c3RlcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRDb2w7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0Q2hhcnRUeXBlKG5hbWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCYXJDaGFydFNlcmllLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCYXJDaGFydFNlcmllLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZTU4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJhckNoYXJ0U2VyaWUuY3MKQEAgLTAsMCArMSw4MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHNlcmllIGZvciBhIHNjYXR0ZXIgY2hhcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCYXJDaGFydFNlcmllIDogRXhjZWxDaGFydFNlcmllCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhcnRTZXJpZXMiPlBhcmVudCBjb2xsZWN0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJucyI+TmFtZXNwYWNlbWFuYWdlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+VG9wbm9kZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNQaXZvdCI+SXMgcGl2b3RjaGFydDwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsQmFyQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgorICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgX0RhdGFMYWJlbCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERhdGFsYWJlbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIERhdGFMYWJlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwoX25zLCBfbm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBJTlZFUlRJRk5FR0FUSVZFX1BBVEggPSAiYzppbnZlcnRJZk5lZ2F0aXZlL0B2YWwiOworICAgICAgICBpbnRlcm5hbCBib29sIEludmVydElmTmVnYXRpdmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKElOVkVSVElGTkVHQVRJVkVfUEFUSCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChJTlZFUlRJRk5FR0FUSVZFX1BBVEgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQnViYmxlQ2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWNkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0LmNzCkBAIC0wLDAgKzEsMTM2IEBACivvu791c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGJ1YmJsZSBjaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQnViYmxlQ2hhcnQgOiBFeGNlbENoYXJ0CisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbEJ1YmJsZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgorICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNob3dOZWdhdGl2ZUJ1YmJsZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIEJ1YmJsZVNjYWxlID0gMTAwOworICAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQnViYmxlQ2hhcnRTZXJpZXModGhpcywgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0Tm9kZSwgUGl2b3RUYWJsZVNvdXJjZSE9bnVsbCk7CisgICAgICAgICAgICAvL1NldFR5cGVQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBFeGNlbEJ1YmJsZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBib29sIGlzUGl2b3QpIDoKKyAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIGlzUGl2b3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jaGFydFNlcmllcyA9IG5ldyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzKHRoaXMsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydE5vZGUsIGlzUGl2b3QpOworICAgICAgICAgICAgLy9TZXRUeXBlUHJvcGVydGllcygpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQnViYmxlQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgorICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jaGFydFNlcmllcyA9IG5ldyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzKHRoaXMsIF9kcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnROb2RlLCBmYWxzZSk7CisgICAgICAgICAgICAvL1NldFR5cGVQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxCdWJibGVDaGFydChFeGNlbENoYXJ0IHRvcENoYXJ0LCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgorICAgICAgICAgICAgYmFzZSh0b3BDaGFydCwgY2hhcnROb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBfY2hhcnRTZXJpZXMgPSBuZXcgRXhjZWxCdWJibGVDaGFydFNlcmllcyh0aGlzLCBfZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0Tm9kZSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHN0cmluZyBCVUJCTEVTQ0FMRV9QQVRIID0gImM6YnViYmxlU2NhbGUvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgc2NhbGUgZmFjdG9yIGZvciB0aGUgYnViYmxlIGNoYXJ0LiBDYW4gcmFuZ2UgZnJvbSAwIHRvIDMwMCwgY29ycmVzcG9uZGluZyB0byBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlZmF1bHQgc2l6ZSwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBCdWJibGVTY2FsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVJbnQoQlVCQkxFU0NBTEVfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih2YWx1ZSA8IDAgJiYgdmFsdWUgPiAzMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWJibGVzY2FsZSBvdXQgb2YgcmFuZ2UuIDAtMzAwIGFsbG93ZWQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKEJVQkJMRVNDQUxFX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBTSE9XTkVHQlVCQkxFU19QQVRIID0gImM6c2hvd05lZ0J1YmJsZXMvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgc2NhbGUgZmFjdG9yIGZvciB0aGUgYnViYmxlIGNoYXJ0LiBDYW4gcmFuZ2UgZnJvbSAwIHRvIDMwMCwgY29ycmVzcG9uZGluZyB0byBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlZmF1bHQgc2l6ZSwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd05lZ2F0aXZlQnViYmxlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVCb29sKFNIT1dORUdCVUJCTEVTX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVCb29sKEJVQkJMRVNDQUxFX1BBVEgsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgQlVCQkxFM0RfUEFUSCA9ICJjOmJ1YmJsZTNEL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgaWYgdGhlIGJ1YmJsZWNoYXJ0IGlzIHRocmVlIGRpbWVuc2lvbmFsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEJ1YmJsZTNECisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woQlVCQkxFM0RfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZUJvb2woQlVCQkxFM0RfUEFUSCwgdmFsdWUpOworICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9IHZhbHVlID8gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdCA6IGVDaGFydFR5cGUuQnViYmxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBTSVpFUkVQUkVTRU5UU19QQVRIID0gImM6c2l6ZVJlcHJlc2VudHMvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgc2NhbGUgZmFjdG9yIGZvciB0aGUgYnViYmxlIGNoYXJ0LiBDYW4gcmFuZ2UgZnJvbSAwIHRvIDMwMCwgY29ycmVzcG9uZGluZyB0byBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlZmF1bHQgc2l6ZSwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVTaXplUmVwcmVzZW50cyBTaXplUmVwcmVzZW50cworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdiA9IF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKFNJWkVSRVBSRVNFTlRTX1BBVEgpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gInciKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTaXplUmVwcmVzZW50cy5XaWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTaXplUmVwcmVzZW50cy5BcmVhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKFNJWkVSRVBSRVNFTlRTX1BBVEgsIHZhbHVlID09IGVTaXplUmVwcmVzZW50cy5XaWR0aCA/ICJ3IiA6ICJhcmVhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG5ldyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzIFNlcmllcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHJldHVybiAoRXhjZWxCdWJibGVDaGFydFNlcmllcylfY2hhcnRTZXJpZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgZUNoYXJ0VHlwZSBHZXRDaGFydFR5cGUoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChCdWJibGUzRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CdWJibGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0U2VyaWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0OTFkNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQnViYmxlQ2hhcnRTZXJpZS5jcwpAQCAtMCwwICsxLDE2MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHNlcmllIGZvciBhIHNjYXR0ZXIgY2hhcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCdWJibGVDaGFydFNlcmllIDogRXhjZWxDaGFydFNlcmllCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhcnRTZXJpZXMiPlBhcmVudCBjb2xsZWN0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJucyI+TmFtZXNwYWNlbWFuYWdlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+VG9wbm9kZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNQaXZvdCI+SXMgcGl2b3RjaGFydDwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsQnViYmxlQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgorICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGF0YWxhYmVsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgRGF0YUxhYmVsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfRGF0YUxhYmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfRGF0YUxhYmVsID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbChfbnMsIF9ub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9EYXRhTGFiZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIEJVQkJMRTNEX1BBVEggPSAiYzpidWJibGUzRC9AdmFsIjsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCBCdWJibGUzRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woQlVCQkxFM0RfUEFUSCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChCVUJCTEUzRF9QQVRILCB2YWx1ZSk7ICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBJTlZFUlRJRk5FR0FUSVZFX1BBVEggPSAiYzppbnZlcnRJZk5lZ2F0aXZlL0B2YWwiOworICAgICAgICBpbnRlcm5hbCBib29sIEludmVydElmTmVnYXRpdmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKElOVkVSVElGTkVHQVRJVkVfUEFUSCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChJTlZFUlRJRk5FR0FUSVZFX1BBVEgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFNlcmllcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5TZXJpZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlLlNlcmllcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KEJ1YmJsZVNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVMaXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIEJVQkJMRVNJWkVfVE9QUEFUSCA9ICJjOmJ1YmJsZVNpemUiOworICAgICAgICBjb25zdCBzdHJpbmcgQlVCQkxFU0laRV9QQVRIID0gQlVCQkxFU0laRV9UT1BQQVRIICsgIi9jOm51bVJlZi9jOmYiOworICAgICAgICBwdWJsaWMgc3RyaW5nIEJ1YmJsZVNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoQlVCQkxFU0laRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlTGl0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQlVCQkxFU0laRV9QQVRILCBFeGNlbENlbGxCYXNlLkdldEZ1bGxBZGRyZXNzKF9jaGFydFNlcmllcy5DaGFydC5Xb3JrU2hlZXQuTmFtZSwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgWG1sTm9kZSBjYWNoZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJ7MH0vYzpudW1DYWNoZSIsIEJVQkJMRVNJWkVfUEFUSCksIF9ucyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNhY2hlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IiwgQlVCQkxFU0laRV9UT1BQQVRIKSk7CisgICAgICAgICAgICAgICAgICAgIC8vWG1sTm9kZSBsaXQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IiwgX3hTZXJpZXNUb3BQYXRoKSwgX25zKTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAobGl0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICBsaXQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChsaXQpOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIEdlbmVyYXRlTGl0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHMgPSBuZXcgRXhjZWxBZGRyZXNzKFNlcmllcyk7CisgICAgICAgICAgICB2YXIgaXggPSAwOworICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IHMuX2Zyb21Sb3c7IHJvdyA8PSBzLl90b1Jvdzsgcm93KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IHMuX2Zyb21Db2w7IGMgPD0gcy5fdG9Db2w7IGMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiPGM6cHQgaWR4PVwiezB9XCI+PGM6dj4xPC9jOnY+PC9jOnB0PiIsIGl4KyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENyZWF0ZU5vZGUoQlVCQkxFU0laRV9UT1BQQVRIICsgIi9jOm51bUxpdCIsIHRydWUpOworICAgICAgICAgICAgWG1sTm9kZSBsaXQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IiwgQlVCQkxFU0laRV9UT1BQQVRIKSwgX25zKTsKKyAgICAgICAgICAgIGxpdC5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOmZvcm1hdENvZGU+R2VuZXJhbDwvYzpmb3JtYXRDb2RlPjxjOnB0Q291bnQgdmFsPVwiezB9XCIvPnsxfSIsIGl4LCBzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTkwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0LmNzCkBAIC0wLDAgKzEsMTkzMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgICNyZWdpb24gIkNoYXJ0IEVudW1zIgorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ2hhcnQgdHlwZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUNoYXJ0VHlwZQorICAgIHsKKyAgICAgICAgQXJlYTNEPS00MDk4LAorICAgICAgICBBcmVhU3RhY2tlZDNEPTc4LAorICAgICAgICBBcmVhU3RhY2tlZDEwMDNEPTc5LAorICAgICAgICBCYXJDbHVzdGVyZWQzRD0gNjAsCisgICAgICAgIEJhclN0YWNrZWQzRD02MSwKKyAgICAgICAgQmFyU3RhY2tlZDEwMDNEPTYyLAorICAgICAgICBDb2x1bW4zRD0tNDEwMCwKKyAgICAgICAgQ29sdW1uQ2x1c3RlcmVkM0Q9NTQsCisgICAgICAgIENvbHVtblN0YWNrZWQzRD01NSwKKyAgICAgICAgQ29sdW1uU3RhY2tlZDEwMDNEPTU2LAorICAgICAgICBMaW5lM0Q9LTQxMDEsCisgICAgICAgIFBpZTNEPS00MTAyLAorICAgICAgICBQaWVFeHBsb2RlZDNEPTcwLAorICAgICAgICBBcmVhPTEsCisgICAgICAgIEFyZWFTdGFja2VkPTc2LAorICAgICAgICBBcmVhU3RhY2tlZDEwMD03NywKKyAgICAgICAgQmFyQ2x1c3RlcmVkPTU3LAorICAgICAgICBCYXJPZlBpZT03MSwKKyAgICAgICAgQmFyU3RhY2tlZD01OCwKKyAgICAgICAgQmFyU3RhY2tlZDEwMD01OSwKKyAgICAgICAgQnViYmxlPTE1LAorICAgICAgICBCdWJibGUzREVmZmVjdD04NywKKyAgICAgICAgQ29sdW1uQ2x1c3RlcmVkPTUxLAorICAgICAgICBDb2x1bW5TdGFja2VkPTUyLAorICAgICAgICBDb2x1bW5TdGFja2VkMTAwPTUzLAorICAgICAgICBDb25lQmFyQ2x1c3RlcmVkPTEwMiwKKyAgICAgICAgQ29uZUJhclN0YWNrZWQ9MTAzLAorICAgICAgICBDb25lQmFyU3RhY2tlZDEwMD0xMDQsCisgICAgICAgIENvbmVDb2w9MTA1LAorICAgICAgICBDb25lQ29sQ2x1c3RlcmVkPTk5LAorICAgICAgICBDb25lQ29sU3RhY2tlZD0xMDAsCisgICAgICAgIENvbmVDb2xTdGFja2VkMTAwPTEwMSwKKyAgICAgICAgQ3lsaW5kZXJCYXJDbHVzdGVyZWQ9OTUsCisgICAgICAgIEN5bGluZGVyQmFyU3RhY2tlZD05NiwKKyAgICAgICAgQ3lsaW5kZXJCYXJTdGFja2VkMTAwPTk3LAorICAgICAgICBDeWxpbmRlckNvbD05OCwKKyAgICAgICAgQ3lsaW5kZXJDb2xDbHVzdGVyZWQ9OTIsCisgICAgICAgIEN5bGluZGVyQ29sU3RhY2tlZD05MywKKyAgICAgICAgQ3lsaW5kZXJDb2xTdGFja2VkMTAwPTk0LAorICAgICAgICBEb3VnaG51dD0tNDEyMCwKKyAgICAgICAgRG91Z2hudXRFeHBsb2RlZD04MCwKKyAgICAgICAgTGluZT00LAorICAgICAgICBMaW5lTWFya2Vycz02NSwKKyAgICAgICAgTGluZU1hcmtlcnNTdGFja2VkPTY2LAorICAgICAgICBMaW5lTWFya2Vyc1N0YWNrZWQxMDA9NjcsCisgICAgICAgIExpbmVTdGFja2VkPTYzLAorICAgICAgICBMaW5lU3RhY2tlZDEwMD02NCwKKyAgICAgICAgUGllPTUsCisgICAgICAgIFBpZUV4cGxvZGVkPTY5LAorICAgICAgICBQaWVPZlBpZT02OCwKKyAgICAgICAgUHlyYW1pZEJhckNsdXN0ZXJlZD0xMDksCisgICAgICAgIFB5cmFtaWRCYXJTdGFja2VkPTExMCwKKyAgICAgICAgUHlyYW1pZEJhclN0YWNrZWQxMDA9MTExLAorICAgICAgICBQeXJhbWlkQ29sPTExMiwKKyAgICAgICAgUHlyYW1pZENvbENsdXN0ZXJlZD0xMDYsCisgICAgICAgIFB5cmFtaWRDb2xTdGFja2VkPTEwNywKKyAgICAgICAgUHlyYW1pZENvbFN0YWNrZWQxMDA9MTA4LAorICAgICAgICBSYWRhcj0tNDE1MSwKKyAgICAgICAgUmFkYXJGaWxsZWQ9ODIsCisgICAgICAgIFJhZGFyTWFya2Vycz04MSwKKyAgICAgICAgU3RvY2tITEM9ODgsCisgICAgICAgIFN0b2NrT0hMQz04OSwKKyAgICAgICAgU3RvY2tWSExDPTkwLAorICAgICAgICBTdG9ja1ZPSExDPTkxLAorICAgICAgICBTdXJmYWNlPTgzLAorICAgICAgICBTdXJmYWNlVG9wVmlldz04NSwKKyAgICAgICAgU3VyZmFjZVRvcFZpZXdXaXJlZnJhbWU9ODYsCisgICAgICAgIFN1cmZhY2VXaXJlZnJhbWU9ODQsCisgICAgICAgIFhZU2NhdHRlcj0tNDE2OSwKKyAgICAgICAgWFlTY2F0dGVyTGluZXM9NzQsCisgICAgICAgIFhZU2NhdHRlckxpbmVzTm9NYXJrZXJzPTc1LAorICAgICAgICBYWVNjYXR0ZXJTbW9vdGg9NzIsCisgICAgICAgIFhZU2NhdHRlclNtb290aE5vTWFya2Vycz03MworfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFyIG9yIGNvbHVtbgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZURpcmVjdGlvbgorICAgIHsKKyAgICAgICAgQ29sdW1uLAorICAgICAgICBCYXIKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBIb3cgdGhlIHNlcmllcyBhcmUgZ3JvdXBlZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUdyb3VwaW5nCisgICAgeworICAgICAgICBTdGFuZGFyZCwKKyAgICAgICAgQ2x1c3RlcmVkLAorICAgICAgICBTdGFja2VkLAorICAgICAgICBQZXJjZW50U3RhY2tlZAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNoYXBlIGZvciBiYXIgY2hhcnRzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlU2hhcGUKKyAgICB7CisgICAgICAgIEJveCwKKyAgICAgICAgQ29uZSwKKyAgICAgICAgQ29uZVRvTWF4LAorICAgICAgICBDeWxpbmRlciwKKyAgICAgICAgUHlyYW1pZCwKKyAgICAgICAgUHlyYW1pZFRvTWF4CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU21vb3RoIG9yIGxpbmVzIG1hcmtlcnMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVTY2F0dGVyU3R5bGUKKyAgICB7CisgICAgICAgIExpbmVNYXJrZXIsCisgICAgICAgIFNtb290aE1hcmtlciwKKyAgICAgfQorICAgIHB1YmxpYyBlbnVtIGVSYWRhclN0eWxlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhhdCB0aGUgcmFkYXIgY2hhcnQgc2hhbGwgYmUgZmlsbGVkIGFuZCBoYXZlIGxpbmVzIGJ1dCBubyBtYXJrZXJzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBGaWxsZWQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSByYWRhciBjaGFydCBzaGFsbCBoYXZlIGxpbmVzIGFuZCBtYXJrZXJzIGJ1dCBubyBmaWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNYXJrZXIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSByYWRhciBjaGFydCBzaGFsbCBoYXZlIGxpbmVzIGJ1dCBubyBtYXJrZXJzIGFuZCBubyBmaWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTdGFuZGFyZCAKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCYXIgb3IgcGllCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlUGllVHlwZQorICAgIHsKKyAgICAgICAgQmFyLAorICAgICAgICBQaWUKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQb3NpdGlvbiBvZiB0aGUgbGFiZWxzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlTGFiZWxQb3NpdGlvbgorICAgIHsKKyAgICAgICAgQmVzdEZpdCwKKyAgICAgICAgTGVmdCwKKyAgICAgICAgUmlnaHQsCisgICAgICAgIENlbnRlciwKKyAgICAgICAgVG9wLAorICAgICAgICBCb3R0b20sCisgICAgICAgIEluQmFzZSwKKyAgICAgICAgSW5FbmQsCisgICAgICAgIE91dEVuZAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEF4aXMgbGFiZWwgcG9zaXRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVUaWNrTGFiZWxQb3NpdGlvbgorICAgIHsKKyAgICAgICAgSGlnaCwKKyAgICAgICAgTG93LAorICAgICAgICBOZXh0VG8sCisgICAgICAgIE5vbmUKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNYXJrZXJzdHlsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZU1hcmtlclN0eWxlCisgICAgeyAgICAgICAgCisgICAgICAgIENpcmNsZSwKKyAgICAgICAgRGFzaCwKKyAgICAgICAgRGlhbW9uZCwKKyAgICAgICAgRG90LAorICAgICAgICBOb25lLAorICAgICAgICBQaWN0dXJlLAorICAgICAgICBQbHVzLAorICAgICAgICBTcXVhcmUsCisgICAgICAgIFN0YXIsCisgICAgICAgIFRyaWFuZ2xlLAorICAgICAgICBYLAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBidWlsZCBpbiBzdHlsZSBvZiB0aGUgY2hhcnQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlQ2hhcnRTdHlsZQorICAgIHsKKyAgICAgICAgTm9uZSwKKyAgICAgICAgU3R5bGUxLAorICAgICAgICBTdHlsZTIsCisgICAgICAgIFN0eWxlMywKKyAgICAgICAgU3R5bGU0LAorICAgICAgICBTdHlsZTUsCisgICAgICAgIFN0eWxlNiwKKyAgICAgICAgU3R5bGU3LAorICAgICAgICBTdHlsZTgsCisgICAgICAgIFN0eWxlOSwKKyAgICAgICAgU3R5bGUxMCwKKyAgICAgICAgU3R5bGUxMSwKKyAgICAgICAgU3R5bGUxMiwKKyAgICAgICAgU3R5bGUxMywKKyAgICAgICAgU3R5bGUxNCwKKyAgICAgICAgU3R5bGUxNSwKKyAgICAgICAgU3R5bGUxNiwKKyAgICAgICAgU3R5bGUxNywKKyAgICAgICAgU3R5bGUxOCwKKyAgICAgICAgU3R5bGUxOSwKKyAgICAgICAgU3R5bGUyMCwKKyAgICAgICAgU3R5bGUyMSwKKyAgICAgICAgU3R5bGUyMiwKKyAgICAgICAgU3R5bGUyMywKKyAgICAgICAgU3R5bGUyNCwKKyAgICAgICAgU3R5bGUyNSwKKyAgICAgICAgU3R5bGUyNiwKKyAgICAgICAgU3R5bGUyNywKKyAgICAgICAgU3R5bGUyOCwKKyAgICAgICAgU3R5bGUyOSwKKyAgICAgICAgU3R5bGUzMCwKKyAgICAgICAgU3R5bGUzMSwKKyAgICAgICAgU3R5bGUzMiwKKyAgICAgICAgU3R5bGUzMywKKyAgICAgICAgU3R5bGUzNCwKKyAgICAgICAgU3R5bGUzNSwKKyAgICAgICAgU3R5bGUzNiwKKyAgICAgICAgU3R5bGUzNywKKyAgICAgICAgU3R5bGUzOCwKKyAgICAgICAgU3R5bGUzOSwKKyAgICAgICAgU3R5bGU0MCwKKyAgICAgICAgU3R5bGU0MSwKKyAgICAgICAgU3R5bGU0MiwKKyAgICAgICAgU3R5bGU0MywKKyAgICAgICAgU3R5bGU0NCwKKyAgICAgICAgU3R5bGU0NSwKKyAgICAgICAgU3R5bGU0NiwKKyAgICAgICAgU3R5bGU0NywKKyAgICAgICAgU3R5bGU0OAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFR5cGUgb2YgVHJlbmRsaW5lIGZvciBhIGNoYXJ0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlVHJlbmRMaW5lCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHRyZW5kbGluZSBzaGFsbCBiZSBhbiBleHBvbmVudGlhbCBjdXJ2ZSBpbiB0aGUgZm9ybQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFeHBvbmVudGlhbCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB0cmVuZGxpbmUgc2hhbGwgYmUgYSBsb2dhcml0aG1pYyBjdXJ2ZSBpbiB0aGUgZm9ybSAsIHdoZXJlIGxvZyBpcyB0aGUgbmF0dXJhbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMaW5lYXIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdHJlbmRsaW5lIHNoYWxsIGJlIGEgbG9nYXJpdGhtaWMgY3VydmUgaW4gdGhlIGZvcm0gLCB3aGVyZSBsb2cgaXMgdGhlIG5hdHVyYWwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTG9nYXJpdGhtaWMsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdHJlbmRsaW5lIHNoYWxsIGJlIGEgbW92aW5nIGF2ZXJhZ2Ugb2YgcGVyaW9kIFBlcmlvZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNb3ZpbmdBdmdlcmFnZSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB0cmVuZGxpbmUgc2hhbGwgYmUgYSBwb2x5bm9taWFsIGN1cnZlIG9mIG9yZGVyIE9yZGVyIGluIHRoZSBmb3JtIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBQb2x5bm9taWFsLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHRyZW5kbGluZSBzaGFsbCBiZSBhIHBvd2VyIGN1cnZlIGluIHRoZSBmb3JtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBvd2VyCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3BlY2lmaWVzIHRoZSBwb3NzaWJsZSB3YXlzIHRvIGRpc3BsYXkgYmxhbmtzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlRGlzcGxheUJsYW5rc0FzCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCbGFuayB2YWx1ZXMgc2hhbGwgYmUgbGVmdCBhcyBhIGdhcAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBHYXAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJsYW5rIHZhbHVlcyBzaGFsbCBiZSBzcGFubmVkIHdpdGggYSBsaW5lIChMaW5lIGNoYXJ0cykKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU3BhbiwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQmxhbmsgdmFsdWVzIHNoYWxsIGJlIHRyZWF0ZWQgYXMgemVybworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBaZXJvCisgICAgfQorICAgIHB1YmxpYyBlbnVtIGVTaXplUmVwcmVzZW50cworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBhcmVhIG9mIHRoZSBidWJibGVzIHNoYWxsIGJlIHByb3BvcnRpb25hbCB0byB0aGUgYnViYmxlIHNpemUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEFyZWEsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgcmFkaXVzIG9mIHRoZSBidWJibGVzIHNoYWxsIGJlIHByb3BvcnRpb25hbCB0byB0aGUgYnViYmxlIHNpemUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFdpZHRoCisgICAgfQorICAgICNlbmRyZWdpb24KKyAgICAKKyAgICAKKyAgICAvLy8gPHN1bW1hcnk+CisgICAvLy8gQmFzZSBjbGFzcyBmb3IgQ2hhcnQgb2JqZWN0LgorICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydCA6IEV4Y2VsRHJhd2luZworICAgIHsKKyAgICAgICBjb25zdCBzdHJpbmcgcm9vdFBhdGggPSAiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpwbG90QXJlYSI7CisgICAgICAgLy9zdHJpbmcgX2NoYXJ0UGF0aDsKKyAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgRXhjZWxDaGFydFNlcmllcyBfY2hhcnRTZXJpZXM7CisgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydEF4aXNbXSBfYXhpczsKKyAgICAgICBwcm90ZWN0ZWQgWG1sSGVscGVyIF9jaGFydFhtbEhlbHBlcjsKKyAgICAgICAjcmVnaW9uICJDb25zdHJ1Y3RvcnMiCisgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgYm9vbCBpc1Bpdm90KSA6CisgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsICJ4ZHI6Z3JhcGhpY0ZyYW1lL3hkcjpudkdyYXBoaWNGcmFtZVByL3hkcjpjTnZQci9AbmFtZSIpCisgICAgICAgeworICAgICAgICAgICBDaGFydFR5cGUgPSB0eXBlOworICAgICAgICAgICBDcmVhdGVOZXdDaGFydChkcmF3aW5ncywgdHlwZSwgbnVsbCk7CisKKyAgICAgICAgICAgSW5pdChkcmF3aW5ncywgX2NoYXJ0Tm9kZSk7CisKKyAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZXModGhpcywgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0Tm9kZSwgaXNQaXZvdCk7CisKKyAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgTG9hZEF4aXMoKTsKKyAgICAgICB9CisgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgRXhjZWxDaGFydCB0b3BDaGFydCwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpIDoKKyAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgInhkcjpncmFwaGljRnJhbWUveGRyOm52R3JhcGhpY0ZyYW1lUHIveGRyOmNOdlByL0BuYW1lIikKKyAgICAgICB7CisgICAgICAgICAgIENoYXJ0VHlwZSA9IHR5cGU7CisgICAgICAgICAgIENyZWF0ZU5ld0NoYXJ0KGRyYXdpbmdzLCB0eXBlLCB0b3BDaGFydCk7CisKKyAgICAgICAgICAgSW5pdChkcmF3aW5ncywgX2NoYXJ0Tm9kZSk7CisKKyAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZXModGhpcywgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0Tm9kZSwgUGl2b3RUYWJsZVNvdXJjZSE9bnVsbCk7CisgICAgICAgICAgIGlmIChQaXZvdFRhYmxlU291cmNlICE9IG51bGwpIFNldFBpdm90U291cmNlKFBpdm90VGFibGVTb3VyY2UpOworCisgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgTG9hZEF4aXMoKTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBfYXhpcyA9IHRvcENoYXJ0LkF4aXM7CisgICAgICAgICAgICAgICBpZiAoX2F4aXMuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBYQXhpcyA9IF9heGlzWzBdOworICAgICAgICAgICAgICAgICAgIFlBeGlzID0gX2F4aXNbMV07CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsICJ4ZHI6Z3JhcGhpY0ZyYW1lL3hkcjpudkdyYXBoaWNGcmFtZVByL3hkcjpjTnZQci9AbmFtZSIpCisgICAgICAgeworICAgICAgICAgICBVcmlDaGFydCA9IHVyaUNoYXJ0OworICAgICAgICAgICBQYXJ0ID0gcGFydDsKKyAgICAgICAgICAgQ2hhcnRYbWwgPSBjaGFydFhtbDsKKyAgICAgICAgICAgX2NoYXJ0Tm9kZSA9IGNoYXJ0Tm9kZTsKKyAgICAgICAgICAgSW5pdENoYXJ0TG9hZChkcmF3aW5ncywgY2hhcnROb2RlKTsKKyAgICAgICAgICAgQ2hhcnRUeXBlID0gR2V0Q2hhcnRUeXBlKGNoYXJ0Tm9kZS5Mb2NhbE5hbWUpOworICAgICAgIH0KKyAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgIGJhc2UodG9wQ2hhcnQuX2RyYXdpbmdzLCB0b3BDaGFydC5Ub3BOb2RlLCAieGRyOmdyYXBoaWNGcmFtZS94ZHI6bnZHcmFwaGljRnJhbWVQci94ZHI6Y052UHIvQG5hbWUiKQorICAgICAgIHsKKyAgICAgICAgICAgVXJpQ2hhcnQgPSB0b3BDaGFydC5VcmlDaGFydDsKKyAgICAgICAgICAgUGFydCA9IHRvcENoYXJ0LlBhcnQ7CisgICAgICAgICAgIENoYXJ0WG1sID0gdG9wQ2hhcnQuQ2hhcnRYbWw7CisgICAgICAgICAgIF9wbG90QXJlYSA9IHRvcENoYXJ0LlBsb3RBcmVhOworICAgICAgICAgICBfY2hhcnROb2RlID0gY2hhcnROb2RlOworCisgICAgICAgICAgIEluaXRDaGFydExvYWQodG9wQ2hhcnQuX2RyYXdpbmdzLCBjaGFydE5vZGUpOworICAgICAgIH0KKyAgICAgICBwcml2YXRlIHZvaWQgSW5pdENoYXJ0TG9hZChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIGNoYXJ0Tm9kZSkKKyAgICAgICB7CisgICAgICAgICAgIC8vU2V0Q2hhcnRUeXBlKCk7CisgICAgICAgICAgIGJvb2wgaXNQaXZvdCA9IGZhbHNlOworICAgICAgICAgICBJbml0KGRyYXdpbmdzLCBjaGFydE5vZGUpOworICAgICAgICAgICBfY2hhcnRTZXJpZXMgPSBuZXcgRXhjZWxDaGFydFNlcmllcyh0aGlzLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnROb2RlLCBpc1Bpdm90IC8qQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZShfY2hhcnRQYXRoLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKSovKTsKKyAgICAgICAgICAgTG9hZEF4aXMoKTsKKyAgICAgICB9CisKKyAgICAgICBwcml2YXRlIHZvaWQgSW5pdChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIGNoYXJ0Tm9kZSkKKyAgICAgICB7CisgICAgICAgICAgIC8vX2NoYXJ0WG1sSGVscGVyID0gbmV3IFhtbEhlbHBlcihkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBjaGFydE5vZGUpOworICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBjaGFydE5vZGUpOworICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInRpdGxlIiwgInBpdm90Rm10IiwgImF1dG9UaXRsZURlbGV0ZWQiLCAidmlldzNEIiwgImZsb29yIiwgInNpZGVXYWxsIiwgImJhY2tXYWxsIiwgInBsb3RBcmVhIiwgIndpcmVmcmFtZSIsICJiYXJEaXIiLCAiZ3JvdXBpbmciLCAic2NhdHRlclN0eWxlIiwgInJhZGFyU3R5bGUiLCAidmFyeUNvbG9ycyIsICJzZXIiLCAiZExibHMiLCAiYnViYmxlU2NhbGUiLCAic2hvd05lZ0J1YmJsZXMiLCAiZHJvcExpbmVzIiwgInVwRG93bkJhcnMiLCAibWFya2VyIiwgInNtb290aCIsICJzaGFwZSIsICJsZWdlbmQiLCAicGxvdFZpc09ubHkiLCAiZGlzcEJsYW5rc0FzIiwgInNob3dETGJsc092ZXJNYXgiLCAib3ZlcmxhcCIsICJiYW5kRm10cyIsICJheElkIiwgInNwUHIiLCAicHJpbnRTZXR0aW5ncyIgfTsKKyAgICAgICAgICAgV29ya1NoZWV0ID0gZHJhd2luZ3MuV29ya3NoZWV0OworICAgICAgIH0KKyAgICAgICAjZW5kcmVnaW9uCisgICAgICAgI3JlZ2lvbiAiUHJpdmF0ZSBmdW5jdGlvbnMiCisgICAgICAgcHJpdmF0ZSB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKCkKKyAgICAgICB7CisgICAgICAgICAgIC8qKioqKioqIEdyb3VwaW5nICoqKioqKiovCisgICAgICAgICAgIGlmIChJc1R5cGVDbHVzdGVyZWQoKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgR3JvdXBpbmcgPSBlR3JvdXBpbmcuQ2x1c3RlcmVkOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgaWYgKAorICAgICAgICAgICAgICAgSXNUeXBlU3RhY2tlZCgpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBHcm91cGluZyA9IGVHcm91cGluZy5TdGFja2VkOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgaWYgKAorICAgICAgICAgICBJc1R5cGVQZXJjZW50U3RhY2tlZCgpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBHcm91cGluZyA9IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZDsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIC8qKioqKiAzRCBQZXJzcGVjdGl2ZSAqKioqKi8KKyAgICAgICAgICAgaWYgKElzVHlwZTNEKCkpICAgICAgICAgICAgIAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBWaWV3M0QuUm90WSA9IDIwOworICAgICAgICAgICAgICAgVmlldzNELlBlcnNwZWN0aXZlID0gMzA7ICAgIC8vRGVmYXVsdCB0byAzMAorICAgICAgICAgICAgICAgaWYgKElzVHlwZVBpZURvdWdobnV0KCkpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgVmlldzNELlJvdFggPSAzMDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBWaWV3M0QuUm90WCA9IDE1OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVOZXdDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQpCisgICAgICAgeworICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgWG1sRWxlbWVudCBncmFwaEZyYW1lID0gVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoImdyYXBoaWNGcmFtZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgICAgIGdyYXBoRnJhbWUuU2V0QXR0cmlidXRlKCJtYWNybyIsICIiKTsKKyAgICAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoZ3JhcGhGcmFtZSk7IAorICAgICAgICAgICAgICAgZ3JhcGhGcmFtZS5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjx4ZHI6bnZHcmFwaGljRnJhbWVQcj48eGRyOmNOdlByIGlkPVwiezB9XCIgbmFtZT1cIkNoYXJ0IDFcIiAvPjx4ZHI6Y052R3JhcGhpY0ZyYW1lUHIgLz48L3hkcjpudkdyYXBoaWNGcmFtZVByPjx4ZHI6eGZybT48YTpvZmYgeD1cIjBcIiB5PVwiMFwiIC8+IDxhOmV4dCBjeD1cIjBcIiBjeT1cIjBcIiAvPjwveGRyOnhmcm0+PGE6Z3JhcGhpYz48YTpncmFwaGljRGF0YSB1cmk9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvY2hhcnRcIj48YzpjaGFydCB4bWxuczpjPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0XCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIiByOmlkPVwicklkMVwiIC8+ICAgPC9hOmdyYXBoaWNEYXRhPiAgPC9hOmdyYXBoaWM+IixfaWQpOworICAgICAgICAgICAgICAgVG9wTm9kZS5BcHBlbmRDaGlsZChUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiY2xpZW50RGF0YSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKSk7CisKKyAgICAgICAgICAgICAgIHZhciBwYWNrYWdlID0gZHJhd2luZ3MuV29ya3NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAgICBVcmlDaGFydCA9IEdldE5ld1VyaShwYWNrYWdlLCAiL3hsL2NoYXJ0cy9jaGFydHswfS54bWwiKTsKKworICAgICAgICAgICAgICAgQ2hhcnRYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgIENoYXJ0WG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IEV4Y2VsUGFja2FnZS5wcmVzZXJ2ZVdoaXRlc3BhY2U7CisgICAgICAgICAgICAgICBMb2FkWG1sU2FmZShDaGFydFhtbCwgQ2hhcnRTdGFydFhtbCh0eXBlKSwgRW5jb2RpbmcuVVRGOCk7CisKKyAgICAgICAgICAgICAgIC8vIHNhdmUgaXQgdG8gdGhlIHBhY2thZ2UKKyAgICAgICAgICAgICAgIFBhcnQgPSBwYWNrYWdlLkNyZWF0ZVBhcnQoVXJpQ2hhcnQsICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0K3htbCIsIF9kcmF3aW5ncy5fcGFja2FnZS5Db21wcmVzc2lvbik7CisKKyAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1DaGFydCA9IG5ldyBTdHJlYW1Xcml0ZXIoUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgICAgICAgICBDaGFydFhtbC5TYXZlKHN0cmVhbUNoYXJ0KTsKKyAgICAgICAgICAgICAgIHN0cmVhbUNoYXJ0LkNsb3NlKCk7CisgICAgICAgICAgICAgICBwYWNrYWdlLkZsdXNoKCk7CisKKyAgICAgICAgICAgICAgIHZhciBjaGFydFJlbGF0aW9uID0gZHJhd2luZ3MuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKGRyYXdpbmdzLlVyaURyYXdpbmcsIFVyaUNoYXJ0KSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9jaGFydCIpOworICAgICAgICAgICAgICAgZ3JhcGhGcmFtZS5TZWxlY3RTaW5nbGVOb2RlKCJhOmdyYXBoaWMvYTpncmFwaGljRGF0YS9jOmNoYXJ0IiwgTmFtZVNwYWNlTWFuYWdlcikuQXR0cmlidXRlc1sicjppZCJdLlZhbHVlID0gY2hhcnRSZWxhdGlvbi5JZDsKKyAgICAgICAgICAgICAgIHBhY2thZ2UuRmx1c2goKTsKKyAgICAgICAgICAgICAgIF9jaGFydE5vZGUgPSBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEvezB9IiwgR2V0Q2hhcnROb2RlVGV4dCgpKSwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBDaGFydFhtbCA9IHRvcENoYXJ0LkNoYXJ0WG1sOworICAgICAgICAgICAgICAgUGFydCA9IHRvcENoYXJ0LlBhcnQ7CisgICAgICAgICAgICAgICBfcGxvdEFyZWEgPSB0b3BDaGFydC5QbG90QXJlYTsKKyAgICAgICAgICAgICAgIFVyaUNoYXJ0ID0gdG9wQ2hhcnQuVXJpQ2hhcnQ7CisgICAgICAgICAgICAgICBfYXhpcyA9IHRvcENoYXJ0Ll9heGlzOworCisgICAgICAgICAgICAgICBYbWxOb2RlIHByZU5vZGUgPSBfcGxvdEFyZWEuQ2hhcnRUeXBlc1tfcGxvdEFyZWEuQ2hhcnRUeXBlcy5Db3VudCAtIDFdLkNoYXJ0Tm9kZTsKKyAgICAgICAgICAgICAgIF9jaGFydE5vZGUgPSAoKFhtbERvY3VtZW50KUNoYXJ0WG1sKS5DcmVhdGVFbGVtZW50KEdldENoYXJ0Tm9kZVRleHQoKSwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKKyAgICAgICAgICAgICAgIHByZU5vZGUuUGFyZW50Tm9kZS5JbnNlcnRBZnRlcihfY2hhcnROb2RlLCBwcmVOb2RlKTsKKyAgICAgICAgICAgICAgIGlmICh0b3BDaGFydC5BeGlzLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIEFkZEF4aXMoKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHN0cmluZyBzZXJpZVhNTCA9IEdldENoYXJ0U2VyaWVTdGFydFhtbCh0eXBlLCBpbnQuUGFyc2UodG9wQ2hhcnQuQXhpc1swXS5JZCksIGludC5QYXJzZSh0b3BDaGFydC5BeGlzWzFdLklkKSwgdG9wQ2hhcnQuQXhpcy5MZW5ndGg+Mj9pbnQuUGFyc2UodG9wQ2hhcnQuQXhpc1syXS5JZCkgOiAtMSk7CisgICAgICAgICAgICAgICBfY2hhcnROb2RlLklubmVyWG1sID0gc2VyaWVYTUw7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRBeGlzKCkKKyAgICAgICB7CisgICAgICAgICAgIFhtbE5vZGVMaXN0IG5sID0gX2NoYXJ0Tm9kZS5TZWxlY3ROb2RlcygiYzpheElkIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgIExpc3Q8RXhjZWxDaGFydEF4aXM+IGwgPSBuZXcgTGlzdDxFeGNlbENoYXJ0QXhpcz4oKTsKKyAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBub2RlIGluIG5sKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBzdHJpbmcgaWQgPSBub2RlLkF0dHJpYnV0ZXNbInZhbCJdLlZhbHVlOworICAgICAgICAgICAgICAgdmFyIGF4Tm9kZSA9IENoYXJ0WG1sLlNlbGVjdE5vZGVzKHJvb3RQYXRoICsgc3RyaW5nLkZvcm1hdCgiLyovYzpheElkW0B2YWw9XCJ7MH1cIl0iLCBpZCksIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgaWYgKGF4Tm9kZSAhPSBudWxsICYmIGF4Tm9kZS5Db3VudD4xKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgYXhuIGluIGF4Tm9kZSkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChheG4uUGFyZW50Tm9kZS5Mb2NhbE5hbWUuRW5kc1dpdGgoIkF4IikpCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbE5vZGUgYXhpc05vZGUgPSBheE5vZGVbMV0uUGFyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRBeGlzIGF4ID0gbmV3IEV4Y2VsQ2hhcnRBeGlzKE5hbWVTcGFjZU1hbmFnZXIsIGF4aXNOb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuQWRkKGF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBfYXhpcyA9IGwuVG9BcnJheSgpOworCisgICAgICAgICAgIGlmKF9heGlzLkxlbmd0aCA+IDApIFhBeGlzID0gX2F4aXNbMF07CisgICAgICAgICAgIGlmIChfYXhpcy5MZW5ndGggPiAxKSBZQXhpcyA9IF9heGlzWzFdOworICAgICAgIH0KKyAgICAgICAvL3ByaXZhdGUgdm9pZCBTZXRDaGFydFR5cGUoKQorICAgICAgIC8veworICAgICAgIC8vICAgIENoYXJ0VHlwZSA9IDA7CisgICAgICAgLy8gICAgLy9fcGxvdEFyZWEgPSBuZXcgRXhjZWxDaGFydFBsb3RBcmVhKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgLy8gICAgaW50IHBvcz0wOworICAgICAgIC8vICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbiBpbiBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKHJvb3RQYXRoLCBfZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlcikuQ2hpbGROb2RlcykKKyAgICAgICAvLyAgICB7CisgICAgICAgLy8gICAgICAgIGlmIChwb3MgPT0gMCkKKyAgICAgICAvLyAgICAgICAgeworICAgICAgIC8vICAgICAgICAgICAgQ2hhcnRUeXBlID0gR2V0Q2hhcnRUeXBlKG4uTmFtZSk7CisgICAgICAgLy8gICAgICAgICAgICBpZiAoQ2hhcnRUeXBlICE9IDApCisgICAgICAgLy8gICAgICAgICAgICB7CisgICAgICAgLy8gICAgICAgICAgICAgICAgLy9fY2hhcnRQYXRoID0gcm9vdFBhdGggKyAiLyIgKyBuLk5hbWU7CisgICAgICAgLy8gICAgICAgICAgICAgICAgUGxvdEFyZWEuQ2hhcnRUeXBlcy5BZGQodGhpcyk7CisgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgIC8vICAgICAgICB7CisgICAgICAgLy8gICAgICAgICAgICB2YXIgY2hhcnRTZXJpZVR5cGUgPSBHZXRDaGFydChfZHJhd2luZ3MsIFRvcE5vZGUvKiwgbiovKTsKKyAgICAgICAvLyAgICAgICAgICAgIGNoYXJ0U2VyaWVUeXBlID0gR2V0Q2hhcnQobiwgX2RyYXdpbmdzLCBUb3BOb2RlLCBVcmlDaGFydCwgUGFydCwgQ2hhcnRYbWwsIG51bGwsIGlzUGl2b3QpOworICAgICAgIC8vICAgICAgICAgICAgUGxvdEFyZWEuQ2hhcnRUeXBlcy5BZGQoY2hhcnRTZXJpZVR5cGUpOworICAgICAgIC8vICAgICAgICAgICAgLy92YXIgY2hhcnRUeXBlID0gR2V0Q2hhcnRUeXBlKG4uTmFtZSk7CisgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAvLyAgICAgICAgaWYgKENoYXJ0VHlwZSAhPSAwKQorICAgICAgIC8vICAgICAgICB7CisgICAgICAgLy8gICAgICAgICAgICBwb3MrKzsKKyAgICAgICAvLyAgICAgICAgfQorICAgICAgIC8vICAgIH0KKyAgICAgICAvL30KKyAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQorICAgICAgIHsKKyAgICAgICAgICAgCisgICAgICAgICAgIHN3aXRjaCAobmFtZSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSAiYXJlYTNEQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmKEdyb3VwaW5nPT1lR3JvdXBpbmcuU3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkM0Q7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkMTAwM0Q7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkFyZWEzRDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYXNlICJhcmVhQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuU3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDEwMDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQXJlYTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYXNlICJkb3VnaG51dENoYXJ0IjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Eb3VnaG51dDsKKyAgICAgICAgICAgICAgIGNhc2UgInBpZTNEQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlBpZTNEOworICAgICAgICAgICAgICAgY2FzZSAicGllQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlBpZTsKKyAgICAgICAgICAgICAgIGNhc2UgInJhZGFyQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlJhZGFyOworICAgICAgICAgICAgICAgY2FzZSAic2NhdHRlckNoYXJ0IjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5YWVNjYXR0ZXI7CisgICAgICAgICAgICAgICBjYXNlICJzdXJmYWNlM0RDaGFydCI6CisgICAgICAgICAgICAgICBjYXNlICJzdXJmYWNlQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlN1cmZhY2U7CisgICAgICAgICAgICAgICBjYXNlICJzdG9ja0NoYXJ0IjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5TdG9ja0hMQzsKKyAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgIH0gICAgICAgICAgIAorICAgICAgIH0KKyAgICAgICAjcmVnaW9uICJYbWwgaW5pdCBGdW5jdGlvbnMiCisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQ2hhcnRTdGFydFhtbChlQ2hhcnRUeXBlIHR5cGUpCisgICAgICAgeworICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHhtbD1uZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICBpbnQgYXhJRD0xOworICAgICAgICAgICBpbnQgeEF4SUQ9MjsKKyAgICAgICAgICAgaW50IHNlckF4SUQgPSBJc1R5cGVTdXJmYWNlKCkgPyAzIDogLTE7CisKKyAgICAgICAgICAgeG1sLkFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PiIpOworICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8YzpjaGFydFNwYWNlIHhtbG5zOmM9XCJ7MH1cIiB4bWxuczphPVwiezF9XCIgeG1sbnM6cj1cInsyfVwiPiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCwgRXhjZWxQYWNrYWdlLnNjaGVtYURyYXdpbmdzLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyk7ICAgICAgIAorICAgICAgICAgICB4bWwuQXBwZW5kKCI8YzpjaGFydD4iKTsKKyAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiezB9ezF9PGM6cGxvdEFyZWE+PGM6bGF5b3V0Lz4iLEFkZFBlcnNwZWN0aXZlWG1sKHR5cGUpLCBBZGRTdXJmYWNlWG1sKHR5cGUpKTsKKworICAgICAgICAgICBzdHJpbmcgY2hhcnROb2RlVGV4dCA9IEdldENoYXJ0Tm9kZVRleHQoKTsKKyAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPHswfT4iLCBjaGFydE5vZGVUZXh0KTsKKyAgICAgICAgICAgeG1sLkFwcGVuZChHZXRDaGFydFNlcmllU3RhcnRYbWwodHlwZSwgYXhJRCwgeEF4SUQsIHNlckF4SUQpKTsKKyAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPC97MH0+IiwgY2hhcnROb2RlVGV4dCk7CisKKyAgICAgICAgICAgLy9BeGlzCisgICAgICAgICAgIGlmICghSXNUeXBlUGllRG91Z2hudXQoKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKElzVHlwZVNjYXR0ZXJCdWJibGUoKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8Yzp2YWxBeD48YzpheElkIHZhbD1cInswfVwiLz48YzpzY2FsaW5nPjxjOm9yaWVudGF0aW9uIHZhbD1cIm1pbk1heFwiLz48L2M6c2NhbGluZz48YzpkZWxldGUgdmFsPVwiMFwiLz48YzpheFBvcyB2YWw9XCJiXCIvPjxjOnRpY2tMYmxQb3MgdmFsPVwibmV4dFRvXCIvPjxjOmNyb3NzQXggdmFsPVwiezF9XCIvPjxjOmNyb3NzZXMgdmFsPVwiYXV0b1plcm9cIi8+PC9jOnZhbEF4PiIsIGF4SUQsIHhBeElEKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8YzpjYXRBeD48YzpheElkIHZhbD1cInswfVwiLz48YzpzY2FsaW5nPjxjOm9yaWVudGF0aW9uIHZhbD1cIm1pbk1heFwiLz48L2M6c2NhbGluZz48YzpkZWxldGUgdmFsPVwiMFwiLz48YzpheFBvcyB2YWw9XCJiXCIvPjxjOnRpY2tMYmxQb3MgdmFsPVwibmV4dFRvXCIvPjxjOmNyb3NzQXggdmFsPVwiezF9XCIvPjxjOmNyb3NzZXMgdmFsPVwiYXV0b1plcm9cIi8+PGM6YXV0byB2YWw9XCIxXCIvPjxjOmxibEFsZ24gdmFsPVwiY3RyXCIvPjxjOmxibE9mZnNldCB2YWw9XCIxMDBcIi8+PC9jOmNhdEF4PiIsIGF4SUQsIHhBeElEKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjxjOnZhbEF4PjxjOmF4SWQgdmFsPVwiezF9XCIvPjxjOnNjYWxpbmc+PGM6b3JpZW50YXRpb24gdmFsPVwibWluTWF4XCIvPjwvYzpzY2FsaW5nPjxjOmRlbGV0ZSB2YWw9XCIwXCIvPjxjOmF4UG9zIHZhbD1cImxcIi8+PGM6bWFqb3JHcmlkbGluZXMvPjxjOnRpY2tMYmxQb3MgdmFsPVwibmV4dFRvXCIvPjxjOmNyb3NzQXggdmFsPVwiezB9XCIvPjxjOmNyb3NzZXMgdmFsPVwiYXV0b1plcm9cIi8+PGM6Y3Jvc3NCZXR3ZWVuIHZhbD1cImJldHdlZW5cIi8+PC9jOnZhbEF4PiIsIGF4SUQsIHhBeElEKTsKKyAgICAgICAgICAgICAgIGlmIChzZXJBeElEPT0zKSAvL1N1cmVmYWNlIENoYXJ0CisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPGM6c2VyQXg+PGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6c2NhbGluZz48YzpvcmllbnRhdGlvbiB2YWw9XCJtaW5NYXhcIi8+PC9jOnNjYWxpbmc+PGM6ZGVsZXRlIHZhbD1cIjBcIi8+PGM6YXhQb3MgdmFsPVwiYlwiLz48Yzp0aWNrTGJsUG9zIHZhbD1cIm5leHRUb1wiLz48Yzpjcm9zc0F4IHZhbD1cInsxfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPjwvYzpzZXJBeD4iLCBzZXJBeElELCB4QXhJRCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8L2M6cGxvdEFyZWE+PGM6bGVnZW5kPjxjOmxlZ2VuZFBvcyB2YWw9XCJyXCIvPjxjOmxheW91dC8+PGM6b3ZlcmxheSB2YWw9XCIwXCIgLz48L2M6bGVnZW5kPjxjOnBsb3RWaXNPbmx5IHZhbD1cIjFcIi8+PC9jOmNoYXJ0PiIsIGF4SUQsIHhBeElEKTsKKworICAgICAgICAgICB4bWwuQXBwZW5kKCI8YzpwcmludFNldHRpbmdzPjxjOmhlYWRlckZvb3Rlci8+PGM6cGFnZU1hcmdpbnMgYj1cIjAuNzVcIiBsPVwiMC43XCIgcj1cIjAuN1wiIHQ9XCIwLjc1XCIgaGVhZGVyPVwiMC4zXCIgZm9vdGVyPVwiMC4zXCIvPjxjOnBhZ2VTZXR1cC8+PC9jOnByaW50U2V0dGluZ3M+PC9jOmNoYXJ0U3BhY2U+Iik7ICAgICAgICAgIAorICAgICAgICAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7CisgICAgICAgfQorCisgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0Q2hhcnRTZXJpZVN0YXJ0WG1sKGVDaGFydFR5cGUgdHlwZSwgaW50IGF4SUQsIGludCB4QXhJRCwgaW50IHNlckF4SUQpCisgICAgICAgeworICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHhtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgeG1sLkFwcGVuZChBZGRTY2F0dGVyVHlwZSh0eXBlKSk7CisgICAgICAgICAgIHhtbC5BcHBlbmQoQWRkUmFkYXJUeXBlKHR5cGUpKTsKKyAgICAgICAgICAgeG1sLkFwcGVuZChBZGRCYXJEaXIodHlwZSkpOworICAgICAgICAgICB4bWwuQXBwZW5kKEFkZEdyb3VwaW5nKCkpOworICAgICAgICAgICB4bWwuQXBwZW5kKEFkZFZhcnlDb2xvcnMoKSk7CisgICAgICAgICAgIHhtbC5BcHBlbmQoQWRkSGFzTWFya2VyKHR5cGUpKTsKKyAgICAgICAgICAgeG1sLkFwcGVuZChBZGRTaGFwZSh0eXBlKSk7CisgICAgICAgICAgIHhtbC5BcHBlbmQoQWRkRmlyc3RTbGljZUFuZyh0eXBlKSk7CisgICAgICAgICAgIHhtbC5BcHBlbmQoQWRkSG9sZVNpemUodHlwZSkpOworICAgICAgICAgICBpZiAoQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMCB8fCAKKyAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHhtbC5BcHBlbmQoIjxjOm92ZXJsYXAgdmFsPVwiMTAwXCIvPiIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChJc1R5cGVTdXJmYWNlKCkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHhtbC5BcHBlbmQoIjxjOmJhbmRGbXRzLz4iKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICB4bWwuQXBwZW5kKEFkZEF4aXNJZChheElELCB4QXhJRCwgc2VyQXhJRCkpOworCisgICAgICAgICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTsKKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkQXhpc0lkKGludCBheElELGludCB4QXhJRCwgaW50IHNlckF4SUQpCisgICAgICAgeworICAgICAgICAgICBpZiAoIUlzVHlwZVBpZURvdWdobnV0KCkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChJc1R5cGVTdXJmYWNlKCkpCisgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiPGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6YXhJZCB2YWw9XCJ7MX1cIi8+PGM6YXhJZCB2YWw9XCJ7Mn1cIi8+IiwgYXhJRCwgeEF4SUQsIHNlckF4SUQpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCI8YzpheElkIHZhbD1cInswfVwiLz48YzpheElkIHZhbD1cInsxfVwiLz4iLCBheElELCB4QXhJRCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkQXhUeXBlKCkKKyAgICAgICB7CisgICAgICAgICAgIHN3aXRjaChDaGFydFR5cGUpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXI6CisgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXM6CisgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnM6CisgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoOgorICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VyczoKKyAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CdWJibGU6CisgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQnViYmxlM0RFZmZlY3Q6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YWxBeCI7CisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgIHJldHVybiAiY2F0QXgiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZFNjYXR0ZXJUeXBlKGVDaGFydFR5cGUgdHlwZSkKKyAgICAgICB7CisgICAgICAgICAgIGlmICh0eXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyIHx8CisgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXMgfHwKKyAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VycyB8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCB8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8YzpzY2F0dGVyU3R5bGUgdmFsPVwiXCIgLz4iOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZFJhZGFyVHlwZShlQ2hhcnRUeXBlIHR5cGUpCisgICAgICAgeworICAgICAgICAgICBpZiAodHlwZSA9PSBlQ2hhcnRUeXBlLlJhZGFyIHx8CisgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUmFkYXJGaWxsZWR8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlJhZGFyTWFya2VycykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8YzpyYWRhclN0eWxlIHZhbD1cIlwiIC8+IjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBwcml2YXRlIHN0cmluZyBBZGRHcm91cGluZygpCisgICAgICAgeworICAgICAgICAgICAvL0lzVHlwZUNsdXN0ZXJlZCgpIHx8IElzVHlwZVBlcmNlbnRTdGFja2VkKCkgfHwgSXNUeXBlU3RhY2tlZCgpIHx8IAorICAgICAgICAgICBpZihJc1R5cGVTaGFwZSgpIHx8IElzVHlwZUxpbmUoKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8Yzpncm91cGluZyB2YWw9XCJzdGFuZGFyZFwiLz4iOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEhvbGVTaXplKGVDaGFydFR5cGUgdHlwZSkKKyAgICAgICB7CisgICAgICAgICAgIGlmICh0eXBlID09IGVDaGFydFR5cGUuRG91Z2hudXQgfHwKKyAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gIjxjOmhvbGVTaXplIHZhbD1cIjUwXCIgLz4iOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEZpcnN0U2xpY2VBbmcoZUNoYXJ0VHlwZSB0eXBlKQorICAgICAgIHsKKyAgICAgICAgICAgaWYgKHR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dCB8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiPGM6Zmlyc3RTbGljZUFuZyB2YWw9XCIwXCIgLz4iOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZFZhcnlDb2xvcnMoKQorICAgICAgIHsKKyAgICAgICAgICAgaWYgKElzVHlwZVBpZURvdWdobnV0KCkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiPGM6dmFyeUNvbG9ycyB2YWw9XCIxXCIgLz4iOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8Yzp2YXJ5Q29sb3JzIHZhbD1cIjBcIiAvPiI7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkSGFzTWFya2VyKGVDaGFydFR5cGUgdHlwZSkKKyAgICAgICB7CisgICAgICAgICAgIGlmICh0eXBlID09IGVDaGFydFR5cGUuTGluZU1hcmtlcnMgfHwKKyAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQgfHwKKyAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDAgLyp8fAorICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8CisgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoKi8pCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiPGM6bWFya2VyIHZhbD1cIjFcIi8+IjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBwcml2YXRlIHN0cmluZyBBZGRTaGFwZShlQ2hhcnRUeXBlIHR5cGUpCisgICAgICAgeworICAgICAgICAgICBpZiAoSXNUeXBlU2hhcGUoKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8YzpzaGFwZSB2YWw9XCJib3hcIiAvPiI7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkQmFyRGlyKGVDaGFydFR5cGUgdHlwZSkKKyAgICAgICB7CisgICAgICAgICAgIGlmIChJc1R5cGVTaGFwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiPGM6YmFyRGlyIHZhbD1cImNvbFwiIC8+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZFBlcnNwZWN0aXZlWG1sKGVDaGFydFR5cGUgdHlwZSkKKyAgICAgICAgeworIAkgICAgICAgIC8vQWRkIGZvciAzRCBzaGFydHMKKyAgICAgICAgICAgIGlmIChJc1R5cGUzRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiPGM6dmlldzNEPjxjOnBlcnNwZWN0aXZlIHZhbD1cIjMwXCIgLz48L2M6dmlldzNEPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkU3VyZmFjZVhtbChlQ2hhcnRUeXBlIHR5cGUpCisgICAgICAgeworICAgICAgICAgICBpZiAoSXNUeXBlU3VyZmFjZSgpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gQWRkU3VyZmFjZVBhcnQoImZsb29yIikgKyBBZGRTdXJmYWNlUGFydCgic2lkZVdhbGwiKSArIEFkZFN1cmZhY2VQYXJ0KCJiYWNrV2FsbCIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkU3VyZmFjZVBhcnQoc3RyaW5nIG5hbWUpCisgICAgICAgeworICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiPGM6ezB9PjxjOnRoaWNrbmVzcyB2YWw9XCIwXCIvPjxjOnNwUHI+PGE6bm9GaWxsLz48YTpsbj48YTpub0ZpbGwvPjwvYTpsbj48YTplZmZlY3RMc3QvPjxhOnNwM2QvPjwvYzpzcFByPjwvYzp7MH0+IiwgbmFtZSk7CisgICAgICAgfQorICAgICAgICNlbmRyZWdpb24KKyAgICAgICAjZW5kcmVnaW9uCisgICAgICAgI3JlZ2lvbiAiQ2hhcnQgdHlwZSBmdW5jdGlvbnMKKyAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc1R5cGUzRChlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkFyZWEzRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDEwMDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW4zRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZTNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2wgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN1cmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlldyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3VyZmFjZVdpcmVmcmFtZTsKKyAgICAgICAgfQorICAgICAgIGludGVybmFsIHByb3RlY3RlZCBib29sIElzVHlwZTNEKCkKKyAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSXNUeXBlM0QoQ2hhcnRUeXBlKTsKKyAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBib29sIElzVHlwZUxpbmUoKQorICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmUgfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2VycyB8fAorICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZVN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lM0Q7CisgICAgICAgfQorICAgICAgIHByb3RlY3RlZCBib29sIElzVHlwZVNjYXR0ZXJCdWJibGUoKQorICAgICAgIHsKKyAgICAgICAgICAgcmV0dXJuIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlciB8fAorICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8CisgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnMgfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMgfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUgfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdDsKKyAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBib29sIElzVHlwZVN1cmZhY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3VyZmFjZSB8fAorICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3IHx8CisgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXdXaXJlZnJhbWUgfHwKKyAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5TdXJmYWNlV2lyZWZyYW1lOworICAgICAgICB9CisgICAgICAgcHJvdGVjdGVkIGJvb2wgSXNUeXBlU2hhcGUoKQorICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQzRCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQzRCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDNEIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDAzRCB8fAorICAgICAgICAgICAgICAgIC8vQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuM0RQaWUgfHwKKyAgICAgICAgICAgICAgICAvL0NoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLjNEUGllRXhwbG9kZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgLy9DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkMTAwIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2wgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQxMDA7IC8vfHwKKyAgICAgICAgICAgICAgICAgICAgLy9DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dCB8fAorICAgICAgICAgICAgICAgICAgICAvL0NoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQ7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGJvb2wgSXNUeXBlUGVyY2VudFN0YWNrZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQXJlYVN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkMTAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDEwMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQxMDA7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGJvb2wgSXNUeXBlU3RhY2tlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQXJlYVN0YWNrZWQzRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDNEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZVN0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc1R5cGVDbHVzdGVyZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQzRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUJhckNsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sQ2x1c3RlcmVkOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBib29sIElzVHlwZVBpZURvdWdobnV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlBpZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllRXhwbG9kZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlBpZU9mUGllIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWUzRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyT2ZQaWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkRvdWdobnV0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEdldCB0aGUgbmFtZSBvZiB0aGUgY2hhcnQgbm9kZQorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBuYW1lPC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIEdldENoYXJ0Tm9kZVRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKENoYXJ0VHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQXJlYTNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDEwMDNEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6YXJlYTNEQ2hhcnQiOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5BcmVhOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzphcmVhQ2hhcnQiOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOmJhckNoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0Q6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQzRDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQzRDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0Q6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUNvbDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckJhckNsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbENsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6YmFyM0RDaGFydCI7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJ1YmJsZToKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQnViYmxlM0RFZmZlY3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpidWJibGVDaGFydCI7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkRvdWdobnV0OgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6ZG91Z2hudXRDaGFydCI7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmU6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZVN0YWNrZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6bGluZUNoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZTNEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6bGluZTNEQ2hhcnQiOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWU6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6cGllQ2hhcnQiOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJPZlBpZToKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllT2ZQaWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpvZlBpZUNoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllM0Q6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkM0Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpwaWUzRENoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUmFkYXI6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5SYWRhck1hcmtlcnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpyYWRhckNoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lczoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnM6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6c2NhdHRlckNoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZToKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZVdpcmVmcmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOnN1cmZhY2UzRENoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXc6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6c3VyZmFjZUNoYXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3RvY2tITEM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpzdG9ja0NoYXJ0IjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIkNoYXJ0IHR5cGUgbm90IGltcGxlbWVudGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIHNlY29uZGFyeSBheGlzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHZvaWQgQWRkQXhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEVsZW1lbnQgY2F0QXggPSBDaGFydFhtbC5DcmVhdGVFbGVtZW50KHN0cmluZy5Gb3JtYXQoImM6ezB9IixBZGRBeFR5cGUoKSksIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgICBpbnQgYXhJRDsKKyAgICAgICAgICAgIGlmIChfYXhpcy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGxvdEFyZWEuVG9wTm9kZS5BcHBlbmRDaGlsZChjYXRBeCk7CisgICAgICAgICAgICAgICAgYXhJRCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F4aXNbMF0uVG9wTm9kZS5QYXJlbnROb2RlLkluc2VydEFmdGVyKGNhdEF4LCBfYXhpc1tfYXhpcy5MZW5ndGgtMV0uVG9wTm9kZSk7CisgICAgICAgICAgICAgICAgYXhJRCA9IGludC5QYXJzZShfYXhpc1swXS5JZCkgPCBpbnQuUGFyc2UoX2F4aXNbMV0uSWQpID8gaW50LlBhcnNlKF9heGlzWzFdLklkKSArIDEgOiBpbnQuUGFyc2UoX2F4aXNbMF0uSWQpICsgMTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBYbWxFbGVtZW50IHZhbEF4ID0gQ2hhcnRYbWwuQ3JlYXRlRWxlbWVudCgiYzp2YWxBeCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgICBjYXRBeC5QYXJlbnROb2RlLkluc2VydEFmdGVyKHZhbEF4LCBjYXRBeCk7CisKKyAgICAgICAgICAgIGlmIChfYXhpcy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXRBeC5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOmF4SWQgdmFsPVwiezB9XCIvPjxjOnNjYWxpbmc+PGM6b3JpZW50YXRpb24gdmFsPVwibWluTWF4XCIvPjwvYzpzY2FsaW5nPjxjOmRlbGV0ZSB2YWw9XCIwXCIgLz48YzpheFBvcyB2YWw9XCJiXCIvPjxjOnRpY2tMYmxQb3MgdmFsPVwibmV4dFRvXCIvPjxjOmNyb3NzQXggdmFsPVwiezF9XCIvPjxjOmNyb3NzZXMgdmFsPVwiYXV0b1plcm9cIi8+PGM6YXV0byB2YWw9XCIxXCIvPjxjOmxibEFsZ24gdmFsPVwiY3RyXCIvPjxjOmxibE9mZnNldCB2YWw9XCIxMDBcIi8+IiwgYXhJRCwgYXhJRCArIDEpOworICAgICAgICAgICAgICAgIHZhbEF4LklubmVyWG1sID0gc3RyaW5nLkZvcm1hdCgiPGM6YXhJZCB2YWw9XCJ7MX1cIi8+PGM6c2NhbGluZz48YzpvcmllbnRhdGlvbiB2YWw9XCJtaW5NYXhcIi8+PC9jOnNjYWxpbmc+PGM6ZGVsZXRlIHZhbD1cIjBcIiAvPjxjOmF4UG9zIHZhbD1cImxcIi8+PGM6bWFqb3JHcmlkbGluZXMvPjxjOnRpY2tMYmxQb3MgdmFsPVwibmV4dFRvXCIvPjxjOmNyb3NzQXggdmFsPVwiezB9XCIvPjxjOmNyb3NzZXMgdmFsPVwiYXV0b1plcm9cIi8+PGM6Y3Jvc3NCZXR3ZWVuIHZhbD1cImJldHdlZW5cIi8+IiwgYXhJRCwgYXhJRCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhdEF4LklubmVyWG1sID0gc3RyaW5nLkZvcm1hdCgiPGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6c2NhbGluZz48YzpvcmllbnRhdGlvbiB2YWw9XCJtaW5NYXhcIi8+PC9jOnNjYWxpbmc+PGM6ZGVsZXRlIHZhbD1cIjFcIiAvPjxjOmF4UG9zIHZhbD1cImJcIi8+PGM6dGlja0xibFBvcyB2YWw9XCJub25lXCIvPjxjOmNyb3NzQXggdmFsPVwiezF9XCIvPjxjOmNyb3NzZXMgdmFsPVwiYXV0b1plcm9cIi8+IiwgYXhJRCwgYXhJRCArIDEpOworICAgICAgICAgICAgICAgIHZhbEF4LklubmVyWG1sID0gc3RyaW5nLkZvcm1hdCgiPGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6c2NhbGluZz48YzpvcmllbnRhdGlvbiB2YWw9XCJtaW5NYXhcIi8+PC9jOnNjYWxpbmc+PGM6ZGVsZXRlIHZhbD1cIjBcIiAvPjxjOmF4UG9zIHZhbD1cInJcIi8+PGM6dGlja0xibFBvcyB2YWw9XCJuZXh0VG9cIi8+PGM6Y3Jvc3NBeCB2YWw9XCJ7MX1cIi8+PGM6Y3Jvc3NlcyB2YWw9XCJtYXhcIi8+PGM6Y3Jvc3NCZXR3ZWVuIHZhbD1cImJldHdlZW5cIi8+IiwgYXhJRCArIDEsIGF4SUQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2F4aXMuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F4aXMgPSBuZXcgRXhjZWxDaGFydEF4aXNbMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxDaGFydEF4aXNbXSBuZXdBeGlzID0gbmV3IEV4Y2VsQ2hhcnRBeGlzW19heGlzLkxlbmd0aCArIDJdOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoX2F4aXMsIG5ld0F4aXMsIF9heGlzLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgX2F4aXMgPSBuZXdBeGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfYXhpc1tfYXhpcy5MZW5ndGggLSAyXSA9IG5ldyBFeGNlbENoYXJ0QXhpcyhOYW1lU3BhY2VNYW5hZ2VyLCBjYXRBeCk7CisgICAgICAgICAgICBfYXhpc1tfYXhpcy5MZW5ndGggLSAxXSA9IG5ldyBFeGNlbENoYXJ0QXhpcyhOYW1lU3BhY2VNYW5hZ2VyLCB2YWxBeCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hhcnQgaW4gX3Bsb3RBcmVhLkNoYXJ0VHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcnQuX2F4aXMgPSBfYXhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZVNlY29uZGFyeUF4aXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAobmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIikpOworICAgICAgICB9CisgICAgICAgICNyZWdpb24gIlByb3BlcnRpZXMiCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlZmVyZW5jZSB0byB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldCBXb3JrU2hlZXQgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY2hhcnQgeG1sIGRvY3VtZW50CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBYbWxEb2N1bWVudCBDaGFydFhtbCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGUgb2YgY2hhcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVDaGFydFR5cGUgQ2hhcnRUeXBlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgcHJvdGVjdGVkIFhtbE5vZGUgX2NoYXJ0Tm9kZSA9IG51bGw7CisgICAgICAgIGludGVybmFsIFhtbE5vZGUgQ2hhcnROb2RlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnROb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpdGVsIG9mIHRoZSBjaGFydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFRpdGxlIFRpdGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdGl0bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90aXRsZSA9IG5ldyBFeGNlbENoYXJ0VGl0bGUoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiYzpjaGFydFNwYWNlL2M6Y2hhcnQiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdGl0bGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2hhcnQgc2VyaWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIEV4Y2VsQ2hhcnRTZXJpZXMgU2VyaWVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRTZXJpZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQW4gYXJyYXkgY29udGFpbmcgYWxsIGF4aXMgb2YgYWxsIENoYXJ0dHlwZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRBeGlzW10gQXhpcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2F4aXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFhBeGlzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0QXhpcyBYQXhpcworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgWUF4aXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRBeGlzIFlBeGlzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisgICAgICAgIGJvb2wgX3NlY29uZGFyeUF4aXM9ZmFsc2U7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgdGhlIGNoYXJ0dHlwZSB3aWxsIHVzZSB0aGUgc2Vjb25kYXJ5IGF4aXMuCisgICAgICAgIC8vLyBUaGUgY2hhcnQgbXVzdCBjb250YWluIGEgbGVhc3Qgb25lIG90aGVyIGNoYXJ0dHlwZSB0aGF0IHVzZXMgdGhlIHByaW1hcnkgYXhpcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgVXNlU2Vjb25kYXJ5QXhpcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NlY29uZGFyeUF4aXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYgKF9zZWNvbmRhcnlBeGlzICE9IHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNUeXBlUGllRG91Z2hudXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiUGllIGNoYXJ0cyBkbyBub3Qgc3VwcG9ydCBheGlzIikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSGFzUHJpbWFyeUF4aXMoKSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHRvIHNlY29uZGFyeSBheGlzIHdoZW4gbm8gc2VyaWUgdXNlcyB0aGUgcHJpbWFyeSBheGlzIikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEF4aXMuTGVuZ3RoID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQXhpcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5sID0gQ2hhcnROb2RlLlNlbGVjdE5vZGVzKCJjOmF4SWQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5sWzBdLkF0dHJpYnV0ZXNbInZhbCJdLlZhbHVlID0gQXhpc1syXS5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5sWzFdLkF0dHJpYnV0ZXNbInZhbCJdLlZhbHVlID0gQXhpc1szXS5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhBeGlzID0gQXhpc1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFlBeGlzID0gQXhpc1szXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBubCA9IENoYXJ0Tm9kZS5TZWxlY3ROb2RlcygiYzpheElkIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBubFswXS5BdHRyaWJ1dGVzWyJ2YWwiXS5WYWx1ZSA9IEF4aXNbMF0uSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBubFsxXS5BdHRyaWJ1dGVzWyJ2YWwiXS5WYWx1ZSA9IEF4aXNbMV0uSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBYQXhpcyA9IEF4aXNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBZQXhpcyA9IEF4aXNbMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX3NlY29uZGFyeUF4aXMgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGJ1aWxkLWluIGNoYXJ0IHN0eWxlcy4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlQ2hhcnRTdHlsZSBTdHlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxOb2RlIG5vZGUgPSBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UvYzpzdHlsZS9AdmFsIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRTdHlsZS5Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShub2RlLlZhbHVlLCBvdXQgdikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUNoYXJ0U3R5bGUpdjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRTdHlsZS5Ob25lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gZUNoYXJ0U3R5bGUuTm9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbWVudCA9IENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZS9jOnN0eWxlIiwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbWVudCA9IENoYXJ0WG1sLkNyZWF0ZUVsZW1lbnQoImM6c3R5bGUiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOworICAgICAgICAgICAgICAgICAgICBlbGVtZW50LlNldEF0dHJpYnV0ZSgidmFsIiwgKChpbnQpdmFsdWUpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IHBhcmVudCA9IENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZSIsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5JbnNlcnRCZWZvcmUoZWxlbWVudCwgcGFyZW50LlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnQiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfcGxvdFZpc2libGVPbmx5UGF0aD0iLi4vLi4vYzpwbG90VmlzT25seS9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvdyBkYXRhIGluIGhpZGRlbiByb3dzIGFuZCBjb2x1bW5zCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dIaWRkZW5EYXRhCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vISFJbnZlcnRlZCB2YWx1ZSEhCisgICAgICAgICAgICAgICAgcmV0dXJuICFfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woX3Bsb3RWaXNpYmxlT25seVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8hIUludmVydGVkIHZhbHVlISEKKyAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZUJvb2woX3Bsb3RWaXNpYmxlT25seVBhdGgsICF2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9kaXNwbGF5QmxhbmtzQXNQYXRoID0gIi4uLy4uL2M6ZGlzcEJsYW5rc0FzL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHBvc3NpYmxlIHdheXMgdG8gZGlzcGxheSBibGFua3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVEaXNwbGF5QmxhbmtzQXMgRGlzcGxheUJsYW5rc0FzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2PV9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9kaXNwbGF5QmxhbmtzQXNQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZURpc3BsYXlCbGFua3NBcy5aZXJvOyAvL0lzc3VlIDE0NzE1IENoYW5nZWQgaW4gT2ZmaWNlIDIwMTAtPworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVEaXNwbGF5QmxhbmtzQXMpRW51bS5QYXJzZSh0eXBlb2YoZURpc3BsYXlCbGFua3NBcyksIHYsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFNlcmllcy5TZXRYbWxOb2RlU3RyaW5nKF9kaXNwbGF5QmxhbmtzQXNQYXRoLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfc2hvd0RMYmxzT3Zlck1heCA9ICIuLi8uLi9jOnNob3dETGJsc092ZXJNYXgvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyBkYXRhIGxhYmVscyBvdmVyIHRoZSBtYXhpbXVtIG9mIHRoZSBjaGFydCBzaGFsbCBiZSBzaG93bgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaG93RGF0YUxhYmVsc092ZXJNYXhpbXVtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woX3Nob3dETGJsc092ZXJNYXgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVCb29sKF9zaG93RExibHNPdmVyTWF4LHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGJvb2wgSGFzUHJpbWFyeUF4aXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3Bsb3RBcmVhLkNoYXJ0VHlwZXMuQ291bnQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hhcnQgaW4gX3Bsb3RBcmVhLkNoYXJ0VHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJ0ICE9IHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnQuVXNlU2Vjb25kYXJ5QXhpcyA9PSBmYWxzZSAmJiBjaGFydC5Jc1R5cGVQaWVEb3VnaG51dCgpPT1mYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIFNldHMgcG9zaXRpb24gb2YgdGhlIGF4aXMgb2YgYSBjaGFydC1zZXJpZQorICAgICAgICAvLy8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJYQXhpcyI+TGVmdCBvciBSaWdodDwvcGFyYW0+CisgICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJZQXhpcyI+VG9wIG9yIEJvdHRvbTwvcGFyYW0+CisgICAgICAgIC8vaW50ZXJuYWwgdm9pZCBTZXRBeGlzKGVYQXhpc1Bvc2l0aW9uIFhBeGlzLCBlWUF4aXNQb3NpdGlvbiBZQXhpcykKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGJvb2wgeEF4aXNFeGlzdHMgPSBmYWxzZSwgeUF4aXNFeGlzdHMgPSBmYWxzZTsKKyAgICAgICAgLy8gICAgZm9yZWFjaCAodmFyIGF4aXMgaW4gX2F4aXMpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGlmIChheGlzLkF4aXNQb3NpdGlvbiA9PSAoZUF4aXNQb3NpdGlvbilYQXhpcykKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAvL0ZvdW5kCisgICAgICAgIC8vICAgICAgICAgICAgeEF4aXNFeGlzdHM9dHJ1ZTsKKyAgICAgICAgLy8gICAgICAgICAgICBpZiAoYXhpcyAhPSB0aGlzLlhBeGlzKQorICAgICAgICAvLyAgICAgICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgQ2hlY2tSZW1vdmVBeGlzKHRoaXMuWEF4aXMpOworICAgICAgICAvLyAgICAgICAgICAgICAgICB0aGlzLlhBeGlzID0gYXhpczsKKyAgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlIGlmIChheGlzLkF4aXNQb3NpdGlvbiA9PSAoZUF4aXNQb3NpdGlvbilZQXhpcykKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICB5QXhpc0V4aXN0cyA9IHRydWU7CisgICAgICAgIC8vICAgICAgICAgICAgaWYgKGF4aXMgIT0gdGhpcy5ZQXhpcykKKyAgICAgICAgLy8gICAgICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIENoZWNrUmVtb3ZlQXhpcyh0aGlzLllBeGlzKTsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgdGhpcy5ZQXhpcyA9IGF4aXM7CisgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisKKyAgICAgICAgLy8gICAgaWYgKCF4QXhpc0V4aXN0cykKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgaWYgKEV4aXN0c0F4aXModGhpcy5YQXhpcykpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgQWRkQXhpcygoZUF4aXNQb3NpdGlvbilYQXhpcyk7CisgICAgICAgIC8vICAgICAgICAgICAgdGhpcy5YQXhpcyA9IEF4aXNbQXhpcy5MZW5ndGggLSAxXTsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICB0aGlzLlhBeGlzLkF4aXNQb3NpdGlvbiA9IChlQXhpc1Bvc2l0aW9uKVhBeGlzOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGlmICgheUF4aXNFeGlzdHMpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGlmIChFeGlzdHNBeGlzKHRoaXMuWEF4aXMpKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIEFkZEF4aXMoKGVBeGlzUG9zaXRpb24pWUF4aXMpOworICAgICAgICAvLyAgICAgICAgICAgIHRoaXMuWUF4aXMgPSBBeGlzW0F4aXMuTGVuZ3RoIC0gMV07CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgdGhpcy5ZQXhpcy5BeGlzUG9zaXRpb24gPSAoZUF4aXNQb3NpdGlvbilZQXhpczsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmUgYWxsIGF4aXMgdGhhdCBhcmUgbm90IHVzZWQgYW55IG1vcmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJleGNlbENoYXJ0QXhpcyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrUmVtb3ZlQXhpcyhFeGNlbENoYXJ0QXhpcyBleGNlbENoYXJ0QXhpcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEV4aXN0c0F4aXMoZXhjZWxDaGFydEF4aXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBheGlzCisgICAgICAgICAgICAgICAgRXhjZWxDaGFydEF4aXNbXSBuZXdBeGlzID0gbmV3IEV4Y2VsQ2hhcnRBeGlzW0F4aXMuTGVuZ3RoIC0gMV07CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGF4IGluIEF4aXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXggIT0gZXhjZWxDaGFydEF4aXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F4aXNbcG9zXSA9IGF4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9VcGRhdGUgYWxsIGNoYXJ0dHlwZXMuCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxDaGFydCBjaGFydFR5cGUgaW4gX3Bsb3RBcmVhLkNoYXJ0VHlwZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUuX2F4aXMgPSBuZXdBeGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBFeGlzdHNBeGlzKEV4Y2VsQ2hhcnRBeGlzIGV4Y2VsQ2hhcnRBeGlzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChFeGNlbENoYXJ0IGNoYXJ0VHlwZSBpbiBfcGxvdEFyZWEuQ2hhcnRUeXBlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnRUeXBlICE9IHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnRUeXBlLlhBeGlzLkF4aXNQb3NpdGlvbiA9PSBleGNlbENoYXJ0QXhpcy5BeGlzUG9zaXRpb24gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlLllBeGlzLkF4aXNQb3NpdGlvbiA9PSBleGNlbENoYXJ0QXhpcy5BeGlzUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIGF4aXMgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBFeGNlbENoYXJ0UGxvdEFyZWEgX3Bsb3RBcmVhID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGxvdGFyZWEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRQbG90QXJlYSBQbG90QXJlYQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3Bsb3RBcmVhID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGxvdEFyZWEgPSBuZXcgRXhjZWxDaGFydFBsb3RBcmVhKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgdGhpcyk7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3Bsb3RBcmVhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ2hhcnRMZWdlbmQgX2xlZ2VuZCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExlZ2VuZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydExlZ2VuZCBMZWdlbmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9sZWdlbmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9sZWdlbmQgPSBuZXcgRXhjZWxDaGFydExlZ2VuZChOYW1lU3BhY2VNYW5hZ2VyLCBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOmxlZ2VuZCIsIE5hbWVTcGFjZU1hbmFnZXIpLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9sZWdlbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJvcmRlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nQm9yZGVyIEJvcmRlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2JvcmRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JvcmRlciA9IG5ldyBFeGNlbERyYXdpbmdCb3JkZXIoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiYzpjaGFydFNwYWNlIixOYW1lU3BhY2VNYW5hZ2VyKSwgImM6c3BQci9hOmxuIik7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmlsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgImM6c3BQciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gM0Qtc2V0dGluZ3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVmlldzNEIFZpZXczRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoSXNUeXBlM0QoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxWaWV3M0QoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9jOnZpZXczRCIsIE5hbWVTcGFjZU1hbmFnZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkNoYXJ0dHlwZSBkb2VzIG5vdCBzdXBwb3J0IDNEIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vc3RyaW5nIF9ncm91cGluZ1BhdGggPSAiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpwbG90QXJlYS97MH0vYzpncm91cGluZy9AdmFsIjsKKyAgICAgICAgc3RyaW5nIF9ncm91cGluZ1BhdGggPSAiYzpncm91cGluZy9AdmFsIjsKKyAgICAgICAgcHVibGljIGVHcm91cGluZyBHcm91cGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0R3JvdXBpbmdFbnVtKF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9ncm91cGluZ1BhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9ncm91cGluZ1BhdGgsIEdldEdyb3VwaW5nVGV4dCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vc3RyaW5nIF92YXJ5Q29sb3JzUGF0aCA9ICJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfS9jOnZhcnlDb2xvcnMvQHZhbCI7CisgICAgICAgIHN0cmluZyBfdmFyeUNvbG9yc1BhdGggPSAiYzp2YXJ5Q29sb3JzL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgY2hhcnQgaGFzIG9ubHkgb25lIHNlcmllIHRoaXMgdmFyaWVzIHRoZSBjb2xvcnMgZm9yIGVhY2ggcG9pbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFZhcnlDb2xvcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlQm9vbChfdmFyeUNvbG9yc1BhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX3ZhcnlDb2xvcnNQYXRoLCAiMSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfdmFyeUNvbG9yc1BhdGgsICIwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGFja2FnZSBpbnRlcm5hbCBVUkkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgVXJpIFVyaUNoYXJ0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgbmV3IHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gIiI7IH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbENoYXJ0VGl0bGUgX3RpdGxlID0gbnVsbDsKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICNyZWdpb24gIkdyb3VwaW5nIEVudW0gVHJhbnNsYXRpb24iCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEdyb3VwaW5nVGV4dChlR3JvdXBpbmcgZ3JvdXBpbmcpCisgICAgICAgeworICAgICAgICAgICBzd2l0Y2ggKGdyb3VwaW5nKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIGVHcm91cGluZy5DbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjbHVzdGVyZWQiOworICAgICAgICAgICAgICAgY2FzZSBlR3JvdXBpbmcuU3RhY2tlZDoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YWNrZWQiOworICAgICAgICAgICAgICAgY2FzZSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQ6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuICJwZXJjZW50U3RhY2tlZCI7CisgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RhbmRhcmQiOworCisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSBlR3JvdXBpbmcgR2V0R3JvdXBpbmdFbnVtKHN0cmluZyBncm91cGluZykKKyAgICAgICB7CisgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBpbmcpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgInN0YWNrZWQiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlR3JvdXBpbmcuU3RhY2tlZDsKKyAgICAgICAgICAgICAgIGNhc2UgInBlcmNlbnRTdGFja2VkIjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkOworICAgICAgICAgICAgICAgZGVmYXVsdDogLy8iY2x1c3RlcmVkIjogICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUdyb3VwaW5nLkNsdXN0ZXJlZDsKKyAgICAgICAgICAgfSAgICAgICAgIAorICAgICAgIH0KKyAgICAgICAjZW5kcmVnaW9uCisgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsQ2hhcnQgR2V0Q2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLyosIFhtbE5vZGUgY2hhcnRUeXBlTm9kZSovKQorICAgICAgIHsKKyAgICAgICAgICAgWG1sTm9kZSBjaGFydE5vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpncmFwaGljRnJhbWUvYTpncmFwaGljL2E6Z3JhcGhpY0RhdGEvYzpjaGFydCIsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICBpZiAoY2hhcnROb2RlICE9IG51bGwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHZhciBkcmF3aW5nUmVsYXRpb24gPSBkcmF3aW5ncy5QYXJ0LkdldFJlbGF0aW9uc2hpcChjaGFydE5vZGUuQXR0cmlidXRlc1sicjppZCJdLlZhbHVlKTsKKyAgICAgICAgICAgICAgIHZhciB1cmlDaGFydCA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShkcmF3aW5ncy5VcmlEcmF3aW5nLCBkcmF3aW5nUmVsYXRpb24uVGFyZ2V0VXJpKTsKKworICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBkcmF3aW5ncy5QYXJ0LlBhY2thZ2UuR2V0UGFydCh1cmlDaGFydCk7CisgICAgICAgICAgICAgICB2YXIgY2hhcnRYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgIExvYWRYbWxTYWZlKGNoYXJ0WG1sLCBwYXJ0LkdldFN0cmVhbSgpKTsgCisKKyAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQgPSBudWxsOworICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBuIGluIGNoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUocm9vdFBhdGgsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpLkNoaWxkTm9kZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9wQ2hhcnQgPSBHZXRDaGFydChuLCBkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRvcENoYXJ0IT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcENoYXJ0LlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKHRvcENoYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJDaGFydCA9IEdldENoYXJ0KG4sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHRvcENoYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJDaGFydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcENoYXJ0LlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKHN1YkNoYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9wQ2hhcnQ7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgfQorICAgICAgIGludGVybmFsIHN0YXRpYyBFeGNlbENoYXJ0IEdldENoYXJ0KFhtbEVsZW1lbnQgY2hhcnROb2RlLCBFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsICBVcmkgdXJpQ2hhcnQsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0LCBYbWxEb2N1bWVudCBjaGFydFhtbCwgRXhjZWxDaGFydCB0b3BDaGFydCkKKyAgICAgICB7CisgICAgICAgICAgIHN3aXRjaCAoY2hhcnROb2RlLkxvY2FsTmFtZSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSAiYXJlYTNEQ2hhcnQiOgorICAgICAgICAgICAgICAgY2FzZSAiYXJlYUNoYXJ0IjoKKyAgICAgICAgICAgICAgIGNhc2UgInN0b2NrQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENoYXJ0KGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDaGFydCh0b3BDaGFydCwgY2hhcnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYXNlICJzdXJmYWNlM0RDaGFydCI6CisgICAgICAgICAgICAgICBjYXNlICJzdXJmYWNlQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFN1cmZhY2VDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsU3VyZmFjZUNoYXJ0KHRvcENoYXJ0LCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGNhc2UgInJhZGFyQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFJhZGFyQ2hhcnQoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFJhZGFyQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgY2FzZSAiYnViYmxlQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJ1YmJsZUNoYXJ0KGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCdWJibGVDaGFydCh0b3BDaGFydCwgY2hhcnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYXNlICJiYXJDaGFydCI6CisgICAgICAgICAgICAgICBjYXNlICJiYXIzRENoYXJ0IjoKKyAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCYXJDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQmFyQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgY2FzZSAiZG91Z2hudXRDaGFydCI6CisgICAgICAgICAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRG91Z2hudXRDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRG91Z2hudXRDaGFydCh0b3BDaGFydCwgY2hhcnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYXNlICJwaWUzRENoYXJ0IjoKKyAgICAgICAgICAgICAgIGNhc2UgInBpZUNoYXJ0IjoKKyAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxQaWVDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUGllQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICBjYXNlICJvZlBpZUNoYXJ0IjoKKyAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxPZlBpZUNoYXJ0KGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCYXJDaGFydCh0b3BDaGFydCwgY2hhcnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYXNlICJsaW5lQ2hhcnQiOgorICAgICAgICAgICAgICAgY2FzZSAibGluZTNEQ2hhcnQiOgorICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbExpbmVDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsTGluZUNoYXJ0KHRvcENoYXJ0LCBjaGFydE5vZGUpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGNhc2UgInNjYXR0ZXJDaGFydCI6CisgICAgICAgICAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsU2NhdHRlckNoYXJ0KGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxTY2F0dGVyQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgfSAgICAgICAKKyAgICAgICB9CisgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsQ2hhcnQgR2V0TmV3Q2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBkcmF3Tm9kZSwgZUNoYXJ0VHlwZSBjaGFydFR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKQorICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChjaGFydFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZToKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllRXhwbG9kZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZTNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDNEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUGllQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyT2ZQaWU6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZU9mUGllOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsT2ZQaWVDaGFydChkcmF3aW5ncywgZHJhd05vZGUsIGNoYXJ0VHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Eb3VnaG51dDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERvdWdobnV0Q2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQzRDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyU3RhY2tlZDNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwM0Q6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uM0Q6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkM0Q6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDAzRDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUNvbDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCYXJDaGFydChkcmF3aW5ncywgZHJhd05vZGUsIGNoYXJ0VHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXI6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VyczoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxTY2F0dGVyQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZToKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZTNEOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2VyczoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbExpbmVDaGFydChkcmF3aW5ncywgZHJhd05vZGUsIGNoYXJ0VHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpOworICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CdWJibGU6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQnViYmxlQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUmFkYXI6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkOgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5SYWRhck1hcmtlcnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxSYWRhckNoYXJ0KGRyYXdpbmdzLCBkcmF3Tm9kZSwgY2hhcnRUeXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSk7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2U6CisgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3OgorICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZToKKyAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZVdpcmVmcmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFN1cmZhY2VDaGFydChkcmF3aW5ncywgZHJhd05vZGUsIGNoYXJ0VHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDaGFydChkcmF3aW5ncywgZHJhd05vZGUsIGNoYXJ0VHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl2b3RTb3VyY2UoRXhjZWxQaXZvdFRhYmxlIHBpdm90VGFibGVTb3VyY2UpCisgICAgICAgeworICAgICAgICAgICBQaXZvdFRhYmxlU291cmNlID0gcGl2b3RUYWJsZVNvdXJjZTsKKyAgICAgICAgICAgWG1sRWxlbWVudCBjaGFydCA9IENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0IiwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKworICAgICAgICAgICB2YXIgcGl2b3RTb3VyY2UgPSBDaGFydFhtbC5DcmVhdGVFbGVtZW50KCJwaXZvdFNvdXJjZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgIGNoYXJ0LlBhcmVudE5vZGUuSW5zZXJ0QmVmb3JlKHBpdm90U291cmNlLCBjaGFydCk7CisgICAgICAgICAgIHBpdm90U291cmNlLklubmVyWG1sID0gc3RyaW5nLkZvcm1hdCgiPGM6bmFtZT5bXXswfSF7MX08L2M6bmFtZT48YzpmbXRJZCB2YWw9XCIwXCIvPiIsIFBpdm90VGFibGVTb3VyY2UuV29ya1NoZWV0Lk5hbWUsIHBpdm90VGFibGVTb3VyY2UuTmFtZSk7CisKKyAgICAgICAgICAgdmFyIGZtdHMgPSBDaGFydFhtbC5DcmVhdGVFbGVtZW50KCJwaXZvdEZtdHMiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOworICAgICAgICAgICBjaGFydC5QcmVwZW5kQ2hpbGQoZm10cyk7CisgICAgICAgICAgIGZtdHMuSW5uZXJYbWwgPSAiPGM6cGl2b3RGbXQ+PGM6aWR4IHZhbD1cIjBcIi8+PGM6bWFya2VyPjxjOnN5bWJvbCB2YWw9XCJub25lXCIvPjwvYzptYXJrZXI+PC9jOnBpdm90Rm10PiI7CisKKyAgICAgICAgICAgU2VyaWVzLkFkZFBpdm90U2VyaWUocGl2b3RUYWJsZVNvdXJjZSk7CisgICAgICAgfQorICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgRGVsZXRlTWUoKQorICAgICAgIHsKKyAgICAgICAgICAgdHJ5CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFBhcnQuUGFja2FnZS5EZWxldGVQYXJ0KFVyaUNoYXJ0KTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJFUFBsdXMgaW50ZXJuYWwgZXJyb3Igd2hlbiBkZWxldGVpbmcgY2hhcnQuIiwgZXgpKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBiYXNlLkRlbGV0ZU1lKCk7CisgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRBeGlzLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydEF4aXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5N2JhZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRBeGlzLmNzCkBAIC0wLDAgKzEsNzYyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSBheGlzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUF4aXNQb3NpdGlvbgorICAgIHsKKyAgICAgICAgTGVmdCA9IDAsCisgICAgICAgIEJvdHRvbSA9IDEsCisgICAgICAgIFJpZ2h0ID0gMiwKKyAgICAgICAgVG9wID0gMworICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSBZLUF4aXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVZQXhpc1Bvc2l0aW9uCisgICAgeworICAgICAgICBMZWZ0ID0gMCwKKyAgICAgICAgUmlnaHQgPSAyLAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSBYLUF4aXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVYQXhpc1Bvc2l0aW9uCisgICAgeworICAgICAgICBCb3R0b20gPSAxLAorICAgICAgICBUb3AgPSAzCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQXhpcyBvcmllbnRhaW9uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlQXhpc09yaWVudGF0aW9uCisgICAgeworICAgICAgICBNYXhNaW4sCisgICAgICAgIE1pbk1heAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhvdyB0aGUgYXhpcyBhcmUgY3Jvc3NlZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUNyb3NzQmV0d2VlbgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB2YWx1ZSBheGlzIHNoYWxsIGNyb3NzIHRoZSBjYXRlZ29yeSBheGlzIGJldHdlZW4gZGF0YSBtYXJrZXJzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEJldHdlZW4sCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdmFsdWUgYXhpcyBzaGFsbCBjcm9zcyB0aGUgY2F0ZWdvcnkgYXhpcyBhdCB0aGUgbWlkcG9pbnQgb2YgYSBjYXRlZ29yeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTWlkQ2F0CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hlcmUgdGhlIGF4aXMgY3Jvc3MuIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUNyb3NzZXMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIChBeGlzIENyb3NzZXMgYXQgWmVybykgVGhlIGNhdGVnb3J5IGF4aXMgY3Jvc3NlcyBhdCB0aGUgemVybyBwb2ludCBvZiB0aGUgdmFsdWVheGlzIChpZiBwb3NzaWJsZSksIG9yIHRoZSBtaW5pbXVtIHZhbHVlIChpZiB0aGVtaW5pbXVtIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvKSBvciB0aGUgbWF4aW11bSAoaWYgdGhlIG1heGltdW0gaXMgbGVzcyB0aGFuIHplcm8pLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBdXRvWmVybywKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGF4aXMgY3Jvc3NlcyBhdCB0aGUgbWF4aW11bSB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNYXgsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIChBeGlzIGNyb3NzZXMgYXQgdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNoYXJ0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNaW4KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaWNrbWFya3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVBeGlzVGlja01hcmsKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdGljayBtYXJrcyBzaGFsbCBjcm9zcyB0aGUgYXhpcy4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIENyb3NzLCAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHRpY2sgbWFya3Mgc2hhbGwgYmUgaW5zaWRlIHRoZSBwbG90IGFyZWEuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBJbiwgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlcmUgc2hhbGwgYmUgbm8gdGljayBtYXJrcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTm9uZSwgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdGljayBtYXJrcyBzaGFsbCBiZSBvdXRzaWRlIHRoZSBwbG90IGFyZWEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE91dAorICAgIH0KKyAgICBwdWJsaWMgZW51bSBlQnVpbGRJblVuaXRzIDogbG9uZworICAgIHsKKyAgICAgICAgaHVuZHJlZHMgPSAxMDAsCisgICAgICAgIHRob3VzYW5kcyA9IDEwMDAsCisgICAgICAgIHRlblRob3VzYW5kcyA9IDEwMDAwLAorICAgICAgICBodW5kcmVkVGhvdXNhbmRzID0gMTAwMDAwLAorICAgICAgICBtaWxsaW9ucyA9IDEwMDAwMDAsCisgICAgICAgIHRlbk1pbGxpb25zID0gMTAwMDAwMDAsCisgICAgICAgIGh1bmRyZWRNaWxsaW9ucyA9IDEwMDAwMDAwMCwKKyAgICAgICAgYmlsbGlvbnMgPSAxMDAwMDAwMDAwLAorICAgICAgICB0cmlsbGlvbnMgPSAxMDAwMDAwMDAwMDAwCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXhpcyBmb3IgYSBjaGFydAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbENoYXJ0QXhpcyA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHlwZSBvZiBheGlzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGVudW0gZUF4aXNUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBWYWx1ZSBheGlzCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgVmFsLAorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIENhdGVnb3J5IGF4aXMKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBDYXQsCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gRGF0ZSBheGlzCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgRGF0ZSwKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBTZXJpZXMgYXhpcworICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIFNlcmllCisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydEF4aXMoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUpIDoKKyAgICAgICAgICAgIGJhc2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImF4SWQiLCAic2NhbGluZyIsICJsb2dCYXNlIiwgIm9yaWVudGF0aW9uIiwgIm1heCIsICJtaW4iLCAiZGVsZXRlIiwgImF4UG9zIiwgIm1ham9yR3JpZGxpbmVzIiwgInRpdGxlIiwgIm51bUZtdCIsICJtYWpvclRpY2tNYXJrIiwgIm1pbm9yVGlja01hcmsiLCAidGlja0xibFBvcyIsICJzcFByIiwgInR4UHIiLCAiY3Jvc3NBeCIsICJjcm9zc2VzQXQiLCAiY3Jvc3NlcyIsICJjcm9zc0JldHdlZW4iLCAiYXV0byIsICJsYmxPZmZzZXQiLCAibWFqb3JVbml0IiwgIm1pbm9yVW5pdCIsICJkaXNwVW5pdHMiLCAic3BQciIsICJ0eFByIiB9OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiYzpheElkL0B2YWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX21ham9yVGlja01hcmsgPSAiYzptYWpvclRpY2tNYXJrL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBtYWpvclRpY2tNYXJrIAorICAgICAgICAvLy8gVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWFqb3IgdGljayBtYXJrcyBmb3IgdGhlIGF4aXMuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUF4aXNUaWNrTWFyayBNYWpvclRpY2tNYXJrCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2PUdldFhtbE5vZGVTdHJpbmcoX21ham9yVGlja01hcmspOworICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVBeGlzVGlja01hcmsuQ3Jvc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVBeGlzVGlja01hcmspRW51bS5QYXJzZSggdHlwZW9mKCBlQXhpc1RpY2tNYXJrICksIHYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNUaWNrTWFyay5Dcm9zczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIF9tYWpvclRpY2tNYXJrLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cmluZyBfbWlub3JUaWNrTWFyayA9ICJjOm1pbm9yVGlja01hcmsvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIG1pbm9yVGlja01hcmsgCisgICAgICAgIC8vLyBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtaW5vciB0aWNrIG1hcmtzIGZvciB0aGUgYXhpcy4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlQXhpc1RpY2tNYXJrIE1pbm9yVGlja01hcmsKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHY9R2V0WG1sTm9kZVN0cmluZyhfbWlub3JUaWNrTWFyayk7CisgICAgICAgICAgICAgICAgaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkodikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNUaWNrTWFyay5Dcm9zczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUF4aXNUaWNrTWFyaylFbnVtLlBhcnNlKHR5cGVvZihlQXhpc1RpY2tNYXJrKSwgdiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1RpY2tNYXJrLkNyb3NzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbWlub3JUaWNrTWFyaywgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHlwZSBvZiBheGlzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGVBeGlzVHlwZSBBeGlzVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUF4aXNUeXBlKUVudW0uUGFyc2UodHlwZW9mKGVBeGlzVHlwZSksIFRvcE5vZGUuTG9jYWxOYW1lLlN1YnN0cmluZygwLDMpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1R5cGUuVmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBBWElTX1BPU0lUSU9OX1BBVEggPSAiYzpheFBvcy9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hlcmUgdGhlIGF4aXMgaXMgbG9jYXRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUF4aXNQb3NpdGlvbiBBeGlzUG9zaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaChHZXRYbWxOb2RlU3RyaW5nKEFYSVNfUE9TSVRJT05fUEFUSCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1Bvc2l0aW9uLkJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiciI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNQb3NpdGlvbi5SaWdodDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAidCI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNQb3NpdGlvbi5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVBeGlzUG9zaXRpb24uTGVmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEFYSVNfUE9TSVRJT05fUEFUSCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlN1YnN0cmluZygwLDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2Nyb3NzZXNQYXRoID0gImM6Y3Jvc3Nlcy9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hlcmUgdGhlIGF4aXMgY3Jvc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVDcm9zc2VzIENyb3NzZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHY9R2V0WG1sTm9kZVN0cmluZyhfY3Jvc3Nlc1BhdGgpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ3Jvc3Nlcy5BdXRvWmVybzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUNyb3NzZXMpRW51bS5QYXJzZSh0eXBlb2YoZUNyb3NzZXMpLCB2LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNyb3NzZXMuQXV0b1plcm87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxLCB2Lkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Nyb3NzZXNQYXRoLCB2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfY3Jvc3NCZXR3ZWVuUGF0aCA9ICJjOmNyb3NzQmV0d2Vlbi9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSG93IHRoZSBheGlzIGFyZSBjcm9zc2VkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlQ3Jvc3NCZXR3ZWVuIENyb3NzQmV0d2VlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdj1HZXRYbWxOb2RlU3RyaW5nKF9jcm9zc0JldHdlZW5QYXRoKTsKKyAgICAgICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ3Jvc3NCZXR3ZWVuLkJldHdlZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVDcm9zc0JldHdlZW4pRW51bS5QYXJzZSh0eXBlb2YoZUNyb3NzQmV0d2VlbiksIHYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ3Jvc3NCZXR3ZWVuLkJldHdlZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9jcm9zc0JldHdlZW5QYXRoLCB2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2Nyb3NzZXNBdFBhdGggPSAiYzpjcm9zc2VzQXQvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2YWx1ZSB3aGVyZSB0aGUgYXhpcyBjcm9zcy4gCisgICAgICAgIC8vLyBOdWxsIGlzIGF1dG9tYXRpYworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZG91YmxlPyBDcm9zc2VzQXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9jcm9zc2VzQXRQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfY3Jvc3Nlc0F0UGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Nyb3NzZXNBdFBhdGgsICgoZG91YmxlKXZhbHVlKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfZm9ybWF0UGF0aCA9ICJjOm51bUZtdC9AZm9ybWF0Q29kZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE51bWJlcmZvcm1hdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm1hdCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX2Zvcm1hdFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZm9ybWF0UGF0aCx2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgX2xibFBvcyA9ICJjOnRpY2tMYmxQb3MvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSBsYWJlbHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVUaWNrTGFiZWxQb3NpdGlvbiBMYWJlbFBvc2l0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2PUdldFhtbE5vZGVTdHJpbmcoX2xibFBvcyk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUaWNrTGFiZWxQb3NpdGlvbi5OZXh0VG87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVUaWNrTGFiZWxQb3NpdGlvbilFbnVtLlBhcnNlKHR5cGVvZihlVGlja0xhYmVsUG9zaXRpb24pLCB2LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRpY2tMYWJlbFBvc2l0aW9uLk5leHRUbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBscCA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGJsUG9zLCBscC5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIGxwLlN1YnN0cmluZygxLCBscC5MZW5ndGggLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxEcmF3aW5nRmlsbCBfZmlsbCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFjY2VzcyB0byBmaWxsIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0ZpbGwgRmlsbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpbGwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maWxsID0gbmV3IEV4Y2VsRHJhd2luZ0ZpbGwoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBY2Nlc3MgdG8gYm9yZGVyIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIvYTpsbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbFRleHRGb250IF9mb250ID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWNjZXNzIHRvIGZvbnQgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxUZXh0Rm9udCBGb250CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZm9udCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0eFByIiwgTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiYzp0eFByL2E6Ym9keVByIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpsc3RTdHlsZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9mb250ID0gbmV3IEV4Y2VsVGV4dEZvbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6dHhQci9hOnAvYTpwUHIvYTpkZWZSUHIiLCBuZXcgc3RyaW5nW10geyAicFByIiwgImRlZlJQciIsICJzb2xpZEZpbGwiLCAidUZpbGwiLCAibGF0aW4iLCAiY3MiLCAiciIsICJyUHIiLCAidCIgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZm9udDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgYXhpcyBpcyBkZWxldGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERlbGV0ZWQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiYzpkZWxldGUvQHZhbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woImM6ZGVsZXRlL0B2YWwiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF90aWNMYmxQb3NfUGF0aCA9ICJjOnRpY2tMYmxQb3MvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSBMYWJsZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVUaWNrTGFiZWxQb3NpdGlvbiBUaWNrTGFiZWxQb3NpdGlvbiAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHYgPSBHZXRYbWxOb2RlU3RyaW5nKF90aWNMYmxQb3NfUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRpY2tMYWJlbFBvc2l0aW9uLk5vbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVRpY2tMYWJlbFBvc2l0aW9uKUVudW0uUGFyc2UodHlwZW9mKGVUaWNrTGFiZWxQb3NpdGlvbiksIHYsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB2PXYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxLCB2Lkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RpY0xibFBvc19QYXRoLHYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfZGlzcGxheVVuaXRQYXRoID0gImM6ZGlzcFVuaXRzL2M6YnVpbHRJblVuaXQvQHZhbCI7CisgICAgICAgIGNvbnN0IHN0cmluZyBfY3VzdFVuaXRQYXRoID0gImM6ZGlzcFVuaXRzL2M6Y3VzdFVuaXQvQHZhbCI7CisgICAgICAgIHB1YmxpYyBkb3VibGUgRGlzcGxheVVuaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHYgPSBHZXRYbWxOb2RlU3RyaW5nKF9kaXNwbGF5VW5pdFBhdGgpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjID0gR2V0WG1sTm9kZURvdWJsZU51bGwoX2N1c3RVbml0UGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlKShsb25nKUVudW0uUGFyc2UodHlwZW9mKGVCdWlsZEluVW5pdHMpLCB2LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChBeGlzVHlwZSA9PSBlQXhpc1R5cGUuVmFsICYmIHZhbHVlPj0wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCh2YXIgdiBpbiBFbnVtLkdldFZhbHVlcyh0eXBlb2YoZUJ1aWxkSW5Vbml0cykpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigoZG91YmxlKShsb25nKXY9PXZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX2N1c3RVbml0UGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZGlzcGxheVVuaXRQYXRoLCAoKGVCdWlsZEluVW5pdHMpdmFsdWUpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9kaXNwbGF5VW5pdFBhdGgpOworICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSE9MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfY3VzdFVuaXRQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBFeGNlbENoYXJ0VGl0bGUgX3RpdGxlID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2hhcnQgYXhpcyB0aXRsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFRpdGxlIFRpdGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdGl0bGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnRpdGxlIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImM6dGl0bGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6dGl0bGUiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuSW5uZXJYbWwgPSAiPGM6dHg+PGM6cmljaD48YTpib2R5UHIgLz48YTpsc3RTdHlsZSAvPjxhOnA+PGE6cj48YTp0IC8+PC9hOnI+PC9hOnA+PC9jOnJpY2g+PC9jOnR4PjxjOmxheW91dCAvPjxjOm92ZXJsYXkgdmFsPVwiMFwiIC8+IjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfdGl0bGUgPSBuZXcgRXhjZWxDaGFydFRpdGxlKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3RpdGxlOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgICNyZWdpb24gIlNjYWxpbmciCisgICAgICAgIGNvbnN0IHN0cmluZyBfbWluVmFsdWVQYXRoID0gImM6c2NhbGluZy9jOm1pbi9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWluaW11bSB2YWx1ZSBmb3IgdGhlIGF4aXMuCisgICAgICAgIC8vLyBOdWxsIGlzIGF1dG9tYXRpYworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZG91YmxlPyBNaW5WYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZU51bGwoX21pblZhbHVlUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX21pblZhbHVlUGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX21pblZhbHVlUGF0aCwgKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9tYXhWYWx1ZVBhdGggPSAiYzpzY2FsaW5nL2M6bWF4L0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNYXggdmFsdWUgZm9yIHRoZSBheGlzLgorICAgICAgICAvLy8gTnVsbCBpcyBhdXRvbWF0aWMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZT8gTWF4VmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9tYXhWYWx1ZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9tYXhWYWx1ZVBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9tYXhWYWx1ZVBhdGgsICgoZG91YmxlKXZhbHVlKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfbWFqb3JVbml0UGF0aCA9ICJjOm1ham9yVW5pdC9AdmFsIjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIF9tYWpvclVuaXRDYXRQYXRoID0gImM6dGlja0xibFNraXAvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1ham9yIHVuaXQgZm9yIHRoZSBheGlzLgorICAgICAgICAvLy8gTnVsbCBpcyBhdXRvbWF0aWMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZT8gTWFqb3JVbml0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChBeGlzVHlwZSA9PSBlQXhpc1R5cGUuQ2F0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9tYWpvclVuaXRDYXRQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9tYWpvclVuaXRQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX21ham9yVW5pdFBhdGgpOworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9tYWpvclVuaXRDYXRQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEF4aXNUeXBlID09IGVBeGlzVHlwZS5DYXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX21ham9yVW5pdENhdFBhdGgsICgoZG91YmxlKXZhbHVlKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9tYWpvclVuaXRQYXRoLCAoKGRvdWJsZSl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfbWlub3JVbml0UGF0aCA9ICJjOm1pbm9yVW5pdC9AdmFsIjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIF9taW5vclVuaXRDYXRQYXRoID0gImM6dGlja01hcmtTa2lwL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNaW5vciB1bml0IGZvciB0aGUgYXhpcy4KKyAgICAgICAgLy8vIE51bGwgaXMgYXV0b21hdGljCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGU/IE1pbm9yVW5pdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQXhpc1R5cGUgPT0gZUF4aXNUeXBlLkNhdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRG91YmxlTnVsbChfbWlub3JVbml0Q2F0UGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRG91YmxlTnVsbChfbWlub3JVbml0UGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9taW5vclVuaXRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfbWlub3JVbml0Q2F0UGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBeGlzVHlwZSA9PSBlQXhpc1R5cGUuQ2F0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9taW5vclVuaXRDYXRQYXRoLCAoKGRvdWJsZSl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbWlub3JVbml0UGF0aCwgKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2xvZ2Jhc2VQYXRoID0gImM6c2NhbGluZy9jOmxvZ0Jhc2UvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBiYXNlIGZvciBhIGxvZ2FyaXRtaWMgc2NhbGUKKyAgICAgICAgLy8vIE51bGwgZm9yIGEgbm9ybWFsIHNjYWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGU/IExvZ0Jhc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9sb2diYXNlUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX2xvZ2Jhc2VQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHYgPSAoKGRvdWJsZSl2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2IDwgMiB8fCB2ID4gMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDEwMDAiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbG9nYmFzZVBhdGgsIHYuVG9TdHJpbmcoIjAuMCIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9vcmllbnRhdGlvblBhdGggPSAiYzpzY2FsaW5nL2M6b3JpZW50YXRpb24vQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUF4aXNPcmllbnRhdGlvbiBPcmllbnRhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoX29yaWVudGF0aW9uUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNPcmllbnRhdGlvbi5NaW5NYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUF4aXNPcmllbnRhdGlvbilFbnVtLlBhcnNlKHR5cGVvZihlQXhpc09yaWVudGF0aW9uKSwgdiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHM9dmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzPXMuU3Vic3RyaW5nKDAsMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHMuU3Vic3RyaW5nKDEscy5MZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfb3JpZW50YXRpb25QYXRoLCBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0Q29sbGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZmMjJmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydENvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwxMDggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFbnVtZXJhdGVzIGNoYXJ0dHlwZXMgCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydENvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbENoYXJ0PgorICAgIHsKKyAgICAgICAgTGlzdDxFeGNlbENoYXJ0PiBfbGlzdCA9IG5ldyBMaXN0PEV4Y2VsQ2hhcnQ+KCk7CisgICAgICAgIEV4Y2VsQ2hhcnQgX3RvcENoYXJ0OworICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0Q29sbGVjdGlvbihFeGNlbENoYXJ0IGNoYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBfdG9wQ2hhcnQgPSBjaGFydDsKKyAgICAgICAgICAgIF9saXN0LkFkZChjaGFydCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGQoRXhjZWxDaGFydCBjaGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3QuQWRkKGNoYXJ0KTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgYSBuZXcgY2hhcnR0eXBlIHRvIHRoZSBjaGFydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0VHlwZSI+VGhlIHR5cGUgb2YgdGhlIG5ldyBjaGFydDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0IEFkZChlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF90b3BDaGFydC5QaXZvdFRhYmxlU291cmNlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4gbm90IGFkZCBvdGhlciBjaGFydHR5cGVzIHRvIGEgcGl2b3QgY2hhcnQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChFeGNlbENoYXJ0LklzVHlwZTNEKGNoYXJ0VHlwZSkgfHwgX2xpc3RbMF0uSXNUeXBlM0QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiM0QgY2hhcnRzIGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciBjaGFydHR5cGVzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcHJlcGVuZGluZ0NoYXJ0Tm9kZSA9IF9saXN0W19saXN0LkNvdW50IC0gMV0uVG9wTm9kZTsKKyAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSBFeGNlbENoYXJ0LkdldE5ld0NoYXJ0KF90b3BDaGFydC5Xb3JrU2hlZXQuRHJhd2luZ3MsIF90b3BDaGFydC5Ub3BOb2RlLCBjaGFydFR5cGUsIF90b3BDaGFydCwgbnVsbCk7CisKKyAgICAgICAgICAgIF9saXN0LkFkZChjaGFydCk7CisgICAgICAgICAgICByZXR1cm4gY2hhcnQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3QuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSUVudW1lcmF0b3I8RXhjZWxDaGFydD4gSUVudW1lcmFibGU8RXhjZWxDaGFydD4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgYSBjaGFydCBhdCB0aGUgc3BlY2lmaWMgcG9zaXRpb24uICAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQb3NpdGlvbklEIj5UaGUgcG9zaXRpb24gb2YgdGhlIGNoYXJ0LiAwLWJhc2U8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydCB0aGlzW2ludCBQb3NpdGlvbklEXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9saXN0W1Bvc2l0aW9uSURdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKK30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnREYXRhTGFiZWwuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0RGF0YUxhYmVsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzk5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0RGF0YUxhYmVsLmNzCkBAIC0wLDAgKzEsMjkwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTItMzAKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERhdGFsYWJlbCBvbiBjaGFydCBsZXZlbC4gCisgICAgLy8vIFRoaXMgY2xhc3MgaXMgaW5oZXJpdGVkIGJ5IEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQ2hhcnREYXRhTGFiZWwgOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydERhdGFMYWJlbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUpCisgICAgICAgICAgIDogYmFzZShucyxub2RlKQorICAgICAgIHsKKyAgICAgICAgICAgWG1sTm9kZSB0b3BOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOmRMYmxzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgIGlmICh0b3BOb2RlID09IG51bGwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRvcE5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiYyIsICJkTGJscyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgICAgICAvL25vZGUuSW5zZXJ0QWZ0ZXIoX3RvcE5vZGUsIG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzpvcmRlciIsIE5hbWVTcGFjZU1hbmFnZXIpKTsKKyAgICAgICAgICAgICAgIEluc2VyQWZ0ZXIobm9kZSwgImM6bWFya2VyLGM6dHgsYzpvcmRlcixjOnNlciIsIHRvcE5vZGUpOworICAgICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInNwUHIiLCAidHhQciIsICJkTGJsUG9zIiwgInNob3dMZWdlbmRLZXkiLCAic2hvd1ZhbCIsICJzaG93Q2F0TmFtZSIsICJzaG93U2VyTmFtZSIsICJzaG93UGVyY2VudCIsICJzaG93QnViYmxlU2l6ZSIsICJzZXBhcmF0b3IiLCAic2hvd0xlYWRlckxpbmVzIiB9OworICAgICAgICAgICAgICAgdG9wTm9kZS5Jbm5lclhtbCA9ICI8YzpzaG93TGVnZW5kS2V5IHZhbD1cIjBcIiAvPjxjOnNob3dWYWwgdmFsPVwiMFwiIC8+PGM6c2hvd0NhdE5hbWUgdmFsPVwiMFwiIC8+PGM6c2hvd1Nlck5hbWUgdmFsPVwiMFwiIC8+PGM6c2hvd1BlcmNlbnQgdmFsPVwiMFwiIC8+PGM6c2hvd0J1YmJsZVNpemUgdmFsPVwiMFwiIC8+IDxjOnNlcGFyYXRvcj5cclxuPC9jOnNlcGFyYXRvcj48YzpzaG93TGVhZGVyTGluZXMgdmFsPVwiMFwiIC8+IjsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIH0KKyAgICAgICAgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgICAgfQorICAgICAgICNyZWdpb24gIlB1YmxpYyBwcm9wZXJ0aWVzIgorICAgICAgIGNvbnN0IHN0cmluZyBzaG93VmFsUGF0aCA9ICJjOnNob3dWYWwvQHZhbCI7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBTaG93IHRoZSB2YWx1ZXMgCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd1ZhbHVlCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHNob3dWYWxQYXRoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhzaG93VmFsUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGNvbnN0IHN0cmluZyBzaG93Q2F0UGF0aCA9ICJjOnNob3dDYXROYW1lL0B2YWwiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gU2hvdyBjYXRlZ29yeSBuYW1lcworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dDYXRlZ29yeQorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChzaG93Q2F0UGF0aCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc2hvd0NhdFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBjb25zdCBzdHJpbmcgc2hvd1NlclBhdGggPSAiYzpzaG93U2VyTmFtZS9AdmFsIjsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIFNob3cgc2VyaWVzIG5hbWVzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd1Nlcmllc05hbWUKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woc2hvd1NlclBhdGgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHNob3dTZXJQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgY29uc3Qgc3RyaW5nIHNob3dQZXJlbnRQYXRoID0gImM6c2hvd1BlcmNlbnQvQHZhbCI7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBTaG93IHBlcmNlbnQgdmFsdWVzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd1BlcmNlbnQKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woc2hvd1BlcmVudFBhdGgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHNob3dQZXJlbnRQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgY29uc3Qgc3RyaW5nIHNob3dMZWFkZXJMaW5lc1BhdGggPSAiYzpzaG93TGVhZGVyTGluZXMvQHZhbCI7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBTaG93IHRoZSBsZWFkZXIgbGluZXMKKyAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaG93TGVhZGVyTGluZXMKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woc2hvd0xlYWRlckxpbmVzUGF0aCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc2hvd0xlYWRlckxpbmVzUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGNvbnN0IHN0cmluZyBzaG93QnViYmxlU2l6ZVBhdGggPSAiYzpzaG93QnViYmxlU2l6ZS9AdmFsIjsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEJ1YmJsZSBTaXplLgorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dCdWJibGVTaXplCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHNob3dCdWJibGVTaXplUGF0aCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc2hvd0J1YmJsZVNpemVQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgY29uc3Qgc3RyaW5nIHNob3dMZWdlbmRLZXlQYXRoID0gImM6c2hvd0xlZ2VuZEtleS9AdmFsIjsKKyAgICAgICBwdWJsaWMgYm9vbCBTaG93TGVnZW5kS2V5CisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHNob3dMZWdlbmRLZXlQYXRoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhzaG93TGVnZW5kS2V5UGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGNvbnN0IHN0cmluZyBzZXBhcmF0b3JQYXRoID0gImM6c2VwYXJhdG9yIjsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIFNlcGFyYXRvciBzdHJpbmcgCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBTZXBhcmF0b3IKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhzZXBhcmF0b3JQYXRoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKHNlcGFyYXRvclBhdGgpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc2VwYXJhdG9yUGF0aCwgdmFsdWUpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgRXhjZWxEcmF3aW5nRmlsbCBfZmlsbCA9IG51bGw7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBBY2Nlc3MgZmlsbCBwcm9wZXJ0aWVzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gQWNjZXNzIGJvcmRlciBwcm9wZXJ0aWVzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nQm9yZGVyIEJvcmRlcgorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChfYm9yZGVyID09IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgX2JvcmRlciA9IG5ldyBFeGNlbERyYXdpbmdCb3JkZXIoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQci9hOmxuIik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBzdHJpbmdbXSBfcGFyYWdyYXBoU2NoZW1hT3JkZXIgPSBuZXcgc3RyaW5nW10geyAic3BQciIsICJ0eFByIiwgImRMYmxQb3MiLCAic2hvd1ZhbCIsICJzaG93Q2F0TmFtZSIsICJzaG93U2VyTmFtZSIsICJzaG93UGVyY2VudCIsICJzZXBhcmF0b3IiLCAic2hvd0xlYWRlckxpbmVzIiwgInBQciIsICJkZWZSUHIiLCAic29saWRGaWxsIiwgInVGaWxsIiwgImxhdGluIiwgImNzIiwgInIiLCAiclByIiwgInQiIH07CisgICAgICAgRXhjZWxUZXh0Rm9udCBfZm9udCA9IG51bGw7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBBY2Nlc3MgZm9udCBwcm9wZXJ0aWVzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgRXhjZWxUZXh0Rm9udCBGb250CisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKF9mb250ID09IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgaWYgKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0eFByIiwgTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImM6dHhQci9hOmJvZHlQciIpOworICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpsc3RTdHlsZSIpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBfZm9udCA9IG5ldyBFeGNlbFRleHRGb250KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnR4UHIvYTpwL2E6cFByL2E6ZGVmUlByIiwgX3BhcmFncmFwaFNjaGVtYU9yZGVyKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybiBfZm9udDsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICAjZW5kcmVnaW9uCisgICAgICAgI3JlZ2lvbiAiUG9zaXRpb24gRW51bSBUcmFuc2xhdGlvbiIKKyAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIEdldFBvc1RleHQoZUxhYmVsUG9zaXRpb24gcG9zKQorICAgICAgIHsKKyAgICAgICAgICAgc3dpdGNoIChwb3MpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgZUxhYmVsUG9zaXRpb24uQm90dG9tOgorICAgICAgICAgICAgICAgICAgIHJldHVybiAiYiI7CisgICAgICAgICAgICAgICBjYXNlIGVMYWJlbFBvc2l0aW9uLkNlbnRlcjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gImN0ciI7CisgICAgICAgICAgICAgICBjYXNlIGVMYWJlbFBvc2l0aW9uLkluQmFzZToKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gImluQmFzZSI7CisgICAgICAgICAgICAgICBjYXNlIGVMYWJlbFBvc2l0aW9uLkluRW5kOgorICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW5FbmQiOworICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5MZWZ0OgorICAgICAgICAgICAgICAgICAgIHJldHVybiAibCI7CisgICAgICAgICAgICAgICBjYXNlIGVMYWJlbFBvc2l0aW9uLlJpZ2h0OgorICAgICAgICAgICAgICAgICAgIHJldHVybiAiciI7CisgICAgICAgICAgICAgICBjYXNlIGVMYWJlbFBvc2l0aW9uLlRvcDoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gInQiOworICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5PdXRFbmQ6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvdXRFbmQiOworICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gImJlc3RGaXQiOworICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgcHJvdGVjdGVkIGVMYWJlbFBvc2l0aW9uIEdldFBvc0VudW0oc3RyaW5nIHBvcykKKyAgICAgICB7CisgICAgICAgICAgIHN3aXRjaCAocG9zKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlICJiIjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxhYmVsUG9zaXRpb24uQm90dG9tOworICAgICAgICAgICAgICAgY2FzZSAiY3RyIjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxhYmVsUG9zaXRpb24uQ2VudGVyOworICAgICAgICAgICAgICAgY2FzZSAiaW5CYXNlIjoKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxhYmVsUG9zaXRpb24uSW5CYXNlOworICAgICAgICAgICAgICAgY2FzZSAiaW5FbmQiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGFiZWxQb3NpdGlvbi5JbkVuZDsKKyAgICAgICAgICAgICAgIGNhc2UgImwiOgorICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGFiZWxQb3NpdGlvbi5MZWZ0OworICAgICAgICAgICAgICAgY2FzZSAiciI6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLlJpZ2h0OworICAgICAgICAgICAgICAgY2FzZSAidCI6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLlRvcDsKKyAgICAgICAgICAgICAgIGNhc2UgIm91dEVuZCI6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLk91dEVuZDsKKyAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLkJlc3RGaXQ7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRMZWdlbmQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0TGVnZW5kLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjE3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0TGVnZW5kLmNzCkBAIC0wLDAgKzEsMjAwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUG9zaXRpb24gb2YgdGhlIGxlZ2VuZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUxlZ2VuZFBvc2l0aW9uCisgICAgeworICAgICAgICBUb3AsCisgICAgICAgIExlZnQsCisgICAgICAgIFJpZ2h0LAorICAgICAgICBCb3R0b20sCisgICAgICAgIFRvcFJpZ2h0CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ2hhcnQgbGVkZ2VyCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydExlZ2VuZCA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgRXhjZWxDaGFydCBfY2hhcnQ7CisgICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnRMZWdlbmQoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBFeGNlbENoYXJ0IGNoYXJ0KQorICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKKyAgICAgICB7CisgICAgICAgICAgIF9jaGFydD1jaGFydDsKKyAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImxlZ2VuZFBvcyIsICJsYXlvdXQiLCJvdmVybGF5IiwgInR4UHIiLCAiYm9keVByIiwgImxzdFN0eWxlIiwgInNwUHIiIH07CisgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgUE9TSVRJT05fUEFUSCA9ICJjOmxlZ2VuZFBvcy9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIExlZ2VuZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUxlZ2VuZFBvc2l0aW9uIFBvc2l0aW9uIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goR2V0WG1sTm9kZVN0cmluZyhQT1NJVElPTl9QQVRIKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAidCI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxlZ2VuZFBvc2l0aW9uLlRvcDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiYiI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxlZ2VuZFBvc2l0aW9uLkJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibCI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxlZ2VuZFBvc2l0aW9uLkxlZnQ7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInRyIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGVnZW5kUG9zaXRpb24uVG9wUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxlZ2VuZFBvc2l0aW9uLlJpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUb3BOb2RlID09IG51bGwpIHRocm93KG5ldyBFeGNlcHRpb24oIkNhbid0IHNldCBwb3NpdGlvbi4gQ2hhcnQgaGFzIG5vIGxlZ2VuZCIpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlTGVnZW5kUG9zaXRpb24uVG9wOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhQT1NJVElPTl9QQVRILCAidCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUxlZ2VuZFBvc2l0aW9uLkJvdHRvbToKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoUE9TSVRJT05fUEFUSCwgImIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVMZWdlbmRQb3NpdGlvbi5MZWZ0OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhQT1NJVElPTl9QQVRILCAibCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUxlZ2VuZFBvc2l0aW9uLlRvcFJpZ2h0OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhQT1NJVElPTl9QQVRILCAidHIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhQT1NJVElPTl9QQVRILCAiciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBPVkVSTEFZX1BBVEggPSAiYzpvdmVybGF5L0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgbGVnZW5kIG92ZXJsYXlzIG90aGVyIG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgT3ZlcmxheQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woT1ZFUkxBWV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUb3BOb2RlID09IG51bGwpIHRocm93IChuZXcgRXhjZXB0aW9uKCJDYW4ndCBzZXQgb3ZlcmxheS4gQ2hhcnQgaGFzIG5vIGxlZ2VuZCIpKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChPVkVSTEFZX1BBVEgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmlsbCBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJvcmRlciBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nQm9yZGVyIEJvcmRlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2JvcmRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JvcmRlciA9IG5ldyBFeGNlbERyYXdpbmdCb3JkZXIoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQci9hOmxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfYm9yZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsVGV4dEZvbnQgX2ZvbnQgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb250IHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVGV4dEZvbnQgRm9udAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZvbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6dHhQciIsTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiYzp0eFByL2E6Ym9keVByIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpsc3RTdHlsZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9mb250ID0gbmV3IEV4Y2VsVGV4dEZvbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6dHhQci9hOnAvYTpwUHIvYTpkZWZSUHIiLCBuZXcgc3RyaW5nW10geyAibGVnZW5kUG9zIiwgImxheW91dCIsICJwUHIiLCAiZGVmUlByIiwgInNvbGlkRmlsbCIsICJ1RmlsbCIsICJsYXRpbiIsICJjcyIsICJyIiwgInJQciIsICJ0IiB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9mb250OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZSB0aGUgbGVnZW5kCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChUb3BOb2RlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIFRvcE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChUb3BOb2RlKTsKKyAgICAgICAgICAgIFRvcE5vZGUgPSBudWxsOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIGxlZ2VuZCB0byB0aGUgY2hhcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVG9wTm9kZSE9bnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICAvL1htbEhlbHBlciB4bWwgPSBuZXcgWG1sSGVscGVyKE5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydC5DaGFydFhtbCk7CisgICAgICAgICAgICBYbWxIZWxwZXIgeG1sID0gWG1sSGVscGVyRmFjdG9yeS5DcmVhdGUoTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0LkNoYXJ0WG1sKTsKKyAgICAgICAgICAgIHhtbC5TY2hlbWFOb2RlT3JkZXI9X2NoYXJ0LlNjaGVtYU5vZGVPcmRlcjsKKworICAgICAgICAgICAgeG1sLkNyZWF0ZU5vZGUoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6bGVnZW5kIik7CisgICAgICAgICAgICBUb3BOb2RlID0gX2NoYXJ0LkNoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6bGVnZW5kIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBUb3BOb2RlLklubmVyWG1sPSI8YzpsZWdlbmRQb3MgdmFsPVwiclwiIC8+PGM6bGF5b3V0IC8+IjsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRQbG90QXJlYS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRQbG90QXJlYS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJiYWJlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFBsb3RBcmVhLmNzCkBAIC0wLDAgKzEsODggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMi0zMAorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGNoYXJ0cyBwbG90IGFyZWEKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxDaGFydFBsb3RBcmVhIDogIFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgRXhjZWxDaGFydCBfZmlyc3RDaGFydDsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFBsb3RBcmVhKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgRXhjZWxDaGFydCBmaXJzdENoYXJ0KQorICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKKyAgICAgICB7CisgICAgICAgICAgIF9maXJzdENoYXJ0ID0gZmlyc3RDaGFydDsKKyAgICAgICB9CisKKyAgICAgICAgRXhjZWxDaGFydENvbGxlY3Rpb24gX2NoYXJ0VHlwZXM7CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0Q29sbGVjdGlvbiBDaGFydFR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY2hhcnRUeXBlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NoYXJ0VHlwZXMgPSBuZXcgRXhjZWxDaGFydENvbGxlY3Rpb24oX2ZpcnN0Q2hhcnQpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOworICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7CisgICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfYm9yZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYm9yZGVyID0gbmV3IEV4Y2VsRHJhd2luZ0JvcmRlcihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByL2E6bG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NjdiNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRTZXJpZS5jcwpAQCAtMCwwICsxLDIyMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEyLTMwCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKK3sKKyAgIC8vLyA8c3VtbWFyeT4KKyAgIC8vLyBBIGNoYXJ0IHNlcmllCisgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0U2VyaWUgOiBYbWxIZWxwZXIKKyAgIHsKKyAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0U2VyaWVzIF9jaGFydFNlcmllczsKKyAgICAgICBwcm90ZWN0ZWQgWG1sTm9kZSBfbm9kZTsKKyAgICAgICBwcm90ZWN0ZWQgWG1sTmFtZXNwYWNlTWFuYWdlciBfbnM7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFydFNlcmllcyI+UGFyZW50IGNvbGxlY3Rpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj5OYW1lc3BhY2VtYW5hZ2VyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlPC9wYXJhbT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgorICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkKKyAgICAgICAgICAgOiBiYXNlKG5zLG5vZGUpCisgICAgICAgeworICAgICAgICAgICBfY2hhcnRTZXJpZXMgPSBjaGFydFNlcmllczsKKyAgICAgICAgICAgX25vZGU9bm9kZTsKKyAgICAgICAgICAgX25zPW5zOworICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiaWR4IiwgIm9yZGVyIiwic3BQciIsICJ0eCIsICJtYXJrZXIiLCAidHJlbmRsaW5lIiwgImV4cGxvc2lvbiIsImludmVydElmTmVnYXRpdmUiLCAiZExibHMiLCAiY2F0IiwgInZhbCIsICJ4VmFsIiwgInlWYWwiLCAiYnViYmxlU2l6ZSIsICJidWJibGUzRCIsICJzbW9vdGgiIH07CisKKyAgICAgICAgICAgaWYgKGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlciB8fAorICAgICAgICAgICAgICAgY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXMgfHwKKyAgICAgICAgICAgICAgIGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzIHx8CisgICAgICAgICAgICAgICBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKKyAgICAgICAgICAgICAgIGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycyB8fAorICAgICAgICAgICAgICAgY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQnViYmxlIHx8CisgICAgICAgICAgICAgICBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgX3Nlcmllc1RvcFBhdGggPSAiYzp5VmFsIjsKKyAgICAgICAgICAgICAgIF94U2VyaWVzVG9wUGF0aCA9ICJjOnhWYWwiOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgX3Nlcmllc1RvcFBhdGggPSAiYzp2YWwiOworICAgICAgICAgICAgICAgX3hTZXJpZXNUb3BQYXRoID0gImM6Y2F0IjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBfc2VyaWVzUGF0aCA9IHN0cmluZy5Gb3JtYXQoX3Nlcmllc1BhdGgsIF9zZXJpZXNUb3BQYXRoKTsKKyAgICAgICAgICAgX3hTZXJpZXNQYXRoID0gc3RyaW5nLkZvcm1hdChfeFNlcmllc1BhdGgsIF94U2VyaWVzVG9wUGF0aCwgaXNQaXZvdCA/ICJjOm11bHRpTHZsU3RyUmVmIiA6ICJjOm51bVJlZiIpOworICAgICAgIH0KKyAgICAgICBpbnRlcm5hbCB2b2lkIFNldElEKHN0cmluZyBpZCkKKyAgICAgICB7CisgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImM6aWR4L0B2YWwiLGlkKTsKKyAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiYzpvcmRlci9AdmFsIiwgaWQpOworICAgICAgIH0KKyAgICAgICBjb25zdCBzdHJpbmcgaGVhZGVyUGF0aD0iYzp0eC9jOnYiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gSGVhZGVyIGZvciB0aGUgc2VyaWUuCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgc3RyaW5nIEhlYWRlciAKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoaGVhZGVyUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbGVhcnR4KCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhoZWFkZXJQYXRoLCB2YWx1ZSk7ICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgIHByaXZhdGUgdm9pZCBDbGVhcnR4KCkKKyAgICAgICB7CisgICAgICAgICAgIHZhciBuID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnR4IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgIGlmIChuICE9IG51bGwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIG4uSW5uZXJYbWwgPSAiIjsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBjb25zdCBzdHJpbmcgaGVhZGVyQWRkcmVzc1BhdGggPSAiYzp0eC9jOnN0clJlZi9jOmYiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEhlYWRlciBhZGRyZXNzIGZvciB0aGUgc2VyaWUuCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSBIZWFkZXJBZGRyZXNzCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3RyaW5nIGFkZHJlc3MgPSBHZXRYbWxOb2RlU3RyaW5nKGhlYWRlckFkZHJlc3NQYXRoKTsKKyAgICAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodmFsdWUuX2Zyb21Db2wgIT0gdmFsdWUuX3RvQ29sICYmIHZhbHVlLl9mcm9tUm93ICE9IHZhbHVlLl90b1JvdykgfHwgdmFsdWUuQWRkcmVzc2VzICE9IG51bGwpIC8vU2luZ2xlIGNlbGwgcmVtb3ZlZCwgYWxsb3cgcm93ICYgY29sdW1uIC0tPiBpc3N1ZSAxNTEwMi4gCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBZGRyZXNzIG11c3QgYmUgYSByb3csIGNvbHVtbiBvciBzaW5nbGUgY2VsbCIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDbGVhcnR4KCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhoZWFkZXJBZGRyZXNzUGF0aCwgRXhjZWxDZWxsQmFzZS5HZXRGdWxsQWRkcmVzcyh2YWx1ZS5Xb3JrU2hlZXQsIHZhbHVlLkFkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJjOnR4L2M6c3RyUmVmL2M6c3RyQ2FjaGUvYzpwdENvdW50L0B2YWwiLCAiMCIpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgc3RyaW5nIF9zZXJpZXNUb3BQYXRoOworICAgICAgICBzdHJpbmcgX3Nlcmllc1BhdGggPSAiezB9L2M6bnVtUmVmL2M6ZiI7ICAgICAgIAorICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gU2V0IHRoaXMgdG8gYSB2YWxpZCBhZGRyZXNzIG9yIHRoZSBkcmF3aW5nIHdpbGwgYmUgaW52YWxpZC4KKyAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTZXJpZXMKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfc2VyaWVzUGF0aCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX3Nlcmllc1BhdGgsdHJ1ZSk7CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zZXJpZXNQYXRoLCBFeGNlbENlbGxCYXNlLkdldEZ1bGxBZGRyZXNzKF9jaGFydFNlcmllcy5DaGFydC5Xb3JrU2hlZXQuTmFtZSwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgWG1sTm9kZSBjYWNoZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJ7MH0vYzpudW1SZWYvYzpudW1DYWNoZSIsX3Nlcmllc1RvcFBhdGgpLCBfbnMpOworICAgICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY2FjaGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChjYWNoZSk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChfY2hhcnRTZXJpZXMuQ2hhcnQuUGl2b3RUYWJsZVNvdXJjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtUmVmL2M6bnVtQ2FjaGUiLCBfc2VyaWVzVG9wUGF0aCksICJHZW5lcmFsIik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIFhtbE5vZGUgbGl0ID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoInswfS9jOm51bUxpdCIsX3Nlcmllc1RvcFBhdGgpLCBfbnMpOworICAgICAgICAgICAgICAgaWYgKGxpdCAhPSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGxpdC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGxpdCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgIH0KKyAgICAgICBzdHJpbmcgX3hTZXJpZXNUb3BQYXRoOworICAgICAgIHN0cmluZyBfeFNlcmllc1BhdGggPSAiezB9L3sxfS9jOmYiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gU2V0IGFuIGFkZHJlc3MgZm9yIHRoZSBob3Jpc29udGFsIGxhYmVscworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFhTZXJpZXMKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfeFNlcmllc1BhdGgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF94U2VyaWVzUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF94U2VyaWVzUGF0aCwgRXhjZWxDZWxsQmFzZS5HZXRGdWxsQWRkcmVzcyhfY2hhcnRTZXJpZXMuQ2hhcnQuV29ya1NoZWV0Lk5hbWUsIHZhbHVlKSk7CisKKyAgICAgICAgICAgICAgIFhtbE5vZGUgY2FjaGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtUmVmL2M6bnVtQ2FjaGUiLF94U2VyaWVzVG9wUGF0aCksIF9ucyk7CisgICAgICAgICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjYWNoZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNhY2hlKTsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgWG1sTm9kZSBsaXQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IixfeFNlcmllc1RvcFBhdGgpLCBfbnMpOworICAgICAgICAgICAgICAgaWYgKGxpdCAhPSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGxpdC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGxpdCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgRXhjZWxDaGFydFRyZW5kbGluZUNvbGxlY3Rpb24gX3RyZW5kTGluZXMgPSBudWxsOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gQWNjZXNzIHRvIHRoZSB0cmVuZGxpbmUgY29sbGVjdGlvbgorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0VHJlbmRsaW5lQ29sbGVjdGlvbiBUcmVuZExpbmVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdHJlbmRMaW5lcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3RyZW5kTGluZXMgPSBuZXcgRXhjZWxDaGFydFRyZW5kbGluZUNvbGxlY3Rpb24odGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdHJlbmRMaW5lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Mzg0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwuY3MKQEAgLTAsMCArMSwxMTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRGF0YWxhYmVsIHByb3BlcnRpZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIDogRXhjZWxDaGFydERhdGFMYWJlbAorICAgIHsKKyAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlKQorICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKKyAgICAgICB7CisgICAgICAgICAgIENyZWF0ZU5vZGUocG9zaXRpb25QYXRoKTsKKyAgICAgICAgICAgUG9zaXRpb24gPSBlTGFiZWxQb3NpdGlvbi5DZW50ZXI7CisgICAgICAgfQorCisgICAgICAgY29uc3Qgc3RyaW5nIHBvc2l0aW9uUGF0aD0iYzpkTGJsUG9zL0B2YWwiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIGxhYmVscworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgcHVibGljIGVMYWJlbFBvc2l0aW9uIFBvc2l0aW9uCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEdldFBvc0VudW0oR2V0WG1sTm9kZVN0cmluZyhwb3NpdGlvblBhdGgpKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhwb3NpdGlvblBhdGgsR2V0UG9zVGV4dCh2YWx1ZSkpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gQWNjZXNzIGZpbGwgcHJvcGVydGllcworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBuZXcgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7CisgICAgICAgICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIEV4Y2VsRHJhd2luZ0JvcmRlciBfYm9yZGVyID0gbnVsbDsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEFjY2VzcyBib3JkZXIgcHJvcGVydGllcworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyIEJvcmRlcgorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChfYm9yZGVyID09IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgX2JvcmRlciA9IG5ldyBFeGNlbERyYXdpbmdCb3JkZXIoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQci9hOmxuIik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBFeGNlbFRleHRGb250IF9mb250ID0gbnVsbDsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEFjY2VzcyBmb250IHByb3BlcnRpZXMKKyAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgbmV3IEV4Y2VsVGV4dEZvbnQgRm9udAorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChfZm9udCA9PSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmIChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6dHhQciIsIE5hbWVTcGFjZU1hbmFnZXIpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpib2R5UHIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiYzp0eFByL2E6bHN0U3R5bGUiKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgX2ZvbnQgPSBuZXcgRXhjZWxUZXh0Rm9udChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzp0eFByL2E6cC9hOnBQci9hOmRlZlJQciIsIG5ldyBzdHJpbmdbXSB7ICJzcFByIiwgInR4UHIiLCAiZExibFBvcyIsICJzaG93VmFsIiwgInNob3dDYXROYW1lICIsICJwUHIiLCAiZGVmUlByIiwgInNvbGlkRmlsbCIsICJ1RmlsbCIsICJsYXRpbiIsICJjcyIsICJyIiwgInJQciIsICJ0IiB9KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybiBfZm9udDsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWVzLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFNlcmllcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJiMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFNlcmllcy5jcwpAQCAtMCwwICsxLDQwNiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzIDogRXhjZWxDaGFydFNlcmllcworICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxCdWJibGVDaGFydFNlcmllcyhFeGNlbENoYXJ0IGNoYXJ0LCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkKKyAgICAgICAgICAgOiBiYXNlKGNoYXJ0LG5zLG5vZGUsIGlzUGl2b3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZXModGhpcywgX2RyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydE5vZGUsIGlzUGl2b3QpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U2VyaWUgQWRkKEV4Y2VsUmFuZ2VCYXNlIFNlcmllLCBFeGNlbFJhbmdlQmFzZSBYU2VyaWUsIEV4Y2VsUmFuZ2VCYXNlIEJ1YmJsZVNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlLkFkZFNlcmllcyhTZXJpZS5GdWxsQWRkcmVzc0Fic29sdXRlLCBYU2VyaWUuRnVsbEFkZHJlc3NBYnNvbHV0ZSwgQnViYmxlU2l6ZS5GdWxsQWRkcmVzc0Fic29sdXRlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllIEFkZChzdHJpbmcgU2VyaWVBZGRyZXNzLCBzdHJpbmcgWFNlcmllQWRkcmVzcywgc3RyaW5nIEJ1YmJsZVNpemVBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5BZGRTZXJpZXMoU2VyaWVBZGRyZXNzLCBYU2VyaWVBZGRyZXNzLCBCdWJibGVTaXplQWRkcmVzcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIGNoYXJ0IHNlcmllcworICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydFNlcmllcyA6IFhtbEhlbHBlciwgSUVudW1lcmFibGUKKyAgICB7CisgICAgICAgTGlzdDxFeGNlbENoYXJ0U2VyaWU+IF9saXN0PW5ldyBMaXN0PEV4Y2VsQ2hhcnRTZXJpZT4oKTsKKyAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0IF9jaGFydDsKKyAgICAgICBYbWxOb2RlIF9ub2RlOworICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25zOworICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnRTZXJpZXMoRXhjZWxDaGFydCBjaGFydCwgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpCisgICAgICAgICAgIDogYmFzZShucyxub2RlKQorICAgICAgIHsKKyAgICAgICAgICAgX25zID0gbnM7CisgICAgICAgICAgIF9jaGFydD1jaGFydDsKKyAgICAgICAgICAgX25vZGU9bm9kZTsKKyAgICAgICAgICAgX2lzUGl2b3QgPSBpc1Bpdm90OworICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAidmlldzNEIiwgInBsb3RBcmVhIiwgImJhckRpciIsICJncm91cGluZyIsICJzY2F0dGVyU3R5bGUiLCAidmFyeUNvbG9ycyIsICJzZXIiLCAiZXhwbG9zaW9uIiwgImRMYmxzIiwgImZpcnN0U2xpY2VBbmciLCAiaG9sZVNpemUiLCAic2hhcGUiLCAibGVnZW5kIiwgImF4SWQiIH07CisgICAgICAgICAgIGZvcmVhY2goWG1sTm9kZSBuIGluIG5vZGUuU2VsZWN0Tm9kZXMoImM6c2VyIixucykpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZSBzOworICAgICAgICAgICAgICAgaWYgKGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gInNjYXR0ZXJDaGFydCIpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcyA9IG5ldyBFeGNlbFNjYXR0ZXJDaGFydFNlcmllKHRoaXMsIG5zLCBuLCBpc1Bpdm90KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gImxpbmVDaGFydCIpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcyA9IG5ldyBFeGNlbExpbmVDaGFydFNlcmllKHRoaXMsIG5zLCBuLCBpc1Bpdm90KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gInBpZUNoYXJ0IiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnQuQ2hhcnROb2RlLkxvY2FsTmFtZSA9PSAib2ZQaWVDaGFydCIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gInBpZTNEQ2hhcnQiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFydC5DaGFydE5vZGUuTG9jYWxOYW1lID09ICJkb3VnaG51dENoYXJ0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHMgPSBuZXcgRXhjZWxQaWVDaGFydFNlcmllKHRoaXMsIG5zLCBuLCBpc1Bpdm90KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZSh0aGlzLCBucywgbiwgaXNQaXZvdCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBfbGlzdC5BZGQocyk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICB7CisgICAgICAgICAgIHJldHVybiAoX2xpc3QuR2V0RW51bWVyYXRvcigpKTsKKyAgICAgICB9CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBSZXR1cm5zIHRoZSBzZXJpZSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBvc2l0aW9uSUQiPlRoZSBwb3NpdGlvbiBvZiB0aGUgc2VyaWVzLjwvcGFyYW0+CisgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllIHRoaXNbaW50IFBvc2l0aW9uSURdCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIChfbGlzdFtQb3NpdGlvbklEXSk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIERlbGV0ZSB0aGUgY2hhcnQgYXQgdGhlIHNwZWNpZmljIHBvc2l0aW9uCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBvc2l0aW9uSUQiPlplcm8gYmFzZWQ8L3BhcmFtPgorICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZShpbnQgUG9zaXRpb25JRCkKKyAgICAgICB7CisgICAgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZSBzZXIgPSBfbGlzdFtQb3NpdGlvbklEXTsKKyAgICAgICAgICAgc2VyLlRvcE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChzZXIuVG9wTm9kZSk7CisgICAgICAgICAgIF9saXN0LlJlbW92ZUF0KFBvc2l0aW9uSUQpOworICAgICAgIH0KKyAgICAgICAjZW5kcmVnaW9uCisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgY2hhcnQgb2JqZWN0CisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgRXhjZWxDaGFydCBDaGFydAorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnQ7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgI3JlZ2lvbiAiQWRkIFNlcmllcyIKKworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gQWRkIGEgbmV3IHNlcmllIHRvIHRoZSBjaGFydC4gRG8gbm90IGFwcGx5IHRvIHBpdm90Y2hhcnRzLgorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTZXJpZSI+VGhlIFktQXhpcyByYW5nZTwvcGFyYW0+CisgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJYU2VyaWUiPlRoZSBYLUF4aXMgcmFuZ2U8L3BhcmFtPgorICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgcHVibGljIHZpcnR1YWwgRXhjZWxDaGFydFNlcmllIEFkZChFeGNlbFJhbmdlQmFzZSBTZXJpZSwgRXhjZWxSYW5nZUJhc2UgWFNlcmllKQorICAgICAgIHsKKyAgICAgICAgICAgaWYgKF9jaGFydC5QaXZvdFRhYmxlU291cmNlICE9IG51bGwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgYWRkIGEgc2VyaWUgdG8gYSBwaXZvdGNoYXJ0IikpOworICAgICAgICAgICB9CisgICAgICAgICAgIHJldHVybiBBZGRTZXJpZXMoU2VyaWUuRnVsbEFkZHJlc3NBYnNvbHV0ZSwgWFNlcmllLkZ1bGxBZGRyZXNzQWJzb2x1dGUsIiIpOworICAgICAgIH0KKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEFkZCBhIG5ldyBzZXJpZSB0byB0aGUgY2hhcnQuRG8gbm90IGFwcGx5IHRvIHBpdm90Y2hhcnRzLgorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTZXJpZUFkZHJlc3MiPlRoZSBZLUF4aXMgcmFuZ2U8L3BhcmFtPgorICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iWFNlcmllQWRkcmVzcyI+VGhlIFgtQXhpcyByYW5nZTwvcGFyYW0+CisgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICBwdWJsaWMgdmlydHVhbCBFeGNlbENoYXJ0U2VyaWUgQWRkKHN0cmluZyBTZXJpZUFkZHJlc3MsIHN0cmluZyBYU2VyaWVBZGRyZXNzKQorICAgICAgIHsKKyAgICAgICAgICAgaWYgKF9jaGFydC5QaXZvdFRhYmxlU291cmNlICE9IG51bGwpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgYWRkIGEgc2VyaWUgdG8gYSBwaXZvdGNoYXJ0IikpOworICAgICAgICAgICB9CisgICAgICAgICAgIHJldHVybiBBZGRTZXJpZXMoU2VyaWVBZGRyZXNzLCBYU2VyaWVBZGRyZXNzLCAiIik7CisgICAgICAgfQorICAgICAgIGludGVybmFsIHByb3RlY3RlZCBFeGNlbENoYXJ0U2VyaWUgQWRkU2VyaWVzKHN0cmluZyBTZXJpZXNBZGRyZXNzLCBzdHJpbmcgWFNlcmllc0FkZHJlc3MsIHN0cmluZyBidWJibGVTaXplQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgICAgWG1sRWxlbWVudCBzZXIgPSBfbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInNlciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgICAgICBYbWxOb2RlTGlzdCBub2RlID0gX25vZGUuU2VsZWN0Tm9kZXMoImM6c2VyIiwgX25zKTsKKyAgICAgICAgICAgICAgIGlmIChub2RlLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBfbm9kZS5JbnNlcnRBZnRlcihzZXIsIG5vZGVbbm9kZS5Db3VudC0xXSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgSW5zZXJBZnRlcihfbm9kZSwgImM6dmFyeUNvbG9ycyxjOmdyb3VwaW5nLGM6YmFyRGlyLGM6c2NhdHRlclN0eWxlIiwgc2VyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpbnQgaWR4ID0gRmluZEluZGV4KCk7CisgICAgICAgICAgICAgICBzZXIuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8YzppZHggdmFsPVwiezF9XCIgLz48YzpvcmRlciB2YWw9XCJ7MX1cIiAvPjxjOnR4PjxjOnN0clJlZj48YzpmPjwvYzpmPjxjOnN0ckNhY2hlPjxjOnB0Q291bnQgdmFsPVwiMVwiIC8+PC9jOnN0ckNhY2hlPjwvYzpzdHJSZWY+PC9jOnR4Pns1fXswfXsyfXszfXs0fSIsIEFkZEV4cGxvc2lvbihDaGFydC5DaGFydFR5cGUpLCBpZHgsIEFkZFNjYXR0ZXJQb2ludChDaGFydC5DaGFydFR5cGUpLCBBZGRBeGlzTm9kZXMoQ2hhcnQuQ2hhcnRUeXBlKSwgQWRkU21vb3RoKENoYXJ0LkNoYXJ0VHlwZSksIEFkZE1hcmtlcihDaGFydC5DaGFydFR5cGUpKTsKKyAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZSBzZXJpZTsKKyAgICAgICAgICAgICAgIHN3aXRjaCAoQ2hhcnQuQ2hhcnRUeXBlKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CdWJibGU6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0OgorICAgICAgICAgICAgICAgICAgICAgICBzZXJpZSA9IG5ldyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWUodGhpcywgTmFtZVNwYWNlTWFuYWdlciwgc2VyLCBfaXNQaXZvdCkKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgQnViYmxlM0Q9Q2hhcnQuQ2hhcnRUeXBlPT1lQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWVzID0gU2VyaWVzQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTZXJpZXMgPSBYU2VyaWVzQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1YmJsZVNpemUgPSBidWJibGVTaXplQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlcjoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXM6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGg6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VyczoKKyAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlJhZGFyOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5SYWRhckZpbGxlZDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzOgorICAgICAgICAgICAgICAgICAgICAgICBzZXJpZSA9IG5ldyBFeGNlbFJhZGFyQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2U6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3OgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZToKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZVdpcmVmcmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxTdXJmYWNlQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZToKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllM0Q6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDNEOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVPZlBpZToKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuRG91Z2hudXQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhck9mUGllOgorICAgICAgICAgICAgICAgICAgICAgICBzZXJpZSA9IG5ldyBFeGNlbFBpZUNoYXJ0U2VyaWUodGhpcywgTmFtZVNwYWNlTWFuYWdlciwgc2VyLCBfaXNQaXZvdCk7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2VyczoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxMaW5lQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDEwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFeGNlbExpbmVDaGFydFNlcmllKXNlcmllKS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuU3F1YXJlOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICgoRXhjZWxMaW5lQ2hhcnRTZXJpZSlzZXJpZSkuU21vb3RoID0gKChFeGNlbExpbmVDaGFydClDaGFydCkuU21vb3RoOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0Q6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0Q6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2w6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDoKKyAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDA6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2w6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xDbHVzdGVyZWQ6CisgICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkOgorICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDEwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxCYXJDaGFydFNlcmllKHRoaXMsIE5hbWVTcGFjZU1hbmFnZXIsIHNlciwgX2lzUGl2b3QpOworICAgICAgICAgICAgICAgICAgICAgICAoKEV4Y2VsQmFyQ2hhcnRTZXJpZSlzZXJpZSkuSW52ZXJ0SWZOZWdhdGl2ZT1mYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxDaGFydFNlcmllKHRoaXMsIE5hbWVTcGFjZU1hbmFnZXIsIHNlciwgX2lzUGl2b3QpOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIHNlcmllLlNlcmllcyA9IFNlcmllc0FkZHJlc3M7CisgICAgICAgICAgICAgICBzZXJpZS5YU2VyaWVzID0gWFNlcmllc0FkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIF9saXN0LkFkZChzZXJpZSk7CisgICAgICAgICAgICAgICByZXR1cm4gc2VyaWU7CisgICAgICAgIH0KKyAgICAgICBib29sIF9pc1Bpdm90OworICAgICAgIGludGVybmFsIHZvaWQgQWRkUGl2b3RTZXJpZShFeGNlbFBpdm90VGFibGUgcGl2b3RUYWJsZVNvdXJjZSkKKyAgICAgICB7CisgICAgICAgICAgIHZhciByPXBpdm90VGFibGVTb3VyY2UuV29ya1NoZWV0LkNlbGxzW3Bpdm90VGFibGVTb3VyY2UuQWRkcmVzcy5BZGRyZXNzXTsKKyAgICAgICAgICAgX2lzUGl2b3QgPSB0cnVlOworICAgICAgICAgICBBZGRTZXJpZXMoci5PZmZzZXQoMCwgMSwgci5fdG9Sb3cgLSByLl9mcm9tUm93ICsgMSwgMSkuRnVsbEFkZHJlc3NBYnNvbHV0ZSwgci5PZmZzZXQoMCwgMCwgci5fdG9Sb3cgLSByLl9mcm9tUm93ICsgMSwgMSkuRnVsbEFkZHJlc3NBYnNvbHV0ZSwiIik7CisgICAgICAgfQorICAgICAgIHByaXZhdGUgaW50IEZpbmRJbmRleCgpCisgICAgICAgeyAgICAKKyAgICAgICAgICAgaW50IHJldCA9IDAsIG5ld0lEPTA7CisgICAgICAgICAgIGlmIChfY2hhcnQuUGxvdEFyZWEuQ2hhcnRUeXBlcy5Db3VudCA+IDEpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGFydCBpbiBfY2hhcnQuUGxvdEFyZWEuQ2hhcnRUeXBlcykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBpZiAobmV3SUQ+MCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsQ2hhcnRTZXJpZSBzZXJpZSBpbiBjaGFydC5TZXJpZXMpCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllLlNldElEKCgrK25ld0lEKS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnQgPT0gX2NoYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gX2xpc3QuQ291bnQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SUQ9cmV0OworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGNoYXJ0LlNlcmllcy5Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybiByZXQtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICAjZW5kcmVnaW9uCisgICAgICAgI3JlZ2lvbiAiWG1sIGluaXQgRnVuY3Rpb25zIgorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZE1hcmtlcihlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKKyAgICAgICB7CisgICAgICAgICAgIGlmIChjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lIHx8CisgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZCB8fAorICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZVN0YWNrZWQxMDAgfHwKKyAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8CisgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKKyAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzIHx8CisgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiPGM6bWFya2VyPjxjOnN5bWJvbCB2YWw9XCJub25lXCIgLz48L2M6bWFya2VyPiI7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkU2NhdHRlclBvaW50KGVDaGFydFR5cGUgY2hhcnRUeXBlKQorICAgICAgIHsKKyAgICAgICAgICAgaWYgKGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlcikKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8YzpzcFByPjxhOmxuIHc9XCIyODU3NVwiPjxhOm5vRmlsbCAvPjwvYTpsbj48L2M6c3BQcj4iOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEF4aXNOb2RlcyhlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKKyAgICAgICB7CisgICAgICAgICAgIGlmICggY2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyIHx8CisgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXMgfHwKKyAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VycyB8fAorICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCB8fAorICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycyB8fCAKKyAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUgfHwKKyAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8Yzp4VmFsIC8+PGM6eVZhbCAvPiI7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gIjxjOnZhbCAvPiI7CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICBwcml2YXRlIHN0cmluZyBBZGRFeHBsb3Npb24oZUNoYXJ0VHlwZSBjaGFydFR5cGUpCisgICAgICAgeworICAgICAgICAgICBpZiAoY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRCB8fAorICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZCB8fAorICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8YzpleHBsb3Npb24gdmFsPVwiMjVcIiAvPiI7IC8vRGVmYXVsdCAyNTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBwcml2YXRlIHN0cmluZyBBZGRTbW9vdGgoZUNoYXJ0VHlwZSBjaGFydFR5cGUpCisgICAgICAgeworICAgICAgICAgICBpZiAoY2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoIHx8CisgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycykKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICI8YzpzbW9vdGggdmFsPVwiMVwiIC8+IjsgLy9EZWZhdWx0IDI1OworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFN1cmZhY2UuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U3VyZmFjZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjcyOTBiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFN1cmZhY2UuY3MKQEAgLTAsMCArMSwxMDIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMi0zMAorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ2hhcnQgc3VyZmFjZSBzZXR0aW5ncworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQ2hhcnRTdXJmYWNlIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0U3VyZmFjZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUpCisgICAgICAgICAgIDogYmFzZShucyxub2RlKQorICAgICAgIHsKKyAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInRoaWNrbmVzcyIsICJzcFByIiwgInBpY3R1cmVPcHRpb25zIiB9OworICAgICAgIH0KKyAgICAgICAjcmVnaW9uICJQdWJsaWMgcHJvcGVydGllcyIKKyAgICAgICAgY29uc3Qgc3RyaW5nIFRISUNLTkVTU19QQVRIID0gImM6dGhpY2tuZXNzL0B2YWwiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gU2hvdyB0aGUgdmFsdWVzIAorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgVGhpY2tuZXNzCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoVEhJQ0tORVNTX1BBVEgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZih2YWx1ZSA8IDAgJiYgdmFsdWUgPiA5KQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJUaGlja25lc3Mgb3V0IG9mIHJhbmdlLiAoMC05KSIpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEhJQ0tORVNTX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gQWNjZXNzIGZpbGwgcHJvcGVydGllcworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0ZpbGwgRmlsbAorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIF9maWxsID0gbmV3IEV4Y2VsRHJhd2luZ0ZpbGwoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQciIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIEV4Y2VsRHJhd2luZ0JvcmRlciBfYm9yZGVyID0gbnVsbDsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIEFjY2VzcyBib3JkZXIgcHJvcGVydGllcworICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoX2JvcmRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIvYTpsbiIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRUaXRsZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRUaXRsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE3OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFRpdGxlLmNzCkBAIC0wLDAgKzEsMjM2IEBACivvu78vKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgdGl0bGUgb2YgYSBjaGFydAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQ2hhcnRUaXRsZSA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFRpdGxlKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSBub2RlKSA6CisgICAgICAgICAgICBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGUgdG9wTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0aXRsZSIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKHRvcE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b3BOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoImMiLCAidGl0bGUiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOworICAgICAgICAgICAgICAgIG5vZGUuSW5zZXJ0QmVmb3JlKHRvcE5vZGUsIG5vZGUuQ2hpbGROb2Rlc1swXSk7CisgICAgICAgICAgICAgICAgdG9wTm9kZS5Jbm5lclhtbCA9ICI8Yzp0eD48YzpyaWNoPjxhOmJvZHlQciAvPjxhOmxzdFN0eWxlIC8+PGE6cD48YTpwUHI+PGE6ZGVmUlByIHN6PVwiMTgwMFwiIGI9XCIwXCIgLz48L2E6cFByPjxhOnI+PGE6dCAvPjwvYTpyPjwvYTpwPjwvYzpyaWNoPjwvYzp0eD48YzpsYXlvdXQgLz48YzpvdmVybGF5IHZhbD1cIjBcIiAvPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJ0eCIsImJvZHlQciIsICJsc3RTdHlsZSIsICJsYXlvdXQiLCAib3ZlcmxheSIgfTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgdGl0bGVQYXRoID0gImM6dHgvYzpyaWNoL2E6cC9hOnIvYTp0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRleHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmV0dXJuIEdldFhtbE5vZGUodGl0bGVQYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmljaFRleHQuVGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vU2V0WG1sTm9kZSh0aXRsZVBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBSaWNoVGV4dC5UZXh0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgYm9yZGVyIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIvYTpsbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGZpbGwgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL0V4Y2VsVGV4dEZvbnQgX2ZvbnQgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgZm9udCBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFRleHRGb250IEZvbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9pZiAoX2ZvbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBfZm9udCA9IG5ldyBFeGNlbFRleHRGb250KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnR4L2M6cmljaC9hOnAvYTpyL2E6clByIiwgbmV3IHN0cmluZ1tdIHsgInJQciIsICJzb2xpZEZpbGwiLCAidUZpbGwiLCAibGF0aW4iLCAiY3MiLCAiciIsICJyUHIiLCAidCIgfSk7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgLy9yZXR1cm4gX2ZvbnQ7CisgICAgICAgICAgICAgICAgaWYgKF9yaWNoVGV4dD09bnVsbCB8fCBfcmljaFRleHQuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJpY2hUZXh0LkFkZCgiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfcmljaFRleHRbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nW10gcGFyYWdyYXBoTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInBQciIsICJkZWZSUHIiLCAic29saWRGaWxsIiwgInVGaWxsIiwgImxhdGluIiwgImNzIiwgInIiLCAiclByIiwgInQiIH07CisgICAgICAgIEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbiBfcmljaFRleHQgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSaWNodGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQYXJhZ3JhcGhDb2xsZWN0aW9uIFJpY2hUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcmljaFRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9yaWNoVGV4dCA9IG5ldyBFeGNlbFBhcmFncmFwaENvbGxlY3Rpb24oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6dHgvYzpyaWNoL2E6cCIsIHBhcmFncmFwaE5vZGVPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfcmljaFRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvdyB3aXRob3V0IG92ZXJsYXBpbmcgdGhlIGNoYXJ0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBPdmVybGF5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiYzpvdmVybGF5L0B2YWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJjOm92ZXJsYXkvQHZhbCIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGNlbnRlcmluZyBvZiB0aGUgdGV4dCBib3guIAorICAgICAgICAvLy8gVGhlIHdheSBpdCB3b3JrcyBmdW5kYW1lbnRhbGx5IGlzIHRvIGRldGVybWluZSB0aGUgc21hbGxlc3QgcG9zc2libGUgImJvdW5kcyBib3giIGZvciB0aGUgdGV4dCBhbmQgdGhlbiB0byBjZW50ZXIgdGhhdCAiYm91bmRzIGJveCIgYWNjb3JkaW5nbHkuIAorICAgICAgICAvLy8gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBwYXJhZ3JhcGggYWxpZ25tZW50LCB3aGljaCBhbGlnbnMgdGhlIHRleHQgd2l0aGluIHRoZSAiYm91bmRzIGJveCIgZm9yIHRoZSB0ZXh0LiAKKyAgICAgICAgLy8vIFRoaXMgZmxhZyBpcyBjb21wYXRpYmxlIHdpdGggYWxsIG9mIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgYW5jaG9yaW5nLiAKKyAgICAgICAgLy8vIElmIHRoaXMgYXR0cmlidXRlIGlzIG9taXR0ZWQsIHRoZW4gYSB2YWx1ZSBvZiAwIG9yIGZhbHNlIGlzIGltcGxpZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFuY2hvckN0cgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woImM6dHgvYzpyaWNoL2E6Ym9keVByL0BhbmNob3JDdHIiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiYzp0eC9jOnJpY2gvYTpib2R5UHIvQGFuY2hvckN0ciIsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGVUZXh0QW5jaG9yaW5nVHlwZSBBbmNob3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRHJhd2luZy5HZXRUZXh0QWNob3JpbmdFbnVtKEdldFhtbE5vZGVTdHJpbmcoImM6dHgvYzpyaWNoL2E6Ym9keVByL0BhbmNob3IiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJjOnR4L2M6cmljaC9hOmJvZHlQci9AYW5jaG9yQ3RyIiwgRXhjZWxEcmF3aW5nLkdldFRleHRBY2hvcmluZ1RleHQodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVGV4dFZlcnRpY2FsUGF0aCA9ICJ4ZHI6c3AveGRyOnR4Qm9keS9hOmJvZHlQci9AdmVydCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZlcnRpY2FsIHRleHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVUZXh0VmVydGljYWxUeXBlIFRleHRWZXJ0aWNhbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEcmF3aW5nLkdldFRleHRWZXJ0aWNhbEVudW0oR2V0WG1sTm9kZVN0cmluZygiYzp0eC9jOnJpY2gvYTpib2R5UHIvQHZlcnQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJjOnR4L2M6cmljaC9hOmJvZHlQci9AdmVydCIsIEV4Y2VsRHJhd2luZy5HZXRUZXh0VmVydGljYWxUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUm90YXRpb24gaW4gZGVncmVlcyAoMC0zNjApCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgUm90YXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGk9R2V0WG1sTm9kZUludCgiYzp0eC9jOnJpY2gvYTpib2R5UHIvQHJvdCIpOworICAgICAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAzNjAgLSAoaSAvIDYwMDAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpIC8gNjAwMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2OworICAgICAgICAgICAgICAgIGlmKHZhbHVlIDwwIHx8IHZhbHVlID4gMzYwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUm90YXRpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDM2MCIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAxODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ID0gKGludCkoKHZhbHVlIC0gMzYwKSAqIDYwMDAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IChpbnQpKHZhbHVlICogNjAwMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJjOnR4L2M6cmljaC9hOmJvZHlQci9Acm90Iiwgdi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRUcmVuZGxpbmUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0VHJlbmRsaW5lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjhkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0VHJlbmRsaW5lLmNzCkBAIC0wLDAgKzEsMjk4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDExLTA1LTI1CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgdHJlbmRsaW5lcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0VHJlbmRsaW5lQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPEV4Y2VsQ2hhcnRUcmVuZGxpbmU+CisgICAgeworICAgICAgICBMaXN0PEV4Y2VsQ2hhcnRUcmVuZGxpbmU+IF9saXN0ID0gbmV3IExpc3Q8RXhjZWxDaGFydFRyZW5kbGluZT4oKTsKKyAgICAgICAgRXhjZWxDaGFydFNlcmllIF9zZXJpZTsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFRyZW5kbGluZUNvbGxlY3Rpb24oRXhjZWxDaGFydFNlcmllIHNlcmllKQorICAgICAgICB7CisgICAgICAgICAgICBfc2VyaWUgPSBzZXJpZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBfc2VyaWUuVG9wTm9kZS5TZWxlY3ROb2RlcygiYzp0cmVuZGxpbmUiLCBfc2VyaWUuTmFtZVNwYWNlTWFuYWdlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2xpc3QuQWRkKG5ldyBFeGNlbENoYXJ0VHJlbmRsaW5lKF9zZXJpZS5OYW1lU3BhY2VNYW5hZ2VyLCBub2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgbmV3IHRyZW5kbGluZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlR5cGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdHJlbmRsaW5lPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFRyZW5kbGluZSBBZGQoZVRyZW5kTGluZSBUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcmllLl9jaGFydFNlcmllcy5fY2hhcnQuSXNUeXBlM0QoKSB8fAorICAgICAgICAgICAgICAgIF9zZXJpZS5fY2hhcnRTZXJpZXMuX2NoYXJ0LklzVHlwZVBlcmNlbnRTdGFja2VkKCkgfHwKKyAgICAgICAgICAgICAgICBfc2VyaWUuX2NoYXJ0U2VyaWVzLl9jaGFydC5Jc1R5cGVTdGFja2VkKCkgfHwKKyAgICAgICAgICAgICAgICBfc2VyaWUuX2NoYXJ0U2VyaWVzLl9jaGFydC5Jc1R5cGVQaWVEb3VnaG51dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVHJlbmRsaW5lcyBkb24ndCBhcHBseSB0byAzZC1jaGFydHMsIHN0YWNrZWQgY2hhcnRzLCBwaWUgY2hhcnRzIG9yIGRvdWdobnV0IGNoYXJ0cyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4Y2VsQ2hhcnRUcmVuZGxpbmUgdGw7CisgICAgICAgICAgICBYbWxOb2RlIGluc2VydEFmdGVyOworICAgICAgICAgICAgaWYgKF9saXN0LkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnNlcnRBZnRlciA9IF9saXN0W19saXN0LkNvdW50IC0gMV0uVG9wTm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnNlcnRBZnRlciA9IF9zZXJpZS5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6bWFya2VyIiwgX3NlcmllLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBZnRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBfc2VyaWUuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnR4IiwgX3NlcmllLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QWZ0ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBfc2VyaWUuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOm9yZGVyIiwgX3NlcmllLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG5vZGU9X3NlcmllLlRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJjIiwidHJlbmRsaW5lIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKKyAgICAgICAgICAgIF9zZXJpZS5Ub3BOb2RlLkluc2VydEFmdGVyKG5vZGUsIGluc2VydEFmdGVyKTsKKworICAgICAgICAgICAgdGwgPSBuZXcgRXhjZWxDaGFydFRyZW5kbGluZShfc2VyaWUuTmFtZVNwYWNlTWFuYWdlciwgbm9kZSk7CisgICAgICAgICAgICB0bC5UeXBlID0gVHlwZTsKKyAgICAgICAgICAgIHJldHVybiB0bDsKKyAgICAgICAgfQorICAgICAgICBJRW51bWVyYXRvcjxFeGNlbENoYXJ0VHJlbmRsaW5lPiBJRW51bWVyYWJsZTxFeGNlbENoYXJ0VHJlbmRsaW5lPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHRyZW5kbGluZSBvYmplY3QKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0VHJlbmRsaW5lIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0VHJlbmRsaW5lKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsdG9wTm9kZSkKKworICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAibmFtZSIsICJ0cmVuZGxpbmVUeXBlIiwib3JkZXIiLCJwZXJpb2QiLCAiZm9yd2FyZCIsImJhY2t3YXJkIiwiaW50ZXJjZXB0IiwgImRpc3BSU3FyIiwgImRpc3BFcSIsICJ0cmVuZGxpbmVMYmwiIH07CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFRSRU5ETElORVBBVEggPSAiYzp0cmVuZGxpbmVUeXBlL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUeXBlIG9mIFRyZW5kbGluZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZVRyZW5kTGluZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN3aXRjaCAoR2V0WG1sTm9kZVN0cmluZyhUUkVORExJTkVQQVRIKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGNhc2UgImV4cCI6CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVHJlbmRMaW5lLkV4cG9uZW50aWFsOworICAgICAgICAgICAgICAgICAgIGNhc2UgImxvZyI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRyZW5kTGluZS5Mb2dhcml0aG1pYzsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJwb2x5IjoKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUcmVuZExpbmUuUG9seW5vbWlhbDsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJtb3ZpbmdhdmciOgorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRyZW5kTGluZS5Nb3ZpbmdBdmdlcmFnZTsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJwb3dlciI6CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVHJlbmRMaW5lLlBvd2VyOworICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVHJlbmRMaW5lLkxpbmVhcjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuRXhwb25lbnRpYWw6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRSRU5ETElORVBBVEgsICJleHAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuTG9nYXJpdGhtaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRSRU5ETElORVBBVEgsICJsb2ciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuUG9seW5vbWlhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVFJFTkRMSU5FUEFUSCwgInBvbHkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuTW92aW5nQXZnZXJhZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRSRU5ETElORVBBVEgsICJtb3ZpbmdBdmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlVHJlbmRMaW5lLlBvd2VyOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUUkVORExJTkVQQVRILCAicG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVFJFTkRMSU5FUEFUSCwgImxpbmVhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIE5BTUVQQVRIID0gImM6bmFtZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5hbWUgaW4gdGhlIGxlZ2VuZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoTkFNRVBBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhOQU1FUEFUSCwgdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBPUkRFUlBBVEggPSAiYzpvcmRlci9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gT3JkZXIgZm9yIHBvbHlub21pbmFsIHRyZW5kbGluZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgT3JkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKE9SREVSUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVHlwZSA9PSBlVHJlbmRMaW5lLk1vdmluZ0F2Z2VyYWdlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHBlcmlvZCBmb3IgdHJlbmRsaW5lIHR5cGUgTW92aW5nQXZnZXJhZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoUEVSSU9EUEFUSCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhPUkRFUlBBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgUEVSSU9EUEFUSCA9ICJjOnBlcmlvZC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGVyaW9kIGZvciBtb250aGx5IGF2ZXJhZ2UgdHJlbmRsaW5lcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZGVjaW1hbCBQZXJpb2QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKFBFUklPRFBBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFR5cGUgPT0gZVRyZW5kTGluZS5Qb2x5bm9taWFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHBlcmlvZCBmb3IgdHJlbmRsaW5lIHR5cGUgUG9seW5vbWlhbCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRGVsZXRlQWxsTm9kZShPUkRFUlBBVEgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoUEVSSU9EUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBGT1JXQVJEUEFUSCA9ICJjOmZvcndhcmQvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvcmNhc3QgZm9yd2FyZCBwZXJpb2RzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkZWNpbWFsIEZvcndhcmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKEZPUldBUkRQQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRk9SV0FSRFBBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgQkFDS1dBUkRQQVRIID0gImM6YmFja3dhcmQvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvcmNhc3QgYmFja3dhcmRzIHBlcmlvZHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgQmFja3dhcmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKEJBQ0tXQVJEUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEJBQ0tXQVJEUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBJTlRFUkNFUFRQQVRIID0gImM6aW50ZXJjZXB0L0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZ5IHRoZSBwb2ludCB3aGVyZSB0aGUgdHJlbmRsaW5lIGNyb3NzZXMgdGhlIHZlcnRpY2FsIGF4aXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgSW50ZXJjZXB0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRGVjaW1hbChJTlRFUkNFUFRQQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoSU5URVJDRVBUUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBESVNQTEFZUlNRVUFSRURWQUxVRVBBVEggPSAiYzpkaXNwUlNxci9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGlzcGxheSB0aGUgUi1zcXVhcmVkIHZhbHVlIGZvciBhIHRyZW5kbGluZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBEaXNwbGF5UlNxdWFyZWRWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woRElTUExBWVJTUVVBUkVEVkFMVUVQQVRILCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKERJU1BMQVlSU1FVQVJFRFZBTFVFUEFUSCwgdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBESVNQTEFZRVFVQVRJT05QQVRIID0gImM6ZGlzcEVxL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEaXNwbGF5IHRoZSB0cmVuZGxpbmUgZXF1YXRpb24gb24gdGhlIGNoYXJ0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERpc3BsYXlFcXVhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woRElTUExBWUVRVUFUSU9OUEFUSCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChESVNQTEFZRVFVQVRJT05QQVRILCB2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbERvdWdobnV0Q2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbERvdWdobnV0Q2hhcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1ZGYyZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsRG91Z2hudXRDaGFydC5jcwpAQCAtMCwwICsxLDEyNyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBkb3VnaG51dCBjaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEb3VnaG51dENoYXJ0IDogRXhjZWxQaWVDaGFydAorICAgIHsKKyAgICAgICAgLy9pbnRlcm5hbCBFeGNlbERvdWdobnV0Q2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKSA6CisgICAgICAgIC8vICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTZXRQYXRocygpOworICAgICAgICAvL30KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEb3VnaG51dENoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBib29sIGlzUGl2b3QpIDoKKyAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIGlzUGl2b3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0UGF0aHMoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbERvdWdobnV0Q2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TZXRQYXRocygpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsRG91Z2hudXRDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgorICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TZXRQYXRocygpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEb3VnaG51dENoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0UGF0aHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vcHJpdmF0ZSB2b2lkIFNldFBhdGhzKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHN0cmluZyBjaGFydE5vZGVUZXh0ID0gR2V0Q2hhcnROb2RlVGV4dCgpOworICAgICAgICAvLyAgICBfZmlyc3RTbGljZUFuZ1BhdGggPSBzdHJpbmcuRm9ybWF0KF9maXJzdFNsaWNlQW5nUGF0aCwgY2hhcnROb2RlVGV4dCk7CisgICAgICAgIC8vICAgIF9ob2xlU2l6ZVBhdGggPSBzdHJpbmcuRm9ybWF0KF9ob2xlU2l6ZVBhdGgsIGNoYXJ0Tm9kZVRleHQpOworICAgICAgICAvL30KKyAgICAgICAgLy9zdHJpbmcgX2ZpcnN0U2xpY2VBbmdQYXRoID0gImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEvezB9L2M6Zmlyc3RTbGljZUFuZy9AdmFsIjsKKyAgICAgICAgc3RyaW5nIF9maXJzdFNsaWNlQW5nUGF0aCA9ICJjOmZpcnN0U2xpY2VBbmcvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuZ2xlIG9mIHRoZSBmaXJzdCBzbGl6ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZGVjaW1hbCBGaXJzdFNsaWNlQW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlRGVjaW1hbChfZmlyc3RTbGljZUFuZ1BhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2ZpcnN0U2xpY2VBbmdQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9zdHJpbmcgX2hvbGVTaXplUGF0aCA9ICJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfS9jOmhvbGVTaXplL0B2YWwiOworICAgICAgICBzdHJpbmcgX2hvbGVTaXplUGF0aCA9ICJjOmhvbGVTaXplL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaXplIG9mIHRoZSBkb3VibnV0IGhvbGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgSG9sZVNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlRGVjaW1hbChfaG9sZVNpemVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9ob2xlU2l6ZVBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gImRvdWdobnV0Q2hhcnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKEV4Y2VsUGllQ2hhcnRTZXJpZSlTZXJpZXNbMF0pLkV4cGxvc2lvbiA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Eb3VnaG51dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmFzZS5HZXRDaGFydFR5cGUobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbExpbmVDaGFydC5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsTGluZUNoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWU5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbExpbmVDaGFydC5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gbGluZSBjaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxMaW5lQ2hhcnQgOiBFeGNlbENoYXJ0CisgICAgeworICAgICAgICAjcmVnaW9uICJDb25zdHJ1Y3RvcnMiCisgICAgICAgIGludGVybmFsIEV4Y2VsTGluZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxMaW5lQ2hhcnQgKEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbExpbmVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgRXhjZWxDaGFydCB0b3BDaGFydCwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpIDoKKyAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICBTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIHN0cmluZyBNQVJLRVJfUEFUSD0iYzptYXJrZXIvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBzZXJpZXMgaGFzIG1hcmtlcnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgTWFya2VyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woTUFSS0VSX1BBVEgsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlQm9vbChNQVJLRVJfUEFUSCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBTTU9PVEhfUEFUSCA9ICJjOnNtb290aC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIHNlcmllcyBoYXMgc21vb3RoIGxpbmVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNtb290aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVCb29sKFNNT09USF9QQVRILCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZUJvb2woU01PT1RIX1BBVEgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL3N0cmluZyBfY2hhcnRUb3BQYXRoID0gImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEvezB9IjsKKyAgICAgICAgRXhjZWxDaGFydERhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWNjZXNzIHRvIGRhdGFsYWJlbCBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0RGF0YUxhYmVsIERhdGFMYWJlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0RGF0YUxhYmVsKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0Tm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAgICBpZihuYW1lPT0ibGluZUNoYXJ0IikKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBpZihNYXJrZXIpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBpZihHcm91cGluZz09ZUdyb3VwaW5nLlN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmKEdyb3VwaW5nPT1lR3JvdXBpbmcuU3RhY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuTGluZVN0YWNrZWQ7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lPT0ibGluZTNEQ2hhcnQiKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkxpbmUzRDsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkdldENoYXJ0VHlwZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsTGluZUNoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbExpbmVDaGFydFNlcmllLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGNkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbExpbmVDaGFydFNlcmllLmNzCkBAIC0wLDAgKzEsMTEwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBzZXJpZSBmb3IgYSBsaW5lIGNoYXJ0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTGluZUNoYXJ0U2VyaWUgOiBFeGNlbENoYXJ0U2VyaWUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFydFNlcmllcyI+UGFyZW50IGNvbGxlY3Rpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj5OYW1lc3BhY2VtYW5hZ2VyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1Bpdm90Ij5JcyBwaXZvdGNoYXJ0PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxMaW5lQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgorICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgX0RhdGFMYWJlbCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERhdGFsYWJlbHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBEYXRhTGFiZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsKF9ucywgX25vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgbWFya2VyUGF0aCA9ICJjOm1hcmtlci9jOnN5bWJvbC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWFya2VyIHN5bWJvbCAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVNYXJrZXJTdHlsZSBNYXJrZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG1hcmtlciA9IEdldFhtbE5vZGVTdHJpbmcobWFya2VyUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTWFya2VyU3R5bGUuTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTWFya2VyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoZU1hcmtlclN0eWxlKSwgbWFya2VyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKG1hcmtlclBhdGgsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIHNtb290aFBhdGggPSAiYzpzbW9vdGgvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNtb3RoIGxpbmVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNtb290aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woc21vb3RoUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woc21vb3RoUGF0aCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxPZlBpZUNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxPZlBpZUNoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWJhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbE9mUGllQ2hhcnQuY3MKQEAgLTAsMCArMSwxMTYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIG9mcGllLWNoYXJ0IHNwZWNpZmljIHByb3BlcnRpZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbE9mUGllQ2hhcnQgOiBFeGNlbFBpZUNoYXJ0CisgICAgeworICAgICAgICAvL2ludGVybmFsIEV4Y2VsT2ZQaWVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUpIDoKKyAgICAgICAgLy8gICAgYmFzZShkcmF3aW5ncywgbm9kZSkKKyAgICAgICAgLy97CisKKyAgICAgICAgLy99CisgICAgICAgIGludGVybmFsIEV4Y2VsT2ZQaWVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgYm9vbCBpc1Bpdm90KSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCBpc1Bpdm90KQorICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbE9mUGllQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIEV4Y2VsT2ZQaWVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgorICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRUeXBlUHJvcGVydGllcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJPZlBpZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPZlBpZVR5cGUgPSBlUGllVHlwZS5CYXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2ZQaWVUeXBlID0gZVBpZVR5cGUuUGllOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIHBpZVR5cGVQYXRoID0gImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEvYzpvZlBpZUNoYXJ0L2M6b2ZQaWVUeXBlL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUeXBlLCBwaWUgb3IgYmFyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlUGllVHlwZSBPZlBpZVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKHBpZVR5cGVQYXRoKSA9PSAiYmFyIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQaWVUeXBlLkJhcjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVBpZVR5cGUuUGllOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5DcmVhdGVOb2RlKHBpZVR5cGVQYXRoLHRydWUpOworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKHBpZVR5cGVQYXRoLCB2YWx1ZSA9PSBlUGllVHlwZS5CYXIgPyAiYmFyIiA6ICJwaWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gIm9mUGllQ2hhcnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChPZlBpZVR5cGU9PWVQaWVUeXBlLkJhcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJhck9mUGllOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QaWVPZlBpZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmFzZS5HZXRDaGFydFR5cGUobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFBpZUNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxQaWVDaGFydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA5YzFmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxQaWVDaGFydC5jcwpAQCAtMCwwICsxLDEwNiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gcGllIGNoYXJ0IHNwZWNpZmljIHByb3BlcnRpZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpZUNoYXJ0IDogRXhjZWxDaGFydAorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaWVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgYm9vbCBpc1Bpdm90KSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCBpc1Bpdm90KQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaWVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgRXhjZWxDaGFydCB0b3BDaGFydCwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpIDoKKyAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpZUNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBFeGNlbENoYXJ0RGF0YUxhYmVsIF9EYXRhTGFiZWwgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBY2Nlc3MgdG8gZGF0YWxhYmVsIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnREYXRhTGFiZWwgRGF0YUxhYmVsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfRGF0YUxhYmVsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfRGF0YUxhYmVsID0gbmV3IEV4Y2VsQ2hhcnREYXRhTGFiZWwoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnROb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9EYXRhTGFiZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gInBpZUNoYXJ0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU2VyaWVzLkNvdW50ID4gMCAmJiAoKEV4Y2VsUGllQ2hhcnRTZXJpZSlTZXJpZXNbMF0pLkV4cGxvc2lvbj4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuUGllRXhwbG9kZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlBpZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuYW1lID09ICJwaWUzRENoYXJ0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU2VyaWVzLkNvdW50ID4gMCAmJiAoKEV4Y2VsUGllQ2hhcnRTZXJpZSlTZXJpZXNbMF0pLkV4cGxvc2lvbiA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDNEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QaWUzRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmFzZS5HZXRDaGFydFR5cGUobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFBpZUNoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFBpZUNoYXJ0U2VyaWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwZjk2MAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsUGllQ2hhcnRTZXJpZS5jcwpAQCAtMCwwICsxLDkyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgc2VyaWUgZm9yIGEgcGllIGNoYXJ0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGllQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbFBpZUNoYXJ0U2VyaWUoRXhjZWxDaGFydFNlcmllcyBjaGFydFNlcmllcywgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpIDoKKyAgICAgICAgICAgIGJhc2UoY2hhcnRTZXJpZXMsIG5zLCBub2RlLCBpc1Bpdm90KQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgZXhwbG9zaW9uUGF0aCA9ICJjOmV4cGxvc2lvbi9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRXhwbG9zaW9uIGZvciBQaWVjaGFydHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBFeHBsb3Npb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoZXhwbG9zaW9uUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiRXhwbG9zaW9uIHJhbmdlIGlzIDAtNDAwIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGV4cGxvc2lvblBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGF0YUxhYmVscworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIERhdGFMYWJlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwoX25zLCBfbm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyY2ZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFJhZGFyQ2hhcnQuY3MKQEAgLTAsMCArMSwxNTEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gbGluZSBjaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxSYWRhckNoYXJ0IDogRXhjZWxDaGFydAorICAgIHsKKyAgICAgICAgI3JlZ2lvbiAiQ29uc3RydWN0b3JzIgorICAgICAgICBpbnRlcm5hbCBFeGNlbFJhZGFyQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0LCBYbWxEb2N1bWVudCBjaGFydFhtbCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKKyAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRUeXBlUHJvcGVydGllcygpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxSYWRhckNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxSYWRhckNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgorICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICBwcml2YXRlIHZvaWQgU2V0VHlwZVByb3BlcnRpZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUmFkYXJGaWxsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmFkYXJTdHlsZSA9IGVSYWRhclN0eWxlLkZpbGxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgIChDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5SYWRhck1hcmtlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmFkYXJTdHlsZSA9ICBlUmFkYXJTdHlsZS5NYXJrZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmFkYXJTdHlsZSA9IGVSYWRhclN0eWxlLlN0YW5kYXJkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIFNUWUxFX1BBVEggPSAiYzpyYWRhclN0eWxlL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdHlwZSBvZiByYWRhcmNoYXJ0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlUmFkYXJTdHlsZSBSYWRhclN0eWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2PV9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKFNUWUxFX1BBVEgpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlUmFkYXJTdHlsZS5TdGFuZGFyZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlUmFkYXJTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlUmFkYXJTdHlsZSksIHYsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKFNUWUxFX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3N0cmluZyBTTU9PVEhfUEFUSCA9ICJjOnNtb290aC9AdmFsIjsKKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIElmIHRoZSBzZXJpZXMgaGFzIHNtb290aCBsaW5lcworICAgICAgICAvLy8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vcHVibGljIGJvb2wgU21vb3RoCisgICAgICAgIC8veworICAgICAgICAvLyAgICBnZXQKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgcmV0dXJuIF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlQm9vbChTTU9PVEhfUEFUSCwgZmFsc2UpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHNldAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZUJvb2woU01PT1RIX1BBVEgsIHZhbHVlKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30KKyAgICAgICAgLy9zdHJpbmcgX2NoYXJ0VG9wUGF0aCA9ICJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfSI7CisgICAgICAgIEV4Y2VsQ2hhcnREYXRhTGFiZWwgX0RhdGFMYWJlbCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFjY2VzcyB0byBkYXRhbGFiZWwgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDaGFydERhdGFMYWJlbCBEYXRhTGFiZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydERhdGFMYWJlbChOYW1lU3BhY2VNYW5hZ2VyLCBDaGFydE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJhZGFyU3R5bGUgPT0gZVJhZGFyU3R5bGUuRmlsbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUmFkYXJTdHlsZSA9PSBlUmFkYXJTdHlsZS5NYXJrZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlJhZGFyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFJhZGFyQ2hhcnRTZXJpZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUyMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0U2VyaWUuY3MKQEAgLTAsMCArMSwxMTYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHNlcmllIGZvciBhIHNjYXR0ZXIgY2hhcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxSYWRhckNoYXJ0U2VyaWUgOiBFeGNlbENoYXJ0U2VyaWUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFydFNlcmllcyI+UGFyZW50IGNvbGxlY3Rpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj5OYW1lc3BhY2VtYW5hZ2VyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1Bpdm90Ij5JcyBwaXZvdGNoYXJ0PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxSYWRhckNoYXJ0U2VyaWUoRXhjZWxDaGFydFNlcmllcyBjaGFydFNlcmllcywgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpIDoKKyAgICAgICAgICAgIGJhc2UoY2hhcnRTZXJpZXMsIG5zLCBub2RlLCBpc1Bpdm90KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUmFkYXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFya2VyID0gZU1hcmtlclN0eWxlLk5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIF9EYXRhTGFiZWwgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEYXRhbGFiZWwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBEYXRhTGFiZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsKF9ucywgX25vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgbWFya2VyUGF0aCA9ICJjOm1hcmtlci9jOnN5bWJvbC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWFya2VyIHN5bWJvbCAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVNYXJrZXJTdHlsZSBNYXJrZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG1hcmtlciA9IEdldFhtbE5vZGVTdHJpbmcobWFya2VyUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PSAiIiB8fCBtYXJrZXI9PSJub25lIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTWFya2VyU3R5bGUuTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTWFya2VyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoZU1hcmtlclN0eWxlKSwgbWFya2VyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhtYXJrZXJQYXRoLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBNQVJLRVJTSVpFX1BBVEggPSAiYzptYXJrZXIvYzpzaXplL0B2YWwiOworICAgICAgICBwdWJsaWMgaW50IE1hcmtlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoTUFSS0VSU0laRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDIgJiYgdmFsdWUgPiA3MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJNYXJrZXJTaXplIG91dCBvZiByYW5nZS4gUmFuZ2UgZnJvbSAyLTcyIGFsbG93ZWQuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKE1BUktFUlNJWkVfUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFNjYXR0ZXJDaGFydC5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU2NhdHRlckNoYXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2EzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFNjYXR0ZXJDaGFydC5jcwpAQCAtMCwwICsxLDE3MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gc2NhdHRlciBjaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU2NhdHRlckNoYXJ0IDogRXhjZWxDaGFydAorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxTY2F0dGVyQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIEV4Y2VsU2NhdHRlckNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIEV4Y2VsU2NhdHRlckNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6CisgICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAvKioqKiogU2NhdHRlclN0eWxlICoqKioqLworICAgICAgICAgICBpZihDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXIgfHwKKyAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXMgfHwKKyAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnMpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFNjYXR0ZXJTdHlsZSA9IGVTY2F0dGVyU3R5bGUuTGluZU1hcmtlcjsKKyAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgaWYgKAorICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKKyAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzKSAKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgU2NhdHRlclN0eWxlID0gZVNjYXR0ZXJTdHlsZS5TbW9vdGhNYXJrZXI7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uICJHcm91cGluZyBFbnVtIFRyYW5zbGF0aW9uIgorICAgICAgICBzdHJpbmcgX3NjYXR0ZXJUeXBlUGF0aCA9ICJjOnNjYXR0ZXJTdHlsZS9AdmFsIjsKKyAgICAgICAgcHJpdmF0ZSBlU2NhdHRlclN0eWxlIEdldFNjYXR0ZXJFbnVtKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAic21vb3RoTWFya2VyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTY2F0dGVyU3R5bGUuU21vb3RoTWFya2VyOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2NhdHRlclN0eWxlLkxpbmVNYXJrZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRTY2F0dGVyVGV4dChlU2NhdHRlclN0eWxlIHNoYXR0ZXJTdHlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChzaGF0dGVyU3R5bGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlU2NhdHRlclN0eWxlLlNtb290aE1hcmtlcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzbW9vdGhNYXJrZXIiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGluZU1hcmtlciI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgc2NhdHRlciBoYXMgTGluZU1hcmtlcnMgb3IgU21vb3RoTWFya2VycworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZVNjYXR0ZXJTdHlsZSBTY2F0dGVyU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFNjYXR0ZXJFbnVtKF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9zY2F0dGVyVHlwZVBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5DcmVhdGVOb2RlKF9zY2F0dGVyVHlwZVBhdGgsIHRydWUpOworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9zY2F0dGVyVHlwZVBhdGgsIEdldFNjYXR0ZXJUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIE1BUktFUl9QQVRIID0gImM6bWFya2VyL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgc2VyaWVzIGhhcyBtYXJrZXJzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIE1hcmtlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woTUFSS0VSX1BBVEgsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKE1BUktFUl9QQVRILCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSAic2NhdHRlckNoYXJ0IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU2NhdHRlclN0eWxlPT1lU2NhdHRlclN0eWxlLkxpbmVNYXJrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChFeGNlbFNjYXR0ZXJDaGFydFNlcmllKVNlcmllc1swXSkuTWFya2VyID09IGVNYXJrZXJTdHlsZS5Ob25lKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VyczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEV4aXN0Tm9kZSgiYzpzZXIvYzpzcFByL2E6bG4vbm9GaWxsIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuWFlTY2F0dGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFNjYXR0ZXJTdHlsZSA9PSBlU2NhdHRlclN0eWxlLlNtb290aE1hcmtlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKEV4Y2VsU2NhdHRlckNoYXJ0U2VyaWUpU2VyaWVzWzBdKS5NYXJrZXIgPT0gZU1hcmtlclN0eWxlLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VyczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiYXNlLkdldENoYXJ0VHlwZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU2NhdHRlckNoYXJ0U2VyaWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwNmMyYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU2NhdHRlckNoYXJ0U2VyaWUuY3MKQEAgLTAsMCArMSwxMzEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHNlcmllIGZvciBhIHNjYXR0ZXIgY2hhcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbFNjYXR0ZXJDaGFydFNlcmllKEV4Y2VsQ2hhcnRTZXJpZXMgY2hhcnRTZXJpZXMsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgYm9vbCBpc1Bpdm90KSA6CisgICAgICAgICAgICBiYXNlKGNoYXJ0U2VyaWVzLCBucywgbm9kZSwgaXNQaXZvdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8CisgICAgICAgICAgICAgICAgY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1hcmtlciA9IGVNYXJrZXJTdHlsZS5TcXVhcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKKyAgICAgICAgICAgICAgICBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU21vb3RoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8IGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzIHx8IGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlcikKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNtb290aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIF9EYXRhTGFiZWwgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEYXRhbGFiZWwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBEYXRhTGFiZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsKF9ucywgX25vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgc21vb3RoUGF0aCA9ICJjOnNtb290aC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU21vb3RoIGZvciBzY2F0dGVyY2hhcnRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgU21vb3RoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KHNtb290aFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhzbW9vdGhQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgbWFya2VyUGF0aCA9ICJjOm1hcmtlci9jOnN5bWJvbC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWFya2VyIHN5bWJvbCAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVNYXJrZXJTdHlsZSBNYXJrZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG1hcmtlciA9IEdldFhtbE5vZGVTdHJpbmcobWFya2VyUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTWFya2VyU3R5bGUuTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTWFya2VyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoZU1hcmtlclN0eWxlKSwgbWFya2VyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzIHx8CisgICAgICAgICAgICAgICAgICAgIF9jaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IHNldCBtYXJrZXIgc3R5bGUgZm9yIHRoaXMgY2hhcnR0eXBlLiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhtYXJrZXJQYXRoLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTdXJmYWNlQ2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFN1cmZhY2VDaGFydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODY4MTUwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTdXJmYWNlQ2hhcnQuY3MKQEAgLTAsMCArMSwxNTkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIFN1cmZhY2UgY2hhcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTdXJmYWNlQ2hhcnQgOiBFeGNlbENoYXJ0CisgICAgeworICAgICAgICAjcmVnaW9uICJDb25zdHJ1Y3RvcnMiCisgICAgICAgIGludGVybmFsIEV4Y2VsU3VyZmFjZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgorICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFN1cmZhY2VDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgorICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxTdXJmYWNlQ2hhcnQoRXhjZWxDaGFydCB0b3BDaGFydCwgWG1sTm9kZSBjaGFydE5vZGUpIDogCisgICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgSW5pdCgpCisgICAgICAgIHsKKyAJICAgICAgICBfZmxvb3I9bmV3IEV4Y2VsQ2hhcnRTdXJmYWNlKE5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydFhtbEhlbHBlci5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6Zmxvb3IiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICBfYmFja1dhbGwgPSBuZXcgRXhjZWxDaGFydFN1cmZhY2UoTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0WG1sSGVscGVyLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzpzaWRlV2FsbCIsIE5hbWVTcGFjZU1hbmFnZXIpKTsKKyAgICAgICAgICAgIF9zaWRlV2FsbCA9IG5ldyBFeGNlbENoYXJ0U3VyZmFjZShOYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnRYbWxIZWxwZXIuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOmJhY2tXYWxsIiwgTmFtZVNwYWNlTWFuYWdlcikpOworICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICBFeGNlbENoYXJ0U3VyZmFjZSBfZmxvb3I7CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U3VyZmFjZSBGbG9vcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2Zsb29yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ2hhcnRTdXJmYWNlIF9zaWRlV2FsbDsKKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTdXJmYWNlIFNpZGVXYWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc2lkZVdhbGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDaGFydFN1cmZhY2UgX2JhY2tXYWxsOworICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFN1cmZhY2UgQmFja1dhbGwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iYWNrV2FsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgV0lSRUZSQU1FX1BBVEggPSAiYzp3aXJlZnJhbWUvQHZhbCI7CisgICAgICAgIHB1YmxpYyBib29sIFdpcmVmcmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVCb29sKFdJUkVGUkFNRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlQm9vbChXSVJFRlJBTUVfUEFUSCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRUeXBlUHJvcGVydGllcygpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmKENoYXJ0VHlwZT09ZUNoYXJ0VHlwZS5TdXJmYWNlV2lyZWZyYW1lIHx8IENoYXJ0VHlwZT09ZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBXaXJlZnJhbWU9dHJ1ZTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgV2lyZWZyYW1lPWZhbHNlOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoQ2hhcnRUeXBlPT1lQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3IHx8IENoYXJ0VHlwZT09ZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgVmlldzNELlJvdFkgPSAwOworICAgICAgICAgICAgICAgICAgIFZpZXczRC5Sb3RYID0gOTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgVmlldzNELlJvdFkgPSAyMDsKKyAgICAgICAgICAgICAgICAgICBWaWV3M0QuUm90WCA9IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBWaWV3M0QuUmlnaHRBbmdsZUF4ZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBWaWV3M0QuUGVyc3BlY3RpdmUgPSAwOworICAgICAgICAgICAgICAgIEF4aXNbMV0uQ3Jvc3NCZXR3ZWVuID0gZUNyb3NzQmV0d2Vlbi5NaWRDYXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgZUNoYXJ0VHlwZSBHZXRDaGFydFR5cGUoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFdpcmVmcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAic3VyZmFjZUNoYXJ0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5TdXJmYWNlV2lyZWZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAic3VyZmFjZUNoYXJ0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5TdXJmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU3VyZmFjZUNoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFN1cmZhY2VDaGFydFNlcmllLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Zjg2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFN1cmZhY2VDaGFydFNlcmllLmNzCkBAIC0wLDAgKzEsNTcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHNlcmllIGZvciBhIHN1cmZhY2UgY2hhcnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTdXJmYWNlQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbFN1cmZhY2VDaGFydFNlcmllKEV4Y2VsQ2hhcnRTZXJpZXMgY2hhcnRTZXJpZXMsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgYm9vbCBpc1Bpdm90KSA6CisgICAgICAgICAgICBiYXNlKGNoYXJ0U2VyaWVzLCBucywgbm9kZSwgaXNQaXZvdCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nQmFzZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0Jhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjYzRhNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0Jhc2UuY3MKQEAgLTAsMCArMSw2NjIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDYtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGV4dCBhbmNob3JpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVUZXh0QW5jaG9yaW5nVHlwZQorICAgIHsKKyAgICAgICAgQm90dG9tLAorICAgICAgICBDZW50ZXIsCisgICAgICAgIERpc3RyaWJ1dGVkLAorICAgICAgICBKdXN0aWZ5LAorICAgICAgICBUb3AKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWZXJ0aWNhbCB0ZXh0IHR5cGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVUZXh0VmVydGljYWxUeXBlCisgICAgeworICAgICAgICBFYXN0QXNpYW5WZXJ0aWNhbCwKKyAgICAgICAgSG9yaXpvbnRhbCwKKyAgICAgICAgTW9uZ29saWFuVmVydGljYWwsCisgICAgICAgIFZlcnRpY2FsLAorICAgICAgICBWZXJ0aWNhbDI3MCwKKyAgICAgICAgV29yZEFydFZlcnRpY2FsLAorICAgICAgICBXb3JkQXJ0VmVydGljYWxSaWdodFRvTGVmdAorCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSG93IHRoZSBkcmF3aW5nIHdpbGwgYmUgcmVzaXplZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVFZGl0QXMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSBjdXJyZW50IHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIHNoYWxsCisgICAgICAgIC8vLyBiZSBtYWludGFpbmVkIHdpdGggcmVzcGVjdCB0byB0aGUgZGlzdGFuY2VzIGZyb20gdGhlCisgICAgICAgIC8vLyBhYnNvbHV0ZSBzdGFydCBwb2ludCBvZiB0aGUgd29ya3NoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBYnNvbHV0ZSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGN1cnJlbnQgZHJhd2luZyBzaGFsbCBtb3ZlIHdpdGggaXRzCisgICAgICAgIC8vL3JvdyBhbmQgY29sdW1uIChpLmUuIHRoZSBvYmplY3QgaXMgYW5jaG9yZWQgdG8gdGhlCisgICAgICAgIC8vLyBhY3R1YWwgZnJvbSByb3cgYW5kIGNvbHVtbiksIGJ1dCB0aGF0IHRoZSBzaXplIHNoYWxsCisgICAgICAgIC8vL3JlbWFpbiBhYnNvbHV0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgT25lQ2VsbCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGN1cnJlbnQgZHJhd2luZyBzaGFsbCBtb3ZlIGFuZAorICAgICAgICAvLy8gcmVzaXplIHRvIG1haW50YWluIGl0cyByb3cgYW5kIGNvbHVtbiBhbmNob3JzIChpLmUuIHRoZQorICAgICAgICAvLy8gb2JqZWN0IGlzIGFuY2hvcmVkIHRvIHRoZSBhY3R1YWwgZnJvbSBhbmQgdG8gcm93IGFuZCBjb2x1bW4pLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUd29DZWxsCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgdHdvYW5jaG9yZWQgZHJhd2luZ3MuIAorICAgIC8vLyBEcmF3aW5ncyBhcmUgQ2hhcnRzLCBzaGFwZXMgYW5kIFBpY3R1cmVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRHJhd2luZyA6IFhtbEhlbHBlciwgSURpc3Bvc2FibGUgCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3NpdGlvbiBvZiB0aGUgYSBkcmF3aW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgRXhjZWxQb3NpdGlvbiA6IFhtbEhlbHBlcgorICAgICAgICB7CisgICAgICAgICAgICBYbWxOb2RlIF9ub2RlOworICAgICAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBfbnM7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbnRlcm5hbCBFeGNlbFBvc2l0aW9uKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSkgOgorICAgICAgICAgICAgICAgIGJhc2UgKG5zLG5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX25vZGUgPSBub2RlOworICAgICAgICAgICAgICAgIF9ucyA9IG5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGNvbFBhdGg9Inhkcjpjb2wiOworICAgICAgICAgICAgcHVibGljIGludCBDb2x1bW4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KGNvbFBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoY29sUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHJvd1BhdGg9Inhkcjpyb3ciOworICAgICAgICAgICAgcHVibGljIGludCBSb3cKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KHJvd1BhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcocm93UGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGNvbE9mZlBhdGggPSAieGRyOmNvbE9mZiI7CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gQ29sdW1uIE9mZnNldAorICAgICAgICAgICAgLy8vIAorICAgICAgICAgICAgLy8vIEVNVSB1bml0cyAgIDFjbSAgICAgICAgID0gICAxLzM2MDAwMCAKKyAgICAgICAgICAgIC8vLyAgICAgICAgICAgICAxVVMgaW5jaCAgICA9ICAgMS85MTQ0MDAKKyAgICAgICAgICAgIC8vLyAgICAgICAgICAgICAxcGl4ZWwgICAgICA9ICAgMS85NTI1CisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGludCBDb2x1bW5PZmYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KGNvbE9mZlBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoY29sT2ZmUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHJvd09mZlBhdGggPSAieGRyOnJvd09mZiI7CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gUm93IE9mZnNldAorICAgICAgICAgICAgLy8vIAorICAgICAgICAgICAgLy8vIEVNVSB1bml0cyAgIDFjbSAgICAgICAgID0gICAxLzM2MDAwMCAKKyAgICAgICAgICAgIC8vLyAgICAgICAgICAgICAxVVMgaW5jaCAgICA9ICAgMS85MTQ0MDAKKyAgICAgICAgICAgIC8vLyAgICAgICAgICAgICAxcGl4ZWwgICAgICA9ICAgMS85NTI1CisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGludCBSb3dPZmYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KHJvd09mZlBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcocm93T2ZmUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBFeGNlbERyYXdpbmdzIF9kcmF3aW5nczsKKyAgICAgICAgcHJvdGVjdGVkIFhtbE5vZGUgX3RvcE5vZGU7CisgICAgICAgIHN0cmluZyBfbmFtZVhQYXRoOworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgaW50IF9pZDsKKyAgICAgICAgY29uc3QgZmxvYXQgU1RBTkRBUkRfRFBJID0gOTY7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRU1VX1BFUl9QSVhFTCA9IDk1MjU7CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEcmF3aW5nKEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgc3RyaW5nIG5hbWVYUGF0aCkgOgorICAgICAgICAgICAgYmFzZShkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBfZHJhd2luZ3MgPSBkcmF3aW5nczsKKyAgICAgICAgICAgIF90b3BOb2RlID0gbm9kZTsKKyAgICAgICAgICAgIF9pZCA9IGRyYXdpbmdzLldvcmtzaGVldC5Xb3JrYm9vay5fbmV4dERyYXdpbmdJRCsrOworICAgICAgICAgICAgWG1sTm9kZSBwb3NOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6ZnJvbSIsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGcm9tID0gbmV3IEV4Y2VsUG9zaXRpb24oZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgcG9zTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6dG8iLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVG8gPSBuZXcgRXhjZWxQb3NpdGlvbihkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBwb3NOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUbyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbmFtZVhQYXRoID0gbmFtZVhQYXRoOworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImZyb20iLCAidG8iLCAiZ3JhcGhpY0ZyYW1lIiwgInNwIiwgImNsaWVudERhdGEiICB9OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBkcmF3aW5nIG9iamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lWFBhdGggPT0gIiIpIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX25hbWVYUGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lWFBhdGggPT0gIiIpIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9uYW1lWFBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIb3cgRXhjZWwgcmVzaXplIGRyYXdpbmdzIHdoZW4gdGhlIGNvbHVtbiB3aWR0aCBpcyBjaGFuZ2VkIHdpdGhpbiBFeGNlbC4KKyAgICAgICAgLy8vIFRoZSB3aWR0aCBvZiBkcmF3aW5ncyBhcmUgY3VycmVudGx5IE5PVCByZXNpemVkIGluIEVQUEx1cyB3aGVuIHRoZSBjb2x1bW4gd2lkdGggY2hhbmdlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUVkaXRBcyBFZGl0QXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IEdldFhtbE5vZGVTdHJpbmcoIkBlZGl0QXMiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gIiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlRWRpdEFzLlR3b0NlbGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVFZGl0QXMpRW51bS5QYXJzZSh0eXBlb2YoZUVkaXRBcyksIHMsdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlRWRpdEFzLlR3b0NlbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHM9dmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZWRpdEFzIiwgcy5TdWJzdHJpbmcoMCwxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpK3MuU3Vic3RyaW5nKDEscy5MZW5ndGgtMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBsb2NrZWRQYXRoPSJ4ZHI6Y2xpZW50RGF0YS9AZkxvY2tzV2l0aFNoZWV0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9jayBkcmF3aW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIExvY2tlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wobG9ja2VkUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChsb2NrZWRQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIHByaW50UGF0aCA9ICJ4ZHI6Y2xpZW50RGF0YS9AZlByaW50c1dpdGhTaGVldCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByaW50IGRyYXdpbmcgd2l0aCBzaGVldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQcmludAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wocHJpbnRQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKHByaW50UGF0aCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUb3AgTGVmdCBwb3NpdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQb3NpdGlvbiBGcm9tIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQm90dG9tIHJpZ2h0IHBvc2l0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFBvc2l0aW9uIFRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgbmV3IERyYXdpbmcgdHlwZXMgaGVyZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRyYXdpbmdzIj5UaGUgZHJhd2luZyBjb2xsZWN0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5YbWwgdG9wIG5vZGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIERyYXdpbmcgb2JqZWN0PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxEcmF3aW5nIEdldERyYXdpbmcoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6c3AiLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxTaGFwZShkcmF3aW5ncywgbm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpwaWMiLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxQaWN0dXJlKGRyYXdpbmdzLCBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOmdyYXBoaWNGcmFtZSIsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsQ2hhcnQuR2V0Q2hhcnQoZHJhd2luZ3MsIG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEcmF3aW5nKGRyYXdpbmdzLCBub2RlLCAiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfaWQuVG9TdHJpbmcoKTsgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0VGV4dEFjaG9yaW5nVGV4dChlVGV4dEFuY2hvcmluZ1R5cGUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFuY2hvcmluZ1R5cGUuQm90dG9tOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImIiOworICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbmNob3JpbmdUeXBlLkNlbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjdHIiOworICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbmNob3JpbmdUeXBlLkRpc3RyaWJ1dGVkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImRpc3QiOworICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbmNob3JpbmdUeXBlLkp1c3RpZnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAianVzdCI7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZVRleHRBbmNob3JpbmdUeXBlIEdldFRleHRBY2hvcmluZ0VudW0oc3RyaW5nIHRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJiIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QW5jaG9yaW5nVHlwZS5Cb3R0b207CisgICAgICAgICAgICAgICAgY2FzZSAiY3RyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QW5jaG9yaW5nVHlwZS5DZW50ZXI7CisgICAgICAgICAgICAgICAgY2FzZSAiZGlzdCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFuY2hvcmluZ1R5cGUuRGlzdHJpYnV0ZWQ7CisgICAgICAgICAgICAgICAgY2FzZSAianVzdCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFuY2hvcmluZ1R5cGUuSnVzdGlmeTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbmNob3JpbmdUeXBlLlRvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldFRleHRWZXJ0aWNhbFRleHQoZVRleHRWZXJ0aWNhbFR5cGUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlVGV4dFZlcnRpY2FsVHlwZS5FYXN0QXNpYW5WZXJ0aWNhbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlYVZlcnQiOworICAgICAgICAgICAgICAgIGNhc2UgZVRleHRWZXJ0aWNhbFR5cGUuTW9uZ29saWFuVmVydGljYWw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibW9uZ29saWFuVmVydCI7CisgICAgICAgICAgICAgICAgY2FzZSBlVGV4dFZlcnRpY2FsVHlwZS5WZXJ0aWNhbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2ZXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVUZXh0VmVydGljYWxUeXBlLlZlcnRpY2FsMjcwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZlcnQyNzAiOworICAgICAgICAgICAgICAgIGNhc2UgZVRleHRWZXJ0aWNhbFR5cGUuV29yZEFydFZlcnRpY2FsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIndvcmRBcnRWZXJ0IjsKKyAgICAgICAgICAgICAgICBjYXNlIGVUZXh0VmVydGljYWxUeXBlLldvcmRBcnRWZXJ0aWNhbFJpZ2h0VG9MZWZ0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIndvcmRBcnRWZXJ0UnRsIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImhvcnoiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBlVGV4dFZlcnRpY2FsVHlwZSBHZXRUZXh0VmVydGljYWxFbnVtKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiZWFWZXJ0IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0VmVydGljYWxUeXBlLkVhc3RBc2lhblZlcnRpY2FsOworICAgICAgICAgICAgICAgIGNhc2UgIm1vbmdvbGlhblZlcnQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRWZXJ0aWNhbFR5cGUuTW9uZ29saWFuVmVydGljYWw7CisgICAgICAgICAgICAgICAgY2FzZSAidmVydCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dFZlcnRpY2FsVHlwZS5WZXJ0aWNhbDsKKyAgICAgICAgICAgICAgICBjYXNlICJ2ZXJ0MjcwIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0VmVydGljYWxUeXBlLlZlcnRpY2FsMjcwOworICAgICAgICAgICAgICAgIGNhc2UgIndvcmRBcnRWZXJ0IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0VmVydGljYWxUeXBlLldvcmRBcnRWZXJ0aWNhbDsKKyAgICAgICAgICAgICAgICBjYXNlICJ3b3JkQXJ0VmVydFJ0bCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dFZlcnRpY2FsVHlwZS5Xb3JkQXJ0VmVydGljYWxSaWdodFRvTGVmdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRWZXJ0aWNhbFR5cGUuSG9yaXpvbnRhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uICJJbnRlcm5hbCBzaXppbmcgZnVuY3Rpb25zIgorICAgICAgICBpbnRlcm5hbCBpbnQgR2V0UGl4ZWxMZWZ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfZHJhd2luZ3MuV29ya3NoZWV0OworICAgICAgICAgICAgZGVjaW1hbCBtZHcgPSB3cy5Xb3JrYm9vay5NYXhGb250V2lkdGg7CisKKyAgICAgICAgICAgIGludCBwaXggPSAwOworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgRnJvbS5Db2x1bW47IGNvbCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpeCArPSAoaW50KWRlY2ltYWwuVHJ1bmNhdGUoKCgyNTYgKiBHZXRDb2x1bW5XaWR0aChjb2wgKyAxKSArIGRlY2ltYWwuVHJ1bmNhdGUoMTI4IC8gKGRlY2ltYWwpbWR3KSkgLyAyNTYpICogbWR3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpeCArPSBGcm9tLkNvbHVtbk9mZiAvIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICByZXR1cm4gcGl4OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBHZXRQaXhlbFRvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKKyAgICAgICAgICAgIGludCBwaXggPSAwOworICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgRnJvbS5Sb3c7IHJvdysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpeCArPSAoaW50KShHZXRSb3dXaWR0aChyb3cgKyAxKSAvIDAuNzUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl4ICs9IEZyb20uUm93T2ZmIC8gRU1VX1BFUl9QSVhFTDsKKyAgICAgICAgICAgIHJldHVybiBwaXg7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IEdldFBpeGVsV2lkdGgoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7CisgICAgICAgICAgICBkZWNpbWFsIG1kdyA9IHdzLldvcmtib29rLk1heEZvbnRXaWR0aDsKKworICAgICAgICAgICAgaW50IHBpeCA9IC1Gcm9tLkNvbHVtbk9mZiAvIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBGcm9tLkNvbHVtbiArIDE7IGNvbCA8PSBUby5Db2x1bW47IGNvbCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpeCArPSAoaW50KWRlY2ltYWwuVHJ1bmNhdGUoKCgyNTYgKiBHZXRDb2x1bW5XaWR0aChjb2wpICsgZGVjaW1hbC5UcnVuY2F0ZSgxMjggLyAoZGVjaW1hbCltZHcpKSAvIDI1NikgKiBtZHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl4ICs9IFRvLkNvbHVtbk9mZiAvIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICByZXR1cm4gcGl4OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBHZXRQaXhlbEhlaWdodCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKKworICAgICAgICAgICAgaW50IHBpeCA9IC0oRnJvbS5Sb3dPZmYgLyBFTVVfUEVSX1BJWEVMKTsKKyAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IEZyb20uUm93ICsgMTsgcm93IDw9IFRvLlJvdzsgcm93KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGl4ICs9IChpbnQpKEdldFJvd1dpZHRoKHJvdykgLyAwLjc1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpeCArPSBUby5Sb3dPZmYgLyBFTVVfUEVSX1BJWEVMOworICAgICAgICAgICAgcmV0dXJuIHBpeDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZGVjaW1hbCBHZXRDb2x1bW5XaWR0aChpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7CisgICAgICAgICAgICB2YXIgY29sdW1uID0gd3MuX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjb2wpIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSBudWxsKSAgIC8vQ2hlY2sgdGhhdCB0aGUgY29sdW1uIGV4aXN0cworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoZGVjaW1hbCl3cy5EZWZhdWx0Q29sV2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChkZWNpbWFsKXdzLkNvbHVtbihjb2wpLlZpc3VhbFdpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgZG91YmxlIEdldFJvd1dpZHRoKGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKKyAgICAgICAgICAgIG9iamVjdCBvID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh3cy5fdmFsdWVzLkV4aXN0cyhyb3csIDAsIHJlZiBvKSAmJiBvICE9IG51bGwpICAgLy9DaGVjayB0aGF0IHRoZSByb3cgZXhpc3RzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGludGVybmFsUm93ID0gKFJvd0ludGVybmFsKW87CisgICAgICAgICAgICAgICAgaWYgKGludGVybmFsUm93LkhlaWdodCA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVybmFsUm93LkhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSl3cy5EZWZhdWx0Um93SGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl4ZWxUb3AoaW50IHBpeGVscykKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfZHJhd2luZ3MuV29ya3NoZWV0OworICAgICAgICAgICAgZGVjaW1hbCBtZHcgPSB3cy5Xb3JrYm9vay5NYXhGb250V2lkdGg7CisgICAgICAgICAgICBpbnQgcHJldlBpeCA9IDA7CisgICAgICAgICAgICBpbnQgcGl4ID0gKGludCkoR2V0Um93V2lkdGgoMSkgLyAwLjc1KTsKKyAgICAgICAgICAgIGludCByb3cgPSAyOworCisgICAgICAgICAgICB3aGlsZSAocGl4IDwgcGl4ZWxzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXZQaXggPSBwaXg7CisgICAgICAgICAgICAgICAgcGl4ICs9IChpbnQpKEdldFJvd1dpZHRoKHJvdysrKSAvIDAuNzUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGl4ID09IHBpeGVscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGcm9tLlJvdyA9IHJvdyAtIDE7CisgICAgICAgICAgICAgICAgRnJvbS5Sb3dPZmYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZyb20uUm93ID0gcm93IC0gMjsKKyAgICAgICAgICAgICAgICBGcm9tLlJvd09mZiA9IChwaXhlbHMgLSBwcmV2UGl4KSAqIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRQaXhlbExlZnQoaW50IHBpeGVscykKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfZHJhd2luZ3MuV29ya3NoZWV0OworICAgICAgICAgICAgZGVjaW1hbCBtZHcgPSB3cy5Xb3JrYm9vay5NYXhGb250V2lkdGg7CisgICAgICAgICAgICBpbnQgcHJldlBpeCA9IDA7CisgICAgICAgICAgICBpbnQgcGl4ID0gKGludClkZWNpbWFsLlRydW5jYXRlKCgoMjU2ICogR2V0Q29sdW1uV2lkdGgoMSkgKyBkZWNpbWFsLlRydW5jYXRlKDEyOCAvIChkZWNpbWFsKW1kdykpIC8gMjU2KSAqIG1kdyk7CisgICAgICAgICAgICBpbnQgY29sID0gMjsKKworICAgICAgICAgICAgd2hpbGUgKHBpeCA8IHBpeGVscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2UGl4ID0gcGl4OworICAgICAgICAgICAgICAgIHBpeCArPSAoaW50KWRlY2ltYWwuVHJ1bmNhdGUoKCgyNTYgKiBHZXRDb2x1bW5XaWR0aChjb2wrKykgKyBkZWNpbWFsLlRydW5jYXRlKDEyOCAvIChkZWNpbWFsKW1kdykpIC8gMjU2KSAqIG1kdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGl4ID09IHBpeGVscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGcm9tLkNvbHVtbiA9IGNvbCAtIDE7CisgICAgICAgICAgICAgICAgRnJvbS5Db2x1bW5PZmYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZyb20uQ29sdW1uID0gY29sIC0gMjsKKyAgICAgICAgICAgICAgICBGcm9tLkNvbHVtbk9mZiA9IChwaXhlbHMgLSBwcmV2UGl4KSAqIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRQaXhlbEhlaWdodChpbnQgcGl4ZWxzKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRQaXhlbEhlaWdodChwaXhlbHMsIFNUQU5EQVJEX0RQSSk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRQaXhlbEhlaWdodChpbnQgcGl4ZWxzLCBmbG9hdCBkcGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKKyAgICAgICAgICAgIC8vZGVjaW1hbCBtZHcgPSB3cy5Xb3JrYm9vay5NYXhGb250V2lkdGg7CisgICAgICAgICAgICBwaXhlbHMgPSAoaW50KShwaXhlbHMgLyAoZHBpIC8gU1RBTkRBUkRfRFBJKSArIC41KTsKKyAgICAgICAgICAgIGludCBwaXhPZmYgPSBwaXhlbHMgLSAoKGludCkod3MuUm93KEZyb20uUm93ICsgMSkuSGVpZ2h0IC8gMC43NSkgLSAoaW50KShGcm9tLlJvd09mZiAvIEVNVV9QRVJfUElYRUwpKTsKKyAgICAgICAgICAgIGludCBwcmV2UGl4T2ZmID0gcGl4ZWxzOworICAgICAgICAgICAgaW50IHJvdyA9IEZyb20uUm93ICsgMTsKKworICAgICAgICAgICAgd2hpbGUgKHBpeE9mZiA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXZQaXhPZmYgPSBwaXhPZmY7CisgICAgICAgICAgICAgICAgcGl4T2ZmIC09IChpbnQpKEdldFJvd1dpZHRoKCsrcm93KSAvIDAuNzUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVG8uUm93ID0gcm93IC0gMTsKKyAgICAgICAgICAgIGlmIChGcm9tLlJvdyA9PSBUby5Sb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVG8uUm93T2ZmID0gRnJvbS5Sb3dPZmYgKyAocGl4ZWxzKSAqIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVG8uUm93T2ZmID0gcHJldlBpeE9mZiAqIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRQaXhlbFdpZHRoKGludCBwaXhlbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFBpeGVsV2lkdGgocGl4ZWxzLCBTVEFOREFSRF9EUEkpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl4ZWxXaWR0aChpbnQgcGl4ZWxzLCBmbG9hdCBkcGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKKyAgICAgICAgICAgIGRlY2ltYWwgbWR3ID0gd3MuV29ya2Jvb2suTWF4Rm9udFdpZHRoOworCisgICAgICAgICAgICBwaXhlbHMgPSAoaW50KShwaXhlbHMgLyAoZHBpIC8gU1RBTkRBUkRfRFBJKSArIC41KTsKKyAgICAgICAgICAgIGludCBwaXhPZmYgPSAoaW50KXBpeGVscyAtICgoaW50KWRlY2ltYWwuVHJ1bmNhdGUoKCgyNTYgKiBHZXRDb2x1bW5XaWR0aChGcm9tLkNvbHVtbiArIDEpICsgZGVjaW1hbC5UcnVuY2F0ZSgxMjggLyAoZGVjaW1hbCltZHcpKSAvIDI1NikgKiBtZHcpIC0gRnJvbS5Db2x1bW5PZmYgLyBFTVVfUEVSX1BJWEVMKTsKKyAgICAgICAgICAgIGludCBwcmV2UGl4T2ZmID0gRnJvbS5Db2x1bW5PZmYgLyBFTVVfUEVSX1BJWEVMICsgKGludClwaXhlbHM7CisgICAgICAgICAgICBpbnQgY29sID0gRnJvbS5Db2x1bW4gKyAyOworCisgICAgICAgICAgICB3aGlsZSAocGl4T2ZmID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJldlBpeE9mZiA9IHBpeE9mZjsKKyAgICAgICAgICAgICAgICBwaXhPZmYgLT0gKGludClkZWNpbWFsLlRydW5jYXRlKCgoMjU2ICogR2V0Q29sdW1uV2lkdGgoY29sKyspICsgZGVjaW1hbC5UcnVuY2F0ZSgxMjggLyAoZGVjaW1hbCltZHcpKSAvIDI1NikgKiBtZHcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUby5Db2x1bW4gPSBjb2wgLSAyOworICAgICAgICAgICAgVG8uQ29sdW1uT2ZmID0gcHJldlBpeE9mZiAqIEVNVV9QRVJfUElYRUw7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uICJQdWJsaWMgc2l6aW5nIGZ1bmN0aW9ucyIKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgYSBkcmF3aW5nLiAKKyAgICAgICAgLy8vIE5vdGUgdGhhdCByZXNpemluZyBjb2x1bW5zIC8gcm93cyBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZWZmZWN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhd2luZworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBpeGVsVG9wIj5Ub3AgcGl4ZWw8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBpeGVsTGVmdCI+TGVmdCBwaXhlbDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNldFBvc2l0aW9uKGludCBQaXhlbFRvcCwgaW50IFBpeGVsTGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdpZHRoID0gR2V0UGl4ZWxXaWR0aCgpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IEdldFBpeGVsSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIFNldFBpeGVsVG9wKFBpeGVsVG9wKTsKKyAgICAgICAgICAgIFNldFBpeGVsTGVmdChQaXhlbExlZnQpOworCisgICAgICAgICAgICBTZXRQaXhlbFdpZHRoKHdpZHRoKTsKKyAgICAgICAgICAgIFNldFBpeGVsSGVpZ2h0KGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgYSBkcmF3aW5nLiAKKyAgICAgICAgLy8vIE5vdGUgdGhhdCByZXNpemluZyBjb2x1bW5zIC8gcm93cyBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZWZmZWN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhd2luZworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+U3RhcnQgcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSb3dPZmZzZXRQaXhlbHMiPk9mZnNldCBpbiBwaXhlbHM8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvbHVtbiI+U3RhcnQgQ29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW5PZmZzZXRQaXhlbHMiPk9mZnNldCBpbiBwaXhlbHM8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRQb3NpdGlvbihpbnQgUm93LCBpbnQgUm93T2Zmc2V0UGl4ZWxzLCBpbnQgQ29sdW1uLCBpbnQgQ29sdW1uT2Zmc2V0UGl4ZWxzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2lkdGggPSBHZXRQaXhlbFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gR2V0UGl4ZWxIZWlnaHQoKTsKKworICAgICAgICAgICAgRnJvbS5Sb3cgPSBSb3c7CisgICAgICAgICAgICBGcm9tLlJvd09mZiA9IFJvd09mZnNldFBpeGVscyAqIEVNVV9QRVJfUElYRUw7CisgICAgICAgICAgICBGcm9tLkNvbHVtbiA9IENvbHVtbjsKKyAgICAgICAgICAgIEZyb20uQ29sdW1uT2ZmID0gQ29sdW1uT2Zmc2V0UGl4ZWxzICogRU1VX1BFUl9QSVhFTDsKKworICAgICAgICAgICAgU2V0UGl4ZWxXaWR0aCh3aWR0aCk7CisgICAgICAgICAgICBTZXRQaXhlbEhlaWdodChoZWlnaHQpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCBzaXplIGluIFBlcmNlbnQKKyAgICAgICAgLy8vIE5vdGUgdGhhdCByZXNpemluZyBjb2x1bW5zIC8gcm93cyBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZWZmZWN0IHRoZSBzaXplIG9mIHRoZSBkcmF3aW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGVyY2VudCI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRTaXplKGludCBQZXJjZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2lkdGggPSBHZXRQaXhlbFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gR2V0UGl4ZWxIZWlnaHQoKTsKKworICAgICAgICAgICAgd2lkdGggPSAoaW50KSh3aWR0aCAqICgoZGVjaW1hbClQZXJjZW50IC8gMTAwKSk7CisgICAgICAgICAgICBoZWlnaHQgPSAoaW50KShoZWlnaHQgKiAoKGRlY2ltYWwpUGVyY2VudCAvIDEwMCkpOworCisgICAgICAgICAgICBTZXRQaXhlbFdpZHRoKHdpZHRoLCA5Nik7CisgICAgICAgICAgICBTZXRQaXhlbEhlaWdodChoZWlnaHQsIDk2KTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXQgc2l6ZSBpbiBwaXhlbHMKKyAgICAgICAgLy8vIE5vdGUgdGhhdCByZXNpemluZyBjb2x1bW5zIC8gcm93cyBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZWZmZWN0IHRoZSBzaXplIG9mIHRoZSBkcmF3aW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGl4ZWxXaWR0aCI+V2lkdGggaW4gcGl4ZWxzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQaXhlbEhlaWdodCI+SGVpZ2h0IGluIHBpeGVsczwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNldFNpemUoaW50IFBpeGVsV2lkdGgsIGludCBQaXhlbEhlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0UGl4ZWxXaWR0aChQaXhlbFdpZHRoKTsKKyAgICAgICAgICAgIFNldFBpeGVsSGVpZ2h0KFBpeGVsSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIHZpcnR1YWwgdm9pZCBEZWxldGVNZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvcE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChUb3BOb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b3BOb2RlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0JvcmRlci5jcyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0JvcmRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ4MDRiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nQm9yZGVyLmNzCkBAIC0wLDAgKzEsMjI3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMi0yMgorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHlwZSBvZiBMaW5lIGNhcAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUxpbmVDYXAKKyAgICB7CisgICAgICAgIEZsYXQsICAgLy9mbGF0CisgICAgICAgIFJvdW5kLCAgLy9ybmQKKyAgICAgICAgU3F1YXJlICAvL1NxCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTGluZSBzdHlsZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVMaW5lU3R5bGUKKyAgICB7CisgICAgICAgIERhc2gsCisgICAgICAgIERhc2hEb3QsCisgICAgICAgIERvdCwKKyAgICAgICAgTG9uZ0Rhc2gsCisgICAgICAgIExvbmdEYXNoRG90LAorICAgICAgICBMb25nRGFzaERvdERvdCwKKyAgICAgICAgU29saWQsCisgICAgICAgIFN5c3RlbURhc2gsCisgICAgICAgIFN5c3RlbURhc2hEb3QsCisgICAgICAgIFN5c3RlbURhc2hEb3REb3QsCisgICAgICAgIFN5c3RlbURvdAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJvcmRlciBmb3IgZHJhd2luZ3MKKyAgICAvLy8gPC9zdW1tYXJ5PiAgICAKKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsRHJhd2luZ0JvcmRlciA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgc3RyaW5nIF9saW5lUGF0aDsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEcmF3aW5nQm9yZGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgbGluZVBhdGgpIDogCisgICAgICAgICAgICBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJjaGFydCIsInRpY2tMYmxQb3MiLCAic3BQciIsICJ0eFByIiwiY3Jvc3NBeCIsICJwcmludFNldHRpbmdzIiwgInNob3dWYWwiLCAic2hvd0NhdE5hbWUiLCAic2hvd1Nlck5hbWUiLCAic2hvd1BlcmNlbnQiLCAic2VwYXJhdG9yIiwgInNob3dMZWFkZXJMaW5lcyIsICJub0ZpbGwiLCAic29saWRGaWxsIiwgImJsaXBGaWxsIiwgImdyYWRGaWxsIiwgIm5vRmlsbCIsICJwYXR0RmlsbCIsICJwcnN0RGFzaCIgfTsKKyAgICAgICAgICAgIF9saW5lUGF0aCA9IGxpbmVQYXRoOyAgIAorICAgICAgICAgICAgX2xpbmVTdHlsZVBhdGggPSBzdHJpbmcuRm9ybWF0KF9saW5lU3R5bGVQYXRoLCBsaW5lUGF0aCk7CisgICAgICAgICAgICBfbGluZUNhcFBhdGggPSBzdHJpbmcuRm9ybWF0KF9saW5lQ2FwUGF0aCwgbGluZVBhdGgpOworICAgICAgICAgICAgX2xpbmVXaWR0aCA9IHN0cmluZy5Gb3JtYXQoX2xpbmVXaWR0aCwgbGluZVBhdGgpOworICAgICAgICB9CisgICAgICAgICNyZWdpb24gIlB1YmxpYyBwcm9wZXJ0aWVzIgorICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmlsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfbGluZVBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9saW5lU3R5bGVQYXRoID0gInswfS9hOnByc3REYXNoL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMaW5lc3R5bGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVMaW5lU3R5bGUgTGluZVN0eWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVMaW5lU3R5bGUoR2V0WG1sTm9kZVN0cmluZyhfbGluZVN0eWxlUGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9saW5lU3R5bGVQYXRoLCBUcmFuc2xhdGVMaW5lU3R5bGVUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9saW5lQ2FwUGF0aCA9ICJ7MH0vQGNhcCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExpbmVjYXAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVMaW5lQ2FwIExpbmVDYXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZUxpbmVDYXAoR2V0WG1sTm9kZVN0cmluZyhfbGluZUNhcFBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2xpbmVQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGluZUNhcFBhdGgsIFRyYW5zbGF0ZUxpbmVDYXBUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9saW5lV2lkdGggPSAiezB9L0B3IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2lkdGggaW4gcGl4ZWxzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgV2lkdGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoX2xpbmVXaWR0aCkgLyAxMjcwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2xpbmVXaWR0aCwgKHZhbHVlICogMTI3MDApLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiAiVHJhbnNsYXRlIEVudW0gZnVuY3Rpb25zIgorICAgICAgICBwcml2YXRlIHN0cmluZyBUcmFuc2xhdGVMaW5lU3R5bGVUZXh0KGVMaW5lU3R5bGUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0PXZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZUxpbmVTdHlsZS5EYXNoOgorICAgICAgICAgICAgICAgIGNhc2UgZUxpbmVTdHlsZS5Eb3Q6CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLkRhc2hEb3Q6CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLlNvbGlkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5TdWJzdHJpbmcoMCwxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgdGV4dC5TdWJzdHJpbmcoMSx0ZXh0Lkxlbmd0aC0xKTsgLy9GaXJzdCB0byBMb3dlciBjYXNlLgorICAgICAgICAgICAgICAgIGNhc2UgZUxpbmVTdHlsZS5Mb25nRGFzaDoKKyAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuTG9uZ0Rhc2hEb3Q6CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLkxvbmdEYXNoRG90RG90OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxnIiArIHRleHQuU3Vic3RyaW5nKDQsIHRleHQuTGVuZ3RoIC0gNCk7CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLlN5c3RlbURhc2g6CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLlN5c3RlbURhc2hEb3Q6CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLlN5c3RlbURhc2hEb3REb3Q6CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLlN5c3RlbURvdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzeXMiICsgdGV4dC5TdWJzdHJpbmcoNiwgdGV4dC5MZW5ndGggLSA2KTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIExpbmVzdHlsZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGVMaW5lU3R5bGUgVHJhbnNsYXRlTGluZVN0eWxlKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiZGFzaCI6CisgICAgICAgICAgICAgICAgY2FzZSAiZG90IjoKKyAgICAgICAgICAgICAgICBjYXNlICJkYXNoRG90IjoKKyAgICAgICAgICAgICAgICBjYXNlICJzb2xpZCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlKSwgdGV4dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY2FzZSAibGdEYXNoIjoKKyAgICAgICAgICAgICAgICBjYXNlICJsZ0Rhc2hEb3QiOgorICAgICAgICAgICAgICAgIGNhc2UgImxnRGFzaERvdERvdCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlKSwgIkxvbmciICsgdGV4dC5TdWJzdHJpbmcoMiwgdGV4dC5MZW5ndGggLSAyKSk7CisgICAgICAgICAgICAgICAgY2FzZSAic3lzRGFzaCI6CisgICAgICAgICAgICAgICAgY2FzZSAic3lzRGFzaERvdCI6CisgICAgICAgICAgICAgICAgY2FzZSAic3lzRGFzaERvdERvdCI6CisgICAgICAgICAgICAgICAgY2FzZSAic3lzRG90IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTGluZVN0eWxlKUVudW0uUGFyc2UodHlwZW9mKGVMaW5lU3R5bGUpLCAiU3lzdGVtIiArIHRleHQuU3Vic3RyaW5nKDMsIHRleHQuTGVuZ3RoIC0gMykpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIExpbmVzdHlsZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBUcmFuc2xhdGVMaW5lQ2FwVGV4dChlTGluZUNhcCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVMaW5lQ2FwLlJvdW5kOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInJuZCI7CisgICAgICAgICAgICAgICAgY2FzZSBlTGluZUNhcC5TcXVhcmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3EiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZmxhdCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBlTGluZUNhcCBUcmFuc2xhdGVMaW5lQ2FwKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAicm5kIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMaW5lQ2FwLlJvdW5kOworICAgICAgICAgICAgICAgIGNhc2UgInNxIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMaW5lQ2FwLlNxdWFyZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxpbmVDYXAuRmxhdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgCisgICAgICAgIC8vcHVibGljIEV4Y2VsRHJhd2luZ0ZvbnQgRm9udAorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0CisgICAgICAgIC8vICAgIHsgCisgICAgICAgICAgICAKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdGaWxsLmNzIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nRmlsbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NiYjIwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nRmlsbC5jcwpAQCAtMCwwICsxLDIwNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTItMjIKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGaWxsIHByb3BlcnRpZXMgZm9yIGRyYXdpbmcgb2JqZWN0cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbERyYXdpbmdGaWxsIDogWG1sSGVscGVyCisgICAgeworICAgICAgICAvL0V4Y2VsU2hhcGUgX3NocDsgICAgICAgICAgICAgICAgCisgICAgICAgIHN0cmluZyBfZmlsbFBhdGg7CisgICAgICAgIFhtbE5vZGUgX2ZpbGxOb2RlOworICAgICAgICBpbnRlcm5hbCBFeGNlbERyYXdpbmdGaWxsKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZmlsbFBhdGgpIDogCisgICAgICAgICAgICBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgX3NocD1zaHA7CisgICAgICAgICAgICBfZmlsbFBhdGggPSBmaWxsUGF0aDsKKyAgICAgICAgICAgIF9maWxsTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfZmlsbFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInRpY2tMYmxQb3MiLCAic3BQciIsICJ0eFByIiwiZExibFBvcyIsICJjcm9zc0F4IiwgInByaW50U2V0dGluZ3MiLCAic2hvd1ZhbCIsICJwcnN0R2VvbSIsICJub0ZpbGwiLCAic29saWRGaWxsIiwgImJsaXBGaWxsIiwgImdyYWRGaWxsIiwgIm5vRmlsbCIsICJwYXR0RmlsbCIsICJsbiIsICJwcnN0RGFzaCIgfTsKKyAgICAgICAgICAgIC8vU2V0ZmlsbCBub2RlCisgICAgICAgICAgICBpZiAoX2ZpbGxOb2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2ZpbGxUeXBlTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgic29saWRGaWxsIik7CisgICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkgX2ZpbGxUeXBlTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgibm9GaWxsIik7CisgICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkgX2ZpbGxUeXBlTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYmxpcEZpbGwiKTsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpbGxUeXBlTm9kZSA9PSBudWxsKSBfZmlsbFR5cGVOb2RlID0gdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJncmFkRmlsbCIpOworICAgICAgICAgICAgICAgIGlmIChfZmlsbFR5cGVOb2RlID09IG51bGwpIF9maWxsVHlwZU5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoInBhdHRGaWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZUZpbGxTdHlsZSBfc3R5bGU7CisgICAgICAgIFhtbE5vZGUgX2ZpbGxUeXBlTm9kZSA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZpbGwgc3R5bGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVGaWxsU3R5bGUgU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3N0eWxlPUdldFN0eWxlRW51bShfZmlsbFR5cGVOb2RlLk5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVGaWxsU3R5bGUuTm9GaWxsIHx8IHZhbHVlID09IGVGaWxsU3R5bGUuU29saWRGaWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3N0eWxlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIENyZWF0ZUZpbGxUb3BOb2RlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJGaWxsc3R5bGUgbm90IGltcGxlbWVudGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZUZpbGxUb3BOb2RlKGVGaWxsU3R5bGUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZmlsbFR5cGVOb2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVG9wTm9kZS5SZW1vdmVDaGlsZChfZmlsbFR5cGVOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENyZWF0ZU5vZGUoX2ZpbGxQYXRoICsgIi9hOiIgKyBHZXRTdHlsZVRleHQodmFsdWUpLCBmYWxzZSk7CisgICAgICAgICAgICBfZmlsbE5vZGU9VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9maWxsUGF0aCArICIvYToiICsgR2V0U3R5bGVUZXh0KHZhbHVlKSwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVGaWxsU3R5bGUgR2V0U3R5bGVFbnVtKHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2gobmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJub0ZpbGwiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUZpbGxTdHlsZS5Ob0ZpbGw7CisgICAgICAgICAgICAgICAgY2FzZSAiYmxpcEZpbGwiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUZpbGxTdHlsZS5CbGlwRmlsbDsKKyAgICAgICAgICAgICAgICBjYXNlICJncmFkRmlsbCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlRmlsbFN0eWxlLkdyYWRpZW50RmlsbDsKKyAgICAgICAgICAgICAgICBjYXNlICJncnBGaWxsIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVGaWxsU3R5bGUuR3JvdXBGaWxsOworICAgICAgICAgICAgICAgIGNhc2UgInBhdHRGaWxsIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVGaWxsU3R5bGUuUGF0dGVybkZpbGw7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3R5bGVUZXh0KGVGaWxsU3R5bGUgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3R5bGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlRmlsbFN0eWxlLkJsaXBGaWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJsaXBGaWxsIjsKKyAgICAgICAgICAgICAgICBjYXNlIGVGaWxsU3R5bGUuR3JhZGllbnRGaWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImdyYWRGaWxsIjsKKyAgICAgICAgICAgICAgICBjYXNlIGVGaWxsU3R5bGUuR3JvdXBGaWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImdycEZpbGwiOworICAgICAgICAgICAgICAgIGNhc2UgZUZpbGxTdHlsZS5Ob0ZpbGw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibm9GaWxsIjsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBlRmlsbFN0eWxlLlBhdHRlcm5GaWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInBhdHRGaWxsIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNvbGlkRmlsbCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgQ29sb3JQYXRoID0gIi9hOnNvbGlkRmlsbC9hOnNyZ2JDbHIvQHZhbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZpbGwgY29sb3IgZm9yIHNvbGlkIGZpbGxzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBDb2xvciBDb2xvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgY29sID0gR2V0WG1sTm9kZVN0cmluZyhfZmlsbFBhdGggKyBDb2xvclBhdGgpOworICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoNzksIDEyOSwgMTg5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfc3R5bGUgIT0gZUZpbGxTdHlsZS5Tb2xpZEZpbGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxsU3R5bGUgbXVzdCBiZSBzZXQgdG8gU29saWRGaWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2ZpbGxQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZmlsbFBhdGggKyBDb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikuU3Vic3RyaW5nKDIsIDYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgYWxwaGFQYXRoID0gIi9hOnNvbGlkRmlsbC9hOnNyZ2JDbHIvYTphbHBoYS9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNwYXJhbmN5IGluIHBlcmNlbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBUcmFuc3BhcmFuY3kKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwMCAtIChHZXRYbWxOb2RlSW50KF9maWxsUGF0aCArIGFscGhhUGF0aCkgLyAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbFR5cGVOb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBDb2xvci5Gcm9tQXJnYig3OSwgMTI5LCAxODkpOyAgIC8vU2V0IGEgRGVmYXVsdCBjb2xvcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfc3R5bGUgIT0gZUZpbGxTdHlsZS5Tb2xpZEZpbGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxsU3R5bGUgbXVzdCBiZSBzZXQgdG8gU29saWRGaWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vQ3JlYXRlTm9kZShfZmlsbFBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9maWxsUGF0aCArIGFscGhhUGF0aCwgKCgxMDAgLSB2YWx1ZSkgKiAxMDAwKS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0xpbmVFbmQuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdMaW5lRW5kLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTczMTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdMaW5lRW5kLmNzCkBAIC0wLDAgKzEsMjIwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uWG1sOworCisKKy8vLyA8c3VtbWFyeT4KKy8vLyBMaW5lIGVuZCBzdHlsZS4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBlRW5kU3R5bGUgICAvL1NUX0xpbmVFbmRUeXBlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBObyBlbmQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIE5vbmUsCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUcmlhbmdsZSBhcnJvdyBoZWFkCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBUcmlhbmdsZSwKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFN0ZWFsdGggYXJyb3cgaGVhZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgU3RlYWx0aCwKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERpYW1vbmQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIERpYW1vbmQsCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBPdmFsCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBPdmFsLAorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTGluZSBhcnJvdyBoZWFkCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBBcnJvdworfQorCisvLy8gPHN1bW1hcnk+CisvLy8gTGVuZCBlbmQgc2l6ZS4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBlRW5kU2l6ZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU21hbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgU21hbGwsCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNZWRpdW0KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIE1lZGl1bSwKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIExhcmdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBMYXJnZQorfQorCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9wZXJ0aWVzIGZvciBkcmF3aW5nIGxpbmUgZW5kcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbERyYXdpbmdMaW5lRW5kOlhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgIHN0cmluZyBfbGluZVBhdGg7CisgICAgICAgIGludGVybmFsIEV4Y2VsRHJhd2luZ0xpbmVFbmQoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBsaW5lUGF0aCkgOiAKKyAgICAgICAgICAgIGJhc2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImhlYWRFbmQiLCAidGFpbEVuZCIgfTsKKyAgICAgICAgICAgIF9saW5lUGF0aCA9IGxpbmVQYXRoOyAgIAorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfaGVhZEVuZFN0eWxlUGF0aCA9ICJ4ZHI6c3AveGRyOnNwUHIvYTpsbi9hOmhlYWRFbmQvQHR5cGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIZWFkZXJFbmQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVFbmRTdHlsZSBIZWFkRW5kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVFbmRTdHlsZShHZXRYbWxOb2RlU3RyaW5nKF9oZWFkRW5kU3R5bGVQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9saW5lUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2hlYWRFbmRTdHlsZVBhdGgsIFRyYW5zbGF0ZUVuZFN0eWxlVGV4dCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfdGFpbEVuZFN0eWxlUGF0aCA9ICJ4ZHI6c3AveGRyOnNwUHIvYTpsbi9hOnRhaWxFbmQvQHR5cGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIZWFkZXJFbmQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVFbmRTdHlsZSBUYWlsRW5kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVFbmRTdHlsZShHZXRYbWxOb2RlU3RyaW5nKF90YWlsRW5kU3R5bGVQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9saW5lUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RhaWxFbmRTdHlsZVBhdGgsIFRyYW5zbGF0ZUVuZFN0eWxlVGV4dCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIF90YWlsRW5kU2l6ZVdpZHRoUGF0aCA9ICJ4ZHI6c3AveGRyOnNwUHIvYTpsbi9hOnRhaWxFbmQvQHciOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUYWlsRW5kU2l6ZVdpZHRoCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlRW5kU2l6ZSBUYWlsRW5kU2l6ZVdpZHRoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVFbmRTaXplKEdldFhtbE5vZGVTdHJpbmcoX3RhaWxFbmRTaXplV2lkdGhQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9saW5lUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RhaWxFbmRTaXplV2lkdGhQYXRoLCBUcmFuc2xhdGVFbmRTaXplVGV4dCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIF90YWlsRW5kU2l6ZUhlaWdodFBhdGggPSAieGRyOnNwL3hkcjpzcFByL2E6bG4vYTp0YWlsRW5kL0BsZW4iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUYWlsRW5kU2l6ZUhlaWdodAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUVuZFNpemUgVGFpbEVuZFNpemVIZWlnaHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZUVuZFNpemUoR2V0WG1sTm9kZVN0cmluZyhfdGFpbEVuZFNpemVIZWlnaHRQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9saW5lUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RhaWxFbmRTaXplSGVpZ2h0UGF0aCwgVHJhbnNsYXRlRW5kU2l6ZVRleHQodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBfaGVhZEVuZFNpemVXaWR0aFBhdGggPSAieGRyOnNwL3hkcjpzcFByL2E6bG4vYTpoZWFkRW5kL0B3IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGFpbEVuZFNpemVXaWR0aAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUVuZFNpemUgSGVhZEVuZFNpemVXaWR0aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlRW5kU2l6ZShHZXRYbWxOb2RlU3RyaW5nKF9oZWFkRW5kU2l6ZVdpZHRoUGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9oZWFkRW5kU2l6ZVdpZHRoUGF0aCwgVHJhbnNsYXRlRW5kU2l6ZVRleHQodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBfaGVhZEVuZFNpemVIZWlnaHRQYXRoID0gInhkcjpzcC94ZHI6c3BQci9hOmxuL2E6aGVhZEVuZC9AbGVuIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGFpbEVuZFNpemVIZWlnaHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVFbmRTaXplIEhlYWRFbmRTaXplSGVpZ2h0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVFbmRTaXplKEdldFhtbE5vZGVTdHJpbmcoX2hlYWRFbmRTaXplSGVpZ2h0UGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9oZWFkRW5kU2l6ZUhlaWdodFBhdGgsIFRyYW5zbGF0ZUVuZFNpemVUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICJUcmFuc2xhdGUgRW51bSBmdW5jdGlvbnMiCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZUVuZFN0eWxlVGV4dChlRW5kU3R5bGUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGVFbmRTdHlsZSBUcmFuc2xhdGVFbmRTdHlsZShzdHJpbmcgdGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIm5vbmUiOgorICAgICAgICAgICAgICAgIGNhc2UgImFycm93IjoKKyAgICAgICAgICAgICAgICBjYXNlICJkaWFtb25kIjoKKyAgICAgICAgICAgICAgICBjYXNlICJvdmFsIjoKKyAgICAgICAgICAgICAgICBjYXNlICJzdGVhbHRoIjoKKyAgICAgICAgICAgICAgICBjYXNlICJ0cmlhbmdsZSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUVuZFN0eWxlKUVudW0uUGFyc2UodHlwZW9mKGVFbmRTdHlsZSksIHRleHQsIHRydWUpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIEVuZHN0eWxlIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgVHJhbnNsYXRlRW5kU2l6ZVRleHQoZUVuZFNpemUgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlRW5kU2l6ZS5TbWFsbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzbSI7CisgICAgICAgICAgICAgICAgY2FzZSBlRW5kU2l6ZS5NZWRpdW06CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWVkIjsKKyAgICAgICAgICAgICAgICBjYXNlIGVFbmRTaXplLkxhcmdlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxnIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiSW52YWxpZCBFbmRzaXplIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgZUVuZFNpemUgVHJhbnNsYXRlRW5kU2l6ZShzdHJpbmcgdGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgInNtIjoKKyAgICAgICAgICAgICAgICBjYXNlICJtZWQiOgorICAgICAgICAgICAgICAgIGNhc2UgImxnIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlRW5kU2l6ZSlFbnVtLlBhcnNlKHR5cGVvZihlRW5kU2l6ZSksIHRleHQsIHRydWUpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIEVuZHNpemUiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdzLmNzIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5ncy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQxZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5ncy5jcwpAQCAtMCwwICsxLDYyMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTItMjIKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ29sbGVjdGlvbiBmb3IgRHJhd2luZyBvYmplY3RzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRHJhd2luZ3MgOiBJRW51bWVyYWJsZTxFeGNlbERyYXdpbmc+LCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBYbWxEb2N1bWVudCBfZHJhd2luZ3NYbWw9bmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX2RyYXdpbmdOYW1lczsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PEV4Y2VsRHJhd2luZz4gX2RyYXdpbmdzOworICAgICAgICBpbnRlcm5hbCBjbGFzcyBJbWFnZUNvbXBhcmUKKyAgICAgICAgeworICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIGltYWdlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIHN0cmluZyByZWxJRCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIGludGVybmFsIGJvb2wgQ29tcGFyZXIoYnl0ZVtdIGNvbXBhcmVJbWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVJbWcuTGVuZ3RoICE9IGltYWdlLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltYWdlLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlW2ldICE9IGNvbXBhcmVJbWdbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy9FcXVhbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vaW50ZXJuYWwgTGlzdDxJbWFnZUNvbXBhcmU+IF9waWNzID0gbmV3IExpc3Q8SW1hZ2VDb21wYXJlPigpOworICAgICAgICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBfaGFzaGVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgIGludGVybmFsIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VSZWxhdGlvbnNoaXAgX2RyYXdpbmdSZWxhdGlvbiA9IG51bGw7CisgICAgICAgIGludGVybmFsIEV4Y2VsRHJhd2luZ3MoRXhjZWxQYWNrYWdlIHhsUGFja2FnZSwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZHJhd2luZ3NYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX2RyYXdpbmdzWG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIF9kcmF3aW5ncyA9IG5ldyBMaXN0PEV4Y2VsRHJhd2luZz4oKTsKKyAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLGludD4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOworICAgICAgICAgICAgICAgIF9wYWNrYWdlID0geGxQYWNrYWdlOworICAgICAgICAgICAgICAgIFdvcmtzaGVldCA9IHNoZWV0OworICAgICAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IHNoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6ZHJhd2luZyIsIHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIENyZWF0ZU5TTSgpOworICAgICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZHJhd2luZ1JlbGF0aW9uID0gc2hlZXQuUGFydC5HZXRSZWxhdGlvbnNoaXAobm9kZS5BdHRyaWJ1dGVzWyJyOmlkIl0uVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBfdXJpRHJhd2luZyA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShzaGVldC5Xb3Jrc2hlZXRVcmksIF9kcmF3aW5nUmVsYXRpb24uVGFyZ2V0VXJpKTsKKworICAgICAgICAgICAgICAgICAgICBfcGFydCA9IHhsUGFja2FnZS5QYWNrYWdlLkdldFBhcnQoX3VyaURyYXdpbmcpOworICAgICAgICAgICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoX2RyYXdpbmdzWG1sLCBfcGFydC5HZXRTdHJlYW0oKSk7IAorCisgICAgICAgICAgICAgICAgICAgIEFkZERyYXdpbmdzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgZHJhd2luZyB4bWwgZG9jdW1lbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFhtbERvY3VtZW50IERyYXdpbmdYbWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5nc1htbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgQWRkRHJhd2luZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBMb29rIGluc2lkZSBhbGwgY2hpbGRyZW4gZm9yIHRoZSBkcmF3aW5ncyBiZWNhdXNlIHRoZXkgY291bGQgYmUgaW5zaWRlCisgICAgICAgICAgICAvLyBNYXJrdXAgQ29tcGF0aWJpbGl0eSBBbHRlcm5hdGl2ZUNvbnRlbnQvQ2hvaWNlIG9yIEFsdGVybmF0aXZlQ29udGVudC9GYWxsYmFjayBub2Rlcy4KKyAgICAgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGN1cnJlbnRseSBwcmV0ZW5kcyB0aGF0IGxvYWRpbmcgYWxsIENob2ljZSBhbHRlcm5hdGl2ZSBkcmF3aW5ncyBkb2Vzbid0IGNhdXNlIGEgcHJvYmxlbQorICAgICAgICAgICAgLy8gZWxzZXdoZXJlLiBUaGlzIHNlZW1zIHRvIGJlIG9rIGZvciB0aGUgdGltZSBiZWluZyBhcyBlbmNvdW50ZXJlZCBkcmF3aW5nIGZpbGVzIHNvIGZhciBvbmx5IHNlZW0gdG8gaGF2ZQorICAgICAgICAgICAgLy8gb25lIENob2ljZSBub2RlIChhbmQgbm8gRmFsbGJhY2spIHVuZGVybmVhdGggdGhlIEFsdGVybmF0aXZlQ29udGVudCBub2RlLiAoRXhjZWwgMjAxMyB0aGF0IGlzLikKKyAgICAgICAgICAgIC8vIFRoaXMgY2hhbmdlIHByZXZlbnRzIENvZGVQbGV4IGlzc3VlICMxNTAyOCBmcm9tIG9jY3VycmluZy4gCisgICAgICAgICAgICAvLyAodGhlIGRyYXdpbmcgeG1sIHBhcnQgKHRoYXQgT05MWSBjb250YWluZWQgQWx0ZXJuYXRpdmVDb250ZW50IG5vZGVzKSB3YXMgaW5jb3JyZWN0bHkgYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiB0aGUgcGFja2FnZSB3YXMgc2F2ZWQpCisgICAgICAgICAgICBYbWxOb2RlTGlzdCBsaXN0ID0gX2RyYXdpbmdzWG1sLlNlbGVjdE5vZGVzKCIvLypbc2VsZjo6eGRyOnR3b0NlbGxBbmNob3Igb3Igc2VsZjo6eGRyOm9uZUNlbGxBbmNob3Igb3Igc2VsZjo6eGRyOmFic29sdXRlQW5jaG9yXSIsIE5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gbGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFeGNlbERyYXdpbmcgZHI7CisgICAgICAgICAgICAgICAgc3dpdGNoKG5vZGUuTG9jYWxOYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAib25lQ2VsbEFuY2hvciI6CisgICAgICAgICAgICAgICAgICAgICAgICBkciA9IG5ldyBFeGNlbERyYXdpbmcodGhpcywgbm9kZSwgInhkcjpzcC94ZHI6bnZTcFByL3hkcjpjTnZQci9AbmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInR3b0NlbGxBbmNob3IiOgorICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSBFeGNlbERyYXdpbmcuR2V0RHJhd2luZyh0aGlzLCBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJhYnNvbHV0ZUFuY2hvciI6CisgICAgICAgICAgICAgICAgICAgICAgICBkciA9IEV4Y2VsRHJhd2luZy5HZXREcmF3aW5nKHRoaXMsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vImFic29sdXRlQ2VsbEFuY2hvciI6CisgICAgICAgICAgICAgICAgICAgICAgICBkciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZHJhd2luZ3MuQWRkKGRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfZHJhd2luZ05hbWVzLkNvbnRhaW5zS2V5KGRyLk5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzLkFkZChkci5OYW1lLCBfZHJhd2luZ3MuQ291bnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgI3JlZ2lvbiBOYW1lc3BhY2VNYW5hZ2VyCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgdGhlIE5hbWVzcGFjZU1hbmFnZXIuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlTlNNKCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZVRhYmxlIG50ID0gbmV3IE5hbWVUYWJsZSgpOworICAgICAgICAgICAgX25zTWFuYWdlciA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKG50KTsKKyAgICAgICAgICAgIF9uc01hbmFnZXIuQWRkTmFtZXNwYWNlKCJhIiwgRXhjZWxQYWNrYWdlLnNjaGVtYURyYXdpbmdzKTsKKyAgICAgICAgICAgIF9uc01hbmFnZXIuQWRkTmFtZXNwYWNlKCJ4ZHIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7CisgICAgICAgICAgICBfbnNNYW5hZ2VyLkFkZE5hbWVzcGFjZSgiYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgICBfbnNNYW5hZ2VyLkFkZE5hbWVzcGFjZSgiciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gYSBuYW1lc3BhY2UgbWFuYWdlciBpbnN0YW5jZSB0byBhbGxvdyBYUGF0aCBzZWFyY2hpbmcKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBfbnNNYW5hZ2VyPW51bGw7CisgICAgICAgIHB1YmxpYyBYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9uc01hbmFnZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoX2RyYXdpbmdzLkdldEVudW1lcmF0b3IoKSk7CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZTxFeGNlbERyYXdpbmc+IE1lbWJlcnMKKworICAgICAgICBJRW51bWVyYXRvcjxFeGNlbERyYXdpbmc+IElFbnVtZXJhYmxlPEV4Y2VsRHJhd2luZz4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoX2RyYXdpbmdzLkdldEVudW1lcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgZHJhd2luZyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUG9zaXRpb25JRCI+VGhlIHBvc2l0aW9uIG9mIHRoZSBkcmF3aW5nLiAwLWJhc2U8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nIHRoaXNbaW50IFBvc2l0aW9uSURdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoX2RyYXdpbmdzW1Bvc2l0aW9uSURdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGRyYXdpbmcgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmcgdGhpc1tzdHJpbmcgTmFtZV0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kcmF3aW5nTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzW19kcmF3aW5nTmFtZXNbTmFtZV1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2RyYXdpbmdzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5ncy5Db3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IF9wYXJ0PW51bGw7CisgICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcGFydDsKKyAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICB9CisgICAgICAgIFVyaSBfdXJpRHJhd2luZz1udWxsOworICAgICAgICBwdWJsaWMgVXJpIFVyaURyYXdpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF91cmlEcmF3aW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiBBZGQgZnVuY3Rpb25zCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gQWRkIGEgbmV3IGNoYXJ0IHRvIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgICAgICAvLy8gRG8gbm90IHN1cHBvcnQgQnViYmxlLSwgUmFkYXItLCBTdG9jay0gb3IgU3VyZmFjZSBjaGFydHMuIAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ2hhcnRUeXBlIj5UeXBlIG9mIGNoYXJ0PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGl2b3RUYWJsZVNvdXJjZSI+VGhlIHBpdm90dGFibGUgc291cmNlIGZvciBhIHBpdm90Y2hhcnQ8L3BhcmFtPiAgICAKKyAgICAgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2hhcnQ8L3JldHVybnM+CisgICAgICAgICAgICBwdWJsaWMgRXhjZWxDaGFydCBBZGRDaGFydChzdHJpbmcgTmFtZSwgZUNoYXJ0VHlwZSBDaGFydFR5cGUsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKF9kcmF3aW5nTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkcmF3aW5ncyBjb2xsZWN0aW9uIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN0b2NrSExDIHx8CisgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN0b2NrT0hMQyB8fAorICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5TdG9ja1ZPSExDKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJDaGFydCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFdvcmtzaGVldCBpcyBFeGNlbENoYXJ0c2hlZXQgJiYgX2RyYXdpbmdzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDaGFydCBXb3Jrc2hlZXRzIGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBjaGFydCIpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBkcmF3Tm9kZSA9IENyZWF0ZURyYXdpbmdYbWwoKTsKKworICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSBFeGNlbENoYXJ0LkdldE5ld0NoYXJ0KHRoaXMsIGRyYXdOb2RlLCBDaGFydFR5cGUsIG51bGwsIFBpdm90VGFibGVTb3VyY2UpOworICAgICAgICAgICAgICAgIGNoYXJ0Lk5hbWUgPSBOYW1lOworICAgICAgICAgICAgICAgIF9kcmF3aW5ncy5BZGQoY2hhcnQpOworICAgICAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuQWRkKE5hbWUsIF9kcmF3aW5ncy5Db3VudCAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBjaGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBBZGQgYSBuZXcgY2hhcnQgdG8gdGhlIHdvcmtzaGVldC4KKyAgICAgICAgICAgIC8vLyBEbyBub3Qgc3VwcG9ydCBCdWJibGUtLCBSYWRhci0sIFN0b2NrLSBvciBTdXJmYWNlIGNoYXJ0cy4gCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj48L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDaGFydFR5cGUiPlR5cGUgb2YgY2hhcnQ8L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjaGFydDwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0IEFkZENoYXJ0KHN0cmluZyBOYW1lLCBlQ2hhcnRUeXBlIENoYXJ0VHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWRkQ2hhcnQoTmFtZSwgQ2hhcnRUeXBlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBBZGQgYSBwaWN1cmUgdG8gdGhlIHdvcmtzaGVldAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW1hZ2UiPkFuIGltYWdlLiBBbGx3YXlzIHNhdmVkIGluIHRoZW4gSlBlZyBmb3JtYXQ8L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBFeGNlbFBpY3R1cmUgQWRkUGljdHVyZShzdHJpbmcgTmFtZSwgSW1hZ2UgaW1hZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gQWRkUGljdHVyZShOYW1lLCBpbWFnZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gQWRkIGEgcGljdXJlIHRvIHRoZSB3b3Jrc2hlZXQKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImltYWdlIj5BbiBpbWFnZS4gQWxsd2F5cyBzYXZlZCBpbiB0aGVuIEpQZWcgZm9ybWF0PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSHlwZXJsaW5rIj5QaWN0dXJlIEh5cGVybGluazwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICAgICAgcHVibGljIEV4Y2VsUGljdHVyZSBBZGRQaWN0dXJlKHN0cmluZyBOYW1lLCBJbWFnZSBpbWFnZSwgVXJpIEh5cGVybGluaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZHJhd2luZ05hbWVzLkNvbnRhaW5zS2V5KE5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkcmF3aW5ncyBjb2xsZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBkcmF3Tm9kZSA9IENyZWF0ZURyYXdpbmdYbWwoKTsKKyAgICAgICAgICAgICAgICAgICAgZHJhd05vZGUuU2V0QXR0cmlidXRlKCJlZGl0QXMiLCAib25lQ2VsbCIpOworICAgICAgICAgICAgICAgICAgICBFeGNlbFBpY3R1cmUgcGljID0gbmV3IEV4Y2VsUGljdHVyZSh0aGlzLCBkcmF3Tm9kZSwgaW1hZ2UsIEh5cGVybGluayk7CisgICAgICAgICAgICAgICAgICAgIHBpYy5OYW1lID0gTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgX2RyYXdpbmdzLkFkZChwaWMpOworICAgICAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzLkFkZChOYW1lLCBfZHJhd2luZ3MuQ291bnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkFkZFBpY3R1cmU6IEltYWdlIGNhbid0IGJlIG51bGwiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gQWRkIGEgcGljdXJlIHRvIHRoZSB3b3Jrc2hlZXQKKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkltYWdlRmlsZSI+VGhlIGltYWdlIGZpbGU8L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBFeGNlbFBpY3R1cmUgQWRkUGljdHVyZShzdHJpbmcgTmFtZSwgRmlsZUluZm8gSW1hZ2VGaWxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEFkZFBpY3R1cmUoTmFtZSwgSW1hZ2VGaWxlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBBZGQgYSBwaWN1cmUgdG8gdGhlIHdvcmtzaGVldAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW1hZ2VGaWxlIj5UaGUgaW1hZ2UgZmlsZTwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ikh5cGVybGluayI+UGljdHVyZSBIeXBlcmxpbms8L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBFeGNlbFBpY3R1cmUgQWRkUGljdHVyZShzdHJpbmcgTmFtZSwgRmlsZUluZm8gSW1hZ2VGaWxlLCBVcmkgSHlwZXJsaW5rKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChXb3Jrc2hlZXQgaXMgRXhjZWxDaGFydHNoZWV0ICYmIF9kcmF3aW5ncy5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2hhcnQgd29ya3NoZWV0cyBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgZHJhd2luZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoSW1hZ2VGaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoX2RyYXdpbmdOYW1lcy5Db250YWluc0tleShOYW1lKSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRyYXdpbmdzIGNvbGxlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZHJhd05vZGUgPSBDcmVhdGVEcmF3aW5nWG1sKCk7CisgICAgICAgICAgICAgICAgICBkcmF3Tm9kZS5TZXRBdHRyaWJ1dGUoImVkaXRBcyIsICJvbmVDZWxsIik7CisgICAgICAgICAgICAgICAgICBFeGNlbFBpY3R1cmUgcGljID0gbmV3IEV4Y2VsUGljdHVyZSh0aGlzLCBkcmF3Tm9kZSwgSW1hZ2VGaWxlLCBIeXBlcmxpbmspOworICAgICAgICAgICAgICAgICAgcGljLk5hbWUgPSBOYW1lOworICAgICAgICAgICAgICAgICAgX2RyYXdpbmdzLkFkZChwaWMpOworICAgICAgICAgICAgICAgICAgX2RyYXdpbmdOYW1lcy5BZGQoTmFtZSwgX2RyYXdpbmdzLkNvdW50IC0gMSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gcGljOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkFkZFBpY3R1cmU6IEltYWdlRmlsZSBjYW4ndCBiZSBudWxsIikpOworICAgICAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIG5ldyBzaGFwZSB0byB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+TmFtZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU3R5bGUiPlNoYXBlIHN0eWxlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBzaGFwZSBvYmplY3Q8L3JldHVybnM+CisgICAgCisgICAgICAgIHB1YmxpYyBFeGNlbFNoYXBlIEFkZFNoYXBlKHN0cmluZyBOYW1lLCBlU2hhcGVTdHlsZSBTdHlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCAmJiBfZHJhd2luZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNoYXJ0IHdvcmtzaGVldHMgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGRyYXdpbmciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKF9kcmF3aW5nTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkcmF3aW5ncyBjb2xsZWN0aW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZHJhd05vZGUgPSBDcmVhdGVEcmF3aW5nWG1sKCk7CisKKyAgICAgICAgICAgICAgICBFeGNlbFNoYXBlIHNoYXBlID0gbmV3IEV4Y2VsU2hhcGUodGhpcywgZHJhd05vZGUsIFN0eWxlKTsKKyAgICAgICAgICAgICAgICBzaGFwZS5OYW1lID0gTmFtZTsKKyAgICAgICAgICAgICAgICBzaGFwZS5TdHlsZSA9IFN0eWxlOworICAgICAgICAgICAgICAgIF9kcmF3aW5ncy5BZGQoc2hhcGUpOworICAgICAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuQWRkKE5hbWUsIF9kcmF3aW5ncy5Db3VudCAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBzaGFwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgbmV3IHNoYXBlIHRvIHRoZSB3b3Jrc2hlZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5OYW1lPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTb3VyY2UiPlNvdXJjZSBzaGFwZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc2hhcGUgb2JqZWN0PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxTaGFwZSBBZGRTaGFwZShzdHJpbmcgTmFtZSwgRXhjZWxTaGFwZSBTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChXb3Jrc2hlZXQgaXMgRXhjZWxDaGFydHNoZWV0ICYmIF9kcmF3aW5ncy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNoYXJ0IHdvcmtzaGVldHMgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGRyYXdpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfZHJhd2luZ05hbWVzLkNvbnRhaW5zS2V5KE5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRyYXdpbmdzIGNvbGxlY3Rpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhtbEVsZW1lbnQgZHJhd05vZGUgPSBDcmVhdGVEcmF3aW5nWG1sKCk7CisgICAgICAgICAgICBkcmF3Tm9kZS5Jbm5lclhtbCA9IFNvdXJjZS5Ub3BOb2RlLklubmVyWG1sOworCisgICAgICAgICAgICBFeGNlbFNoYXBlIHNoYXBlID0gbmV3IEV4Y2VsU2hhcGUodGhpcywgZHJhd05vZGUpOworICAgICAgICAgICAgc2hhcGUuTmFtZSA9IE5hbWU7CisgICAgICAgICAgICBzaGFwZS5TdHlsZSA9IFNvdXJjZS5TdHlsZTsKKyAgICAgICAgICAgIF9kcmF3aW5ncy5BZGQoc2hhcGUpOworICAgICAgICAgICAgX2RyYXdpbmdOYW1lcy5BZGQoTmFtZSwgX2RyYXdpbmdzLkNvdW50IC0gMSk7CisgICAgICAgICAgICByZXR1cm4gc2hhcGU7CisgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgWG1sRWxlbWVudCBDcmVhdGVEcmF3aW5nWG1sKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRHJhd2luZ1htbC5PdXRlclhtbCA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERyYXdpbmdYbWwuTG9hZFhtbChzdHJpbmcuRm9ybWF0KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+PHhkcjp3c0RyIHhtbG5zOnhkcj1cInswfVwiIHhtbG5zOmE9XCJ7MX1cIiAvPiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzLCBFeGNlbFBhY2thZ2Uuc2NoZW1hRHJhd2luZ3MpKTsKKyAgICAgICAgICAgICAgICAgICAgX3VyaURyYXdpbmcgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9kcmF3aW5ncy9kcmF3aW5nezB9LnhtbCIsIFdvcmtzaGVldC5TaGVldElEKSxVcmlLaW5kLlJlbGF0aXZlKTsKKworICAgICAgICAgICAgICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZSBwYWNrYWdlID0gV29ya3NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAgICAgICAgIF9wYXJ0ID0gcGFja2FnZS5DcmVhdGVQYXJ0KF91cmlEcmF3aW5nLCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmcreG1sIiwgX3BhY2thZ2UuQ29tcHJlc3Npb24pOworCisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1DaGFydCA9IG5ldyBTdHJlYW1Xcml0ZXIoX3BhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgICAgICAgICBEcmF3aW5nWG1sLlNhdmUoc3RyZWFtQ2hhcnQpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1DaGFydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLkZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICAgICAgX2RyYXdpbmdSZWxhdGlvbiA9IFdvcmtzaGVldC5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya3NoZWV0LldvcmtzaGVldFVyaSwgX3VyaURyYXdpbmcpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2RyYXdpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlID0gV29ya3NoZWV0LldvcmtzaGVldFhtbC5DcmVhdGVFbGVtZW50KCJkcmF3aW5nIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgICAgICBlLlNldEF0dHJpYnV0ZSgiaWQiLEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzLCBfZHJhd2luZ1JlbGF0aW9uLklkKTsKKworICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudC5BcHBlbmRDaGlsZChlKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5GbHVzaCgpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFhtbE5vZGUgY29sTm9kZSA9IF9kcmF3aW5nc1htbC5TZWxlY3RTaW5nbGVOb2RlKCIvL3hkcjp3c0RyIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBkcmF3Tm9kZTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5Xb3Jrc2hlZXQgaXMgRXhjZWxDaGFydHNoZWV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHJhd05vZGUgPSBfZHJhd2luZ3NYbWwuQ3JlYXRlRWxlbWVudCgieGRyIiwgImFic29sdXRlQW5jaG9yIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpOworICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IHBvc05vZGUgPSBfZHJhd2luZ3NYbWwuQ3JlYXRlRWxlbWVudCgieGRyIiwgInBvcyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zTm9kZS5TZXRBdHRyaWJ1dGUoInkiLCAiMCIpOworICAgICAgICAgICAgICAgICAgICBwb3NOb2RlLlNldEF0dHJpYnV0ZSgieCIsICIwIik7CisgICAgICAgICAgICAgICAgICAgIGRyYXdOb2RlLkFwcGVuZENoaWxkKHBvc05vZGUpOworICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGV4dE5vZGUgPSBfZHJhd2luZ3NYbWwuQ3JlYXRlRWxlbWVudCgieGRyIiwgImV4dCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0Tm9kZS5TZXRBdHRyaWJ1dGUoImN5IiwgIjYwNzI4NzYiKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0Tm9kZS5TZXRBdHRyaWJ1dGUoImN4IiwgIjkyOTkyNjMiKTsKKyAgICAgICAgICAgICAgICAgICAgZHJhd05vZGUuQXBwZW5kQ2hpbGQoZXh0Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbE5vZGUuQXBwZW5kQ2hpbGQoZHJhd05vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkcmF3Tm9kZSA9IF9kcmF3aW5nc1htbC5DcmVhdGVFbGVtZW50KCJ4ZHIiLCAidHdvQ2VsbEFuY2hvciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgY29sTm9kZS5BcHBlbmRDaGlsZChkcmF3Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgIC8vQWRkIGZyb20gcG9zaXRpb24gRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBmcm9tTm9kZSA9IF9kcmF3aW5nc1htbC5DcmVhdGVFbGVtZW50KCJ4ZHIiLCAiZnJvbSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgZHJhd05vZGUuQXBwZW5kQ2hpbGQoZnJvbU5vZGUpOworICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZS5Jbm5lclhtbCA9ICI8eGRyOmNvbD4wPC94ZHI6Y29sPjx4ZHI6Y29sT2ZmPjA8L3hkcjpjb2xPZmY+PHhkcjpyb3c+MDwveGRyOnJvdz48eGRyOnJvd09mZj4wPC94ZHI6cm93T2ZmPiI7CisKKyAgICAgICAgICAgICAgICAgICAgLy9BZGQgdG8gcG9zaXRpb24gRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCB0b05vZGUgPSBfZHJhd2luZ3NYbWwuQ3JlYXRlRWxlbWVudCgieGRyIiwgInRvIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpOworICAgICAgICAgICAgICAgICAgICBkcmF3Tm9kZS5BcHBlbmRDaGlsZCh0b05vZGUpOworICAgICAgICAgICAgICAgICAgICB0b05vZGUuSW5uZXJYbWwgPSAiPHhkcjpjb2w+MTA8L3hkcjpjb2w+PHhkcjpjb2xPZmY+MDwveGRyOmNvbE9mZj48eGRyOnJvdz4xMDwveGRyOnJvdz48eGRyOnJvd09mZj4wPC94ZHI6cm93T2ZmPiI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdOb2RlOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gUmVtb3ZlIG1ldGhvZHMKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBSZW1vdmVzIGEgZHJhd2luZy4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGRyYXdpbmc8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoaW50IEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCAmJiBfZHJhd2luZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4nIHJlbW92ZSBjaGFydHMgZnJvbSBjaGFydCB3b3Jrc2hlZXRzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZW1vdmVEcmF3aW5nKEluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHZvaWQgUmVtb3ZlRHJhd2luZyhpbnQgSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkcmF3ID0gX2RyYXdpbmdzW0luZGV4XTsKKyAgICAgICAgICAgIGRyYXcuRGVsZXRlTWUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBJbmRleCArIDE7IGkgPCBfZHJhd2luZ3MuQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzW19kcmF3aW5nc1tpXS5OYW1lXS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2RyYXdpbmdOYW1lcy5SZW1vdmUoZHJhdy5OYW1lKTsKKyAgICAgICAgICAgIF9kcmF3aW5ncy5SZW1vdmUoZHJhdyk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyBhIGRyYXdpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRHJhd2luZyI+VGhlIGRyYXdpbmc8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxEcmF3aW5nIERyYXdpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlbW92ZShfZHJhd2luZ05hbWVzW0RyYXdpbmcuTmFtZV0pOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgYSBkcmF3aW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSBkcmF3aW5nPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKHN0cmluZyBOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdmUoX2RyYXdpbmdOYW1lc1tOYW1lXSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyBhbGwgZHJhd2luZ3MgZnJvbSB0aGUgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChXb3Jrc2hlZXQgaXMgRXhjZWxDaGFydHNoZWV0ICYmIF9kcmF3aW5ncy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbicgcmVtb3ZlIGNoYXJ0cyBmcm9tIGNoYXJ0IHdvcmtzaGVldHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsZWFyRHJhd2luZ3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHZvaWQgQ2xlYXJEcmF3aW5ncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChDb3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVtb3ZlRHJhd2luZygwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIEFkanVzdFdpZHRoKGludFssXSBwb3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGl4ID0gMDsKKyAgICAgICAgICAgICAgICAvL05vdyBzZXQgdGhlIHNpemUgZm9yIGFsbCBkcmF3aW5ncyBkZXBlbmRpbmcgb24gdGhlIGVkaXRBcyBwcm9wZXJ0eS4KKyAgICAgICAgICAgICAgICBmb3JlYWNoIChPZmZpY2VPcGVuWG1sLkRyYXdpbmcuRXhjZWxEcmF3aW5nIGQgaW4gdGhpcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLkVkaXRBcyAhPSBEcmF3aW5nLmVFZGl0QXMuVHdvQ2VsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuRWRpdEFzID09IERyYXdpbmcuZUVkaXRBcy5BYnNvbHV0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLlNldFBpeGVsTGVmdChwb3NbaXgsIDBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGQuU2V0UGl4ZWxXaWR0aChwb3NbaXgsIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGp1c3RIZWlnaHQoaW50WyxdIHBvcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaXggPSAwOworICAgICAgICAgICAgICAgIC8vTm93IHNldCB0aGUgc2l6ZSBmb3IgYWxsIGRyYXdpbmdzIGRlcGVuZGluZyBvbiB0aGUgZWRpdEFzIHByb3BlcnR5LgorICAgICAgICAgICAgICAgIGZvcmVhY2ggKE9mZmljZU9wZW5YbWwuRHJhd2luZy5FeGNlbERyYXdpbmcgZCBpbiB0aGlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQuRWRpdEFzICE9IERyYXdpbmcuZUVkaXRBcy5Ud29DZWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5FZGl0QXMgPT0gRHJhd2luZy5lRWRpdEFzLkFic29sdXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuU2V0UGl4ZWxUb3AocG9zW2l4LCAwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkLlNldFBpeGVsSGVpZ2h0KHBvc1tpeCwgMV0pOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBpbnRbLF0gR2V0RHJhd2luZ1dpZHRocygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50WyxdIHBvcyA9IG5ldyBpbnRbQ291bnQsIDJdOworICAgICAgICAgICAgICAgIGludCBpeCA9IDA7CisgICAgICAgICAgICAgICAgLy9TYXZlIHRoZSBzaXplIGZvciBhbGwgZHJhd2luZ3MKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChFeGNlbERyYXdpbmcgZCBpbiB0aGlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2l4LCAwXSA9IGQuR2V0UGl4ZWxMZWZ0KCk7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpeCsrLCAxXSA9IGQuR2V0UGl4ZWxXaWR0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgaW50WyxdIEdldERyYXdpbmdIZWlnaHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludFssXSBwb3MgPSBuZXcgaW50W0NvdW50LCAyXTsKKyAgICAgICAgICAgICAgICBpbnQgaXggPSAwOworICAgICAgICAgICAgICAgIC8vU2F2ZSB0aGUgc2l6ZSBmb3IgYWxsIGRyYXdpbmdzCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxEcmF3aW5nIGQgaW4gdGhpcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpeCwgMF0gPSBkLkdldFBpeGVsVG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpeCsrLCAxXSA9IGQuR2V0UGl4ZWxIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RyYXdpbmdzWG1sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfaGFzaGVzLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgX2hhc2hlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgX3BhcnQgPSBudWxsOworICAgICAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfZHJhd2luZ1JlbGF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiBfZHJhd2luZ3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2RyYXdpbmdzLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgX2RyYXdpbmdzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbFBpY3R1cmUuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbFBpY3R1cmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4YThiNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsUGljdHVyZS5jcwpAQCAtMCwwICsxLDQwOCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZy5JbWFnaW5nOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gaW1hZ2Ugb2JqZWN0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGljdHVyZSA6IEV4Y2VsRHJhd2luZworICAgIHsKKyAgICAgICAgI3JlZ2lvbiAiQ29uc3RydWN0b3JzIgorICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOnBpYy94ZHI6bnZQaWNQci94ZHI6Y052UHIvQG5hbWUiKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxOb2RlIHBpY05vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpwaWMveGRyOmJsaXBGaWxsL2E6YmxpcCIsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKHBpY05vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWxQaWMgPSBkcmF3aW5ncy5QYXJ0LkdldFJlbGF0aW9uc2hpcChwaWNOb2RlLkF0dHJpYnV0ZXNbInI6ZW1iZWQiXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgVXJpUGljID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKGRyYXdpbmdzLlVyaURyYXdpbmcsIFJlbFBpYy5UYXJnZXRVcmkpOworCisgICAgICAgICAgICAgICAgUGFydCA9IGRyYXdpbmdzLlBhcnQuUGFja2FnZS5HZXRQYXJ0KFVyaVBpYyk7CisgICAgICAgICAgICAgICAgRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyhVcmlQaWMuT3JpZ2luYWxTdHJpbmcpOworICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0gR2V0Q29udGVudFR5cGUoZi5FeHRlbnNpb24pOworICAgICAgICAgICAgICAgIF9pbWFnZSA9IEltYWdlLkZyb21TdHJlYW0oUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWM9bmV3IEltYWdlQ29udmVydGVyKCk7CisgICAgICAgICAgICAgICAgdmFyIGlieT0oYnl0ZVtdKWljLkNvbnZlcnRUbyhfaW1hZ2UsIHR5cGVvZihieXRlW10pKTsKKyAgICAgICAgICAgICAgICB2YXIgaWkgPSBfZHJhd2luZ3MuX3BhY2thZ2UuTG9hZEltYWdlKGlieSwgVXJpUGljLCBQYXJ0KTsKKyAgICAgICAgICAgICAgICBJbWFnZUhhc2ggPSBpaS5IYXNoOworCisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gR2V0WG1sTm9kZVN0cmluZygieGRyOnBpYy94ZHI6bnZQaWNQci94ZHI6Y052UHIvYTpobGlua0NsaWNrL0ByOmlkIik7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJRCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBIeXBSZWwgPSBkcmF3aW5ncy5QYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChIeXBSZWwuVGFyZ2V0VXJpLklzQWJzb2x1dGVVcmkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9oeXBlcmxpbmsgPSBuZXcgRXhjZWxIeXBlckxpbmsoSHlwUmVsLlRhcmdldFVyaS5BYnNvbHV0ZVVyaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfaHlwZXJsaW5rID0gbmV3IEV4Y2VsSHlwZXJMaW5rKEh5cFJlbC5UYXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcsIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgoRXhjZWxIeXBlckxpbmspX2h5cGVybGluaykuVG9vbFRpcCA9IEdldFhtbE5vZGVTdHJpbmcoInhkcjpwaWMveGRyOm52UGljUHIveGRyOmNOdlByL2E6aGxpbmtDbGljay9AdG9vbHRpcCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBJbWFnZSBpbWFnZSkgOgorICAgICAgICAgICB0aGlzKGRyYXdpbmdzLCBub2RlLCBpbWFnZSwgbnVsbCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsUGljdHVyZShFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIEltYWdlIGltYWdlLCBVcmkgaHlwZXJsaW5rKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOnBpYy94ZHI6bnZQaWNQci94ZHI6Y052UHIvQG5hbWUiKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxFbGVtZW50IHBpY05vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgieGRyIiwgInBpYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgIG5vZGUuSW5zZXJ0QWZ0ZXIocGljTm9kZSxub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjp0byIsTmFtZVNwYWNlTWFuYWdlcikpOworICAgICAgICAgICAgX2h5cGVybGluayA9IGh5cGVybGluazsKKyAgICAgICAgICAgIHBpY05vZGUuSW5uZXJYbWwgPSBQaWNTdGFydFhtbCgpOworCisgICAgICAgICAgICBub2RlLkluc2VydEFmdGVyKG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJ4ZHIiLCAiY2xpZW50RGF0YSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKSwgcGljTm9kZSk7CisKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gZHJhd2luZ3MuV29ya3NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAvL0dldCB0aGUgcGljdHVyZSBpZiBpdCBleGlzdHMgb3Igc2F2ZSBpdCBpZiBub3QuCisgICAgICAgICAgICBfaW1hZ2UgPSBpbWFnZTsKKyAgICAgICAgICAgIHN0cmluZyByZWxJRCA9IFNhdmVQaWN0dXJlKGltYWdlKTsKKworICAgICAgICAgICAgLy9DcmVhdGUgcmVsYXRpb25zaGlwCisgICAgICAgICAgICBub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpwaWMveGRyOmJsaXBGaWxsL2E6YmxpcC9AcjplbWJlZCIsIE5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gcmVsSUQ7CisKKyAgICAgICAgICAgIFNldFBvc0RlZmF1bHRzKGltYWdlKTsKKyAgICAgICAgICAgIHBhY2thZ2UuRmx1c2goKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBGaWxlSW5mbyBpbWFnZUZpbGUpIDoKKyAgICAgICAgICAgdGhpcyhkcmF3aW5ncyxub2RlLGltYWdlRmlsZSxudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaWN0dXJlKEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgRmlsZUluZm8gaW1hZ2VGaWxlLCBVcmkgaHlwZXJsaW5rKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOnBpYy94ZHI6bnZQaWNQci94ZHI6Y052UHIvQG5hbWUiKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxFbGVtZW50IHBpY05vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgieGRyIiwgInBpYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgIG5vZGUuSW5zZXJ0QWZ0ZXIocGljTm9kZSwgbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6dG8iLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICBfaHlwZXJsaW5rID0gaHlwZXJsaW5rOworICAgICAgICAgICAgcGljTm9kZS5Jbm5lclhtbCA9IFBpY1N0YXJ0WG1sKCk7CisKKyAgICAgICAgICAgIG5vZGUuSW5zZXJ0QWZ0ZXIobm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInhkciIsICJjbGllbnREYXRhIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpLCBwaWNOb2RlKTsKKworICAgICAgICAgICAgLy9DaGFuZ2VkIHRvIHN0cmVhbSAyLzQtMTMgKGlzc3VlIDE0ODM0KS4gVGhueCBTQ2xhdXNlCisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IGRyYXdpbmdzLldvcmtzaGVldC5fcGFja2FnZS5QYWNrYWdlOworICAgICAgICAgICAgQ29udGVudFR5cGUgPSBHZXRDb250ZW50VHlwZShpbWFnZUZpbGUuRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHZhciBpbWFnZXN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKGltYWdlRmlsZS5GdWxsTmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKTsKKyAgICAgICAgICAgIF9pbWFnZSA9IEltYWdlLkZyb21TdHJlYW0oaW1hZ2VzdHJlYW0pOworICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKKyAgICAgICAgICAgIHZhciBpbWcgPSAoYnl0ZVtdKWljLkNvbnZlcnRUbyhfaW1hZ2UsIHR5cGVvZihieXRlW10pKTsKKyAgICAgICAgICAgIGltYWdlc3RyZWFtLkNsb3NlKCk7CisKKyAgICAgICAgICAgIFVyaVBpYyA9IEdldE5ld1VyaShwYWNrYWdlLCAiL3hsL21lZGlhL3swfSIgKyBpbWFnZUZpbGUuTmFtZSk7CisgICAgICAgICAgICB2YXIgaWkgPSBfZHJhd2luZ3MuX3BhY2thZ2UuQWRkSW1hZ2UoaW1nLCBVcmlQaWMsIENvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIHN0cmluZyByZWxJRDsKKyAgICAgICAgICAgIGlmKCFkcmF3aW5ncy5faGFzaGVzLkNvbnRhaW5zS2V5KGlpLkhhc2gpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhcnQgPSBpaS5QYXJ0OworICAgICAgICAgICAgICAgIFJlbFBpYyA9IGRyYXdpbmdzLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShkcmF3aW5ncy5VcmlEcmF3aW5nLCBpaS5VcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2ltYWdlIik7CisgICAgICAgICAgICAgICAgcmVsSUQgPSBSZWxQaWMuSWQ7CisgICAgICAgICAgICAgICAgX2RyYXdpbmdzLl9oYXNoZXMuQWRkKGlpLkhhc2gsIHJlbElEKTsKKyAgICAgICAgICAgICAgICBBZGROZXdQaWN0dXJlKGltZywgcmVsSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbElEID0gZHJhd2luZ3MuX2hhc2hlc1tpaS5IYXNoXTsKKyAgICAgICAgICAgICAgICB2YXIgcmVsID0gX2RyYXdpbmdzLlBhcnQuR2V0UmVsYXRpb25zaGlwKHJlbElEKTsKKyAgICAgICAgICAgICAgICBVcmlQaWMgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbWFnZUhhc2ggPSBpaS5IYXNoOworICAgICAgICAgICAgU2V0UG9zRGVmYXVsdHMoSW1hZ2UpOworICAgICAgICAgICAgLy9DcmVhdGUgcmVsYXRpb25zaGlwCisgICAgICAgICAgICBub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpwaWMveGRyOmJsaXBGaWxsL2E6YmxpcC9AcjplbWJlZCIsIE5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gcmVsSUQ7CisgICAgICAgICAgICBwYWNrYWdlLkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldENvbnRlbnRUeXBlKHN0cmluZyBleHRlbnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXh0ZW5zaW9uLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiLmJtcCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgImltYWdlL2JtcCI7CisgICAgICAgICAgICAgICAgY2FzZSAiLmpwZyI6CisgICAgICAgICAgICAgICAgY2FzZSAiLmpwZWciOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL2pwZWciOworICAgICAgICAgICAgICAgIGNhc2UgIi5naWYiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL2dpZiI7CisgICAgICAgICAgICAgICAgY2FzZSAiLnBuZyI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvcG5nIjsKKyAgICAgICAgICAgICAgICBjYXNlICIuY2dtIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS9jZ20iOworICAgICAgICAgICAgICAgIGNhc2UgIi5lbWYiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL3gtZW1mIjsKKyAgICAgICAgICAgICAgICBjYXNlICIuZXBzIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS94LWVwcyI7CisgICAgICAgICAgICAgICAgY2FzZSAiLnBjeCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UveC1wY3giOworICAgICAgICAgICAgICAgIGNhc2UgIi50Z2EiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL3gtdGdhIjsKKyAgICAgICAgICAgICAgICBjYXNlICIudGlmIjoKKyAgICAgICAgICAgICAgICBjYXNlICIudGlmZiI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UveC10aWZmIjsKKyAgICAgICAgICAgICAgICBjYXNlICIud21mIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS94LXdtZiI7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS9qcGVnIjsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vQWRkIGEgbmV3IGltYWdlIHRvIHRoZSBjb21wYXJlIGNvbGxlY3Rpb24KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZE5ld1BpY3R1cmUoYnl0ZVtdIGltZywgc3RyaW5nIHJlbElEKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbmV3UGljID0gbmV3IEV4Y2VsRHJhd2luZ3MuSW1hZ2VDb21wYXJlKCk7CisgICAgICAgICAgICBuZXdQaWMuaW1hZ2UgPSBpbWc7CisgICAgICAgICAgICBuZXdQaWMucmVsSUQgPSByZWxJRDsKKyAgICAgICAgICAgIC8vX2RyYXdpbmdzLl9waWNzLkFkZChuZXdQaWMpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2F2ZVBpY3R1cmUoSW1hZ2UgaW1hZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7CisgICAgICAgICAgICBieXRlW10gaW1nID0gKGJ5dGVbXSlpYy5Db252ZXJ0VG8oaW1hZ2UsIHR5cGVvZihieXRlW10pKTsKKyAgICAgICAgICAgIHZhciBpaSA9IF9kcmF3aW5ncy5fcGFja2FnZS5BZGRJbWFnZShpbWcpOworCisgICAgICAgICAgICBJbWFnZUhhc2ggPSBpaS5IYXNoOworICAgICAgICAgICAgaWYgKF9kcmF3aW5ncy5faGFzaGVzLkNvbnRhaW5zS2V5KGlpLkhhc2gpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZWxJRCA9IF9kcmF3aW5ncy5faGFzaGVzW2lpLkhhc2hdOworICAgICAgICAgICAgICAgIHZhciByZWwgPSBfZHJhd2luZ3MuUGFydC5HZXRSZWxhdGlvbnNoaXAocmVsSUQpOworICAgICAgICAgICAgICAgIFVyaVBpYyA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVsSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXJpUGljID0gaWkuVXJpOworICAgICAgICAgICAgICAgIEltYWdlSGFzaCA9IGlpLkhhc2g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vU2V0IHRoZSBJbWFnZSBhbmQgc2F2ZSBpdCB0byB0aGUgcGFja2FnZS4KKyAgICAgICAgICAgIFJlbFBpYyA9IF9kcmF3aW5ncy5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoX2RyYXdpbmdzLlVyaURyYXdpbmcsIFVyaVBpYyksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9BZGROZXdQaWN0dXJlKGltZywgcGljUmVsYXRpb24uSWQpOworICAgICAgICAgICAgX2RyYXdpbmdzLl9oYXNoZXMuQWRkKGlpLkhhc2gsIFJlbFBpYy5JZCk7CisKKyAgICAgICAgICAgIHJldHVybiBSZWxQaWMuSWQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFBvc0RlZmF1bHRzKEltYWdlIGltYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBFZGl0QXMgPSBlRWRpdEFzLk9uZUNlbGw7CisgICAgICAgICAgICBTZXRQaXhlbFdpZHRoKGltYWdlLldpZHRoLCBpbWFnZS5Ib3Jpem9udGFsUmVzb2x1dGlvbik7CisgICAgICAgICAgICBTZXRQaXhlbEhlaWdodChpbWFnZS5IZWlnaHQsIGltYWdlLlZlcnRpY2FsUmVzb2x1dGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBQaWNTdGFydFhtbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgeG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeG1sLkFwcGVuZCgiPHhkcjpudlBpY1ByPiIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoX2h5cGVybGluayA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjx4ZHI6Y052UHIgaWQ9XCJ7MH1cIiBkZXNjcj1cIlwiIC8+IiwgX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIEh5cFJlbCA9IF9kcmF3aW5ncy5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChfaHlwZXJsaW5rLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5FeHRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYUh5cGVybGluayk7CisgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8eGRyOmNOdlByIGlkPVwiezB9XCIgZGVzY3I9XCJcIj4iLCBfaWQpOworICAgICAgICAgICAgICAgaWYgKEh5cFJlbCAhPSBudWxsKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmIChfaHlwZXJsaW5rIGlzIEV4Y2VsSHlwZXJMaW5rKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPGE6aGxpbmtDbGljayB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiIHI6aWQ9XCJ7MH1cIiB0b29sdGlwPVwiezF9XCIvPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSHlwUmVsLklkLCAoKEV4Y2VsSHlwZXJMaW5rKV9oeXBlcmxpbmspLlRvb2xUaXApOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8YTpobGlua0NsaWNrIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgcjppZD1cInswfVwiIC8+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIeXBSZWwuSWQpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHhtbC5BcHBlbmQoIjwveGRyOmNOdlByPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgICAgIHhtbC5BcHBlbmQoIjx4ZHI6Y052UGljUHI+PGE6cGljTG9ja3Mgbm9DaGFuZ2VBc3BlY3Q9XCIxXCIgLz48L3hkcjpjTnZQaWNQcj48L3hkcjpudlBpY1ByPjx4ZHI6YmxpcEZpbGw+PGE6YmxpcCB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiIHI6ZW1iZWQ9XCJcIiBjc3RhdGU9XCJwcmludFwiIC8+PGE6c3RyZXRjaD48YTpmaWxsUmVjdCAvPiA8L2E6c3RyZXRjaD4gPC94ZHI6YmxpcEZpbGw+IDx4ZHI6c3BQcj4gPGE6eGZybT4gPGE6b2ZmIHg9XCIwXCIgeT1cIjBcIiAvPiAgPGE6ZXh0IGN4PVwiMFwiIGN5PVwiMFwiIC8+IDwvYTp4ZnJtPiA8YTpwcnN0R2VvbSBwcnN0PVwicmVjdFwiPiA8YTphdkxzdCAvPiA8L2E6cHJzdEdlb20+IDwveGRyOnNwUHI+Iik7CisKKyAgICAgICAgICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0cmluZyBJbWFnZUhhc2ggeyBnZXQ7IHNldDsgfQorICAgICAgICBJbWFnZSBfaW1hZ2UgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgSW1hZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEltYWdlIEltYWdlIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2ltYWdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW1hZ2UgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxJRCA9IFNhdmVQaWN0dXJlKHZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGUgcmVsYXRpb25zaGlwCisgICAgICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpwaWMveGRyOmJsaXBGaWxsL2E6YmxpcC9AcjplbWJlZCIsIE5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gcmVsSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvL19pbWFnZS5TYXZlKFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSksIF9pbWFnZUZvcm1hdCk7ICAgLy9BbHdheXMgSlBFRyBoZXJlIGF0IHRoaXMgcG9pbnQuIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiQ2FuJ3Qgc2F2ZSBpbWFnZSAtICIgKyBleC5NZXNzYWdlLCBleCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEltYWdlRm9ybWF0IF9pbWFnZUZvcm1hdD1JbWFnZUZvcm1hdC5KcGVnOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbWFnZSBmb3JtYXQKKyAgICAgICAgLy8vIElmIHRoZSBwaWN0dXJlIGlzIGNyZWF0ZWQgZnJvbSBhbiBJbWFnZSB0aGlzIHR5cGUgaXMgYWx3YXlzIEpwZWcKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEltYWdlRm9ybWF0IEltYWdlRm9ybWF0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW1hZ2VGb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW1hZ2VGb3JtYXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQ29udGVudFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgaW4gcGVyY2VudCBmcm9tIHRoZSBvcmdpbmFsIHNpemUKKyAgICAgICAgLy8vIE5vdGUgdGhhdCByZXNpemluZyBjb2x1bW5zIC8gcm93cyBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZWZmZWN0IHRoZSBzaXplIG9mIHRoZSBwaWN0dXJlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGVyY2VudCI+UGVyY2VudDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldFNpemUoaW50IFBlcmNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKEltYWdlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZS5TZXRTaXplKFBlcmNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IEltYWdlLldpZHRoOworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBJbWFnZS5IZWlnaHQ7CisKKyAgICAgICAgICAgICAgICB3aWR0aCA9IChpbnQpKHdpZHRoICogKChkZWNpbWFsKVBlcmNlbnQgLyAxMDApKTsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSAoaW50KShoZWlnaHQgKiAoKGRlY2ltYWwpUGVyY2VudCAvIDEwMCkpOworCisgICAgICAgICAgICAgICAgU2V0UGl4ZWxXaWR0aCh3aWR0aCwgSW1hZ2UuSG9yaXpvbnRhbFJlc29sdXRpb24pOworICAgICAgICAgICAgICAgIFNldFBpeGVsSGVpZ2h0KGhlaWdodCwgSW1hZ2UuVmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBVcmkgVXJpUGljIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VSZWxhdGlvbnNoaXAgUmVsUGljIHtnZXQ7IHNldDt9CisgICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUmVsYXRpb25zaGlwIEh5cFJlbCB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0OworCisgICAgICAgIGludGVybmFsIG5ldyBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE5hbWU7IH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmlsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAieGRyOnBpYy94ZHI6c3BQciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCb3JkZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJ4ZHI6cGljL3hkcjpzcFByL2E6bG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFVyaSBfaHlwZXJsaW5rID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSHlwZXJsaW5rCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBVcmkgSHlwZXJsaW5rCisgICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcmV0dXJuIF9oeXBlcmxpbms7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIERlbGV0ZU1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2RyYXdpbmdzLl9wYWNrYWdlLlJlbW92ZUltYWdlKEltYWdlSGFzaCk7CisgICAgICAgICAgICBiYXNlLkRlbGV0ZU1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuRGlzcG9zZSgpOworICAgICAgICAgICAgX2h5cGVybGluayA9IG51bGw7CisgICAgICAgICAgICBfaW1hZ2UuRGlzcG9zZSgpOworICAgICAgICAgICAgX2ltYWdlID0gbnVsbDsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbFNoYXBlLmNzIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxTaGFwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM4MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxTaGFwZS5jcwpAQCAtMCwwICsxLDU1MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOworLy8vIDxzdW1tYXJ5PgorLy8vIFNoYXBlIHN0eWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZVNoYXBlU3R5bGUKK3sKKyAgICBBY2NlbnRCb3JkZXJDYWxsb3V0MSwKKyAgICBBY2NlbnRCb3JkZXJDYWxsb3V0MiwKKyAgICBBY2NlbnRCb3JkZXJDYWxsb3V0MywKKyAgICBBY2NlbnRDYWxsb3V0MSwKKyAgICBBY2NlbnRDYWxsb3V0MiwKKyAgICBBY2NlbnRDYWxsb3V0MywKKyAgICBBY3Rpb25CdXR0b25CYWNrUHJldmlvdXMsCisgICAgQWN0aW9uQnV0dG9uQmVnaW5uaW5nLAorICAgIEFjdGlvbkJ1dHRvbkJsYW5rLAorICAgIEFjdGlvbkJ1dHRvbkRvY3VtZW50LAorICAgIEFjdGlvbkJ1dHRvbkVuZCwKKyAgICBBY3Rpb25CdXR0b25Gb3J3YXJkTmV4dCwKKyAgICBBY3Rpb25CdXR0b25IZWxwLAorICAgIEFjdGlvbkJ1dHRvbkhvbWUsCisgICAgQWN0aW9uQnV0dG9uSW5mb3JtYXRpb24sCisgICAgQWN0aW9uQnV0dG9uTW92aWUsCisgICAgQWN0aW9uQnV0dG9uUmV0dXJuLAorICAgIEFjdGlvbkJ1dHRvblNvdW5kLAorICAgIEFyYywKKyAgICBCZW50QXJyb3csCisgICAgQmVudENvbm5lY3RvcjIsCisgICAgQmVudENvbm5lY3RvcjMsCisgICAgQmVudENvbm5lY3RvcjQsCisgICAgQmVudENvbm5lY3RvcjUsCisgICAgQmVudFVwQXJyb3csCisgICAgQmV2ZWwsCisgICAgQmxvY2tBcmMsCisgICAgQm9yZGVyQ2FsbG91dDEsCisgICAgQm9yZGVyQ2FsbG91dDIsCisgICAgQm9yZGVyQ2FsbG91dDMsCisgICAgQnJhY2VQYWlyLAorICAgIEJyYWNrZXRQYWlyLAorICAgIENhbGxvdXQxLAorICAgIENhbGxvdXQyLAorICAgIENhbGxvdXQzLAorICAgIENhbiwKKyAgICBDaGFydFBsdXMsCisgICAgQ2hhcnRTdGFyLAorICAgIENoYXJ0WCwKKyAgICBDaGV2cm9uLAorICAgIENob3JkLAorICAgIENpcmN1bGFyQXJyb3csCisgICAgQ2xvdWQsCisgICAgQ2xvdWRDYWxsb3V0LAorICAgIENvcm5lciwKKyAgICBDb3JuZXJUYWJzLAorICAgIEN1YmUsCisgICAgQ3VydmVkQ29ubmVjdG9yMiwKKyAgICBDdXJ2ZWRDb25uZWN0b3IzLAorICAgIEN1cnZlZENvbm5lY3RvcjQsCisgICAgQ3VydmVkQ29ubmVjdG9yNSwKKyAgICBDdXJ2ZWREb3duQXJyb3csCisgICAgQ3VydmVkTGVmdEFycm93LAorICAgIEN1cnZlZFJpZ2h0QXJyb3csCisgICAgQ3VydmVkVXBBcnJvdywKKyAgICBEZWNhZ29uLAorICAgIERpYWdTdHJpcGUsCisgICAgRGlhbW9uZCwKKyAgICBEb2RlY2Fnb24sCisgICAgRG9udXQsCisgICAgRG91YmxlV2F2ZSwKKyAgICBEb3duQXJyb3csCisgICAgRG93bkFycm93Q2FsbG91dCwKKyAgICBFbGxpcHNlLAorICAgIEVsbGlwc2VSaWJib24sCisgICAgRWxsaXBzZVJpYmJvbjIsCisgICAgRmxvd0NoYXJ0QWx0ZXJuYXRlUHJvY2VzcywKKyAgICBGbG93Q2hhcnRDb2xsYXRlLAorICAgIEZsb3dDaGFydENvbm5lY3RvciwKKyAgICBGbG93Q2hhcnREZWNpc2lvbiwKKyAgICBGbG93Q2hhcnREZWxheSwKKyAgICBGbG93Q2hhcnREaXNwbGF5LAorICAgIEZsb3dDaGFydERvY3VtZW50LAorICAgIEZsb3dDaGFydEV4dHJhY3QsCisgICAgRmxvd0NoYXJ0SW5wdXRPdXRwdXQsCisgICAgRmxvd0NoYXJ0SW50ZXJuYWxTdG9yYWdlLAorICAgIEZsb3dDaGFydE1hZ25ldGljRGlzaywKKyAgICBGbG93Q2hhcnRNYWduZXRpY0RydW0sCisgICAgRmxvd0NoYXJ0TWFnbmV0aWNUYXBlLAorICAgIEZsb3dDaGFydE1hbnVhbElucHV0LAorICAgIEZsb3dDaGFydE1hbnVhbE9wZXJhdGlvbiwKKyAgICBGbG93Q2hhcnRNZXJnZSwKKyAgICBGbG93Q2hhcnRNdWx0aWRvY3VtZW50LAorICAgIEZsb3dDaGFydE9mZmxpbmVTdG9yYWdlLAorICAgIEZsb3dDaGFydE9mZnBhZ2VDb25uZWN0b3IsCisgICAgRmxvd0NoYXJ0T25saW5lU3RvcmFnZSwKKyAgICBGbG93Q2hhcnRPciwKKyAgICBGbG93Q2hhcnRQcmVkZWZpbmVkUHJvY2VzcywKKyAgICBGbG93Q2hhcnRQcmVwYXJhdGlvbiwKKyAgICBGbG93Q2hhcnRQcm9jZXNzLAorICAgIEZsb3dDaGFydFB1bmNoZWRDYXJkLAorICAgIEZsb3dDaGFydFB1bmNoZWRUYXBlLAorICAgIEZsb3dDaGFydFNvcnQsCisgICAgRmxvd0NoYXJ0U3VtbWluZ0p1bmN0aW9uLAorICAgIEZsb3dDaGFydFRlcm1pbmF0b3IsCisgICAgRm9sZGVkQ29ybmVyLAorICAgIEZyYW1lLAorICAgIEZ1bm5lbCwKKyAgICBHZWFyNiwKKyAgICBHZWFyOSwKKyAgICBIYWxmRnJhbWUsCisgICAgSGVhcnQsCisgICAgSGVwdGFnb24sCisgICAgSGV4YWdvbiwKKyAgICBIb21lUGxhdGUsCisgICAgSG9yaXpvbnRhbFNjcm9sbCwKKyAgICBJcnJlZ3VsYXJTZWFsMSwKKyAgICBJcnJlZ3VsYXJTZWFsMiwKKyAgICBMZWZ0QXJyb3csCisgICAgTGVmdEFycm93Q2FsbG91dCwKKyAgICBMZWZ0QnJhY2UsCisgICAgTGVmdEJyYWNrZXQsCisgICAgTGVmdENpcmN1bGFyQXJyb3csCisgICAgTGVmdFJpZ2h0QXJyb3csCisgICAgTGVmdFJpZ2h0QXJyb3dDYWxsb3V0LAorICAgIExlZnRSaWdodENpcmN1bGFyQXJyb3csCisgICAgTGVmdFJpZ2h0UmliYm9uLAorICAgIExlZnRSaWdodFVwQXJyb3csCisgICAgTGVmdFVwQXJyb3csCisgICAgTGlnaHRuaW5nQm9sdCwKKyAgICBMaW5lLAorICAgIExpbmVJbnYsCisgICAgTWF0aERpdmlkZSwKKyAgICBNYXRoRXF1YWwsCisgICAgTWF0aE1pbnVzLAorICAgIE1hdGhNdWx0aXBseSwKKyAgICBNYXRoTm90RXF1YWwsCisgICAgTWF0aFBsdXMsCisgICAgTW9vbiwKKyAgICBOb25Jc29zY2VsZXNUcmFwZXpvaWQsCisgICAgTm9TbW9raW5nLAorICAgIE5vdGNoZWRSaWdodEFycm93LAorICAgIE9jdGFnb24sCisgICAgUGFyYWxsZWxvZ3JhbSwKKyAgICBQZW50YWdvbiwKKyAgICBQaWUsCisgICAgUGllV2VkZ2UsCisgICAgUGxhcXVlLAorICAgIFBsYXF1ZVRhYnMsCisgICAgUGx1cywKKyAgICBRdWFkQXJyb3csCisgICAgUXVhZEFycm93Q2FsbG91dCwKKyAgICBSZWN0LAorICAgIFJpYmJvbiwKKyAgICBSaWJib24yLAorICAgIFJpZ2h0QXJyb3csCisgICAgUmlnaHRBcnJvd0NhbGxvdXQsCisgICAgUmlnaHRCcmFjZSwKKyAgICBSaWdodEJyYWNrZXQsCisgICAgUm91bmQxUmVjdCwKKyAgICBSb3VuZDJEaWFnUmVjdCwKKyAgICBSb3VuZDJTYW1lUmVjdCwKKyAgICBSb3VuZFJlY3QsCisgICAgUnRUcmlhbmdsZSwKKyAgICBTbWlsZXlGYWNlLAorICAgIFNuaXAxUmVjdCwKKyAgICBTbmlwMkRpYWdSZWN0LAorICAgIFNuaXAyU2FtZVJlY3QsCisgICAgU25pcFJvdW5kUmVjdCwKKyAgICBTcXVhcmVUYWJzLAorICAgIFN0YXIxMCwKKyAgICBTdGFyMTIsCisgICAgU3RhcjE2LAorICAgIFN0YXIyNCwKKyAgICBTdGFyMzIsCisgICAgU3RhcjQsCisgICAgU3RhcjUsCisgICAgU3RhcjYsCisgICAgU3RhcjcsCisgICAgU3RhcjgsCisgICAgU3RyYWlnaHRDb25uZWN0b3IxLAorICAgIFN0cmlwZWRSaWdodEFycm93LAorICAgIFN1biwKKyAgICBTd29vc2hBcnJvdywKKyAgICBUZWFyZHJvcCwKKyAgICBUcmFwZXpvaWQsCisgICAgVHJpYW5nbGUsCisgICAgVXBBcnJvdywKKyAgICBVcEFycm93Q2FsbG91dCwKKyAgICBVcERvd25BcnJvdywKKyAgICBVcERvd25BcnJvd0NhbGxvdXQsCisgICAgVXR1cm5BcnJvdywKKyAgICBXYXZlLAorICAgIFdlZGdlRWxsaXBzZUNhbGxvdXQsCisgICAgV2VkZ2VSZWN0Q2FsbG91dCwKKyAgICBXZWRnZVJvdW5kUmVjdENhbGxvdXQsCisgICAgVmVydGljYWxTY3JvbGwKK30KKy8vLyA8c3VtbWFyeT4KKy8vLyBUZXh0IGFsaWdubWVudAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVUZXh0QWxpZ25tZW50Cit7CisgICAgTGVmdCwKKyAgICBDZW50ZXIsCisgICAgUmlnaHQsCisgICAgRGlzdHJpYnV0ZWQsCisgICAgSnVzdGlmaWVkLAorICAgIEp1c3RpZmllZExvdywKKyAgICBUaGFpRGlzdHJpYnV0ZWQKK30KKy8vLyA8c3VtbWFyeT4KKy8vLyBGaWxsc3R5bGUuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZUZpbGxTdHlsZQoreworICAgIE5vRmlsbCwKKyAgICBTb2xpZEZpbGwsCisgICAgR3JhZGllbnRGaWxsLAorICAgIFBhdHRlcm5GaWxsLAorICAgIEJsaXBGaWxsLAorICAgIEdyb3VwRmlsbAorfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gRXhjZWwgc2hhcGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU2hhcGUgOiBFeGNlbERyYXdpbmcKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsU2hhcGUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKSA6CisgICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOnNwL3hkcjpudlNwUHIveGRyOmNOdlByL0BuYW1lIikKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsU2hhcGUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlU2hhcGVTdHlsZSBzdHlsZSkgOgorICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgInhkcjpzcC94ZHI6bnZTcFByL3hkcjpjTnZQci9AbmFtZSIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgICAgIFhtbEVsZW1lbnQgc2hhcGVOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInhkciIsICJzcCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKKyAgICAgICAgICAgIHNoYXBlTm9kZS5TZXRBdHRyaWJ1dGUoIm1hY3JvIiwgIiIpOworICAgICAgICAgICAgc2hhcGVOb2RlLlNldEF0dHJpYnV0ZSgidGV4dGxpbmsiLCAiIik7CisgICAgICAgICAgICBub2RlLkFwcGVuZENoaWxkKHNoYXBlTm9kZSk7CisKKyAgICAgICAgICAgIHNoYXBlTm9kZS5Jbm5lclhtbCA9IFNoYXBlU3RhcnRYbWwoKTsKKyAgICAgICAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoc2hhcGVOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgieGRyIiwgImNsaWVudERhdGEiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncykpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInByc3RHZW9tIiwgImxuIiwgInBQciIsICJkZWZSUHIiLCAic29saWRGaWxsIiwgInVGaWxsIiwgImxhdGluIiwgImNzIiwgInIiLCAiclByIiwgInQiIH07CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiAicHVibGljIG1ldGhvZHMiCisgICAgICAgIGNvbnN0IHN0cmluZyBTaGFwZVN0eWxlUGF0aCA9ICJ4ZHI6c3AveGRyOnNwUHIvYTpwcnN0R2VvbS9AcHJzdCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNoYXBlIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlU2hhcGVTdHlsZSBTdHlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoU2hhcGVTdHlsZVBhdGgpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlU2hhcGVTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlU2hhcGVTdHlsZSksIHYsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBzaGFwZXR5cGUgezB9IiwgdikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxLCB2Lkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU2hhcGVTdHlsZVBhdGgsIHYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaWxsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJ4ZHI6c3AveGRyOnNwUHIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsRHJhd2luZ0JvcmRlciBfYm9yZGVyID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQm9yZGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJ4ZHI6c3AveGRyOnNwUHIvYTpsbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmdbXSBwYXJhZ3JhcGhOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAicFByIiwgImRlZlJQciIsICJzb2xpZEZpbGwiLCAidUZpbGwiLCAibGF0aW4iLCAiY3MiLCAiciIsICJyUHIiLCAidCIgfTsKKyAgICAgICAgY29uc3Qgc3RyaW5nIFBBUkFHUkFQSF9QQVRIID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6cCI7CisgICAgICAgIEV4Y2VsVGV4dEZvbnQgX2ZvbnQ9bnVsbDsKKyAgICAgICAgcHVibGljIEV4Y2VsVGV4dEZvbnQgRm9udAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZvbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShQQVJBR1JBUEhfUEFUSCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIGlmKG5vZGU9PW51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRleHQ9IiI7ICAgIC8vQ3JlYXRlcyB0aGUgbm9kZSBwIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoUEFSQUdSQVBIX1BBVEgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9mb250ID0gbmV3IEV4Y2VsVGV4dEZvbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgInhkcjpzcC94ZHI6dHhCb2R5L2E6cC9hOnBQci9hOmRlZlJQciIsIHBhcmFncmFwaE5vZGVPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZm9udDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVGV4dFBhdGggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpwL2E6ci9hOnQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXh0IGluc2lkZSB0aGUgc2hhcGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFRleHRQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVGV4dFBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHN0cmluZyBsb2NrVGV4dFBhdGggPSAieGRyOnNwL0BmTG9ja3NUZXh0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9jayBkcmF3aW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIExvY2tUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChsb2NrVGV4dFBhdGgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2wobG9ja1RleHRQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxQYXJhZ3JhcGhDb2xsZWN0aW9uIF9yaWNoVGV4dCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJpY2h0ZXh0IGNvbGxlY3Rpb24uIFVzZWQgdG8gZm9ybWF0IHNwZWNpZmljIHBhcnRzIG9mIHRoZSB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFBhcmFncmFwaENvbGxlY3Rpb24gUmljaFRleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9yaWNoVGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9YbWxOb2RlIG5vZGU9VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKFBBUkFHUkFQSF9QQVRILCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgQ3JlYXRlTm9kZShQQVJBR1JBUEhfUEFUSCk7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAgICAgX3JpY2hUZXh0ID0gbmV3IEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBQQVJBR1JBUEhfUEFUSCwgcGFyYWdyYXBoTm9kZU9yZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yaWNoVGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVGV4dEFuY2hvcmluZ1BhdGggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpib2R5UHIvQGFuY2hvciI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRleHQgQW5jaG9yaW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlVGV4dEFuY2hvcmluZ1R5cGUgVGV4dEFuY2hvcmluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0VGV4dEFjaG9yaW5nRW51bShHZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdQYXRoLCBHZXRUZXh0QWNob3JpbmdUZXh0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFRleHRBbmNob3JpbmdDdGxQYXRoID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6Ym9keVByL0BhbmNob3JDdHIiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGNlbnRlcmluZyBvZiB0aGUgdGV4dCBib3guCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFRleHRBbmNob3JpbmdDb250cm9sCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChUZXh0QW5jaG9yaW5nQ3RsUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdDdGxQYXRoLCAiMSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdDdGxQYXRoLCAiMCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVEVYVF9BTElHTl9QQVRIID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6cC9hOnBQci9AYWxnbiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvdyB0aGUgdGV4dCBpcyBhbGlnbmVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlVGV4dEFsaWdubWVudCBUZXh0QWxpZ25tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgc3dpdGNoKEdldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRIKSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJjdHIiOgorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbm1lbnQuQ2VudGVyOworICAgICAgICAgICAgICAgICAgIGNhc2UgInIiOgorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbm1lbnQuUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgY2FzZSAiZGlzdCI6CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWdubWVudC5EaXN0cmlidXRlZDsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJqdXN0IjoKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25tZW50Lkp1c3RpZmllZDsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJqdXN0TG93IjoKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25tZW50Lkp1c3RpZmllZExvdzsKKyAgICAgICAgICAgICAgICAgICBjYXNlICJ0aGFpRGlzdCI6CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWdubWVudC5UaGFpRGlzdHJpYnV0ZWQ7CisgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWdubWVudC5MZWZ0OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbGlnbm1lbnQuUmlnaHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRFWFRfQUxJR05fUEFUSCwgInIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25tZW50LkNlbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRILCAiY3RyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWdubWVudC5EaXN0cmlidXRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRILCAiZGlzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbGlnbm1lbnQuSnVzdGlmaWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhURVhUX0FMSUdOX1BBVEgsICJqdXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWdubWVudC5KdXN0aWZpZWRMb3c6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRFWFRfQUxJR05fUEFUSCwgImp1c3RMb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25tZW50LlRoYWlEaXN0cmlidXRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRILCAidGhhaURpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShURVhUX0FMSUdOX1BBVEgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgSU5ERU5UX0FMSUdOX1BBVEggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpwL2E6cFByL0BsdmwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRlbnRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IEluZGVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChJTkRFTlRfQUxJR05fUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkluZGVudCBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhJTkRFTlRfQUxJR05fUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFRleHRWZXJ0aWNhbFBhdGggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpib2R5UHIvQHZlcnQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWZXJ0aWNhbCB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlVGV4dFZlcnRpY2FsVHlwZSBUZXh0VmVydGljYWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFRleHRWZXJ0aWNhbEVudW0oR2V0WG1sTm9kZVN0cmluZyhUZXh0VmVydGljYWxQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRWZXJ0aWNhbFBhdGgsIEdldFRleHRWZXJ0aWNhbFRleHQodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiAiUHJpdmF0ZSBNZXRob2RzIgorICAgICAgICBwcml2YXRlIHN0cmluZyBTaGFwZVN0YXJ0WG1sKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPHhkcjpudlNwUHI+PHhkcjpjTnZQciBpZD1cInswfVwiIG5hbWU9XCJ7MX1cIiAvPjx4ZHI6Y052U3BQciAvPjwveGRyOm52U3BQcj48eGRyOnNwUHI+PGE6cHJzdEdlb20gcHJzdD1cInJlY3RcIj48YTphdkxzdCAvPjwvYTpwcnN0R2VvbT48L3hkcjpzcFByPjx4ZHI6c3R5bGU+PGE6bG5SZWYgaWR4PVwiMlwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCI+PGE6c2hhZGUgdmFsPVwiNTAwMDBcIiAvPjwvYTpzY2hlbWVDbHI+PC9hOmxuUmVmPjxhOmZpbGxSZWYgaWR4PVwiMVwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCIgLz48L2E6ZmlsbFJlZj48YTplZmZlY3RSZWYgaWR4PVwiMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCIgLz48L2E6ZWZmZWN0UmVmPjxhOmZvbnRSZWYgaWR4PVwibWlub3JcIj48YTpzY2hlbWVDbHIgdmFsPVwibHQxXCIgLz48L2E6Zm9udFJlZj48L3hkcjpzdHlsZT48eGRyOnR4Qm9keT48YTpib2R5UHIgdmVydE92ZXJmbG93PVwiY2xpcFwiIHJ0bENvbD1cIjBcIiBhbmNob3I9XCJjdHJcIiAvPjxhOmxzdFN0eWxlIC8+PGE6cD48L2E6cD48L3hkcjp0eEJvZHk+IiwgX2lkLCBOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIG5ldyBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE5hbWUgKyBUZXh0OyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbFZpZXczRC5jcyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsVmlldzNELmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDdmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9FeGNlbFZpZXczRC5jcwpAQCAtMCwwICsxLDE1MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAzRCBzZXR0aW5ncworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFZpZXczRCA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICBpbnRlcm5hbCBFeGNlbFZpZXczRChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUpCisgICAgICAgICAgIDogYmFzZShucyxub2RlKQorICAgICAgIHsKKyAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInJvdFgiLCAiaFBlcmNlbnQiLCAicm90WSIsICJkZXB0aFBlcmNlbnQiLCJyQW5nQXgiLCAicGVyc3BlY3RpdmUifTsKKyAgICAgICB9CisgICAgICAgY29uc3Qgc3RyaW5nIHBlcnNwZWN0aXZlUGF0aCA9ICJjOnBlcnNwZWN0aXZlL0B2YWwiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gRGVncmVlIG9mIHBlcnNwZWN0aXZlIAorICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgcHVibGljIGRlY2ltYWwgUGVyc3BlY3RpdmUKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChwZXJzcGVjdGl2ZVBhdGgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHBlcnNwZWN0aXZlUGF0aCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGNvbnN0IHN0cmluZyByb3RYUGF0aCA9ICJjOnJvdFgvQHZhbCI7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBSb3RhdGlvbiBYLWF4aXMKKyAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgIHB1YmxpYyBkZWNpbWFsIFJvdFgKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwocm90WFBhdGgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBDcmVhdGVOb2RlKHJvdFhQYXRoKTsKKyAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcocm90WFBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBjb25zdCBzdHJpbmcgcm90WVBhdGggPSAiYzpyb3RZL0B2YWwiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gUm90YXRpb24gWS1heGlzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgZGVjaW1hbCBSb3RZCisgICAgICAgeworICAgICAgICAgICBnZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKHJvdFlQYXRoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShyb3RZUGF0aCk7CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHJvdFlQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgY29uc3Qgc3RyaW5nIHJBbmdBeFBhdGggPSAiYzpyQW5nQXgvQHZhbCI7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBSaWdodCBBbmdsZSBBeGVzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgYm9vbCBSaWdodEFuZ2xlQXhlcworICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChyQW5nQXhQYXRoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzZXQKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2wockFuZ0F4UGF0aCwgdmFsdWUpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGNvbnN0IHN0cmluZyBkZXB0aFBlcmNlbnRQYXRoID0gImM6ZGVwdGhQZXJjZW50L0B2YWwiOworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gRGVwdGggJSBvZiBiYXNlCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgaW50IERlcHRoUGVyY2VudAorICAgICAgIHsKKyAgICAgICAgICAgZ2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KGRlcHRoUGVyY2VudFBhdGgpOworICAgICAgICAgICB9CisgICAgICAgICAgIHNldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjAwMCkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAwMCIpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoZGVwdGhQZXJjZW50UGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgY29uc3Qgc3RyaW5nIGhlaWdodFBlcmNlbnRQYXRoID0gImM6aFBlcmNlbnQvQHZhbCI7CisgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgIC8vLyBIZWlnaHQgJSBvZiBiYXNlCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICBwdWJsaWMgaW50IEhlaWdodFBlcmNlbnQKKyAgICAgICB7CisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChoZWlnaHRQZXJjZW50UGF0aCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgc2V0CisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDUgfHwgdmFsdWUgPiA1MDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiA1IGFuZCA1MDAiKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGhlaWdodFBlcmNlbnRQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTZlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcwpAQCAtMCwwICsxLDE2NiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhvcml6b250YWwgQWxpbmdtZW50CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbAorICAgIHsKKyAgICAgICAgTGVmdCwKKyAgICAgICAgQ2VudGVyLAorICAgICAgICBSaWdodAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZlcnRpY2FsIEFsaW5nbWVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZVRleHRBbGlnblZlcnRpY2FsVm1sCisgICAgeworICAgICAgICBUb3AsCisgICAgICAgIENlbnRlciwKKyAgICAgICAgQm90dG9tCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTGluZXN0eWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlTGluZVN0eWxlVm1sCisgICAgeworICAgICAgICBTb2xpZCwKKyAgICAgICAgUm91bmQsCisgICAgICAgIFNxdWFyZSwKKyAgICAgICAgRGFzaCwKKyAgICAgICAgRGFzaERvdCwKKyAgICAgICAgTG9uZ0Rhc2gsCisgICAgICAgIExvbmdEYXNoRG90LAorICAgICAgICBMb25nRGFzaERvdERvdAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERyYXdpbmcgb2JqZWN0IHVzZWQgZm9yIGNvbW1lbnRzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxWbWxEcmF3aW5nQmFzZSA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQmFzZShYbWxOb2RlIHRvcE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJmaWxsIiwgInN0cm9rZSIsICJzaGFkb3ciLCAicGF0aCIsICJ0ZXh0Ym94IiwgIkNsaWVudERhdGEiLCAiTW92ZVdpdGhDZWxscyIsICJTaXplV2l0aENlbGxzIiwgIkFuY2hvciIsICJMb2NrZWQiLCAiQXV0b0ZpbGwiLCAiTG9ja1RleHQiLCAiVGV4dEhBbGlnbiIsICJUZXh0VkFsaWduIiwgIlJvdyIsICJDb2x1bW4iLCAiVmlzaWJsZSIgfTsKKyAgICAgICAgfSAgIAorICAgICAgICBwdWJsaWMgc3RyaW5nIElkIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQGlkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAaWQiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHRlcm5hdGl2ZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbnN0ZWFkIG9mIGEgZ3JhcGhpYy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBBbHRlcm5hdGl2ZVRleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBhbHQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBhbHQiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiAiU3R5bGUgSGFuZGxpbmcgbWV0aG9kcyIKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgR2V0U3R5bGUoc3RyaW5nIHN0eWxlLCBzdHJpbmcga2V5LCBvdXQgc3RyaW5nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdbXXN0eWxlcyA9IHN0eWxlLlNwbGl0KCc7Jyk7CisgICAgICAgICAgICBmb3JlYWNoKHN0cmluZyBzIGluIHN0eWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5JbmRleE9mKCc6JykgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nW10gc3BsaXQgPSBzLlNwbGl0KCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXSA9PSBrZXkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXNwbGl0WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocyA9PSBrZXkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWU9IiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBTZXRTdHlsZShzdHJpbmcgc3R5bGUsIHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nW10gc3R5bGVzID0gc3R5bGUuU3BsaXQoJzsnKTsKKyAgICAgICAgICAgIHN0cmluZyBuZXdTdHlsZT0iIjsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHMgaW4gc3R5bGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZ1tdIHNwbGl0ID0gcy5TcGxpdCgnOicpOworICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXS5UcmltKCkgPT0ga2V5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLlRyaW0oKSAhPSAiIikgLy9JZiBibGFuayByZW1vdmUgdGhlIGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgKz0ga2V5ICsgJzonICsgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlICs9IHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld1N0eWxlICs9ICc7JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY2hhbmdlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdTdHlsZSArPSBrZXkgKyAnOicgKyB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IHN0eWxlLlN1YnN0cmluZygwLCBzdHlsZS5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXdTdHlsZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDdlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZtbERyYXdpbmdCYXNlQ29sbGVjdGlvbgorICAgIHsgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdCYXNlQ29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgVXJpIHVyaSkKKyAgICAgICAgeworICAgICAgICAgICAgVm1sRHJhd2luZ1htbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgVm1sRHJhd2luZ1htbC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTmFtZVRhYmxlIG50PW5ldyBOYW1lVGFibGUoKTsKKyAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIgPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihudCk7CisgICAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgidiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRWbWwpOworICAgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoIm8iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWljcm9zb2Z0T2ZmaWNlKTsKKyAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIuQWRkTmFtZXNwYWNlKCJ4IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdEV4Y2VsKTsKKyAgICAgICAgICAgIFVyaSA9IHVyaTsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXJ0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXJ0PXBjay5QYWNrYWdlLkdldFBhcnQodXJpKTsKKyAgICAgICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoVm1sRHJhd2luZ1htbCwgUGFydC5HZXRTdHJlYW0oKSk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIFhtbERvY3VtZW50IFZtbERyYXdpbmdYbWwgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBVcmkgVXJpIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFJlbElkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50LmNzIGIvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0NvbW1lbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2ZDI2YgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50LmNzCkBAIC0wLDAgKzEsNDYwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTA2LTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgY29tbWVudHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZtbERyYXdpbmdDb21tZW50IDogRXhjZWxWbWxEcmF3aW5nQmFzZSwgSVJhbmdlSUQKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQoWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJhbmdlQmFzZSByYW5nZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBucykgOgorICAgICAgICAgICAgYmFzZSh0b3BOb2RlLCBucykKKyAgICAgICAgeworICAgICAgICAgICAgUmFuZ2UgPSByYW5nZTsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJmaWxsIiwgInN0cm9rZSIsICJzaGFkb3ciLCAicGF0aCIsICJ0ZXh0Ym94IiwgIkNsaWVudERhdGEiLCAiTW92ZVdpdGhDZWxscyIsICJTaXplV2l0aENlbGxzIiwgIkFuY2hvciIsICJMb2NrZWQiLCAiQXV0b0ZpbGwiLCAiTG9ja1RleHQiLCAiVGV4dEhBbGlnbiIsICJUZXh0VkFsaWduIiwgIlJvdyIsICJDb2x1bW4iLCAiVmlzaWJsZSIgfTsKKyAgICAgICAgfSAgIAorICAgICAgICBpbnRlcm5hbCBFeGNlbFJhbmdlQmFzZSBSYW5nZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcmVzcyBpbiB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuQWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cmluZyBWRVJUSUNBTF9BTElHTk1FTlRfUEFUSD0ieDpDbGllbnREYXRhL3g6VGV4dFZBbGlnbiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZlcnRpY2FsIGFsaWdubWVudCBmb3IgdGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZVRleHRBbGlnblZlcnRpY2FsVm1sIFZlcnRpY2FsQWxpZ25tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoR2V0WG1sTm9kZVN0cmluZyhWRVJUSUNBTF9BTElHTk1FTlRfUEFUSCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJDZW50ZXIiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5DZW50ZXI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkJvdHRvbSI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnblZlcnRpY2FsVm1sLkJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWduVmVydGljYWxWbWwuVG9wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5DZW50ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFZFUlRJQ0FMX0FMSUdOTUVOVF9QQVRILCAiQ2VudGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWduVmVydGljYWxWbWwuQm90dG9tOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhWRVJUSUNBTF9BTElHTk1FTlRfUEFUSCwgIkJvdHRvbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKFZFUlRJQ0FMX0FMSUdOTUVOVF9QQVRIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgSE9SSVpPTlRBTF9BTElHTk1FTlRfUEFUSD0ieDpDbGllbnREYXRhL3g6VGV4dEhBbGlnbiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvcml6b250YWwgYWxpZ25tZW50IGZvciB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbCBIb3Jpem9udGFsQWxpZ25tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoR2V0WG1sTm9kZVN0cmluZyhIT1JJWk9OVEFMX0FMSUdOTUVOVF9QQVRIKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkNlbnRlciI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuQ2VudGVyOworICAgICAgICAgICAgICAgICAgICBjYXNlICJSaWdodCI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuTGVmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbC5DZW50ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEhPUklaT05UQUxfQUxJR05NRU5UX1BBVEgsICJDZW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25Ib3Jpem9udGFsVm1sLlJpZ2h0OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhIT1JJWk9OVEFMX0FMSUdOTUVOVF9QQVRILCAiUmlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShIT1JJWk9OVEFMX0FMSUdOTUVOVF9QQVRIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVklTSUJMRV9QQVRIID0gIng6Q2xpZW50RGF0YS94OlZpc2libGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZHJhd2luZyBvYmplY3QgaXMgdmlzaWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgVmlzaWJsZSAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKFZJU0lCTEVfUEFUSCwgTmFtZVNwYWNlTWFuYWdlcikhPW51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShWSVNJQkxFX1BBVEgpOworICAgICAgICAgICAgICAgICAgICBTdHlsZSA9IFNldFN0eWxlKFN0eWxlLCJ2aXNpYmlsaXR5IiwgInZpc2libGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShWSVNJQkxFX1BBVEgpOworICAgICAgICAgICAgICAgICAgICBTdHlsZSA9IFNldFN0eWxlKFN0eWxlLCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIEJBQ0tHUk9VTkRDT0xPUl9QQVRIID0gIkBmaWxsY29sb3IiOworICAgICAgICBjb25zdCBzdHJpbmcgQkFDS0dST1VORENPTE9SMl9QQVRIID0gInY6ZmlsbC9AY29sb3IyIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQmFja2dyb3VuZCBjb2xvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQ29sb3IgQmFja2dyb3VuZENvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBjb2wgPSBHZXRYbWxOb2RlU3RyaW5nKEJBQ0tHUk9VTkRDT0xPUl9QQVRIKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sID09ICIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKDB4ZmYsIDB4ZmYsIDB4ZTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihjb2wuU3RhcnRzV2l0aCgiIyIpKSBjb2w9Y29sLlN1YnN0cmluZygxLGNvbC5MZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoY29sLFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHJlcykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihyZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkVtcHR5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNvbG9yID0gIiMiICsgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNik7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhCQUNLR1JPVU5EQ09MT1JfUEFUSCwgY29sb3IpOworICAgICAgICAgICAgICAgIC8vU2V0WG1sTm9kZShCQUNLR1JPVU5EQ09MT1IyX1BBVEgsIGNvbG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgTElORVNUWUxFX1BBVEg9InY6c3Ryb2tlL0BkYXNoc3R5bGUiOworICAgICAgICBjb25zdCBzdHJpbmcgRU5EQ0FQX1BBVEggPSAidjpzdHJva2UvQGVuZGNhcCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExpbmVzdHlsZSBmb3IgYm9yZGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlTGluZVN0eWxlVm1sIExpbmVTdHlsZSAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2PUdldFhtbE5vZGVTdHJpbmcoTElORVNUWUxFX1BBVEgpOworICAgICAgICAgICAgICAgIGlmICh2ID09ICIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMaW5lU3R5bGVWbWwuU29saWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgPT0gIjEgMSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ID0gR2V0WG1sTm9kZVN0cmluZyhFTkRDQVBfUEFUSCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZVZtbClFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlVm1sKSwgdiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZVZtbClFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlVm1sKSwgdiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVMaW5lU3R5bGVWbWwuUm91bmQgfHwgdmFsdWUgPT0gZUxpbmVTdHlsZVZtbC5TcXVhcmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKExJTkVTVFlMRV9QQVRILCAiMSAxIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBlTGluZVN0eWxlVm1sLlJvdW5kKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEVORENBUF9QQVRILCAicm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoRU5EQ0FQX1BBVEgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxLCB2Lkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKExJTkVTVFlMRV9QQVRILCB2KTsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShFTkRDQVBfUEFUSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBMSU5FQ09MT1JfUEFUSD0iQHN0cm9rZWNvbG9yIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGluZSBjb2xvciAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIENvbG9yIExpbmVDb2xvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgY29sID0gR2V0WG1sTm9kZVN0cmluZyhMSU5FQ09MT1JfUEFUSCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbCA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5CbGFjazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5TdGFydHNXaXRoKCIjIikpIGNvbCA9IGNvbC5TdWJzdHJpbmcoMSwgY29sLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKGNvbCwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmVzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNvbG9yID0gIiMiICsgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNik7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhMSU5FQ09MT1JfUEFUSCwgY29sb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBMSU5FV0lEVEhfUEFUSD0iQHN0cm9rZXdlaWdodCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdpZHRoIG9mIHRoZSBib3JkZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFNpbmdsZSBMaW5lV2lkdGggCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB3dD1HZXRYbWxOb2RlU3RyaW5nKExJTkVXSURUSF9QQVRIKTsKKyAgICAgICAgICAgICAgICBpZiAod3QgPT0gIiIpIHJldHVybiAoU2luZ2xlKS43NTsKKyAgICAgICAgICAgICAgICBpZih3dC5FbmRzV2l0aCgicHQiKSkgd3Q9d3QuU3Vic3RyaW5nKDAsd3QuTGVuZ3RoLTIpOworCisgICAgICAgICAgICAgICAgU2luZ2xlIHJldDsKKyAgICAgICAgICAgICAgICBpZihTaW5nbGUuVHJ5UGFyc2Uod3QsU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHJldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKExJTkVXSURUSF9QQVRILCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJwdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8vLyBXaWR0aCBvZiB0aGUgQ29tbWVudCAKKyAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgorICAgICAgICAvL3B1YmxpYyBTaW5nbGUgV2lkdGgKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGdldAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBzdHJpbmcgdjsKKyAgICAgICAgLy8gICAgICAgIEdldFN0eWxlKCJ3aWR0aCIsIG91dCB2KTsKKyAgICAgICAgLy8gICAgICAgIGlmKHYuRW5kc1dpdGgoInB0IikpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIHYuTGVuZ3RoIC0gMik7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBzaG9ydCByZXQ7CisgICAgICAgIC8vICAgICAgICBpZiAoc2hvcnQuVHJ5UGFyc2UodixTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmV0KSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHNldAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBTZXRTdHlsZSgid2lkdGgiLCB2YWx1ZS5Ub1N0cmluZygiTjIiLEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgInB0Iik7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy99CisgICAgICAgIC8vLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8vLyBIZWlnaHQgb2YgdGhlIENvbW1lbnQgCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9wdWJsaWMgU2luZ2xlIEhlaWdodAorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0CisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHN0cmluZyB2OworICAgICAgICAvLyAgICAgICAgR2V0U3R5bGUoImhlaWdodCIsIG91dCB2KTsKKyAgICAgICAgLy8gICAgICAgIGlmICh2LkVuZHNXaXRoKCJwdCIpKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHYgPSB2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDIpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgc2hvcnQgcmV0OworICAgICAgICAvLyAgICAgICAgaWYgKHNob3J0LlRyeVBhcnNlKHYsIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCByZXQpKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgc2V0CisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIFNldFN0eWxlKCJoZWlnaHQiLCB2YWx1ZS5Ub1N0cmluZygiTjIiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJwdCIpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgICAgICBjb25zdCBzdHJpbmcgVEVYVEJPWF9TVFlMRV9QQVRIID0gInY6dGV4dGJveC9Ac3R5bGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBdXRvZml0cyB0aGUgZHJhd2luZ29iamVjdCAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQXV0b0ZpdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgICAgICAgR2V0U3R5bGUoR2V0WG1sTm9kZVN0cmluZyhURVhUQk9YX1NUWUxFX1BBVEgpLCAibXNvLWZpdC1zaGFwZS10by10ZXh0Iiwgb3V0IHZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU9PSJ0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRFWFRCT1hfU1RZTEVfUEFUSCwgU2V0U3R5bGUoR2V0WG1sTm9kZVN0cmluZyhURVhUQk9YX1NUWUxFX1BBVEgpLCJtc28tZml0LXNoYXBlLXRvLXRleHQiLCB2YWx1ZT8idCI6IiIpKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBjb25zdCBzdHJpbmcgTE9DS0VEX1BBVEggPSAieDpDbGllbnREYXRhL3g6TG9ja2VkIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIG9iamVjdCBpcyBsb2NrZWQgd2hlbiB0aGUgc2hlZXQgaXMgcHJvdGVjdGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIExvY2tlZCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKExPQ0tFRF9QQVRILCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChMT0NLRURfUEFUSCwgdmFsdWUsIGZhbHNlKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIExPQ0tfVEVYVF9QQVRIID0gIng6Q2xpZW50RGF0YS94OkxvY2tUZXh0IjsgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhhdCB0aGUgb2JqZWN0J3MgdGV4dCBpcyBsb2NrZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgTG9ja1RleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKExPQ0tfVEVYVF9QQVRILCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChMT0NLX1RFWFRfUEFUSCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbiBfZnJvbSA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZyb20gcG9zaXRpb24uIEZvciBjb21tZW50cyBvbmx5IHdoZW4gVmlzaWJsZT10cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24gRnJvbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Zyb20gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9mcm9tID0gbmV3IEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieDpDbGllbnREYXRhIiwgTmFtZVNwYWNlTWFuYWdlciksIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2Zyb207CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24gX3RvID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVG8gcG9zaXRpb24uIEZvciBjb21tZW50cyBvbmx5IHdoZW4gVmlzaWJsZT10cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24gVG8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF90byA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3RvID0gbmV3IEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieDpDbGllbnREYXRhIiwgTmFtZVNwYWNlTWFuYWdlciksIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3RvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBTVFlMRV9QQVRIID0gIkBzdHlsZSI7CisgICAgICAgIGludGVybmFsIHN0cmluZyBTdHlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhTVFlMRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU1RZTEVfUEFUSCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNyZWdpb24gSVJhbmdlSUQgTWVtYmVycworCisgICAgICAgIHVsb25nIElSYW5nZUlELlJhbmdlSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKFJhbmdlLldvcmtzaGVldC5TaGVldElELCBSYW5nZS5TdGFydC5Sb3csIFJhbmdlLlN0YXJ0LkNvbHVtbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5MWZmMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbi5jcwpAQCAtMCwwICsxLDIwNiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAoreworICAgIGludGVybmFsIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnRDb2xsZWN0aW9uIDogRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24sIElFbnVtZXJhYmxlCisgICAgeworICAgICAgICBpbnRlcm5hbCBSYW5nZUNvbGxlY3Rpb24gX2RyYXdpbmdzOworICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgVXJpIHVyaSkgOgorICAgICAgICAgICAgYmFzZShwY2ssIHdzLHVyaSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZtbERyYXdpbmdYbWwuTG9hZFhtbChDcmVhdGVWbWxEcmF3aW5ncygpKTsKKyAgICAgICAgICAgICAgICBfZHJhd2luZ3MgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKG5ldyBMaXN0PElSYW5nZUlEPigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGREcmF3aW5nc0Zyb21YbWwod3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFkZERyYXdpbmdzRnJvbVhtbChFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5vZGVzID0gVm1sRHJhd2luZ1htbC5TZWxlY3ROb2RlcygiLy92OnNoYXBlIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PElSYW5nZUlEPigpOworICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBub2RlIGluIG5vZGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByb3dOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4OkNsaWVudERhdGEveDpSb3ciLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICB2YXIgY29sTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieDpDbGllbnREYXRhL3g6Q29sdW1uIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKHJvd05vZGUgIT0gbnVsbCAmJiBjb2xOb2RlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gaW50LlBhcnNlKHJvd05vZGUuSW5uZXJUZXh0KSArIDE7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb2wgPSBpbnQuUGFyc2UoY29sTm9kZS5Jbm5lclRleHQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQobmV3IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQobm9kZSwgd3MuQ2VsbHNbcm93LCBjb2xdLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBFeGNlbFZtbERyYXdpbmdDb21tZW50KG5vZGUsIHdzLkNlbGxzWzEsIDFdLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5Tb3J0KG5ldyBDb21wYXJpc29uPElSYW5nZUlEPigocjEsIHIyKSA9PiAocjEuUmFuZ2VJRCA8IHIyLlJhbmdlSUQgPyAtMSA6IHIxLlJhbmdlSUQgPiByMi5SYW5nZUlEID8gMSA6IDApKSk7ICAvL1ZtbCBkcmF3aW5ncyBhcmUgbm90IHNvcnRlZC4gU29ydCB0byBhdm9pZCBtaXNzbWF0Y2hlcy4KKyAgICAgICAgICAgIF9kcmF3aW5ncyA9IG5ldyBSYW5nZUNvbGxlY3Rpb24obGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgQ3JlYXRlVm1sRHJhd2luZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdm1sPXN0cmluZy5Gb3JtYXQoIjx4bWwgeG1sbnM6dj1cInswfVwiIHhtbG5zOm89XCJ7MX1cIiB4bWxuczp4PVwiezJ9XCI+IiwgCisgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdFZtbCwgCisgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdE9mZmljZSwgCisgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdEV4Y2VsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIHZtbCs9IjxvOnNoYXBlbGF5b3V0IHY6ZXh0PVwiZWRpdFwiPiI7CisgICAgICAgICAgICAgdm1sKz0iPG86aWRtYXAgdjpleHQ9XCJlZGl0XCIgZGF0YT1cIjFcIi8+IjsKKyAgICAgICAgICAgICB2bWwrPSI8L286c2hhcGVsYXlvdXQ+IjsKKworICAgICAgICAgICAgIHZtbCs9Ijx2OnNoYXBldHlwZSBpZD1cIl94MDAwMF90MjAyXCIgY29vcmRzaXplPVwiMjE2MDAsMjE2MDBcIiBvOnNwdD1cIjIwMlwiIHBhdGg9XCJtLGwsMjE2MDByMjE2MDAsbDIxNjAwLHhlXCI+IjsKKyAgICAgICAgICAgICB2bWwrPSI8djpzdHJva2Ugam9pbnN0eWxlPVwibWl0ZXJcIiAvPiI7CisgICAgICAgICAgICAgdm1sKz0iPHY6cGF0aCBncmFkaWVudHNoYXBlb2s9XCJ0XCIgbzpjb25uZWN0dHlwZT1cInJlY3RcIiAvPiI7CisgICAgICAgICAgICAgdm1sKz0iPC92OnNoYXBldHlwZT4iOworICAgICAgICAgICAgIHZtbCs9ICI8L3htbD4iOworCisgICAgICAgICAgICByZXR1cm4gdm1sOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQgQWRkKEV4Y2VsUmFuZ2VCYXNlIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IEFkZERyYXdpbmcoY2VsbCk7CisgICAgICAgICAgICB2YXIgZHJhdyA9IG5ldyBFeGNlbFZtbERyYXdpbmdDb21tZW50KG5vZGUsIGNlbGwsIE5hbWVTcGFjZU1hbmFnZXIpOyAgICAgICAgICAgIAorICAgICAgICAgICAgX2RyYXdpbmdzLkFkZChkcmF3KTsKKyAgICAgICAgICAgIHJldHVybiBkcmF3OworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgWG1sTm9kZSBBZGREcmF3aW5nKEV4Y2VsUmFuZ2VCYXNlIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByb3cgPSBjZWxsLlN0YXJ0LlJvdywgY29sID0gY2VsbC5TdGFydC5Db2x1bW47CisgICAgICAgICAgICB2YXIgbm9kZSA9IFZtbERyYXdpbmdYbWwuQ3JlYXRlRWxlbWVudCgidiIsICJzaGFwZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRWbWwpOworCisgICAgICAgICAgICB2YXIgaWQgPSBFeGNlbENlbGxCYXNlLkdldENlbGxJRChjZWxsLldvcmtzaGVldC5TaGVldElELCBjZWxsLl9mcm9tUm93LCBjZWxsLl9mcm9tQ29sKTsKKyAgICAgICAgICAgIHZhciBpeCA9IF9kcmF3aW5ncy5JbmRleE9mKGlkKTsKKyAgICAgICAgICAgIGlmIChpeCA8IDAgJiYgKH5peCA8IF9kcmF3aW5ncy5Db3VudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXggPSB+aXg7CisgICAgICAgICAgICAgICAgdmFyIHByZXZEcmF3ID0gX2RyYXdpbmdzW2l4XSBhcyBFeGNlbFZtbERyYXdpbmdCYXNlOworICAgICAgICAgICAgICAgIHByZXZEcmF3LlRvcE5vZGUuUGFyZW50Tm9kZS5JbnNlcnRCZWZvcmUobm9kZSwgcHJldkRyYXcuVG9wTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVm1sRHJhd2luZ1htbC5Eb2N1bWVudEVsZW1lbnQuQXBwZW5kQ2hpbGQobm9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJpZCIsIEdldE5ld0lkKCkpOworICAgICAgICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoInR5cGUiLCAiI194MDAwMF90MjAyIik7CisgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgic3R5bGUiLCAicG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxOyB2aXNpYmlsaXR5OmhpZGRlbiIpOworICAgICAgICAgICAgLy9ub2RlLlNldEF0dHJpYnV0ZSgic3R5bGUiLCAicG9zaXRpb246YWJzb2x1dGU7IG1hcmdpbi1sZWZ0OjU5LjI1cHQ7bWFyZ2luLXRvcDoxLjVwdDt3aWR0aDoxMDhwdDtoZWlnaHQ6NTkuMjVwdDt6LWluZGV4OjE7IHZpc2liaWxpdHk6aGlkZGVuIik7IAorICAgICAgICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoImZpbGxjb2xvciIsICIjZmZmZmUxIik7CisgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgiaW5zZXRtb2RlIixFeGNlbFBhY2thZ2Uuc2NoZW1hTWljcm9zb2Z0T2ZmaWNlLCJhdXRvIik7CisKKyAgICAgICAgICAgIHN0cmluZyB2bWwgPSAiPHY6ZmlsbCBjb2xvcjI9XCIjZmZmZmUxXCIgLz4iOworICAgICAgICAgICAgdm1sICs9ICI8djpzaGFkb3cgb249XCJ0XCIgY29sb3I9XCJibGFja1wiIG9ic2N1cmVkPVwidFwiIC8+IjsKKyAgICAgICAgICAgIHZtbCArPSAiPHY6cGF0aCBvOmNvbm5lY3R0eXBlPVwibm9uZVwiIC8+IjsKKyAgICAgICAgICAgIHZtbCArPSAiPHY6dGV4dGJveCBzdHlsZT1cIm1zby1kaXJlY3Rpb24tYWx0OmF1dG9cIj4iOworICAgICAgICAgICAgdm1sICs9ICI8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpsZWZ0XCIgLz4iOworICAgICAgICAgICAgdm1sICs9ICI8L3Y6dGV4dGJveD4iOworICAgICAgICAgICAgdm1sICs9ICI8eDpDbGllbnREYXRhIE9iamVjdFR5cGU9XCJOb3RlXCI+IjsKKyAgICAgICAgICAgIHZtbCArPSAiPHg6TW92ZVdpdGhDZWxscyAvPiI7CisgICAgICAgICAgICB2bWwgKz0gIjx4OlNpemVXaXRoQ2VsbHMgLz4iOworICAgICAgICAgICAgdm1sICs9IHN0cmluZy5Gb3JtYXQoIjx4OkFuY2hvcj57MH0sIDE1LCB7MX0sIDIsIHsyfSwgMzEsIHszfSwgMTwveDpBbmNob3I+IiwgY29sLCByb3cgLSAxLCBjb2wgKyAyLCByb3cgKyAzKTsKKyAgICAgICAgICAgIHZtbCArPSAiPHg6QXV0b0ZpbGw+RmFsc2U8L3g6QXV0b0ZpbGw+IjsKKyAgICAgICAgICAgIHZtbCArPSBzdHJpbmcuRm9ybWF0KCI8eDpSb3c+ezB9PC94OlJvdz4iLCByb3cgLSAxKTsgOworICAgICAgICAgICAgdm1sICs9IHN0cmluZy5Gb3JtYXQoIjx4OkNvbHVtbj57MH08L3g6Q29sdW1uPiIsIGNvbCAtIDEpOworICAgICAgICAgICAgdm1sICs9ICI8L3g6Q2xpZW50RGF0YT4iOworCisgICAgICAgICAgICBub2RlLklubmVyWG1sID0gdm1sOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgaW50IF9uZXh0SUQgPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuZXh0IGRyYXdpbmcgaWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0cmluZyBHZXROZXdJZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dElEID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxWbWxEcmF3aW5nQ29tbWVudCBkcmF3IGluIHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5JZC5MZW5ndGggPiAzICYmIGRyYXcuSWQuU3RhcnRzV2l0aCgidm1sIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoZHJhdy5JZC5TdWJzdHJpbmcoMywgZHJhdy5JZC5MZW5ndGggLSAzKSwgb3V0IGlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPiBfbmV4dElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25leHRJRCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9uZXh0SUQrKzsKKyAgICAgICAgICAgIHJldHVybiAidm1sIiArIF9uZXh0SUQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdCYXNlIHRoaXNbdWxvbmcgcmFuZ2VJRF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5nc1tyYW5nZUlEXSBhcyBFeGNlbFZtbERyYXdpbmdDb21tZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgQ29udGFpbnNLZXkodWxvbmcgcmFuZ2VJRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5ncy5Db250YWluc0tleShyYW5nZUlEKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5ncy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfZHJhd2luZ3M7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUGljdHVyZS5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQaWN0dXJlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjM4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUGljdHVyZS5jcwpAQCAtMCwwICsxLDM1NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgaGVhZGVyIGFuZCBmb290ZXIgcGljdHVyZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIDogRXhjZWxWbWxEcmF3aW5nQmFzZQorICAgIHsKKyAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nUGljdHVyZShYbWxOb2RlIHRvcE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIEV4Y2VsV29ya3NoZWV0IHdzKSA6CisgICAgICAgICAgICBiYXNlKHRvcE5vZGUsIG5zKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0gd3M7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9zaXRpb24gSUQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQGlkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHdpZHRoIGluIHBvaW50cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZG91YmxlIFdpZHRoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHlsZVByb3AoIndpZHRoIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRTdHlsZVByb3AoIndpZHRoIix2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJwdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBoZWlnaHQgaW4gcG9pbnRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgSGVpZ2h0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHlsZVByb3AoImhlaWdodCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0U3R5bGVQcm9wKCJoZWlnaHQiLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJwdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1hcmdpbiBMZWZ0IGluIHBvaW50cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZG91YmxlIExlZnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFN0eWxlUHJvcCgibGVmdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0U3R5bGVQcm9wKCJsZWZ0IiwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1hcmdpbiB0b3AgaW4gcG9pbnRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgVG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHlsZVByb3AoInRvcCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0U3R5bGVQcm9wKCJ0b3AiLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFRpdGxlIG9mIHRoZSBpbWFnZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFRpdGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9Abzp0aXRsZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQG86dGl0bGUiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgaW1hZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEltYWdlIEltYWdlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwY2sgPSBfd29ya3NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAgICAgaWYgKHBjay5QYXJ0RXhpc3RzKEltYWdlVXJpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gcGNrLkdldFBhcnQoSW1hZ2VVcmkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW1hZ2UuRnJvbVN0cmVhbShwYXJ0LkdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIFVyaSBJbWFnZVVyaQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFJlbElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AbzpyZWxpZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQG86cmVsaWQiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERldGVybWluZXMgd2hldGhlciBhbiBpbWFnZSB3aWxsIGJlIGRpc3BsYXllZCBpbiBibGFjayBhbmQgd2hpdGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQmlMZXZlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGJpbGV2ZWwiKT09InQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGJpbGV2ZWwiLCAidCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJ2OmltYWdlZGF0YS9AYmlsZXZlbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwaWN0dXJlIHdpbGwgYmUgZGlzcGxheWVkIGluIGdyYXlzY2FsZSBtb2RlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEdyYXlTY2FsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGdyYXlzY2FsZSIpPT0idCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AZ3JheXNjYWxlIiwgInQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgidjppbWFnZWRhdGEvQGdyYXlzY2FsZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZpbmVzIHRoZSBpbnRlbnNpdHkgb2YgYWxsIGNvbG9ycyBpbiBhbiBpbWFnZQorICAgICAgICAvLy8gRGVmYXVsdCB2YWx1ZSBpcyAxCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgR2FpbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoInY6aW1hZ2VkYXRhL0BnYWluIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldEZyYWNEVCh2LDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIHBvc2l0aXZlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoInY6aW1hZ2VkYXRhL0BnYW1tYSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AZ2FpbiIsIHZhbHVlLlRvU3RyaW5nKCIjLjAjIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZpbmVzIHRoZSBhbW91bnQgb2YgY29udHJhc3QgZm9yIGFuIGltYWdlCisgICAgICAgIC8vLyBEZWZhdWx0IHZhbHVlIGlzIDA7CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgR2FtbWEKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHYgPSBHZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AZ2FtbWEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0RnJhY0RUKHYsMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMCkgLy9EZWZhdWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJ2OmltYWdlZGF0YS9AZ2FtbWEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGdhbW1hIiwgdmFsdWUuVG9TdHJpbmcoIiMuMCMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmluZXMgdGhlIGludGVuc2l0eSBvZiBibGFjayBpbiBhbiBpbWFnZQorICAgICAgICAvLy8gRGVmYXVsdCB2YWx1ZSBpcyAwCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgQmxhY2tMZXZlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoInY6aW1hZ2VkYXRhL0BibGFja2xldmVsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldEZyYWNEVCh2LCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgidjppbWFnZWRhdGEvQGJsYWNrbGV2ZWwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGJsYWNrbGV2ZWwiLCB2YWx1ZS5Ub1N0cmluZygiIy4wIyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByaXZhdGUgTWV0aG9kcworICAgICAgICBwcml2YXRlIGRvdWJsZSBHZXRGcmFjRFQoc3RyaW5nIHYsIGRvdWJsZSBkZWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgICAgaWYgKHYuRW5kc1dpdGgoImYiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgdi5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHYsIG91dCBkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGQgLz0gNjU1MzU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGQgPSBkZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZG91YmxlLlRyeVBhcnNlKHYsIG91dCBkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGQgPSBkZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFN0eWxlUHJvcChzdHJpbmcgcHJvcGVydHlOYW1lLCBzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzdHlsZSA9IEdldFhtbE5vZGVTdHJpbmcoIkBzdHlsZSIpOworICAgICAgICAgICAgc3RyaW5nIG5ld1N0eWxlID0gIiI7CisgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcHJvcCBpbiBzdHlsZS5TcGxpdCgnOycpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZ1tdIHNwbGl0ID0gcHJvcC5TcGxpdCgnOicpOworICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXSA9PSBwcm9wZXJ0eU5hbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSArPSBwcm9wZXJ0eU5hbWUgKyAiOiIgKyB2YWx1ZSArICI7IjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSArPSBwcm9wICsgIjsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3U3R5bGUgKz0gcHJvcGVydHlOYW1lICsgIjoiICsgdmFsdWUgKyAiOyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc3R5bGUiLCBuZXdTdHlsZS5TdWJzdHJpbmcoMCwgbmV3U3R5bGUuTGVuZ3RoIC0gMSkpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgZG91YmxlIEdldFN0eWxlUHJvcChzdHJpbmcgcHJvcGVydHlOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgc3R5bGUgPSBHZXRYbWxOb2RlU3RyaW5nKCJAc3R5bGUiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBwcm9wIGluIHN0eWxlLlNwbGl0KCc7JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nW10gc3BsaXQgPSBwcm9wLlNwbGl0KCc6Jyk7CisgICAgICAgICAgICAgICAgaWYgKHNwbGl0WzBdID09IHByb3BlcnR5TmFtZSAmJiBzcGxpdC5MZW5ndGggPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gc3BsaXRbMV0uRW5kc1dpdGgoInB0IikgPyBzcGxpdFsxXS5TdWJzdHJpbmcoMCwgc3BsaXRbMV0uTGVuZ3RoIC0gMikgOiBzcGxpdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLk51bWJlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHJldCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUGljdHVyZUNvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUGljdHVyZUNvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMmZiMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbi5jcwpAQCAtMCwwICsxLDE3MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbiA6IEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLCBJRW51bWVyYWJsZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgTGlzdDxFeGNlbFZtbERyYXdpbmdQaWN0dXJlPiBfaW1hZ2VzOworICAgICAgICBFeGNlbFBhY2thZ2UgX3BjazsKKyAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dzOworICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgVXJpIHVyaSkgOgorICAgICAgICAgICAgYmFzZShwY2ssIHdzLCB1cmkpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIF9wY2sgPSBwY2s7CisgICAgICAgICAgICBfd3MgPSB3czsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWbWxEcmF3aW5nWG1sLkxvYWRYbWwoQ3JlYXRlVm1sRHJhd2luZ3MoKSk7CisgICAgICAgICAgICAgICAgX2ltYWdlcyA9IG5ldyBMaXN0PEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkRHJhd2luZ3NGcm9tWG1sKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQWRkRHJhd2luZ3NGcm9tWG1sKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5vZGVzID0gVm1sRHJhd2luZ1htbC5TZWxlY3ROb2RlcygiLy92OnNoYXBlIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBfaW1hZ2VzID0gbmV3IExpc3Q8RXhjZWxWbWxEcmF3aW5nUGljdHVyZT4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBub2RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW1nID0gbmV3IEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmUobm9kZSwgTmFtZVNwYWNlTWFuYWdlciwgX3dzKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVsID0gUGFydC5HZXRSZWxhdGlvbnNoaXAoaW1nLlJlbElkKTsKKyAgICAgICAgICAgICAgICBpbWcuSW1hZ2VVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgICAgICAgICAgICAgX2ltYWdlcy5BZGQoaW1nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIENyZWF0ZVZtbERyYXdpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHZtbD1zdHJpbmcuRm9ybWF0KCI8eG1sIHhtbG5zOnY9XCJ7MH1cIiB4bWxuczpvPVwiezF9XCIgeG1sbnM6eD1cInsyfVwiPiIsIAorICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRWbWwsIAorICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRPZmZpY2UsIAorICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRFeGNlbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICB2bWwrPSI8bzpzaGFwZWxheW91dCB2OmV4dD1cImVkaXRcIj4iOworICAgICAgICAgICAgIHZtbCs9IjxvOmlkbWFwIHY6ZXh0PVwiZWRpdFwiIGRhdGE9XCIxXCIvPiI7CisgICAgICAgICAgICAgdm1sKz0iPC9vOnNoYXBlbGF5b3V0PiI7CisKKyAgICAgICAgICAgICB2bWwrPSI8djpzaGFwZXR5cGUgaWQ9XCJfeDAwMDBfdDIwMlwiIGNvb3Jkc2l6ZT1cIjIxNjAwLDIxNjAwXCIgbzpzcHQ9XCIyMDJcIiBwYXRoPVwibSxsLDIxNjAwcjIxNjAwLGwyMTYwMCx4ZVwiPiI7CisgICAgICAgICAgICAgdm1sKz0iPHY6c3Ryb2tlIGpvaW5zdHlsZT1cIm1pdGVyXCIgLz4iOworICAgICAgICAgICAgIHZtbCs9Ijx2OnBhdGggZ3JhZGllbnRzaGFwZW9rPVwidFwiIG86Y29ubmVjdHR5cGU9XCJyZWN0XCIgLz4iOworICAgICAgICAgICAgIHZtbCs9IjwvdjpzaGFwZXR5cGU+IjsKKyAgICAgICAgICAgICB2bWwrPSAiPC94bWw+IjsKKworICAgICAgICAgICAgcmV0dXJuIHZtbDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIEFkZChzdHJpbmcgaWQsIFVyaSB1cmksIHN0cmluZyBuYW1lLCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IEFkZEltYWdlKGlkLCB1cmksIG5hbWUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgdmFyIGRyYXcgPSBuZXcgRXhjZWxWbWxEcmF3aW5nUGljdHVyZShub2RlLCBOYW1lU3BhY2VNYW5hZ2VyLCBfd3MpOworICAgICAgICAgICAgZHJhdy5JbWFnZVVyaSA9IHVyaTsKKyAgICAgICAgICAgIF9pbWFnZXMuQWRkKGRyYXcpOworICAgICAgICAgICAgcmV0dXJuIGRyYXc7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBYbWxOb2RlIEFkZEltYWdlKHN0cmluZyBpZCwgVXJpIHRhcmdlVXJpLCBzdHJpbmcgTmFtZSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbm9kZSA9IFZtbERyYXdpbmdYbWwuQ3JlYXRlRWxlbWVudCgidiIsICJzaGFwZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRWbWwpOworICAgICAgICAgICAgVm1sRHJhd2luZ1htbC5Eb2N1bWVudEVsZW1lbnQuQXBwZW5kQ2hpbGQobm9kZSk7CisgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7CisgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgibzp0eXBlIiwgIiNfeDAwMDBfdDc1Iik7CisgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgic3R5bGUiLCBzdHJpbmcuRm9ybWF0KCJwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDowO21hcmdpbi10b3A6MDt3aWR0aDp7MH1wdDtoZWlnaHQ6ezF9cHQ7ei1pbmRleDoxIiwgd2lkdGguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIGhlaWdodC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpOworICAgICAgICAgICAgLy9ub2RlLlNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgIiNmZmZmZTEiKTsKKyAgICAgICAgICAgIC8vbm9kZS5TZXRBdHRyaWJ1dGUoImluc2V0bW9kZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRPZmZpY2UsICJhdXRvIik7CisKKyAgICAgICAgICAgIG5vZGUuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8djppbWFnZWRhdGEgbzpyZWxpZD1cIlwiIG86dGl0bGU9XCJ7MH1cIi8+PG86bG9jayB2OmV4dD1cImVkaXRcIiByb3RhdGlvbj1cInRcIi8+IiwgIE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kZXhlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5JbmRleDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgVk1MIERyYXdpbmcgUGljdHVyZSBvYmplY3Q8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIHRoaXNbaW50IEluZGV4XQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2ltYWdlc1tJbmRleF0gYXMgRXhjZWxWbWxEcmF3aW5nUGljdHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW1hZ2VzLkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IF9uZXh0SUQgPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuZXh0IGRyYXdpbmcgaWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0cmluZyBHZXROZXdJZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dElEID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxWbWxEcmF3aW5nQ29tbWVudCBkcmF3IGluIHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5JZC5MZW5ndGggPiAzICYmIGRyYXcuSWQuU3RhcnRzV2l0aCgidm1sIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoZHJhdy5JZC5TdWJzdHJpbmcoMywgZHJhdy5JZC5MZW5ndGggLSAzKSwgb3V0IGlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPiBfbmV4dElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25leHRJRCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9uZXh0SUQrKzsKKyAgICAgICAgICAgIHJldHVybiAidm1sIiArIF9uZXh0SUQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaW1hZ2VzLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzMzA1NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQb3NpdGlvbi5jcwpAQCAtMCwwICsxLDEzNSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBwb3NpdGlvbiBvZiBhIFZNTCBkcmF3aW5nLiBVc2VkIGZvciBjb21tZW50cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnQgX3N0YXJ0UG9zOworICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsIGludCBzdGFydFBvcykgOiAKKyAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdGFydFBvcyA9IHN0YXJ0UG9zOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJvdy4gWmVybyBiYXNlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFJvdworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0TnVtYmVyKDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0TnVtYmVyKDIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUm93IG9mZnNldCBpbiBwaXhlbHMuIFplcm8gYmFzZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBSb3dPZmZzZXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldE51bWJlcigzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldE51bWJlcigzLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29sdW1uLiBaZXJvIGJhc2VkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXROdW1iZXIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXROdW1iZXIoMCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbHVtbiBvZmZzZXQuIFplcm8gYmFzZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb2x1bW5PZmZzZXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldE51bWJlcigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldE51bWJlcigxLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldE51bWJlcihpbnQgcG9zLCBpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBhbmNob3IgPSBHZXRYbWxOb2RlU3RyaW5nKCJ4OkFuY2hvciIpOworICAgICAgICAgICAgc3RyaW5nW10gbnVtYmVycyA9IGFuY2hvci5TcGxpdCgnLCcpOworICAgICAgICAgICAgaWYgKG51bWJlcnMuTGVuZ3RoID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbnVtYmVyc1tfc3RhcnRQb3MgKyBwb3NdID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQW5jaG9yIGVsZW1lbnQgaXMgaW52YWxpZCBpbiB2bWxEcmF3aW5nIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygieDpBbmNob3IiLCBzdHJpbmcuSm9pbigiLCIsbnVtYmVycykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0TnVtYmVyKGludCBwb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBhbmNob3IgPSBHZXRYbWxOb2RlU3RyaW5nKCJ4OkFuY2hvciIpOworICAgICAgICAgICAgc3RyaW5nW10gbnVtYmVycyA9IGFuY2hvci5TcGxpdCgnLCcpOworICAgICAgICAgICAgaWYgKG51bWJlcnMuTGVuZ3RoID09IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKG51bWJlcnNbX3N0YXJ0UG9zICsgcG9zXSwgb3V0IHJldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIkFuY2hvciBlbGVtZW50IGlzIGludmFsaWQgaW4gdm1sRHJhd2luZyIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FUFBsdXMuY3Nwcm9qIGIvRVBQbHVzL0VQUGx1cy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2MjMxNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FUFBsdXMuY3Nwcm9qCkBAIC0wLDAgKzEsODQxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjEyLjAiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+T2ZmaWNlT3BlblhtbDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkVQUGx1czwvQXNzZW1ibHlOYW1lPgorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5PgorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPk9wZW5PZmZpY2VYbWwuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgorICAgIDxTY2NQcm9qZWN0TmFtZT4KKyAgICA8L1NjY1Byb2plY3ROYW1lPgorICAgIDxTY2NMb2NhbFBhdGg+CisgICAgPC9TY2NMb2NhbFBhdGg+CisgICAgPFNjY0F1eFBhdGg+CisgICAgPC9TY2NBdXhQYXRoPgorICAgIDxTY2NQcm92aWRlcj4KKyAgICA8L1NjY1Byb3ZpZGVyPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDwvVXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPkNsaWVudDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxEb2N1bWVudGF0aW9uRmlsZT5iaW5cRGVidWdcRVBQbHVzLlhNTDwvRG9jdW1lbnRhdGlvbkZpbGU+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8Tm9XYXJuPgorICAgIDwvTm9XYXJuPgorICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+YmluXFJlbGVhc2VcRVBQbHVzLlhNTDwvRG9jdW1lbnRhdGlvbkZpbGU+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+CisgICAgICA8SGludFBhdGg+QzpcUHJvZ3JhbSBGaWxlc1xSZWZlcmVuY2UgQXNzZW1ibGllc1xNaWNyb3NvZnRcRnJhbWV3b3JrXHYzLjVcU3lzdGVtLkNvcmUuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmciIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VjdXJpdHkiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDZWxsU3RvcmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyR3JvdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2Vlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmFuay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFNob3dWYWx1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTdGREZXYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVTdGREZXYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVGYWN0b3J5LmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW51bXMuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGguY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2Vlay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2Vlay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3AuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbkFueS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRXhjZWxEYXRhVmFsaWRhdGlvbkFueS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbFRpbWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uSW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXElSYW5nZURhdGFWYWxpZGF0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXFJhbmdlRGF0YVZhbGlkYXRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbEJhckNoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFN1cmZhY2VDaGFydFNlcmllLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxTdXJmYWNlQ2hhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFJhZGFyQ2hhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbEJ1YmJsZUNoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbExpbmVDaGFydFNlcmllLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQ2hhcnRDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydFRyZW5kbGluZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQnViYmxlQ2hhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0U3VyZmFjZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXEV4Y2VsRHJhd2luZ0Jhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xFeGNlbFBpY3R1cmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFJhZGFyQ2hhcnRTZXJpZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdQaWN0dXJlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcVm1sXEV4Y2VsVm1sRHJhd2luZ0Jhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW5jcnlwdGlvblxFbmNyeXB0aW9uSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbmNyeXB0aW9uXEVuY3J5cHRpb25IZWFkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW5jcnlwdGlvblxFbmNyeXB0aW9uSW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbmNyeXB0aW9uXEVuY3J5cHRpb25WZXJpZmllci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbEJhY2tncm91bmRJbWFnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsRW5jcnlwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFByb3RlY3RlZFJhbmdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsU3R5bGVDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsQ29sdW1uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcRXhjZWxEcmF3aW5ncy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbEhlYWRlckZvb3Rlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFBhY2thZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxSYW5nZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFJvdy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXEV4Y2VsU2hhcGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxTdHlsZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxQcm90ZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsVGV4dEZvcm1hdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xDYWxjdWxhdGVFeHRlbnRpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXERlcGVuZGVuY3lDaGFpblxEZXBlbmRlbnlDaGFpbkZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRGVwZW5kZW5jeUNoYWluXERlcGVuZGVuY3lDaGFpbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xEZXBlbmRlbmN5Q2hhaW5cRm9ybXVsYUNlbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxDYWxjdWxhdGlvbk9wdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbENlbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxEYXRhUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcQWRkcmVzc1RyYW5zbGF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcQ2VsbFJlZmVyZW5jZVByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEV4Y2VsQWRkcmVzc0luZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcRXhjZWxBZGRyZXNzVXRpbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xFeGNlbFJlZmVyZW5jZVR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcRm9ybXVsYURlcGVuZGVuY2llcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xGb3JtdWxhRGVwZW5kZW5jeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xGb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXExvb2t1cFZhbHVlTWF0Y2hlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xSYW5nZUFkZHJlc3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcUmFuZ2VBZGRyZXNzRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xWYWx1ZU1hdGNoZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcV2lsZENhcmRWYWx1ZU1hdGNoZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxWYWx1ZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXENvbXBpbGVSZXN1bHRWYWxpZGF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXENvbXBpbGVSZXN1bHRWYWxpZGF0b3JzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xDZWxsU3RhdGVIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRXhjZWxDZWxsU3RhdGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEFyZ3VtZW50Q29sbGVjdGlvblV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEFyZ3VtZW50UGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xBcmd1bWVudFBhcnNlckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEFyZ3VtZW50UGFyc2Vycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQm9vbEFyZ3VtZW50UGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xCdWlsdEluRnVuY3Rpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xDb2xsZWN0aW9uRmxhdHRlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEYXRhYmFzZUZ1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEYXZlcmFnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRGNvdW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEY291bnRBLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEZ2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEbWF4LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEbWluLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEc3VtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEdmFyLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxEdmFycC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRXhjZWxEYXRhYmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRXhjZWxEYXRhYmFzZUNyaXRlcmlhLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRXhjZWxEYXRhYmFzZUZpZWxkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxFeGNlbERhdGFiYXNlUm93LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxSb3dNYXRjaGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxEYXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxEYXRlUGFyc2luZ0Z1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxEYXRlU3RyaW5nUGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxEYXkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXERheXMzNjAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXEVkYXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxFb21vbnRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxIb3VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxJc29XZWVrTnVtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxXZWVrbnVtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxNaW51dGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXE1vbnRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxOb3cuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXFNlY29uZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcVGltZUJhc2VGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcVGltZVN0cmluZ1BhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcVG9kYXkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXFdlZWtkYXkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXFdvcmtkYXkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXFllYXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXFllYXJmcmFjLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRG91YmxlQXJndW1lbnRQYXJzZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEVycm9ySGFuZGxpbmdGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRXhjZWxGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRnVuY3Rpb25Bcmd1bWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRnVuY3Rpb25SZXBvc2l0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xGdW5jdGlvbnNNb2R1bGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXElGdW5jdGlvbk1vZHVsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSUZ1bmN0aW9uTmFtZVByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxFcnJvclR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzQmxhbmsuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzRXJyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxJc0Vycm9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxJc0V2ZW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzTG9naWNhbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNOYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNOb25UZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxJc051bWJlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNPZGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cTi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cTmEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEludEFyZ3VtZW50UGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXEFuZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTG9naWNhbFxGYWxzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTG9naWNhbFxJZi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTG9naWNhbFxJZkVycm9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXElmTmEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXExvZ2ljYWxcTm90LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXE9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXFRydWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQWJzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEFjb3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQWNvc2guY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXNpbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBc2luaC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBdGFuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEF0YW4yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEF0YW5oLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEF2ZXJhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXZlcmFnZUEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXZlcmFnZUlmLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEF2ZXJhZ2VJZnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQ2VpbGluZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDb3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQ29zaC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDb3VudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDb3VudEEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQ291bnRCbGFuay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDb3VudElmLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXENvdW50SWZzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXERlZ3JlZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcRXhwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEZhY3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcRmxvb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTGFyZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTG4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTG9nLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXExvZzEwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXE1hdGhIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTWF4LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXE1heGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTWVkaWFuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXE1pbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxNaW5hLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXE1vZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcUGkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcUG93ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcUHJvZHVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxRdW90aWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxSYW5kLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFJhbmRCZXR3ZWVuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFJvdW5kLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFJvdW5kZG93bi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxSb3VuZHVwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFNpZ24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU2luLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFNpbmguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU21hbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3FydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTcXJ0UGkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3RkZXYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3RkZXZQLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFN1YnRvdGFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFN1bS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTdW1JZi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTdW1JZnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3VtUHJvZHVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTdW1zcS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxUYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcVGFuaC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxUcnVuYy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxWYXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcVmFyTWV0aG9kcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxWYXJQLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xOdW1lcmljXENJbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxBZGRyZXNzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcQXJyYXlMb29rdXBOYXZpZ2F0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxDaG9vc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxDb2x1bW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxDb2x1bW5zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcRXhjZWxMb29rdXBOYXZpZ2F0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxITG9va3VwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcSW5kZXguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxJbmRpcmVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cEFyZ3VtZW50cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cERpcmVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cEZ1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcTG9va3VwTmF2aWdhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXE1hdGNoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcT2Zmc2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcUm93LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcUm93cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXFZMb29rdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcQ2hhckZ1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XENvbmNhdGVuYXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XENTdHIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcRXhhY3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcRmluZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxGaXhlZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxIeXBlcmxpbmsuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcTGVmdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxMZW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcTG93ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcUmVwdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxUZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XE1pZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxQcm9wZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcUmVwbGFjZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxSaWdodC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxTdWJzdGl0dXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XFQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcVXBwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcT3BlcmF0b3JzXElPcGVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxPcGVyYXRvcnNcT3BlcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcT3BlcmF0b3JzXE9wZXJhdG9ycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxPcGVyYXRvcnNcT3BlcmF0b3JzRGljdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlcHRpb25zXENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VwdGlvbnNcRXhjZWxFcnJvckNvZGVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VwdGlvbnNcRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VwdGlvbnNcVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEF0b21pY0V4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEJvb2xlYW5FeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxDb21waWxlUmVzdWx0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxDb21waWxlUmVzdWx0RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQ29tcGlsZVN0cmF0ZWd5XENvbXBpbGVTdHJhdGVneS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQ29tcGlsZVN0cmF0ZWd5XENvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXENvbXBpbGVTdHJhdGVneVxEZWZhdWx0Q29tcGlsZVN0cmF0ZWd5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxDb21waWxlU3RyYXRlZ3lcSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXENvbXBpbGVTdHJhdGVneVxTdHJpbmdDb25jYXRTdHJhdGVneS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRXhjZWxFcnJvckV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXERhdGFUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxEYXRlRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRGVjaW1hbEV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEVudW1lcmFibGVFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeGNlbEFkZHJlc3NFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXENvbnN0YW50RXhwcmVzc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25Db252ZXJ0ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25GYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uR3JhcGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25HcmFwaEJ1aWxkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxGdW5jdGlvbkNvbXBpbGVyc1xEZWZhdWx0Q29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQ29tcGlsZXJzXEVycm9ySGFuZGxpbmdGdW5jdGlvbkNvbXBpbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxGdW5jdGlvbkNvbXBpbGVyc1xGdW5jdGlvbkNvbXBpbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxGdW5jdGlvbkNvbXBpbGVyc1xGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25Db21waWxlcnNcSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQ29tcGlsZXJzXElmRnVuY3Rpb25Db21waWxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25Db21waWxlcnNcSWZOYUZ1bmN0aW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQ29tcGlsZXJzXExvb2t1cEZ1bmN0aW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcR3JvdXBFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxJRXhwcmVzc2lvbkNvbXBpbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxJRXhwcmVzc2lvbkNvbnZlcnRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcSUV4cHJlc3Npb25GYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxJRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcSW50ZWdlckV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXE5hbWVkVmFsdWVFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxTdHJpbmdFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEZvcm11bGFQYXJzZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRm9ybXVsYVBhcnNlck1hbmFnZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTG9nZ2luZ1xJRm9ybXVsYVBhcnNlckxvZ2dlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJTmFtZVZhbHVlUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSVBhcnNpbmdMaWZldGltZUV2ZW50SGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRnVuY3Rpb25OYW1lUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXElMZXhlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcSVNvdXJjZUNvZGVUb2tlbml6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXElTeW50YWN0aWNBbmFseXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcSVRva2VuRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXExleGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xTb3VyY2VDb2RlVG9rZW5pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xTeW50YWN0aWNBbmFseXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcVG9rZW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcVG9rZW5pemVyQ29udGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcVG9rZW5UeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEVwcGx1c05hbWVWYWx1ZVByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExvZ2dpbmdcTG9nZ2VyRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMb2dnaW5nXFRleHRGaWxlTG9nZ2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXE5hbWVWYWx1ZVByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFBhcnNlZFZhbHVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFBhcnNpbmdDb25maWd1cmF0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFBhcnNpbmdDb250ZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFBhcnNpbmdTY29wZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzaW5nU2NvcGVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFV0aWxpdGllc1xBcmd1bWVudEluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcVXRpbGl0aWVzXEV4dGVuc2lvbk1ldGhvZHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcVXRpbGl0aWVzXElkUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcVXRpbGl0aWVzXEludGVnZXJJZFByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFV0aWxpdGllc1xSZWdleENvbnN0YW50cy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xVdGlsaXRpZXNcUmVxdWlyZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXENvbUhlbHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXENSQzMyLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcRW5jcnlwdGlvbkFsZ29yaXRobS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXEV2ZW50cy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXEV4Y2VwdGlvbnMuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcRmlsZVNlbGVjdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcT2Zmc2V0U3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcU2hhcmVkLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcV2luWmlwQWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwQ3J5cHRvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRGlyRW50cnkuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBFbnRyeS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEVudHJ5LkV4dHJhY3QuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBFbnRyeS5SZWFkLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRW50cnkuV3JpdGUuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBFbnRyeVNvdXJjZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEVycm9yQWN0aW9uLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5BZGRVcGRhdGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBGaWxlLkNoZWNrLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuRXZlbnRzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5FeHRyYWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5SZWFkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5TYXZlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5TYXZlU2VsZkV4dHJhY3Rvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuU2VsZWN0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBGaWxlLngtSUVudW1lcmFibGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBJbnB1dFN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcE91dHB1dFN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcFNlZ21lbnRlZFN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcRGVmbGF0ZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcRGVmbGF0ZVN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcR1ppcFN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcSW5mbGF0ZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcSW5mVHJlZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmxpYlxUcmVlLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmxpYlxabGliLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmxpYlxabGliQmFzZVN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcWmxpYkNvZGVjLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmxpYlxabGliQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmxpYlxabGliU3RyZWFtLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlJhbmdlQ29sbGVjdGlvbi5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xDb252ZXJ0VXRpbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xVcmlIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXFppcFBhY2thZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVkJBXEV4Y2VsVmJhTW9kdWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlZCQVxFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJWQkFcRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlZCQVxFeGNlbFZiYVByb2plY3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxXb3JrYm9va1ZpZXcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxXb3Jrc2hlZXRWaWV3LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXER4ZlxEeGZTdHlsZUJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRHhmXEV4Y2VsRHhmQm9yZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXER4ZlxFeGNlbER4ZkJvcmRlckl0ZW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRHhmXEV4Y2VsRHhmQ29sb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRHhmXEV4Y2VsRHhmRmlsbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxEeGZcRXhjZWxEeGZGb250QmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxEeGZcRXhjZWxEeGZOdW1iZXJGb3JtYXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRHhmXEV4Y2VsRHhmU3R5bGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxHcmFkaWVudEZpbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcWG1sQWNjZXNzXEV4Y2VsR3JhZGllbnRGaWxsWG1sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXElTdHlsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPZmZpY2VQcm9wZXJ0aWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsV29ya2Jvb2suY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxXb3Jrc2hlZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxXb3Jrc2hlZXRzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xFeGNlbEJvcmRlclhtbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxCb3JkZXJJdGVtWG1sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xFeGNlbFhmc1htbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxOYW1lZFN0eWxlWG1sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xFeGNlbENvbG9yWG1sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xFeGNlbEZpbGxYbWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcWG1sQWNjZXNzXEV4Y2VsRm9udFhtbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxOdW1iZXJGb3JtYXRYbWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcU3R5bGVDaGFuZ2VFdmVudEFyZ3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGFibGVcUGl2b3RUYWJsZVxFeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdFRhYmxlRmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGFibGVcUGl2b3RUYWJsZVxFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdFRhYmxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXEV4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXEV4Y2VsVGFibGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGFibGVcRXhjZWxUYWJsZUNvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGFibGVcRXhjZWxUYWJsZUNvbHVtbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xBZGRyZXNzVXRpbGl0eS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xBcmd1bWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xBcmd1bWVudEV4dGVuc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcQ29tcG91bmREb2N1bWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xJQXJndW1lbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcUmVxdWlyZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xTcVJlZlV0aWxpdHkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVkJBXEV4Y2VsVmJhUHJvdGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJWQkFcRXhjZWxWYmFSZWZlcmVuY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVkJBXEV4Y2VsVmJhU2lnbmF0dXJlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlhtbEhlbHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxIZWxwZXJGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xaaXBQYWNrYWdlUGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcWmlwUGFja2FnZVJlbGF0aW9uc2hpcC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXFppcFBhY2thZ2VSZWxhdGlvbnNoaXBCYXNlLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsTGluZUNoYXJ0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcVm1sXEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xWbWxcRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xWbWxcRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxBZGRyZXNzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsQ2VsbEFkZHJlc3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxDb21tZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsQ29tbWVudENvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxTaGVldFByb3RlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0TGVnZW5kLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydFBsb3RBcmVhLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQ2hhcnRUaXRsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXEV4Y2VsRHJhd2luZ0JvcmRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsT2ZQaWVDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXEV4Y2VsRHJhd2luZ0ZpbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFBpZUNoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xFeGNlbFZpZXczRC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQmFyQ2hhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0QXhpcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQ2hhcnREYXRhTGFiZWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0U2VyaWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxEb3VnaG51dENoYXJ0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxQaWVDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsU2NhdHRlckNoYXJ0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsQ2VsbEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxIeXBlckxpbmsuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxOYW1lZFJhbmdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxQcmludGVyU2V0dGluZ3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxSYW5nZUJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJhbmdlSUQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxQYXJhZ3JhcGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxQYXJhZ3JhcGhDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsQm9yZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsQm9yZGVySXRlbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbENvbG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsRmlsbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbFJpY2hUZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlV0aWxzXElFeGNlbENlbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxTdHlsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbEZvbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcWG1sQWNjZXNzXFN0eWxlWG1sSGVscGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsTnVtYmVyRm9ybWF0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFN0eWxlQmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbFRleHRGb250LmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJPcGVuT2ZmaWNlWG1sLnNuayIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENGIEltcGxlbWVudGF0aW9uLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQb3N0QnVpbGRFdmVudD4KKyAgICA8L1Bvc3RCdWlsZEV2ZW50PgorICAgIDxQcmVCdWlsZEV2ZW50PgorICAgIDwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9FUFBsdXNOZXQ0LmNzcHJvaiBiL0VQUGx1cy9FUFBsdXNOZXQ0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdiM2IwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0VQUGx1c05ldDQuY3Nwcm9qCkBAIC0wLDAgKzEsODYwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjEyLjAiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57QkU0QTYzNDMtRjQxMS00NEEzLThENkYtRjQwNzQ3RUQ3QkE1fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+T2ZmaWNlT3BlblhtbDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkVQUGx1czwvQXNzZW1ibHlOYW1lPgorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5PgorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPk9wZW5PZmZpY2VYbWwuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgorICAgIDxTY2NQcm9qZWN0TmFtZT4KKyAgICA8L1NjY1Byb2plY3ROYW1lPgorICAgIDxTY2NMb2NhbFBhdGg+CisgICAgPC9TY2NMb2NhbFBhdGg+CisgICAgPFNjY0F1eFBhdGg+CisgICAgPC9TY2NBdXhQYXRoPgorICAgIDxTY2NQcm92aWRlcj4KKyAgICA8L1NjY1Byb3ZpZGVyPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDwvVXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPkNsaWVudDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1ZzRcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+YmluXERlYnVnNFxFUFBsdXMuWE1MPC9Eb2N1bWVudGF0aW9uRmlsZT4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxOb1dhcm4+MTUxOTEsIENTMTU5MTwvTm9XYXJuPgorICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2U0XDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPERvY3VtZW50YXRpb25GaWxlPmJpblxSZWxlYXNlNFxFUFBsdXMuWE1MPC9Eb2N1bWVudGF0aW9uRmlsZT4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RldlRlc3R8QW55Q1BVJyI+CisgICAgPE91dHB1dFBhdGg+YmluXDwvT3V0cHV0UGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iUHJlc2VudGF0aW9uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4KKyAgICAgIDxIaW50UGF0aD5DOlxQcm9ncmFtIEZpbGVzXFJlZmVyZW5jZSBBc3NlbWJsaWVzXE1pY3Jvc29mdFxGcmFtZXdvcmtcdjMuNVxTeXN0ZW0uQ29yZS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZWN1cml0eSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNlbGxTdG9yZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZUdyb3VwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEdyb3VwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJldmVyc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb250cmFjdHNcSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFN0ZERldi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbi5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZUZhY3RvcnkuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbnVtcy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RNb250aC5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2Vlay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dE1vbnRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUnVsZXNcRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXENvbnRyYWN0c1xJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29udHJhY3RzXElSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29uZGl0aW9uYWxGb3JtYXR0aW5nXFJ1bGVzXEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xSdWxlc1xFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb250U2l6ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uQW55LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ29udHJhY3RzXElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhPcGVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uQW55LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDb250cmFjdHNcSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXENvbnRyYWN0c1xJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cSVJhbmdlRGF0YVZhbGlkYXRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cUmFuZ2VEYXRhVmFsaWRhdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQmFyQ2hhcnRTZXJpZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsU3VyZmFjZUNoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFN1cmZhY2VDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsUmFkYXJDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQnViYmxlQ2hhcnRTZXJpZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsTGluZUNoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydENvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0VHJlbmRsaW5lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxCdWJibGVDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQ2hhcnRTdXJmYWNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcRXhjZWxEcmF3aW5nQmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXEV4Y2VsRHJhd2luZ0xpbmVFbmQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xFeGNlbFBpY3R1cmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFJhZGFyQ2hhcnRTZXJpZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdQaWN0dXJlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcVm1sXEV4Y2VsVm1sRHJhd2luZ0Jhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW5jcnlwdGlvblxFbmNyeXB0aW9uSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbmNyeXB0aW9uXEVuY3J5cHRpb25IZWFkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW5jcnlwdGlvblxFbmNyeXB0aW9uSW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbmNyeXB0aW9uXEVuY3J5cHRpb25WZXJpZmllci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbEJhY2tncm91bmRJbWFnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbERhdGFWYWxpZGF0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsRW5jcnlwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFByb3RlY3RlZFJhbmdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUmFuZ2VDb3B5T3B0aW9uRmxhZ3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxTdHlsZUNvbGxlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxDb2x1bW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xFeGNlbERyYXdpbmdzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsSGVhZGVyRm9vdGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUGFja2FnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFJhbmdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUm93LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcRXhjZWxTaGFwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFN0eWxlcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFByb3RlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxUZXh0Rm9ybWF0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXENhbGN1bGF0ZUV4dGVudGlvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRGVwZW5kZW5jeUNoYWluXERlcGVuZGVueUNoYWluRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xEZXBlbmRlbmN5Q2hhaW5cRGVwZW5kZW5jeUNoYWluLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXERlcGVuZGVuY3lDaGFpblxGb3JtdWxhQ2VsbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFcHBsdXNFeGNlbERhdGFQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbENhbGN1bGF0aW9uT3B0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsQ2VsbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbERhdGFQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xBZGRyZXNzVHJhbnNsYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xDZWxsUmVmZXJlbmNlUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcRXhjZWxBZGRyZXNzSW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xFeGNlbEFkZHJlc3NVdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEV4Y2VsUmVmZXJlbmNlVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xFeHByZXNzaW9uRXZhbHVhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEZvcm11bGFEZXBlbmRlbmNpZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcRm9ybXVsYURlcGVuZGVuY3kuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcRm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xMb29rdXBWYWx1ZU1hdGNoZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcUmFuZ2VBZGRyZXNzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFJhbmdlQWRkcmVzc0ZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcVmFsdWVNYXRjaGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFdpbGRDYXJkVmFsdWVNYXRjaGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVmFsdWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xDb21waWxlUmVzdWx0VmFsaWRhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xDb21waWxlUmVzdWx0VmFsaWRhdG9ycy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQ2VsbFN0YXRlSGVscGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEV4Y2VsQ2VsbFN0YXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xBcmd1bWVudENvbGxlY3Rpb25VdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xBcmd1bWVudFBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQXJndW1lbnRQYXJzZXJGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xBcmd1bWVudFBhcnNlcnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEJvb2xBcmd1bWVudFBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQnVpbHRJbkZ1bmN0aW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQ29sbGVjdGlvbkZsYXR0ZW5lci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRGF0YWJhc2VGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRGF2ZXJhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGFiYXNlXERjb3VudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRGNvdW50QS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRGdldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRG1heC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRG1pbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRHN1bS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRHZhci5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRHZhcnAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGFiYXNlXEV4Y2VsRGF0YWJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGFiYXNlXEV4Y2VsRGF0YWJhc2VDcml0ZXJpYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGFiYXNlXEV4Y2VsRGF0YWJhc2VGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRXhjZWxEYXRhYmFzZVJvdy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcUm93TWF0Y2hlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcRGF0ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcRGF0ZVBhcnNpbmdGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcRGF0ZVN0cmluZ1BhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcRGF0ZVZhbHVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxEYXkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXERheXMzNjAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXEVkYXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxFb21vbnRoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxIb3VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxJc29XZWVrTnVtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxUaW1lVmFsdWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXFdlZWtudW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXE1pbnV0ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcTW9udGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lXE5vdy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcU2Vjb25kLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxUaW1lLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxUaW1lQmFzZUZ1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxUaW1lU3RyaW5nUGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZVxUb2RheS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcV2Vla2RheS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcV29ya2RheS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcWWVhci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0ZVRpbWVcWWVhcmZyYWMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEb3VibGVBcmd1bWVudFBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRXJyb3JIYW5kbGluZ0Z1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xFeGNlbEZ1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xGdW5jdGlvbkFyZ3VtZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xGdW5jdGlvblJlcG9zaXRvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEZ1bmN0aW9uc01vZHVsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSUZ1bmN0aW9uTW9kdWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJRnVuY3Rpb25OYW1lUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXEVycm9yVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNCbGFuay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNFcnIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzRXJyb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzRXZlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNMb2dpY2FsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxJc05hLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxJc05vblRleHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEluZm9ybWF0aW9uXElzTnVtYmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxJc09kZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25cSXNUZXh0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxOLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvblxOYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW50QXJndW1lbnRQYXJzZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXExvZ2ljYWxcQW5kLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXEZhbHNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXElmLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsXElmRXJyb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXExvZ2ljYWxcSWZOYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTG9naWNhbFxOb3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXExvZ2ljYWxcT3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXExvZ2ljYWxcVHJ1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBYnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQWNvcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBY29zaC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBc2luLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEFzaW5oLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXEF0YW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXRhbjIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXRhbmguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXZlcmFnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBdmVyYWdlQS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxBdmVyYWdlSWYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQXZlcmFnZUlmcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDZWlsaW5nLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXENvcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDb3NoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXENvdW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXENvdW50QS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxDb3VudEJsYW5rLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXENvdW50SWYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcQ291bnRJZnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcRGVncmVlcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxFeHAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcRmFjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxGbG9vci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxMYXJnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxMbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxMb2cuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTG9nMTAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTWF0aEhlbHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxNYXguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTWF4YS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxNZWRpYW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTWluLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXE1pbmEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcTW9kLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXE11bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxQaS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxQb3dlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxQcm9kdWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFF1b3RpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFJhbmsuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcUmFuZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxSYW5kQmV0d2Vlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxSb3VuZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxSb3VuZGRvd24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcUm91bmR1cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTaWduLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFNpbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTaW5oLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFNtYWxsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFNxcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3FydFBpLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFN0ZGV2LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFN0ZGV2UC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTdWJ0b3RhbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTWF0aFxTdW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3VtSWYuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3VtSWZzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFN1bVByb2R1Y3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcU3Vtc3EuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcVGFuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFRhbmguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcVHJ1bmMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcVmFyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoXFZhck1ldGhvZHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhcVmFyUC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTnVtZXJpY1xDSW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xPYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcQWRkcmVzcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXEFycmF5TG9va3VwTmF2aWdhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcQ2hvb3NlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcQ29sdW1uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcQ29sdW1ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXEV4Y2VsTG9va3VwTmF2aWdhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcSExvb2t1cC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXEluZGV4LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcSW5kaXJlY3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxMb29rdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxMb29rdXBBcmd1bWVudHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxMb29rdXBEaXJlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxMb29rdXBGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cE5hdmlnYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cE5hdmlnYXRvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxNYXRjaC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXE9mZnNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXFJvdy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXFJvd3MuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxWTG9va3VwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XENoYXJGdW5jdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxDb25jYXRlbmF0ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxDU3RyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XEV4YWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XEZpbmQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcRml4ZWQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcSHlwZXJsaW5rLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XExlZnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcTGVuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XExvd2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XFJlcHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcU2VhcmNoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XFRleHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcTWlkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XFByb3Blci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxSZXBsYWNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XFJpZ2h0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0XFN1YnN0aXR1dGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRcVC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxVcHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGV4dFxWYWx1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxPcGVyYXRvcnNcSU9wZXJhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXE9wZXJhdG9yc1xPcGVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxPcGVyYXRvcnNcT3BlcmF0b3JzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXE9wZXJhdG9yc1xPcGVyYXRvcnNEaWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VwdGlvbnNcQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZXB0aW9uc1xFeGNlbEVycm9yQ29kZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZXB0aW9uc1xFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZXB0aW9uc1xVbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQXRvbWljRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQm9vbGVhbkV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXENvbXBpbGVSZXN1bHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXENvbXBpbGVSZXN1bHRGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxDb21waWxlU3RyYXRlZ3lcQ29tcGlsZVN0cmF0ZWd5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxDb21waWxlU3RyYXRlZ3lcQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQ29tcGlsZVN0cmF0ZWd5XERlZmF1bHRDb21waWxlU3RyYXRlZ3kuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXENvbXBpbGVTdHJhdGVneVxJQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQ29tcGlsZVN0cmF0ZWd5XFN0cmluZ0NvbmNhdFN0cmF0ZWd5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeGNlbEVycm9yRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRGF0YVR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXERhdGVFeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxEZWNpbWFsRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRW51bWVyYWJsZUV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25Db21waWxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQ29uc3RhbnRFeHByZXNzaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRXhwcmVzc2lvbkNvbnZlcnRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRXhwcmVzc2lvbkZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25HcmFwaC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQ29tcGlsZXJzXERlZmF1bHRDb21waWxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25Db21waWxlcnNcRXJyb3JIYW5kbGluZ0Z1bmN0aW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQ29tcGlsZXJzXEZ1bmN0aW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEZ1bmN0aW9uQ29tcGlsZXJzXEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxGdW5jdGlvbkNvbXBpbGVyc1xJZkVycm9yRnVuY3Rpb25Db21waWxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25Db21waWxlcnNcSWZGdW5jdGlvbkNvbXBpbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxGdW5jdGlvbkNvbXBpbGVyc1xJZk5hRnVuY3Rpb25Db21waWxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25Db21waWxlcnNcTG9va3VwRnVuY3Rpb25Db21waWxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRnVuY3Rpb25FeHByZXNzaW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxHcm91cEV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXElFeHByZXNzaW9uQ29tcGlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXElFeHByZXNzaW9uQ29udmVydGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxJRXhwcmVzc2lvbkZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXElFeHByZXNzaW9uR3JhcGhCdWlsZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxJbnRlZ2VyRXhwcmVzc2lvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcTmFtZWRWYWx1ZUV4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXFN0cmluZ0V4cHJlc3Npb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRm9ybXVsYVBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xGb3JtdWxhUGFyc2VyTWFuYWdlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcSVRva2VuSW5kZXhQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcVG9rZW5IYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xUb2tlblNlcGFyYXRvckhhbmRsZXJzXEJyYWNrZXRIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xUb2tlblNlcGFyYXRvckhhbmRsZXJzXE11bHRpcGxlQ2hhclNlcGFyYXRvckhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuU2VwYXJhdG9ySGFuZGxlcnNcU2VwYXJhdG9ySGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcVG9rZW5TZXBhcmF0b3JIYW5kbGVyc1xTaGVldG5hbWVIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xUb2tlblNlcGFyYXRvckhhbmRsZXJzXFN0cmluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuU2VwYXJhdG9ySGFuZGxlcnNcVG9rZW5TZXBhcmF0b3JIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExvZ2dpbmdcSUZvcm11bGFQYXJzZXJMb2dnZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSU5hbWVWYWx1ZVByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEZ1bmN0aW9uTmFtZVByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xJTGV4ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXElTb3VyY2VDb2RlVG9rZW5pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xJU3ludGFjdGljQW5hbHl6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXElUb2tlbkZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXElUb2tlblNlcGFyYXRvclByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xMZXhlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcU291cmNlQ29kZVRva2VuaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcU3ludGFjdGljQW5hbHl6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xUb2tlbkZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuaXplckNvbnRleHQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuU2VwYXJhdG9yUHJvdmlkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFcHBsdXNOYW1lVmFsdWVQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMb2dnaW5nXExvZ2dlckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTG9nZ2luZ1xUZXh0RmlsZUxvZ2dlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xOYW1lVmFsdWVQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzZWRWYWx1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzaW5nQ29uZmlndXJhdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzaW5nQ29udGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzaW5nU2NvcGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcUGFyc2luZ1Njb3Blcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xVdGlsaXRpZXNcQXJndW1lbnRJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFV0aWxpdGllc1xFeHRlbnNpb25NZXRob2RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFV0aWxpdGllc1xJZFByb3ZpZGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFV0aWxpdGllc1xJbnRlZ2VySWRQcm92aWRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xVdGlsaXRpZXNcUmVnZXhDb25zdGFudHMuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcVXRpbGl0aWVzXFJlcXVpcmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxDb21IZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxDUkMzMi5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXEVuY3J5cHRpb25BbGdvcml0aG0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxFdmVudHMuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxFeGNlcHRpb25zLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXEZpbGVTZWxlY3Rvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXE9mZnNldFN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFNoYXJlZC5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFdpblppcEFlcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcENvbnN0YW50cy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcENyeXB0by5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcERpckVudHJ5LmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRW50cnkuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBFbnRyeS5FeHRyYWN0LmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRW50cnkuUmVhZC5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEVudHJ5LldyaXRlLmNzIj4KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRW50cnlTb3VyY2UuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBFcnJvckFjdGlvbi5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuQWRkVXBkYXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS5DaGVjay5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBGaWxlLkV2ZW50cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuRXh0cmFjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuUmVhZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuU2F2ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFppcEZpbGUuU2F2ZVNlbGZFeHRyYWN0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBGaWxlLlNlbGVjdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwRmlsZS54LUlFbnVtZXJhYmxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xEb3ROZXRaaXBcWmlwSW5wdXRTdHJlYW0uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBPdXRwdXRTdHJlYW0uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxaaXBTZWdtZW50ZWRTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXERlZmxhdGUuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXERlZmxhdGVTdHJlYW0uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXEdaaXBTdHJlYW0uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXEluZmxhdGUuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXEluZlRyZWUuY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcVHJlZS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcWmxpYi5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcWmxpYkJhc2VTdHJlYW0uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXERvdE5ldFppcFxabGliXFpsaWJDb2RlYy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcWmxpYkNvbnN0YW50cy5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcRG90TmV0WmlwXFpsaWJcWmxpYlN0cmVhbS5jcyI+CisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJSYW5nZUNvbGxlY3Rpb24uY3MiPgorICAgICAgPFN1YlR5cGU+Q29kZTwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcQ29udmVydFV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcVXJpSGVscGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xaaXBQYWNrYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlZCQVxFeGNlbFZiYU1vZHVsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJWQkFcRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVkJBXEV4Y2VsVmJhTW9kdWxlQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJWQkFcRXhjZWxWYmFQcm9qZWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsV29ya2Jvb2tWaWV3LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsV29ya3NoZWV0Vmlldy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxEeGZcRHhmU3R5bGVCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXER4ZlxFeGNlbER4ZkJvcmRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxEeGZcRXhjZWxEeGZCb3JkZXJJdGVtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXER4ZlxFeGNlbER4ZkNvbG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXER4ZlxFeGNlbER4ZkZpbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRHhmXEV4Y2VsRHhmRm9udEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRHhmXEV4Y2VsRHhmTnVtYmVyRm9ybWF0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXER4ZlxFeGNlbER4ZlN0eWxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsR3JhZGllbnRGaWxsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xFeGNlbEdyYWRpZW50RmlsbFhtbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGFibGVcUGl2b3RUYWJsZVxFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGFibGVcUGl2b3RUYWJsZVxFeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxJU3R5bGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iT2ZmaWNlUHJvcGVydGllcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbFdvcmtib29rLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsV29ya3NoZWV0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsV29ya3NoZWV0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxCb3JkZXJYbWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcWG1sQWNjZXNzXEV4Y2VsQm9yZGVySXRlbVhtbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxYZnNYbWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcWG1sQWNjZXNzXEV4Y2VsTmFtZWRTdHlsZVhtbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxDb2xvclhtbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxYbWxBY2Nlc3NcRXhjZWxGaWxsWG1sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xFeGNlbEZvbnRYbWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcWG1sQWNjZXNzXEV4Y2VsTnVtYmVyRm9ybWF0WG1sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFN0eWxlQ2hhbmdlRXZlbnRBcmdzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZUZpZWxkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXFBpdm90VGFibGVcRXhjZWxQaXZvdFRhYmxlQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxQaXZvdFRhYmxlXEV4Y2VsUGl2b3RUYWJsZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUYWJsZVxFeGNlbFRhYmxlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXEV4Y2VsVGFibGVDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRhYmxlXEV4Y2VsVGFibGVDb2x1bW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcQWRkcmVzc1V0aWxpdHkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcQXJndW1lbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcQXJndW1lbnRFeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlV0aWxzXENvbXBvdW5kRG9jdW1lbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcSUFyZ3VtZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlV0aWxzXFJlcXVpcmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcU3FSZWZVdGlsaXR5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlZCQVxFeGNlbFZiYVByb3RlY3Rpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVkJBXEV4Y2VsVmJhUmVmZXJlbmNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlZCQVxFeGNlbFZiYVNpZ25hdHVyZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJYbWxIZWxwZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iWG1sSGVscGVyRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYWNrYWdpbmdcWmlwUGFja2FnZVBhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXFppcFBhY2thZ2VSZWxhdGlvbnNoaXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUGFja2FnaW5nXFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhY2thZ2luZ1xaaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZS5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbExpbmVDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXFZtbFxFeGNlbFZtbERyYXdpbmdDb21tZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcVm1sXEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcVm1sXEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsQWRkcmVzcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbENlbGxBZGRyZXNzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsQ29tbWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbENvbW1lbnRDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsU2hlZXRQcm90ZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydExlZ2VuZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQ2hhcnRQbG90QXJlYS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsU2NhdHRlckNoYXJ0U2VyaWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0VGl0bGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xFeGNlbERyYXdpbmdCb3JkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbE9mUGllQ2hhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xFeGNlbERyYXdpbmdGaWxsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxQaWVDaGFydFNlcmllLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcRXhjZWxWaWV3M0QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbEJhckNoYXJ0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydEF4aXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbENoYXJ0RGF0YUxhYmVsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydFNlcmllLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdcQ2hhcnRcRXhjZWxDaGFydFNlcmllcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsRG91Z2hudXRDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEcmF3aW5nXENoYXJ0XEV4Y2VsUGllQ2hhcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1xDaGFydFxFeGNlbFNjYXR0ZXJDaGFydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbENlbGxCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsSHlwZXJMaW5rLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsTmFtZWRSYW5nZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUHJpbnRlclNldHRpbmdzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsUmFuZ2VCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklSYW5nZUlELmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsUGFyYWdyYXBoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbEJvcmRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbEJvcmRlckl0ZW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxDb2xvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbEZpbGwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxSaWNoVGV4dC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xJRXhjZWxDZWxsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXEV4Y2VsU3R5bGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxGb250LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0eWxlXFhtbEFjY2Vzc1xTdHlsZVhtbEhlbHBlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxFeGNlbE51bWJlckZvcm1hdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTdHlsZVxTdHlsZUJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3R5bGVcRXhjZWxUZXh0Rm9udC5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iT3Blbk9mZmljZVhtbC5zbmsiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDRiBJbXBsZW1lbnRhdGlvbi5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UG9zdEJ1aWxkRXZlbnQ+CisgICAgPC9Qb3N0QnVpbGRFdmVudD4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uSGFuZGxlci5jcyBiL0VQUGx1cy9FbmNyeXB0aW9uL0VuY3J5cHRpb25IYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYmQzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uSGFuZGxlci5jcwpAQCAtMCwwICsxLDEwMDEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAxLTA1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIGNvbVR5cGVzID0gU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNvbVR5cGVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5FbmNyeXB0aW9uCit7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhhbmRlbHMgZW5jcnlwdGVkIEV4Y2VsIGRvY3VtZW50cyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGNsYXNzIEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyCisgICAgeworI2lmICFNT05PCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgdGhlIHBhY2thZ2UgZnJvbSB0aGUgT0xFIGRvY3VtZW50IGFuZCBkZWNyeXB0IGl0IHVzaW5nIHRoZSBzdXBwbGllZCBwYXNzd29yZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpIj5UaGUgZmlsZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jcnlwdGlvbiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIERlY3J5cHRQYWNrYWdlKEZpbGVJbmZvIGZpLCBFeGNlbEVuY3J5cHRpb24gZW5jcnlwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcG91bmREb2N1bWVudCBkb2MgPSBuZXcgQ29tcG91bmREb2N1bWVudChmaSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSByZXQgPSBudWxsOworICAgICAgICAgICAgaWYgKENvbXBvdW5kRG9jdW1lbnQuSXNTdG9yYWdlRmlsZShmaS5GdWxsTmFtZSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBHZXRTdHJlYW1Gcm9tUGFja2FnZShkb2MsIGVuY3J5cHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiRmlsZSB7MH0gaXMgbm90IGFuIGVuY3J5cHRlZCBwYWNrYWdlIiwgZmkuRnVsbE5hbWUpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy9IZWxwbWV0aG9kIHRvIG91dHB1dCB0aGUgc3RyZWFtcyBpbiB0aGUgc3RvcmFnZQorICAgICAgICAvL3ByaXZhdGUgdm9pZCBXcml0ZURvYyhDb21wb3VuZERvY3VtZW50LlN0b3JhZ2VQYXJ0IHN0b3JhZ2VQYXJ0LCBzdHJpbmcgcCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGZvcmVhY2ggKHZhciBzdG9yZSBpbiBzdG9yYWdlUGFydC5TdWJTdG9yYWdlKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBzdHJpbmcgc2Rpcj1wICsgc3RvcmUuS2V5LlJlcGxhY2UoKGNoYXIpNiwneCcpICsgIlxcIjsKKyAgICAgICAgLy8gICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3Rvcnkoc2Rpcik7CisgICAgICAgIC8vICAgICAgICBXcml0ZURvYyhzdG9yZS5WYWx1ZSwgc2Rpcik7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgZm9yZWFjaCAodmFyIHN0ciBpbiBzdG9yYWdlUGFydC5EYXRhU3RyZWFtcykKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgRmlsZS5Xcml0ZUFsbEJ5dGVzKHAgKyBzdHIuS2V5LlJlcGxhY2UoKGNoYXIpNiwgJ3gnKSArICIuYmluIiwgc3RyLlZhbHVlKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCB0aGUgcGFja2FnZSBmcm9tIHRoZSBPTEUgZG9jdW1lbnQgYW5kIGRlY3J5cHQgaXQgdXNpbmcgdGhlIHN1cHBsaWVkIHBhc3N3b3JkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgbWVtb3J5IHN0cmVhbS4gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNyeXB0aW9uIj5UaGUgZW5jcnlwdGlvbiBvYmplY3QgZnJvbSB0aGUgUGFja2FnZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIFtTZWN1cml0eVNhZmVDcml0aWNhbF0KKyAgICAgICAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIERlY3J5cHRQYWNrYWdlKE1lbW9yeVN0cmVhbSBzdHJlYW0sIEV4Y2VsRW5jcnlwdGlvbiBlbmNyeXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgbG9ja0J5dGVzIG9iamVjdC4KKyAgICAgICAgICAgIENvbXBvdW5kRG9jdW1lbnQuSUxvY2tCeXRlcyBsYj1udWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGIgPSBDb21wb3VuZERvY3VtZW50LkdldExvY2tieXRlKHN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoQ29tcG91bmREb2N1bWVudC5Jc1N0b3JhZ2VJTG9ja0J5dGVzKGxiKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRvYyA9IG5ldyBDb21wb3VuZERvY3VtZW50KGxiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFN0cmVhbUZyb21QYWNrYWdlKGRvYywgZW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hcnNoYWwuUmVsZWFzZUNvbU9iamVjdChsYik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIlRoZSBzdHJlYW0gaXMgbm90IGFuIHZhbGlkL3N1cHBvcnRlZCBlbmNyeXB0ZWQgZG9jdW1lbnQuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoLy8gKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWFyc2hhbC5SZWxlYXNlQ29tT2JqZWN0KGxiKTsKKyAgICAgICAgICAgICAgICBsYiA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFbmNyeXB0cyBhIHBhY2thZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYWNrYWdlIj5UaGUgcGFja2FnZSBhcyBhIGJ5dGUgYXJyYXk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY3J5cHRpb24iPlRoZSBlbmNyeXB0aW9uIGluZm8gZnJvbSB0aGUgd29ya2Jvb2s8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBNZW1vcnlTdHJlYW0gRW5jcnlwdFBhY2thZ2UoYnl0ZVtdIHBhY2thZ2UsIEV4Y2VsRW5jcnlwdGlvbiBlbmNyeXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW5jcnlwdGlvbi5WZXJzaW9uID09IEVuY3J5cHRpb25WZXJzaW9uLlN0YW5kYXJkKSAvL1N0YW5kYXJkIGVuY3J5cHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRW5jcnlwdFBhY2thZ2VCaW5hcnkocGFja2FnZSwgZW5jcnlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlbmNyeXB0aW9uLlZlcnNpb24gPT0gRW5jcnlwdGlvblZlcnNpb24uQWdpbGUpIC8vQWdpbGUgZW5jcnlwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFbmNyeXB0UGFja2FnZUFnaWxlKHBhY2thZ2UsIGVuY3J5cHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNyeXB0aW9uIHZlcnNpb24uIikpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gRW5jcnlwdFBhY2thZ2VBZ2lsZShieXRlW10gcGFja2FnZSwgRXhjZWxFbmNyeXB0aW9uIGVuY3J5cHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4bWw9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+XHJcbiI7CisgICAgICAgICAgICB4bWwgKz0gIjxlbmNyeXB0aW9uIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNi9lbmNyeXB0aW9uXCIgeG1sbnM6cD1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYva2V5RW5jcnlwdG9yL3Bhc3N3b3JkXCIgeG1sbnM6Yz1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYva2V5RW5jcnlwdG9yL2NlcnRpZmljYXRlXCI+IjsKKyAgICAgICAgICAgIHhtbCArPSAiPGtleURhdGEgc2FsdFNpemU9XCIxNlwiIGJsb2NrU2l6ZT1cIjE2XCIga2V5Qml0cz1cIjI1NlwiIGhhc2hTaXplPVwiNjRcIiBjaXBoZXJBbGdvcml0aG09XCJBRVNcIiBjaXBoZXJDaGFpbmluZz1cIkNoYWluaW5nTW9kZUNCQ1wiIGhhc2hBbGdvcml0aG09XCJTSEE1MTJcIiBzYWx0VmFsdWU9XCJcIi8+IjsKKyAgICAgICAgICAgIHhtbCArPSAiPGRhdGFJbnRlZ3JpdHkgZW5jcnlwdGVkSG1hY0tleT1cIlwiIGVuY3J5cHRlZEhtYWNWYWx1ZT1cIlwiLz4iOworICAgICAgICAgICAgeG1sICs9ICI8a2V5RW5jcnlwdG9ycz4iOworICAgICAgICAgICAgeG1sICs9ICI8a2V5RW5jcnlwdG9yIHVyaT1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYva2V5RW5jcnlwdG9yL3Bhc3N3b3JkXCI+IjsKKyAgICAgICAgICAgIHhtbCArPSAiPHA6ZW5jcnlwdGVkS2V5IHNwaW5Db3VudD1cIjEwMDAwMFwiIHNhbHRTaXplPVwiMTZcIiBibG9ja1NpemU9XCIxNlwiIGtleUJpdHM9XCIyNTZcIiBoYXNoU2l6ZT1cIjY0XCIgY2lwaGVyQWxnb3JpdGhtPVwiQUVTXCIgY2lwaGVyQ2hhaW5pbmc9XCJDaGFpbmluZ01vZGVDQkNcIiBoYXNoQWxnb3JpdGhtPVwiU0hBNTEyXCIgc2FsdFZhbHVlPVwiXCIgZW5jcnlwdGVkVmVyaWZpZXJIYXNoSW5wdXQ9XCJcIiBlbmNyeXB0ZWRWZXJpZmllckhhc2hWYWx1ZT1cIlwiIGVuY3J5cHRlZEtleVZhbHVlPVwiXCIgLz4iOworICAgICAgICAgICAgeG1sICs9ICI8L2tleUVuY3J5cHRvcj48L2tleUVuY3J5cHRvcnM+PC9lbmNyeXB0aW9uPiI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBlbmNyeXB0aW9uSW5mbyA9IG5ldyBFbmNyeXB0aW9uSW5mb0FnaWxlKCk7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5SZWFkRnJvbVhtbCh4bWwpOworICAgICAgICAgICAgdmFyIGVuY3IgPSBlbmNyeXB0aW9uSW5mby5LZXlFbmNyeXB0b3JzWzBdOworICAgICAgICAgICAgdmFyIHJuZCA9IFJhbmRvbU51bWJlckdlbmVyYXRvci5DcmVhdGUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIHMgPSBuZXcgYnl0ZVsxNl07CisgICAgICAgICAgICBybmQuR2V0Qnl0ZXMocyk7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5LZXlEYXRhLlNhbHRWYWx1ZSA9IHM7CisKKyAgICAgICAgICAgIHJuZC5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGVuY3IuU2FsdFZhbHVlID0gczsKKworICAgICAgICAgICAgZW5jci5LZXlWYWx1ZSA9IG5ldyBieXRlW2VuY3IuS2V5Qml0cyAvIDhdOworICAgICAgICAgICAgcm5kLkdldEJ5dGVzKGVuY3IuS2V5VmFsdWUpOworCisgICAgICAgICAgICAvL0dldCB0aGUgcGFzc3dvcmsga2V5LgorICAgICAgICAgICAgdmFyIGhhc2hQcm92aWRlciA9IEdldEhhc2hQcm92aWRlcihlbmNyeXB0aW9uSW5mby5LZXlFbmNyeXB0b3JzWzBdKTsKKyAgICAgICAgICAgIHZhciBiYXNlSGFzaCA9IEdldFBhc3N3b3JkSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IuU2FsdFZhbHVlLCBlbmNyeXB0aW9uLlBhc3N3b3JkLCBlbmNyLlNwaW5Db3VudCwgZW5jci5IYXNoU2l6ZSk7CisgICAgICAgICAgICB2YXIgaGFzaEZpbmFsID0gR2V0RmluYWxIYXNoKGhhc2hQcm92aWRlciwgZW5jciwgQmxvY2tLZXlfS2V5VmFsdWUsIGJhc2VIYXNoKTsKKyAgICAgICAgICAgIGhhc2hGaW5hbCA9IEZpeEhhc2hTaXplKGhhc2hGaW5hbCwgZW5jci5LZXlCaXRzIC8gOCk7CisKKyAgICAgICAgICAgIHZhciBlbmNyRGF0YSA9IEVuY3J5cHREYXRhQWdpbGUocGFja2FnZSwgZW5jcnlwdGlvbkluZm8sIGhhc2hQcm92aWRlcik7CisKKyAgICAgICAgICAgIC8qKioqIERhdGEgSW50ZWdyaXR5ICoqKiovCisgICAgICAgICAgICB2YXIgc2FsdEhNQUM9bmV3IGJ5dGVbNjRdOworICAgICAgICAgICAgcm5kLkdldEJ5dGVzKHNhbHRITUFDKTsKKworICAgICAgICAgICAgU2V0SE1BQyhlbmNyeXB0aW9uSW5mbyxoYXNoUHJvdmlkZXIsc2FsdEhNQUMsIGVuY3JEYXRhKTsKKworICAgICAgICAgICAgLyoqKiogVmVyaWZpZXIgKioqKi8KKyAgICAgICAgICAgIGVuY3IuVmVyaWZpZXJIYXNoSW5wdXQgPSBuZXcgYnl0ZVsxNl07CisgICAgICAgICAgICBybmQuR2V0Qnl0ZXMoZW5jci5WZXJpZmllckhhc2hJbnB1dCk7CisKKyAgICAgICAgICAgIGVuY3IuVmVyaWZpZXJIYXNoID0gaGFzaFByb3ZpZGVyLkNvbXB1dGVIYXNoKGVuY3IuVmVyaWZpZXJIYXNoSW5wdXQpOworCisgICAgICAgICAgICB2YXIgVmVyaWZpZXJJbnB1dEtleSA9IEdldEZpbmFsSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IsIEJsb2NrS2V5X0hhc2hJbnB1dCwgYmFzZUhhc2gpOworICAgICAgICAgICAgdmFyIFZlcmlmaWVySGFzaEtleSA9IEdldEZpbmFsSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IsIEJsb2NrS2V5X0hhc2hWYWx1ZSwgYmFzZUhhc2gpOworICAgICAgICAgICAgdmFyIEtleVZhbHVlS2V5ID0gR2V0RmluYWxIYXNoKGhhc2hQcm92aWRlciwgZW5jciwgQmxvY2tLZXlfS2V5VmFsdWUsIGJhc2VIYXNoKTsKKworICAgICAgICAgICAgdmFyIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgRW5jcnlwdEFnaWxlRnJvbUtleShlbmNyLCBWZXJpZmllcklucHV0S2V5LCBlbmNyLlZlcmlmaWVySGFzaElucHV0LCAwLCBlbmNyLlZlcmlmaWVySGFzaElucHV0Lkxlbmd0aCwgZW5jci5TYWx0VmFsdWUsIG1zKTsKKyAgICAgICAgICAgIGVuY3IuRW5jcnlwdGVkVmVyaWZpZXJIYXNoSW5wdXQgPSBtcy5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOyAKKyAgICAgICAgICAgIEVuY3J5cHRBZ2lsZUZyb21LZXkoZW5jciwgVmVyaWZpZXJIYXNoS2V5LCBlbmNyLlZlcmlmaWVySGFzaCwgMCwgZW5jci5WZXJpZmllckhhc2guTGVuZ3RoLCBlbmNyLlNhbHRWYWx1ZSwgbXMpOworICAgICAgICAgICAgZW5jci5FbmNyeXB0ZWRWZXJpZmllckhhc2ggPSBtcy5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgRW5jcnlwdEFnaWxlRnJvbUtleShlbmNyLCBLZXlWYWx1ZUtleSwgZW5jci5LZXlWYWx1ZSwgMCwgZW5jci5LZXlWYWx1ZS5MZW5ndGgsIGVuY3IuU2FsdFZhbHVlLCBtcyk7CisgICAgICAgICAgICBlbmNyLkVuY3J5cHRlZEtleVZhbHVlID0gbXMuVG9BcnJheSgpOworCisgICAgICAgICAgICB4bWwgPSBlbmNyeXB0aW9uSW5mby5YbWwuT3V0ZXJYbWw7CisKKyAgICAgICAgICAgIHZhciBieVhtbCA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoeG1sKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBtcy5Xcml0ZShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoKHVzaG9ydCk0KSwgMCwgMik7IC8vTWFqb3IgVmVyc2lvbgorICAgICAgICAgICAgbXMuV3JpdGUoQml0Q29udmVydGVyLkdldEJ5dGVzKCh1c2hvcnQpNCksIDAsIDIpOyAvL01pbm9yIFZlcnNpb24KKyAgICAgICAgICAgIG1zLldyaXRlKEJpdENvbnZlcnRlci5HZXRCeXRlcygodWludCkweDQwKSwgMCwgNCk7IC8vUmVzZXJ2ZWQKKyAgICAgICAgICAgIG1zLldyaXRlKGJ5WG1sLDAsYnlYbWwuTGVuZ3RoKTsKKworICAgICAgICAgICAgdmFyIGRvYyA9IG5ldyBDb21wb3VuZERvY3VtZW50KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQWRkIHRoZSBkYXRhc3BhY2Ugc3RyZWFtcworICAgICAgICAgICAgQ3JlYXRlRGF0YVNwYWNlcyhkb2MpOworICAgICAgICAgICAgLy9FbmNyeXB0aW9uSW5mby4uLgorICAgICAgICAgICAgZG9jLlN0b3JhZ2UuRGF0YVN0cmVhbXMuQWRkKCJFbmNyeXB0aW9uSW5mbyIsIG1zLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAvLy4uLmFuZCB0aGUgZW5jcnlwdGVkIHBhY2thZ2UKKyAgICAgICAgICAgIGRvYy5TdG9yYWdlLkRhdGFTdHJlYW1zLkFkZCgiRW5jcnlwdGVkUGFja2FnZSIsIGVuY3JEYXRhKTsKKworICAgICAgICAgICAgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgZT1kb2MuU2F2ZSgpOworICAgICAgICAgICAgbXMuV3JpdGUoZSwwLGUuTGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBtczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEVuY3J5cHREYXRhQWdpbGUoYnl0ZVtdIGRhdGEsIEVuY3J5cHRpb25JbmZvQWdpbGUgZW5jcnlwdGlvbkluZm8sIEhhc2hBbGdvcml0aG0gaGFzaFByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIga2UgPSBlbmNyeXB0aW9uSW5mby5LZXlFbmNyeXB0b3JzWzBdOworICAgICAgICAgICAgUmlqbmRhZWxNYW5hZ2VkIGFlcyA9IG5ldyBSaWpuZGFlbE1hbmFnZWQoKTsKKyAgICAgICAgICAgIGFlcy5LZXlTaXplID0ga2UuS2V5Qml0czsKKyAgICAgICAgICAgIGFlcy5Nb2RlID0gQ2lwaGVyTW9kZS5DQkM7CisgICAgICAgICAgICBhZXMuUGFkZGluZyA9IFBhZGRpbmdNb2RlLlplcm9zOworCisgICAgICAgICAgICBpbnQgcG9zPTA7CisgICAgICAgICAgICBpbnQgc2VnbWVudD0wOworCisgICAgICAgICAgICAvL0VuY3J5cHQgdGhlIGRhdGEKKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIG1zLldyaXRlKEJpdENvbnZlcnRlci5HZXRCeXRlcyhkYXRhLkxvbmdMZW5ndGgpLCAwLCA4KTsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBkYXRhLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2VnbWVudFNpemUgPSAoaW50KShkYXRhLkxlbmd0aCAtIHBvcyA+IDQwOTYgPyA0MDk2IDogZGF0YS5MZW5ndGggLSBwb3MpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBpdlRtcCA9IG5ldyBieXRlWzQgKyBlbmNyeXB0aW9uSW5mby5LZXlEYXRhLlNhbHRTaXplXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGVuY3J5cHRpb25JbmZvLktleURhdGEuU2FsdFZhbHVlLCAwLCBpdlRtcCwgMCwgZW5jcnlwdGlvbkluZm8uS2V5RGF0YS5TYWx0U2l6ZSk7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoc2VnbWVudCksIDAsIGl2VG1wLCBlbmNyeXB0aW9uSW5mby5LZXlEYXRhLlNhbHRTaXplLCA0KTsKKyAgICAgICAgICAgICAgICB2YXIgaXY9aGFzaFByb3ZpZGVyLkNvbXB1dGVIYXNoKGl2VG1wKTsKKworICAgICAgICAgICAgICAgIEVuY3J5cHRBZ2lsZUZyb21LZXkoa2UsIGtlLktleVZhbHVlLCBkYXRhLCBwb3MsIHNlZ21lbnRTaXplLCBpdiwgbXMpOworICAgICAgICAgICAgICAgIHBvcyArPSBzZWdtZW50U2l6ZTsKKyAgICAgICAgICAgICAgICBzZWdtZW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcy5GbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuIG1zLlRvQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTZXQgdGhlIGRhdGFpbnRlZ3JpdHkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEhNQUMoRW5jcnlwdGlvbkluZm9BZ2lsZSBlaSwgSGFzaEFsZ29yaXRobSBoYXNoUHJvdmlkZXIsIGJ5dGVbXSBzYWx0LCBieXRlW10gZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGl2ID0gR2V0RmluYWxIYXNoKGhhc2hQcm92aWRlciwgZWkuS2V5RW5jcnlwdG9yc1swXSwgQmxvY2tLZXlfSG1hY0tleSwgZWkuS2V5RGF0YS5TYWx0VmFsdWUpOworICAgICAgICAgICAgdmFyIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgRW5jcnlwdEFnaWxlRnJvbUtleShlaS5LZXlFbmNyeXB0b3JzWzBdLCBlaS5LZXlFbmNyeXB0b3JzWzBdLktleVZhbHVlLCBzYWx0LCAwTCwgc2FsdC5Mb25nTGVuZ3RoLCBpdiwgbXMpOworICAgICAgICAgICAgZWkuRGF0YUludGVncml0eS5FbmNyeXB0ZWRIbWFjS2V5ID0gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgaCA9IEdldEhtYWNQcm92aWRlcihlaS5LZXlFbmNyeXB0b3JzWzBdLCBzYWx0KTsKKyAgICAgICAgICAgIHZhciBobWFjVmFsdWUgPSBoLkNvbXB1dGVIYXNoKGRhdGEpOworCisgICAgICAgICAgICBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIGl2ID0gR2V0RmluYWxIYXNoKGhhc2hQcm92aWRlciwgZWkuS2V5RW5jcnlwdG9yc1swXSwgQmxvY2tLZXlfSG1hY1ZhbHVlLCBlaS5LZXlEYXRhLlNhbHRWYWx1ZSk7CisgICAgICAgICAgICBFbmNyeXB0QWdpbGVGcm9tS2V5KGVpLktleUVuY3J5cHRvcnNbMF0sIGVpLktleUVuY3J5cHRvcnNbMF0uS2V5VmFsdWUsIGhtYWNWYWx1ZSwgMEwsIGhtYWNWYWx1ZS5Mb25nTGVuZ3RoLCBpdiwgbXMpOworICAgICAgICAgICAgZWkuRGF0YUludGVncml0eS5FbmNyeXB0ZWRIbWFjVmFsdWUgPSBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEhNQUMgR2V0SG1hY1Byb3ZpZGVyKEVuY3J5cHRpb25JbmZvQWdpbGUuRW5jcnlwdGlvbktleUVuY3J5cHRvciBlaSwgYnl0ZVtdIHNhbHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZWkuSGFzaEFsZ29yaXRobSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVIYXNoQWxvZ29yaXRobS5SSVBFTUQxNjA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSE1BQ1JJUEVNRDE2MChzYWx0KTsKKyAgICAgICAgICAgICAgICBjYXNlIGVIYXNoQWxvZ29yaXRobS5NRDU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSE1BQ01ENShzYWx0KTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgZUhhc2hBbG9nb3JpdGhtLlNIQTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSE1BQ1NIQTEoc2FsdCk7CisgICAgICAgICAgICAgICAgY2FzZSBlSGFzaEFsb2dvcml0aG0uU0hBMjU2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhNQUNTSEEyNTYoc2FsdCk7CisgICAgICAgICAgICAgICAgY2FzZSBlSGFzaEFsb2dvcml0aG0uU0hBMzg0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhNQUNTSEEzODQoc2FsdCk7CisgICAgICAgICAgICAgICAgY2FzZSBlSGFzaEFsb2dvcml0aG0uU0hBNTEyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhNQUNTSEE1MTIoc2FsdCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJIYXNoIG1ldGhvZCB7MH0gbm90IHN1cHBvcnRlZC4iLGVpLkhhc2hBbGdvcml0aG0pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBFbmNyeXB0UGFja2FnZUJpbmFyeShieXRlW10gcGFja2FnZSwgRXhjZWxFbmNyeXB0aW9uIGVuY3J5cHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBlbmNyeXB0aW9uS2V5OworICAgICAgICAgICAgLy9DcmVhdGUgdGhlIEVuY3J5cHRpb24gSW5mby4gVGhpcyBhbHNvIHJldHVybnMgdGhlIEVuY3J5cHRpb25rZXkKKyAgICAgICAgICAgIHZhciBlbmNyeXB0aW9uSW5mbyA9IENyZWF0ZUVuY3J5cHRpb25JbmZvKGVuY3J5cHRpb24uUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24uQWxnb3JpdGhtID09IEVuY3J5cHRpb25BbGdvcml0aG0uQUVTMTI4ID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobUlELkFFUzEyOCA6CisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24uQWxnb3JpdGhtID09IEVuY3J5cHRpb25BbGdvcml0aG0uQUVTMTkyID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobUlELkFFUzE5MiA6CisgICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG1JRC5BRVMyNTYsIG91dCBlbmNyeXB0aW9uS2V5KTsKKworICAgICAgICAgICAgLy9JTG9ja0J5dGVzIGxiOworICAgICAgICAgICAgLy92YXIgaXJldCA9IENyZWF0ZUlMb2NrQnl0ZXNPbkhHbG9iYWwoSW50UHRyLlplcm8sIHRydWUsIG91dCBsYik7CisKKyAgICAgICAgICAgIC8vSVN0b3JhZ2Ugc3RvcmFnZSA9IG51bGw7CisgICAgICAgICAgICAvL01lbW9yeVN0cmVhbSByZXQgPSBudWxsOworCisgICAgICAgICAgICB2YXIgZG9jID0gbmV3IENvbXBvdW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIENyZWF0ZURhdGFTcGFjZXMoZG9jKTsKKworICAgICAgICAgICAgZG9jLlN0b3JhZ2UuRGF0YVN0cmVhbXMuQWRkKCJFbmNyeXB0aW9uSW5mbyIsIGVuY3J5cHRpb25JbmZvLldyaXRlQmluYXJ5KCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL0VuY3J5cHQgdGhlIHBhY2thZ2UKKyAgICAgICAgICAgIGJ5dGVbXSBlbmNyeXB0ZWRQYWNrYWdlID0gRW5jcnlwdERhdGEoZW5jcnlwdGlvbktleSwgcGFja2FnZSwgZmFsc2UpOworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgbXMuV3JpdGUoQml0Q29udmVydGVyLkdldEJ5dGVzKCh1bG9uZylwYWNrYWdlLkxvbmdMZW5ndGgpLCAwLCA4KTsKKyAgICAgICAgICAgIG1zLldyaXRlKGVuY3J5cHRlZFBhY2thZ2UsIDAsIGVuY3J5cHRlZFBhY2thZ2UuTGVuZ3RoKTsKKyAgICAgICAgICAgIGRvYy5TdG9yYWdlLkRhdGFTdHJlYW1zLkFkZCgiRW5jcnlwdGVkUGFja2FnZSIsIG1zLlRvQXJyYXkoKSk7CisKKyAgICAgICAgICAgIHZhciByZXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGRvYy5TYXZlKCk7CisgICAgICAgICAgICByZXQuV3JpdGUoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uICJEYXRhc3BhY2VzIFN0cmVhbSBtZXRob2RzIgorICAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlRGF0YVNwYWNlcyhDb21wb3VuZERvY3VtZW50IGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRzID0gbmV3IENvbXBvdW5kRG9jdW1lbnQuU3RvcmFnZVBhcnQoKTsKKyAgICAgICAgICAgIGRvYy5TdG9yYWdlLlN1YlN0b3JhZ2UuQWRkKCJceDA2IiArICJEYXRhU3BhY2VzIiwgZHMpOworICAgICAgICAgICAgdmFyIHZlcj1uZXcgQ29tcG91bmREb2N1bWVudC5TdG9yYWdlUGFydCgpOworICAgICAgICAgICAgZHMuRGF0YVN0cmVhbXMuQWRkKCJWZXJzaW9uIiwgQ3JlYXRlVmVyc2lvblN0cmVhbSgpKTsKKyAgICAgICAgICAgIGRzLkRhdGFTdHJlYW1zLkFkZCgiRGF0YVNwYWNlTWFwIiwgQ3JlYXRlRGF0YVNwYWNlTWFwKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgZHNJbmZvPW5ldyBDb21wb3VuZERvY3VtZW50LlN0b3JhZ2VQYXJ0KCk7CisgICAgICAgICAgICBkcy5TdWJTdG9yYWdlLkFkZCgiRGF0YVNwYWNlSW5mbyIsIGRzSW5mbyk7CisgICAgICAgICAgICBkc0luZm8uRGF0YVN0cmVhbXMuQWRkKCJTdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlIiwgQ3JlYXRlU3Ryb25nRW5jcnlwdGlvbkRhdGFTcGFjZVN0cmVhbSgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIHRyYW5zSW5mbz1uZXcgQ29tcG91bmREb2N1bWVudC5TdG9yYWdlUGFydCgpOworICAgICAgICAgICAgZHMuU3ViU3RvcmFnZS5BZGQoIlRyYW5zZm9ybUluZm8iLCB0cmFuc0luZm8pOworCisgICAgICAgICAgICB2YXIgc3RyRW5jVHJhbnM9bmV3IENvbXBvdW5kRG9jdW1lbnQuU3RvcmFnZVBhcnQoKTsKKyAgICAgICAgICAgIHRyYW5zSW5mby5TdWJTdG9yYWdlLkFkZCgiU3Ryb25nRW5jcnlwdGlvblRyYW5zZm9ybSIsIHN0ckVuY1RyYW5zKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3RyRW5jVHJhbnMuRGF0YVN0cmVhbXMuQWRkKCJceDA2UHJpbWFyeSIsIENyZWF0ZVRyYW5zZm9ybUluZm9QcmltYXJ5KCkpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIENyZWF0ZVN0cm9uZ0VuY3J5cHRpb25EYXRhU3BhY2VTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBCaW5hcnlXcml0ZXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG1zKTsKKworICAgICAgICAgICAgYncuV3JpdGUoKGludCk4KTsgICAgICAgLy9IZWFkZXJMZW5ndGgKKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpMSk7ICAgICAgIC8vRW50cnlDb3VudAorCisgICAgICAgICAgICBzdHJpbmcgdHIgPSAiU3Ryb25nRW5jcnlwdGlvblRyYW5zZm9ybSI7CisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KXRyLkxlbmd0aCoyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKFVURjhFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKHRyICsgIlwwIikpOyAvLyBlbmQgXDAgaXMgZm9yIHBhZGRpbmcKKworICAgICAgICAgICAgYncuRmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gQ3JlYXRlVmVyc2lvblN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOworCisgICAgICAgICAgICBidy5Xcml0ZSgoc2hvcnQpMHgzQyk7ICAvL01ham9yCisgICAgICAgICAgICBidy5Xcml0ZSgoc2hvcnQpMCk7ICAgICAvL01pbm9yCisgICAgICAgICAgICBidy5Xcml0ZShVVEY4RW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcygiTWljcm9zb2Z0LkNvbnRhaW5lci5EYXRhU3BhY2VzIikpOworICAgICAgICAgICAgYncuV3JpdGUoKGludCkxKTsgICAgICAgLy9SZWFkZXJWZXJzaW9uCisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KTEpOyAgICAgICAvL1VwZGF0ZXJWZXJzaW9uCisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KTEpOyAgICAgICAvL1dyaXRlclZlcnNpb24KKworICAgICAgICAgICAgYncuRmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gQ3JlYXRlRGF0YVNwYWNlTWFwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgQmluYXJ5V3JpdGVyIGJ3ID0gbmV3IEJpbmFyeVdyaXRlcihtcyk7CisKKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpOCk7ICAgICAgIC8vSGVhZGVyTGVuZ3RoCisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KTEpOyAgICAgICAvL0VudHJ5Q291bnQKKyAgICAgICAgICAgIHN0cmluZyBzMSA9ICJFbmNyeXB0ZWRQYWNrYWdlIjsKKyAgICAgICAgICAgIHN0cmluZyBzMiA9ICJTdHJvbmdFbmNyeXB0aW9uRGF0YVNwYWNlIjsKKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpKHMxLkxlbmd0aCArIHMyLkxlbmd0aCkqMiArIDB4MTYpOworICAgICAgICAgICAgYncuV3JpdGUoKGludCkxKTsgICAgICAgLy9SZWZlcmVuY2VDb21wb25lbnRDb3VudAorICAgICAgICAgICAgYncuV3JpdGUoKGludCkwKTsgICAgICAgLy9TdHJlYW09MAorICAgICAgICAgICAgYncuV3JpdGUoKGludClzMS5MZW5ndGggKiAyKTsgLy9MZW5ndGggczEKKyAgICAgICAgICAgIGJ3LldyaXRlKFVURjhFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKHMxKSk7CisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KShzMi5MZW5ndGggKiAyKSk7ICAgLy9MZW5ndGggczIKKyAgICAgICAgICAgIGJ3LldyaXRlKFVURjhFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKHMyICsgIlwwIikpOyAgIC8vIGVuZCBcMCBpcyBmb3IgcGFkZGluZworCisgICAgICAgICAgICBidy5GbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuIG1zLlRvQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBDcmVhdGVUcmFuc2Zvcm1JbmZvUHJpbWFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOworICAgICAgICAgICAgc3RyaW5nIFRyYW5zZm9ybUlEID0gIntGRjlBM0YwMy01NkVGLTQ2MTMtQkRENS01QTQxQzFEMDcyNDZ9IjsKKyAgICAgICAgICAgIHN0cmluZyBUcmFuc2Zvcm1OYW1lID0gIk1pY3Jvc29mdC5Db250YWluZXIuRW5jcnlwdGlvblRyYW5zZm9ybSI7CisgICAgICAgICAgICBidy5Xcml0ZShUcmFuc2Zvcm1JRC5MZW5ndGggKiAyICsgMTIpOworICAgICAgICAgICAgYncuV3JpdGUoKGludCkxKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKFRyYW5zZm9ybUlELkxlbmd0aCAqIDIpOworICAgICAgICAgICAgYncuV3JpdGUoVVRGOEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMoVHJhbnNmb3JtSUQpKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKFRyYW5zZm9ybU5hbWUuTGVuZ3RoICogMik7CisgICAgICAgICAgICBidy5Xcml0ZShVVEY4RW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhUcmFuc2Zvcm1OYW1lICsgIlwwIikpOworICAgICAgICAgICAgYncuV3JpdGUoKGludCkxKTsgICAvL1JlYWRlclZlcnNpb24KKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpMSk7ICAgLy9VcGRhdGVyVmVyc2lvbgorICAgICAgICAgICAgYncuV3JpdGUoKGludCkxKTsgICAvL1dyaXRlclZlcnNpb24KKworICAgICAgICAgICAgYncuV3JpdGUoKGludCkwKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpMCk7CisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KTApOyAgICAgICAvL0NpcGhlck1vZGUKKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpNCk7ICAgICAgIC8vUmVzZXJ2ZWQKKworICAgICAgICAgICAgYncuRmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYW4gRW5jcnlwdGlvbkluZm8gb2JqZWN0IHRvIGVuY3J5cHQgYSB3b3JrYm9vaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5UaGUgcGFzc3dvcmQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFsZ0lEIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+VGhlIEVuY3J5cHRpb24ga2V5PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBFbmNyeXB0aW9uSW5mb0JpbmFyeSBDcmVhdGVFbmNyeXB0aW9uSW5mbyhzdHJpbmcgcGFzc3dvcmQsIEFsZ29yaXRobUlEIGFsZ0lELCBvdXQgYnl0ZVtdIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFsZ0lEID09IEFsZ29yaXRobUlELkZsYWdzIHx8IGFsZ0lEID09IEFsZ29yaXRobUlELlJDNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhbGdJRCBtdXN0IGJlIEFFUzEyOCwgQUVTMTkyIG9yIEFFUzI1NiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBlbmNyeXB0aW9uSW5mbyA9IG5ldyBFbmNyeXB0aW9uSW5mb0JpbmFyeSgpOworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uTWFqb3JWZXJzaW9uID0gNDsKKyAgICAgICAgICAgIGVuY3J5cHRpb25JbmZvLk1pbm9yVmVyc2lvbiA9IDI7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5GbGFncyA9IEZsYWdzLmZBRVMgfCBGbGFncy5mQ3J5cHRvQVBJOworCisgICAgICAgICAgICAvL0hlYWRlcgorICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uSGVhZGVyID0gbmV3IEVuY3J5cHRpb25IZWFkZXIoKTsKKyAgICAgICAgICAgIGVuY3J5cHRpb25JbmZvLkhlYWRlci5BbGdJRCA9IGFsZ0lEOworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uSGVhZGVyLkFsZ0lESGFzaCA9IEFsZ29yaXRobUhhc2hJRC5TSEExOworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uSGVhZGVyLkZsYWdzID0gZW5jcnlwdGlvbkluZm8uRmxhZ3M7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5IZWFkZXIuS2V5U2l6ZSA9CisgICAgICAgICAgICAgICAgKGFsZ0lEID09IEFsZ29yaXRobUlELkFFUzEyOCA/IDB4ODAgOiBhbGdJRCA9PSBBbGdvcml0aG1JRC5BRVMxOTIgPyAweEMwIDogMHgxMDApOworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uSGVhZGVyLlByb3ZpZGVyVHlwZSA9IFByb3ZpZGVyVHlwZS5BRVM7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5IZWFkZXIuQ1NQTmFtZSA9ICJNaWNyb3NvZnQgRW5oYW5jZWQgUlNBIGFuZCBBRVMgQ3J5cHRvZ3JhcGhpYyBQcm92aWRlclwwIjsKKyAgICAgICAgICAgIGVuY3J5cHRpb25JbmZvLkhlYWRlci5SZXNlcnZlZDEgPSAwOworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uSGVhZGVyLlJlc2VydmVkMiA9IDA7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5IZWFkZXIuU2l6ZUV4dHJhID0gMDsKKworICAgICAgICAgICAgLy9WZXJpZmllcgorICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uVmVyaWZpZXIgPSBuZXcgRW5jcnlwdGlvblZlcmlmaWVyKCk7CisgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5WZXJpZmllci5TYWx0ID0gbmV3IGJ5dGVbMTZdOworCisgICAgICAgICAgICB2YXIgcm5kID0gUmFuZG9tTnVtYmVyR2VuZXJhdG9yLkNyZWF0ZSgpOworICAgICAgICAgICAgcm5kLkdldEJ5dGVzKGVuY3J5cHRpb25JbmZvLlZlcmlmaWVyLlNhbHQpOworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uVmVyaWZpZXIuU2FsdFNpemUgPSAweDEwOworCisgICAgICAgICAgICBrZXkgPSBHZXRQYXNzd29yZEhhc2hCaW5hcnkocGFzc3dvcmQsIGVuY3J5cHRpb25JbmZvKTsKKworICAgICAgICAgICAgdmFyIHZlcmlmaWVyID0gbmV3IGJ5dGVbMTZdOworICAgICAgICAgICAgcm5kLkdldEJ5dGVzKHZlcmlmaWVyKTsKKyAgICAgICAgICAgIGVuY3J5cHRpb25JbmZvLlZlcmlmaWVyLkVuY3J5cHRlZFZlcmlmaWVyID0gRW5jcnlwdERhdGEoa2V5LCB2ZXJpZmllciwgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vQUVTID0gMzIgQml0cworICAgICAgICAgICAgZW5jcnlwdGlvbkluZm8uVmVyaWZpZXIuVmVyaWZpZXJIYXNoU2l6ZSA9IDB4MjA7CisgICAgICAgICAgICBTSEExIHNoYSA9IG5ldyBTSEExTWFuYWdlZCgpOworICAgICAgICAgICAgdmFyIHZlcmlmaWVySGFzaCA9IHNoYS5Db21wdXRlSGFzaCh2ZXJpZmllcik7CisKKyAgICAgICAgICAgIGVuY3J5cHRpb25JbmZvLlZlcmlmaWVyLkVuY3J5cHRlZFZlcmlmaWVySGFzaCA9IEVuY3J5cHREYXRhKGtleSwgdmVyaWZpZXJIYXNoLCBmYWxzZSk7CisKKyAgICAgICAgICAgIHJldHVybiBlbmNyeXB0aW9uSW5mbzsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBFbmNyeXB0RGF0YShieXRlW10ga2V5LCBieXRlW10gZGF0YSwgYm9vbCB1c2VEYXRhU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgUmlqbmRhZWxNYW5hZ2VkIGFlcyA9IG5ldyBSaWpuZGFlbE1hbmFnZWQoKTsKKyAgICAgICAgICAgIGFlcy5LZXlTaXplID0ga2V5Lkxlbmd0aCAqIDg7CisgICAgICAgICAgICBhZXMuTW9kZSA9IENpcGhlck1vZGUuRUNCOworICAgICAgICAgICAgYWVzLlBhZGRpbmcgPSBQYWRkaW5nTW9kZS5aZXJvczsKKworICAgICAgICAgICAgLy9FbmNyeXB0IHRoZSBkYXRhCisgICAgICAgICAgICB2YXIgY3J5cHQgPSBhZXMuQ3JlYXRlRW5jcnlwdG9yKGtleSwgbnVsbCk7CisgICAgICAgICAgICB2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgY3MgPSBuZXcgQ3J5cHRvU3RyZWFtKG1zLCBjcnlwdCwgQ3J5cHRvU3RyZWFtTW9kZS5Xcml0ZSk7CisgICAgICAgICAgICBjcy5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7CisKKyAgICAgICAgICAgIGNzLkZsdXNoRmluYWxCbG9jaygpOworCisgICAgICAgICAgICBieXRlW10gcmV0OworICAgICAgICAgICAgaWYgKHVzZURhdGFTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBieXRlW2RhdGEuTGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBtcy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgIG1zLlJlYWQocmV0LCAwLCBkYXRhLkxlbmd0aCk7ICAvL1RydW5jYXRlIGFueSBwYWRkZWQgWmVyb3MKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gR2V0U3RyZWFtRnJvbVBhY2thZ2UoQ29tcG91bmREb2N1bWVudCBkb2MsIEV4Y2VsRW5jcnlwdGlvbiBlbmNyeXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgaWYoZG9jLlN0b3JhZ2UuRGF0YVN0cmVhbXMuQ29udGFpbnNLZXkoIkVuY3J5cHRpb25JbmZvIikgfHwKKyAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlLkRhdGFTdHJlYW1zLkNvbnRhaW5zS2V5KCJFbmNyeXB0ZWRQYWNrYWdlIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRpb25JbmZvID0gRW5jcnlwdGlvbkluZm8uUmVhZEJpbmFyeShkb2MuU3RvcmFnZS5EYXRhU3RyZWFtc1siRW5jcnlwdGlvbkluZm8iXSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIERlY3J5cHREb2N1bWVudChkb2MuU3RvcmFnZS5EYXRhU3RyZWFtc1siRW5jcnlwdGVkUGFja2FnZSJdLCBlbmNyeXB0aW9uSW5mbywgZW5jcnlwdGlvbi5QYXNzd29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlvbigiSW52YWxpZCBkb2N1bWVudC4gRW5jcnlwdGlvbkluZm8gb3IgRW5jcnlwdGVkUGFja2FnZSBzdHJlYW0gaXMgbWlzc2luZyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlY3J5cHQgYSBkb2N1bWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBFbmNyeXB0ZWQgZGF0YTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jcnlwdGlvbkluZm8iPkVuY3J5cHRpb24gSW5mbyBvYmplY3Q8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5UaGUgcGFzc3dvcmQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBEZWNyeXB0RG9jdW1lbnQoYnl0ZVtdIGRhdGEsIEVuY3J5cHRpb25JbmZvIGVuY3J5cHRpb25JbmZvLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IEJpdENvbnZlcnRlci5Ub0ludDY0KGRhdGEsIDApOworCisgICAgICAgICAgICB2YXIgZW5jcnlwdGVkRGF0YSA9IG5ldyBieXRlW2RhdGEuTGVuZ3RoIC0gOF07CisgICAgICAgICAgICBBcnJheS5Db3B5KGRhdGEsIDgsIGVuY3J5cHRlZERhdGEsIDAsIGVuY3J5cHRlZERhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGVuY3J5cHRpb25JbmZvIGlzIEVuY3J5cHRpb25JbmZvQmluYXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBEZWNyeXB0QmluYXJ5KChFbmNyeXB0aW9uSW5mb0JpbmFyeSllbmNyeXB0aW9uSW5mbywgcGFzc3dvcmQsIHNpemUsIGVuY3J5cHRlZERhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBEZWNyeXB0QWdpbGUoKEVuY3J5cHRpb25JbmZvQWdpbGUpZW5jcnlwdGlvbkluZm8sIHBhc3N3b3JkLCBzaXplLCBlbmNyeXB0ZWREYXRhLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmVhZG9ubHkgYnl0ZVtdIEJsb2NrS2V5X0hhc2hJbnB1dCA9IG5ldyBieXRlW10geyAweGZlLCAweGE3LCAweGQyLCAweDc2LCAweDNiLCAweDRiLCAweDllLCAweDc5IH07CisgICAgICAgIHJlYWRvbmx5IGJ5dGVbXSBCbG9ja0tleV9IYXNoVmFsdWUgPSBuZXcgYnl0ZVtdIHsgMHhkNywgMHhhYSwgMHgwZiwgMHg2ZCwgMHgzMCwgMHg2MSwgMHgzNCwgMHg0ZSB9OworICAgICAgICByZWFkb25seSBieXRlW10gQmxvY2tLZXlfS2V5VmFsdWUgPSBuZXcgYnl0ZVtdIHsgMHgxNCwgMHg2ZSwgMHgwYiwgMHhlNywgMHhhYiwgMHhhYywgMHhkMCwgMHhkNiB9OworICAgICAgICByZWFkb25seSBieXRlW10gQmxvY2tLZXlfSG1hY0tleSA9IG5ldyBieXRlW10geyAweDVmLCAweGIyLCAweGFkLCAweDAxLCAweDBjLCAweGI5LCAweGUxLCAweGY2IH07Ly9NU09GRkNSWVBUTyAyLjMuNC4xNCBzZWN0aW9uIDMKKyAgICAgICAgcmVhZG9ubHkgYnl0ZVtdIEJsb2NrS2V5X0htYWNWYWx1ZSA9IG5ldyBieXRlW10geyAweGEwLCAweDY3LCAweDdmLCAweDAyLCAweGIyLCAweDJjLCAweDg0LCAweDMzIH07Ly9NU09GRkNSWVBUTyAyLjMuNC4xNCBzZWN0aW9uIDUKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIERlY3J5cHRBZ2lsZShFbmNyeXB0aW9uSW5mb0FnaWxlIGVuY3J5cHRpb25JbmZvLCBzdHJpbmcgcGFzc3dvcmQsIGxvbmcgc2l6ZSwgYnl0ZVtdIGVuY3J5cHRlZERhdGEsIGJ5dGVbXSBkYXRhKQorICAgICAgICB7IAorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGRvYyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICAgICAgaWYgKGVuY3J5cHRpb25JbmZvLktleURhdGEuQ2lwaGVyQWxnb3JpdGhtID09IGVDaXBoZXJBbGdvcml0aG0uQUVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlbmNyID0gZW5jcnlwdGlvbkluZm8uS2V5RW5jcnlwdG9yc1swXTsKKyAgICAgICAgICAgICAgICB2YXIgaGFzaFByb3ZpZGVyID0gR2V0SGFzaFByb3ZpZGVyKGVuY3IpOworICAgICAgICAgICAgICAgIHZhciBiYXNlSGFzaCA9IEdldFBhc3N3b3JkSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IuU2FsdFZhbHVlLCBwYXNzd29yZCwgZW5jci5TcGluQ291bnQsIGVuY3IuSGFzaFNpemUpOworCisgICAgICAgICAgICAgICAgLy9HZXQgdGhlIGtleXMgZm9yIHRoZSB2ZXJpZmllcnMgYW5kIHRoZSBrZXkgdmFsdWUKKyAgICAgICAgICAgICAgICB2YXIgdmFsSW5wdXRLZXkgPSBHZXRGaW5hbEhhc2goaGFzaFByb3ZpZGVyLCBlbmNyLCBCbG9ja0tleV9IYXNoSW5wdXQsIGJhc2VIYXNoKTsKKyAgICAgICAgICAgICAgICB2YXIgdmFsSGFzaEtleSA9IEdldEZpbmFsSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IsIEJsb2NrS2V5X0hhc2hWYWx1ZSwgYmFzZUhhc2gpOworICAgICAgICAgICAgICAgIHZhciB2YWxLZXlTaXplS2V5ID0gR2V0RmluYWxIYXNoKGhhc2hQcm92aWRlciwgZW5jciwgQmxvY2tLZXlfS2V5VmFsdWUsIGJhc2VIYXNoKTsKKworICAgICAgICAgICAgICAgIC8vRGVjcnlwdAorICAgICAgICAgICAgICAgIGVuY3IuVmVyaWZpZXJIYXNoSW5wdXQgPSBEZWNyeXB0QWdpbGVGcm9tS2V5KGVuY3IsIHZhbElucHV0S2V5LCBlbmNyLkVuY3J5cHRlZFZlcmlmaWVySGFzaElucHV0LCBlbmNyLlNhbHRTaXplLCBlbmNyLlNhbHRWYWx1ZSk7CisgICAgICAgICAgICAgICAgZW5jci5WZXJpZmllckhhc2ggPSBEZWNyeXB0QWdpbGVGcm9tS2V5KGVuY3IsIHZhbEhhc2hLZXksIGVuY3IuRW5jcnlwdGVkVmVyaWZpZXJIYXNoLCBlbmNyLkhhc2hTaXplLCBlbmNyLlNhbHRWYWx1ZSk7CisgICAgICAgICAgICAgICAgZW5jci5LZXlWYWx1ZSA9IERlY3J5cHRBZ2lsZUZyb21LZXkoZW5jciwgdmFsS2V5U2l6ZUtleSwgZW5jci5FbmNyeXB0ZWRLZXlWYWx1ZSwgZW5jci5LZXlCaXRzIC8gOCwgZW5jci5TYWx0VmFsdWUpOworCisgICAgICAgICAgICAgICAgaWYgKElzUGFzc3dvcmRWYWxpZChoYXNoUHJvdmlkZXIsIGVuY3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGl2aG1hYyA9IEdldEZpbmFsSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IsIEJsb2NrS2V5X0htYWNLZXksIGVuY3J5cHRpb25JbmZvLktleURhdGEuU2FsdFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IERlY3J5cHRBZ2lsZUZyb21LZXkoZW5jciwgZW5jci5LZXlWYWx1ZSwgZW5jcnlwdGlvbkluZm8uRGF0YUludGVncml0eS5FbmNyeXB0ZWRIbWFjS2V5LCBlbmNyeXB0aW9uSW5mby5LZXlEYXRhLkhhc2hTaXplLCBpdmhtYWMpOworCisgICAgICAgICAgICAgICAgICAgIGl2aG1hYyA9IEdldEZpbmFsSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IsIEJsb2NrS2V5X0htYWNWYWx1ZSwgZW5jcnlwdGlvbkluZm8uS2V5RGF0YS5TYWx0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBEZWNyeXB0QWdpbGVGcm9tS2V5KGVuY3IsIGVuY3IuS2V5VmFsdWUsIGVuY3J5cHRpb25JbmZvLkRhdGFJbnRlZ3JpdHkuRW5jcnlwdGVkSG1hY1ZhbHVlLCBlbmNyeXB0aW9uSW5mby5LZXlEYXRhLkhhc2hTaXplLCBpdmhtYWMpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBobWNhID0gR2V0SG1hY1Byb3ZpZGVyKGVuY3IsIGtleSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB2MiA9IGhtY2EuQ29tcHV0ZUhhc2goZGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Mi5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlW2ldICE9IHYyW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJEYXRhaW50ZWdyaXR5IGtleSBtaXNzbWF0Y2giKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdWludCBzZWdtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IHNpemUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWdtZW50U2l6ZSA9IChpbnQpKHNpemUgLSBwb3MgPiA0MDk2ID8gNDA5NiA6IHNpemUgLSBwb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlclNpemUgPSAoaW50KShlbmNyeXB0ZWREYXRhLkxlbmd0aCAtIHBvcyA+IDQwOTYgPyA0MDk2IDogZW5jcnlwdGVkRGF0YS5MZW5ndGggLSBwb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl2VG1wID0gbmV3IGJ5dGVbNCArIGVuY3J5cHRpb25JbmZvLktleURhdGEuU2FsdFNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShlbmNyeXB0aW9uSW5mby5LZXlEYXRhLlNhbHRWYWx1ZSwgMCwgaXZUbXAsIDAsIGVuY3J5cHRpb25JbmZvLktleURhdGEuU2FsdFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoc2VnbWVudCksIDAsIGl2VG1wLCBlbmNyeXB0aW9uSW5mby5LZXlEYXRhLlNhbHRTaXplLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdiA9IGhhc2hQcm92aWRlci5Db21wdXRlSGFzaChpdlRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGVuY3J5cHRlZERhdGEsIHBvcywgYnVmZmVyLCAwLCBidWZmZXJTaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBEZWNyeXB0QWdpbGVGcm9tS2V5KGVuY3IsIGVuY3IuS2V5VmFsdWUsIGJ1ZmZlciwgc2VnbWVudFNpemUsIGl2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5Xcml0ZShiLCAwLCBiLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gc2VnbWVudFNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZG9jLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkludmFsaWQgcGFzc3dvcmQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBIYXNoQWxnb3JpdGhtIEdldEhhc2hQcm92aWRlcihFbmNyeXB0aW9uSW5mb0FnaWxlLkVuY3J5cHRpb25LZXlFbmNyeXB0b3IgZW5jcikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChlbmNyLkhhc2hBbGdvcml0aG0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlSGFzaEFsb2dvcml0aG0uTUQ1OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNRDVDcnlwdG9TZXJ2aWNlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVIYXNoQWxvZ29yaXRobS5SSVBFTUQxNjA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJJUEVNRDE2ME1hbmFnZWQoKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVIYXNoQWxvZ29yaXRobS5TSEExOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTSEExQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgY2FzZSBlSGFzaEFsb2dvcml0aG0uU0hBMjU2OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBuZXcgU0hBMjU2Q3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgY2FzZSBlSGFzaEFsb2dvcml0aG0uU0hBMzg0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTSEEzODRDcnlwdG9TZXJ2aWNlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVIYXNoQWxvZ29yaXRobS5TSEE1MTI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNIQTUxMkNyeXB0b1NlcnZpY2VQcm92aWRlcigpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkhhc2ggcHJvdmlkZXIgaXMgdW5zdXBwb3J0ZWQuIHswfSIsIGVuY3IuSGFzaEFsZ29yaXRobSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIERlY3J5cHRCaW5hcnkoRW5jcnlwdGlvbkluZm9CaW5hcnkgZW5jcnlwdGlvbkluZm8sIHN0cmluZyBwYXNzd29yZCwgbG9uZyBzaXplLCBieXRlW10gZW5jcnlwdGVkRGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGRvYyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKworICAgICAgICAgICAgaWYgKGVuY3J5cHRpb25JbmZvLkhlYWRlci5BbGdJRCA9PSBBbGdvcml0aG1JRC5BRVMxMjggfHwgKGVuY3J5cHRpb25JbmZvLkhlYWRlci5BbGdJRCA9PSBBbGdvcml0aG1JRC5GbGFncyAmJiAoKGVuY3J5cHRpb25JbmZvLkZsYWdzICYgKEZsYWdzLmZBRVMgfCBGbGFncy5mRXh0ZXJuYWwgfCBGbGFncy5mQ3J5cHRvQVBJKSkgPT0gKEZsYWdzLmZBRVMgfCBGbGFncy5mQ3J5cHRvQVBJKSkpCisgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5IZWFkZXIuQWxnSUQgPT0gQWxnb3JpdGhtSUQuQUVTMTkyCisgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICBlbmNyeXB0aW9uSW5mby5IZWFkZXIuQWxnSUQgPT0gQWxnb3JpdGhtSUQuQUVTMjU2CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJpam5kYWVsTWFuYWdlZCBkZWNyeXB0S2V5ID0gbmV3IFJpam5kYWVsTWFuYWdlZCgpOworICAgICAgICAgICAgICAgIGRlY3J5cHRLZXkuS2V5U2l6ZSA9IGVuY3J5cHRpb25JbmZvLkhlYWRlci5LZXlTaXplOworICAgICAgICAgICAgICAgIGRlY3J5cHRLZXkuTW9kZSA9IENpcGhlck1vZGUuRUNCOworICAgICAgICAgICAgICAgIGRlY3J5cHRLZXkuUGFkZGluZyA9IFBhZGRpbmdNb2RlLk5vbmU7CisKKyAgICAgICAgICAgICAgICB2YXIga2V5ID0gR2V0UGFzc3dvcmRIYXNoQmluYXJ5KHBhc3N3b3JkLCBlbmNyeXB0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKElzUGFzc3dvcmRWYWxpZChrZXksIGVuY3J5cHRpb25JbmZvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElDcnlwdG9UcmFuc2Zvcm0gZGVjcnlwdG9yID0gZGVjcnlwdEtleS5DcmVhdGVEZWNyeXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShlbmNyeXB0ZWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNyeXB0b1N0cmVhbSA9IG5ldyBDcnlwdG9TdHJlYW0oZGF0YVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1N0cmVhbU1vZGUuUmVhZCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGRlY3J5cHRlZERhdGEgPSBuZXcgYnl0ZVtzaXplXTsKKworICAgICAgICAgICAgICAgICAgICBjcnlwdG9TdHJlYW0uUmVhZChkZWNyeXB0ZWREYXRhLCAwLCAoaW50KXNpemUpOworICAgICAgICAgICAgICAgICAgICBkb2MuV3JpdGUoZGVjcnlwdGVkRGF0YSwgMCwgKGludClzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBVbmF1dGhvcml6ZWRBY2Nlc3NFeGNlcHRpb24oIkludmFsaWQgcGFzc3dvcmQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRvYzsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWYWxpZGF0ZSB0aGUgcGFzc3dvcmQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPlRoZSBlbmNyeXB0aW9uIGtleTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jcnlwdGlvbkluZm8iPlRoZSBlbmNyeXB0aW9uIGluZm8gZXh0cmFjdGVkIGZyb20gdGhlIEVOQ1JZUFRJT0lORk8gc3RyZWFtIGluc2lkZSB0aGUgT0xFIGRvY3VtZW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBib29sIElzUGFzc3dvcmRWYWxpZChieXRlW10ga2V5LCBFbmNyeXB0aW9uSW5mb0JpbmFyeSBlbmNyeXB0aW9uSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgUmlqbmRhZWxNYW5hZ2VkIGRlY3J5cHRLZXkgPSBuZXcgUmlqbmRhZWxNYW5hZ2VkKCk7CisgICAgICAgICAgICBkZWNyeXB0S2V5LktleVNpemUgPSBlbmNyeXB0aW9uSW5mby5IZWFkZXIuS2V5U2l6ZTsKKyAgICAgICAgICAgIGRlY3J5cHRLZXkuTW9kZSA9IENpcGhlck1vZGUuRUNCOworICAgICAgICAgICAgZGVjcnlwdEtleS5QYWRkaW5nID0gUGFkZGluZ01vZGUuTm9uZTsKKworICAgICAgICAgICAgSUNyeXB0b1RyYW5zZm9ybSBkZWNyeXB0b3IgPSBkZWNyeXB0S2V5LkNyZWF0ZURlY3J5cHRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKworCisgICAgICAgICAgICAvL0RlY3J5cHQgdGhlIHZlcmlmaWVyCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gZGF0YVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oZW5jcnlwdGlvbkluZm8uVmVyaWZpZXIuRW5jcnlwdGVkVmVyaWZpZXIpOworICAgICAgICAgICAgQ3J5cHRvU3RyZWFtIGNyeXB0b1N0cmVhbSA9IG5ldyBDcnlwdG9TdHJlYW0oZGF0YVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvU3RyZWFtTW9kZS5SZWFkKTsKKyAgICAgICAgICAgIHZhciBkZWNyeXB0ZWRWZXJpZmllciA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgICAgIGNyeXB0b1N0cmVhbS5SZWFkKGRlY3J5cHRlZFZlcmlmaWVyLCAwLCAxNik7CisKKyAgICAgICAgICAgIGRhdGFTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGVuY3J5cHRpb25JbmZvLlZlcmlmaWVyLkVuY3J5cHRlZFZlcmlmaWVySGFzaCk7CisKKyAgICAgICAgICAgIGNyeXB0b1N0cmVhbSA9IG5ldyBDcnlwdG9TdHJlYW0oZGF0YVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1N0cmVhbU1vZGUuUmVhZCk7CisKKyAgICAgICAgICAgIC8vRGVjcnlwdCB0aGUgdmVyaWZpZXIgaGFzaAorICAgICAgICAgICAgdmFyIGRlY3J5cHRlZFZlcmlmaWVySGFzaCA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgICAgIGNyeXB0b1N0cmVhbS5SZWFkKGRlY3J5cHRlZFZlcmlmaWVySGFzaCwgMCwgKGludCkxNik7CisKKyAgICAgICAgICAgIC8vR2V0IHRoZSBoYXNoIGZvciB0aGUgZGVjcnlwdGVkIHZlcmlmaWVyCisgICAgICAgICAgICB2YXIgc2hhID0gbmV3IFNIQTFNYW5hZ2VkKCk7CisgICAgICAgICAgICB2YXIgaGFzaCA9IHNoYS5Db21wdXRlSGFzaChkZWNyeXB0ZWRWZXJpZmllcik7CisKKyAgICAgICAgICAgIC8vRXF1YWw/CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGhhc2hbaV0gIT0gZGVjcnlwdGVkVmVyaWZpZXJIYXNoW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZhbGlkYXRlIHRoZSBwYXNzd29yZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoYSI+VGhlIGhhc2ggYWxnb3JpdGhtPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNyIj5UaGUgZW5jcnlwdGlvbiBpbmZvIGV4dHJhY3RlZCBmcm9tIHRoZSBFTkNSWVBUSU9JTkZPIHN0cmVhbSBpbnNpZGUgdGhlIE9MRSBkb2N1bWVudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYm9vbCBJc1Bhc3N3b3JkVmFsaWQoSGFzaEFsZ29yaXRobSBzaGEsIEVuY3J5cHRpb25JbmZvQWdpbGUuRW5jcnlwdGlvbktleUVuY3J5cHRvciBlbmNyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsSGFzaCA9IHNoYS5Db21wdXRlSGFzaChlbmNyLlZlcmlmaWVySGFzaElucHV0KTsKKworICAgICAgICAgICAgLy9FcXVhbD8KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsSGFzaC5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jci5WZXJpZmllckhhc2hbaV0gIT0gdmFsSGFzaFtpXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIERlY3J5cHRBZ2lsZUZyb21LZXkoRW5jcnlwdGlvbkluZm9BZ2lsZS5FbmNyeXB0aW9uS2V5RW5jcnlwdG9yIGVuY3IsIGJ5dGVbXSBrZXksIGJ5dGVbXSBlbmNyeXB0ZWREYXRhLCBsb25nIHNpemUsIGJ5dGVbXSBpdikKKyAgICAgICAgeworICAgICAgICAgICAgU3ltbWV0cmljQWxnb3JpdGhtIGRlY3J5cHRLZXkgPSBHZXRFbmNyeXB0aW9uQWxnb3JpdGhtKGVuY3IpOworICAgICAgICAgICAgZGVjcnlwdEtleS5CbG9ja1NpemUgPSBlbmNyLkJsb2NrU2l6ZSA8PCAzOworICAgICAgICAgICAgZGVjcnlwdEtleS5LZXlTaXplID0gZW5jci5LZXlCaXRzOworICAgICAgICAgICAgZGVjcnlwdEtleS5Nb2RlID0gZW5jci5DaGlwdGhlckNoYWluaW5nID09IGVDaGFpbmluZ01vZGUuQ2hhaW5pbmdNb2RlQ0JDID8gQ2lwaGVyTW9kZS5DQkMgOiBDaXBoZXJNb2RlLkNGQjsKKyAgICAgICAgICAgIGRlY3J5cHRLZXkuUGFkZGluZyA9IFBhZGRpbmdNb2RlLlplcm9zOworCisgICAgICAgICAgICBJQ3J5cHRvVHJhbnNmb3JtIGRlY3J5cHRvciA9IGRlY3J5cHRLZXkuQ3JlYXRlRGVjcnlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhIYXNoU2l6ZShrZXksIGVuY3IuS2V5Qml0cyAvIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhIYXNoU2l6ZShpdiwgZW5jci5CbG9ja1NpemUsIDB4MzYpKTsKKworCisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gZGF0YVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oZW5jcnlwdGVkRGF0YSk7CisKKyAgICAgICAgICAgIENyeXB0b1N0cmVhbSBjcnlwdG9TdHJlYW0gPSBuZXcgQ3J5cHRvU3RyZWFtKGRhdGFTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcnlwdG9TdHJlYW1Nb2RlLlJlYWQpOworCisgICAgICAgICAgICB2YXIgZGVjcnlwdGVkRGF0YSA9IG5ldyBieXRlW3NpemVdOworCisgICAgICAgICAgICBjcnlwdG9TdHJlYW0uUmVhZChkZWNyeXB0ZWREYXRhLCAwLCAoaW50KXNpemUpOworICAgICAgICAgICAgcmV0dXJuIGRlY3J5cHRlZERhdGE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN5bW1ldHJpY0FsZ29yaXRobSBHZXRFbmNyeXB0aW9uQWxnb3JpdGhtKEVuY3J5cHRpb25JbmZvQWdpbGUuRW5jcnlwdGlvbktleUVuY3J5cHRvciBlbmNyKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGVuY3IuQ2lwaGVyQWxnb3JpdGhtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZUNpcGhlckFsZ29yaXRobS5BRVM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmlqbmRhZWxNYW5hZ2VkKCk7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2lwaGVyQWxnb3JpdGhtLkRFUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBERVNDcnlwdG9TZXJ2aWNlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVDaXBoZXJBbGdvcml0aG0uVFJJUExFX0RFUzoKKyAgICAgICAgICAgICAgICBjYXNlIGVDaXBoZXJBbGdvcml0aG0uVFJJUExFX0RFU18xMTI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJpcGxlREVTQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgY2FzZSBlQ2lwaGVyQWxnb3JpdGhtLlJDMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSQzJDcnlwdG9TZXJ2aWNlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlVuc3VwcG9ydGVkIENpcGhlciBBbGdvcml0aG06IHswfSIsIGVuY3IuQ2lwaGVyQWxnb3JpdGhtLlRvU3RyaW5nKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuY3J5cHRBZ2lsZUZyb21LZXkoRW5jcnlwdGlvbkluZm9BZ2lsZS5FbmNyeXB0aW9uS2V5RW5jcnlwdG9yIGVuY3IsIGJ5dGVbXSBrZXksIGJ5dGVbXSBkYXRhLCBsb25nIHBvcywgbG9uZyBzaXplLCBieXRlW10gaXYsTWVtb3J5U3RyZWFtIG1zKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZW5jcnlwdEtleSA9IEdldEVuY3J5cHRpb25BbGdvcml0aG0oZW5jcik7CisgICAgICAgICAgICBlbmNyeXB0S2V5LkJsb2NrU2l6ZSA9IGVuY3IuQmxvY2tTaXplIDw8IDM7CisgICAgICAgICAgICBlbmNyeXB0S2V5LktleVNpemUgPSBlbmNyLktleUJpdHM7CisgICAgICAgICAgICBlbmNyeXB0S2V5Lk1vZGUgPSBlbmNyLkNoaXB0aGVyQ2hhaW5pbmc9PWVDaGFpbmluZ01vZGUuQ2hhaW5pbmdNb2RlQ0JDID8gQ2lwaGVyTW9kZS5DQkMgOiBDaXBoZXJNb2RlLkNGQjsKKyAgICAgICAgICAgIGVuY3J5cHRLZXkuUGFkZGluZyA9IFBhZGRpbmdNb2RlLlplcm9zOworCisgICAgICAgICAgICBJQ3J5cHRvVHJhbnNmb3JtIGVuY3J5cHRvciA9IGVuY3J5cHRLZXkuQ3JlYXRlRW5jcnlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhIYXNoU2l6ZShrZXksIGVuY3IuS2V5Qml0cyAvIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhIYXNoU2l6ZShpdiwgMTYsIDB4MzYpKTsKKworCisgICAgICAgICAgICBDcnlwdG9TdHJlYW0gY3J5cHRvU3RyZWFtID0gbmV3IENyeXB0b1N0cmVhbShtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1N0cmVhbU1vZGUuV3JpdGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgY3J5cHRvU2l6ZSA9IHNpemUgJSBlbmNyLkJsb2NrU2l6ZSA9PSAwID8gc2l6ZSA6IChzaXplICsgKGVuY3IuQmxvY2tTaXplIC0gKHNpemUgJSBlbmNyLkJsb2NrU2l6ZSkpKTsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoZGF0YSwgcG9zLCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgY3J5cHRvU3RyZWFtLldyaXRlKGJ1ZmZlciwgMCwgKGludClzaXplKTsKKyAgICAgICAgICAgIHdoaWxlIChzaXplICUgZW5jci5CbG9ja1NpemUgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcnlwdG9TdHJlYW0uV3JpdGVCeXRlKDApOworICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSB0aGUgaGFzaC4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIHdyaXR0ZW4gd2l0aCB0aGUgaGVscCBvZiBMeXF1aWRpdHkgbGlicmFyeSwgbWFueSB0aGFua3MgZm9yIHRoaXMgbmljZSBzYW1wbGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIHBhc3N3b3JkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNyeXB0aW9uSW5mbyI+VGhlIGVuY3J5cHRpb24gaW5mbyBleHRyYWN0ZWQgZnJvbSB0aGUgRU5DUllQVElPSU5GTyBzdHJlYW0gaW5zaWRlIHRoZSBPTEUgZG9jdW1lbnQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGhhc2ggdG8gZW5jcnlwdCB0aGUgZG9jdW1lbnQ8L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldFBhc3N3b3JkSGFzaEJpbmFyeShzdHJpbmcgcGFzc3dvcmQsIEVuY3J5cHRpb25JbmZvQmluYXJ5IGVuY3J5cHRpb25JbmZvKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gaGFzaCA9IG51bGw7CisgICAgICAgICAgICBieXRlW10gdGVtcEhhc2ggPSBuZXcgYnl0ZVs0ICsgMjBdOyAgICAvL0l0ZXJhdG9yICsgcHJldi4gaGFzaAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSGFzaEFsZ29yaXRobSBoYXNoUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHRpb25JbmZvLkhlYWRlci5BbGdJREhhc2ggPT0gQWxnb3JpdGhtSGFzaElELlNIQTEgfHwgZW5jcnlwdGlvbkluZm8uSGVhZGVyLkFsZ0lESGFzaCA9PSBBbGdvcml0aG1IYXNoSUQuQXBwICYmIChlbmNyeXB0aW9uSW5mby5GbGFncyAmIEZsYWdzLmZFeHRlcm5hbCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc2hQcm92aWRlciA9IG5ldyBTSEExQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuY3J5cHRpb25JbmZvLkhlYWRlci5LZXlTaXplID4gMCAmJiBlbmNyeXB0aW9uSW5mby5IZWFkZXIuS2V5U2l6ZSA8IDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiUkM0IEhhc2ggcHJvdmlkZXIgaXMgbm90IHN1cHBvcnRlZC4gTXVzdCBiZSBTSEExKEFsZ0lESGFzaCA9PSAweDgwMDQpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkhhc2ggcHJvdmlkZXIgaXMgaW52YWxpZC4gTXVzdCBiZSBTSEExKEFsZ0lESGFzaCA9PSAweDgwMDQpIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaGFzaCA9IEdldFBhc3N3b3JkSGFzaChoYXNoUHJvdmlkZXIsIGVuY3J5cHRpb25JbmZvLlZlcmlmaWVyLlNhbHQsIHBhc3N3b3JkLCA1MDAwMCwgMjApOworCisgICAgICAgICAgICAgICAgLy8gQXBwZW5kICJibG9jayIgKDApCisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShoYXNoLCB0ZW1wSGFzaCwgaGFzaC5MZW5ndGgpOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoU3lzdGVtLkJpdENvbnZlcnRlci5HZXRCeXRlcygwKSwgMCwgdGVtcEhhc2gsIGhhc2guTGVuZ3RoLCA0KTsKKyAgICAgICAgICAgICAgICBoYXNoID0gaGFzaFByb3ZpZGVyLkNvbXB1dGVIYXNoKHRlbXBIYXNoKTsKKworICAgICAgICAgICAgICAgIC8qKioqKiBOb3cgdXNlIHRoZSBkZXJpdmVkIGtleSBhbGdvcml0aG0gKioqKiovCisgICAgICAgICAgICAgICAgYnl0ZVtdIGRlcml2ZWRLZXkgPSBuZXcgYnl0ZVs2NF07CisgICAgICAgICAgICAgICAgaW50IGtleVNpemVCeXRlcyA9IGVuY3J5cHRpb25JbmZvLkhlYWRlci5LZXlTaXplIC8gODsKKworICAgICAgICAgICAgICAgIC8vRmlyc3QgWE9SIGhhc2ggYnl0ZXMgd2l0aCAweDM2IGFuZCBmaWxsIHRoZSByZXN0IHdpdGggMHgzNgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEtleS5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZGVyaXZlZEtleVtpXSA9IChieXRlKShpIDwgaGFzaC5MZW5ndGggPyAweDM2IF4gaGFzaFtpXSA6IDB4MzYpOworCisKKyAgICAgICAgICAgICAgICBieXRlW10gWDEgPSBoYXNoUHJvdmlkZXIuQ29tcHV0ZUhhc2goZGVyaXZlZEtleSk7CisKKyAgICAgICAgICAgICAgICAvL2lmIHZlcmlmaWVyIHNpemUgaXMgYmlnZ2VyIHRoYW4gdGhlIGtleSBzaXplIHdlIGNhbiByZXR1cm4gWDEKKyAgICAgICAgICAgICAgICBpZiAoKGludCllbmNyeXB0aW9uSW5mby5WZXJpZmllci5WZXJpZmllckhhc2hTaXplID4ga2V5U2l6ZUJ5dGVzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRml4SGFzaFNpemUoWDEsIGtleVNpemVCeXRlcyk7CisKKyAgICAgICAgICAgICAgICAvL0Vsc2UgWE9SIGhhc2ggYnl0ZXMgd2l0aCAweDVDIGFuZCBmaWxsIHRoZSByZXN0IHdpdGggMHg1QworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEtleS5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZGVyaXZlZEtleVtpXSA9IChieXRlKShpIDwgaGFzaC5MZW5ndGggPyAweDVDIF4gaGFzaFtpXSA6IDB4NUMpOworCisgICAgICAgICAgICAgICAgYnl0ZVtdIFgyID0gaGFzaFByb3ZpZGVyLkNvbXB1dGVIYXNoKGRlcml2ZWRLZXkpOworCisgICAgICAgICAgICAgICAgLy9Kb2luIHRoZSB0d28gYW5kIHJldHVybiAKKyAgICAgICAgICAgICAgICBieXRlW10gam9pbiA9IG5ldyBieXRlW1gxLkxlbmd0aCArIFgyLkxlbmd0aF07CisKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KFgxLCAwLCBqb2luLCAwLCBYMS5MZW5ndGgpOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoWDIsIDAsIGpvaW4sIFgxLkxlbmd0aCwgWDIuTGVuZ3RoKTsKKworCisgICAgICAgICAgICAgICAgcmV0dXJuIEZpeEhhc2hTaXplKGpvaW4sIGtleVNpemVCeXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cmVkIHdoZW4gdGhlIGVuY3J5cHRpb25rZXkgd2FzIGNyZWF0ZWQiLCBleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIHRoZSBoYXNoLgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgaXMgd3JpdHRlbiB3aXRoIHRoZSBoZWxwIG9mIEx5cXVpZGl0eSBsaWJyYXJ5LCBtYW55IHRoYW5rcyBmb3IgdGhpcyBuaWNlIHNhbXBsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5UaGUgcGFzc3dvcmQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY3IiPlRoZSBlbmNyeXB0aW9uIGluZm8gZXh0cmFjdGVkIGZyb20gdGhlIEVOQ1JZUFRJT0lORk8gc3RyZWFtIGluc2lkZSB0aGUgT0xFIGRvY3VtZW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJibG9ja0tleSI+VGhlIGJsb2NrIGtleSBhcHBlbmRlZCB0byB0aGUgaGFzaCB0byBvYnRhaW4gdGhlIGZpbmFsIGhhc2g8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGhhc2ggdG8gZW5jcnlwdCB0aGUgZG9jdW1lbnQ8L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldFBhc3N3b3JkSGFzaEFnaWxlKHN0cmluZyBwYXNzd29yZCwgRW5jcnlwdGlvbkluZm9BZ2lsZS5FbmNyeXB0aW9uS2V5RW5jcnlwdG9yIGVuY3IsIGJ5dGVbXSBibG9ja0tleSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGhhc2hQcm92aWRlciA9IEdldEhhc2hQcm92aWRlcihlbmNyKTsKKyAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IEdldFBhc3N3b3JkSGFzaChoYXNoUHJvdmlkZXIsIGVuY3IuU2FsdFZhbHVlLCBwYXNzd29yZCwgZW5jci5TcGluQ291bnQsIGVuY3IuSGFzaFNpemUpOworICAgICAgICAgICAgICAgIHZhciBoYXNoRmluYWwgPSBHZXRGaW5hbEhhc2goaGFzaFByb3ZpZGVyLCBlbmNyLCBibG9ja0tleSwgaGFzaCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gRml4SGFzaFNpemUoaGFzaEZpbmFsLCBlbmNyLktleUJpdHMgLyA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkFuIGVycm9yIG9jY3VyZWQgd2hlbiB0aGUgZW5jcnlwdGlvbmtleSB3YXMgY3JlYXRlZCIsIGV4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCQkJcHJpdmF0ZSBieXRlW10gR2V0RmluYWxIYXNoKEhhc2hBbGdvcml0aG0gaGFzaFByb3ZpZGVyLCBFbmNyeXB0aW9uSW5mb0FnaWxlLkVuY3J5cHRpb25LZXlFbmNyeXB0b3IgZW5jciwgYnl0ZVtdIGJsb2NrS2V5LCBieXRlW10gaGFzaCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8yLjMuNC4xMyBNUy1PRkZDUllQVE8KKyAgICAgICAgICAgIHZhciB0ZW1wSGFzaCA9IG5ldyBieXRlW2hhc2guTGVuZ3RoICsgYmxvY2tLZXkuTGVuZ3RoXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoaGFzaCwgdGVtcEhhc2gsIGhhc2guTGVuZ3RoKTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoYmxvY2tLZXksIDAsIHRlbXBIYXNoLCBoYXNoLkxlbmd0aCwgYmxvY2tLZXkuTGVuZ3RoKTsKKyAgICAgICAgICAgIHZhciBoYXNoRmluYWwgPSBoYXNoUHJvdmlkZXIuQ29tcHV0ZUhhc2godGVtcEhhc2gpOworICAgICAgICAgICAgcmV0dXJuIGhhc2hGaW5hbDsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBHZXRQYXNzd29yZEhhc2goSGFzaEFsZ29yaXRobSBoYXNoUHJvdmlkZXIsIGJ5dGVbXSBzYWx0LCBzdHJpbmcgcGFzc3dvcmQsIGludCBzcGluQ291bnQsIGludCBoYXNoU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGhhc2ggPSBudWxsOworICAgICAgICAgICAgYnl0ZVtdIHRlbXBIYXNoID0gbmV3IGJ5dGVbNCArIGhhc2hTaXplXTsgICAgLy9JdGVyYXRvciArIHByZXYuIGhhc2gKKyAgICAgICAgICAgIGhhc2ggPSBoYXNoUHJvdmlkZXIuQ29tcHV0ZUhhc2goQ29tYmluZVBhc3N3b3JkKHNhbHQsIHBhc3N3b3JkKSk7CisKKyAgICAgICAgICAgIC8vSXRlcmF0ZSAic3BpbkNvdW50IiB0aW1lcywgaW5zZXJ0aW5nIGkgaW4gZmlyc3QgNCBieXRlcyBhbmQgdGhlbiB0aGUgcHJldi4gaGFzaCBpbiBieXRlIDUtMjQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BpbkNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoaSksIHRlbXBIYXNoLCA0KTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGhhc2gsIDAsIHRlbXBIYXNoLCA0LCBoYXNoLkxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICBoYXNoID0gaGFzaFByb3ZpZGVyLkNvbXB1dGVIYXNoKHRlbXBIYXNoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gRml4SGFzaFNpemUoYnl0ZVtdIGhhc2gsIGludCBzaXplLCBieXRlIGZpbGw9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc2guTGVuZ3RoID09IHNpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgICAgICBlbHNlIGlmIChoYXNoLkxlbmd0aCA8IHNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGhhc2gsIGJ1ZmYsIGhhc2guTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gaGFzaC5MZW5ndGg7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWZmW2ldID0gZmlsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGhhc2gsIGJ1ZmYsIHNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBidWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIENvbWJpbmVQYXNzd29yZChieXRlW10gc2FsdCwgc3RyaW5nIHBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFzc3dvcmQgPT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSAiVmVsdmV0U3dlYXRzaG9wIjsgICAvL1VzZWQgaWYgUGFzc3dvcmQgaXMgYmxhbmsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvbnZlcnQgcGFzc3dvcmQgdG8gdW5pY29kZS4uLgorICAgICAgICAgICAgYnl0ZVtdIHBhc3N3b3JkQnVmID0gVW5pY29kZUVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMocGFzc3dvcmQpOworCisgICAgICAgICAgICBieXRlW10gaW5wdXRCdWYgPSBuZXcgYnl0ZVtzYWx0Lkxlbmd0aCArIHBhc3N3b3JkQnVmLkxlbmd0aF07CisgICAgICAgICAgICBBcnJheS5Db3B5KHNhbHQsIGlucHV0QnVmLCBzYWx0Lkxlbmd0aCk7CisgICAgICAgICAgICBBcnJheS5Db3B5KHBhc3N3b3JkQnVmLCAwLCBpbnB1dEJ1Ziwgc2FsdC5MZW5ndGgsIHBhc3N3b3JkQnVmLkxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRCdWY7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHVzaG9ydCBDYWxjdWxhdGVQYXNzd29yZEhhc2goc3RyaW5nIFBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NhbGN1bGF0ZSB0aGUgaGFzaAorICAgICAgICAgICAgLy9UaGFua3MgdG8gS29oZWkgWW9zaGlkYSBmb3IgdGhlIHNhbXBsZSBodHRwOi8va29oZWkudXMvMjAwOC8wMS8xOC9leGNlbC1zaGVldC1wcm90ZWN0aW9uLXBhc3N3b3JkLWhhc2gvCisgICAgICAgICAgICB1c2hvcnQgaGFzaCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gUGFzc3dvcmQuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzaCBePSBQYXNzd29yZFtpXTsKKyAgICAgICAgICAgICAgICBoYXNoID0gKHVzaG9ydCkoKCh1c2hvcnQpKChoYXNoID4+IDE0KSAmIDB4MDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodXNob3J0KSgoaGFzaCA8PCAxKSAmIDB4N0ZGRikpKTsgIC8vU2hpZnQgMSB0byB0aGUgbGVmdC4gT3ZlcmZsb3dpbmcgYml0IDE1IGdvZXMgaW50byBiaXQgMAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXNoIF49ICgweDgwMDAgfCAoJ04nIDw8IDgpIHwgJ0snKTsgLy9Yb3IgTksgd2l0aCBoaWdoIGJpdCBzZXQoMHhDRTRCKQorICAgICAgICAgICAgaGFzaCBePSAodXNob3J0KVBhc3N3b3JkLkxlbmd0aDsKKworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uSGVhZGVyLmNzIGIvRVBQbHVzL0VuY3J5cHRpb24vRW5jcnlwdGlvbkhlYWRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGNhNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0VuY3J5cHRpb24vRW5jcnlwdGlvbkhlYWRlci5jcwpAQCAtMCwwICsxLDEwMSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDEtMDUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5FbmNyeXB0aW9uCit7CisgICAgW0ZsYWdzXQorICAgIGludGVybmFsIGVudW0gRmxhZ3MKKyAgICB7CisgICAgICAgIFJlc2VydmVkMSA9IDEsICAgLy8gKDEgYml0KTogTVVTVCBiZSBzZXQgdG8gemVybywgYW5kIE1VU1QgYmUgaWdub3JlZC4KKyAgICAgICAgUmVzZXJ2ZWQyID0gMiwgICAvLyAoMSBiaXQpOiBNVVNUIGJlIHNldCB0byB6ZXJvLCBhbmQgTVVTVCBiZSBpZ25vcmVkLgorICAgICAgICBmQ3J5cHRvQVBJID0gNCwgICAvLyAoMSBiaXQpOiBBIGZsYWcgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBDcnlwdG9BUEkgUkM0IG9yIFtFQ01BLTM3Nl0gZW5jcnlwdGlvbiBpcyB1c2VkLiBJdCBNVVNUIGJlIHNldCB0byAxIHVubGVzcyBmRXh0ZXJuYWwgaXMgMS4gSWYgZkV4dGVybmFsIGlzIHNldCB0byAxLCBpdCBNVVNUIGJlIHNldCB0byB6ZXJvLiAgICAgICAgCisgICAgICAgIGZEb2NQcm9wcyA9IDgsICAgLy8gKDEgYml0KTogTVVTVCBiZSBzZXQgdG8gemVybyBpZiBkb2N1bWVudCBwcm9wZXJ0aWVzIGFyZSBlbmNyeXB0ZWQuIE90aGVyd2lzZSwgaXQgTVVTVCBiZSBzZXQgdG8gMS4gRW5jcnlwdGlvbiBvZiBkb2N1bWVudCBwcm9wZXJ0aWVzIGlzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDIuMy41LjQuCisgICAgICAgIGZFeHRlcm5hbCA9IDE2LCAgLy8gKDEgYml0KTogSWYgZXh0ZW5zaWJsZSBlbmNyeXB0aW9uIGlzIHVzZWQsIGl0IE1VU1QgYmUgc2V0IHRvIDEuIE90aGVyd2lzZSwgaXQgTVVTVCBiZSBzZXQgdG8gemVyby4gSWYgdGhpcyBmaWVsZCBpcyBzZXQgdG8gMSwgYWxsIG90aGVyIGZpZWxkcyBpbiB0aGlzIHN0cnVjdHVyZSBNVVNUIGJlIHNldCB0byB6ZXJvLgorICAgICAgICBmQUVTID0gMzIgICAvLygxIGJpdCk6IElmIHRoZSBwcm90ZWN0ZWQgY29udGVudCBpcyBhbiBbRUNNQS0zNzZdIGRvY3VtZW50LCBpdCBNVVNUIGJlIHNldCB0byAxLiBPdGhlcndpc2UsIGl0IE1VU1QgYmUgc2V0IHRvIHplcm8uIElmIHRoZSBmQUVTIGJpdCBpcyBzZXQgdG8gMSwgdGhlIGZDcnlwdG9BUEkgYml0IE1VU1QgYWxzbyBiZSBzZXQgdG8gMQorICAgIH0KKyAgICBpbnRlcm5hbCBlbnVtIEFsZ29yaXRobUlECisgICAgeworICAgICAgICBGbGFncyA9IDB4MDAwMDAwMDAsICAgLy8gRGV0ZXJtaW5lZCBieSBGbGFncworICAgICAgICBSQzQgPSAweDAwMDA2ODAxLCAgIC8vIFJDNAorICAgICAgICBBRVMxMjggPSAweDAwMDA2NjBFLCAgIC8vIDEyOC1iaXQgQUVTCisgICAgICAgIEFFUzE5MiA9IDB4MDAwMDY2MEYsICAgLy8gMTkyLWJpdCBBRVMKKyAgICAgICAgQUVTMjU2ID0gMHgwMDAwNjYxMCAgICAvLyAyNTYtYml0IEFFUworICAgIH0KKyAgICBpbnRlcm5hbCBlbnVtIEFsZ29yaXRobUhhc2hJRAorICAgIHsKKyAgICAgICAgQXBwID0gMHgwMDAwMDAwMCwKKyAgICAgICAgU0hBMSA9IDB4MDAwMDgwMDQsCisgICAgfQorICAgIGludGVybmFsIGVudW0gUHJvdmlkZXJUeXBlCisgICAgeworICAgICAgICBGbGFncyA9IDB4MDAwMDAwMDAsLy9EZXRlcm1pbmVkIGJ5IEZsYWdzCisgICAgICAgIFJDNCA9IDB4MDAwMDAwMDEsCisgICAgICAgIEFFUyA9IDB4MDAwMDAwMTgsCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRW5jcnlwdGlvbiBIZWFkZXIgaW5zaWRlIHRoZSBFbmNyeXB0aW9uSW5mbyBzdHJlYW0KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGNsYXNzIEVuY3J5cHRpb25IZWFkZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIEZsYWdzIEZsYWdzOworICAgICAgICBpbnRlcm5hbCBpbnQgU2l6ZUV4dHJhOyAgICAgICAgICAgICAvL01VU1QgYmUgMHgwMDAwMDAwMC4KKyAgICAgICAgaW50ZXJuYWwgQWxnb3JpdGhtSUQgQWxnSUQ7ICAgICAgICAgLy9NVVNUIGJlIDB4MDAwMDY2MEUgKEFFUy0xMjgpLCAweDAwMDA2NjBGIChBRVMtMTkyKSwgb3IgMHgwMDAwNjYxMCAoQUVTLTI1NikuCisgICAgICAgIGludGVybmFsIEFsZ29yaXRobUhhc2hJRCBBbGdJREhhc2g7IC8vTVVTVCBiZSAweDAwMDA4MDA0IChTSEEtMSkuCisgICAgICAgIGludGVybmFsIGludCBLZXlTaXplOyAgICAgICAgICAgICAgIC8vTVVTVCBiZSAweDAwMDAwMDgwIChBRVMtMTI4KSwgMHgwMDAwMDBDMCAoQUVTLTE5MiksIG9yIDB4MDAwMDAxMDAgKEFFUy0yNTYpLgorICAgICAgICBpbnRlcm5hbCBQcm92aWRlclR5cGUgUHJvdmlkZXJUeXBlOyAvL1NIT1VMRDwxMD4gYmUgMHgwMDAwMDAxOCAoQUVTKS4KKyAgICAgICAgaW50ZXJuYWwgaW50IFJlc2VydmVkMTsgICAgICAgICAgICAgLy9VbmRlZmluZWQgYW5kIE1VU1QgYmUgaWdub3JlZC4KKyAgICAgICAgaW50ZXJuYWwgaW50IFJlc2VydmVkMjsgICAgICAgICAgICAgLy9NVVNUIGJlIDB4MDAwMDAwMDAgYW5kIE1VU1QgYmUgaWdub3JlZC4KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIENTUE5hbWU7ICAgICAgICAgICAgLy9TSE9VTEQ8MTE+IGJlIHNldCB0byBlaXRoZXIgIk1pY3Jvc29mdCBFbmhhbmNlZCBSU0EgYW5kIEFFUyBDcnlwdG9ncmFwaGljIFByb3ZpZGVyIiBvciAiTWljcm9zb2Z0IEVuaGFuY2VkIFJTQSBhbmQgQUVTIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIgKFByb3RvdHlwZSkiIGFzIGEgbnVsbC10ZXJtaW5hdGVkIFVuaWNvZGUgc3RyaW5nLgorICAgICAgICBpbnRlcm5hbCBieXRlW10gV3JpdGVCaW5hcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBCaW5hcnlXcml0ZXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG1zKTsKKworICAgICAgICAgICAgYncuV3JpdGUoKGludClGbGFncyk7CisgICAgICAgICAgICBidy5Xcml0ZShTaXplRXh0cmEpOworICAgICAgICAgICAgYncuV3JpdGUoKGludClBbGdJRCk7CisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KUFsZ0lESGFzaCk7CisgICAgICAgICAgICBidy5Xcml0ZSgoaW50KUtleVNpemUpOworICAgICAgICAgICAgYncuV3JpdGUoKGludClQcm92aWRlclR5cGUpOworICAgICAgICAgICAgYncuV3JpdGUoUmVzZXJ2ZWQxKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKFJlc2VydmVkMik7CisgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKENTUE5hbWUpKTsKKworICAgICAgICAgICAgYncuRmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uSW5mby5jcyBiL0VQUGx1cy9FbmNyeXB0aW9uL0VuY3J5cHRpb25JbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOWEzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uSW5mby5jcwpAQCAtMCwwICsxLDU4NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDEtMDUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRW5jcnlwdGlvbgoreworICAgIGludGVybmFsIGFic3RyYWN0IGNsYXNzIEVuY3J5cHRpb25JbmZvCisgICAgeworICAgICAgICBpbnRlcm5hbCBzaG9ydCBNYWpvclZlcnNpb247CisgICAgICAgIGludGVybmFsIHNob3J0IE1pbm9yVmVyc2lvbjsKKyAgICAgICAgaW50ZXJuYWwgYWJzdHJhY3Qgdm9pZCBSZWFkKGJ5dGVbXSBkYXRhKTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRW5jcnlwdGlvbkluZm8gUmVhZEJpbmFyeShieXRlW10gZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1ham9yVmVyc2lvbiA9IEJpdENvbnZlcnRlci5Ub0ludDE2KGRhdGEsIDApOworICAgICAgICAgICAgdmFyIG1pbm9yVmVyc2lvbiA9IEJpdENvbnZlcnRlci5Ub0ludDE2KGRhdGEsIDIpOworICAgICAgICAgICAgRW5jcnlwdGlvbkluZm8gcmV0OworICAgICAgICAgICAgaWYgKChtaW5vclZlcnNpb24gPT0gMiB8fCBtaW5vclZlcnNpb24gPT0gMykgJiYgbWFqb3JWZXJzaW9uIDw9IDQpIC8vIG1pbm9yVmVyc2lvbj09MSBpcyBSQzQsIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEVuY3J5cHRpb25JbmZvQmluYXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtYWpvclZlcnNpb24gPT0gNCAmJiBtaW5vclZlcnNpb249PTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEVuY3J5cHRpb25JbmZvQWdpbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBmb3JtYXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQuTWFqb3JWZXJzaW9uID0gbWFqb3JWZXJzaW9uOworICAgICAgICAgICAgcmV0Lk1pbm9yVmVyc2lvbiA9IG1pbm9yVmVyc2lvbjsKKyAgICAgICAgICAgIHJldC5SZWFkKGRhdGEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnRlcm5hbCBlbnVtIGVDaXBoZXJBbGdvcml0aG0KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFFUy4gTVVTVCBjb25mb3JtIHRvIHRoZSBBRVMgYWxnb3JpdGhtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBRVMsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJDMi4gTVVTVCBjb25mb3JtIHRvIFtSRkMyMjY4XS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUkMyLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSQzQuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSQzQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1VU1QgY29uZm9ybSB0byB0aGUgREVTIGFsZ29yaXRobS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgREVTLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNVVNUIGNvbmZvcm0gdG8gdGhlIFtEUkFGVC1ERVNYXSBhbGdvcml0aG0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIERFU1gsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIDNERVMuIE1VU1QgY29uZm9ybSB0byB0aGUgW1JGQzE4NTFdIGFsZ29yaXRobS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRSSVBMRV9ERVMsCisgICAgICAgIC8vLyAzREVTXzExMiBNVVNUIGNvbmZvcm0gdG8gdGhlIFtSRkMxODUxXSBhbGdvcml0aG0uIAorICAgICAgICBUUklQTEVfREVTXzExMiAgICAgICAgCisgICAgfQorICAgIGludGVybmFsIGVudW0gZUNoYWluaW5nTW9kZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2lwaGVyIGJsb2NrIGNoYWluaW5nIChDQkMpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDaGFpbmluZ01vZGVDQkMsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENpcGhlciBmZWVkYmFjayBjaGFpbmluZyAoQ0ZCKSwgd2l0aCA4LWJpdCB3aW5kb3cuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIENoYWluaW5nTW9kZUNGQgorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhhc2hhbGdvcml0aG0KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGVudW0gZUhhc2hBbG9nb3JpdGhtCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaGEgMS1NVVNUIGNvbmZvcm0gdG8gW1JGQzQ2MzRdCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNIQTEsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNoYSAyNTYtTVVTVCBjb25mb3JtIHRvIFtSRkM0NjM0XQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTSEEyNTYsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNoYSAzODQtTVVTVCBjb25mb3JtIHRvIFtSRkM0NjM0XQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTSEEzODQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNoYSA1MTItTVVTVCBjb25mb3JtIHRvIFtSRkM0NjM0XQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTSEE1MTIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1ENQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNRDUsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1ENAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNRDQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1EMgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBNRDIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJJUEVNRC0xMjggTVVTVCBjb25mb3JtIHRvIFtJU08vSUVDIDEwMTE4XQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSSVBFTUQxMjgsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJJUEVNRC0xNjAgTVVTVCBjb25mb3JtIHRvIFtJU08vSUVDIDEwMTE4XQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSSVBFTUQxNjAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdISVJMUE9PTCBNVVNUIGNvbmZvcm0gdG8gW0lTTy9JRUMgMTAxMThdCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFdISVJMUE9PTAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhhbmRlbHMgdGhlIGFnaWxlIGVuY3J5cHRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGNsYXNzIEVuY3J5cHRpb25JbmZvQWdpbGUgOiBFbmNyeXB0aW9uSW5mbworICAgIHsKKyAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBfbnNtOworICAgICAgICBwdWJsaWMgRW5jcnlwdGlvbkluZm9BZ2lsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudCA9IG5ldyBOYW1lVGFibGUoKTsKKyAgICAgICAgICAgIF9uc20gPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihudCk7CisgICAgICAgICAgICBfbnNtLkFkZE5hbWVzcGFjZSgiZCIsICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2VuY3J5cHRpb24iKTsKKyAgICAgICAgICAgIF9uc20uQWRkTmFtZXNwYWNlKCJjIiwgImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYva2V5RW5jcnlwdG9yL2NlcnRpZmljYXRlIik7CisgICAgICAgICAgICBfbnNtLkFkZE5hbWVzcGFjZSgicCIsICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2tleUVuY3J5cHRvci9wYXNzd29yZCIpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGNsYXNzIEVuY3J5cHRpb25LZXlEYXRhIDogWG1sSGVscGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBFbmNyeXB0aW9uS2V5RGF0YShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIGJ5dGVbXSBTYWx0VmFsdWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzID0gR2V0WG1sTm9kZVN0cmluZygiQHNhbHRWYWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzYWx0VmFsdWUiLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgZUhhc2hBbG9nb3JpdGhtIEhhc2hBbGdvcml0aG0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRIYXNoQWxnb3JpdGhtKEdldFhtbE5vZGVTdHJpbmcoIkBoYXNoQWxnb3JpdGhtIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBoYXNoQWxnb3JpdGhtIiwgR2V0SGFzaEFsZ29yaXRobVN0cmluZyh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBlSGFzaEFsb2dvcml0aG0gR2V0SGFzaEFsZ29yaXRobShzdHJpbmcgdikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJSSVBFTUQtMTI4IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSGFzaEFsb2dvcml0aG0uUklQRU1EMTI4OworICAgICAgICAgICAgICAgICAgICBjYXNlICJSSVBFTUQtMTYwIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlSGFzaEFsb2dvcml0aG0uUklQRU1EMTYwOworICAgICAgICAgICAgICAgICAgICBjYXNlICJTSEEtMSI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUhhc2hBbG9nb3JpdGhtLlNIQTE7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVIYXNoQWxvZ29yaXRobSlFbnVtLlBhcnNlKHR5cGVvZihlSGFzaEFsb2dvcml0aG0pLHYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJJbnZhbGlkIEhhc2ggYWxnb3JpdGhtIikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0SGFzaEFsZ29yaXRobVN0cmluZyhlSGFzaEFsb2dvcml0aG0gdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUhhc2hBbG9nb3JpdGhtLlJJUEVNRDEyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUklQRU1ELTEyOCI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUhhc2hBbG9nb3JpdGhtLlJJUEVNRDE2MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUklQRU1ELTE2MCI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUhhc2hBbG9nb3JpdGhtLlNIQTE6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNIQS0xIjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBlQ2hhaW5pbmdNb2RlIENoaXB0aGVyQ2hhaW5pbmcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB2PUdldFhtbE5vZGVTdHJpbmcoIkBjaXBoZXJDaGFpbmluZyIpOworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlQ2hhaW5pbmdNb2RlKUVudW0uUGFyc2UodHlwZW9mKGVDaGFpbmluZ01vZGUpLCB2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJJbnZhbGlkIGNoYWluaW5nIG1vZGUiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAY2lwaGVyQ2hhaW5pbmciLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBlQ2lwaGVyQWxnb3JpdGhtIENpcGhlckFsZ29yaXRobQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldENpcGhlckFsZ29yaXRobShHZXRYbWxOb2RlU3RyaW5nKCJAY2lwaGVyQWxnb3JpdGhtIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBjaXBoZXJBbGdvcml0aG0iLCBHZXRDaXBoZXJBbGdvcml0aG1TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgZUNpcGhlckFsZ29yaXRobSBHZXRDaXBoZXJBbGdvcml0aG0oc3RyaW5nIHYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiM0RFUyI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNpcGhlckFsZ29yaXRobS5UUklQTEVfREVTOworICAgICAgICAgICAgICAgICAgICBjYXNlICIzREVTXzExMiI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNpcGhlckFsZ29yaXRobS5UUklQTEVfREVTXzExMjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUNpcGhlckFsZ29yaXRobSlFbnVtLlBhcnNlKHR5cGVvZihlQ2lwaGVyQWxnb3JpdGhtKSwgdik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIkludmFsaWQgSGFzaCBhbGdvcml0aG0iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRDaXBoZXJBbGdvcml0aG1TdHJpbmcoZUNpcGhlckFsZ29yaXRobSBhbGcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbGcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGVDaXBoZXJBbGdvcml0aG0uVFJJUExFX0RFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM0RFUyI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZUNpcGhlckFsZ29yaXRobS5UUklQTEVfREVTXzExMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM0RFU18xMTIiOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxnLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgaW50IEhhc2hTaXplCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGhhc2hTaXplIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGhhc2hTaXplIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgaW50IEtleUJpdHMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAa2V5Qml0cyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBrZXlCaXRzIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgaW50IEJsb2NrU2l6ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBibG9ja1NpemUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYmxvY2tTaXplIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgaW50IFNhbHRTaXplCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQHNhbHRTaXplIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNhbHRTaXplIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGNsYXNzIEVuY3J5cHRpb25EYXRhSW50ZWdyaXR5IDogWG1sSGVscGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBFbmNyeXB0aW9uRGF0YUludGVncml0eShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIGJ5dGVbXSBFbmNyeXB0ZWRIbWFjVmFsdWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzID0gR2V0WG1sTm9kZVN0cmluZygiQGVuY3J5cHRlZEhtYWNWYWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBlbmNyeXB0ZWRIbWFjVmFsdWUiLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIEVuY3J5cHRlZEhtYWNLZXkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzID0gR2V0WG1sTm9kZVN0cmluZygiQGVuY3J5cHRlZEhtYWNLZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZW5jcnlwdGVkSG1hY0tleSIsIENvbnZlcnQuVG9CYXNlNjRTdHJpbmcodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgY2xhc3MgRW5jcnlwdGlvbktleUVuY3J5cHRvciA6IEVuY3J5cHRpb25LZXlEYXRhCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBFbmNyeXB0aW9uS2V5RW5jcnlwdG9yKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpIDoKKyAgICAgICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIEVuY3J5cHRlZEtleVZhbHVlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEdldFhtbE5vZGVTdHJpbmcoIkBlbmNyeXB0ZWRLZXlWYWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBlbmNyeXB0ZWRLZXlWYWx1ZSIsIENvbnZlcnQuVG9CYXNlNjRTdHJpbmcodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gRW5jcnlwdGVkVmVyaWZpZXJIYXNoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEdldFhtbE5vZGVTdHJpbmcoIkBlbmNyeXB0ZWRWZXJpZmllckhhc2hWYWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGVuY3J5cHRlZFZlcmlmaWVySGFzaFZhbHVlIiwgQ29udmVydC5Ub0Jhc2U2NFN0cmluZyh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIGJ5dGVbXSBFbmNyeXB0ZWRWZXJpZmllckhhc2hJbnB1dAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBHZXRYbWxOb2RlU3RyaW5nKCJAZW5jcnlwdGVkVmVyaWZpZXJIYXNoSW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZW5jcnlwdGVkVmVyaWZpZXJIYXNoSW5wdXQiLCBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIFZlcmlmaWVySGFzaElucHV0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIGJ5dGVbXSBWZXJpZmllckhhc2ggeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIEtleVZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIGludCBTcGluQ291bnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAc3BpbkNvdW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNwaW5Db3VudCIsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+CisgICAgICAgICAgIDxlbmNyeXB0aW9uIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2VuY3J5cHRpb24iIHhtbG5zOnA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYva2V5RW5jcnlwdG9yL3Bhc3N3b3JkIiB4bWxuczpjPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2tleUVuY3J5cHRvci9jZXJ0aWZpY2F0ZSI+CisgICAgICAgICAgICAgICA8a2V5RGF0YSBzYWx0U2l6ZT0iMTYiIGJsb2NrU2l6ZT0iMTYiIGtleUJpdHM9IjI1NiIgaGFzaFNpemU9IjY0IiBjaXBoZXJBbGdvcml0aG09IkFFUyIgY2lwaGVyQ2hhaW5pbmc9IkNoYWluaW5nTW9kZUNCQyIgaGFzaEFsZ29yaXRobT0iU0hBNTEyIiBzYWx0VmFsdWU9InBhK2hySjNzMXpyWTZobVZ1U2E1SlE9PSIgLz4KKyAgICAgICAgICAgICAgIDxkYXRhSW50ZWdyaXR5IGVuY3J5cHRlZEhtYWNLZXk9Im5kOGk0c0VLanNNalZOMmdMbzkxb0ZOMmU3YmhNcFdLRENBVUJFcHo0R1c2TmNFM2hCWERvYkxrc1p2UUd3THJQajBTVVZ6UUE4VnVETXlqTUFmVkNBPT0iIGVuY3J5cHRlZEhtYWNWYWx1ZT0iTzZvZWdIcFFWejJ1TzdPbTRvWmlqU2k0a3pMaWlNWkdJamZabHEvRUZGTzZQWmJLaXRlbkJxZTJvcjFSRWF4YUk3Z08vSm10SnpaMVZpdWNxVGF3NGc9PSIgLz4KKyAgICAgICAgICAgICAgIDxrZXlFbmNyeXB0b3JzPgorICAgICAgICAgICAgICAgICAgIDxrZXlFbmNyeXB0b3IgdXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2tleUVuY3J5cHRvci9wYXNzd29yZCI+CisgICAgICAgICAgICAgICAgICAgICAgPHA6ZW5jcnlwdGVkS2V5IHNwaW5Db3VudD0iMTAwMDAwIiBzYWx0U2l6ZT0iMTYiIGJsb2NrU2l6ZT0iMTYiIGtleUJpdHM9IjI1NiIgaGFzaFNpemU9IjY0IiBjaXBoZXJBbGdvcml0aG09IkFFUyIgY2lwaGVyQ2hhaW5pbmc9IkNoYWluaW5nTW9kZUNCQyIgaGFzaEFsZ29yaXRobT0iU0hBNTEyIiBzYWx0VmFsdWU9InUyQk5GQXVIWW4zTS9XUmphMy91UGc9PSIgZW5jcnlwdGVkVmVyaWZpZXJIYXNoSW5wdXQ9Ik0wVitmUm9sSk1SZ0Z5STl3K0FWeFE9PSIgZW5jcnlwdGVkVmVyaWZpZXJIYXNoVmFsdWU9IlYvNmw5cEZIN0FhWEZxRWJzbkZCZkhlN2dNT3FGZVJ3YU5NamM3RDNMTmR3NktnWnpPT1FsdDVzRTgvb0c3R1BWQkRHZm9RTVR4alF5ZFZQVnk0cW5nPT0iIGVuY3J5cHRlZEtleVZhbHVlPSJCMC9yYlNRUmlJS0c1Q1FESDZBS1lTeWJkWHp4Z0tBZlgxZitTNWs3bU5FPSIgLz4KKyAgICAgICAgICAgICAgICAgICA8L2tleUVuY3J5cHRvcj48L2tleUVuY3J5cHRvcnM+PC9lbmNyeXB0aW9uPgorICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgLyoqKgorICAgICAgICAgKiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0idHJ1ZSI/PgorICAgICAgICAgICAgPGVuY3J5cHRpb24geG1sbnM6Yz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNi9rZXlFbmNyeXB0b3IvY2VydGlmaWNhdGUiIHhtbG5zOnA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYva2V5RW5jcnlwdG9yL3Bhc3N3b3JkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjAwNi9lbmNyeXB0aW9uIj4KKyAgICAgICAgICogICAgICA8a2V5RGF0YSBzYWx0VmFsdWU9IlhtVEIvWEJHSlNid2QvR1RLelF2NUE9PSIgaGFzaEFsZ29yaXRobT0iU0hBNTEyIiBjaXBoZXJDaGFpbmluZz0iQ2hhaW5pbmdNb2RlQ0JDIiBjaXBoZXJBbGdvcml0aG09IkFFUyIgaGFzaFNpemU9IjY0IiBrZXlCaXRzPSIyNTYiIGJsb2NrU2l6ZT0iMTYiIHNhbHRTaXplPSIxNiIvPgorICAgICAgICAgKiAgICAgIDxkYXRhSW50ZWdyaXR5IGVuY3J5cHRlZEhtYWNWYWx1ZT0iV1d3M0JiMmRiY05QTW5sOWYxbzdyTzB1N3NjbFdHS1RYcUJBNnJSektzUDJLeldTNVQwTHhZOXFGb0M2UUU2N3QvdCtGTk50TURkTXRFM0QxeHZUOHc9PSIgZW5jcnlwdGVkSG1hY0tleT0icC9kVmRsSlk1S2owazNqSTFIUmpxdGs0czBZNEhtREFzYzhucVpnZnhOUzdEb3BBc1MzTFUvMnAzQ1lvSVJPYkhzbkhUQXRidWVIMDhERkNZR1pVUmc9PSIvPgorICAgICAgICAgKiAgICAgICAgICA8a2V5RW5jcnlwdG9ycz4KKyAgICAgICAgICogICAgICAgICAgICAgIDxrZXlFbmNyeXB0b3IgdXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L2tleUVuY3J5cHRvci9wYXNzd29yZCI+CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgPHA6ZW5jcnlwdGVkS2V5IHNhbHRWYWx1ZT0iRWVCdFkwUWZ0eU9rTHp0Q2w3TkYwZz09IiBoYXNoQWxnb3JpdGhtPSJTSEE1MTIiIGNpcGhlckNoYWluaW5nPSJDaGFpbmluZ01vZGVDQkMiIGNpcGhlckFsZ29yaXRobT0iQUVTIiBoYXNoU2l6ZT0iNjQiIGtleUJpdHM9IjI1NiIgYmxvY2tTaXplPSIxNiIgc2FsdFNpemU9IjE2IiBlbmNyeXB0ZWRLZXlWYWx1ZT0iWjdBTzh2SG5uUFpFYjFWcXlaTEo2SkZjM01xM0UzMjJYUHhXWFMyMWZiVT0iIGVuY3J5cHRlZFZlcmlmaWVySGFzaFZhbHVlPSJHN0J4YktuWmFubGR2dHNidTUxbVA5SjNmOVdyNXZDZkNwdldTaDVlSUpmZjdTcjNKMkR6SDEvOWFLajl1SXBxRlFJc0xvaHBSaytvQllEY1g3aFJndz09IiBlbmNyeXB0ZWRWZXJpZmllckhhc2hJbnB1dD0iODUxZXN6bDV5NXJkVTFSblRqRVdIdz09IiBzcGluQ291bnQ9IjEwMDAwMCIvPgorICAgICAgICAgKiAgICAgICAgICAgICAgPC9rZXlFbmNyeXB0b3I+CisgICAgICAgICAqICAgICAgPC9rZXlFbmNyeXB0b3JzPgorICAgICAgICAgKiAgICAgIDwvZW5jcnlwdGlvbgorICAgICAgICAgKiAqKiovCisgICAgICAgIGludGVybmFsIEVuY3J5cHRpb25EYXRhSW50ZWdyaXR5IERhdGFJbnRlZ3JpdHkgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBFbmNyeXB0aW9uS2V5RGF0YSBLZXlEYXRhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgTGlzdDxFbmNyeXB0aW9uS2V5RW5jcnlwdG9yPiBLZXlFbmNyeXB0b3JzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgWG1sRG9jdW1lbnQgWG1sIHtnZXQ7c2V0O30KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBSZWFkKGJ5dGVbXSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnlYbWwgPSBuZXcgYnl0ZVtkYXRhLkxlbmd0aCAtIDhdOworICAgICAgICAgICAgQXJyYXkuQ29weShkYXRhLCA4LCBieVhtbCwgMCwgZGF0YS5MZW5ndGggLSA4KTsKKyAgICAgICAgICAgIHZhciB4bWwgPSBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhieVhtbCk7CisgICAgICAgICAgICBSZWFkRnJvbVhtbCh4bWwpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgUmVhZEZyb21YbWwoc3RyaW5nIHhtbCkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoWG1sLCB4bWwsIEVuY29kaW5nLlVURjgpOworICAgICAgICAgICAgdmFyIG5vZGUgPSBYbWwuU2VsZWN0U2luZ2xlTm9kZSgiL2Q6ZW5jcnlwdGlvbi9kOmtleURhdGEiLCBfbnNtKTsKKyAgICAgICAgICAgIEtleURhdGEgPSBuZXcgRW5jcnlwdGlvbktleURhdGEoX25zbSwgbm9kZSk7CisgICAgICAgICAgICBub2RlID0gWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi9kOmVuY3J5cHRpb24vZDpkYXRhSW50ZWdyaXR5IiwgX25zbSk7CisgICAgICAgICAgICBEYXRhSW50ZWdyaXR5ID0gbmV3IEVuY3J5cHRpb25EYXRhSW50ZWdyaXR5KF9uc20sIG5vZGUpOworICAgICAgICAgICAgS2V5RW5jcnlwdG9ycyA9IG5ldyBMaXN0PEVuY3J5cHRpb25LZXlFbmNyeXB0b3I+KCk7CisKKyAgICAgICAgICAgIHZhciBsaXN0ID0gWG1sLlNlbGVjdE5vZGVzKCIvZDplbmNyeXB0aW9uL2Q6a2V5RW5jcnlwdG9ycy9kOmtleUVuY3J5cHRvci9wOmVuY3J5cHRlZEtleSIsIF9uc20pOworICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gbGlzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleUVuY3J5cHRvcnMuQWRkKG5ldyBFbmNyeXB0aW9uS2V5RW5jcnlwdG9yKF9uc20sIG4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhhbmRsZXMgdGhlIEVuY3J5cHRpb25JbmZvIHN0cmVhbQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgRW5jcnlwdGlvbkluZm9CaW5hcnkgOiBFbmNyeXB0aW9uSW5mbworICAgIHsKKworCisgICAgICAgIGludGVybmFsIEZsYWdzIEZsYWdzOworICAgICAgICBpbnRlcm5hbCB1aW50IEhlYWRlclNpemU7CisgICAgICAgIGludGVybmFsIEVuY3J5cHRpb25IZWFkZXIgSGVhZGVyOworICAgICAgICBpbnRlcm5hbCBFbmNyeXB0aW9uVmVyaWZpZXIgVmVyaWZpZXI7CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVhZChieXRlW10gZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgRmxhZ3MgPSAoRmxhZ3MpQml0Q29udmVydGVyLlRvSW50MzIoZGF0YSwgNCk7CisgICAgICAgICAgICBIZWFkZXJTaXplID0gKHVpbnQpQml0Q29udmVydGVyLlRvSW50MzIoZGF0YSwgOCk7CisKKyAgICAgICAgICAgIC8qKioqIEVuY3J5cHRpb25IZWFkZXIgKioqKi8KKyAgICAgICAgICAgIEhlYWRlciA9IG5ldyBFbmNyeXB0aW9uSGVhZGVyKCk7CisgICAgICAgICAgICBIZWFkZXIuRmxhZ3MgPSAoRmxhZ3MpQml0Q29udmVydGVyLlRvSW50MzIoZGF0YSwgMTIpOworICAgICAgICAgICAgSGVhZGVyLlNpemVFeHRyYSA9IEJpdENvbnZlcnRlci5Ub0ludDMyKGRhdGEsIDE2KTsKKyAgICAgICAgICAgIEhlYWRlci5BbGdJRCA9IChBbGdvcml0aG1JRClCaXRDb252ZXJ0ZXIuVG9JbnQzMihkYXRhLCAyMCk7CisgICAgICAgICAgICBIZWFkZXIuQWxnSURIYXNoID0gKEFsZ29yaXRobUhhc2hJRClCaXRDb252ZXJ0ZXIuVG9JbnQzMihkYXRhLCAyNCk7CisgICAgICAgICAgICBIZWFkZXIuS2V5U2l6ZSA9IEJpdENvbnZlcnRlci5Ub0ludDMyKGRhdGEsIDI4KTsKKyAgICAgICAgICAgIEhlYWRlci5Qcm92aWRlclR5cGUgPSAoUHJvdmlkZXJUeXBlKUJpdENvbnZlcnRlci5Ub0ludDMyKGRhdGEsIDMyKTsKKyAgICAgICAgICAgIEhlYWRlci5SZXNlcnZlZDEgPSBCaXRDb252ZXJ0ZXIuVG9JbnQzMihkYXRhLCAzNik7CisgICAgICAgICAgICBIZWFkZXIuUmVzZXJ2ZWQyID0gQml0Q29udmVydGVyLlRvSW50MzIoZGF0YSwgNDApOworCisgICAgICAgICAgICBieXRlW10gdGV4dCA9IG5ldyBieXRlWyhpbnQpSGVhZGVyU2l6ZSAtIDM0XTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoZGF0YSwgNDQsIHRleHQsIDAsIChpbnQpSGVhZGVyU2l6ZSAtIDM0KTsKKyAgICAgICAgICAgIEhlYWRlci5DU1BOYW1lID0gVVRGOEVuY29kaW5nLlVuaWNvZGUuR2V0U3RyaW5nKHRleHQpOworCisgICAgICAgICAgICBpbnQgcG9zID0gKGludClIZWFkZXJTaXplICsgMTI7CisKKyAgICAgICAgICAgIC8qKioqIEVuY3J5cHRpb25WZXJpZmllciAqKioqLworICAgICAgICAgICAgVmVyaWZpZXIgPSBuZXcgRW5jcnlwdGlvblZlcmlmaWVyKCk7CisgICAgICAgICAgICBWZXJpZmllci5TYWx0U2l6ZSA9ICh1aW50KUJpdENvbnZlcnRlci5Ub0ludDMyKGRhdGEsIHBvcyk7CisgICAgICAgICAgICBWZXJpZmllci5TYWx0ID0gbmV3IGJ5dGVbVmVyaWZpZXIuU2FsdFNpemVdOworCisgICAgICAgICAgICBBcnJheS5Db3B5KGRhdGEsIHBvcyArIDQsIFZlcmlmaWVyLlNhbHQsIDAsIFZlcmlmaWVyLlNhbHRTaXplKTsKKworICAgICAgICAgICAgVmVyaWZpZXIuRW5jcnlwdGVkVmVyaWZpZXIgPSBuZXcgYnl0ZVsxNl07CisgICAgICAgICAgICBBcnJheS5Db3B5KGRhdGEsIHBvcyArIDIwLCBWZXJpZmllci5FbmNyeXB0ZWRWZXJpZmllciwgMCwgMTYpOworCisgICAgICAgICAgICBWZXJpZmllci5WZXJpZmllckhhc2hTaXplID0gKHVpbnQpQml0Q29udmVydGVyLlRvSW50MzIoZGF0YSwgcG9zICsgMzYpOworICAgICAgICAgICAgVmVyaWZpZXIuRW5jcnlwdGVkVmVyaWZpZXJIYXNoID0gbmV3IGJ5dGVbVmVyaWZpZXIuVmVyaWZpZXJIYXNoU2l6ZV07CisgICAgICAgICAgICBBcnJheS5Db3B5KGRhdGEsIHBvcyArIDQwLCBWZXJpZmllci5FbmNyeXB0ZWRWZXJpZmllckhhc2gsIDAsIFZlcmlmaWVyLlZlcmlmaWVySGFzaFNpemUpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJ5dGVbXSBXcml0ZUJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOworCisgICAgICAgICAgICBidy5Xcml0ZShNYWpvclZlcnNpb24pOworICAgICAgICAgICAgYncuV3JpdGUoTWlub3JWZXJzaW9uKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKChpbnQpRmxhZ3MpOworICAgICAgICAgICAgYnl0ZVtdIGhlYWRlciA9IEhlYWRlci5Xcml0ZUJpbmFyeSgpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpaGVhZGVyLkxlbmd0aCk7CisgICAgICAgICAgICBidy5Xcml0ZShoZWFkZXIpOworICAgICAgICAgICAgYncuV3JpdGUoVmVyaWZpZXIuV3JpdGVCaW5hcnkoKSk7CisKKyAgICAgICAgICAgIGJ3LkZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uVmVyaWZpZXIuY3MgYi9FUFBsdXMvRW5jcnlwdGlvbi9FbmNyeXB0aW9uVmVyaWZpZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMTM1MwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FbmNyeXB0aW9uL0VuY3J5cHRpb25WZXJpZmllci5jcwpAQCAtMCwwICsxLDY0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMS0wNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkVuY3J5cHRpb24KK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEVuY3J5cHRpb24gdmVyaWZpZXIgaW5zaWRlIHRoZSBFbmNyeXB0aW9uSW5mbyBzdHJlYW0KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGNsYXNzIEVuY3J5cHRpb25WZXJpZmllcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgdWludCBTYWx0U2l6ZTsgICAgICAgICAgICAgIC8vIEFuIHVuc2lnbmVkIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIFNhbHQgZmllbGQuIEl0IE1VU1QgYmUgMHgwMDAwMDAxMC4KKyAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIFNhbHQ7ICAgICAgICAgICAgICAgIC8vKDE2IGJ5dGVzKTogQW4gYXJyYXkgb2YgYnl0ZXMgdGhhdCBzcGVjaWZpZXMgdGhlIHNhbHQgdmFsdWUgdXNlZCBkdXJpbmcgcGFzc3dvcmQgaGFzaCBnZW5lcmF0aW9uLiBJdCBNVVNUIE5PVCBiZSB0aGUgc2FtZSBkYXRhIHVzZWQgZm9yIHRoZSB2ZXJpZmllciBzdG9yZWQgZW5jcnlwdGVkIGluIHRoZSBFbmNyeXB0ZWRWZXJpZmllciBmaWVsZC4KKyAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIEVuY3J5cHRlZFZlcmlmaWVyOyAgIC8vKDE2IGJ5dGVzKTogTVVTVCBiZSB0aGUgcmFuZG9tbHkgZ2VuZXJhdGVkIFZlcmlmaWVyIHZhbHVlIGVuY3J5cHRlZCB1c2luZyB0aGUgYWxnb3JpdGhtIGNob3NlbiBieSB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgIGludGVybmFsIHVpbnQgVmVyaWZpZXJIYXNoU2l6ZTsgICAgICAvLyg0IGJ5dGVzKTogQW4gdW5zaWduZWQgaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBjb250YWluIHRoZSBoYXNoIG9mIHRoZSBkYXRhIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEVuY3J5cHRlZFZlcmlmaWVyIGZpZWxkLgorICAgICAgICBpbnRlcm5hbCBieXRlW10gRW5jcnlwdGVkVmVyaWZpZXJIYXNoOyAvLyh2YXJpYWJsZSk6IEFuIGFycmF5IG9mIGJ5dGVzIHRoYXQgY29udGFpbnMgdGhlIGVuY3J5cHRlZCBmb3JtIG9mIHRoZSBoYXNoIG9mIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgVmVyaWZpZXIgdmFsdWUuIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IE1VU1QgYmUgdGhlIHNpemUgb2YgdGhlIGVuY3J5cHRpb24gYmxvY2sgc2l6ZSBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWRlZCB0byBlbmNyeXB0IHRoZSBoYXNoIG9mIHRoZSBWZXJpZmllci4gSWYgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIGlzIFJDNCwgdGhlIGxlbmd0aCBNVVNUIGJlIDIwIGJ5dGVzLiBJZiB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gaXMgQUVTLCB0aGUgbGVuZ3RoIE1VU1QgYmUgMzIgYnl0ZXMuCisgICAgICAgIGludGVybmFsIGJ5dGVbXSBXcml0ZUJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOworCisgICAgICAgICAgICBidy5Xcml0ZShTYWx0U2l6ZSk7CisgICAgICAgICAgICBidy5Xcml0ZShTYWx0KTsKKyAgICAgICAgICAgIGJ3LldyaXRlKEVuY3J5cHRlZFZlcmlmaWVyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKDB4MTQpOyAgICAgICAgICAgICAgICAgLy9TaGExIGlzIDIwIGJ5dGVzICAoRW5jcnlwdGVkIGlzIDMyKQorICAgICAgICAgICAgYncuV3JpdGUoRW5jcnlwdGVkVmVyaWZpZXJIYXNoKTsKKworICAgICAgICAgICAgYncuRmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxBZGRyZXNzLmNzIGIvRVBQbHVzL0V4Y2VsQWRkcmVzcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM4YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsQWRkcmVzcy5jcwpAQCAtMCwwICsxLDE0MDUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMTgtTUFSLTIwMTAKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVGFibGVBZGRyZXNzCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgc3RyaW5nIENvbHVtblNwYW4geyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYm9vbCBJc0FsbCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBib29sIElzSGVhZGVyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGJvb2wgSXNEYXRhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGJvb2wgSXNUb3RhbHMgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYm9vbCBJc1RoaXNSb3cgeyBnZXQ7IHNldDsgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcmFuZ2UgYWRkcmVzcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPkV4YW1wbGVzIG9mIGFkZHJlc3NlcyBhcmUgIkExIiAiQjE6QzIiICJBOkEiICIxOjEiICJBMTpFMixHMzpHNSIgPC9yZW1hcmtzPgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3NCYXNlIDogRXhjZWxDZWxsQmFzZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgcHJvdGVjdGVkIGludCBfZnJvbVJvdz0tMSwgX3RvUm93LCBfZnJvbUNvbCwgX3RvQ29sOworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgYm9vbCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQ7CisgICAgICAgIGludGVybmFsIHByb3RlY3RlZCBzdHJpbmcgX3diOworICAgICAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgc3RyaW5nIF93czsKKyAgICAgICAgaW50ZXJuYWwgcHJvdGVjdGVkIHN0cmluZyBfYWRkcmVzczsKKyAgICAgICAgaW50ZXJuYWwgcHJvdGVjdGVkIGV2ZW50IEV2ZW50SGFuZGxlciBBZGRyZXNzQ2hhbmdlOworCisgICAgICAgIGludGVybmFsIGVudW0gZUFkZHJlc3NDb2xsaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgTm8sCisgICAgICAgICAgICBQYXJ0bHksCisgICAgICAgICAgICBJbnNpZGUsCisgICAgICAgICAgICBFcXVhbAorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgZW51bSBlU2hpZnRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJpZ2h0LAorICAgICAgICAgICAgRG93biwKKyAgICAgICAgICAgIEVudGlyZVJvdywKKyAgICAgICAgICAgIEVudGlyZUNvbHVtbgorICAgICAgICB9CisgICAgICAgICNyZWdpb24gIkNvbnN0cnVjdG9ycyIKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzQmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbVJvdyI+c3RhcnQgcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tQ29sIj5zdGFydCBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvUm93Ij5FbmQgcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b0NvbHVtbiI+RW5kIGNvbHVtbjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKKyAgICAgICAgICAgIF90b1JvdyA9IHRvUm93OworICAgICAgICAgICAgX2Zyb21Db2wgPSBmcm9tQ29sOworICAgICAgICAgICAgX3RvQ29sID0gdG9Db2x1bW47CisgICAgICAgICAgICBWYWxpZGF0ZSgpOworCisgICAgICAgICAgICBfYWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhbiBBZGRyZXNzIG9iamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Sb3ciPnN0YXJ0IHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbUNvbCI+c3RhcnQgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b1JvdyI+RW5kIHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9Db2x1bW4iPkVuZCBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Sb3dGaXhlZCI+c3RhcnQgcm93IGZpeGVkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tQ29sRml4ZWQiPnN0YXJ0IGNvbHVtbiBmaXhlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9Sb3dGaXhlZCI+RW5kIHJvdyBmaXhlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9Db2xGaXhlZCI+RW5kIGNvbHVtbiBmaXhlZDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2x1bW4sIGJvb2wgZnJvbVJvd0ZpeGVkLCBib29sIGZyb21Db2xGaXhlZCwgYm9vbCB0b1Jvd0ZpeGVkLCBib29sIHRvQ29sRml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKKyAgICAgICAgICAgIF90b1JvdyA9IHRvUm93OworICAgICAgICAgICAgX2Zyb21Db2wgPSBmcm9tQ29sOworICAgICAgICAgICAgX3RvQ29sID0gdG9Db2x1bW47CisgICAgICAgICAgICBfZnJvbVJvd0ZpeGVkID0gZnJvbVJvd0ZpeGVkOworICAgICAgICAgICAgX2Zyb21Db2xGaXhlZCA9IGZyb21Db2xGaXhlZDsKKyAgICAgICAgICAgIF90b1Jvd0ZpeGVkID0gdG9Sb3dGaXhlZDsKKyAgICAgICAgICAgIF90b0NvbEZpeGVkID0gdG9Db2xGaXhlZDsKKyAgICAgICAgICAgIFZhbGlkYXRlKCk7CisKKyAgICAgICAgICAgIF9hZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBmcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCApOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYW4gQWRkcmVzcyBvYmplY3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPkV4YW1wbGVzIG9mIGFkZHJlc3NlcyBhcmUgIkExIiAiQjE6QzIiICJBOkEiICIxOjEiICJBMTpFMixHMzpHNSIgPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBFeGNlbCBBZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2Uoc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhbiBBZGRyZXNzIG9iamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+RXhhbXBsZXMgb2YgYWRkcmVzc2VzIGFyZSAiQTEiICJCMTpDMiIgIkE6QSIgIjE6MSIgIkExOkUyLEczOkc1IiA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIEV4Y2VsIEFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBjayI+UmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlIHRvIGZpbmQgaW5mb3JtYXRpb24gYWJvdXQgdGFibGVzIGFuZCBuYW1lczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVmZXJlbmNlQWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgorICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZShzdHJpbmcgYWRkcmVzcywgRXhjZWxQYWNrYWdlIHBjaywgRXhjZWxBZGRyZXNzQmFzZSByZWZlcmVuY2VBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICAgICAgU2V0UkNGcm9tVGFibGUocGNrLCByZWZlcmVuY2VBZGRyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHZvaWQgU2V0UkNGcm9tVGFibGUoRXhjZWxQYWNrYWdlIHBjaywgRXhjZWxBZGRyZXNzQmFzZSByZWZlcmVuY2VBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3diKSAmJiBUYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBwY2suV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHdzLlRhYmxlcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuTmFtZS5FcXVhbHMoVGFibGUuTmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dzID0gd3MuTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVGFibGUuSXNBbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IHQuQWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvUm93ID0gdC5BZGRyZXNzLl90b1JvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRhYmxlLklzVGhpc1JvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZUFkZHJlc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b1JvdyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gcmVmZXJlbmNlQWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSBfZnJvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChUYWJsZS5Jc0hlYWRlciAmJiBUYWJsZS5Jc0RhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5BZGRyZXNzLl9mcm9tUm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvUm93ID0gdC5TaG93VG90YWwgPyB0LkFkZHJlc3MuX3RvUm93IC0gMSA6IHQuQWRkcmVzcy5fdG9Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGFibGUuSXNEYXRhICYmIFRhYmxlLklzVG90YWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IHQuU2hvd0hlYWRlciA/IHQuQWRkcmVzcy5fZnJvbVJvdyArIDEgOiB0LkFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRhYmxlLklzSGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IHQuU2hvd0hlYWRlciA/IHQuQWRkcmVzcy5fZnJvbVJvdyA6IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvUm93ID0gdC5TaG93SGVhZGVyID8gdC5BZGRyZXNzLl9mcm9tUm93IDogLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGFibGUuSXNUb3RhbHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5TaG93VG90YWwgPyB0LkFkZHJlc3MuX3RvUm93IDogLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LlNob3dUb3RhbCA/IHQuQWRkcmVzcy5fdG9Sb3cgOiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5TaG93SGVhZGVyID8gdC5BZGRyZXNzLl9mcm9tUm93ICsgMSA6IHQuQWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b1JvdyA9IHQuU2hvd1RvdGFsID8gdC5BZGRyZXNzLl90b1JvdyAtIDEgOiB0LkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KFRhYmxlLkNvbHVtblNwYW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Db2wgPSB0LkFkZHJlc3MuX2Zyb21Db2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b0NvbCA9IHQuQWRkcmVzcy5fdG9Db2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IHQuQWRkcmVzcy5fZnJvbUNvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHMgPSBUYWJsZS5Db2x1bW5TcGFuLlNwbGl0KCc6Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIHQuQ29sdW1ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9mcm9tQ29sIDw9IDAgJiYgY29sc1swXS5FcXVhbHMoYy5OYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgICAvL0lzc3VlMTUwNjMgQWRkIGludmFyaWFudCBpZ29yZSBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Db2wgPSBjb2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHMuTGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Db2wgPSBfZnJvbUNvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHMuTGVuZ3RoID4gMSAmJiBfZnJvbUNvbCA+IDAgJiYgY29sc1sxXS5FcXVhbHMoYy5OYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgLy9Jc3N1ZTE1MDYzIEFkZCBpbnZhcmlhbnQgaWdvcmUgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b0NvbCA9IGNvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRyZXNzIGlzIGFuIGRlZmluZWQgbmFtZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPnRoZSBuYW1lPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc05hbWUiPlNob3VsZCBhbHdheXMgYmUgdHJ1ZTwvcGFyYW0+CisgICAgICAgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2Uoc3RyaW5nIGFkZHJlc3MsIGJvb2wgaXNOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNOYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IC0xOworICAgICAgICAgICAgICAgIF9mcm9tQ29sID0gLTE7CisgICAgICAgICAgICAgICAgX3RvUm93ID0gLTE7CisgICAgICAgICAgICAgICAgX3RvQ29sID0gLTE7CisgICAgICAgICAgICAgICAgX3N0YXJ0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfZW5kID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHZvaWQgU2V0QWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuVHJpbSgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MuU3RhcnRzV2l0aCgiJyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwb3MgPSBhZGRyZXNzLkluZGV4T2YoIiciLCAxKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgYWRkcmVzcy5MZW5ndGggJiYgYWRkcmVzc1twb3MgKyAxXSA9PSAnXCcnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCInIiwgcG9zKzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgd2J3cyA9IGFkZHJlc3MuU3Vic3RyaW5nKDEscG9zLTEpLlJlcGxhY2UoIicnIiwiJyIpOworICAgICAgICAgICAgICAgIFNldFdiV3Mod2J3cyk7CisgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBhZGRyZXNzLlN1YnN0cmluZyhwb3MgKyAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3MuU3RhcnRzV2l0aCgiWyIpKSAvL1JlbW92ZSBhbnkgZXh0ZXJuYWwgcmVmZXJlbmNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0V2JXcyhhZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihfYWRkcmVzcy5JbmRleE9mQW55KG5ldyBjaGFyW10geycsJywnIScsICdbJ30pID4gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9BZHZhbmNlZCBhZGRyZXNzLiBJbmNsdWRpbmcgU2hlZXQgb3IgbXVsdGkgb3IgdGFibGUuCisgICAgICAgICAgICAgICAgRXh0cmFjdEFkZHJlc3MoX2FkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vU2ltcGxlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICBHZXRSb3dDb2xGcm9tQWRkcmVzcyhfYWRkcmVzcywgb3V0IF9mcm9tUm93LCBvdXQgX2Zyb21Db2wsIG91dCBfdG9Sb3csIG91dCAgX3RvQ29sLCBvdXQgX2Zyb21Sb3dGaXhlZCwgb3V0IF9mcm9tQ29sRml4ZWQsICBvdXQgX3RvUm93Rml4ZWQsIG91dCBfdG9Db2xGaXhlZCk7CisgICAgICAgICAgICAgICAgX2FkZHJlc3NlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgX3N0YXJ0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfZW5kID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgIFZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDaGFuZ2VBZGRyZXNzKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkZHJlc3NDaGFuZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRyZXNzQ2hhbmdlKHRoaXMsIG5ldyBFdmVudEFyZ3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFdiV3Moc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3M7CisgICAgICAgICAgICBpZiAoYWRkcmVzc1swXSA9PSAnWycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCJdIik7CisgICAgICAgICAgICAgICAgX3diID0gYWRkcmVzcy5TdWJzdHJpbmcoMSwgcG9zIC0gMSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF93cyA9IGFkZHJlc3MuU3Vic3RyaW5nKHBvcyArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93YiA9ICIiOworICAgICAgICAgICAgICAgIF93cyA9IGFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgPSBfd3MuSW5kZXhPZigiISIpOworICAgICAgICAgICAgaWYgKHBvcyA+IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gX3dzLlN1YnN0cmluZyhwb3MgKyAxKTsKKyAgICAgICAgICAgICAgICBfd3MgPSBfd3MuU3Vic3RyaW5nKDAsIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDaGFuZ2VXb3Jrc2hlZXQoc3RyaW5nIHdzTmFtZSwgc3RyaW5nIG5ld1dzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3dzID09IHdzTmFtZSkgX3dzID0gbmV3V3M7CisgICAgICAgICAgICB2YXIgZnVsbEFkZHJlc3MgPSBHZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYSBpbiBBZGRyZXNzZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYS5fd3MgPT0gd3NOYW1lKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhLl93cyA9IG5ld1dzOworICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEFkZHJlc3MgKz0gIiwiICsgYS5HZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsQWRkcmVzcyArPSAiLCIgKyBhLl9hZGRyZXNzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2FkZHJlc3MgPSBmdWxsQWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRyID0gIiI7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3diKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZHIgPSAiWyIgKyBfd2IgKyAiXSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkciArPSBzdHJpbmcuRm9ybWF0KCInezB9JyEiLCBfd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRyICs9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7CisgICAgICAgICAgICByZXR1cm4gYWRyOworICAgICAgICB9CisKKyAgICAgICAgRXhjZWxDZWxsQWRkcmVzcyBfc3RhcnQgPSBudWxsOworICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHJvdyBhbmQgY29sdW1uIG9mIHRoZSB0b3AgbGVmdCBjZWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHZhbHVlPlRoZSBzdGFydCByb3cgY29sdW1uLjwvdmFsdWU+CisgICAgICAgIHB1YmxpYyBFeGNlbENlbGxBZGRyZXNzIFN0YXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfc3RhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zdGFydCA9IG5ldyBFeGNlbENlbGxBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDZWxsQWRkcmVzcyBfZW5kID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgcm93IGFuZCBjb2x1bW4gb2YgdGhlIGJvdHRvbSByaWdodCBjZWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHZhbHVlPlRoZSBlbmQgcm93IGNvbHVtbi48L3ZhbHVlPgorICAgICAgICBwdWJsaWMgRXhjZWxDZWxsQWRkcmVzcyBFbmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9lbmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lbmQgPSBuZXcgRXhjZWxDZWxsQWRkcmVzcyhfdG9Sb3csIF90b0NvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsVGFibGVBZGRyZXNzIF90YWJsZT1udWxsOworICAgICAgICBwdWJsaWMgRXhjZWxUYWJsZUFkZHJlc3MgVGFibGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90YWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBhZGRyZXNzIGZvciB0aGUgcmFuZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEFkZHJlc3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGFkZHJlc3MgaXMgYSBkZWZpbmVkIG5hbWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgSXNOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbVJvdyA8IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9maXJzdEFkZHJlc3M7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGZpcnN0IGFkZHJlc3MgaWYgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aSBhZGRyZXNzLgorICAgICAgICAvLy8gQTE6QTIsQjE6QjIgcmV0dXJucyBBMTpBMgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgRmlyc3RBZGRyZXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfZmlyc3RBZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYWRkcmVzczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9maXJzdEFkZHJlc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBBZGRyZXNzU3BhY2VTZXBhcmF0ZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzLlJlcGxhY2UoJywnLCAnICcpOyAvL0NvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYW5kIGEgZmV3IG90aGVyIHBsYWNlcyB1c2Ugc3BhY2UgYXMgc2VwYXJhdG9yIGZvciBtdWxpdCBhZGRyZXNzZXMuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGUgdGhlIGFkZHJlc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgVmFsaWRhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Zyb21Sb3cgPiBfdG9Sb3cgfHwgX2Zyb21Db2wgPiBfdG9Db2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiU3RhcnQgY2VsbCBBZGRyZXNzIG11c3QgYmUgbGVzcyBvciBlcXVhbCB0byBFbmQgY2VsbCBhZGRyZXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFdvcmtTaGVldAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHByb3RlY3RlZCBMaXN0PEV4Y2VsQWRkcmVzcz4gX2FkZHJlc3NlcyA9IG51bGw7CisgICAgICAgIGludGVybmFsIHZpcnR1YWwgTGlzdDxFeGNlbEFkZHJlc3M+IEFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3NlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBFeHRyYWN0QWRkcmVzcyhzdHJpbmcgZnVsbEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBicmFja1Bvcz1uZXcgU3RhY2s8aW50PigpOworICAgICAgICAgICAgdmFyIGJyYWNrZXRQYXJ0cz1uZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBzdHJpbmcgZmlyc3Q9IiIsIHNlY29uZD0iIjsKKyAgICAgICAgICAgIGJvb2wgaXNUZXh0PWZhbHNlLCBoYXNTaGVldD1mYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmdWxsQWRkcmVzcyA9PSAiI1JFRiEiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0QWRkcmVzcyhyZWYgZnVsbEFkZHJlc3MsIHJlZiBzZWNvbmQsIHJlZiBoYXNTaGVldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsQWRkcmVzcy5TdGFydHNXaXRoKCIhIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGFkZHJlc3MhCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsQWRkcmVzcy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZnVsbEFkZHJlc3NbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcJycpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RleHQgJiYgaSArIDEgPCBmdWxsQWRkcmVzcy5MZW5ndGggJiYgZnVsbEFkZHJlc3NbaV0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU2hlZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgKz0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgKz0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSAhaXNUZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyYWNrUG9zLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWycgJiYgIWlzVGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrUG9zLlB1c2goaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ10nICYmICFpc1RleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IGJyYWNrUG9zLlBvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldFBhcnRzLkFkZChmdWxsQWRkcmVzcy5TdWJzdHJpbmcoZnJvbSArIDEsIGkgLSBmcm9tIC0gMSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVCcmFja2V0cyhmaXJzdCwgc2Vjb25kLCBicmFja2V0UGFydHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnZhbGlkIGFkZHJlc3MhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdbJyAmJiAhaXNUZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrUG9zLlB1c2goaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICchJyAmJiAhaXNUZXh0ICYmICFmaXJzdC5FbmRzV2l0aCgiI1JFRiIpICYmICFzZWNvbmQuRW5kc1dpdGgoIiNSRUYiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTaGVldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICcsJyAmJiAhaXNUZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEFkZHJlc3MocmVmIGZpcnN0LCByZWYgc2Vjb25kLCByZWYgaGFzU2hlZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNTaGVldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCArPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCArPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldEFkZHJlc3MocmVmIGZpcnN0LCByZWYgc2Vjb25kLCByZWYgaGFzU2hlZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEhhbmRsZUJyYWNrZXRzKHN0cmluZyBmaXJzdCwgc3RyaW5nIHNlY29uZCwgTGlzdDxzdHJpbmc+IGJyYWNrZXRQYXJ0cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIXN0cmluZy5Jc051bGxPckVtcHR5KGZpcnN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdGFibGUgPSBuZXcgRXhjZWxUYWJsZUFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICBUYWJsZS5OYW1lID0gZmlyc3Q7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gYnJhY2tldFBhcnRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocy5JbmRleE9mKCJbIik8MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHMuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiI2FsbCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5Jc0FsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiNoZWFkZXJzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGUuSXNIZWFkZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIjZGF0YSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5Jc0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIjdG90YWxzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLklzVG90YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiI3RoaXMgcm93IjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLklzVGhpc1JvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KF90YWJsZS5Db2x1bW5TcGFuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLkNvbHVtblNwYW49czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5Db2x1bW5TcGFuICs9ICI6IiArIHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNyZWdpb24gQWRkcmVzcyBtYW5pcHVsYXRpb24gbWV0aG9kcworICAgICAgICBpbnRlcm5hbCBlQWRkcmVzc0NvbGxpdGlvbiBDb2xsaWRlKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkZHJlc3MuV29ya1NoZWV0ICE9IFdvcmtTaGVldCAmJiBhZGRyZXNzLldvcmtTaGVldCE9bnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uTm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID4gX3RvUm93IHx8IGFkZHJlc3MuX2Zyb21Db2wgPiBfdG9Db2wKKyAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgIF9mcm9tUm93ID4gYWRkcmVzcy5fdG9Sb3cgfHwgX2Zyb21Db2wgPiBhZGRyZXNzLl90b0NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uTm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzLl9mcm9tUm93ID09IF9mcm9tUm93ICYmIGFkZHJlc3MuX2Zyb21Db2wgPT0gX2Zyb21Db2wgJiYKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5fdG9Sb3cgPT0gX3RvUm93ICYmIGFkZHJlc3MuX3RvQ29sID09IF90b0NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uRXF1YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzLl9mcm9tUm93ID49IF9mcm9tUm93ICYmIGFkZHJlc3MuX3RvUm93IDw9IF90b1JvdyAmJgorICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5fZnJvbUNvbCA+PSBfZnJvbUNvbCAmJiBhZGRyZXNzLl90b0NvbCA8PSBfdG9Db2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uUGFydGx5OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2UgQWRkUm93KGludCByb3csIGludCByb3dzLCBib29sIHNldEZpeGVkPWZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocm93ID4gX3RvUm93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocm93IDw9IF9mcm9tUm93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZSgoc2V0Rml4ZWQgJiYgX2Zyb21Sb3dGaXhlZCA/IF9mcm9tUm93IDogX2Zyb21Sb3cgKyByb3dzKSwgX2Zyb21Db2wsIChzZXRGaXhlZCAmJiBfdG9Sb3dGaXhlZCA/IF90b1JvdyA6IF90b1JvdyArIHJvd3MpLCBfdG9Db2wsIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBfZnJvbUNvbCwgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93ICsgcm93cyksIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIERlbGV0ZVJvdyhpbnQgcm93LCBpbnQgcm93cywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocm93ID4gX3RvUm93KSAvL0FmdGVyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBlbHNlIGlmIChyb3crcm93cyA8PSBfZnJvbVJvdykgLy9CZWZvcmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoKHNldEZpeGVkICYmIF9mcm9tUm93Rml4ZWQgPyBfZnJvbVJvdyA6IF9mcm9tUm93IC0gcm93cyksIF9mcm9tQ29sLCAoc2V0Rml4ZWQgJiYgX3RvUm93Rml4ZWQgPyBfdG9Sb3cgOiBfdG9Sb3cgLSByb3dzKSwgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocm93IDw9IF9mcm9tUm93ICYmIHJvdyArIHJvd3MgPiBfdG9Sb3cpIC8vSW5zaWRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAvL1BhcnRseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyb3cgPD0gX2Zyb21Sb3cpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2Uocm93LCBfZnJvbUNvbCwgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93IC0gcm93cyksIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBfZnJvbUNvbCwgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93IC0gcm93cyA8IHJvdyA/IHJvdyAtIDEgOiBfdG9Sb3cgLSByb3dzKSwgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEFkZENvbHVtbihpbnQgY29sLCBpbnQgY29scywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sID4gX3RvQ29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29sIDw9IF9mcm9tQ29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgKHNldEZpeGVkICYmIF9mcm9tQ29sRml4ZWQgPyBfZnJvbUNvbCA6IF9mcm9tQ29sICsgY29scyksIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDogX3RvQ29sICsgY29scyksIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCAoc2V0Rml4ZWQgJiYgX3RvQ29sRml4ZWQgPyBfdG9Db2wgOiBfdG9Db2wgKyBjb2xzKSwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIERlbGV0ZUNvbHVtbihpbnQgY29sLCBpbnQgY29scywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sID4gX3RvQ29sKSAvL0FmdGVyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb2wgKyBjb2xzIDw9IF9mcm9tQ29sKSAvL0JlZm9yZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgKHNldEZpeGVkICYmIF9mcm9tQ29sRml4ZWQgPyBfZnJvbUNvbCA6IF9mcm9tQ29sIC0gY29scyksIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDpfdG9Db2wgLSBjb2xzKSwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvbCA8PSBfZnJvbUNvbCAmJiBjb2wgKyBjb2xzID4gX3RvQ29sKSAvL0luc2lkZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgLy9QYXJ0bHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sIDw9IF9mcm9tQ29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBjb2wsIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDogX3RvQ29sIC0gY29scyksIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDpfdG9Db2wgLSBjb2xzIDwgY29sID8gY29sIC0gMSA6IF90b0NvbCAtIGNvbHMpLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEluc2VydChFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsIGVTaGlmdFR5cGUgU2hpZnQvKiwgb3V0IEV4Y2VsQWRkcmVzc0Jhc2UgdG9wQWRkcmVzcywgb3V0IEV4Y2VsQWRkcmVzc0Jhc2UgbGVmdEFkZHJlc3MsIG91dCBFeGNlbEFkZHJlc3NCYXNlIHJpZ2h0QWRkcmVzcywgb3V0IEV4Y2VsQWRkcmVzc0Jhc2UgYm90dG9tQWRkcmVzcyovKQorICAgICAgICB7CisgICAgICAgICAgICAvL0JlZm9yZSBvciBhZnRlciwgbm8gY2hhbmdlCisgICAgICAgICAgICAvL2lmICgoX3RvUm93ID4gYWRkcmVzcy5fZnJvbVJvdyAmJiBfdG9Db2wgPiBhZGRyZXNzLmNvbHVtbikgfHwgCisgICAgICAgICAgICAvLyAgICAoX2Zyb21Sb3cgPiBhZGRyZXNzLl90b1JvdyAmJiBjb2x1bW4gPiBhZGRyZXNzLl90b0NvbCkpCisgICAgICAgICAgICBpZihfdG9Sb3cgPCBhZGRyZXNzLl9mcm9tUm93IHx8IF90b0NvbCA8IGFkZHJlc3MuX2Zyb21Db2wgfHwgKF9mcm9tUm93ID4gYWRkcmVzcy5fdG9Sb3cgJiYgX2Zyb21Db2wgPiBhZGRyZXNzLl90b0NvbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy90b3BBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL2xlZnRBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL3JpZ2h0QWRkcmVzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgLy9ib3R0b21BZGRyZXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJvd3MgPSBhZGRyZXNzLlJvd3M7CisgICAgICAgICAgICBpbnQgY29scyA9IGFkZHJlc3MuQ29sdW1uczsKKyAgICAgICAgICAgIHN0cmluZyByZXRBZGRyZXNzID0gIiI7CisgICAgICAgICAgICBpZiAoU2hpZnQ9PWVTaGlmdFR5cGUuUmlnaHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MuX2Zyb21Sb3cgPiBfZnJvbVJvdykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldEFkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgYWRkcmVzcy5fZnJvbVJvdywgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihhZGRyZXNzLl9mcm9tQ29sID4gX2Zyb21Db2wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRBZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdyA8IGFkZHJlc3MuX2Zyb21Sb3cgPyBfZnJvbVJvdyA6IGFkZHJlc3MuX2Zyb21Sb3csIF9mcm9tQ29sLCBhZGRyZXNzLl9mcm9tUm93LCBfdG9Db2wsIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF90b1JvdyA8IGFkZHJlc3MuX2Zyb21Sb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9mcm9tUm93IDwgYWRkcmVzcy5fZnJvbVJvdykKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRBZGRyZXNzKHJlZiBzdHJpbmcgZmlyc3QsIHJlZiBzdHJpbmcgc2Vjb25kLCByZWYgYm9vbCBoYXNTaGVldCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdzLCBhZGRyZXNzOworICAgICAgICAgICAgaWYgKGhhc1NoZWV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdzID0gZmlyc3Q7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHNlY29uZDsKKyAgICAgICAgICAgICAgICBmaXJzdCA9ICIiOworICAgICAgICAgICAgICAgIHNlY29uZCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBmaXJzdDsKKyAgICAgICAgICAgICAgICB3cyA9ICIiOworICAgICAgICAgICAgICAgIGZpcnN0ID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNTaGVldCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF9maXJzdEFkZHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykgfHwgIXN0cmluZy5Jc051bGxPckVtcHR5KHdzKSkgX3dzID0gd3M7CisgICAgICAgICAgICAgICAgX2ZpcnN0QWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgICAgICAgICAgR2V0Um93Q29sRnJvbUFkZHJlc3MoYWRkcmVzcywgb3V0IF9mcm9tUm93LCBvdXQgX2Zyb21Db2wsIG91dCBfdG9Sb3csIG91dCAgX3RvQ29sLCBvdXQgX2Zyb21Sb3dGaXhlZCwgb3V0IF9mcm9tQ29sRml4ZWQsIG91dCBfdG9Sb3dGaXhlZCwgb3V0IF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2FkZHJlc3NlcyA9PSBudWxsKSBfYWRkcmVzc2VzID0gbmV3IExpc3Q8RXhjZWxBZGRyZXNzPigpOworICAgICAgICAgICAgICAgIF9hZGRyZXNzZXMuQWRkKG5ldyBFeGNlbEFkZHJlc3MoX3dzLCBhZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgZW51bSBBZGRyZXNzVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBJbnZhbGlkLAorICAgICAgICAgICAgSW50ZXJuYWxBZGRyZXNzLAorICAgICAgICAgICAgRXh0ZXJuYWxBZGRyZXNzLAorICAgICAgICAgICAgSW50ZXJuYWxOYW1lLAorICAgICAgICAgICAgRXh0ZXJuYWxOYW1lLAorICAgICAgICAgICAgRm9ybXVsYQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEFkZHJlc3NUeXBlIElzVmFsaWQoc3RyaW5nIEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgICAgaWYgKEFkZHJlc3MgPT0gIiNSRUYhIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZG91YmxlLlRyeVBhcnNlKEFkZHJlc3MsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkKSkgLy9BIGRvdWJsZSwgbm8gdmFsaWQgYWRkcmVzcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnZhbGlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoSXNGb3JtdWxhKEFkZHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5Gb3JtdWxhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB3Yiwgd3MsIGludEFkZHJlc3M7CisgICAgICAgICAgICAgICAgaWYoU3BsaXRBZGRyZXNzKEFkZHJlc3MsIG91dCB3Yiwgb3V0IHdzLCBvdXQgaW50QWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihpbnRBZGRyZXNzLkNvbnRhaW5zKCJbIikpIC8vVGFibGUgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuSXNOdWxsT3JFbXB0eSh3YikgPyBBZGRyZXNzVHlwZS5JbnRlcm5hbEFkZHJlc3MgOiBBZGRyZXNzVHlwZS5FeHRlcm5hbEFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihpbnRBZGRyZXNzLkNvbnRhaW5zKCIsIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludEFkZHJlc3M9aW50QWRkcmVzcy5TdWJzdHJpbmcoMCwgaW50QWRkcmVzcy5JbmRleE9mKCcsJykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKElzQWRkcmVzcyhpbnRBZGRyZXNzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Jc051bGxPckVtcHR5KHdiKSA/IEFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzcyA6IEFkZHJlc3NUeXBlLkV4dGVybmFsQWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuSXNOdWxsT3JFbXB0eSh3YikgPyBBZGRyZXNzVHlwZS5JbnRlcm5hbE5hbWUgOiBBZGRyZXNzVHlwZS5FeHRlcm5hbE5hbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludmFsaWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9pZihzdHJpbmcuSXNOdWxsT3JFbXB0eSh3YikpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0V4Y2VsQWRkcmVzcyBhID0gbmV3IEV4Y2VsQWRkcmVzcyhBZGRyZXNzKTsKKyAgICAgICAgICAgIC8vaWYgKEFkZHJlc3MuSW5kZXhPZignIScpID4gMCkKKyAgICAgICAgICAgIC8veyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vICAgIHN0cmluZ1tdIHNwbGl0ID0gQWRkcmVzcy5TcGxpdCgnIScpOworICAgICAgICAgICAgLy8gICAgaWYgKHNwbGl0Lkxlbmd0aCA9PSAyKQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHdzID0gc3BsaXRbMF07CisgICAgICAgICAgICAvLyAgICAgICAgQWRkcmVzcyA9IHNwbGl0WzFdOworICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy8gICAgZWxzZSBpZiAoc3BsaXQuTGVuZ3RoID09IDMgJiYgc3BsaXRbMV0gPT0gIiNSRUYiICYmIHNwbGl0WzJdID09ICIiKQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHdzID0gc3BsaXRbMF07CisgICAgICAgICAgICAvLyAgICAgICAgQWRkcmVzcyA9ICIjUkVGISI7CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKHdzLlN0YXJ0c1dpdGgoIlsiKSAmJiB3cy5JbmRleE9mKCJdIikgPiAxKQorICAgICAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkV4dGVybmFsQWRkcmVzczsKKyAgICAgICAgICAgIC8vICAgICAgICB9CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzczsKKyAgICAgICAgICAgIC8vICAgICAgICB9CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvLyAgICBlbHNlCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludmFsaWQ7CisgICAgICAgICAgICAvLyAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vaW50IF9mcm9tUm93LCBjb2x1bW4sIF90b1JvdywgX3RvQ29sOworICAgICAgICAgICAgLy9pZiAoRXhjZWxBZGRyZXNzQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhBZGRyZXNzLCBvdXQgX2Zyb21Sb3csIG91dCBjb2x1bW4sIG91dCBfdG9Sb3csIG91dCBfdG9Db2wpKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBpZiAoX2Zyb21Sb3cgPiAwICYmIGNvbHVtbiA+IDAgJiYgX3RvUm93IDw9IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICBpZiAod3MuU3RhcnRzV2l0aCgiWyIpICYmIHdzLkluZGV4T2YoIl0iKSA+IDEpCisgICAgICAgICAgICAvLyAgICAgICAgeworICAgICAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzOworICAgICAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgeworICAgICAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW50ZXJuYWxBZGRyZXNzOworICAgICAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIGlmKElzVmFsaWROYW1lKEFkZHJlc3MpKQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIGlmICh3cy5TdGFydHNXaXRoKCJbIikgJiYgd3MuSW5kZXhPZigiXSIpID4gMSkKKyAgICAgICAgICAgIC8vICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5FeHRlcm5hbE5hbWU7CisgICAgICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnRlcm5hbE5hbWU7CisgICAgICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy8gICAgZWxzZQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnZhbGlkOworICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy99CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNBZGRyZXNzKHN0cmluZyBpbnRBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eShpbnRBZGRyZXNzKSkgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGNlbGxzID0gaW50QWRkcmVzcy5TcGxpdCgnOicpOworICAgICAgICAgICAgaW50IGZyb21Sb3csdG9Sb3csIGZyb21Db2wsIHRvQ29sOworCisgICAgICAgICAgICBpZighR2V0Um93Q29sKGNlbGxzWzBdLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2VsbHMuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIUdldFJvd0NvbChjZWxsc1sxXSwgb3V0IHRvUm93LCBvdXQgdG9Db2wsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9Sb3cgPSBmcm9tUm93OworICAgICAgICAgICAgICAgIHRvQ29sID0gZnJvbUNvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBmcm9tUm93IDw9IHRvUm93ICYmIAorICAgICAgICAgICAgICAgIGZyb21Db2wgPD0gdG9Db2wgJiYgCisgICAgICAgICAgICAgICAgZnJvbUNvbCA+IC0xICYmIAorICAgICAgICAgICAgICAgIHRvQ29sIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zICYmIAorICAgICAgICAgICAgICAgIGZyb21Sb3cgPiAtMSAmJiAKKyAgICAgICAgICAgICAgICB0b1JvdyA8PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFNwbGl0QWRkcmVzcyhzdHJpbmcgQWRkcmVzcywgb3V0IHN0cmluZyB3Yiwgb3V0IHN0cmluZyB3cywgb3V0IHN0cmluZyBpbnRBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICB3YiA9ICIiOworICAgICAgICAgICAgd3MgPSAiIjsKKyAgICAgICAgICAgIGludEFkZHJlc3MgPSAiIjsKKyAgICAgICAgICAgIHZhciB0ZXh0ID0gIiI7CisgICAgICAgICAgICBib29sIGlzVGV4dCA9IGZhbHNlOworICAgICAgICAgICAgdmFyIGJyYWNrUG9zPS0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBZGRyZXNzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChBZGRyZXNzW2ldID09ICdcJycpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSAhaXNUZXh0OworICAgICAgICAgICAgICAgICAgICBpZihpPjAgJiYgQWRkcmVzc1tpLTFdPT0nXCcnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICInIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihBZGRyZXNzW2ldPT0nIScgJiYgIWlzVGV4dCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuTGVuZ3RoPjAgJiYgdGV4dFswXSA9PSAnWycpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2IgPSB0ZXh0LlN1YnN0cmluZygxLCB0ZXh0LkluZGV4T2YoIl0iKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gdGV4dC5TdWJzdHJpbmcodGV4dC5JbmRleE9mKCJdIikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cz10ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50QWRkcmVzcz1BZGRyZXNzLlN1YnN0cmluZyhpKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihBZGRyZXNzW2ldPT0nWycgJiYgIWlzVGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIC8vVGFibGUgcmVmZXJlbmNlIHJldHVybiBmdWxsIGFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRBZGRyZXNzPUFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFja1Bvcz1pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihBZGRyZXNzW2ldPT0nXScgJiYgIWlzVGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MgPiAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiID0gdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQrPUFkZHJlc3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRBZGRyZXNzID0gdGV4dDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0Zvcm11bGEoc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpc1RleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzcy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc1tpXSA9PSAnXCcnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXNUZXh0ID0gIWlzVGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGV4dD09ZmFsc2UgICYmIGFkZHJlc3MuU3Vic3RyaW5nKGksIDEpLkluZGV4T2ZBbnkobmV3IGNoYXJbXSB7ICcoJywgJyknLCAnKycsICctJywgJyonLCAnLycsICcuJywgJz0nLCAnXicsICcmJywgJyUnLCAnXCInIH0pID4gLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc1ZhbGlkTmFtZShzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goYWRkcmVzcywgIlteMC05Li8qLSsswr0hXCJAI8KjJSYve30oKVxcW1xcXT0/YF5+Jzo7PD58XVteLyotKyzCvSFcIkAjwqMlJi97fSgpXFxbXFxdPT9gXn4nOjs8PnxdKiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgUm93cyAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90b1JvdyAtIF9mcm9tUm93KzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBDb2x1bW5zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9Db2wgLSBfZnJvbUNvbCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBib29sIElzTXVsdGlDZWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChfZnJvbVJvdyA8IF9mcm9tQ29sIHx8IF9mcm9tQ29sIDwgX3RvQ29sKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgU3RyaW5nIEdldFdvcmtib29rUGFydChzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGl4ID0gMDsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzWzBdID09ICdbJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpeCA9IGFkZHJlc3MuSW5kZXhPZignXScpICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoaXggPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKDEsIGl4IC0gMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0V29ya3NoZWV0UGFydChzdHJpbmcgYWRkcmVzcywgc3RyaW5nIGRlZmF1bHRXb3JrU2hlZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpeD0wOworICAgICAgICAgICAgcmV0dXJuIEdldFdvcmtzaGVldFBhcnQoYWRkcmVzcywgZGVmYXVsdFdvcmtTaGVldCwgcmVmIGl4KTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldFdvcmtzaGVldFBhcnQoc3RyaW5nIGFkZHJlc3MsIHN0cmluZyBkZWZhdWx0V29ya1NoZWV0LCByZWYgaW50IGVuZEl4KQorICAgICAgICB7CisgICAgICAgICAgICBpZihhZGRyZXNzPT0iIikgcmV0dXJuIGRlZmF1bHRXb3JrU2hlZXQ7CisgICAgICAgICAgICB2YXIgaXggPSAwOworICAgICAgICAgICAgaWYgKGFkZHJlc3NbMF0gPT0gJ1snKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl4ID0gYWRkcmVzcy5JbmRleE9mKCddJykrMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpeCA+IDAgJiYgaXggPCBhZGRyZXNzLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc1tpeF0gPT0gJ1wnJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHJpbmcoYWRkcmVzcywgaXgsIG91dCBlbmRJeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpeEVuZCA9IGFkZHJlc3MuSW5kZXhPZignIScsaXgpOworICAgICAgICAgICAgICAgICAgICBpZihpeEVuZD5peCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4LCBpeEVuZC1peCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFdvcmtTaGVldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFdvcmtTaGVldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3NQYXJ0KHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaXg9MDsKKyAgICAgICAgICAgIEdldFdvcmtzaGVldFBhcnQoYWRkcmVzcywgIiIsIHJlZiBpeCk7CisgICAgICAgICAgICBpZihpeDxhZGRyZXNzLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc1tpeF0gPT0gJyEnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgU3BsaXRBZGRyZXNzKHN0cmluZyBmdWxsQWRkcmVzcywgb3V0IHN0cmluZyB3Yiwgb3V0IHN0cmluZyB3cywgb3V0IHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgZGVmYXVsdFdvcmtzaGVldD0iIikKKyAgICAgICAgeworICAgICAgICAgICAgd2IgPSBHZXRXb3JrYm9va1BhcnQoZnVsbEFkZHJlc3MpOworICAgICAgICAgICAgaW50IGl4PTA7CisgICAgICAgICAgICB3cyA9IEdldFdvcmtzaGVldFBhcnQoZnVsbEFkZHJlc3MsIGRlZmF1bHRXb3Jrc2hlZXQsIHJlZiBpeCk7CisgICAgICAgICAgICBpZiAoaXggPCBmdWxsQWRkcmVzcy5MZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZ1bGxBZGRyZXNzW2l4XSA9PSAnIScpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKGl4ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBmdWxsQWRkcmVzcy5TdWJzdHJpbmcoaXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzPSIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRTdHJpbmcoc3RyaW5nIGFkZHJlc3MsIGludCBpeCwgb3V0IGludCBlbmRJeCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0ckl4ID0gYWRkcmVzcy5JbmRleE9mKCInJyIpOworICAgICAgICAgICAgdmFyIHByZXZTdHJJeCA9IGl4OworICAgICAgICAgICAgd2hpbGUoc3RySXggPiAtMSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJldlN0ckl4ID0gc3RySXg7CisgICAgICAgICAgICAgICAgc3RySXggPSBhZGRyZXNzLkluZGV4T2YoIicnIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmRJeCA9IGFkZHJlc3MuSW5kZXhPZigiJyIpOworICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4LCBlbmRJeCAtIGl4KS5SZXBsYWNlKCInJyIsIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGJvb2wgSXNWYWxpZFJvd0NvbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhKF9mcm9tUm93ID4gX3RvUm93ICB8fAorICAgICAgICAgICAgICAgICAgIF9mcm9tQ29sID4gX3RvQ29sIHx8CisgICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPCAxIHx8CisgICAgICAgICAgICAgICAgICAgX2Zyb21Db2wgPCAxIHx8CisgICAgICAgICAgICAgICAgICAgX3RvUm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MgfHwKKyAgICAgICAgICAgICAgICAgICBfdG9Db2wgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSYW5nZSBhZGRyZXNzIHdpdGggdGhlIGFkZHJlc3MgcHJvcGVydHkgcmVhZG9ubHkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3MgOiBFeGNlbEFkZHJlc3NCYXNlCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3MoKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2x1bW4pCisgICAgICAgICAgICA6IGJhc2UoZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBfd3MgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgICAgICAgOiBiYXNlKGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzKHN0cmluZyB3cywgc3RyaW5nIGFkZHJlc3MpCisgICAgICAgICAgICA6IGJhc2UoYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykpIF93cyA9IHdzOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzLCBib29sIGlzTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShhZGRyZXNzLCBpc05hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSB3czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3Moc3RyaW5nIEFkZHJlc3MsIEV4Y2VsUGFja2FnZSBwYWNrYWdlLCBFeGNlbEFkZHJlc3NCYXNlIHJlZmVyZW5jZUFkZHJlc3MpIDoKKyAgICAgICAgICAgIGJhc2UoQWRkcmVzcywgcGFja2FnZSwgcmVmZXJlbmNlQWRkcmVzcykKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGFkZHJlc3MgZm9yIHRoZSByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+RXhhbXBsZXMgb2YgYWRkcmVzc2VzIGFyZSAiQTEiICJCMTpDMiIgIkE6QSIgIjE6MSIgIkExOkUyLEczOkc1IiA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBuZXcgc3RyaW5nIEFkZHJlc3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF9hZGRyZXNzKSAmJiBfZnJvbVJvdz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU2V0QWRkcmVzcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgYmFzZS5DaGFuZ2VBZGRyZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIGNsYXNzIEV4Y2VsRm9ybXVsYUFkZHJlc3MgOiBFeGNlbEFkZHJlc3NCYXNlCisgICAgeworICAgICAgICBib29sIF9mcm9tUm93Rml4ZWQsIF90b1Jvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Db2xGaXhlZDsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcygpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZWxGb3JtdWxhQWRkcmVzcyhpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sdW1uKQorICAgICAgICAgICAgOiBiYXNlKGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b0NvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgX3dzID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsRm9ybXVsYUFkZHJlc3Moc3RyaW5nIGFkZHJlc3MpCisgICAgICAgICAgICA6IGJhc2UoYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Rml4ZWQoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzKQorICAgICAgICAgICAgOiBiYXNlKGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSB3czsKKyAgICAgICAgICAgIFNldEZpeGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzLCBib29sIGlzTmFtZSkKKyAgICAgICAgICAgIDogYmFzZShhZGRyZXNzLCBpc05hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSB3czsKKyAgICAgICAgICAgIGlmKCFpc05hbWUpCisgICAgICAgICAgICAgICAgU2V0Rml4ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRGaXhlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChBZGRyZXNzLkluZGV4T2YoIlsiKSA+PSAwKSByZXR1cm47CisgICAgICAgICAgICB2YXIgYWRkcmVzcz1GaXJzdEFkZHJlc3M7CisgICAgICAgICAgICBpZihfZnJvbVJvdz09X3RvUm93ICYmIF9mcm9tQ29sPT1fdG9Db2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2V0Rml4ZWQoYWRkcmVzcywgb3V0IF9mcm9tUm93Rml4ZWQsIG91dCBfZnJvbUNvbEZpeGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2VsbHMgPSBhZGRyZXNzLlNwbGl0KCc6Jyk7CisgICAgICAgICAgICAgICAgR2V0Rml4ZWQoY2VsbHNbMF0sIG91dCBfZnJvbVJvd0ZpeGVkLCBvdXQgX2Zyb21Db2xGaXhlZCk7CisgICAgICAgICAgICAgICAgR2V0Rml4ZWQoY2VsbHNbMV0sIG91dCBfdG9Sb3dGaXhlZCwgb3V0IF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBHZXRGaXhlZChzdHJpbmcgYWRkcmVzcywgb3V0IGJvb2wgcm93Rml4ZWQsIG91dCBib29sIGNvbEZpeGVkKQorICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICByb3dGaXhlZD1jb2xGaXhlZD1mYWxzZTsKKyAgICAgICAgICAgIHZhciBpeD1hZGRyZXNzLkluZGV4T2YoJyQnKTsKKyAgICAgICAgICAgIHdoaWxlKGl4Pi0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl4Kys7CisgICAgICAgICAgICAgICAgaWYoaXggPCBhZGRyZXNzLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKGFkZHJlc3NbaXhdPj0nMCcgJiYgYWRkcmVzc1tpeF08PSc5JykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcm93Rml4ZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sRml4ZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpeCA9IGFkZHJlc3MuSW5kZXhPZignJCcsIGl4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgYWRkcmVzcyBmb3IgdGhlIHJhbmdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz5FeGFtcGxlcyBvZiBhZGRyZXNzZXMgYXJlICJBMSIgIkIxOkMyIiAiQTpBIiAiMToxIiAiQTE6RTIsRzM6RzUiIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIG5ldyBzdHJpbmcgQWRkcmVzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX2FkZHJlc3MpICYmIF9mcm9tUm93PjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX3RvUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNldEFkZHJlc3ModmFsdWUpOworICAgICAgICAgICAgICAgIGJhc2UuQ2hhbmdlQWRkcmVzcygpOworICAgICAgICAgICAgICAgIFNldEZpeGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgbmV3IExpc3Q8RXhjZWxGb3JtdWxhQWRkcmVzcz4gX2FkZHJlc3NlczsKKyAgICAgICAgcHVibGljIG5ldyBMaXN0PEV4Y2VsRm9ybXVsYUFkZHJlc3M+IEFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2FkZHJlc3NlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3NlcyA9IG5ldyBMaXN0PEV4Y2VsRm9ybXVsYUFkZHJlc3M+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfYWRkcmVzc2VzOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE9mZnNldChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZnJvbVJvdyA9IF9mcm9tUm93LCBmcm9tQ29sID0gX2Zyb21Db2wsIHRvUm93ID0gX3RvUm93LCB0b2NvbCA9IF90b0NvbDsKKyAgICAgICAgICAgIHZhciBpc011bHRpID0gKGZyb21Sb3cgIT0gdG9Sb3cgfHwgZnJvbUNvbCAhPSB0b2NvbCk7CisgICAgICAgICAgICBpZiAoIV9mcm9tUm93Rml4ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbVJvdyArPSByb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIV9mcm9tQ29sRml4ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbUNvbCArPSBjb2x1bW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNNdWx0aSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV90b1Jvd0ZpeGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9Sb3cgKz0gcm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIV90b0NvbEZpeGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9jb2wgKz0gY29sdW1uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b1JvdyA9IGZyb21Sb3c7CisgICAgICAgICAgICAgICAgdG9jb2wgPSBmcm9tQ29sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIGEgPSBHZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b2NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKKyAgICAgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2EgaW4gQWRkcmVzc2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYSs9IiwiICsgc2EuR2V0T2Zmc2V0KHJvdywgY29sdW1uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbEJhY2tncm91bmRJbWFnZS5jcyBiL0VQUGx1cy9FeGNlbEJhY2tncm91bmRJbWFnZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA2OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsQmFja2dyb3VuZEltYWdlLmNzCkBAIC0wLDAgKzEsMTYzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTEwLVNFUC0yMDA5CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGltYWdlIHRoYXQgZmlsbHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHdvcmtzaGVldC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEJhY2tncm91bmRJbWFnZSA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dvcmtTaGVldDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnNtIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPlRoZSB0b3Bub2RlIG9mIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtTaGVldCI+V29ya3NoZWV0IHJlZmVyZW5jZTwvcGFyYW0+CisgICAgICAgIGludGVybmFsICBFeGNlbEJhY2tncm91bmRJbWFnZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFdvcmtzaGVldCB3b3JrU2hlZXQpIDoKKyAgICAgICAgICAgIGJhc2UobnNtLCB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya1NoZWV0ID0gd29ya1NoZWV0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjb25zdCBzdHJpbmcgQkFDS0dST1VORFBJQ19QQVRIID0gImQ6cGljdHVyZS9AcjppZCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBiYWNrZ3JvdW5kIGltYWdlIG9mIHRoZSB3b3Jrc2hlZXQuIAorICAgICAgICAvLy8gVGhlIGltYWdlIHdpbGwgYmUgc2F2ZWQgaW50ZXJuYWxseSBhcyBhIGpwZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEltYWdlIEltYWdlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyByZWxJRCA9IEdldFhtbE5vZGVTdHJpbmcoQkFDS0dST1VORFBJQ19QQVRIKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHJlbElEKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBfd29ya1NoZWV0LlBhcnQuR2V0UmVsYXRpb25zaGlwKHJlbElEKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlUGFydCA9IF93b3JrU2hlZXQuUGFydC5QYWNrYWdlLkdldFBhcnQoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHJlbC5Tb3VyY2VVcmksIHJlbC5UYXJnZXRVcmkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEltYWdlLkZyb21TdHJlYW0oaW1hZ2VQYXJ0LkdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWxldGVQcmV2SW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoQkFDS0dST1VORFBJQ19QQVRIKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKHZhbHVlLCB0eXBlb2YoYnl0ZVtdKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBpaSA9IF93b3JrU2hlZXQuV29ya2Jvb2suX3BhY2thZ2UuQWRkSW1hZ2UoaW1nKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IF93b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoaWkuVXJpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2ltYWdlIik7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQkFDS0dST1VORFBJQ19QQVRILCByZWwuSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXQgdGhlIHBpY3R1cmUgZnJvbSBhbiBpbWFnZSBmaWxlLiAKKyAgICAgICAgLy8vIFRoZSBpbWFnZSBmaWxlIHdpbGwgYmUgc2F2ZWQgYXMgYSBibG9iLCBzbyBtYWtlIHN1cmUgRXhjZWwgc3VwcG9ydHMgdGhlIGltYWdlIGZvcm1hdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQaWN0dXJlRmlsZSI+VGhlIGltYWdlIGZpbGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0RnJvbUZpbGUoRmlsZUluZm8gUGljdHVyZUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZVByZXZJbWFnZSgpOworCisgICAgICAgICAgICBJbWFnZSBpbWc7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbWcgPSBJbWFnZS5Gcm9tRmlsZShQaWN0dXJlRmlsZS5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIkZpbGUgaXMgbm90IGEgc3VwcG9ydGVkIGltYWdlLWZpbGUgb3IgaXMgY29ycnVwdCIsIGV4KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7CisgICAgICAgICAgICBzdHJpbmcgY29udGVudFR5cGUgPSBFeGNlbFBpY3R1cmUuR2V0Q29udGVudFR5cGUoUGljdHVyZUZpbGUuRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHZhciBpbWFnZVVSSSA9IFhtbEhlbHBlci5HZXROZXdVcmkoX3dvcmtTaGVldC5fcGFja2FnZS5QYWNrYWdlLCAiL3hsL21lZGlhLyIgKyBQaWN0dXJlRmlsZS5OYW1lLlN1YnN0cmluZygwLCBQaWN0dXJlRmlsZS5OYW1lLkxlbmd0aCAtIFBpY3R1cmVGaWxlLkV4dGVuc2lvbi5MZW5ndGgpICsgInswfSIgKyBQaWN0dXJlRmlsZS5FeHRlbnNpb24pOworCisgICAgICAgICAgICBieXRlW10gZmlsZUJ5dGVzID0gKGJ5dGVbXSlpYy5Db252ZXJ0VG8oaW1nLCB0eXBlb2YoYnl0ZVtdKSk7CisgICAgICAgICAgICB2YXIgaWkgPSBfd29ya1NoZWV0Lldvcmtib29rLl9wYWNrYWdlLkFkZEltYWdlKGZpbGVCeXRlcywgaW1hZ2VVUkksIGNvbnRlbnRUeXBlKTsKKworCisgICAgICAgICAgICBpZiAoX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuUGFydEV4aXN0cyhpbWFnZVVSSSkgJiYgaWkuUmVmQ291bnQ9PTEpIC8vVGhlIGZpbGUgZXhpc3RzIHdpdGggYW5vdGhlciBjb250ZW50LCBvdmVyd3JpdGUgaXQuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGhlIHBhcnQgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuRGVsZXRlUGFydChpbWFnZVVSSSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpbWFnZVBhcnQgPSBfd29ya1NoZWV0LlBhcnQuUGFja2FnZS5DcmVhdGVQYXJ0KGltYWdlVVJJLCBjb250ZW50VHlwZSwgQ29tcHJlc3Npb25MZXZlbC5Ob25lKTsKKyAgICAgICAgICAgIC8vU2F2ZSB0aGUgcGljdHVyZSB0byBwYWNrYWdlLgorCisgICAgICAgICAgICB2YXIgc3RybSA9IGltYWdlUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKTsKKyAgICAgICAgICAgIHN0cm0uV3JpdGUoZmlsZUJ5dGVzLCAwLCBmaWxlQnl0ZXMuTGVuZ3RoKTsKKworICAgICAgICAgICAgdmFyIHJlbCA9IF93b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoaW1hZ2VVUkksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKKyAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQkFDS0dST1VORFBJQ19QQVRILCByZWwuSWQpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBEZWxldGVQcmV2SW1hZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVsSUQgPSBHZXRYbWxOb2RlU3RyaW5nKEJBQ0tHUk9VTkRQSUNfUEFUSCk7CisgICAgICAgICAgICBpZiAocmVsSUQgIT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKEltYWdlLCB0eXBlb2YoYnl0ZVtdKSk7CisgICAgICAgICAgICAgICAgdmFyIGlpID0gX3dvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5HZXRJbWFnZUluZm8oaW1nKTsKKworICAgICAgICAgICAgICAgIC8vRGVsZXRlIHRoZSByZWxhdGlvbgorICAgICAgICAgICAgICAgIF93b3JrU2hlZXQuUGFydC5EZWxldGVSZWxhdGlvbnNoaXAocmVsSUQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vRGVsZXRlIHRoZSBpbWFnZSBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgcmVmZXJlbmNlcy4KKyAgICAgICAgICAgICAgICBpZiAoaWkgIT0gbnVsbCAmJiBpaS5SZWZDb3VudCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF93b3JrU2hlZXQuUGFydC5QYWNrYWdlLlBhcnRFeGlzdHMoaWkuVXJpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuRGVsZXRlUGFydChpaS5VcmkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsQ2VsbEFkZHJlc3MuY3MgYi9FUFBsdXMvRXhjZWxDZWxsQWRkcmVzcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQzM2VmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsQ2VsbEFkZHJlc3MuY3MKQEAgLTAsMCArMSwxNTUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFN0YXJudXRvIERpIFRvcG8gJiBKYW4gS8OkbGxtYW4gIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTAzLTE0CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgc2luZ2xlIGNlbGwgYWRkcmVzcyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENlbGxBZGRyZXNzCisgICAgeworICAgICAgICBwdWJsaWMgRXhjZWxDZWxsQWRkcmVzcygpCisgICAgICAgICAgICA6IHRoaXMoMSwgMSkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBfcm93OworICAgICAgICBwcml2YXRlIGludCBfY29sdW1uOworICAgICAgICBwcml2YXRlIHN0cmluZyBfYWRkcmVzczsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsQ2VsbEFkZHJlc3MgY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj5UaGUgY29sdW1uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbENlbGxBZGRyZXNzKGludCByb3csIGludCBjb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuUm93ID0gcm93OworICAgICAgICAgICAgdGhpcy5Db2x1bW4gPSBjb2x1bW47CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsQ2VsbEFkZHJlc3MgY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLzxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgYWRkcmVzczwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbENlbGxBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLkFkZHJlc3MgPSBhZGRyZXNzOyAKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSb3cKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBSb3cKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJ2YWx1ZSIsICJSb3cgY2Fubm90IGJlIGxlc3MgdGhhbiAxLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLl9yb3cgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZihfY29sdW1uPjApIAorICAgICAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhfcm93LCBfY29sdW1uKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gIiNSRUYhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb2x1bW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb2x1bW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJ2YWx1ZSIsICJDb2x1bW4gY2Fubm90IGJlIGxlc3MgdGhhbiAxLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoX3JvdyA+IDApCisgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKF9yb3csIF9jb2x1bW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSAiI1JFRiEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENlbGxhZGRyZXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoX2FkZHJlc3MsIG91dCBfcm93LCBvdXQgX2NvbHVtbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGFkZHJlc3MgaXMgYW4gaW52YWxpZCByZWZlcmVuY2UgKCNSRUYhKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBJc1JlZgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3JvdyA8PSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbGV0dGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIDEtYmFzZWQgY29sdW1uIGluZGV4LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+SW5kZXggb2YgdGhlIGNvbHVtbiAoMS1iYXNlZCk8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvcnJlc3BvbmRpbmcgbGV0dGVyLCBsaWtlIEEgZm9yIDEuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRDb2x1bW5MZXR0ZXIoaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbHVtbiA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zIHx8IGNvbHVtbiA8IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgMS1iYXNlZCBjb2x1bW4gaW5kZXg6ICIgKyBjb2x1bW4gKyAiLiBWYWxpZCByYW5nZSBpcyAxIHRvICIgKyBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5HZXRDb2x1bW5MZXR0ZXIoY29sdW1uKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsQ2VsbEJhc2UuY3MgYi9FUFBsdXMvRXhjZWxDZWxsQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgxNDVlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsQ2VsbEJhc2UuY3MKQEAgLTAsMCArMSw5MDIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJhc2UgY2xhc3MgY29udGFpbmluZyBjZWxsIGFkZHJlc3MgbWFuaXB1bGF0aW5nIG1ldGhvZHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhjZWxDZWxsQmFzZQorICAgIHsKKyAgICAgICAgI3JlZ2lvbiAicHVibGljIGZ1bmN0aW9ucyIKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IHRoZSBzaGVldCwgcm93IGFuZCBjb2x1bW4gZnJvbSB0aGUgQ2VsbElECisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbElEIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+CisgICAgICAgIHN0YXRpYyBpbnRlcm5hbCB2b2lkIFNwbGl0Q2VsbElEKHVsb25nIGNlbGxJRCwgb3V0IGludCBzaGVldCwgb3V0IGludCByb3csIG91dCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBzaGVldCA9IChpbnQpKGNlbGxJRCAlIDB4ODAwMCk7CisgICAgICAgICAgICBjb2wgPSAoKGludCkoY2VsbElEID4+IDE1KSAmIDB4M0ZGKTsKKyAgICAgICAgICAgIHJvdyA9ICgoaW50KShjZWxsSUQgPj4gMjkpKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXQgdGhlIGNlbGxJRCBmb3IgdGhlIGNlbGwuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlNoZWV0SUQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldENlbGxJRChpbnQgU2hlZXRJRCwgaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgodWxvbmcpU2hlZXRJRCkgKyAoKCh1bG9uZyljb2wpIDw8IDE1KSArICgoKHVsb25nKXJvdykgPDwgMjkpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiAiRm9ybXVsYSBGdW5jdGlvbnMiCisgICAgICAgIHByaXZhdGUgZGVsZWdhdGUgc3RyaW5nIGRsZ1RyYW5zbChzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKTsKKyAgICAgICAgI3JlZ2lvbiBSMUMxIEZ1bmN0aW9ucyIKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNsYXRlcyBhIFIxQzEgdG8gYW4gYWJzb2x1dCBhZGRyZXNzL0Zvcm11bGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+QWRkcmVzczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5DdXJyZW50IHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj5DdXJyZW50IGNvbHVtbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgUkMgYWRkcmVzczwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgVHJhbnNsYXRlRnJvbVIxQzEoc3RyaW5nIHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlKHZhbHVlLCBUb0Ficywgcm93LCBjb2wsIC0xLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNsYXRlcyBhIGFic29sdXQgYWRkcmVzcyB0byBSMUMxIEZvcm1hdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5SMUMxIEFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Q3VycmVudCByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+Q3VycmVudCBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGFic29sdXQgYWRkcmVzcy9Gb3JtdWxhPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBUcmFuc2xhdGVUb1IxQzEoc3RyaW5nIHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlKHZhbHVlLCBUb1IxQzEsIHJvdywgY29sLCAtMSwgLTEpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRyYW5zbGF0ZXMgYmV0d2VlaW4gUjFDMSBvciBhYnNvbHV0IGFkZHJlc3NlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgYWRkcmVzc3MvZnVuY3Rpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3NUcmFuc2xhdG9yIj5UaGUgdHJhbnNsYXRpbmcgZnVuY3Rpb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93SW5jciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xJbmNyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVHJhbnNsYXRlKHN0cmluZyB2YWx1ZSwgZGxnVHJhbnNsIGFkZHJlc3NUcmFuc2xhdG9yLCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiIikKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICBib29sIGlzVGV4dCA9IGZhbHNlOworICAgICAgICAgICAgc3RyaW5nIHJldCA9ICIiOworICAgICAgICAgICAgc3RyaW5nIHBhcnQgPSAiIjsKKyAgICAgICAgICAgIGNoYXIgcHJldlRRID0gKGNoYXIpMDsKKyAgICAgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8IHZhbHVlLkxlbmd0aDsgcG9zKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gdmFsdWVbcG9zXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnIicgfHwgYz09J1wnJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1RleHQgPT0gZmFsc2UgJiYgcGFydCAhPSAiIiAmJiBwcmV2VFE9PWMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBhZGRyZXNzVHJhbnNsYXRvcihwYXJ0LCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VFEgPSAoY2hhcikwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByZXZUUSA9IGM7CisgICAgICAgICAgICAgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7CisgICAgICAgICAgICAgICAgICAgIHJldCArPSBjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1RleHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgKz0gYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjID09ICctJyB8fCBjID09ICcrJyB8fCBjID09ICcqJyB8fCBjID09ICcvJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnPScgfHwgYyA9PSAnXicgfHwgYyA9PSAnLCcgfHwgYyA9PSAnOicgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJygnIHx8IGMgPT0gJyknIHx8IGMgPT0gJyEnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjID09ICcgJyB8fCBjID09ICcmJyB8fCBjID09ICclJykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwb3MgPT0gMCB8fCB2YWx1ZVtwb3MgLSAxXSAhPSAnWycpKSAvL0xhc3QgcGFydCB0byBhbGxvdyBmb3IgUjFDMSBzdHlsZSBbLXhdCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBhZGRyZXNzVHJhbnNsYXRvcihwYXJ0LCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcikgKyBjOworICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFydCArPSBjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcnQgIT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ICs9IGFkZHJlc3NUcmFuc2xhdG9yKHBhcnQsIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJhbnNsYXRlIHRvIFIxQzEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXJ0Ij50aGUgdmFsdWUgdG8gYmUgdHJhbnNsYXRlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dJbmNyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbEluY3IiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb1IxQzEoc3RyaW5nIHBhcnQsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFkZHJSb3csIGFkZHJDb2w7CisgICAgICAgICAgICBzdHJpbmcgUmV0ID0gIlIiOworICAgICAgICAgICAgaWYgKEdldFJvd0NvbChwYXJ0LCBvdXQgYWRkclJvdywgb3V0IGFkZHJDb2wsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkclJvdyA9PSAwIHx8IGFkZHJDb2wgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFydC5JbmRleE9mKCckJywgMSkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0ICs9IGFkZHJSb3cuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRkclJvdyAtIHJvdyAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0ICs9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkclJvdyAtIHJvdyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcnQuU3RhcnRzV2l0aCgiJCIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJldCArICJDIiArIGFkZHJDb2w7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJDb2wgLSBjb2wgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXQgKyAiQyIgKyBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJDb2wgLSBjb2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmV0ICsgIkMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc2xhdGVzIHRvIGFic29sdXRlIGFkZHJlc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXJ0Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+IAorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3IiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFRvQWJzKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBjaGVjayA9IHBhcnQuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgICAgICAgICAgaW50IHJTdGFydCA9IGNoZWNrLkluZGV4T2YoIlIiKTsKKyAgICAgICAgICAgIGlmIChyU3RhcnQgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKKyAgICAgICAgICAgIGlmIChwYXJ0Lkxlbmd0aCA9PSAxKSAvL1IKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhyb3csIGNvbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjU3RhcnQgPSBjaGVjay5JbmRleE9mKCJDIik7CisgICAgICAgICAgICBib29sIGFic29sdXRlUm93LCBhYnNvbHV0ZUNvbDsKKyAgICAgICAgICAgIGlmIChjU3RhcnQgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IFJOdW0gPSBHZXRSQyhwYXJ0LCByb3csIG91dCBhYnNvbHV0ZVJvdyk7CisgICAgICAgICAgICAgICAgaWYgKFJOdW0gPiBpbnQuTWluVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhSTnVtLCBhYnNvbHV0ZVJvdywgY29sLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgUk51bSA9IEdldFJDKHBhcnQuU3Vic3RyaW5nKDEsIGNTdGFydCAtIDEpLCByb3csIG91dCBhYnNvbHV0ZVJvdyk7CisgICAgICAgICAgICAgICAgaW50IENOdW0gPSBHZXRSQyhwYXJ0LlN1YnN0cmluZyhjU3RhcnQgKyAxLCBwYXJ0Lkxlbmd0aCAtIGNTdGFydCAtIDEpLCBjb2wsIG91dCBhYnNvbHV0ZUNvbCk7CisgICAgICAgICAgICAgICAgaWYgKFJOdW0gPiBpbnQuTWluVmFsdWUgJiYgQ051bSA+IGludC5NaW5WYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKFJOdW0sIGFic29sdXRlUm93LCBDTnVtLCBhYnNvbHV0ZUNvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIG9yIHN1YnRyYWN0cyBhIHJvdyBvciBjb2x1bW4gdG8gYW4gYWRkcmVzcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dJbmNyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbEluY3IiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBBZGRUb1Jvd0NvbHVtblRyYW5zbGF0b3Ioc3RyaW5nIEFkZHJlc3MsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGZyb21Sb3csIGZyb21Db2w7CisgICAgICAgICAgICBpZiAoQWRkcmVzcyA9PSAiI1JFRiEiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEdldFJvd0NvbChBZGRyZXNzLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbVJvdyA9PSAwIHx8IGZyb21Db2wgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocm93SW5jciAhPSAwICYmIHJvdyAhPSAwICYmIGZyb21Sb3cgPj0gcm93ICYmIEFkZHJlc3MuSW5kZXhPZignJCcsIDEpID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Sb3cgPCByb3cgLSByb3dJbmNyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZyb21Sb3cgPSBmcm9tUm93ICsgcm93SW5jcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29sSW5jciAhPSAwICYmIGNvbCAhPSAwICYmIGZyb21Db2wgPj0gY29sICYmIEFkZHJlc3MuU3RhcnRzV2l0aCgiJCIpID09IGZhbHNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Db2wgPCBjb2wgLSBjb2xJbmNyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZyb21Db2wgPSBmcm9tQ29sICsgY29sSW5jcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBZGRyZXNzID0gR2V0QWRkcmVzcyhmcm9tUm93LCBBZGRyZXNzLkluZGV4T2YoJyQnLCAxKSA+IC0xLCBmcm9tQ29sLCBBZGRyZXNzLlN0YXJ0c1dpdGgoIiQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWRkcmVzczsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgd2l0aCBicmFja2V0cyBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij5UaGUgdmFsdWU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0UkNGbXQoaW50IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAodiA8IDAgPyBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIHYpIDogdiA+IDAgPyB2LlRvU3RyaW5nKCkgOiAiIik7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IHRoZSBvZmZzZXQgdmFsdWUgZm9yIFJDIGZvcm1hdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik9mZnNldFZhbHVlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkQWRkciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldFJDKHN0cmluZyB2YWx1ZSwgaW50IE9mZnNldFZhbHVlLCBvdXQgYm9vbCBmaXhlZEFkZHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXhlZEFkZHIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT2Zmc2V0VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgaWYgKHZhbHVlWzBdID09ICdbJyAmJiB2YWx1ZVt2YWx1ZS5MZW5ndGggLSAxXSA9PSAnXScpIC8vT2Zmc2V0PyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXhlZEFkZHIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHZhbHVlLlN1YnN0cmluZygxLCB2YWx1ZS5MZW5ndGggLSAyKSwgb3V0IG51bSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE9mZnNldFZhbHVlICsgbnVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludC5NaW5WYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZml4ZWRBZGRyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHZhbHVlLCBvdXQgbnVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWluVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiAiQWRkcmVzcyBGdW5jdGlvbnMiCisgICAgICAgICNyZWdpb24gR2V0Q29sdW1uTGV0dGVyCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyZWQgY29sdW1uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaUNvbHVtbk51bWJlciI+VGhlIG51bWJlciBvZiB0aGUgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBsZXR0ZXIgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldENvbHVtbkxldHRlcihpbnQgaUNvbHVtbk51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldENvbHVtbkxldHRlcihpQ29sdW1uTnVtYmVyLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0Q29sdW1uTGV0dGVyKGludCBpQ29sdW1uTnVtYmVyLCBib29sIGZpeGVkQ29sKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmIChpQ29sdW1uTnVtYmVyIDwgMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbiBudW1iZXIgaXMgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICIjUkVGISI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyBzQ29sID0gIiI7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNDb2wgPSAoKGNoYXIpKCdBJyArICgoaUNvbHVtbk51bWJlciAtIDEpICUgMjYpKSkgKyBzQ29sOworICAgICAgICAgICAgICAgIGlDb2x1bW5OdW1iZXIgPSAoaUNvbHVtbk51bWJlciAtICgoaUNvbHVtbk51bWJlciAtIDEpICUgMjYpKSAvIDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGlDb2x1bW5OdW1iZXIgPiAwKTsKKyAgICAgICAgICAgIHJldHVybiBmaXhlZENvbCA/ICIkIiArIHNDb2wgOiBzQ29sOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2xGcm9tQWRkcmVzcyhzdHJpbmcgQ2VsbEFkZHJlc3MsIG91dCBpbnQgRnJvbVJvdywgb3V0IGludCBGcm9tQ29sdW1uLCBvdXQgaW50IFRvUm93LCBvdXQgaW50IFRvQ29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGZpeGVkRnJvbVJvdywgZml4ZWRGcm9tQ29sdW1uLCBmaXhlZFRvUm93LCBmaXhlZFRvQ29sdW1uOworICAgICAgICAgICAgcmV0dXJuIEdldFJvd0NvbEZyb21BZGRyZXNzKENlbGxBZGRyZXNzLCBvdXQgRnJvbVJvdywgb3V0IEZyb21Db2x1bW4sIG91dCBUb1Jvdywgb3V0IFRvQ29sdW1uLCBvdXQgZml4ZWRGcm9tUm93LCBvdXQgZml4ZWRGcm9tQ29sdW1uLCBvdXQgZml4ZWRUb1Jvdywgb3V0IGZpeGVkVG9Db2x1bW4pOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCB0aGUgcm93L2NvbHVtbnMgZm9yIGEgQ2VsbC1hZGRyZXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ2VsbEFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tUm93Ij5SZXR1cm5zIHRoZSB0byBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Db2x1bW4iPlJldHVybnMgdGhlIGZyb20gY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb1JvdyI+UmV0dXJucyB0aGUgdG8gcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb0NvbHVtbiI+UmV0dXJucyB0aGUgZnJvbSByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkRnJvbVJvdyI+SXMgdGhlIGZyb20gcm93IGZpeGVkPzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZml4ZWRGcm9tQ29sdW1uIj5JcyB0aGUgZnJvbSBjb2x1bW4gZml4ZWQ/PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaXhlZFRvUm93Ij5JcyB0aGUgdG8gcm93IGZpeGVkPzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZml4ZWRUb0NvbHVtbiI+SXMgdGhlIHRvIGNvbHVtbiBmaXhlZD88L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2xGcm9tQWRkcmVzcyhzdHJpbmcgQ2VsbEFkZHJlc3MsIG91dCBpbnQgRnJvbVJvdywgb3V0IGludCBGcm9tQ29sdW1uLCBvdXQgaW50IFRvUm93LCBvdXQgaW50IFRvQ29sdW1uLCBvdXQgYm9vbCBmaXhlZEZyb21Sb3csIG91dCBib29sIGZpeGVkRnJvbUNvbHVtbiwgb3V0IGJvb2wgZml4ZWRUb1Jvdywgb3V0IGJvb2wgZml4ZWRUb0NvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCByZXQ7CisgICAgICAgICAgICBpZiAoQ2VsbEFkZHJlc3MuSW5kZXhPZignWycpID4gMCkgLy9FeHRlcm5hbCByZWZlcmVuY2Ugb3IgcmVmZXJlbmNlIHRvIFRhYmxlIG9yIFBpdm90dGFibGUuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRnJvbVJvdyA9IC0xOworICAgICAgICAgICAgICAgIEZyb21Db2x1bW4gPSAtMTsKKyAgICAgICAgICAgICAgICBUb1JvdyA9IC0xOworICAgICAgICAgICAgICAgIFRvQ29sdW1uID0gLTE7CisgICAgICAgICAgICAgICAgZml4ZWRGcm9tUm93ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZml4ZWRGcm9tQ29sdW1uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZml4ZWRUb1Jvdz0gZmFsc2U7CisgICAgICAgICAgICAgICAgZml4ZWRUb0NvbHVtbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2VsbEFkZHJlc3MgPSBDZWxsQWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgLy9UaGlzIG9uZSBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSB3b3Jrc2hlZXQgU2VsZWN0IGZvcm1hdCBpcyBmaXhlZAorICAgICAgICAgICAgaWYgKENlbGxBZGRyZXNzLkluZGV4T2YoJyAnKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2VsbEFkZHJlc3MgPSBDZWxsQWRkcmVzcy5TdWJzdHJpbmcoMCwgQ2VsbEFkZHJlc3MuSW5kZXhPZignICcpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKENlbGxBZGRyZXNzLkluZGV4T2YoJzonKSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gR2V0Um93Q29sRnJvbUFkZHJlc3MoQ2VsbEFkZHJlc3MsIG91dCBGcm9tUm93LCBvdXQgRnJvbUNvbHVtbiwgb3V0IGZpeGVkRnJvbVJvdywgb3V0IGZpeGVkRnJvbUNvbHVtbik7CisgICAgICAgICAgICAgICAgVG9Db2x1bW4gPSBGcm9tQ29sdW1uOworICAgICAgICAgICAgICAgIFRvUm93ID0gRnJvbVJvdzsKKyAgICAgICAgICAgICAgICBmaXhlZFRvUm93ID0gZml4ZWRGcm9tUm93OworICAgICAgICAgICAgICAgIGZpeGVkVG9Db2x1bW4gPSBmaXhlZEZyb21Db2x1bW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nW10gY2VsbHMgPSBDZWxsQWRkcmVzcy5TcGxpdCgnOicpOworICAgICAgICAgICAgICAgIHJldCA9IEdldFJvd0NvbEZyb21BZGRyZXNzKGNlbGxzWzBdLCBvdXQgRnJvbVJvdywgb3V0IEZyb21Db2x1bW4sIG91dCBmaXhlZEZyb21Sb3csIG91dCBmaXhlZEZyb21Db2x1bW4pOworICAgICAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEdldFJvd0NvbEZyb21BZGRyZXNzKGNlbGxzWzFdLCBvdXQgVG9Sb3csIG91dCBUb0NvbHVtbiwgb3V0IGZpeGVkVG9Sb3csIG91dCBmaXhlZFRvQ29sdW1uKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXRSb3dDb2xGcm9tQWRkcmVzcyhjZWxsc1sxXSwgb3V0IFRvUm93LCBvdXQgVG9Db2x1bW4sIG91dCBmaXhlZFRvUm93LCBvdXQgZml4ZWRUb0NvbHVtbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKEZyb21Db2x1bW4gPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgRnJvbUNvbHVtbiA9IDE7CisgICAgICAgICAgICAgICAgaWYgKEZyb21Sb3cgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgRnJvbVJvdyA9IDE7CisgICAgICAgICAgICAgICAgaWYgKFRvQ29sdW1uIDw9IDApCisgICAgICAgICAgICAgICAgICAgIFRvQ29sdW1uID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7CisgICAgICAgICAgICAgICAgaWYgKFRvUm93IDw9IDApCisgICAgICAgICAgICAgICAgICAgIFRvUm93ID0gRXhjZWxQYWNrYWdlLk1heFJvd3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCB0aGUgcm93L2NvbHVtbiBmb3IgbiBDZWxsLWFkZHJlc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDZWxsQWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+UmV0dXJucyBUdGhlIHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5SZXR1cm5zIHRoZSBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB2YWxpZDwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgR2V0Um93Q29sRnJvbUFkZHJlc3Moc3RyaW5nIENlbGxBZGRyZXNzLCBvdXQgaW50IFJvdywgb3V0IGludCBDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRSb3dDb2woQ2VsbEFkZHJlc3MsIG91dCBSb3csIG91dCBDb2x1bW4sIHRydWUpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbEZyb21BZGRyZXNzKHN0cmluZyBDZWxsQWRkcmVzcywgb3V0IGludCByb3csIG91dCBpbnQgY29sLCBvdXQgYm9vbCBmaXhlZFJvdywgb3V0IGJvb2wgZml4ZWRDb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRSb3dDb2woQ2VsbEFkZHJlc3MsIG91dCByb3csIG91dCBjb2wsIHRydWUsIG91dCBmaXhlZFJvdywgb3V0IGZpeGVkQ29sKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCB0aGUgcm93L2NvbHVtbiBmb3IgYSBDZWxsLWFkZHJlc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj50aGUgYWRkcmVzczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5yZXR1cm5zIHRoZSByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+cmV0dXJucyB0aGUgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJvd0V4Y2VwdGlvbiI+dGhyb3cgZXhjZXB0aW9uIGlmIGludmFsaWQsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgR2V0Um93Q29sKHN0cmluZyBhZGRyZXNzLCBvdXQgaW50IHJvdywgb3V0IGludCBjb2wsIGJvb2wgdGhyb3dFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgZml4ZWRSb3csIGZpeGVkQ29sOworICAgICAgICAgICAgcmV0dXJuIEdldFJvd0NvbChhZGRyZXNzLCBvdXQgcm93LCBvdXQgY29sLCB0aHJvd0V4Y2VwdGlvbiwgb3V0IGZpeGVkUm93LCBvdXQgZml4ZWRDb2wpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbChzdHJpbmcgYWRkcmVzcywgb3V0IGludCByb3csIG91dCBpbnQgY29sLCBib29sIHRocm93RXhjZXB0aW9uLCBvdXQgYm9vbCBmaXhlZFJvdywgb3V0IGJvb2wgZml4ZWRDb2wpCisgICAgICAgIHsKKyAgICAgICAgICBib29sIGNvbFBhcnQgPSB0cnVlOworICAgICAgICAgIGludCBjb2xTdGFydEl4ID0gMDsKKyAgICAgICAgICBpbnQgY29sTGVuZ3RoID0gMDsKKyAgICAgICAgICBjb2wgPSAwOworICAgICAgICAgIHJvdyA9IDA7CisgICAgICAgICAgZml4ZWRSb3cgPSBmYWxzZTsKKyAgICAgICAgICBmaXhlZENvbCA9IGZhbHNlOworCisgICAgICAgICAgaWYgKGFkZHJlc3MuRW5kc1dpdGgoIiNSRUYhIikpCisgICAgICAgICAgeworICAgICAgICAgICAgcm93ID0gMDsKKyAgICAgICAgICAgIGNvbCA9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbnQgc2hlZXRNYXJrZXJJbmRleCA9IGFkZHJlc3MuSW5kZXhPZignIScpOworICAgICAgICAgIGlmIChzaGVldE1hcmtlckluZGV4ID49IDApCisgICAgICAgICAgeworICAgICAgICAgICAgY29sU3RhcnRJeCA9IHNoZWV0TWFya2VySW5kZXggKyAxOworICAgICAgICAgIH0KKyAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgIGZvciAoaW50IGkgPSBjb2xTdGFydEl4OyBpIDwgYWRkcmVzcy5MZW5ndGg7IGkrKykKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGMgPSBhZGRyZXNzW2ldOworICAgICAgICAgICAgaWYgKGNvbFBhcnQgJiYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSAmJiBjb2xMZW5ndGggPD0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29sICo9IDI2OworICAgICAgICAgICAgICBjb2wgKz0gKChpbnQpYykgLSA2NDsKKyAgICAgICAgICAgICAgY29sTGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcm93ICo9IDEwOworICAgICAgICAgICAgICByb3cgKz0gKChpbnQpYykgLSA0ODsKKyAgICAgICAgICAgICAgY29sUGFydCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnJCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChpID09IGNvbFN0YXJ0SXgpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2xTdGFydEl4Kys7CisgICAgICAgICAgICAgICAgZml4ZWRDb2wgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbFBhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaXhlZFJvdyA9IHRydWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcm93ID0gMDsKKyAgICAgICAgICAgICAgY29sID0gMDsKKyAgICAgICAgICAgICAgaWYgKHRocm93RXhjZXB0aW9uKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBBZGRyZXNzIGZvcm1hdCB7MH0iLCBhZGRyZXNzKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcm93ICE9IDAgfHwgY29sICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0Q29sdW1uKHN0cmluZyBzQ29sKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29sID0gMDsKKyAgICAgICAgICAgIGludCBsZW4gPSBzQ29sLkxlbmd0aCAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbGVuOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2wgKz0gKCgoaW50KXNDb2xbaV0pIC0gNjQpICogKGludCkoTWF0aC5Qb3coMjYsIGxlbiAtIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb2w7CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBHZXRBZGRyZXNzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIEFscGhhTnVtZXJpYyByZXByZXNlbnRhdGlvbiB0aGF0IEV4Y2VsIGV4cGVjdHMgZm9yIGEgQ2VsbCBBZGRyZXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93Ij5UaGUgbnVtYmVyIG9mIHRoZSByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvbHVtbiI+VGhlIG51bWJlciBvZiB0aGUgY29sdW1uIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNlbGwgYWRkcmVzcyBpbiB0aGUgZm9ybWF0IEExPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBZGRyZXNzKGludCBSb3csIGludCBDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKFJvdywgQ29sdW1uLGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+VGhlIG51bWJlciBvZiB0aGUgcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPlRoZSBudW1iZXIgb2YgdGhlIGNvbHVtbiBpbiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJBYnNvbHV0ZVJvdyI+QWJzb2x1dGUgcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJBYnNvbHV0ZUNvbCI+QWJzb2x1dGUgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcyhpbnQgUm93LCBib29sIEFic29sdXRlUm93LCBpbnQgQ29sdW1uLCBib29sIEFic29sdXRlQ29sKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCBBYnNvbHV0ZUNvbCA/ICIkIiA6ICIiKSArIEdldENvbHVtbkxldHRlcihDb2x1bW4pICsgKCBBYnNvbHV0ZVJvdyA/ICIkIiA6ICIiKSArIFJvdy5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIEFscGhhTnVtZXJpYyByZXByZXNlbnRhdGlvbiB0aGF0IEV4Y2VsIGV4cGVjdHMgZm9yIGEgQ2VsbCBBZGRyZXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93Ij5UaGUgbnVtYmVyIG9mIHRoZSByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvbHVtbiI+VGhlIG51bWJlciBvZiB0aGUgY29sdW1uIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFic29sdXRlIj5HZXQgYW4gYWJzb2x1dGUgYWRkcmVzcyAoJEEkMSk8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNlbGwgYWRkcmVzcyBpbiB0aGUgZm9ybWF0IEExPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBZGRyZXNzKGludCBSb3csIGludCBDb2x1bW4sIGJvb2wgQWJzb2x1dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSb3cgPT0gMCB8fCBDb2x1bW4gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChBYnNvbHV0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCIkIiArIEdldENvbHVtbkxldHRlcihDb2x1bW4pICsgIiQiICsgUm93LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoR2V0Q29sdW1uTGV0dGVyKENvbHVtbikgKyBSb3cuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgQWxwaGFOdW1lcmljIHJlcHJlc2VudGF0aW9uIHRoYXQgRXhjZWwgZXhwZWN0cyBmb3IgYSBDZWxsIEFkZHJlc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tUm93Ij5Gcm9tIHJvdyBudW1iZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Db2x1bW4iPkZyb20gY29sdW1uIG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVG9Sb3ciPlRvIHJvdyBudW1iZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlRvQ29sdW1uIj5Gcm9tIGNvbHVtbiBudW1iZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNlbGwgYWRkcmVzcyBpbiB0aGUgZm9ybWF0IEExPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBZGRyZXNzKGludCBGcm9tUm93LCBpbnQgRnJvbUNvbHVtbiwgaW50IFRvUm93LCBpbnQgVG9Db2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKEZyb21Sb3csIEZyb21Db2x1bW4sIFRvUm93LCBUb0NvbHVtbiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIEFscGhhTnVtZXJpYyByZXByZXNlbnRhdGlvbiB0aGF0IEV4Y2VsIGV4cGVjdHMgZm9yIGEgQ2VsbCBBZGRyZXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRnJvbVJvdyI+RnJvbSByb3cgbnVtYmVyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tQ29sdW1uIj5Gcm9tIGNvbHVtbiBudW1iZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlRvUm93Ij5UbyByb3cgbnVtYmVyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb0NvbHVtbiI+RnJvbSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJBYnNvbHV0ZSI+aWYgdHJ1ZSBhZGRyZXNzIGlzIGFic29sdXRlIChsaWtlICRBJDEpPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcyhpbnQgRnJvbVJvdywgaW50IEZyb21Db2x1bW4sIGludCBUb1JvdywgaW50IFRvQ29sdW1uLCBib29sIEFic29sdXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRnJvbVJvdyA9PSBUb1JvdyAmJiBGcm9tQ29sdW1uID09IFRvQ29sdW1uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKEZyb21Sb3csIEZyb21Db2x1bW4sIEFic29sdXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRnJvbVJvdyA9PSAxICYmIFRvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFic0NoYXIgPSBBYnNvbHV0ZSA/ICIkIiA6ICIiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJzQ2hhciArIEdldENvbHVtbkxldHRlcihGcm9tQ29sdW1uKSArICI6IiArIGFic0NoYXIgKyBHZXRDb2x1bW5MZXR0ZXIoVG9Db2x1bW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKEZyb21Db2x1bW49PTEgJiYgVG9Db2x1bW49PUV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFic0NoYXIgPSBBYnNvbHV0ZSA/ICIkIiA6ICIiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJzQ2hhciArIEZyb21Sb3cuVG9TdHJpbmcoKSArICI6IiArIGFic0NoYXIgKyBUb1Jvdy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhGcm9tUm93LCBGcm9tQ29sdW1uLCBBYnNvbHV0ZSkgKyAiOiIgKyBHZXRBZGRyZXNzKFRvUm93LCBUb0NvbHVtbiwgQWJzb2x1dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Sb3ciPkZyb20gcm93IG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRnJvbUNvbHVtbiI+RnJvbSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb1JvdyI+VG8gcm93IG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVG9Db2x1bW4iPkZyb20gY29sdW1uIG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRml4ZWRGcm9tQ29sdW1uIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZpeGVkRnJvbVJvdyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGaXhlZFRvQ29sdW1uIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZpeGVkVG9Sb3ciPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2VsbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgQTE8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3MoaW50IEZyb21Sb3csIGludCBGcm9tQ29sdW1uLCBpbnQgVG9Sb3csIGludCBUb0NvbHVtbiwgYm9vbCBGaXhlZEZyb21Sb3csIGJvb2wgRml4ZWRGcm9tQ29sdW1uLCBib29sIEZpeGVkVG9Sb3csIGJvb2wgIEZpeGVkVG9Db2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChGcm9tUm93ID09IFRvUm93ICYmIEZyb21Db2x1bW4gPT0gVG9Db2x1bW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldEFkZHJlc3MoRnJvbVJvdywgRml4ZWRGcm9tUm93LCBGcm9tQ29sdW1uLCBGaXhlZEZyb21Db2x1bW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChGcm9tUm93ID09IDEgJiYgVG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q29sdW1uTGV0dGVyKEZyb21Db2x1bW4sIEZpeGVkRnJvbUNvbHVtbikgKyAiOiIgKyBHZXRDb2x1bW5MZXR0ZXIoVG9Db2x1bW4sIEZpeGVkVG9Db2x1bW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChGcm9tQ29sdW1uID09IDEgJiYgVG9Db2x1bW4gPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRml4ZWRGcm9tUm93ID8gIiQiOiIiKSArIEZyb21Sb3cuVG9TdHJpbmcoKSArICI6IiArIChGaXhlZFRvUm93ID8gIiQiOiIiKSArIFRvUm93LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKEZyb21Sb3csIEZpeGVkRnJvbVJvdywgRnJvbUNvbHVtbiwgRml4ZWRGcm9tQ29sdW1uKSArICI6IiArIEdldEFkZHJlc3MoVG9Sb3csIEZpeGVkVG9Sb3csIFRvQ29sdW1uLCBGaXhlZFRvQ29sdW1uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IHRoZSBmdWxsIGFkZHJlc3MgaW5jbHVkaW5nIHRoZSB3b3Jrc2hlZXQgbmFtZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldE5hbWUiPlRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBmdWxsIGFkZHJlc3M8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEZ1bGxBZGRyZXNzKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldEZ1bGxBZGRyZXNzKHdvcmtzaGVldE5hbWUsIGFkZHJlc3MsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0RnVsbEFkZHJlc3Moc3RyaW5nIHdvcmtzaGVldE5hbWUsIHN0cmluZyBhZGRyZXNzLCBib29sIGZ1bGxSb3dDb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLkluZGV4T2YoIiEiKSA9PSAtMSB8fCBhZGRyZXNzPT0iI1JFRiEiKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUm93Q29sKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nW10gY2VsbHMgPSBhZGRyZXNzLlNwbGl0KCc6Jyk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxscy5MZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gc3RyaW5nLkZvcm1hdCgiJ3swfSchezF9Iiwgd29ya3NoZWV0TmFtZSwgY2VsbHNbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxzLkxlbmd0aCA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyArPSBzdHJpbmcuRm9ybWF0KCI6ezB9IiwgY2VsbHNbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYS5fZnJvbVJvdyA9PSAxICYmIGEuX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSB8fCAoYS5fZnJvbUNvbCA9PSAxICYmIGEuX3RvQ29sID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSkKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHN0cmluZy5Gb3JtYXQoIid7MH0nIXsxfXsyfTp7M317NH0iLCB3b3Jrc2hlZXROYW1lLCBFeGNlbEFkZHJlc3MuR2V0Q29sdW1uTGV0dGVyKGEuX2Zyb21Db2wpLCBhLl9mcm9tUm93LCBFeGNlbEFkZHJlc3MuR2V0Q29sdW1uTGV0dGVyKGEuX3RvQ29sKSwgYS5fdG9Sb3cpOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcz1HZXRGdWxsQWRkcmVzcyh3b3Jrc2hlZXROYW1lLCBhZGRyZXNzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiBJc1ZhbGlkQ2VsbEFkZHJlc3MKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzVmFsaWRBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgc3RyaW5nIHIxID0gIiIsIGMxID0gIiIsIHIyID0gIiIsIGMyID0gIiI7CisgICAgICAgICAgICBib29sIGlzU2Vjb25kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHJlc3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NbaV0gPj0gJ0EnICYmIGFkZHJlc3NbaV0gPD0gJ1onKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2Vjb25kID09IGZhbHNlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjEgIT0gIiIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMxICs9IGFkZHJlc3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYzEuTGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyICE9ICIiKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjMiArPSBhZGRyZXNzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMyLkxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzW2ldID49ICcwJyAmJiBhZGRyZXNzW2ldIDw9ICc5JykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NlY29uZCA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcjEgKz0gYWRkcmVzc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMS5MZW5ndGggPiA3KSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByMiArPSBhZGRyZXNzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLkxlbmd0aCA+IDcpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzW2ldID09ICc6JykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlzU2Vjb25kPXRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NbaV0gPT0gJyQnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gYWRkcmVzcy5MZW5ndGggLSAxIHx8IGFkZHJlc3NbaSArIDFdID09ICc6JykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyMSE9IiIgJiYgYzEhPSIiICYmIHIyID09ICIiICYmIGMyID09ICIiKSAgIC8vU2luZ2xlIENlbGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEdldENvbHVtbihjMSk8PUV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zICYmIGludC5QYXJzZShyMSk8PUV4Y2VsUGFja2FnZS5NYXhSb3dzKTsgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHIxICE9ICIiICYmIHIyICE9ICIiICYmIGMxICE9ICIiICYmIGMyICE9ICIiKSAvL1JhbmdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlSMiA9IGludC5QYXJzZShyMik7CisgICAgICAgICAgICAgICAgdmFyIGlDMiA9IEdldENvbHVtbihjMik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q29sdW1uKGMxKSA8PSBpQzIgJiYgaW50LlBhcnNlKHIxKSA8PSBpUjIgJiYKKyAgICAgICAgICAgICAgICAgICAgaUMyIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zICYmIGlSMiA8PSBFeGNlbFBhY2thZ2UuTWF4Um93czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHIxID09ICIiICYmIHIyID09ICIiICYmIGMxICE9ICIiICYmIGMyICE9ICIiKSAvL0Z1bGwgQ29sdW1uCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjMm49R2V0Q29sdW1uKGMyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEdldENvbHVtbihjMSkgPD0gYzJuICYmIGMybiA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChyMSAhPSAiIiAmJiByMiAhPSAiIiAmJiBjMSA9PSAiIiAmJiBjMiA9PSAiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaVIyID0gaW50LlBhcnNlKHIyKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBpbnQuUGFyc2UocjEpIDw9IGlSMiAmJiBpUjIgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrcyB0aGF0IGEgY2VsbCBhZGRyZXNzIChlLmcuIEE1KSBpcyB2YWxpZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZWxsQWRkcmVzcyI+VGhlIGFscGhhbnVtZXJpYyBjZWxsIGFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VHJ1ZSBpZiB0aGUgY2VsbCBhZGRyZXNzIGlzIHZhbGlkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNWYWxpZENlbGxBZGRyZXNzKHN0cmluZyBjZWxsQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByb3csIGNvbDsKKyAgICAgICAgICAgICAgICBpZiAoR2V0Um93Q29sRnJvbUFkZHJlc3MoY2VsbEFkZHJlc3MsIG91dCByb3csIG91dCBjb2wpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA+IDAgJiYgY29sID4gMCAmJiByb3cgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgY29sIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggeyB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlcworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBFeGNlbCBmb3JtdWxhIHNvIHRoYXQgYWxsIHRoZSBjZWxsQWRkcmVzc2VzIGFyZSBpbmNyZW1lbnRlZCBieSB0aGUgcm93IGFuZCBjb2x1bW4gaW5jcmVtZW50cworICAgICAgICAvLy8gaWYgdGhleSBmYWxsIGFmdGVyIHRoZSBhZnRlclJvdyBhbmQgYWZ0ZXJDb2x1bW4uCisgICAgICAgIC8vLyBTdXBwb3J0cyBpbnNlcnRpbmcgcm93cyBhbmQgY29sdW1ucyBpbnRvIGV4aXN0aW5nIHRlbXBsYXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGb3JtdWxhIj5UaGUgRXhjZWwgZm9ybXVsYTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93SW5jcmVtZW50Ij5UaGUgYW1vdW50IHRvIGluY3JlbWVudCB0aGUgY2VsbCByZWZlcmVuY2UgYnk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbEluY3JlbWVudCI+VGhlIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGNlbGwgcmVmZXJlbmNlIGJ5PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZnRlclJvdyI+T25seSBjaGFuZ2Ugcm93cyBhZnRlciB0aGlzIHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWZ0ZXJDb2x1bW4iPk9ubHkgY2hhbmdlIGNvbHVtbnMgYWZ0ZXIgdGhpcyBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIFVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKHN0cmluZyBGb3JtdWxhLCBpbnQgcm93SW5jcmVtZW50LCBpbnQgY29sSW5jcmVtZW50LCBpbnQgYWZ0ZXJSb3csIGludCBhZnRlckNvbHVtbiwgYm9vbCBzZXRGaXhlZD1mYWxzZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9yZXR1cm4gVHJhbnNsYXRlKEZvcm11bGEsIEFkZFRvUm93Q29sdW1uVHJhbnNsYXRvciwgYWZ0ZXJSb3csIGFmdGVyQ29sdW1uLCByb3dJbmNyZW1lbnQsIGNvbEluY3JlbWVudCk7CisgICAgICAgICAgICB2YXIgZD1uZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzY3QgPSBuZXcgU291cmNlQ29kZVRva2VuaXplcihGdW5jdGlvbk5hbWVQcm92aWRlci5FbXB0eSwgTmFtZVZhbHVlUHJvdmlkZXIuRW1wdHkpOworICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBzY3QuVG9rZW5pemUoRm9ybXVsYSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGYgPSAiIjsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0b2tlbnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZSh0LlZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dJbmNyZW1lbnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLkFkZFJvdyhhZnRlclJvdywgcm93SW5jcmVtZW50LCBzZXRGaXhlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyb3dJbmNyZW1lbnQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLkRlbGV0ZVJvdyhhZnRlclJvdywgLXJvd0luY3JlbWVudCwgc2V0Rml4ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbEluY3JlbWVudCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEuQWRkQ29sdW1uKGFmdGVyQ29sdW1uLCBjb2xJbmNyZW1lbnQsIHNldEZpeGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbEluY3JlbWVudCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEuRGVsZXRlQ29sdW1uKGFmdGVyQ29sdW1uLCAtY29sSW5jcmVtZW50LCBzZXRGaXhlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsIHx8ICFhLklzVmFsaWRSb3dDb2woKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICs9ICIjUkVGISI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiArPSBhLkFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZiArPSB0LlZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggLy9JbnZhbGlkIGZvcm11bGEsIHNraXAgdXBkYXRlaW5nIGFkZHJlc3NlcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb3JtdWxhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxDb2x1bW4uY3MgYi9FUFBsdXMvRXhjZWxDb2x1bW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNmNlZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbENvbHVtbi5jcwpAQCAtMCwwICsxLDM2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBL5GxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKwkvLy8gUmVwcmVzZW50cyBvbmUgb3IgbW9yZSBjb2x1bW5zIHdpdGhpbiB0aGUgd29ya3NoZWV0CisJLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgRXhjZWxDb2x1bW4gOiBJUmFuZ2VJRAorCXsKKwkJcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCQlwcml2YXRlIFhtbEVsZW1lbnQgX2NvbEVsZW1lbnQgPSBudWxsOworCisJCSNyZWdpb24gRXhjZWxDb2x1bW4gQ29uc3RydWN0b3IKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxDb2x1bW4gY2xhc3MuICAKKwkJLy8vIEZvciBpbnRlcm5hbCB1c2Ugb25seSEKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJXb3Jrc2hlZXQiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorCQlwcm90ZWN0ZWQgaW50ZXJuYWwgRXhjZWxDb2x1bW4oRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0gV29ya3NoZWV0OworICAgICAgICAgICAgX2NvbHVtbk1pbiA9IGNvbDsKKyAgICAgICAgICAgIF9jb2x1bW5NYXggPSBjb2w7CisgICAgICAgICAgICBfd2lkdGggPSBfd29ya3NoZWV0LkRlZmF1bHRDb2xXaWR0aDsKKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIGludCBfY29sdW1uTWluOwkJCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFNldHMgdGhlIGZpcnN0IGNvbHVtbiB0aGUgZGVmaW5pdGlvbiByZWZlcnMgdG8uCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBpbnQgQ29sdW1uTWluIAorCQl7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvbHVtbk1pbjsgfQorCQkJLy9zZXQgeyBfY29sdW1uTWluPXZhbHVlOyB9IAorCQl9CisKKyAgICAgICAgaW50ZXJuYWwgaW50IF9jb2x1bW5NYXg7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKwkJLy8vIFNldHMgdGhlIGxhc3QgY29sdW1uIHRoZSBkZWZpbml0aW9uIHJlZmVycyB0by4KKwkJLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb2x1bW5NYXggCisJCXsgCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvbHVtbk1heDsgfQorCQkJc2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IF9jb2x1bW5NaW4gJiYgdmFsdWUgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbk1heCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3dvcmtzaGVldC5fdmFsdWVzLCAwLCAwLCAwLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICAgICAgd2hpbGUoY3NlLk5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjID0gY3NlLlZhbHVlIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAgICAgICAgICAgICBpZiAoY3NlLkNvbHVtbiA+IF9jb2x1bW5NaW4gJiYgYy5Db2x1bW5NYXggPD0gdmFsdWUgJiYgY3NlLkNvbHVtbiE9X2NvbHVtbk1pbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJDb2x1bW5NYXggY2FuIG5vdCBzcGFuIG92ZXIgZXhpc3RpbmcgY29sdW1uIHswfS4iLGMuQ29sdW1uTWluKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2NvbHVtbk1heCA9IHZhbHVlOyAKKyAgICAgICAgICAgIH0gCisJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZXJuYWwgcmFuZ2UgaWQgZm9yIHRoZSBjb2x1bW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgdWxvbmcgQ29sdW1uSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsQ29sdW1uLkdldENvbHVtbklEKF93b3Jrc2hlZXQuU2hlZXRJRCwgQ29sdW1uTWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkjcmVnaW9uIEV4Y2VsQ29sdW1uIEhpZGRlbgorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBBbGxvd3MgdGhlIGNvbHVtbiB0byBiZSBoaWRkZW4gaW4gdGhlIHdvcmtzaGVldAorCQkvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBib29sIF9oaWRkZW49ZmFsc2U7CisgICAgICAgIHB1YmxpYyBib29sIEhpZGRlbgorCQl7CisJCQlnZXQKKwkJCXsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2hpZGRlbjsKKwkJCX0KKwkJCXNldAorCQkJeworICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gX3dvcmtzaGVldC5EcmF3aW5ncy5HZXREcmF3aW5nV2lkdGhzKCk7CisgICAgICAgICAgICAgICAgICAgIF9oaWRkZW4gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5EcmF3aW5ncy5BZGp1c3RXaWR0aChwb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaGlkZGVuID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorCQkJfQorCQl9CisJCSNlbmRyZWdpb24KKworCQkjcmVnaW9uIEV4Y2VsQ29sdW1uIFdpZHRoCisgICAgICAgIGludGVybmFsIGRvdWJsZSBWaXN1YWxXaWR0aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2hpZGRlbiB8fCAoQ29sbGFwc2VkICYmIE91dGxpbmVMZXZlbD4wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBkb3VibGUgX3dpZHRoOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGluIHRoZSB3b3Jrc2hlZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBXaWR0aAorCQl7CisJCQlnZXQKKwkJCXsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dpZHRoOworCQkJfQorCQkJc2V0CQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gX3dvcmtzaGVldC5EcmF3aW5ncy5HZXREcmF3aW5nV2lkdGhzKCk7CisgICAgICAgICAgICAgICAgICAgIF93aWR0aCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkRyYXdpbmdzLkFkanVzdFdpZHRoKHBvcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF93aWR0aCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfaGlkZGVuICYmIHZhbHVlIT0wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2hpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiBzZXQgdG8gdHJ1ZSBhIGNvbHVtbiBhdXRvbWF0aWNsbHkgcmVzaXplKGdyb3cgd2lkZXIpIHdoZW4gYSB1c2VyIGlucHV0cyBudW1iZXJzIGluIGEgY2VsbC4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEJlc3RGaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBjb2x1bW4gaXMgY29sbGFwc2VkIGluIG91dGxpbmUgbW9kZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBDb2xsYXBzZWQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPdXRsaW5lIGxldmVsLiBaZXJvIGlmIG5vIG91dGxpbmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBPdXRsaW5lTGV2ZWwgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQaG9uZXRpYworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQaG9uZXRpYyB7IGdldDsgc2V0OyB9CisgICAgICAgICNlbmRyZWdpb24KKworCQkjcmVnaW9uIEV4Y2VsQ29sdW1uIFN0eWxlCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTdHlsZSBhcHBsaWVkIHRvIHRoZSB3aG9sZSBjb2x1bW4uIE9ubHkgZWZmZWN0cyBjZWxscyB3aXRoIG5vIGluZGl2aWR1YWwgc3R5bGUgc2V0LiAKKyAgICAgICAgLy8vIFVzZSBSYW5nZSBvYmplY3QgaWYgeW91IHdhbnQgdG8gc2V0IHNwZWNpZmljIHN0eWxlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsU3R5bGUgU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGxldHRlciA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q29sdW1uTGV0dGVyKENvbHVtbk1pbik7CisgICAgICAgICAgICAgICAgc3RyaW5nIGVuZExldHRlciA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q29sdW1uTGV0dGVyKENvbHVtbk1heCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzLkdldFN0eWxlT2JqZWN0KFN0eWxlSUQsIF93b3Jrc2hlZXQuUG9zaXRpb25JRCwgbGV0dGVyICsgIjoiICsgZW5kTGV0dGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX3N0eWxlTmFtZT0iIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorCQkvLy8gU2V0cyB0aGUgc3R5bGUgZm9yIHRoZSBlbnRpcmUgY29sdW1uIHVzaW5nIGEgc3R5bGUgbmFtZS4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBTdHlsZU5hbWUKKwkJeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHlsZUlEID0gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVJZEZyb21OYW1lKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBfc3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgLy9pbnRlcm5hbCBpbnQgX3N0eWxlSUQgPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBjb2x1bW4gdXNpbmcgdGhlIHN0eWxlIElELiAgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgU3R5bGVJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKDAsIENvbHVtbk1pbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUoMCwgQ29sdW1uTWluLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIG1hbnVhbCBwYWdlIGJyZWFrIGFmdGVyIHRoZSBjb2x1bW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFBhZ2VCcmVhaworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgTWVyZ2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0Lk1lcmdlZENlbGxzW0NvbHVtbk1pbiwgMF0gIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG5ldyBFeGNlbEFkZHJlc3NCYXNlKDEsIENvbHVtbk1pbiwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIENvbHVtbk1heCksIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBSZXR1cm5zIHRoZSByYW5nZSBvZiBjb2x1bW5zIGNvdmVyZWQgYnkgdGhlIGNvbHVtbiBkZWZpbml0aW9uLgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHJldHVybnM+QSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmFuZ2Ugb2YgY29sdW1ucyBjb3ZlcmVkIGJ5IHRoZSBjb2x1bW4gZGVmaW5pdGlvbi48L3JldHVybnM+CisJCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorCQl7CisJCQlyZXR1cm4gc3RyaW5nLkZvcm1hdCgiQ29sdW1uIFJhbmdlOiB7MH0gdG8gezF9IiwgX2NvbEVsZW1lbnQuR2V0QXR0cmlidXRlKCJtaW4iKSwgX2NvbEVsZW1lbnQuR2V0QXR0cmlidXRlKCJtaW4iKSk7CisJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0IHRoZSBjb2x1bW4gd2lkdGggZnJvbSB0aGUgY29udGVudCBvZiB0aGUgcmFuZ2UuIFRoZSBtaW5pbXVtIHdpZHRoIGlzIHRoZSB2YWx1ZSBvZiB0aGUgRXhjZWxXb3Jrc2hlZXQuZGVmYXVsdENvbHVtbldpZHRoIHByb3BlcnR5LgorICAgICAgICAvLy8gTm90ZTogQ2VsbHMgY29udGFpbmluZyBmb3JtdWxhcyBhcmUgaWdub3JlZCBzaW5jZSBFUFBsdXMgZG9uJ3QgaGF2ZSBhIGNhbGN1bGF0aW9uIGVuZ2luZS4KKyAgICAgICAgLy8vICAgICAgIFdyYXBwZWQgYW5kIG1lcmdlZCBjZWxscyBhcmUgYWxzbyBpZ25vcmVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBBdXRvRml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1sxLCBfY29sdW1uTWluLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgX2NvbHVtbk1heF0uQXV0b0ZpdENvbHVtbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQuCisgICAgICAgIC8vLyBOb3RlOiBDZWxscyBjb250YWluaW5nIGZvcm11bGFzIGFyZSBpZ25vcmVkIHNpbmNlIEVQUGx1cyBkb24ndCBoYXZlIGEgY2FsY3VsYXRpb24gZW5naW5lLgorICAgICAgICAvLy8gICAgICAgV3JhcHBlZCBhbmQgbWVyZ2VkIGNlbGxzIGFyZSBhbHNvIGlnbm9yZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEF1dG9GaXQoZG91YmxlIE1pbmltdW1XaWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1sxLCBfY29sdW1uTWluLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgX2NvbHVtbk1heF0uQXV0b0ZpdENvbHVtbnMoTWluaW11bVdpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQuCisgICAgICAgIC8vLyBOb3RlOiBDZWxscyBjb250YWluaW5nIGZvcm11bGFzIGFyZSBpZ25vcmVkIHNpbmNlIEVQUGx1cyBkb24ndCBoYXZlIGEgY2FsY3VsYXRpb24gZW5naW5lLgorICAgICAgICAvLy8gICAgICAgV3JhcHBlZCBhbmQgbWVyZ2VkIGNlbGxzIGFyZSBhbHNvIGlnbm9yZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTWF4aW11bVdpZHRoIj5NYXhpbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEF1dG9GaXQoZG91YmxlIE1pbmltdW1XaWR0aCwgZG91YmxlIE1heGltdW1XaWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1sxLCBfY29sdW1uTWluLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgX2NvbHVtbk1heF0uQXV0b0ZpdENvbHVtbnMoTWluaW11bVdpZHRoLCBNYXhpbXVtV2lkdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IHRoZSBpbnRlcm5hbCBSYW5nZUlECisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXRJRCI+U2hlZXQgbm88L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+Q29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldENvbHVtbklEKGludCBzaGVldElELCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCh1bG9uZylzaGVldElEKSArICgoKHVsb25nKWNvbHVtbikgPDwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBJUmFuZ2VJRCBNZW1iZXJzCisKKyAgICAgICAgdWxvbmcgSVJhbmdlSUQuUmFuZ2VJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sdW1uSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJldkNvbE1pbiA9IF9jb2x1bW5NaW47CisgICAgICAgICAgICAgICAgX2NvbHVtbk1pbiA9ICgoaW50KSh2YWx1ZSA+PiAxNSkgJiAweDNGRik7CisgICAgICAgICAgICAgICAgX2NvbHVtbk1heCArPSBwcmV2Q29sTWluIC0gQ29sdW1uTWluOworICAgICAgICAgICAgICAgIC8vVG9kbzpNb3JlIFZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICBpZiAoX2NvbHVtbk1heCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSBfY29sdW1uTWF4ID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29waWVzIHRoZSBjdXJyZW50IGNvbHVtbiB0byBhIG5ldyB3b3Jrc2hlZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRlZCI+VGhlIHdvcmtzaGVldCB3aGVyZSB0aGUgY29weSB3aWxsIGJlIGNyZWF0ZWQ8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbENvbHVtbiBDbG9uZShFeGNlbFdvcmtzaGVldCBhZGRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENsb25lKGFkZGVkLCBDb2x1bW5NaW4pOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sdW1uIENsb25lKEV4Y2VsV29ya3NoZWV0IGFkZGVkLCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbENvbHVtbiBuZXdDb2wgPSBhZGRlZC5Db2x1bW4oY29sKTsKKyAgICAgICAgICAgICAgICBuZXdDb2wuQ29sdW1uTWF4ID0gQ29sdW1uTWF4OworICAgICAgICAgICAgICAgIG5ld0NvbC5CZXN0Rml0ID0gQmVzdEZpdDsKKyAgICAgICAgICAgICAgICBuZXdDb2wuQ29sbGFwc2VkID0gQ29sbGFwc2VkOworICAgICAgICAgICAgICAgIG5ld0NvbC5PdXRsaW5lTGV2ZWwgPSBPdXRsaW5lTGV2ZWw7CisgICAgICAgICAgICAgICAgbmV3Q29sLlBhZ2VCcmVhayA9IFBhZ2VCcmVhazsKKyAgICAgICAgICAgICAgICBuZXdDb2wuUGhvbmV0aWMgPSBQaG9uZXRpYzsKKyAgICAgICAgICAgICAgICBuZXdDb2wuX3N0eWxlTmFtZSA9IF9zdHlsZU5hbWU7CisgICAgICAgICAgICAgICAgbmV3Q29sLlN0eWxlSUQgPSBTdHlsZUlEOworICAgICAgICAgICAgICAgIG5ld0NvbC5XaWR0aCA9IFdpZHRoOworICAgICAgICAgICAgICAgIG5ld0NvbC5IaWRkZW4gPSBIaWRkZW47CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbENvbW1lbnQuY3MgYi9FUFBsdXMvRXhjZWxDb21tZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWU3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxDb21tZW50LmNzCkBAIC0wLDAgKzEsMTUxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgIAorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIEV4Y2VsIENlbGwgQ29tbWVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQ29tbWVudCA6IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQKKyAgICB7CisgICAgICAgIGludGVybmFsIFhtbEhlbHBlciBfY29tbWVudEhlbHBlcjsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX3RleHQ7CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29tbWVudChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIGNvbW1lbnRUb3BOb2RlLCBFeGNlbFJhbmdlQmFzZSBjZWxsKQorICAgICAgICAgICAgOiBiYXNlKG51bGwsIGNlbGwsIGNlbGwuV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHMuTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy9fY29tbWVudEhlbHBlciA9IG5ldyBYbWxIZWxwZXIobnMsIGNvbW1lbnRUb3BOb2RlKTsKKyAgICAgICAgICAgIF9jb21tZW50SGVscGVyID0gWG1sSGVscGVyRmFjdG9yeS5DcmVhdGUobnMsIGNvbW1lbnRUb3BOb2RlKTsKKyAgICAgICAgICAgIHZhciB0ZXh0RWxlbT1jb21tZW50VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnRleHQiLCBucyk7CisgICAgICAgICAgICBpZiAodGV4dEVsZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXh0RWxlbSA9IGNvbW1lbnRUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgidGV4dCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBjb21tZW50VG9wTm9kZS5BcHBlbmRDaGlsZCh0ZXh0RWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNlbGwuV29ya3NoZWV0Ll92bWxEcmF3aW5ncy5Db250YWluc0tleShFeGNlbEFkZHJlc3MuR2V0Q2VsbElEKGNlbGwuV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuU3RhcnQuUm93LCBjZWxsLlN0YXJ0LkNvbHVtbikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlbGwuV29ya3NoZWV0Ll92bWxEcmF3aW5ncy5BZGQoY2VsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRvcE5vZGUgPSBjZWxsLldvcmtzaGVldC5WbWxEcmF3aW5nc0NvbW1lbnRzW0V4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKGNlbGwuV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuU3RhcnQuUm93LCBjZWxsLlN0YXJ0LkNvbHVtbildLlRvcE5vZGU7CisgICAgICAgICAgICBSaWNoVGV4dCA9IG5ldyBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbihucyx0ZXh0RWxlbSk7CisgICAgICAgICAgICB2YXIgdE5vZGUgPSB0ZXh0RWxlbS5TZWxlY3RTaW5nbGVOb2RlKCJkOnQiLCBucyk7CisgICAgICAgICAgICBpZiAodE5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdGV4dCA9IHROb2RlLklubmVyVGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgQVVUSE9SU19QQVRIID0gImQ6Y29tbWVudHMvZDphdXRob3JzIjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIEFVVEhPUl9QQVRIID0gImQ6Y29tbWVudHMvZDphdXRob3JzL2Q6YXV0aG9yIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQXV0aG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQXV0aG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhdXRob3JSZWYgPSBfY29tbWVudEhlbHBlci5HZXRYbWxOb2RlSW50KCJAYXV0aG9ySWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5Pd25lckRvY3VtZW50LlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9W3sxfV0iLCBBVVRIT1JfUEFUSCwgYXV0aG9yUmVmKzEpLCBfY29tbWVudEhlbHBlci5OYW1lU3BhY2VNYW5hZ2VyKS5Jbm5lclRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYXV0aG9yUmVmID0gR2V0QXV0aG9yKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBfY29tbWVudEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJAYXV0aG9ySWQiLCBhdXRob3JSZWYuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0QXV0aG9yKHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGF1dGhvclJlZiA9IDA7CisgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IG5vZGUgaW4gX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5Pd25lckRvY3VtZW50LlNlbGVjdE5vZGVzKEFVVEhPUl9QQVRILCBfY29tbWVudEhlbHBlci5OYW1lU3BhY2VNYW5hZ2VyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5Jbm5lclRleHQgPT0gdmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdXRob3JSZWYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBfY29tbWVudEhlbHBlci5Ub3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiZCIsICJhdXRob3IiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5Pd25lckRvY3VtZW50LlNlbGVjdFNpbmdsZU5vZGUoQVVUSE9SU19QQVRILCBfY29tbWVudEhlbHBlci5OYW1lU3BhY2VNYW5hZ2VyKS5BcHBlbmRDaGlsZChlbGVtKTsKKyAgICAgICAgICAgICAgICBlbGVtLklubmVyVGV4dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGF1dGhvclJlZjsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29tbWVudCB0ZXh0IAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFRleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIXN0cmluZy5Jc051bGxPckVtcHR5KFJpY2hUZXh0LlRleHQpKSByZXR1cm4gUmljaFRleHQuVGV4dDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSaWNoVGV4dC5UZXh0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyB0aGUgZm9udCBvZiB0aGUgZmlyc3QgcmljaHRleHQgaXRlbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsUmljaFRleHQgRm9udAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoUmljaFRleHQuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJpY2hUZXh0WzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSaWNodGV4dCBjb2xsZWN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBSaWNoVGV4dCAKKyAgICAgICAgeyAKKyAgICAgICAgICAgZ2V0OyAKKyAgICAgICAgICAgc2V0OyAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbENvbW1lbnRDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL0V4Y2VsQ29tbWVudENvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5NzY1MwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbENvbW1lbnRDb2xsZWN0aW9uLmNzCkBAIC0wLDAgKzEsMjM4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ29sbGVjdGlvbiBvZiBFeGNlbGNvbW1lbnQgb2JqZWN0cworICAgIC8vLyA8L3N1bW1hcnk+ICAKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxDb21tZW50Q29sbGVjdGlvbiA6IElFbnVtZXJhYmxlLCBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgUmFuZ2VDb2xsZWN0aW9uIF9jb21tZW50czsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDb21tZW50Q29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgWG1sTmFtZXNwYWNlTWFuYWdlciBucykKKyAgICAgICAgeworICAgICAgICAgICAgQ29tbWVudFhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgQ29tbWVudFhtbC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXI9bnM7CisgICAgICAgICAgICBXb3Jrc2hlZXQ9d3M7CisgICAgICAgICAgICBDcmVhdGVYbWwocGNrKTsKKyAgICAgICAgICAgIEFkZENvbW1lbnRzRnJvbVhtbCgpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVYbWwoRXhjZWxQYWNrYWdlIHBjaykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbW1lbnRQYXJ0cyA9IFdvcmtzaGVldC5QYXJ0LkdldFJlbGF0aW9uc2hpcHNCeVR5cGUoRXhjZWxQYWNrYWdlLnNjaGVtYUNvbW1lbnQpOworICAgICAgICAgICAgYm9vbCBpc0xvYWRlZD1mYWxzZTsKKyAgICAgICAgICAgIENvbW1lbnRYbWw9bmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBmb3JlYWNoKHZhciBjb21tZW50UGFydCBpbiBjb21tZW50UGFydHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXJpID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKGNvbW1lbnRQYXJ0LlNvdXJjZVVyaSwgY29tbWVudFBhcnQuVGFyZ2V0VXJpKTsKKyAgICAgICAgICAgICAgICBQYXJ0ID0gcGNrLlBhY2thZ2UuR2V0UGFydChVcmkpOworICAgICAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZShDb21tZW50WG1sLCBQYXJ0LkdldFN0cmVhbSgpKTsgCisgICAgICAgICAgICAgICAgUmVsSWQgPSBjb21tZW50UGFydC5JZDsKKyAgICAgICAgICAgICAgICBpc0xvYWRlZD10cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9DcmVhdGUgYSBuZXcgZG9jdW1lbnQKKyAgICAgICAgICAgIGlmKCFpc0xvYWRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb21tZW50WG1sLkxvYWRYbWwoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PGNvbW1lbnRzIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCI+PGF1dGhvcnMgLz48Y29tbWVudExpc3QgLz48L2NvbW1lbnRzPiIpOworICAgICAgICAgICAgICAgIFVyaSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZENvbW1lbnRzRnJvbVhtbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsc3QgPSBuZXcgTGlzdDxJUmFuZ2VJRD4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbm9kZSBpbiBDb21tZW50WG1sLlNlbGVjdE5vZGVzKCIvL2Q6Y29tbWVudExpc3QvZDpjb21tZW50IiwgTmFtZVNwYWNlTWFuYWdlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgRXhjZWxDb21tZW50KE5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsIG5ldyBFeGNlbFJhbmdlQmFzZShXb3Jrc2hlZXQsIG5vZGUuR2V0QXR0cmlidXRlKCJyZWYiKSkpOworICAgICAgICAgICAgICAgIGxzdC5BZGQoY29tbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY29tbWVudHMgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKGxzdCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWNjZXNzIHRvIHRoZSBjb21tZW50IHhtbCBkb2N1bWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgQ29tbWVudFhtbCB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIFVyaSBVcmkgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUmVsSWQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgUGFydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIHdvcmtzaGVldCBvYmplY3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtYmVyIG9mIGNvbW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21tZW50cy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRleGVyIGZvciB0aGUgY29tbWVudHMgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5UaGUgaW5kZXg8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbW1lbnQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbW1lbnQgdGhpc1tpbnQgSW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDAgfHwgSW5kZXggPj0gX2NvbW1lbnRzLkNvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQ29tbWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfY29tbWVudHNbSW5kZXhdIGFzIEV4Y2VsQ29tbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRleGVyIGZvciB0aGUgY29tbWVudHMgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlbGwiPlRoZSBjZWxsPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjb21tZW50PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxDb21tZW50IHRoaXNbRXhjZWxDZWxsQWRkcmVzcyBjZWxsXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bG9uZyBjZWxsSUQ9RXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuUm93LCBjZWxsLkNvbHVtbik7CisgICAgICAgICAgICAgICAgaWYgKF9jb21tZW50cy5JbmRleE9mKGNlbGxJRCkgPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29tbWVudHNbY2VsbElEXSBhcyBFeGNlbENvbW1lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgY29tbWVudCB0byB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZWxsIj5UaGUgY2VsbDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVGV4dCI+VGhlIGNvbW1lbnQgdGV4dDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXV0aG9yIj5BdXRob3I8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbW1lbnQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbW1lbnQgQWRkKEV4Y2VsUmFuZ2VCYXNlIGNlbGwsIHN0cmluZyBUZXh0LCBzdHJpbmcgYXV0aG9yKQorICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgZWxlbSA9IENvbW1lbnRYbWwuQ3JlYXRlRWxlbWVudCgiY29tbWVudCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgIGludCBpeD1fY29tbWVudHMuSW5kZXhPZihFeGNlbEFkZHJlc3MuR2V0Q2VsbElEKFdvcmtzaGVldC5TaGVldElELCBjZWxsLl9mcm9tUm93LCBjZWxsLl9mcm9tQ29sKSk7CisgICAgICAgICAgICAvL01ha2Ugc3VyZSB0aGUgbm9kZXMgY29tZSBvbiBvcmRlci4KKyAgICAgICAgICAgIGlmIChpeCA8IDAgJiYgKH5peCA8IF9jb21tZW50cy5Db3VudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXggPSB+aXg7CisgICAgICAgICAgICAgICAgdmFyIHByZUNvbW1lbnQgPSBfY29tbWVudHNbaXhdIGFzIEV4Y2VsQ29tbWVudDsKKyAgICAgICAgICAgICAgICBwcmVDb21tZW50Ll9jb21tZW50SGVscGVyLlRvcE5vZGUuUGFyZW50Tm9kZS5JbnNlcnRCZWZvcmUoZWxlbSwgcHJlQ29tbWVudC5fY29tbWVudEhlbHBlci5Ub3BOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb21tZW50WG1sLlNlbGVjdFNpbmdsZU5vZGUoImQ6Y29tbWVudHMvZDpjb21tZW50TGlzdCIsIE5hbWVTcGFjZU1hbmFnZXIpLkFwcGVuZENoaWxkKGVsZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoInJlZiIsIGNlbGwuU3RhcnQuQWRkcmVzcyk7CisgICAgICAgICAgICBFeGNlbENvbW1lbnQgY29tbWVudCA9IG5ldyBFeGNlbENvbW1lbnQoTmFtZVNwYWNlTWFuYWdlciwgZWxlbSAsIGNlbGwpOworICAgICAgICAgICAgY29tbWVudC5SaWNoVGV4dC5BZGQoVGV4dCk7CisgICAgICAgICAgICBpZihhdXRob3IhPSIiKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21tZW50LkF1dGhvcj1hdXRob3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY29tbWVudHMuQWRkKGNvbW1lbnQpOworICAgICAgICAgICAgLy9DaGVjayBpZiBhIHZhbHVlIGV4aXN0cyBvdGhlcndpc2UgYWRkIG9uZSBzbyBpdCBpcyBzYXZlZCB3aGVuIHRoZSBjZWxscyBjb2xsZWN0aW9uIGlzIGl0ZXJhdGVkCisgICAgICAgICAgICBpZiAoIVdvcmtzaGVldC5fdmFsdWVzLkV4aXN0cyhjZWxsLl9mcm9tUm93LCBjZWxsLl9mcm9tQ29sKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXb3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShjZWxsLl9mcm9tUm93LCBjZWxsLl9mcm9tQ29sLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb21tZW50OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgdGhlIGNvbW1lbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb21tZW50Ij5UaGUgY29tbWVudCB0byByZW1vdmU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxDb21tZW50IGNvbW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVsb25nIGlkID0gRXhjZWxBZGRyZXNzLkdldENlbGxJRChXb3Jrc2hlZXQuU2hlZXRJRCwgY29tbWVudC5SYW5nZS5fZnJvbVJvdywgY29tbWVudC5SYW5nZS5fZnJvbUNvbCk7CisgICAgICAgICAgICBpbnQgaXg9X2NvbW1lbnRzLkluZGV4T2YoaWQpOworICAgICAgICAgICAgaWYgKGl4ID49IDAgJiYgY29tbWVudCA9PSBfY29tbWVudHNbaXhdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbW1lbnQuVG9wTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNvbW1lbnQuVG9wTm9kZSk7IC8vUmVtb3ZlIFZNTAorICAgICAgICAgICAgICAgIGNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZSk7IC8vUmVtb3ZlIENvbW1lbnQKKworICAgICAgICAgICAgICAgIFdvcmtzaGVldC5WbWxEcmF3aW5nc0NvbW1lbnRzLl9kcmF3aW5ncy5EZWxldGUoaWQpOworICAgICAgICAgICAgICAgIF9jb21tZW50cy5EZWxldGUoaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNvbW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzaGVldCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgSURpc3Bvc2FibGUuRGlzcG9zZSgpIAorICAgICAgICB7IAorICAgICAgICAgICAgaWYgKF9jb21tZW50cyAhPSBudWxsKSAKKyAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKV9jb21tZW50cykuRGlzcG9zZSgpOyAKKyAgICAgICAgfSAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgY29tbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPlRoZSBpbmRleDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVtb3ZlKHRoaXNbSW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jb21tZW50czsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKENvdW50PjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVtb3ZlQXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxFbmNyeXB0aW9uLmNzIGIvRVBQbHVzL0V4Y2VsRW5jcnlwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmRkYjUxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsRW5jcnlwdGlvbi5jcwpAQCAtMCwwICsxLDE3NSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBjbGFzcyBpcyBjcmVhdGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIE1TLU9GRkNSWVBUTyBQREYgZG9jdW1lbnRhdGlvbi4uLiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2MzMTMwNzEob2ZmaWNlLjEyKS5hc3B4CisgKiBEZWNyeXB5dGlvbiBsaWJyYXJ5IGZvciBPZmZpY2UgT3BlbiBYTUwgZmlsZXMoTHlxdWlkaXR5KSBhbmQgU21pbmtzIHZlcnkgbmljZSBleGFtcGxlIAorICogb24gIlJlYWRpbmcgY29tcG91bmQgZG9jdW1lbnRzIGluIGMjIiBvbiBTdGFja292ZXJmbG93LiBNYW55IHRoYW5rcyEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTEwLUFVRy0yMDEwCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEVuY3J5cHRpb24gQWxnb3JpdGhtCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFbmNyeXB0aW9uQWxnb3JpdGhtCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAxMjgtYml0IEFFUy4gRGVmYXVsdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBRVMxMjgsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIDE5Mi1iaXQgQUVTLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBRVMxOTIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIDI1Ni1iaXQgQUVTLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQUVTMjU2CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIEVuY3J5cHRpb24gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFbmNyeXB0aW9uVmVyc2lvbgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RhbmRhcmQgRW5jcnlwdGlvbi4KKyAgICAgICAgLy8vIFVzZWQgaW4gRXhjZWwgMjAwNyBhbmQgcHJldmlvdXMgdmVyc2lvbiB3aXRoIGNvbXBhdGliaWxpdHkgcGFjay4KKyAgICAgICAgLy8vIDxyZW1hcmtzPkRlZmF1bHQgQUVTIDEyOCB3aXRoIFNIQS0xIGFzIHRoZSBoYXNoIGFsZ29yaXRobS4gU3BpbmNvdW50IGlzIGhhcmRjb2RlZCB0byA1MDAwMDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU3RhbmRhcmQsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFnaWxlIEVuY3J5cHRpb24uCisgICAgICAgIC8vLyBVc2VkIGluIEV4Y2VsIDIwMTAtCisgICAgICAgIC8vLyBEZWZhdWx0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBZ2lsZQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhvdyBhbmQgaWYgdGhlIHdvcmtib29rIGlzIGVuY3J5cHRlZAorICAgIC8vLzxzZWVhbHNvIGNyZWY9IkV4Y2VsUHJvdGVjdGlvbiIvPiAKKyAgICAvLy88c2VlYWxzbyBjcmVmPSJFeGNlbFNoZWV0UHJvdGVjdGlvbiIvPiAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEVuY3J5cHRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8cmVtYXJrcz5EZWZhdWx0IEFFUyAyNTYgd2l0aCBTSEEtNTEyIGFzIHRoZSBoYXNoIGFsZ29yaXRobS4gU3BpbmNvdW50IGlzIHNldCB0byAxMDAwMDA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIEV4Y2VsRW5jcnlwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsZ29yaXRobSA9IEVuY3J5cHRpb25BbGdvcml0aG0uQUVTMjU2OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jcnlwdGlvbkFsZ29yaXRobSI+QWxnb3JpdGhtIHVzZWQgdG8gZW5jcnlwdCB0aGUgcGFja2FnZS4gRGVmYXVsdCBpcyBBRVMxMjg8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbEVuY3J5cHRpb24oRW5jcnlwdGlvbkFsZ29yaXRobSBlbmNyeXB0aW9uQWxnb3JpdGhtKQorICAgICAgICB7CisgICAgICAgICAgICBBbGdvcml0aG0gPSBlbmNyeXB0aW9uQWxnb3JpdGhtOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgYm9vbCBfaXNFbmNyeXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSXMgdGhlIHBhY2thZ2UgZW5jcnlwdGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIElzRW5jcnlwdGVkIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2lzRW5jcnlwdGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2lzRW5jcnlwdGVkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKF9pc0VuY3J5cHRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfcGFzc3dvcmQgPT0gbnVsbCkgX3Bhc3N3b3JkID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9wYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfcGFzc3dvcmQ9bnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBhc3N3b3JkIHVzZWQgdG8gZW5jcnlwdCB0aGUgd29ya2Jvb2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgUGFzc3dvcmQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcGFzc3dvcmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFzc3dvcmQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBfaXNFbmNyeXB0ZWQgPSAodmFsdWUgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxnb3JpdGhtIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIHBhY2thZ2UuIERlZmF1bHQgaXMgQUVTIDEyOC1iaXQgZm9yIHN0YW5kYXJkIGFuZCBBRVMgMjU2IGZvciBhZ2lsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRW5jcnlwdGlvbkFsZ29yaXRobSBBbGdvcml0aG0geyBnZXQ7IHNldDsgfQorICAgICAgICBwcml2YXRlIEVuY3J5cHRpb25WZXJzaW9uIF92ZXJzaW9uID0gRW5jcnlwdGlvblZlcnNpb24uQWdpbGU7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2ZXJzaW9uIG9mIHRoZSBlbmNyeXB0aW9uLiAgICAgICAgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFbmNyeXB0aW9uVmVyc2lvbiBWZXJzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdmVyc2lvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBWZXJzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IEVuY3J5cHRpb25WZXJzaW9uLkFnaWxlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLkFFUzI1NjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobSA9IEVuY3J5cHRpb25BbGdvcml0aG0uQUVTMTI4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzIGIvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTZhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxIZWFkZXJGb290ZXIuY3MKQEAgLTAsMCArMSw1NDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS+RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS+RsbG1hbiAgICAgICAgICAgICAgICAgICAgICBUb3RhbCByZXdyaXRlICAgICAgICAgICAgICAgMjAxMC0wMy0wMQorICogSmFuIEvkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sgICAgCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBIb3cgYSBwaWN0dXJlIHdpbGwgYmUgYWxpZ25lZCBpbiB0aGUgaGVhZGVyL2Zvb3RlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gUGljdHVyZUFsaWdubWVudAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBpY3R1cmUgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGVmdCBhbGlnbmVkIHRleHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGVmdCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBpY3R1cmUgd2lsbCBiZSBhZGRlZCB0byB0aGUgY2VudGVyZWQgdGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDZW50ZXJlZCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBpY3R1cmUgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmlnaHQgYWxpZ25lZCB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFJpZ2h0CisgICAgfQorICAgICNyZWdpb24gY2xhc3MgRXhjZWxIZWFkZXJGb290ZXJUZXh0CisJLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcmludCBoZWFkZXIgYW5kIGZvb3RlciAKKyAgICAvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBFeGNlbEhlYWRlckZvb3RlclRleHQKKwl7CisgICAgICAgIEV4Y2VsV29ya3NoZWV0IF93czsKKyAgICAgICAgc3RyaW5nIF9oZjsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFhtbE5vZGUgVGV4dE5vZGUsIEV4Y2VsV29ya3NoZWV0IHdzLCBzdHJpbmcgaGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93cyA9IHdzOworICAgICAgICAgICAgX2hmID0gaGY7CisgICAgICAgICAgICBpZiAoVGV4dE5vZGUgPT0gbnVsbCB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShUZXh0Tm9kZS5Jbm5lclRleHQpKSByZXR1cm47CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IFRleHROb2RlLklubmVyVGV4dDsKKyAgICAgICAgICAgIHN0cmluZyBjb2RlID0gdGV4dC5TdWJzdHJpbmcoMCwgMik7ICAKKyAgICAgICAgICAgIGludCBzdGFydFBvcz0yOworICAgICAgICAgICAgZm9yIChpbnQgcG9zPXN0YXJ0UG9zO3Bvczx0ZXh0Lkxlbmd0aC0yO3BvcysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBuZXdDb2RlID0gdGV4dC5TdWJzdHJpbmcocG9zLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3Q29kZSA9PSAiJkMiIHx8IG5ld0NvZGUgPT0gIiZSIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFRleHQoY29kZSwgdGV4dC5TdWJzdHJpbmcoc3RhcnRQb3MsIHBvcy1zdGFydFBvcykpOworICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHBvcysyOworICAgICAgICAgICAgICAgICAgICBwb3MgPSBzdGFydFBvczsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IG5ld0NvZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0VGV4dChjb2RlLCB0ZXh0LlN1YnN0cmluZyhzdGFydFBvcywgdGV4dC5MZW5ndGggLSBzdGFydFBvcykpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRUZXh0KHN0cmluZyBjb2RlLCBzdHJpbmcgdGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIiZMIjoKKyAgICAgICAgICAgICAgICAgICAgTGVmdEFsaWduZWRUZXh0PXRleHQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIiZDIjoKKyAgICAgICAgICAgICAgICAgICAgQ2VudGVyZWRUZXh0PXRleHQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFJpZ2h0QWxpZ25lZFRleHQ9dGV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0L3NldCB0aGUgdGV4dCB0byBhcHBlYXIgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBoZWFkZXIgKG9yIGZvb3Rlcikgb24gdGhlIHdvcmtzaGVldC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBMZWZ0QWxpZ25lZFRleHQgPSBudWxsOworCQkvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXQvc2V0IHRoZSB0ZXh0IHRvIGFwcGVhciBpbiB0aGUgY2VudGVyIG9mIHRoZSBoZWFkZXIgKG9yIGZvb3Rlcikgb24gdGhlIHdvcmtzaGVldC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBDZW50ZXJlZFRleHQgPSBudWxsOworCQkvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXQvc2V0IHRoZSB0ZXh0IHRvIGFwcGVhciBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBoZWFkZXIgKG9yIGZvb3Rlcikgb24gdGhlIHdvcmtzaGVldC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBSaWdodEFsaWduZWRUZXh0ID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5zZXJ0cyBhIHBpY3R1cmUgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCBpbiB0aGUgaGVhZGVyIG9yIGZvb3RlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBpY3R1cmUiPlRoZSBpbWFnZSBvYmplY3QgY29udGFpbmluZyB0aGUgUGljdHVyZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWxpZ25tZW50Ij5BbGlnbm1lbnQuIFRoZSBpbWFnZSBvYmplY3Qgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBUZXh0LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIEluc2VydFBpY3R1cmUoSW1hZ2UgUGljdHVyZSwgUGljdHVyZUFsaWdubWVudCBBbGlnbm1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBpZCA9IFZhbGlkYXRlSW1hZ2UoQWxpZ25tZW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9BZGQgdGhlIGltYWdlCisgICAgICAgICAgICBJbWFnZUNvbnZlcnRlciBpYyA9IG5ldyBJbWFnZUNvbnZlcnRlcigpOworICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKFBpY3R1cmUsIHR5cGVvZihieXRlW10pKTsKKyAgICAgICAgICAgIHZhciBpaSA9IF93cy5Xb3JrYm9vay5fcGFja2FnZS5BZGRJbWFnZShpbWcpOworCisgICAgICAgICAgICByZXR1cm4gQWRkSW1hZ2UoUGljdHVyZSwgaWQsIGlpKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnNlcnRzIGEgcGljdHVyZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGluIHRoZSBoZWFkZXIgb3IgZm9vdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGljdHVyZUZpbGUiPlRoZSBpbWFnZSBvYmplY3QgY29udGFpbmluZyB0aGUgUGljdHVyZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWxpZ25tZW50Ij5BbGlnbm1lbnQuIFRoZSBpbWFnZSBvYmplY3Qgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBUZXh0LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIEluc2VydFBpY3R1cmUoRmlsZUluZm8gUGljdHVyZUZpbGUsIFBpY3R1cmVBbGlnbm1lbnQgQWxpZ25tZW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaWQgPSBWYWxpZGF0ZUltYWdlKEFsaWdubWVudCk7CisKKyAgICAgICAgICAgIEltYWdlIFBpY3R1cmU7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIVBpY3R1cmVGaWxlLkV4aXN0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoInswfSBpcyBtaXNzaW5nIiwgUGljdHVyZUZpbGUuRnVsbE5hbWUpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBpY3R1cmUgPSBJbWFnZS5Gcm9tRmlsZShQaWN0dXJlRmlsZS5GdWxsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIkZpbGUgaXMgbm90IGEgc3VwcG9ydGVkIGltYWdlLWZpbGUgb3IgaXMgY29ycnVwdCIsIGV4KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7CisgICAgICAgICAgICBzdHJpbmcgY29udGVudFR5cGUgPSBFeGNlbFBpY3R1cmUuR2V0Q29udGVudFR5cGUoUGljdHVyZUZpbGUuRXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIHZhciB1cmlQaWMgPSBYbWxIZWxwZXIuR2V0TmV3VXJpKF93cy5fcGFja2FnZS5QYWNrYWdlLCAiL3hsL21lZGlhLyIrUGljdHVyZUZpbGUuTmFtZS5TdWJzdHJpbmcoMCwgUGljdHVyZUZpbGUuTmFtZS5MZW5ndGgtUGljdHVyZUZpbGUuRXh0ZW5zaW9uLkxlbmd0aCkgKyAiezB9IiArIFBpY3R1cmVGaWxlLkV4dGVuc2lvbik7CisgICAgICAgICAgICBieXRlW10gaW1nQnl0ZXMgPSAoYnl0ZVtdKWljLkNvbnZlcnRUbyhQaWN0dXJlLCB0eXBlb2YoYnl0ZVtdKSk7CisgICAgICAgICAgICB2YXIgaWkgPSBfd3MuV29ya2Jvb2suX3BhY2thZ2UuQWRkSW1hZ2UoaW1nQnl0ZXMsIHVyaVBpYywgY29udGVudFR5cGUpOworCisgICAgICAgICAgICByZXR1cm4gQWRkSW1hZ2UoUGljdHVyZSwgaWQsIGlpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRXhjZWxWbWxEcmF3aW5nUGljdHVyZSBBZGRJbWFnZShJbWFnZSBQaWN0dXJlLCBzdHJpbmcgaWQsIEV4Y2VsUGFja2FnZS5JbWFnZUluZm8gaWkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB3aWR0aCA9IFBpY3R1cmUuV2lkdGggKiA3MiAvIFBpY3R1cmUuSG9yaXpvbnRhbFJlc29sdXRpb24sICAgICAgLy9QaXhlbCAtLT4gUG9pbnRzCisgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gUGljdHVyZS5IZWlnaHQgKiA3MiAvIFBpY3R1cmUuVmVydGljYWxSZXNvbHV0aW9uOyAgICAgIC8vUGl4ZWwgLS0+IFBvaW50cworICAgICAgICAgICAgLy9BZGQgVk1MLWRyYXdpbmcgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBfd3MuSGVhZGVyRm9vdGVyLlBpY3R1cmVzLkFkZChpZCwgaWkuVXJpLCAiIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgVmFsaWRhdGVJbWFnZShQaWN0dXJlQWxpZ25tZW50IEFsaWdubWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGlkID0gc3RyaW5nLkNvbmNhdChBbGlnbm1lbnQuVG9TdHJpbmcoKVswXSwgX2hmKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmUgaW1hZ2UgaW4gX3dzLkhlYWRlckZvb3Rlci5QaWN0dXJlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2UuSWQgPT0gaWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkEgcGljdHVyZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHNlY3Rpb24iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9BZGQgdGhlIGltYWdlIHBsYWNlaG9sZGVyIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQKKyAgICAgICAgICAgIHN3aXRjaCAoQWxpZ25tZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgUGljdHVyZUFsaWdubWVudC5MZWZ0OgorICAgICAgICAgICAgICAgICAgICBMZWZ0QWxpZ25lZFRleHQgKz0gRXhjZWxIZWFkZXJGb290ZXIuSW1hZ2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGljdHVyZUFsaWdubWVudC5DZW50ZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgQ2VudGVyZWRUZXh0ICs9IEV4Y2VsSGVhZGVyRm9vdGVyLkltYWdlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBSaWdodEFsaWduZWRUZXh0ICs9IEV4Y2VsSGVhZGVyRm9vdGVyLkltYWdlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCX0KKwkjZW5kcmVnaW9uCisKKwkjcmVnaW9uIEV4Y2VsSGVhZGVyRm9vdGVyCisJLy8vIDxzdW1tYXJ5PgorCS8vLyBSZXByZXNlbnRzIHRoZSBIZWFkZXIgYW5kIEZvb3RlciBvbiBhbiBFeGNlbCBXb3Jrc2hlZXQKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxIZWFkZXJGb290ZXIgOiBYbWxIZWxwZXIKKwl7CisJCSNyZWdpb24gU3RhdGljIFByb3BlcnRpZXMKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJjdXJyZW50IHBhZ2UgIyIKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGNvbnN0IHN0cmluZyBQYWdlTnVtYmVyID0gQCImUCI7CisJCS8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAidG90YWwgcGFnZXMiCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBjb25zdCBzdHJpbmcgTnVtYmVyT2ZQYWdlcyA9IEAiJk4iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29kZSBmb3IgInRleHQgZm9udCBjb2xvciIKKyAgICAgICAgLy8vIFJHQiBDb2xvciBpcyBzcGVjaWZpZWQgYXMgUlJHR0JCCisgICAgICAgIC8vLyBUaGVtZSBDb2xvciBpcyBzcGVjaWZpZWQgYXMgVFRTTk4gd2hlcmUgVFQgaXMgdGhlIHRoZW1lIGNvbG9yIElkLCBTIGlzIGVpdGhlciAiKyIgb3IgIi0iIG9mIHRoZSB0aW50L3NoYWRlIHZhbHVlLCBOTiBpcyB0aGUgdGludC9zaGFkZSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBGb250Q29sb3IgPSBAIiZLIjsKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJzaGVldCB0YWIgbmFtZSIKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGNvbnN0IHN0cmluZyBTaGVldE5hbWUgPSBAIiZBIjsKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJ0aGlzIHdvcmtib29rJ3MgZmlsZSBwYXRoIgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgY29uc3Qgc3RyaW5nIEZpbGVQYXRoID0gQCImWiI7CisJCS8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAidGhpcyB3b3JrYm9vaydzIGZpbGUgbmFtZSIKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGNvbnN0IHN0cmluZyBGaWxlTmFtZSA9IEAiJkYiOworCQkvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29kZSBmb3IgImRhdGUiCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBjb25zdCBzdHJpbmcgQ3VycmVudERhdGUgPSBAIiZEIjsKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJ0aW1lIgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgY29uc3Qgc3RyaW5nIEN1cnJlbnRUaW1lID0gQCImVCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAicGljdHVyZSBhcyBiYWNrZ3JvdW5kIgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEltYWdlID0gQCImRyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAib3V0bGluZSBzdHlsZSIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBPdXRsaW5lU3R5bGUgPSBAIiZPIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJzaGFkb3cgc3R5bGUiCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgU2hhZG93U3R5bGUgPSBAIiZIIjsKKwkJI2VuZHJlZ2lvbgorCisJCSNyZWdpb24gRXhjZWxIZWFkZXJGb290ZXIgUHJpdmF0ZSBQcm9wZXJ0aWVzCisJCWludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfb2RkSGVhZGVyOworICAgICAgICBpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlclRleHQgX29kZEZvb3RlcjsKKwkJaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9ldmVuSGVhZGVyOworICAgICAgICBpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlclRleHQgX2V2ZW5Gb290ZXI7CisgICAgICAgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfZmlyc3RIZWFkZXI7CisgICAgICAgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfZmlyc3RGb290ZXI7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dzOworICAgICAgICAjZW5kcmVnaW9uCisKKwkJI3JlZ2lvbiBFeGNlbEhlYWRlckZvb3RlciBDb25zdHJ1Y3RvcgorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBFeGNlbEhlYWRlckZvb3RlciBDb25zdHJ1Y3RvcgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9Im5hbWVTcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3cyI+VGhlIHdvcmtzaGVldDwvcGFyYW0+CisJCWludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFdvcmtzaGVldCB3cykgOgorICAgICAgICAgICAgYmFzZShuYW1lU3BhY2VNYW5hZ2VyLCB0b3BOb2RlKQorCQl7CisgICAgICAgICAgICBfd3MgPSB3czsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJoZWFkZXJGb290ZXIiLCAib2RkSGVhZGVyIiwgIm9kZEZvb3RlciIsICJldmVuSGVhZGVyIiwgImV2ZW5Gb290ZXIiLCAiZmlyc3RIZWFkZXIiLCAiZmlyc3RGb290ZXIiIH07CisJCX0KKwkJI2VuZHJlZ2lvbgorCisJCSNyZWdpb24gYWxpZ25XaXRoTWFyZ2lucworICAgICAgICBjb25zdCBzdHJpbmcgYWxpZ25XaXRoTWFyZ2luc1BhdGg9IkBhbGlnbldpdGhNYXJnaW5zIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0cy9zZXRzIHRoZSBhbGlnbldpdGhNYXJnaW5zIGF0dHJpYnV0ZQorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgYm9vbCBBbGlnbldpdGhNYXJnaW5zCisJCXsKKwkJCWdldAorCQkJeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChhbGlnbldpdGhNYXJnaW5zUGF0aCk7CisJCQl9CisJCQlzZXQKKwkJCXsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGFsaWduV2l0aE1hcmdpbnNQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisJCQl9CisJCX0KKwkJI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gZGlmZmVyZW50T2RkRXZlbgorICAgICAgICBjb25zdCBzdHJpbmcgZGlmZmVyZW50T2RkRXZlblBhdGggPSAiQGRpZmZlcmVudE9kZEV2ZW4iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXRzL3NldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyBFeGNlbCB0byBkaXNwbGF5IGRpZmZlcmVudCBoZWFkZXJzIGFuZCBmb290ZXJzIG9uIG9kZCBhbmQgZXZlbiBwYWdlcy4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGJvb2wgZGlmZmVyZW50T2RkRXZlbgorCQl7CisJCQlnZXQKKwkJCXsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woZGlmZmVyZW50T2RkRXZlblBhdGgpOworCQkJfQorCQkJc2V0CisJCQl7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhkaWZmZXJlbnRPZGRFdmVuUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworCQkJfQorCQl9CisJCSNlbmRyZWdpb24KKworCQkjcmVnaW9uIGRpZmZlcmVudEZpcnN0CisgICAgICAgIGNvbnN0IHN0cmluZyBkaWZmZXJlbnRGaXJzdFBhdGggPSAiQGRpZmZlcmVudEZpcnN0IjsKKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXRzL3NldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyBFeGNlbCB0byBkaXNwbGF5IGRpZmZlcmVudCBoZWFkZXJzIGFuZCBmb290ZXJzIG9uIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3b3Jrc2hlZXQuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBib29sIGRpZmZlcmVudEZpcnN0CisJCXsKKwkJCWdldAorCQkJeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChkaWZmZXJlbnRGaXJzdFBhdGgpOworCQkJfQorCQkJc2V0CisJCQl7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhkaWZmZXJlbnRGaXJzdFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKwkJCX0KKwkJfQorCQkjZW5kcmVnaW9uCisKKwkJI3JlZ2lvbiBFeGNlbEhlYWRlckZvb3RlciBQdWJsaWMgUHJvcGVydGllcworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGhlYWRlciBvbiBvZGQgbnVtYmVyZWQgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgorCQkvLy8gSWYgeW91IHdhbnQgdGhlIHNhbWUgaGVhZGVyIG9uIGJvdGggb2RkIGFuZCBldmVuIHBhZ2VzLCB0aGVuIG9ubHkgc2V0IHZhbHVlcyBpbiB0aGlzIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBjbGFzcy4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBPZGRIZWFkZXIgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9vZGRIZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9vZGRIZWFkZXIgPSBuZXcgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpvZGRIZWFkZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiSCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX29kZEhlYWRlcjsgfSAKKyAgICAgICAgfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZvb3RlciBvbiBvZGQgbnVtYmVyZWQgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgorCQkvLy8gSWYgeW91IHdhbnQgdGhlIHNhbWUgZm9vdGVyIG9uIGJvdGggb2RkIGFuZCBldmVuIHBhZ2VzLCB0aGVuIG9ubHkgc2V0IHZhbHVlcyBpbiB0aGlzIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBjbGFzcy4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBPZGRGb290ZXIgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9vZGRGb290ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9vZGRGb290ZXIgPSBuZXcgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpvZGRGb290ZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiRiIpOyA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfb2RkRm9vdGVyOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKwkJLy8gZXZlbkhlYWRlciBhbmQgZXZlbkZvb3RlciBzZXQgZGlmZmVyZW50T2RkRXZlbiA9IHRydWUKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb24gZXZlbiBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBFeGNlbEhlYWRlckZvb3RlclRleHQgRXZlbkhlYWRlciAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2V2ZW5IZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ldmVuSGVhZGVyID0gbmV3IEV4Y2VsSGVhZGVyRm9vdGVyVGV4dChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6ZXZlbkhlYWRlciIsIE5hbWVTcGFjZU1hbmFnZXIpLCBfd3MsICJIRVZFTiIpOworICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRPZGRFdmVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVuSGVhZGVyOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmb290ZXIgb24gZXZlbiBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBFeGNlbEhlYWRlckZvb3RlclRleHQgRXZlbkZvb3RlcgorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZXZlbkZvb3RlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2V2ZW5Gb290ZXIgPSBuZXcgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpldmVuRm9vdGVyIiwgTmFtZVNwYWNlTWFuYWdlciksIF93cywgIkZFVkVOIik7CisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudE9kZEV2ZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW5Gb290ZXIgOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50LgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IEZpcnN0SGVhZGVyCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdEhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0SGVhZGVyID0gbmV3IEV4Y2VsSGVhZGVyRm9vdGVyVGV4dChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6Zmlyc3RIZWFkZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiSEZJUlNUIik7IAorICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50Rmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2ZpcnN0SGVhZGVyOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmb290ZXIgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50LgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IEZpcnN0Rm9vdGVyCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdEZvb3RlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0Rm9vdGVyID0gbmV3IEV4Y2VsSGVhZGVyRm9vdGVyVGV4dChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6Zmlyc3RGb290ZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiRkZJUlNUIik7IAorICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRGaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZmlyc3RGb290ZXI7IAorICAgICAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmVDb2xsZWN0aW9uIF92bWxEcmF3aW5nc0hGID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVm1sIGRyYXdpbmdzLiBVbmRlcmxheWluZyBvYmplY3QgZm9yIEhlYWRlciBmb290ZXIgaW1hZ2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbiBQaWN0dXJlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzSEYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB2bWxOb2RlID0gX3dzLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJkOndvcmtzaGVldC9kOmxlZ2FjeURyYXdpbmdIRi9AcjppZCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAodm1sTm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRiA9IG5ldyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbihfd3MuX3BhY2thZ2UsIF93cywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3dzLlBhcnQuUmVsYXRpb25zaGlwRXhpc3RzKHZtbE5vZGUuVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBfd3MuUGFydC5HZXRSZWxhdGlvbnNoaXAodm1sTm9kZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZtbFVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5nc0hGID0gbmV3IEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmVDb2xsZWN0aW9uKF93cy5fcGFja2FnZSwgX3dzLCB2bWxVcmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5nc0hGLlJlbElkID0gcmVsLklkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdm1sRHJhd2luZ3NIRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gU2F2ZSAgLy8gIEV4Y2VsSGVhZGVyRm9vdGVyCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFNhdmVzIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBpbmZvcm1hdGlvbiB0byB0aGUgd29ya3NoZWV0IFhNTAorCQkvLy8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCB2b2lkIFNhdmUoKQorCQl7CisJCQlpZiAoX29kZEhlYWRlciAhPSBudWxsKQorCQkJeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6b2RkSGVhZGVyIiwgR2V0VGV4dChPZGRIZWFkZXIpKTsKKwkJCX0KKwkJCWlmIChfb2RkRm9vdGVyICE9IG51bGwpCisJCQl7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpvZGRGb290ZXIiLCBHZXRUZXh0KE9kZEZvb3RlcikpOworCQkJfQorCisJCQkvLyBvbmx5IHNldCBldmVuSGVhZGVyIGFuZCBldmVuRm9vdGVyIAorCQkJaWYgKGRpZmZlcmVudE9kZEV2ZW4pCisJCQl7CisJCQkJaWYgKF9ldmVuSGVhZGVyICE9IG51bGwpCisJCQkJeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmV2ZW5IZWFkZXIiLCBHZXRUZXh0KEV2ZW5IZWFkZXIpKTsKKwkJCQl9CisJCQkJaWYgKF9ldmVuRm9vdGVyICE9IG51bGwpCisJCQkJeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmV2ZW5Gb290ZXIiLCBHZXRUZXh0KEV2ZW5Gb290ZXIpKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIG9ubHkgc2V0IGZpcnN0SGVhZGVyIGFuZCBmaXJzdEZvb3RlcgorCQkJaWYgKGRpZmZlcmVudEZpcnN0KQorCQkJeworCQkJCWlmIChfZmlyc3RIZWFkZXIgIT0gbnVsbCkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6Zmlyc3RIZWFkZXIiLCBHZXRUZXh0KEZpcnN0SGVhZGVyKSk7CisJCQkJfQorCQkJCWlmIChfZmlyc3RGb290ZXIgIT0gbnVsbCkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6Zmlyc3RGb290ZXIiLCBHZXRUZXh0KEZpcnN0Rm9vdGVyKSk7CisJCQkJfQorCQkJfQorCQl9CisgICAgICAgIGludGVybmFsIHZvaWQgU2F2ZUhlYWRlckZvb3RlckltYWdlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3NIRiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3NIRi5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF92bWxEcmF3aW5nc0hGLlVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfd3MuUGFydC5EZWxldGVSZWxhdGlvbnNoaXAoX3ZtbERyYXdpbmdzSEYuUmVsSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgX3dzLl9wYWNrYWdlLlBhY2thZ2UuRGVsZXRlUGFydChfdm1sRHJhd2luZ3NIRi5VcmkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3NIRi5VcmkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzSEYuVXJpID0gWG1sSGVscGVyLkdldE5ld1VyaShfd3MuX3BhY2thZ2UuUGFja2FnZSwgQCIveGwvZHJhd2luZ3Mvdm1sRHJhd2luZ3swfS52bWwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzSEYuUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRi5QYXJ0ID0gX3dzLl9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydChfdm1sRHJhd2luZ3NIRi5VcmksICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudm1sRHJhd2luZyIsIF93cy5fcGFja2FnZS5Db21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gX3dzLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShfd3MuV29ya3NoZWV0VXJpLCBfdm1sRHJhd2luZ3NIRi5VcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3ZtbERyYXdpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF93cy5TZXRIRkxlZ2FjeURyYXdpbmdSZWwocmVsLklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5nc0hGLlJlbElkID0gcmVsLklkOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxWbWxEcmF3aW5nUGljdHVyZSBkcmF3IGluIF92bWxEcmF3aW5nc0hGKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9IF92bWxEcmF3aW5nc0hGLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShfdm1sRHJhd2luZ3NIRi5VcmksIGRyYXcuSW1hZ2VVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2ltYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5SZWxJZCA9IHJlbC5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRi5WbWxEcmF3aW5nWG1sLlNhdmUoX3ZtbERyYXdpbmdzSEYuUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisJCXByaXZhdGUgc3RyaW5nIEdldFRleHQoRXhjZWxIZWFkZXJGb290ZXJUZXh0IGhlYWRlckZvb3RlcikKKwkJeworCQkJc3RyaW5nIHJldCA9ICIiOworCQkJaWYgKGhlYWRlckZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgIT0gbnVsbCkKKwkJCQlyZXQgKz0gIiZMIiArIGhlYWRlckZvb3Rlci5MZWZ0QWxpZ25lZFRleHQ7CisJCQlpZiAoaGVhZGVyRm9vdGVyLkNlbnRlcmVkVGV4dCAhPSBudWxsKQorCQkJCXJldCArPSAiJkMiICsgaGVhZGVyRm9vdGVyLkNlbnRlcmVkVGV4dDsKKwkJCWlmIChoZWFkZXJGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCAhPSBudWxsKQorCQkJCXJldCArPSAiJlIiICsgaGVhZGVyRm9vdGVyLlJpZ2h0QWxpZ25lZFRleHQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSNlbmRyZWdpb24KKwl9CisJI2VuZHJlZ2lvbgorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsSHlwZXJMaW5rLmNzIGIvRVBQbHVzL0V4Y2VsSHlwZXJMaW5rLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMWEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxIeXBlckxpbmsuY3MKQEAgLTAsMCArMSwxNjcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQgdGhpcyBjbGFzcwkJICAgICAgICAyMDEwLTAxLTI0CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEh5cGVybGlua0NsYXNzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxIeXBlckxpbmsgOiBVcmkKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgbmV3IGh5cGVybGluayB3aXRoIHRoZSBzcGVjaWZpZWQgVVJJCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpU3RyaW5nIj5UaGUgVVJJPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyB1cmlTdHJpbmcpIDoKKyAgICAgICAgICAgIGJhc2UodXJpU3RyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBPcmlnaW5hbFVyaSA9IChVcmkpdGhpczsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIG5ldyBoeXBlcmxpbmsgd2l0aCB0aGUgc3BlY2lmaWVkIFVSSS4gVGhpcyBzeW50YXggaXMgb2Jzb2xldGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmlTdHJpbmciPlRoZSBVUkk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRvbnRFc2NhcGUiPjwvcGFyYW0+CisgICAgICAgIFtPYnNvbGV0ZSgiYmFzZSBjb25zdHJ1Y3RvciAnU3lzdGVtLlVyaS5Vcmkoc3RyaW5nLCBib29sKScgaXMgb2Jzb2xldGU6ICdUaGUgY29uc3RydWN0b3IgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBuZXcgRXhjZWxIeXBlckxpbmsoc3RyaW5nKS4gVGhlIGRvbnRFc2NhcGUgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIGFsd2F5cyBmYWxzZS4iKV0KKyAgICAgICAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyB1cmlTdHJpbmcsIGJvb2wgZG9udEVzY2FwZSkgOgorICAgICAgICAgICAgYmFzZSh1cmlTdHJpbmcsIGRvbnRFc2NhcGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9yaWdpbmFsVXJpID0gKFVyaSl0aGlzOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgbmV3IGh5cGVybGluayB3aXRoIHRoZSBzcGVjaWZpZWQgVVJJIGFuZCBraW5kCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpU3RyaW5nIj5UaGUgVVJJPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmlLaW5kIj5LaW5kIChhYnNvbHV0ZS9yZWxhdGl2ZSBvciBpbmRldGVybWluYXRlKTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbEh5cGVyTGluayhzdHJpbmcgdXJpU3RyaW5nLCBVcmlLaW5kIHVyaUtpbmQpIDoKKyAgICAgICAgICAgIGJhc2UodXJpU3RyaW5nLCB1cmlLaW5kKQorICAgICAgICB7CisgICAgICAgICAgICBPcmlnaW5hbFVyaSA9IChVcmkpdGhpczsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaGVldCBpbnRlcm5hbCByZWZlcmVuY2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWZlcmVuY2VBZGRyZXNzIj5BZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXNwbGF5Ij5EaXNwbGF5ZWQgdGV4dDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbEh5cGVyTGluayhzdHJpbmcgcmVmZXJlbmNlQWRkcmVzcywgc3RyaW5nIGRpc3BsYXkpIDoKKyAgICAgICAgICAgIGJhc2UoInhsOi8vaW50ZXJuYWwiKSAgIC8vVVJJIGlzIG5vdCB1c2VkIG9uIGludGVybmFsIGxpbmtzIHNvIHB1dCBhIGR1bW15IHVyaSBoZXJlLgorICAgICAgICB7CisgICAgICAgICAgICBfcmVmZXJlbmNlQWRkcmVzcyA9IHJlZmVyZW5jZUFkZHJlc3M7CisgICAgICAgICAgICBfZGlzcGxheSA9IGRpc3BsYXk7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9yZWZlcmVuY2VBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIEV4Y2VsIGFkZHJlc3MgZm9yIGludGVybmFsIGxpbmtzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFJlZmVyZW5jZUFkZHJlc3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWZlcmVuY2VBZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3JlZmVyZW5jZUFkZHJlc3MgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgX2Rpc3BsYXkgPSAiIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGlzcGxheWVkIHRleHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBEaXNwbGF5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZGlzcGxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kaXNwbGF5ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVG9vbHRpcAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFRvb2xUaXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIGludCBfY29sU3Bhbm4gPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgaHlwZXJsaW5rIHNwYW5zIG11bHRpcGxlIGNvbHVtbnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb2xTcGFubgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbFNwYW5uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbFNwYW5uID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IF9yb3dTcGFubiA9IDA7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBoeXBlcmxpbmsgc3BhbnMgbXVsdGlwbGUgcm93cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFJvd1NwYW5uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcm93U3Bhbm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcm93U3Bhbm4gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGhhbmRsZSBub24gYWJzb2x1dGUgVVJJJ3MuIAorICAgICAgICAvLy8gSXMgdXNlZCBpZiBJc0FibHNvbHV0ZVVyaSBpcyB0cnVlLiBUaGUgYmFzZSBVUkkgd2lsbCBoYXZlIGEgZHVtbXkgdmFsdWUgb2YgeGw6Ly9ub25BYnNvbHV0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFVyaSBPcmlnaW5hbFVyaQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFJJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxOYW1lZFJhbmdlLmNzIGIvRVBQbHVzL0V4Y2VsTmFtZWRSYW5nZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGJlZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsTmFtZWRSYW5nZS5jcwpAQCAtMCwwICsxLDEyMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZCB0aGlzIGNsYXNzCQkgICAgICAgIDIwMTAtMDEtMjgKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBuYW1lZCByYW5nZS4gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTmFtZWRSYW5nZSA6IEV4Y2VsUmFuZ2VCYXNlIAorICAgIHsKKyAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3NoZWV0OworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIG5hbWVkIHJhbmdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVTaGVldCI+VGhlIHNoZWV0IGNvbnRhaW5pbmcgdGhlIG5hbWUuIG51bGwgaWYgaXRzIGEgZ2xvYmFsIG5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0Ij5TaGVldCB3aGVyZSB0aGUgYWRkcmVzcyBwb2ludHM8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+VGhlIGluZGV4IGluIHRoZSBjb2xsZWN0aW9uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZShzdHJpbmcgbmFtZSwgRXhjZWxXb3Jrc2hlZXQgbmFtZVNoZWV0ICwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBpbnQgaW5kZXgpIDoKKyAgICAgICAgICAgIGJhc2Uoc2hlZXQsIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWUgPSBuYW1lOworICAgICAgICAgICAgX3NoZWV0ID0gbmFtZVNoZWV0OworICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKKworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsTmFtZWRSYW5nZShzdHJpbmcgbmFtZSxFeGNlbFdvcmtib29rIHdiLCBFeGNlbFdvcmtzaGVldCBuYW1lU2hlZXQsIGludCBpbmRleCkgOgorICAgICAgICAgICAgYmFzZSh3YiwgbmFtZVNoZWV0LCBuYW1lLCB0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIF9zaGVldCA9IG5hbWVTaGVldDsKKyAgICAgICAgICAgIEluZGV4ID0gaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lIG9mIHRoZSByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElzIHRoZSBuYW1lZCByYW5nZSBsb2NhbCBmb3IgdGhlIHNoZWV0IAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IExvY2FsU2hlZXRJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3NoZWV0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2hlZXQuUG9zaXRpb25JRC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElzIHRoZSBuYW1lIGhpZGRlbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBJc05hbWVIaWRkZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgY29tbWVudCBmb3IgdGhlIE5hbWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lQ29tbWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb2JqZWN0IE5hbWVWYWx1ZSB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBOYW1lRm9ybXVsYSB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTmFtZTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWE2NDYyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwyMjIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQgdGhpcyBjbGFzcwkJICAgICAgICAyMDEwLTAxLTI4CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbGxlY3Rpb24gZm9yIG5hbWVkIHJhbmdlcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbE5hbWVkUmFuZ2U+CisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldCBfd3M7CisgICAgICAgIGludGVybmFsIEV4Y2VsV29ya2Jvb2sgX3diOworICAgICAgICBpbnRlcm5hbCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uKEV4Y2VsV29ya2Jvb2sgd2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93YiA9IHdiOworICAgICAgICAgICAgX3dzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uKEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsV29ya3NoZWV0IHdzKQorICAgICAgICB7CisgICAgICAgICAgICBfd2IgPSB3YjsKKyAgICAgICAgICAgIF93cyA9IHdzOworICAgICAgICB9CisgICAgICAgIExpc3Q8RXhjZWxOYW1lZFJhbmdlPiBfbGlzdCA9IG5ldyBMaXN0PEV4Y2VsTmFtZWRSYW5nZT4oKTsKKyAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX2RpYyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIG5ldyBuYW1lZCByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSYW5nZSI+VGhlIHJhbmdlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSBBZGQoc3RyaW5nIE5hbWUsIEV4Y2VsUmFuZ2VCYXNlIFJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbE5hbWVkUmFuZ2UgaXRlbTsKKyAgICAgICAgICAgIGlmIChSYW5nZS5Jc05hbWUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpdGVtID0gbmV3IEV4Y2VsTmFtZWRSYW5nZShOYW1lLCBfd2IsX3dzLCBfZGljLkNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gbmV3IEV4Y2VsTmFtZWRSYW5nZShOYW1lLCBfd3MsIFJhbmdlLldvcmtzaGVldCwgUmFuZ2UuQWRkcmVzcywgX2RpYy5Db3VudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFkZE5hbWUoTmFtZSwgaXRlbSk7CisKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZE5hbWUoc3RyaW5nIE5hbWUsIEV4Y2VsTmFtZWRSYW5nZSBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBfZGljLkFkZChOYW1lLCBfbGlzdC5Db3VudCk7CisgICAgICAgICAgICBfbGlzdC5BZGQoaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgZGVmaW5lZCBuYW1lIHJlZmVyZW5jaW5nIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSBBZGRWYWx1ZShzdHJpbmcgTmFtZSwgb2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbE5hbWVkUmFuZ2UoTmFtZSxfd2IsIF93cywgX2RpYy5Db3VudCk7CisgICAgICAgICAgICBpdGVtLk5hbWVWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgQWRkTmFtZShOYW1lLCBpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgZGVmaW5lZCBuYW1lIHJlZmVyZW5jaW5nIGEgZm9ybXVsYSAtLSB0aGUgbWV0aG9kIG5hbWUgY29udGFpbnMgYSB0eXBvLgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAvLy8gVXNlIDxzZWUgY3JlZj0iQWRkRm9ybXVsYSIvPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRm9ybXVsYSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgW09ic29sZXRlKCJDYWxsIEFkZEZvcm11bGEoKSBpbnN0ZWFkLiAgU2VlIElzc3VlIFRyYWNrZXIgSWQgIzE0Njg3IildCisgICAgICAgIHB1YmxpYyBFeGNlbE5hbWVkUmFuZ2UgQWRkRm9ybWxhKHN0cmluZyBOYW1lLCBzdHJpbmcgRm9ybXVsYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICB0aGlzLkFkZEZvcm11bGEoTmFtZSwgRm9ybXVsYSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgYSBkZWZpbmVkIG5hbWUgcmVmZXJlbmNpbmcgYSBmb3JtdWxhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGb3JtdWxhIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIEFkZEZvcm11bGEoc3RyaW5nIE5hbWUsIHN0cmluZyBGb3JtdWxhKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbE5hbWVkUmFuZ2UoTmFtZSwgX3diLCBfd3MsIF9kaWMuQ291bnQpOworICAgICAgICAgICAgaXRlbS5OYW1lRm9ybXVsYSA9IEZvcm11bGE7CisgICAgICAgICAgICBBZGROYW1lKE5hbWUsIGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlIGEgZGVmaW5lZCBuYW1lIGZyb20gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZShzdHJpbmcgTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoX2RpYy5Db250YWluc0tleShOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaXggPSBfZGljW05hbWVdOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGl4KzE7IGkgPCBfbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RpYy5SZW1vdmUoX2xpc3RbaV0uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIF9saXN0W2ldLkluZGV4LS07CisgICAgICAgICAgICAgICAgICAgIF9kaWMuQWRkKF9saXN0W2ldLk5hbWUsIF9saXN0W2ldLkluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2RpYy5SZW1vdmUoTmFtZSk7CisgICAgICAgICAgICAgICAgX2xpc3QuUmVtb3ZlQXQoaXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrcyBjb2xsZWN0aW9uIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBrZXkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPmtleSB0byBzZWFyY2ggZm9yPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIGtleSBpcyBpbiB0aGUgY29sbGVjdGlvbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnNLZXkoc3RyaW5nIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9kaWMuQ29udGFpbnNLZXkoa2V5KTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY3VycmVudCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RpYy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lIGluZGV4ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSAoa2V5KSBmb3IgYSBOYW1lZCByYW5nZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIHJlZmVyZW5jZSB0byB0aGUgcmFuZ2U8L3JldHVybnM+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRocm93cyBhIEtleU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIHRoaXNbc3RyaW5nIE5hbWVdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdFtfZGljW05hbWVdXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIHRoaXNbaW50IEluZGV4XQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiSUVudW1lcmFibGUiCisgICAgICAgICNyZWdpb24gSUVudW1lcmFibGU8RXhjZWxOYW1lZFJhbmdlPiBNZW1iZXJzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEltcGxlbWVudCBpbnRlcmZhY2UgbWV0aG9kIElFbnVtZXJhdG9yJmx0O0V4Y2VsTmFtZWRSYW5nZSZndDsgR2V0RW51bWVyYXRvcigpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbE5hbWVkUmFuZ2U+IEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEltcGxlbWVudCBpbnRlcmZhY2UgbWV0aG9kIElFbnVtZXJhdGFibGUgR2V0RW51bWVyYXRvcigpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKENvdW50PjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVtb3ZlKF9saXN0WzBdLk5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsUGFja2FnZS5jcyBiL0VQUGx1cy9FeGNlbFBhY2thZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MzliMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbFBhY2thZ2UuY3MKQEAgLTAsMCArMSwxMTk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBL5GxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBL5GxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIFN0YXJudXRvIERpIFRvcG8gJiBKYW4gS+RsbG1hbiAgIEFkZGVkIHN0cmVhbSBjb25zdHJ1Y3RvcnMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTG9hZCBtZXRob2QgU2F2ZSBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAyMDEwLTAzLTE0CisgKiBKYW4gS+RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWI7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5FbmNyeXB0aW9uOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE1hcHMgdG8gRG90TmV0WmlwcyBDb21wcmVzc2lvbkxldmVsIGVudW0KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIENvbXByZXNzaW9uTGV2ZWwKKyAgICB7CisgICAgICAgIExldmVsMCA9IDAsCisgICAgICAgIE5vbmUgPSAwLAorICAgICAgICBMZXZlbDEgPSAxLAorICAgICAgICBCZXN0U3BlZWQgPSAxLAorICAgICAgICBMZXZlbDIgPSAyLAorICAgICAgICBMZXZlbDMgPSAzLAorICAgICAgICBMZXZlbDQgPSA0LAorICAgICAgICBMZXZlbDUgPSA1LAorICAgICAgICBMZXZlbDYgPSA2LAorICAgICAgICBEZWZhdWx0ID0gNiwKKyAgICAgICAgTGV2ZWw3ID0gNywKKyAgICAgICAgTGV2ZWw4ID0gOCwKKyAgICAgICAgQmVzdENvbXByZXNzaW9uID0gOSwKKyAgICAgICAgTGV2ZWw5ID0gOSwKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXByZXNlbnRzIGFuIEV4Y2VsIDIwMDcvMjAxMCBYTFNYIGZpbGUgcGFja2FnZS4gIAorICAgIC8vLyBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgb2JqZWN0IHRvIGFjY2VzcyBhbGwgcGFydHMgb2YgdGhlIGRvY3VtZW50LgorICAgIC8vLyA8Y29kZT4KKwkvLy8gICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMS54bHN4Iik7CisJLy8vIAlpZiAobmV3RmlsZS5FeGlzdHMpCisJLy8vIAl7CisJLy8vIAkJbmV3RmlsZS5EZWxldGUoKTsgIC8vIGVuc3VyZXMgd2UgY3JlYXRlIGEgbmV3IHdvcmtib29rCisJLy8vIAkJbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKKwkvLy8gCX0KKwkvLy8gCXVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCisgICAgLy8vICAgICB7CisgICAgLy8vICAgICAgICAgLy8gYWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgZW1wdHkgd29ya2Jvb2sKKyAgICAvLy8gICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJbnZlbnRvcnkiKTsKKyAgICAvLy8gICAgICAgICAvL0FkZCB0aGUgaGVhZGVycworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJJRCI7CisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDJdLlZhbHVlID0gIlByb2R1Y3QiOworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAzXS5WYWx1ZSA9ICJRdWFudGl0eSI7CisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDRdLlZhbHVlID0gIlByaWNlIjsKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNV0uVmFsdWUgPSAiVmFsdWUiOworICAgIC8vLworICAgIC8vLyAgICAgICAgIC8vQWRkIHNvbWUgaXRlbXMuLi4KKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiMTIwMDEiOworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9ICJOYWlscyI7CisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMiJdLlZhbHVlID0gMzc7CisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gMy45OTsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiMTIwMDIiOworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9ICJIYW1tZXIiOworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzMiXS5WYWx1ZSA9IDU7CisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJEMyJdLlZhbHVlID0gMTIuMTA7CisgICAgLy8vCisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gIjEyMDAzIjsKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWUgPSAiU2F3IjsKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkM0Il0uVmFsdWUgPSAxMjsKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQ0Il0uVmFsdWUgPSAxNS4zNzsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICAvL0FkZCBhIGZvcm11bGEgZm9yIHRoZSB2YWx1ZS1jb2x1bW4KKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkUyOkU0Il0uRm9ybXVsYSA9ICJDMipEMiI7CisgICAgLy8vCisgICAgLy8vICAgICAgICAgICAgLy9PayBub3cgZm9ybWF0IHRoZSB2YWx1ZXM7CisgICAgLy8vICAgICAgICAgdXNpbmcgKHZhciByYW5nZSA9IHdvcmtzaGVldC5DZWxsc1sxLCAxLCAxLCA1XSkgCisgICAgLy8vICAgICAgICAgIHsKKyAgICAvLy8gICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAvLy8gICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgIC8vLyAgICAgICAgICAgICByYW5nZS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5EYXJrQmx1ZSk7CisgICAgLy8vICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuV2hpdGUpOworICAgIC8vLyAgICAgICAgIH0KKyAgICAvLy8KKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE1OkU1Il0uU3R5bGUuQm9yZGVyLlRvcC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE1OkU1Il0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbNSwgMywgNSwgNV0uRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIlNVQlRPVEFMKDksezB9KSIsIG5ldyBFeGNlbEFkZHJlc3MoMiwzLDQsMykuQWRkcmVzcyk7CisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMjpDNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDI6RTUiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwIjsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICAvL0NyZWF0ZSBhbiBhdXRvZmlsdGVyIGZvciB0aGUgcmFuZ2UKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkExOkU0Il0uQXV0b0ZpbHRlciA9IHRydWU7CisgICAgLy8vCisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMTpFNSJdLkF1dG9GaXRDb2x1bW5zKDApOworICAgIC8vLworICAgIC8vLyAgICAgICAgIC8vIGxldHMgc2V0IHRoZSBoZWFkZXIgdGV4dCAKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLm9kZEhlYWRlci5DZW50ZXJlZFRleHQgPSAiJmFtcDsyNCZhbXA7VSZhbXA7XCJBcmlhbCxSZWd1bGFyIEJvbGRcIiBJbnZlbnRvcnkiOworICAgIC8vLyAgICAgICAgIC8vIGFkZCB0aGUgcGFnZSBudW1iZXIgdG8gdGhlIGZvb3RlciBwbHVzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMKKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLm9kZEZvb3Rlci5SaWdodEFsaWduZWRUZXh0ID0KKyAgICAvLy8gICAgICAgICBzdHJpbmcuRm9ybWF0KCJQYWdlIHswfSBvZiB7MX0iLCBFeGNlbEhlYWRlckZvb3Rlci5QYWdlTnVtYmVyLCBFeGNlbEhlYWRlckZvb3Rlci5OdW1iZXJPZlBhZ2VzKTsKKyAgICAvLy8gICAgICAgICAvLyBhZGQgdGhlIHNoZWV0IG5hbWUgdG8gdGhlIGZvb3RlcgorICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIub2RkRm9vdGVyLkNlbnRlcmVkVGV4dCA9IEV4Y2VsSGVhZGVyRm9vdGVyLlNoZWV0TmFtZTsKKyAgICAvLy8gICAgICAgICAvLyBhZGQgdGhlIGZpbGUgcGF0aCB0byB0aGUgZm9vdGVyCisgICAgLy8vICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5vZGRGb290ZXIuTGVmdEFsaWduZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuRmlsZVBhdGggKyBFeGNlbEhlYWRlckZvb3Rlci5GaWxlTmFtZTsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuUHJpbnRlclNldHRpbmdzLlJlcGVhdFJvd3MgPSB3b3Jrc2hlZXQuQ2VsbHNbIjE6MiJdOworICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5QcmludGVyU2V0dGluZ3MuUmVwZWF0Q29sdW1ucyA9IHdvcmtzaGVldC5DZWxsc1siQTpHIl07CisgICAgLy8vCisgICAgLy8vICAgICAgICAgIC8vIENoYW5nZSB0aGUgc2hlZXQgdmlldyB0byBzaG93IGl0IGluIHBhZ2UgbGF5b3V0IG1vZGUKKyAgICAvLy8gICAgICAgICAgIHdvcmtzaGVldC5WaWV3LlBhZ2VMYXlvdXRWaWV3ID0gdHJ1ZTsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICAvLyBzZXQgc29tZSBkb2N1bWVudCBwcm9wZXJ0aWVzCisgICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIkludmVydG9yeSI7CisgICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkF1dGhvciA9ICJKYW4gS+RsbG1hbiI7CisgICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbW1lbnRzID0gIlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGFuIEV4Y2VsIDIwMDcgd29ya2Jvb2sgdXNpbmcgRVBQbHVzIjsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICAvLyBzZXQgc29tZSBleHRlbmRlZCBwcm9wZXJ0eSB2YWx1ZXMKKyAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQ29tcGFueSA9ICJBZHZlbnR1cmVXb3JrcyBJbmMuIjsKKyAgICAvLy8KKyAgICAvLy8gICAgICAgICAvLyBzZXQgc29tZSBjdXN0b20gcHJvcGVydHkgdmFsdWVzCisgICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkNoZWNrZWQgYnkiLCAiSmFuIEvkbGxtYW4iKTsKKyAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkVQUGx1cyIpOworICAgIC8vLworICAgIC8vLyAgICAgICAgIC8vIHNhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCisgICAgLy8vICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgLy8vCisgICAgLy8vICAgICAgIH0KKyAgICAvLy8KKyAgICAvLy8gICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gTW9yZSBzYW1wbGVzIGNhbiBiZSBmb3VuZCBhdCAgPGEgaHJlZj0iaHR0cDovL2VwcGx1cy5jb2RlcGxleC5jb20vIj5odHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbS88L2E+CisgICAgLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGFja2FnZSA6IElEaXNwb3NhYmxlCisJeworICAgICAgICBpbnRlcm5hbCBjb25zdCBib29sIHByZXNlcnZlV2hpdGVzcGFjZT1mYWxzZTsKKyAgICAgICAgU3RyZWFtIF9zdHJlYW0gPSBudWxsOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRXh0ZXJuYWxTdHJlYW09ZmFsc2U7CisgICAgICAgIGludGVybmFsIGNsYXNzIEltYWdlSW5mbworICAgICAgICB7CisgICAgICAgICAgICBpbnRlcm5hbCBzdHJpbmcgSGFzaCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBVcmkgVXJpe2dldDtzZXQ7fQorICAgICAgICAgICAgaW50ZXJuYWwgaW50IFJlZkNvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHN0cmluZywgSW1hZ2VJbmZvPiBfaW1hZ2VzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBJbWFnZUluZm8+KCk7CisJCSNyZWdpb24gUHJvcGVydGllcworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBFeHRlbnRpb24gU2NoZW1hIHR5cGVzCisJCS8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFYbWxFeHRlbnNpb24gPSAiYXBwbGljYXRpb24veG1sIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYVJlbHNFeHRlbnNpb24gPSAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBNYWluIFhtbCBzY2hlbWEgbmFtZQorCQkvLy8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hTWFpbiA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIjsKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmVsYXRpb25zaGlwIHNjaGVtYSBuYW1lCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFSZWxhdGlvbnNoaXBzID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hRHJhd2luZ3MgPSBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYVNoZWV0RHJhd2luZ3MgPSBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9zcHJlYWRzaGVldERyYXdpbmciOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hTWFya3VwQ29tcGF0aWJpbGl0eSA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDYiOworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFNaWNyb3NvZnRWbWwgPSBAInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYU1pY3Jvc29mdE9mZmljZSA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hTWljcm9zb2Z0RXhjZWwgPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWwiOworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFDaGFydCA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hSHlwZXJsaW5rID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2h5cGVybGluayI7CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFDb21tZW50ID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NvbW1lbnRzIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYUltYWdlID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2ltYWdlIjsKKyAgICAgICAgLy9PZmZpY2UgcHJvcGVydGllcworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hQ29yZSA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9tZXRhZGF0YS9jb3JlLXByb3BlcnRpZXMiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hRXh0ZW5kZWQgPSBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2V4dGVuZGVkLXByb3BlcnRpZXMiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hQ3VzdG9tID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9jdXN0b20tcHJvcGVydGllcyI7CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFEYyA9IEAiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hRGNUZXJtcyA9IEAiaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyI7CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFEY21pVHlwZSA9IEAiaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlLyI7CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFYc2kgPSBAImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYVZ0ID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9kb2NQcm9wc1ZUeXBlcyI7CisKKyAgICAgICAgLy9QaXZvdHRhYmxlcworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hUGl2b3RUYWJsZSA9IEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucGl2b3RUYWJsZSt4bWwiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hUGl2b3RDYWNoZURlZmluaXRpb24gPSBAImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Q2FjaGVEZWZpbml0aW9uK3htbCI7CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFQaXZvdENhY2hlUmVjb3JkcyA9IEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucGl2b3RDYWNoZVJlY29yZHMreG1sIjsKKworICAgICAgICAvL1ZCQQorICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hVkJBID0gQCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLnZiYVByb2plY3QiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hVkJBU2lnbmF0dXJlID0gQCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNlLnZiYVByb2plY3RTaWduYXR1cmUiOworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBjb250ZW50VHlwZVdvcmtib29rRGVmYXVsdCA9IEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWwiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZCA9ICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQubWFjcm9FbmFibGVkLm1haW4reG1sIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIGNvbnRlbnRUeXBlU2hhcmVkU3RyaW5nID0gQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbCI7CisgICAgICAgIC8vUGFja2FnZSByZWZlcmVuY2UKKyAgICAgICAgcHJpdmF0ZSBQYWNrYWdpbmcuWmlwUGFja2FnZSBfcGFja2FnZTsKKwkJaW50ZXJuYWwgRXhjZWxXb3JrYm9vayBfd29ya2Jvb2s7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSB3b3Jrc2hlZXQgKDE2Mzg0KS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWF4Q29sdW1ucyA9IDE2Mzg0OworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNYXhpbXVtIG51bWJlciBvZiByb3dzIGluIGEgd29ya3NoZWV0ICgxMDQ4NTc2KS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWF4Um93cyA9IDEwNDg1NzY7CisJCSNlbmRyZWdpb24KKworCQkjcmVnaW9uIEV4Y2VsUGFja2FnZSBDb25zdHJ1Y3RvcnMKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UuIE91dHB1dCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBTdHJlYW0gcHJvcGVydHkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgICAgICBDb25zdHJ1Y3ROZXdGaWxlKG51bGwpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKwkJLy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxQYWNrYWdlIGNsYXNzIGJhc2VkIG9uIGEgZXhpc3RpbmcgZmlsZSBvciBjcmVhdGVzIGEgbmV3IGZpbGUuIAorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9Im5ld0ZpbGUiPklmIG5ld0ZpbGUgZXhpc3RzLCBpdCBpcyBvcGVuZWQuICBPdGhlcndpc2UgaXQgaXMgY3JlYXRlZCBmcm9tIHNjcmF0Y2guPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShGaWxlSW5mbyBuZXdGaWxlKQorCQl7CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgICAgICBGaWxlID0gbmV3RmlsZTsKKyAgICAgICAgICAgIENvbnN0cnVjdE5ld0ZpbGUobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UgY2xhc3MgYmFzZWQgb24gYSBleGlzdGluZyBmaWxlIG9yIGNyZWF0ZXMgYSBuZXcgZmlsZS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3RmlsZSI+SWYgbmV3RmlsZSBleGlzdHMsIGl0IGlzIG9wZW5lZC4gIE90aGVyd2lzZSBpdCBpcyBjcmVhdGVkIGZyb20gc2NyYXRjaC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5QYXNzd29yZCBmb3IgYW4gZW5jcnlwdGVkIHBhY2thZ2U8L3BhcmFtPgorICAgICAgICBwdWJsaWMgRXhjZWxQYWNrYWdlKEZpbGVJbmZvIG5ld0ZpbGUsIHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICAgICAgRmlsZSA9IG5ld0ZpbGU7CisgICAgICAgICAgICBDb25zdHJ1Y3ROZXdGaWxlKHBhc3N3b3JkKTsKKyAgICAgICAgfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUGFja2FnZSBjbGFzcyBiYXNlZCBvbiBhIGV4aXN0aW5nIHRlbXBsYXRlLgorCQkvLy8gSWYgbmV3RmlsZSBleGlzdHMsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgU2F2ZSBtZXRob2QgaXMgY2FsbGVkCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ibmV3RmlsZSI+VGhlIG5hbWUgb2YgdGhlIEV4Y2VsIGZpbGUgdG8gYmUgY3JlYXRlZDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGUiPlRoZSBuYW1lIG9mIHRoZSBFeGNlbCB0ZW1wbGF0ZSB0byB1c2UgYXMgdGhlIGJhc2lzIG9mIHRoZSBuZXcgRXhjZWwgZmlsZTwvcGFyYW0+CisJCXB1YmxpYyBFeGNlbFBhY2thZ2UoRmlsZUluZm8gbmV3RmlsZSwgRmlsZUluZm8gdGVtcGxhdGUpCisJCXsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgICAgIEZpbGUgPSBuZXdGaWxlOworICAgICAgICAgICAgQ3JlYXRlRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBudWxsKTsKKwkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUGFja2FnZSBjbGFzcyBiYXNlZCBvbiBhIGV4aXN0aW5nIHRlbXBsYXRlLgorICAgICAgICAvLy8gSWYgbmV3RmlsZSBleGlzdHMsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgU2F2ZSBtZXRob2QgaXMgY2FsbGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3RmlsZSI+VGhlIG5hbWUgb2YgdGhlIEV4Y2VsIGZpbGUgdG8gYmUgY3JlYXRlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGUiPlRoZSBuYW1lIG9mIHRoZSBFeGNlbCB0ZW1wbGF0ZSB0byB1c2UgYXMgdGhlIGJhc2lzIG9mIHRoZSBuZXcgRXhjZWwgZmlsZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFzc3dvcmQiPlBhc3N3b3JkIHRvIGRlY3J5cHRlZCB0aGUgdGVtcGxhdGU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgRXhjZWxQYWNrYWdlKEZpbGVJbmZvIG5ld0ZpbGUsIEZpbGVJbmZvIHRlbXBsYXRlLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgICAgIEZpbGUgPSBuZXdGaWxlOworICAgICAgICAgICAgQ3JlYXRlRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBwYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UgY2xhc3MgYmFzZWQgb24gYSBleGlzdGluZyB0ZW1wbGF0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0ZW1wbGF0ZSI+VGhlIG5hbWUgb2YgdGhlIEV4Y2VsIHRlbXBsYXRlIHRvIHVzZSBhcyB0aGUgYmFzaXMgb2YgdGhlIG5ldyBFeGNlbCBmaWxlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1c2VTdHJlYW0iPmlmIHRydWUgdXNlIGEgc3RyZWFtLiBJZiBmYWxzZSBjcmVhdGUgYSBmaWxlIGluIHRoZSB0ZW1wIGRpciB3aXRoIGEgcmFuZG9tIG5hbWU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgRXhjZWxQYWNrYWdlKEZpbGVJbmZvIHRlbXBsYXRlLCBib29sIHVzZVN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICAgICAgQ3JlYXRlRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBudWxsKTsKKyAgICAgICAgICAgIGlmICh1c2VTdHJlYW0gPT0gZmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkdldFRlbXBQYXRoKCkgKyBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygpICsgIi54bHN4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UgY2xhc3MgYmFzZWQgb24gYSBleGlzdGluZyB0ZW1wbGF0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0ZW1wbGF0ZSI+VGhlIG5hbWUgb2YgdGhlIEV4Y2VsIHRlbXBsYXRlIHRvIHVzZSBhcyB0aGUgYmFzaXMgb2YgdGhlIG5ldyBFeGNlbCBmaWxlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1c2VTdHJlYW0iPmlmIHRydWUgdXNlIGEgc3RyZWFtLiBJZiBmYWxzZSBjcmVhdGUgYSBmaWxlIGluIHRoZSB0ZW1wIGRpciB3aXRoIGEgcmFuZG9tIG5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5QYXNzd29yZCB0byBkZWNyeXB0ZWQgdGhlIHRlbXBsYXRlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShGaWxlSW5mbyB0ZW1wbGF0ZSwgYm9vbCB1c2VTdHJlYW0sIHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICAgICAgQ3JlYXRlRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBwYXNzd29yZCk7CisgICAgICAgICAgICBpZiAodXNlU3RyZWFtID09IGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgPSBuZXcgRmlsZUluZm8oUGF0aC5HZXRUZW1wUGF0aCgpICsgR3VpZC5OZXdHdWlkKCkuVG9TdHJpbmcoKSArICIueGxzeCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxQYWNrYWdlIGNsYXNzIGJhc2VkIG9uIGEgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3U3RyZWFtIj5UaGUgc3RyZWFtIG9iamVjdCBjYW4gYmUgZW1wdHkgb3IgY29udGFpbiBhIHBhY2thZ2UuIFRoZSBzdHJlYW0gbXVzdCBiZSBSZWFkL1dyaXRlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShTdHJlYW0gbmV3U3RyZWFtKSAKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICAgICAgaWYgKG5ld1N0cmVhbS5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3U3RyZWFtOworICAgICAgICAgICAgICAgIF9pc0V4dGVybmFsU3RyZWFtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3ROZXdGaWxlKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMb2FkKG5ld1N0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UgY2xhc3MgYmFzZWQgb24gYSBzdHJlYW0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuZXdTdHJlYW0iPlRoZSBzdHJlYW0gb2JqZWN0IGNhbiBiZSBlbXB0eSBvciBjb250YWluIGEgcGFja2FnZS4gVGhlIHN0cmVhbSBtdXN0IGJlIFJlYWQvV3JpdGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBhc3N3b3JkIj5UaGUgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgZG9jdW1lbnQ8L3BhcmFtPgorICAgICAgICBwdWJsaWMgRXhjZWxQYWNrYWdlKFN0cmVhbSBuZXdTdHJlYW0sIHN0cmluZyBQYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEobmV3U3RyZWFtLkNhblJlYWQgJiYgbmV3U3RyZWFtLkNhbldyaXRlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc3RyZWFtIG11c3QgYmUgcmVhZC93cml0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgICAgICBpZiAobmV3U3RyZWFtLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9hZChuZXdTdHJlYW0sUGFzc3dvcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXdTdHJlYW07CisgICAgICAgICAgICAgICAgX2lzRXh0ZXJuYWxTdHJlYW0gPSB0cnVlOworICAgICAgICAgICAgICAgIC8vX3BhY2thZ2UgPSBQYWNrYWdlLk9wZW4oX3N0cmVhbSwgRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSk7IFRPRE86UmVtb3ZlCisgICAgICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgUGFja2FnaW5nLlppcFBhY2thZ2UoX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgQ3JlYXRlQmxhbmtXYigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxQYWNrYWdlIGNsYXNzIGJhc2VkIG9uIGEgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3U3RyZWFtIj5UaGUgb3V0cHV0IHN0cmVhbS4gTXVzdCBiZSBhbiBlbXB0eSByZWFkL3dyaXRlIHN0cmVhbS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRlbXBsYXRlU3RyZWFtIj5UaGlzIHN0cmVhbSBpcyBjb3BpZWQgdG8gdGhlIG91dHB1dCBzdHJlYW0gYXQgbG9hZDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoU3RyZWFtIG5ld1N0cmVhbSwgU3RyZWFtIHRlbXBsYXRlU3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmV3U3RyZWFtLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiVGhlIG91dHB1dCBzdHJlYW0gbXVzdCBiZSBlbXB0eS4gTGVuZ3RoID4gMCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCEobmV3U3RyZWFtLkNhblJlYWQgJiYgbmV3U3RyZWFtLkNhbldyaXRlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc3RyZWFtIG11c3QgYmUgcmVhZC93cml0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5pdCgpOworICAgICAgICAgICAgTG9hZCh0ZW1wbGF0ZVN0cmVhbSwgbmV3U3RyZWFtLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUGFja2FnZSBjbGFzcyBiYXNlZCBvbiBhIHN0cmVhbQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5ld1N0cmVhbSI+VGhlIG91dHB1dCBzdHJlYW0uIE11c3QgYmUgYW4gZW1wdHkgcmVhZC93cml0ZSBzdHJlYW0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0ZW1wbGF0ZVN0cmVhbSI+VGhpcyBzdHJlYW0gaXMgY29waWVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGF0IGxvYWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBhc3N3b3JkIj5QYXNzd29yZCB0byBkZWNyeXB0ZWQgdGhlIHRlbXBsYXRlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShTdHJlYW0gbmV3U3RyZWFtLCBTdHJlYW0gdGVtcGxhdGVTdHJlYW0sIHN0cmluZyBQYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5ld1N0cmVhbS5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJUaGUgb3V0cHV0IHN0cmVhbSBtdXN0IGJlIGVtcHR5LiBMZW5ndGggPiAwIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIShuZXdTdHJlYW0uQ2FuUmVhZCAmJiBuZXdTdHJlYW0uQ2FuV3JpdGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBzdHJlYW0gbXVzdCBiZSByZWFkL3dyaXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgICAgICBMb2FkKHRlbXBsYXRlU3RyZWFtLCBuZXdTdHJlYW0sIFBhc3N3b3JkKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIEltYWdlSW5mbyBBZGRJbWFnZShieXRlW10gaW1hZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRJbWFnZShpbWFnZSwgbnVsbCwgIiIpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEltYWdlSW5mbyBBZGRJbWFnZShieXRlW10gaW1hZ2UsIFVyaSB1cmksIHN0cmluZyBjb250ZW50VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGhhc2hQcm92aWRlciA9IG5ldyBTSEExQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICB2YXIgaGFzaCA9IEJpdENvbnZlcnRlci5Ub1N0cmluZyhoYXNoUHJvdmlkZXIuQ29tcHV0ZUhhc2goaW1hZ2UpKS5SZXBsYWNlKCItIiwiIik7CisgICAgICAgICAgICBsb2NrIChfaW1hZ2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaW1hZ2VzLkNvbnRhaW5zS2V5KGhhc2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ltYWdlc1toYXNoXS5SZWZDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgaW1hZ2VQYXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IEdldE5ld1VyaShQYWNrYWdlLCAiL3hsL21lZGlhL2ltYWdlezB9LmpwZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQYXJ0ID0gUGFja2FnZS5DcmVhdGVQYXJ0KHVyaSwgImltYWdlL2pwZWciLCBDb21wcmVzc2lvbkxldmVsLk5vbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQYXJ0ID0gUGFja2FnZS5DcmVhdGVQYXJ0KHVyaSwgY29udGVudFR5cGUsIENvbXByZXNzaW9uTGV2ZWwuTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IGltYWdlUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldyaXRlKGltYWdlLCAwLCBpbWFnZS5HZXRMZW5ndGgoMCkpOworCisgICAgICAgICAgICAgICAgICAgIF9pbWFnZXMuQWRkKGhhc2gsIG5ldyBJbWFnZUluZm8oKSB7IFVyaSA9IHVyaSwgUmVmQ291bnQgPSAxLCBIYXNoID0gaGFzaCwgUGFydCA9IGltYWdlUGFydCB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2ltYWdlc1toYXNoXTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBJbWFnZUluZm8gTG9hZEltYWdlKGJ5dGVbXSBpbWFnZSwgVXJpIHVyaSwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IGltYWdlUGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGhhc2hQcm92aWRlciA9IG5ldyBTSEExQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICB2YXIgaGFzaCA9IEJpdENvbnZlcnRlci5Ub1N0cmluZyhoYXNoUHJvdmlkZXIuQ29tcHV0ZUhhc2goaW1hZ2UpKS5SZXBsYWNlKCItIiwgIiIpOworICAgICAgICAgICAgaWYgKF9pbWFnZXMuQ29udGFpbnNLZXkoaGFzaCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2ltYWdlc1toYXNoXS5SZWZDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbWFnZXMuQWRkKGhhc2gsIG5ldyBJbWFnZUluZm8oKSB7IFVyaSA9IHVyaSwgUmVmQ291bnQgPSAxLCBIYXNoID0gaGFzaCwgUGFydCA9IGltYWdlUGFydCB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfaW1hZ2VzW2hhc2hdOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgUmVtb3ZlSW1hZ2Uoc3RyaW5nIGhhc2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKF9pbWFnZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9pbWFnZXMuQ29udGFpbnNLZXkoaGFzaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgaWkgPSBfaW1hZ2VzW2hhc2hdOworICAgICAgICAgICAgICAgICAgICBpaS5SZWZDb3VudC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoaWkuUmVmQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZS5EZWxldGVQYXJ0KGlpLlVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfaW1hZ2VzLlJlbW92ZShoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBJbWFnZUluZm8gR2V0SW1hZ2VJbmZvKGJ5dGVbXSBpbWFnZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGhhc2hQcm92aWRlciA9IG5ldyBTSEExQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICB2YXIgaGFzaCA9IEJpdENvbnZlcnRlci5Ub1N0cmluZyhoYXNoUHJvdmlkZXIuQ29tcHV0ZUhhc2goaW1hZ2UpKS5SZXBsYWNlKCItIiwiIik7CisKKyAgICAgICAgICAgIGlmIChfaW1hZ2VzLkNvbnRhaW5zS2V5KGhhc2gpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW1hZ2VzW2hhc2hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgVXJpIEdldE5ld1VyaShQYWNrYWdpbmcuWmlwUGFja2FnZSBwYWNrYWdlLCBzdHJpbmcgc1VyaSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkID0gMTsKKyAgICAgICAgICAgIFVyaSB1cmk7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdChzVXJpLCBpZCsrKSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocGFja2FnZS5QYXJ0RXhpc3RzKHVyaSkpOworICAgICAgICAgICAgcmV0dXJuIHVyaTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0IHZhbHVlcyBoZXJlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgRG9BZGp1c3REcmF3aW5ncyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGZpbGUgZnJvbSBhIHRlbXBsYXRlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGUiPkFuIGV4aXN0aW5nIHhsc3ggZmlsZSB0byB1c2UgYXMgYSB0ZW1wbGF0ZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFzc3dvcmQiPlRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBwYWNrYWdlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVGcm9tVGVtcGxhdGUoRmlsZUluZm8gdGVtcGxhdGUsIHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRlbXBsYXRlICE9IG51bGwpIHRlbXBsYXRlLlJlZnJlc2goKTsKKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoX3N0cmVhbT09bnVsbCkgX3N0cmVhbT1uZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgdmFyIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyNpZiAhTU9OTworICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uLklzRW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGlvbi5QYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgICAgICAgICB2YXIgZW5jckhhbmRsZXIgPSBuZXcgRW5jcnlwdGVkUGFja2FnZUhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbXMgPSBlbmNySGFuZGxlci5EZWNyeXB0UGFja2FnZSh0ZW1wbGF0ZSwgRW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGVuY3JIYW5kbGVyID0gbnVsbDsKKyNlbmRpZgorI2lmIE1PTk8KKwkgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiTm8gc3VwcG9ydCBmb3IgRW5jcnlwdGVkIHBhY2thZ2VzIGluIE1vbm8iKSk7CisjZW5kaWYKKwkgICAgICAgICAgICAgICAgLy90aHJvdyAobmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJObyBzdXBwb3J0IGZvciBFbmNyeXB0ZWQgcGFja2FnZXMgaW4gdGhpcyB2ZXJzaW9uIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYiA9IFN5c3RlbS5JTy5GaWxlLlJlYWRBbGxCeXRlcyh0ZW1wbGF0ZS5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlKGIsIDAsIGIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL19wYWNrYWdlID0gUGFja2FnZS5PcGVuKF9zdHJlYW0sIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgUGFja2FnaW5nLlppcFBhY2thZ2UobXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyNpZiAhTU9OTworICAgICAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCAmJiBDb21wb3VuZERvY3VtZW50LklzU3RvcmFnZUZpbGUodGVtcGxhdGUuRnVsbE5hbWUpPT0wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4gbm90IG9wZW4gdGhlIHBhY2thZ2UuIFBhY2thZ2UgaXMgYW4gT0xFIGNvbXBvdW5kIGRvY3VtZW50LiBJZiB0aGlzIGlzIGFuIGVuY3J5cHRlZCBwYWNrYWdlLCBwbGVhc2Ugc3VwcGx5IHRoZSBwYXNzd29yZCIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgIHRocm93OworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBhc3NlZCBpbnZhbGlkIFRlbXBsYXRlUGF0aCB0byBFeGNlbCBUZW1wbGF0ZSIpOworICAgICAgICAgICAgLy9yZXR1cm4gbmV3RmlsZTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgQ29uc3RydWN0TmV3RmlsZShzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpIF9zdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBpZiAoRmlsZSAhPSBudWxsKSBGaWxlLlJlZnJlc2goKTsKKyAgICAgICAgICAgIGlmIChGaWxlICE9IG51bGwgJiYgRmlsZS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworI2lmICFNT05PCisgICAgICAgICAgICAgICAgICAgIHZhciBlbmNySGFuZGxlciA9IG5ldyBFbmNyeXB0ZWRQYWNrYWdlSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uLklzRW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGlvbi5QYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgICAgICAgICBtcyA9IGVuY3JIYW5kbGVyLkRlY3J5cHRQYWNrYWdlKEZpbGUsIEVuY3J5cHRpb24pOworICAgICAgICAgICAgICAgICAgICBlbmNySGFuZGxlciA9IG51bGw7CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiTm8gc3VwcG9ydCBmb3IgRW5jcnlwdGVkIHBhY2thZ2VzIGluIE1vbm8iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYiA9IFN5c3RlbS5JTy5GaWxlLlJlYWRBbGxCeXRlcyhGaWxlLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbXMuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vX3BhY2thZ2UgPSBQYWNrYWdlLk9wZW4oX3N0cmVhbSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpOworICAgICAgICAgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBQYWNrYWdpbmcuWmlwUGFja2FnZShtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICB7CisjaWYgIU1PTk8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwgJiYgQ29tcG91bmREb2N1bWVudC5Jc1N0b3JhZ2VGaWxlKEZpbGUuRnVsbE5hbWUpPT0wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4gbm90IG9wZW4gdGhlIHBhY2thZ2UuIFBhY2thZ2UgaXMgYW4gT0xFIGNvbXBvdW5kIGRvY3VtZW50LiBJZiB0aGlzIGlzIGFuIGVuY3J5cHRlZCBwYWNrYWdlLCBwbGVhc2Ugc3VwcGx5IHRoZSBwYXNzd29yZCIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgIHRocm93OworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vX3BhY2thZ2UgPSBQYWNrYWdlLk9wZW4oX3N0cmVhbSwgRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSk7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgUGFja2FnaW5nLlppcFBhY2thZ2UobXMpOworICAgICAgICAgICAgICAgIENyZWF0ZUJsYW5rV2IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVCbGFua1diKCkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sRG9jdW1lbnQgd29ya2Jvb2sgPSBXb3JrYm9vay5Xb3JrYm9va1htbDsgLy8gdGhpcyB3aWxsIGNyZWF0ZSB0aGUgd29ya2Jvb2sgeG1sIGluIHRoZSBwYWNrYWdlCisgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCB0byB0aGUgbWFpbiBwYXJ0CisgICAgICAgICAgICBfcGFja2FnZS5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKG5ldyBVcmkoIi94bCIsIFVyaUtpbmQuUmVsYXRpdmUpLCBXb3JrYm9vay5Xb3JrYm9va1VyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBzY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9vZmZpY2VEb2N1bWVudCIpOworICAgICAgICB9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcGFja2FnZQorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgUGFja2FnaW5nLlppcFBhY2thZ2UgUGFja2FnZSB7IGdldCB7IHJldHVybiAoX3BhY2thZ2UpOyB9IH0KKyAgICAgICAgRXhjZWxFbmNyeXB0aW9uIF9lbmNyeXB0aW9uPW51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZm9ybWF0aW9uIGhvdyBhbmQgaWYgdGhlIHBhY2thZ2UgaXMgZW5jcnlwdGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEVuY3J5cHRpb24gRW5jcnlwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2VuY3J5cHRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lbmNyeXB0aW9uID0gbmV3IEV4Y2VsRW5jcnlwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2VuY3J5cHRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgd29ya2Jvb2sgY29tcG9uZW50IHdpdGhpbiB0aGUgcGFja2FnZS4KKwkJLy8vIEFsbCB3b3Jrc2hlZXRzIGFuZCBjZWxscyBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgd29ya2Jvb2suCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBFeGNlbFdvcmtib29rIFdvcmtib29rCisJCXsKKwkJCWdldAorCQkJeworICAgICAgICAgICAgICAgIGlmIChfd29ya2Jvb2sgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBuc20gPSBDcmVhdGVEZWZhdWx0TlNNKCk7CisKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtib29rID0gbmV3IEV4Y2VsV29ya2Jvb2sodGhpcywgbnNtKTsKKworICAgICAgICAgICAgICAgICAgICBfd29ya2Jvb2suR2V0RXh0ZXJuYWxSZWZlcmVuY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIF93b3JrYm9vay5HZXREZWZpbmVkTmFtZXMoKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gKF93b3JrYm9vayk7CisJCQl9CisJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQXV0b21hdGljbGx5IGFkanVzdCBkcmF3aW5nIHNpemUgd2hlbiBjb2x1bW4gd2lkdGgvcm93IGhlaWdodCBhcmUgYWRqdXN0ZWQsIGRlcGVuZGluZyBvbiB0aGUgZHJhd2luZ3MgZWRpdEJ5IHByb3BlcnR5LgorICAgICAgICAvLy8gRGVmYXVsdCBUcnVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERvQWRqdXN0RHJhd2luZ3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgWG1sTmFtZXNwYWNlTWFuYWdlciBDcmVhdGVEZWZhdWx0TlNNKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIENyZWF0ZSBhIE5hbWVzcGFjZU1hbmFnZXIgdG8gaGFuZGxlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgCisgICAgICAgICAgICAvLyAgYW5kIGNyZWF0ZSBhIHByZWZpeCBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgorICAgICAgICAgICAgTmFtZVRhYmxlIG50ID0gbmV3IE5hbWVUYWJsZSgpOworICAgICAgICAgICAgdmFyIG5zID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIobnQpOworICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKHN0cmluZy5FbXB0eSwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJyIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOworICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJjIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKKyAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgidnQiLCBzY2hlbWFWdCk7CisgICAgICAgICAgICAvLyBleHRlbmRlZCBwcm9wZXJ0aWVzIChhcHAueG1sKQorICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJ4cCIsIHNjaGVtYUV4dGVuZGVkKTsKKyAgICAgICAgICAgIC8vIGN1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoImN0cCIsIHNjaGVtYUN1c3RvbSk7CisgICAgICAgICAgICAvLyBjb3JlIHByb3BlcnRpZXMKKyAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgiY3AiLCBzY2hlbWFDb3JlKTsKKyAgICAgICAgICAgIC8vIGNvcmUgcHJvcGVydHkgbmFtZXNwYWNlcyAKKyAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgiZGMiLCBzY2hlbWFEYyk7CisgICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoImRjdGVybXMiLCBzY2hlbWFEY1Rlcm1zKTsKKyAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgiZGNtaXR5cGUiLCBzY2hlbWFEY21pVHlwZSk7CisgICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoInhzaSIsIHNjaGVtYVhzaSk7CisgICAgICAgICAgICByZXR1cm4gbnM7CisgICAgICAgIH0KKwkJCisJCSNyZWdpb24gU2F2ZVBhcnQKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gU2F2ZXMgdGhlIFhtbERvY3VtZW50IGludG8gdGhlIHBhY2thZ2UgYXQgdGhlIHNwZWNpZmllZCBVcmkuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0idXJpIj5UaGUgVXJpIG9mIHRoZSBjb21wb25lbnQ8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InhtbERvYyI+VGhlIFhtbERvY3VtZW50IHRvIHNhdmU8L3BhcmFtPgorCQlpbnRlcm5hbCB2b2lkIFNhdmVQYXJ0KFVyaSB1cmksIFhtbERvY3VtZW50IHhtbERvYykKKwkJeworICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQgPSBfcGFja2FnZS5HZXRQYXJ0KHVyaSk7CisJCQl4bWxEb2MuU2F2ZShwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKwkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBTYXZlcyB0aGUgWG1sRG9jdW1lbnQgaW50byB0aGUgcGFja2FnZSBhdCB0aGUgc3BlY2lmaWVkIFVyaS4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPlRoZSBVcmkgb2YgdGhlIGNvbXBvbmVudDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0ieG1sRG9jIj5UaGUgWG1sRG9jdW1lbnQgdG8gc2F2ZTwvcGFyYW0+CisgICAgICAgIGludGVybmFsIHZvaWQgU2F2ZVdvcmtib29rKFVyaSB1cmksIFhtbERvY3VtZW50IHhtbERvYykKKwkJeworICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQgPSBfcGFja2FnZS5HZXRQYXJ0KHVyaSk7CisgICAgICAgICAgICBpZihXb3JrYm9vay5WYmFQcm9qZWN0PT1udWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LkNvbnRlbnRUeXBlICE9IGNvbnRlbnRUeXBlV29ya2Jvb2tEZWZhdWx0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFydCA9IF9wYWNrYWdlLkNyZWF0ZVBhcnQodXJpLCBjb250ZW50VHlwZVdvcmtib29rRGVmYXVsdCwgQ29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFydC5Db250ZW50VHlwZSAhPSBjb250ZW50VHlwZVdvcmtib29rTWFjcm9FbmFibGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlbHMgPSBwYXJ0LkdldFJlbGF0aW9uc2hpcHMoKTsKKyAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuRGVsZXRlUGFydCh1cmkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gUGFja2FnZS5DcmVhdGVQYXJ0KHVyaSwgY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZWwgaW4gcmVscykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZS5EZWxldGVSZWxhdGlvbnNoaXAocmVsLklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKHJlbC5UYXJnZXRVcmksIHJlbC5UYXJnZXRNb2RlLCByZWwuUmVsYXRpb25zaGlwVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQl4bWxEb2MuU2F2ZShwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKwkJfQorCisgICAgICAgICNlbmRyZWdpb24KKworCQkjcmVnaW9uIERpc3Bvc2UKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ2xvc2VzIHRoZSBwYWNrYWdlLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKwkJeworICAgICAgICAgICAgaWYoX3BhY2thZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lzRXh0ZXJuYWxTdHJlYW09PWZhbHNlICYmIFN0cmVhbSAhPSBudWxsICYmIChTdHJlYW0uQ2FuUmVhZCB8fCBTdHJlYW0uQ2FuV3JpdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9wYWNrYWdlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgaWYoX2lzRXh0ZXJuYWxTdHJlYW09PWZhbHNlKSAoKElEaXNwb3NhYmxlKV9zdHJlYW0pLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBpZihfd29ya2Jvb2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF93b3JrYm9vay5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9wYWNrYWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfaW1hZ2VzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfZmlsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgX3dvcmtib29rID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfd29ya2Jvb2sgPSBudWxsOworICAgICAgICAgICAgfQorCQl9CisJCSNlbmRyZWdpb24KKworCQkjcmVnaW9uIFNhdmUgIC8vIEV4Y2VsUGFja2FnZSBzYXZlCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhdmVzIGFsbCB0aGUgY29tcG9uZW50cyBiYWNrIGludG8gdGhlIHBhY2thZ2UuCisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCByZWN1cnNpdmVseSBjYWxscyB0aGUgU2F2ZSBtZXRob2Qgb24gYWxsIHN1Yi1jb21wb25lbnRzLgorICAgICAgICAvLy8gV2UgY2xvc2UgdGhlIHBhY2thZ2UgYWZ0ZXIgdGhlIHNhdmUgaXMgZG9uZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgU2F2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmtib29rLlNhdmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoRmlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoRW5jcnlwdGlvbi5Jc0VuY3J5cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmICFNT05PCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfcGFja2FnZS5TYXZlKG1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBmaWxlID0gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUGFja2FnZUhhbmRsZXIgZXBoID0gbmV3IEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNFbmMgPSBlcGguRW5jcnlwdFBhY2thZ2UoZmlsZSwgRW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb3B5U3RyZWFtKG1zRW5jLCByZWYgX3N0cmVhbSk7CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgTW9uby4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZShfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfc3RyZWFtLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uSU8uRmlsZS5FeGlzdHMoRmlsZS5GdWxsTmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5JTy5GaWxlLkRlbGV0ZShGaWxlLkZ1bGxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiRXJyb3Igb3ZlcndyaXRpbmcgZmlsZSB7MH0iLCBGaWxlLkZ1bGxOYW1lKSwgZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLlNhdmUoX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHJlYW0gaXMgTWVtb3J5U3RyZWFtKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZVN0cmVhbShGaWxlLkZ1bGxOYW1lLCBGaWxlTW9kZS5DcmVhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9FbmNyeXB0UGFja2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVuY3J5cHRpb24uSXNFbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWYgIU1PTk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZmlsZSA9ICgoTWVtb3J5U3RyZWFtKVN0cmVhbSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyIGVwaCA9IG5ldyBFbmNyeXB0ZWRQYWNrYWdlSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtcyA9IGVwaC5FbmNyeXB0UGFja2FnZShmaWxlLCBFbmNyeXB0aW9uKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpLldyaXRlKG1zLkdldEJ1ZmZlcigpLCAwLCAoaW50KW1zLkxlbmd0aCk7CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRW5jcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIE1vbm8uIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkuV3JpdGUoKChNZW1vcnlTdHJlYW0pU3RyZWFtKS5HZXRCdWZmZXIoKSwgMCwgKGludClTdHJlYW0uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uSU8uRmlsZS5Xcml0ZUFsbEJ5dGVzKEZpbGUuRnVsbE5hbWUsIEdldEFzQnl0ZUFycmF5KGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChGaWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkVycm9yIHNhdmluZyBmaWxlIHswfSIsIEZpbGUuRnVsbE5hbWUpLCBleCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTYXZlcyBhbGwgdGhlIGNvbXBvbmVudHMgYmFjayBpbnRvIHRoZSBwYWNrYWdlLgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgcmVjdXJzaXZlbHkgY2FsbHMgdGhlIFNhdmUgbWV0aG9kIG9uIGFsbCBzdWItY29tcG9uZW50cy4KKyAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGlzIGNsb3NlZCBhZnRlciBpdCBoYQorICAgICAgICAvLy8gZCB0byBlbmNyeXB0IHRoZSB3b3JrYm9vayB3aXRoLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhpcyBwYXJhbWV0ZXIgb3ZlcnJpZGVzIHRoZSBXb3JrYm9vay5FbmNyeXB0aW9uLlBhc3N3b3JkLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmUoc3RyaW5nIHBhc3N3b3JkKQorCQl7CisgICAgICAgICAgICBFbmNyeXB0aW9uLlBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgICAgICBTYXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2F2ZXMgdGhlIHdvcmtib29rIHRvIGEgbmV3IGZpbGUKKyAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGlzIGNsb3NlZCBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZCAgICAgICAgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZSI+VGhlIGZpbGUgbG9jYXRpb248L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTYXZlQXMoRmlsZUluZm8gZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSA9IGZpbGU7CisgICAgICAgICAgICBTYXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2F2ZXMgdGhlIHdvcmtib29rIHRvIGEgbmV3IGZpbGUKKyAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGlzIGNsb3NlZCBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGUiPlRoZSBmaWxlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIHBhc3N3b3JkIHRvIGVuY3J5cHQgdGhlIHdvcmtib29rIHdpdGguIAorICAgICAgICAvLy8gVGhpcyBwYXJhbWV0ZXIgb3ZlcnJpZGVzIHRoZSBFbmNyeXB0aW9uLlBhc3N3b3JkLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmVBcyhGaWxlSW5mbyBmaWxlLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGUgPSBmaWxlOworICAgICAgICAgICAgRW5jcnlwdGlvbi5QYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgU2F2ZSgpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvcGllcyB0aGUgUGFja2FnZSB0byB0aGUgT3V0c3RyZWFtCisgICAgICAgIC8vLyBUaGUgcGFja2FnZSBpcyBjbG9zZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gc2F2ZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJPdXRwdXRTdHJlYW0iPlRoZSBzdHJlYW0gdG8gY29weSB0aGUgcGFja2FnZSB0bzwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmVBcyhTdHJlYW0gT3V0cHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlID0gbnVsbDsKKyAgICAgICAgICAgIFNhdmUoKTsKKworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBfc3RyZWFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uLklzRW5jcnlwdGVkKQorICAgICAgICAgICAgICAgIHsKKyNpZiAhTU9OTworICAgICAgICAgICAgICAgICAgICAvL0VuY3J5cHQgV29ya2Jvb2sKKyAgICAgICAgICAgICAgICAgICAgQnl0ZVtdIGZpbGUgPSBuZXcgYnl0ZVtTdHJlYW0uTGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3MgPSBTdHJlYW0uUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICBTdHJlYW0uUmVhZChmaWxlLCAwLCAoaW50KSBTdHJlYW0uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkUGFja2FnZUhhbmRsZXIgZXBoID0gbmV3IEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBtcyA9IGVwaC5FbmNyeXB0UGFja2FnZShmaWxlLCBFbmNyeXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgQ29weVN0cmVhbShtcywgcmVmIE91dHB1dFN0cmVhbSk7CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRW5jcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIE1vbm8uIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29weVN0cmVhbShfc3RyZWFtLCByZWYgT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29waWVzIHRoZSBQYWNrYWdlIHRvIHRoZSBPdXRzdHJlYW0KKyAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGlzIGNsb3NlZCBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik91dHB1dFN0cmVhbSI+VGhlIHN0cmVhbSB0byBjb3B5IHRoZSBwYWNrYWdlIHRvPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIHBhc3N3b3JkIHRvIGVuY3J5cHQgdGhlIHdvcmtib29rIHdpdGguIAorICAgICAgICAvLy8gVGhpcyBwYXJhbWV0ZXIgb3ZlcnJpZGVzIHRoZSBFbmNyeXB0aW9uLlBhc3N3b3JkLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmVBcyhTdHJlYW0gT3V0cHV0U3RyZWFtLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVuY3J5cHRpb24uUGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgICAgIFNhdmVBcyhPdXRwdXRTdHJlYW0pOworICAgICAgICB9CisgICAgICAgIEZpbGVJbmZvIF9maWxlID0gbnVsbDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgb3V0cHV0IGZpbGUuIE51bGwgaWYgbm8gZmlsZSBpcyB1c2VkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBGaWxlSW5mbyBGaWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9maWxlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG91dHB1dCBzdHJlYW0uIFRoaXMgc3RyZWFtIGlzIHRoZSBub3QgdGhlIGVuY3J5cHRlZCBwYWNrYWdlLgorICAgICAgICAvLy8gVG8gZ2V0IHRoZSBlbmNyeXB0ZWQgcGFja2FnZSB1c2UgdGhlIFNhdmVBcyhzdHJlYW0pIG1ldGhvZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFN0cmVhbSBTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJI2VuZHJlZ2lvbgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21wcmVzc2lvbiBvcHRpb24gZm9yIHRoZSBwYWNrYWdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgICAgICAKKyAgICAgICAgcHVibGljIENvbXByZXNzaW9uTGV2ZWwgQ29tcHJlc3Npb24gCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFja2FnZS5Db21wcmVzc2lvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhY2thZ2UuQ29tcHJlc3Npb24gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkjcmVnaW9uIEdldFhtbEZyb21VcmkKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0IHRoZSBYbWxEb2N1bWVudCBmcm9tIGFuIFVSSQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InVyaSI+VGhlIFVyaSB0byB0aGUgcGFydDwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz5UaGUgWG1sRG9jdW1lbnQ8L3JldHVybnM+CisJCWludGVybmFsIFhtbERvY3VtZW50IEdldFhtbEZyb21VcmkoVXJpIHVyaSkKKwkJeworCQkJWG1sRG9jdW1lbnQgeG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisJCQlQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCA9IF9wYWNrYWdlLkdldFBhcnQodXJpKTsKKyAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZSh4bWwsIHBhcnQuR2V0U3RyZWFtKCkpOyAKKwkJCXJldHVybiAoeG1sKTsKKwkJfQorCQkjZW5kcmVnaW9uCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2F2ZXMgYW5kIHJldHVybnMgdGhlIEV4Y2VsIGZpbGVzIGFzIGEgYnl0ZWFycmF5LgorICAgICAgICAvLy8gTm90ZSB0aGF0IHRoZSBwYWNrYWdlIGlzIGNsb3NlZCB1cG9uIHNhdmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxleGFtcGxlPiAgICAgIAorICAgICAgICAvLy8gRXhhbXBsZSBob3cgdG8gcmV0dXJuIGEgZG9jdW1lbnQgZnJvbSBhIFdlYnNlcnZlci4uLgorICAgICAgICAvLy8gPGNvZGU+IAorICAgICAgICAvLy8gIEV4Y2VsUGFja2FnZSBwYWNrYWdlPW5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgLy8vICAvKioqKiAuLi4gQ3JlYXRlIHRoZSBkb2N1bWVudCAqKioqLworICAgICAgICAvLy8gIEJ5dGVbXSBiaW4gPSBwYWNrYWdlLkdldEFzQnl0ZUFycmF5KCk7CisgICAgICAgIC8vLyAgUmVzcG9uc2UuQ29udGVudFR5cGUgPSAiQXBwbGljYXRpb24vdm5kLm1zLUV4Y2VsIjsKKyAgICAgICAgLy8vICBSZXNwb25zZS5BZGRIZWFkZXIoImNvbnRlbnQtZGlzcG9zaXRpb24iLCAiYXR0YWNobWVudDsgIGZpbGVuYW1lPVRoZUZpbGUueGxzeCIpOworCQkvLy8gIFJlc3BvbnNlLkJpbmFyeVdyaXRlKGJpbik7CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QXNCeXRlQXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgIHJldHVybiBHZXRBc0J5dGVBcnJheSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTYXZlcyBhbmQgcmV0dXJucyB0aGUgRXhjZWwgZmlsZXMgYXMgYSBieXRlYXJyYXkKKyAgICAgICAgLy8vIE5vdGUgdGhhdCB0aGUgcGFja2FnZSBpcyBjbG9zZWQgdXBvbiBzYXZlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8ZXhhbXBsZT4gICAgICAKKyAgICAgICAgLy8vIEV4YW1wbGUgaG93IHRvIHJldHVybiBhIGRvY3VtZW50IGZyb20gYSBXZWJzZXJ2ZXIuLi4KKyAgICAgICAgLy8vIDxjb2RlPiAKKyAgICAgICAgLy8vICBFeGNlbFBhY2thZ2UgcGFja2FnZT1uZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgIC8vLyAgLyoqKiogLi4uIENyZWF0ZSB0aGUgZG9jdW1lbnQgKioqKi8KKyAgICAgICAgLy8vICBCeXRlW10gYmluID0gcGFja2FnZS5HZXRBc0J5dGVBcnJheSgpOworICAgICAgICAvLy8gIFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gIkFwcGxpY2F0aW9uL3ZuZC5tcy1FeGNlbCI7CisgICAgICAgIC8vLyAgUmVzcG9uc2UuQWRkSGVhZGVyKCJjb250ZW50LWRpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQ7ICBmaWxlbmFtZT1UaGVGaWxlLnhsc3giKTsKKyAgICAgICAgLy8vICBSZXNwb25zZS5CaW5hcnlXcml0ZShiaW4pOworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5UaGUgcGFzc3dvcmQgdG8gZW5jcnlwdCB0aGUgd29ya2Jvb2sgd2l0aC4gCisgICAgICAgIC8vLyBUaGlzIHBhcmFtZXRlciBvdmVycmlkZXMgdGhlIEVuY3J5cHRpb24uUGFzc3dvcmQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRBc0J5dGVBcnJheShzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVuY3J5cHRpb24uUGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBHZXRBc0J5dGVBcnJheSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBieXRlW10gR2V0QXNCeXRlQXJyYXkoYm9vbCBzYXZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2F2ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXb3JrYm9vay5TYXZlKCk7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBfcGFja2FnZS5TYXZlKF9zdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQnl0ZVtdIGJ5UmV0ID0gbmV3IGJ5dGVbU3RyZWFtLkxlbmd0aF07CisgICAgICAgICAgICBsb25nIHBvcyA9IFN0cmVhbS5Qb3NpdGlvbjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgU3RyZWFtLlJlYWQoYnlSZXQsIDAsIChpbnQpU3RyZWFtLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vRW5jcnlwdCBXb3JrYm9vaz8KKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uLklzRW5jcnlwdGVkKQorICAgICAgICAgICAgeworI2lmICFNT05PCisgICAgICAgICAgICAgICAgRW5jcnlwdGVkUGFja2FnZUhhbmRsZXIgZXBoPW5ldyBFbmNyeXB0ZWRQYWNrYWdlSGFuZGxlcigpOworICAgICAgICAgICAgICAgIHZhciBtcyA9IGVwaC5FbmNyeXB0UGFja2FnZShieVJldCwgRW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgYnlSZXQgPSBtcy5Ub0FycmF5KCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyZWFtLlNlZWsocG9zLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGJ5UmV0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvYWRzIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBkYXRhIGZyb20gYSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBpbnB1dC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBMb2FkKFN0cmVhbSBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9hZChpbnB1dCwgbmV3IE1lbW9yeVN0cmVhbSgpLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb2FkcyB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgZGF0YSBmcm9tIGEgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij5UaGUgaW5wdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQYXNzd29yZCI+VGhlIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIGRvY3VtZW50PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgTG9hZChTdHJlYW0gaW5wdXQsIHN0cmluZyBQYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9hZChpbnB1dCwgbmV3IE1lbW9yeVN0cmVhbSgpLCBQYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPjwvcGFyYW0+ICAgIAorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQYXNzd29yZCI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWQoU3RyZWFtIGlucHV0LCBTdHJlYW0gb3V0cHV0LCBzdHJpbmcgUGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vUmVsZWFzZSBzb21lIHJlc291cmNlczoKKyAgICAgICAgICAgIGlmICh0aGlzLl9wYWNrYWdlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5fcGFja2FnZS5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRoaXMuX3BhY2thZ2UgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuX3N0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5fc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0V4dGVybmFsU3RyZWFtID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChpbnB1dC5MZW5ndGggPT0gMCkgLy8gVGVtcGxhdGUgaXMgYmxhbmssIENvbnN0cnVjdCBuZXcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gb3V0cHV0OworICAgICAgICAgICAgICAgIENvbnN0cnVjdE5ld0ZpbGUoUGFzc3dvcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmVhbSBtczsKKyAgICAgICAgICAgICAgICB0aGlzLl9zdHJlYW0gPSBvdXRwdXQ7CisgICAgICAgICAgICAgICAgaWYgKFBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworI2lmICFNT05PCisgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBlbmNyU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBDb3B5U3RyZWFtKGlucHV0LCByZWYgZW5jclN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyIGVwaCA9IG5ldyBFbmNyeXB0ZWRQYWNrYWdlSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uLlBhc3N3b3JkID0gUGFzc3dvcmQ7CisgICAgICAgICAgICAgICAgICAgIG1zID0gZXBoLkRlY3J5cHRQYWNrYWdlKChNZW1vcnlTdHJlYW0pZW5jclN0cmVhbSwgRW5jcnlwdGlvbik7CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB1bmRlciBNb25vLiIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBDb3B5U3RyZWFtKGlucHV0LCByZWYgbXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aGlzLl9wYWNrYWdlID0gUGFja2FnZS5PcGVuKHRoaXMuX3N0cmVhbSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpOworICAgICAgICAgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBQYWNrYWdpbmcuWmlwUGFja2FnZShtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworI2lmICFNT05PCisgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyIGVwaCA9IG5ldyBFbmNyeXB0ZWRQYWNrYWdlSGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoUGFzc3dvcmQgPT0gbnVsbCAmJiBDb21wb3VuZERvY3VtZW50LklzU3RvcmFnZUlMb2NrQnl0ZXMoQ29tcG91bmREb2N1bWVudC5HZXRMb2NrYnl0ZSgoTWVtb3J5U3RyZWFtKV9zdHJlYW0pKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4gbm90IG9wZW4gdGhlIHBhY2thZ2UuIFBhY2thZ2UgaXMgYW4gT0xFIGNvbXBvdW5kIGRvY3VtZW50LiBJZiB0aGlzIGlzIGFuIGVuY3J5cHRlZCBwYWNrYWdlLCBwbGVhc2Ugc3VwcGx5IHRoZSBwYXNzd29yZCIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZiBNT05PCisgICAgICAgICAgICAgICAgICAgIHRocm93OworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgLy9DbGVhciB0aGUgd29ya2Jvb2sgc28gdGhhdCBpdCBnZXRzIHJlaW5pdGlhbGl6ZWQgbmV4dCB0aW1lCisgICAgICAgICAgICB0aGlzLl93b3JrYm9vayA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIG9iamVjdCBfbG9jaz1uZXcgb2JqZWN0KCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvcGllcyB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0U3RyZWFtIj5UaGUgaW5wdXQgc3RyZWFtLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0U3RyZWFtIj5UaGUgb3V0cHV0IHN0cmVhbS48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBDb3B5U3RyZWFtKFN0cmVhbSBpbnB1dFN0cmVhbSwgcmVmIFN0cmVhbSBvdXRwdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaW5wdXRTdHJlYW0uQ2FuUmVhZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQ2FuIG5vdCByZWFkIGZyb20gaW5wdXRzdHJlYW0iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW91dHB1dFN0cmVhbS5DYW5Xcml0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQ2FuIG5vdCB3cml0ZSB0byBvdXRwdXRzdHJlYW0iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IDgwOTY7CisgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlW2J1ZmZlckxlbmd0aF07CisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaW5wdXRTdHJlYW0uUmVhZChidWZmZXIsIDAsIGJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSByZXF1aXJlZCBieXRlcworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXNSZWFkID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLldyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGlucHV0U3RyZWFtLlJlYWQoYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5GbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFByaW50ZXJTZXR0aW5ncy5jcyBiL0VQUGx1cy9FeGNlbFByaW50ZXJTZXR0aW5ncy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYyNjUwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsUHJpbnRlclNldHRpbmdzLmNzCkBAIC0wLDAgKzEsODQzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgICNyZWdpb24gIkVudW1zIgorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJpbnRlciBvcmllbnRhdGlvbgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZU9yaWVudGF0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3J0cmFpdCBvcmllbnRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBQb3J0cmFpdCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGFuZHNjYXBlIG9yaWVudGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIExhbmRzY2FwZQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFBhcGVyc2l6ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZVBhcGVyU2l6ZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGV0dGVyIHBhcGVyICg4LjUgaW4uIGJ5IDExIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV0dGVyPSAxLCAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMZXR0ZXIgc21hbGwgcGFwZXIgKDguNSBpbi4gYnkgMTEgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXR0ZXJTbWFsbD0yLCAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIC8vIFRhYmxvaWQgcGFwZXIgKDExIGluLiBieSAxNyBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhYmxvaWQ9MywgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGVkZ2VyIHBhcGVyICgxNyBpbi4gYnkgMTEgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZWRnZXI9NCwgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExlZ2FsIHBhcGVyICg4LjUgaW4uIGJ5IDE0IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGVnYWw9NSwgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RhdGVtZW50IHBhcGVyICg1LjUgaW4uIGJ5IDguNSBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN0YXRlbWVudD02LCAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRXhlY3V0aXZlIHBhcGVyICg3LjI1IGluLiBieSAxMC41IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXhlY3V0aXZlPTcsICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQTMgcGFwZXIgKDI5NyBtbSBieSA0MjAgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEEzPTgsICAgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQTQgcGFwZXIgKDIxMCBtbSBieSAyOTcgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEE0PTksICAgICAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEE0IHNtYWxsIHBhcGVyICgyMTAgbW0gYnkgMjk3IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBNFNtYWxsPTEwLCAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBNSBwYXBlciAoMTQ4IG1tIGJ5IDIxMCBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQTU9MTEsICAgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQjQgcGFwZXIgKDI1MCBtbSBieSAzNTMgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEI0PTEyLCAgICAgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCNSBwYXBlciAoMTc2IG1tIGJ5IDI1MCBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQjU9MTMsICAgICAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbGlvIHBhcGVyICg4LjUgaW4uIGJ5IDEzIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRm9saW89MTQsICAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFF1YXJ0byBwYXBlciAoMjE1IG1tIGJ5IDI3NSBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUXVhcnRvPTE1LCAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0YW5kYXJkIHBhcGVyICgxMCBpbi4gYnkgMTQgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTdGFuZGFyZDEwXzE0PTE2LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RhbmRhcmQgcGFwZXIgKDExIGluLiBieSAxNyBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN0YW5kYXJkMTFfMTc9MTcsICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90ZSBwYXBlciAoOC41IGluLiBieSAxMSBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5vdGU9MTgsICAgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIzkgZW52ZWxvcGUgKDMuODc1IGluLiBieSA4Ljg3NSBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEVudmVsb3BlOT0xOSwgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIzEwIGVudmVsb3BlICg0LjEyNSBpbi4gYnkgOS41IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRW52ZWxvcGUxMD0yMCwgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAjMTEgZW52ZWxvcGUgKDQuNSBpbi4gYnkgMTAuMzc1IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRW52ZWxvcGUxMT0yMSwgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAjMTIgZW52ZWxvcGUgKDQuNzUgaW4uIGJ5IDExIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRW52ZWxvcGUxMj0yMiwgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAjMTQgZW52ZWxvcGUgKDUgaW4uIGJ5IDExLjUgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFbnZlbG9wZTE0PTIzLCAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEMgcGFwZXIgKDE3IGluLiBieSAyMiBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEM9MjQsICAgICAgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRCBwYXBlciAoMjIgaW4uIGJ5IDM0IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRD0yNSwgICAgICAgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRSBwYXBlciAoMzQgaW4uIGJ5IDQ0IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRT0yNiwgICAgICAgICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gREwgZW52ZWxvcGUgKDExMCBtbSBieSAyMjAgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIERMRW52ZWxvcGUgPSAyNywKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQzUgZW52ZWxvcGUgKDE2MiBtbSBieSAyMjkgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEM1RW52ZWxvcGUgPSAyOCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQzMgZW52ZWxvcGUgKDMyNCBtbSBieSA0NTggbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEMzRW52ZWxvcGUgPSAyOSwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEM0IGVudmVsb3BlICgyMjkgbW0gYnkgMzI0IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDNEVudmVsb3BlID0gMzAsIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDNiBlbnZlbG9wZSAoMTE0IG1tIGJ5IDE2MiBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQzZFbnZlbG9wZSA9IDMxLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQzY1IGVudmVsb3BlICgxMTQgbW0gYnkgMjI5IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDNjVFbnZlbG9wZSA9IDMyLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQjQgZW52ZWxvcGUgKDI1MCBtbSBieSAzNTMgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEI0RW52ZWxvcGU9IDMzLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQjUgZW52ZWxvcGUgKDE3NiBtbSBieSAyNTAgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEI1RW52ZWxvcGU9IDM0LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQjYgZW52ZWxvcGUgKDE3NiBtbSBieSAxMjUgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEI2RW52ZWxvcGUgPSAzNSwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEl0YWx5IGVudmVsb3BlICgxMTAgbW0gYnkgMjMwIG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBJdGFseUVudmVsb3BlID0gMzYsIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNb25hcmNoIGVudmVsb3BlICgzLjg3NSBpbi4gYnkgNy41IGluLikuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE1vbmFyY2hFbnZlbG9wZSA9IDM3LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gNiAzLzQgZW52ZWxvcGUgKDMuNjI1IGluLiBieSA2LjUgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTaXgzXzRFbnZlbG9wZSA9IDM4LAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVUyBzdGFuZGFyZCBmYW5mb2xkICgxNC44NzUgaW4uIGJ5IDExIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVVNTdGFuZGFyZD0zOSwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdlcm1hbiBzdGFuZGFyZCBmYW5mb2xkICg4LjUgaW4uIGJ5IDEyIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgR2VybWFuU3RhbmRhcmQ9NDAsIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXJtYW4gbGVnYWwgZmFuZm9sZCAoOC41IGluLiBieSAxMyBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEdlcm1hbkxlZ2FsPTQxLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSVNPIEI0ICgyNTAgbW0gYnkgMzUzIG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBJU09CND00MiwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIEphcGFuZXNlIGRvdWJsZSBwb3N0Y2FyZCAoMjAwIG1tIGJ5IDE0OCBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSmFwYW5lc2VEb3VibGVQb3N0Y2FyZD00MywKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RhbmRhcmQgcGFwZXIgKDkgaW4uIGJ5IDExIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU3RhbmRhcmQ5PTQ0LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RhbmRhcmQgcGFwZXIgKDEwIGluLiBieSAxMSBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN0YW5kYXJkMTA9NDUsIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdGFuZGFyZCBwYXBlciAoMTUgaW4uIGJ5IDExIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU3RhbmRhcmQxNT00NiwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEludml0ZSBlbnZlbG9wZSAoMjIwIG1tIGJ5IDIyMCBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSW52aXRlRW52ZWxvcGUgPSA0NywgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExldHRlciBleHRyYSBwYXBlciAoOS4yNzUgaW4uIGJ5IDEyIGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV0dGVyRXh0cmE9NTAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExlZ2FsIGV4dHJhIHBhcGVyICg5LjI3NSBpbi4gYnkgMTUgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZWdhbEV4dHJhPTUxLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGFibG9pZCBleHRyYSBwYXBlciAoMTEuNjkgaW4uIGJ5IDE4IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFibG9pZEV4dHJhPTUyLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBNCBleHRyYSBwYXBlciAoMjM2IG1tIGJ5IDMyMiBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQTRFeHRyYT01MywgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExldHRlciB0cmFuc3ZlcnNlIHBhcGVyICg4LjI3NSBpbi4gYnkgMTEgaW4uKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXR0ZXJUcmFuc3ZlcnNlPTU0LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQTQgdHJhbnN2ZXJzZSBwYXBlciAoMjEwIG1tIGJ5IDI5NyBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQTRUcmFuc3ZlcnNlPTU1LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGV0dGVyIGV4dHJhIHRyYW5zdmVyc2UgcGFwZXIgKDkuMjc1IGluLiBieSAxMiBpbi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIExldHRlckV4dHJhVHJhbnN2ZXJzZT01NiwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN1cGVyQS9TdXBlckEvQTQgcGFwZXIgKDIyNyBtbSBieSAzNTYgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN1cGVyQT01NywgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN1cGVyQi9TdXBlckIvQTMgcGFwZXIgKDMwNSBtbSBieSA0ODcgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN1cGVyQj01OCwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExldHRlciBwbHVzIHBhcGVyICg4LjUgaW4uIGJ5IDEyLjY5IGluLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV0dGVyUGx1cz01OSwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEE0IHBsdXMgcGFwZXIgKDIxMCBtbSBieSAzMzAgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEE0UGx1cz02MCwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEE1IHRyYW5zdmVyc2UgcGFwZXIgKDE0OCBtbSBieSAyMTAgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEE1VHJhbnN2ZXJzZT02MSwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEpJUyBCNSB0cmFuc3ZlcnNlIHBhcGVyICgxODIgbW0gYnkgMjU3IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBKSVNCNVRyYW5zdmVyc2U9NjIsIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBMyBleHRyYSBwYXBlciAoMzIyIG1tIGJ5IDQ0NSBtbSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQTNFeHRyYT02MywgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEE1IGV4dHJhIHBhcGVyICgxNzQgbW0gYnkgMjM1IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBNUV4dHJhPTY0LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSVNPIEI1IGV4dHJhIHBhcGVyICgyMDEgbW0gYnkgMjc2IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBJU09CNT02NSwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEyIHBhcGVyICg0MjAgbW0gYnkgNTk0IG1tKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBMj02NiwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEzIHRyYW5zdmVyc2UgcGFwZXIgKDI5NyBtbSBieSA0MjAgbW0pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEEzVHJhbnN2ZXJzZT02NywgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEzIGV4dHJhIHRyYW5zdmVyc2UgcGFwZXIgKDMyMiBtbSBieSA0NDUgbW0qLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBM0V4dHJhVHJhbnN2ZXJzZSA9IDY4CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3BlY2lmaWVzIHByaW50ZWQgcGFnZSBvcmRlcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZVBhZ2VPcmRlcgorICAgIHsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPcmRlciBwYWdlcyB2ZXJ0aWNhbGx5IGZpcnN0LCB0aGVuIG1vdmUgaG9yaXpvbnRhbGx5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBEb3duVGhlbk92ZXIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE9yZGVyIHBhZ2VzIGhvcml6b250YWxseSBmaXJzdCwgdGhlbiBtb3ZlIHZlcnRpY2FsbHkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgT3ZlclRoZW5Eb3duCisgICAgfQorICAgICNlbmRyZWdpb24KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByaW50ZXIgc2V0dGluZ3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxQcmludGVyU2V0dGluZ3MgOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIEV4Y2VsV29ya3NoZWV0IF93czsKKyAgICAgICAgYm9vbCBfbWFyZ2luc0NyZWF0ZWQgPSBmYWxzZTsKKworICAgICAgICBpbnRlcm5hbCBFeGNlbFByaW50ZXJTZXR0aW5ncyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsRXhjZWxXb3Jrc2hlZXQgd3MpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93cyA9IHdzOworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gd3MuU2NoZW1hTm9kZU9yZGVyOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfbGVmdE1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AbGVmdCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExlZnQgbWFyZ2luIGluIGluY2hlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZGVjaW1hbCBMZWZ0TWFyZ2luIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwoX2xlZnRNYXJnaW5QYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGVmdE1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX3JpZ2h0TWFyZ2luUGF0aCA9ICJkOnBhZ2VNYXJnaW5zL0ByaWdodCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJpZ2h0IG1hcmdpbiBpbiBpbmNoZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgUmlnaHRNYXJnaW4gCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRGVjaW1hbChfcmlnaHRNYXJnaW5QYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZU1hcmdpbnMoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9yaWdodE1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX3RvcE1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AdG9wIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVG9wIG1hcmdpbiBpbiBpbmNoZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgVG9wTWFyZ2luIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwoX3RvcE1hcmdpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RvcE1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2JvdHRvbU1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AYm90dG9tIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQm90dG9tIG1hcmdpbiBpbiBpbmNoZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgQm90dG9tTWFyZ2luIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwoX2JvdHRvbU1hcmdpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2JvdHRvbU1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2hlYWRlck1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AaGVhZGVyIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSGVhZGVyIG1hcmdpbiBpbiBpbmNoZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgSGVhZGVyTWFyZ2luIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwoX2hlYWRlck1hcmdpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2hlYWRlck1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2Zvb3Rlck1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AZm9vdGVyIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9vdGVyIG1hcmdpbiBpbiBpbmNoZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRlY2ltYWwgRm9vdGVyTWFyZ2luIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwoX2Zvb3Rlck1hcmdpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Zvb3Rlck1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX29yaWVudGF0aW9uUGF0aCA9ICJkOnBhZ2VTZXR1cC9Ab3JpZW50YXRpb24iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPcmllbnRhdGlvbiAKKyAgICAgICAgLy8vIFBvcnRyYWl0IG9yIExhbmRzY2FwZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZU9yaWVudGF0aW9uIE9yaWVudGF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoZU9yaWVudGF0aW9uKUVudW0uUGFyc2UodHlwZW9mKGVPcmllbnRhdGlvbiksIEdldFhtbE5vZGVTdHJpbmcoX29yaWVudGF0aW9uUGF0aCksIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfb3JpZW50YXRpb25QYXRoLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfZml0VG9XaWR0aFBhdGggPSAiZDpwYWdlU2V0dXAvQGZpdFRvV2lkdGgiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaXQgdG8gV2lkdGggaW4gcGFnZXMuIAorICAgICAgICAvLy8gU2V0IEZpdFRvUGFnZSB0byB0cnVlIHdoZW4gdXNpbmcgdGhpcyBvbmUuIAorICAgICAgICAvLy8gMCBpcyBhdXRvbWF0aWMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBGaXRUb1dpZHRoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KF9maXRUb1dpZHRoUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9maXRUb1dpZHRoUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9maXRUb0hlaWdodFBhdGggPSAiZDpwYWdlU2V0dXAvQGZpdFRvSGVpZ2h0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRml0IHRvIGhlaWdodCBpbiBwYWdlcy4gCisgICAgICAgIC8vLyBTZXQgRml0VG9QYWdlIHRvIHRydWUgd2hlbiB1c2luZyB0aGlzIG9uZS4gCisgICAgICAgIC8vLyAwIGlzIGF1dG9tYXRpYworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IEZpdFRvSGVpZ2h0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KF9maXRUb0hlaWdodFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZml0VG9IZWlnaHRQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX3NjYWxlUGF0aCA9ICJkOnBhZ2VTZXR1cC9Ac2NhbGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmludCBzY2FsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFNjYWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KF9zY2FsZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2NhbGVQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2ZpdFRvUGFnZVBhdGggPSAiZDpzaGVldFByL2Q6cGFnZVNldFVwUHIvQGZpdFRvUGFnZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZpdCBUbyBQYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBGaXRUb1BhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9maXRUb1BhZ2VQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2ZpdFRvUGFnZVBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2hlYWRlcnNQYXRoID0gImQ6cHJpbnRPcHRpb25zL0BoZWFkaW5ncyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByaW50IGhlYWRpbmdzIChjb2x1bW4gbGV0dGVyIGFuZCByb3cgbnVtYmVycykKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd0hlYWRlcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9oZWFkZXJzUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2hlYWRlcnNQYXRoLCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByaW50IHRpdGxlcworICAgICAgICAvLy8gUm93cyB0byBiZSByZXBlYXRlZCBhZnRlciBlYWNoIHBhZ2VicmVhay4KKyAgICAgICAgLy8vIFRoZSBhZGRyZXNzIG11c3QgYmUgYSBmdWxsIHJvdyBhZGRyZXNzIChleC4gMToxKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzIFJlcGVhdFJvd3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF93cy5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uUHJpbnRfVGl0bGVzIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbFJhbmdlQmFzZSByID0gX3dzLk5hbWVzWyJfeGxubS5QcmludF9UaXRsZXMiXSBhcyBFeGNlbFJhbmdlQmFzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIuU3RhcnQuQ29sdW1uID09IDEgJiYgci5FbmQuQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzcyhyLkZpcnN0QWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoci5fYWRkcmVzc2VzICE9IG51bGwgJiYgci5BZGRyZXNzZXNbMF0uU3RhcnQuQ29sdW1uID09IDEgJiYgci5BZGRyZXNzZXNbMF0uRW5kLkNvbHVtbiA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuX2FkZHJlc3Nlc1swXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgLy9NdXN0IHNwYW4gZW50aXJlIGNvbHVtbnMKKyAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5TdGFydC5Db2x1bW4gPT0gMSAmJiB2YWx1ZS5FbmQuQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJBZGRyZXNzIG11c3Qgc3BhbiBmdWxsIGNvbHVtbnMgb25seSAoZm9yIGV4LiBBZGRyZXNzPVwiQTpBXCIgZm9yIHRoZSBmaXJzdCBjb2x1bW4pLiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB2ZXJ0QWRkciA9IFJlcGVhdENvbHVtbnM7CisgICAgICAgICAgICAgICAgc3RyaW5nIGFkZHI7CisgICAgICAgICAgICAgICAgaWYgKHZlcnRBZGRyID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0gdmFsdWUuQWRkcmVzczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHZlcnRBZGRyLkFkZHJlc3MgKyAiLCIgKyB2YWx1ZS5BZGRyZXNzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfd3MuTmFtZXMuQ29udGFpbnNLZXkoIl94bG5tLlByaW50X1RpdGxlcyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dzLk5hbWVzWyJfeGxubS5QcmludF9UaXRsZXMiXS5BZGRyZXNzID0gYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dzLk5hbWVzLkFkZCgiX3hsbm0uUHJpbnRfVGl0bGVzIiwgbmV3IEV4Y2VsUmFuZ2VCYXNlKF93cywgYWRkcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmludCB0aXRsZXMKKyAgICAgICAgLy8vIENvbHVtbnMgdG8gYmUgcmVwZWF0ZWQgYWZ0ZXIgZWFjaCBwYWdlYnJlYWsuCisgICAgICAgIC8vLyBUaGUgYWRkcmVzcyBtdXN0IGJlIGEgZnVsbCBjb2x1bW4gYWRkcmVzcyAoZXguIEE6QSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzcyBSZXBlYXRDb2x1bW5zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfd3MuTmFtZXMuQ29udGFpbnNLZXkoIl94bG5tLlByaW50X1RpdGxlcyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxSYW5nZUJhc2UgciA9IF93cy5OYW1lc1siX3hsbm0uUHJpbnRfVGl0bGVzIl0gYXMgRXhjZWxSYW5nZUJhc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChyLlN0YXJ0LlJvdyA9PSAxICYmIHIuRW5kLlJvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3Moci5GaXJzdEFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIuX2FkZHJlc3NlcyAhPSBudWxsICYmIChyLl9hZGRyZXNzZXNbMF0uU3RhcnQuUm93ID09IDEgJiYgci5fYWRkcmVzc2VzWzBdLkVuZC5Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5fYWRkcmVzc2VzWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9NdXN0IHNwYW4gZW50aXJlIHJvd3MKKyAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5TdGFydC5Sb3cgPT0gMSAmJiB2YWx1ZS5FbmQuUm93PT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkFkZHJlc3MgbXVzdCBzcGFuIHJvd3Mgb25seSAoZm9yIGV4LiBBZGRyZXNzPVwiMToxXCIgZm9yIHRoZSBmaXJzdCByb3cpLiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBob3JBZGRyID0gUmVwZWF0Um93czsKKyAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcjsKKyAgICAgICAgICAgICAgICBpZiAoaG9yQWRkciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHZhbHVlLkFkZHJlc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSB2YWx1ZS5BZGRyZXNzICsgIiwiICsgaG9yQWRkci5BZGRyZXNzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfd3MuTmFtZXMuQ29udGFpbnNLZXkoIl94bG5tLlByaW50X1RpdGxlcyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dzLk5hbWVzWyJfeGxubS5QcmludF9UaXRsZXMiXS5BZGRyZXNzID0gYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dzLk5hbWVzLkFkZCgiX3hsbm0uUHJpbnRfVGl0bGVzIiwgbmV3IEV4Y2VsUmFuZ2VCYXNlKF93cywgYWRkcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcHJpbnRhcmVhLgorICAgICAgICAvLy8gTnVsbCBpZiBubyBwcmludCBhcmVhIGlzIHNldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIFByaW50QXJlYSAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF93cy5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uUHJpbnRfQXJlYSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93cy5OYW1lc1siX3hsbm0uUHJpbnRfQXJlYSJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF93cy5OYW1lcy5SZW1vdmUoIl94bG5tLlByaW50X0FyZWEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3dzLk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5QcmludF9BcmVhIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfd3MuTmFtZXNbIl94bG5tLlByaW50X0FyZWEiXS5BZGRyZXNzID0gdmFsdWUuQWRkcmVzczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dzLk5hbWVzLkFkZCgiX3hsbm0uUHJpbnRfQXJlYSIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9ncmlkTGluZXNQYXRoID0gImQ6cHJpbnRPcHRpb25zL0BncmlkTGluZXMiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmludCBncmlkbGluZXMgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dHcmlkTGluZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9ncmlkTGluZXNQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfZ3JpZExpbmVzUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2hvcml6b250YWxDZW50ZXJlZFBhdGggPSAiZDpwcmludE9wdGlvbnMvQGhvcml6b250YWxDZW50ZXJlZCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvcml6b250YWwgY2VudGVyZWQgd2hlbiBwcmludGluZyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT53CisgICAgICAgIHB1YmxpYyBib29sIEhvcml6b250YWxDZW50ZXJlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2hvcml6b250YWxDZW50ZXJlZFBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9ob3Jpem9udGFsQ2VudGVyZWRQYXRoLCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfdmVydGljYWxDZW50ZXJlZFBhdGggPSAiZDpwcmludE9wdGlvbnMvQHZlcnRpY2FsQ2VudGVyZWQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWZXJ0aWNhbCBjZW50ZXJlZCB3aGVuIHByaW50aW5nIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBWZXJ0aWNhbENlbnRlcmVkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfdmVydGljYWxDZW50ZXJlZFBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF92ZXJ0aWNhbENlbnRlcmVkUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX3BhZ2VPcmRlclBhdGggPSAiZDpwYWdlU2V0dXAvQHBhZ2VPcmRlciI7ICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHByaW50ZWQgcGFnZSBvcmRlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZVBhZ2VPcmRlciBQYWdlT3JkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEdldFhtbE5vZGVTdHJpbmcoX3BhZ2VPcmRlclBhdGgpID09ICJvdmVyVGhlbkRvd24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQYWdlT3JkZXIuT3ZlclRoZW5Eb3duOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVBhZ2VPcmRlci5Eb3duVGhlbk92ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVQYWdlT3JkZXIuT3ZlclRoZW5Eb3duKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcGFnZU9yZGVyUGF0aCwgIm92ZXJUaGVuRG93biIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9wYWdlT3JkZXJQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9ibGFja0FuZFdoaXRlUGF0aCA9ICJkOnBhZ2VTZXR1cC9AYmxhY2tBbmRXaGl0ZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByaW50IGJsYWNrIGFuZCB3aGl0ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBCbGFja0FuZFdoaXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfYmxhY2tBbmRXaGl0ZVBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9ibGFja0FuZFdoaXRlUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2RyYWZ0UGF0aCA9ICJkOnBhZ2VTZXR1cC9AZHJhZnQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmludCBhIGRyYWZ0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERyYWZ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfZHJhZnRQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfZHJhZnRQYXRoLCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfcGFwZXJTaXplUGF0aCA9ICJkOnBhZ2VTZXR1cC9AcGFwZXJTaXplIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGFwZXIgc2l6ZSAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVQYXBlclNpemUgUGFwZXJTaXplIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IEdldFhtbE5vZGVTdHJpbmcoX3BhcGVyU2l6ZVBhdGgpOworICAgICAgICAgICAgICAgIGlmIChzICE9ICIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlUGFwZXJTaXplKWludC5QYXJzZShzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQYXBlclNpemUuTGV0dGVyOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9wYXBlclNpemVQYXRoLCAoKGludCl2YWx1ZSkuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsIG9yIG5vbmUgb2YgdGhlIG1hcmdpbiBhdHRyaWJ1dGVzIG11c3QgZXhpc3QuIENyZWF0ZSBhbGwgYXR0IG9uZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVNYXJnaW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9tYXJnaW5zQ3JlYXRlZD09ZmFsc2UgJiYgVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9sZWZ0TWFyZ2luUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX21hcmdpbnNDcmVhdGVkPXRydWU7CisgICAgICAgICAgICAgICAgTGVmdE1hcmdpbiA9IDAuNzA4N007CisgICAgICAgICAgICAgICAgUmlnaHRNYXJnaW4gPSAwLjcwODdNOworICAgICAgICAgICAgICAgIFRvcE1hcmdpbiA9IDAuNzQ4ME07CisgICAgICAgICAgICAgICAgQm90dG9tTWFyZ2luID0gMC43NDgwTTsKKyAgICAgICAgICAgICAgICBIZWFkZXJNYXJnaW4gPSAwLjMxNU07CisgICAgICAgICAgICAgICAgRm9vdGVyTWFyZ2luID0gMC4zMTVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2UuY3MgYi9FUFBsdXMvRXhjZWxQcm90ZWN0ZWRSYW5nZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTlkNDVjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2UuY3MKQEAgLTAsMCArMSwxOTQgQEAKK++7v3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5OwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWxnb3JpdGhtIGZvciBwYXNzd29yZCBoYXNoCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBlbnVtIGVQcm90ZWN0ZWRSYW5nZUFsZ29yaXRobQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIE1EMiBhbGdvcml0aG0sIGFzIGRlZmluZWQgYnkgUkZDIDEzMTksIHNoYWxsIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE1EMiwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIE1ENCBhbGdvcml0aG0sIGFzIGRlZmluZWQgYnkgUkZDIDEzMTksIHNoYWxsIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE1ENCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIE1ENSBhbGdvcml0aG0sIGFzIGRlZmluZWQgYnkgUkZDIDEzMTksIHNoYWxsIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE1ENSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIFJJUEVNRC0xMjggYWxnb3JpdGhtLCBhcyBkZWZpbmVkIGJ5IFJGQyAxMzE5LCBzaGFsbCBiZSB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSSVBFTUQxMjgsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSBSSVBFTUQtMTYwIGFsZ29yaXRobSwgYXMgZGVmaW5lZCBieSBJU08vSUVDMTAxMTgtMzoyMDA0IHNoYWxsIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFJJUEVNRDE2MCwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSBTSEEtMSBhbGdvcml0aG0sIGFzIGRlZmluZWQgYnkgSVNPL0lFQyAxMDExOC0zOjIwMDQgc2hhbGwgYmUgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU0hBMSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIFNIQS0yNTYgYWxnb3JpdGhtLCBhcyBkZWZpbmVkIGJ5IElTTy9JRUMxMDExOC0zOjIwMDQgc2hhbGwgYmUgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU0hBMjU2LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIFNIQS0zODQgYWxnb3JpdGhtLCBhcyBkZWZpbmVkIGJ5IElTTy9JRUMgMTAxMTgtMzoyMDA0IHNoYWxsIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNIQTM4NCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIFNIQS01MTIgYWxnb3JpdGhtLCBhcyBkZWZpbmVkIGJ5IElTTy9JRUMxMDExOC0zOjIwMDQgc2hhbGwgYmUgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU0hBNTEyLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIFdISVJMUE9PTCBhbGdvcml0aG0sIGFzIGRlZmluZWQgYnkgSVNPL0lFQyAxMDExOC0zOjIwMDQgc2hhbGwgYmUgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgV0hJUkxQT09MCisgICAgfQorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFByb3RlY3RlZFJhbmdlIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQWRkcmVzcyBfYWRkcmVzcz1udWxsOworICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzIEFkZHJlc3MgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihfYWRkcmVzcz09bnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzPW5ldyBFeGNlbEFkZHJlc3MoR2V0WG1sTm9kZVN0cmluZygiQHNxcmVmIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc3FyZWYiLCBTcVJlZlV0aWxpdHkuVG9TcVJlZkFkZHJlc3ModmFsdWUuQWRkcmVzcykpOworICAgICAgICAgICAgICAgIF9hZGRyZXNzPXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQcm90ZWN0ZWRSYW5nZShzdHJpbmcgbmFtZSwgRXhjZWxBZGRyZXNzIGFkZHJlc3MsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkgOgorICAgICAgICAgICAgYmFzZShucyx0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgICAgIEFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgdGhlIHBhc3N3b3JkIGZvciB0aGUgcmFuZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0UGFzc3dvcmQoc3RyaW5nIHBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnlQd2QgPSBFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKHBhc3N3b3JkKTsKKyAgICAgICAgICAgIHZhciBybmQgPSBSYW5kb21OdW1iZXJHZW5lcmF0b3IuQ3JlYXRlKCk7CisgICAgICAgICAgICB2YXIgYnlTYWx0PW5ldyBieXRlWzE2XTsKKyAgICAgICAgICAgIHJuZC5HZXRCeXRlcyhieVNhbHQpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL0RlZmF1bHQgU0hBNTEyIGFuZCAxMDAwMCBzcGlucworICAgICAgICAgICAgQWxnb3JpdGhtPWVQcm90ZWN0ZWRSYW5nZUFsZ29yaXRobS5TSEE1MTI7CisgICAgICAgICAgICBTcGluQ291bnQgPSBTcGluQ291bnQgPCAxMDAwMDAgPyAxMDAwMDAgOiBTcGluQ291bnQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQ29tYmluZSBzYWx0IGFuZCBwYXNzd29yZCBhbmQgY2FsY3VsYXRlIHRoZSBpbml0aWFsIGhhc2gKKyAgICAgICAgICAgIHZhciBocD1uZXcgU0hBNTEyQ3J5cHRvU2VydmljZVByb3ZpZGVyKCk7CisgICAgICAgICAgICB2YXIgYnVmZmVyPW5ldyBieXRlW2J5UHdkLkxlbmd0aCArIGJ5U2FsdC5MZW5ndGhdOworICAgICAgICAgICAgQXJyYXkuQ29weShieVNhbHQsIGJ1ZmZlciwgYnlTYWx0Lkxlbmd0aCk7CisgICAgICAgICAgICBBcnJheS5Db3B5KGJ5UHdkLCAwLCBidWZmZXIsIDE2LCBieVB3ZC5MZW5ndGgpOworICAgICAgICAgICAgdmFyIGhhc2ggPSBocC5Db21wdXRlSGFzaChidWZmZXIpOworCisgICAgICAgICAgICAvL05vdyBpdGVyYXRlIHRoZSBudW1iZXIgb2Ygc3Bpbm5zLgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTcGluQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXI9bmV3IGJ5dGVbaGFzaC5MZW5ndGgrNF07CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShoYXNoLCBidWZmZXIsIGhhc2guTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyhpKSwgMCwgYnVmZmVyLCBoYXNoLkxlbmd0aCwgNCk7CisgICAgICAgICAgICAgICAgaGFzaCA9IGhwLkNvbXB1dGVIYXNoKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTYWx0ID0gQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhieVNhbHQpOworICAgICAgICAgICAgSGFzaCA9IENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoaGFzaCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0cmluZyBTZWN1cml0eURlc2NyaXB0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBzZWN1cml0eURlc2NyaXB0b3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzZWN1cml0eURlc2NyaXB0b3IiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgU3BpbkNvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAc3BpbkNvdW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc3BpbkNvdW50Iix2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFNhbHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBzYWx0VmFsdWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzYWx0VmFsdWUiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEhhc2gKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBoYXNoVmFsdWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBoYXNoVmFsdWUiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgZVByb3RlY3RlZFJhbmdlQWxnb3JpdGhtIEFsZ29yaXRobQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdj1HZXRYbWxOb2RlU3RyaW5nKCJAYWxnb3JpdGhtTmFtZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAoZVByb3RlY3RlZFJhbmdlQWxnb3JpdGhtKUVudW0uUGFyc2UodHlwZW9mKGVQcm90ZWN0ZWRSYW5nZUFsZ29yaXRobSksIHYuUmVwbGFjZSgiLSIsICIiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYodi5TdGFydHNXaXRoKCJTSEEiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHY9di5JbnNlcnQoMywiLSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHYuU3RhcnRzV2l0aCgiUklQRU1EIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2PXYuSW5zZXJ0KDYsIi0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGFsZ29yaXRobU5hbWUiLCB2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9FeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uLmNzCkBAIC0wLDAgKzEsOTQgQEAKK++7v3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbDsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbiA6IFhtbEhlbHBlciwgSUVudW1lcmFibGU8RXhjZWxQcm90ZWN0ZWRSYW5nZT4KKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsV29ya3NoZWV0IHdzKQorICAgICAgICAgICAgOiBiYXNlKG5zbSwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBwcm90ZWN0ZWRSYW5nZU5vZGUgaW4gdG9wTm9kZS5TZWxlY3ROb2RlcygiZDpwcm90ZWN0ZWRSYW5nZXMvZDpwcm90ZWN0ZWRSYW5nZSIsIG5zbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCEocHJvdGVjdGVkUmFuZ2VOb2RlIGlzIFhtbEVsZW1lbnQpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBfYmFzZUxpc3QuQWRkKG5ldyBFeGNlbFByb3RlY3RlZFJhbmdlKHByb3RlY3RlZFJhbmdlTm9kZS5BdHRyaWJ1dGVzWyJuYW1lIl0uVmFsdWUsIG5ldyBFeGNlbEFkZHJlc3MoU3FSZWZVdGlsaXR5LkZyb21TcVJlZkFkZHJlc3MocHJvdGVjdGVkUmFuZ2VOb2RlLkF0dHJpYnV0ZXNbInNxcmVmIl0uVmFsdWUpKSwgbnNtLCB0b3BOb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIExpc3Q8RXhjZWxQcm90ZWN0ZWRSYW5nZT4gX2Jhc2VMaXN0ID0gbmV3IExpc3Q8RXhjZWxQcm90ZWN0ZWRSYW5nZT4oKTsKKworICAgICAgICBwdWJsaWMgRXhjZWxQcm90ZWN0ZWRSYW5nZSBBZGQoc3RyaW5nIG5hbWUsIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUV4aXN0Tm9kZSgiZDpwcm90ZWN0ZWRSYW5nZXMiKSkKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOnByb3RlY3RlZFJhbmdlcyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IENyZWF0ZU5vZGUoImQ6cHJvdGVjdGVkUmFuZ2VzL2Q6cHJvdGVjdGVkUmFuZ2UiKTsKKyAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsUHJvdGVjdGVkUmFuZ2UobmFtZSwgYWRkcmVzcywgYmFzZS5OYW1lU3BhY2VNYW5hZ2VyLCBuZXdOb2RlKTsKKyAgICAgICAgICAgIF9iYXNlTGlzdC5BZGQoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlTm9kZSgiZDpwcm90ZWN0ZWRSYW5nZXMiKTsKKyAgICAgICAgICAgIF9iYXNlTGlzdC5DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoRXhjZWxQcm90ZWN0ZWRSYW5nZSBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2Jhc2VMaXN0LkNvbnRhaW5zKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKEV4Y2VsUHJvdGVjdGVkUmFuZ2VbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iYXNlTGlzdC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2Jhc2VMaXN0LkNvdW50OyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoRXhjZWxQcm90ZWN0ZWRSYW5nZSBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBEZWxldGVBbGxOb2RlKCJkOnByb3RlY3RlZFJhbmdlcy9kOnByb3RlY3RlZFJhbmdlW0BuYW1lPSciICsgaXRlbS5OYW1lICsgIicgYW5kIEBzcXJlZj0nIiArIGl0ZW0uQWRkcmVzcy5BZGRyZXNzICsgIiddIik7CisgICAgICAgICAgICBpZiAoX2Jhc2VMaXN0LkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgiZDpwcm90ZWN0ZWRSYW5nZXMiKTsKKyAgICAgICAgICAgIHJldHVybiBfYmFzZUxpc3QuUmVtb3ZlKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBJbmRleE9mKEV4Y2VsUHJvdGVjdGVkUmFuZ2UgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9iYXNlTGlzdC5JbmRleE9mKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlQXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBfYmFzZUxpc3QuUmVtb3ZlQXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VsUHJvdGVjdGVkUmFuZ2UgdGhpc1tpbnQgaW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfYmFzZUxpc3RbaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8RXhjZWxQcm90ZWN0ZWRSYW5nZT4gSUVudW1lcmFibGU8RXhjZWxQcm90ZWN0ZWRSYW5nZT4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfYmFzZUxpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9iYXNlTGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxQcm90ZWN0aW9uLmNzIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlNjFlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGlvbi5jcwpAQCAtMCwwICsxLDExNSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgQWRkZWQJCTEwLUFVRy0yMDEwCisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRW5jcnlwdGlvbjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZXRzIHByb3RlY3Rpb24gb24gdGhlIHdvcmtib29rIGxldmVsCisgICAgLy8vPHNlZWFsc28gY3JlZj0iRXhjZWxFbmNyeXB0aW9uIi8+IAorICAgIC8vLzxzZWVhbHNvIGNyZWY9IkV4Y2VsU2hlZXRQcm90ZWN0aW9uIi8+IAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUHJvdGVjdGlvbiA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQcm90ZWN0aW9uKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxXb3JrYm9vayB3YikgOgorICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gd2IuU2NoZW1hTm9kZU9yZGVyOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyB3b3JrYm9va1Bhc3N3b3JkUGF0aCA9ICJkOndvcmtib29rUHJvdGVjdGlvbi9Ad29ya2Jvb2tQYXNzd29yZCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgYSBwYXNzd29yZCBmb3IgdGhlIHdvcmtib29rLiBUaGlzIGRvZXMgbm90IGVuY3J5cHQgdGhlIHdvcmtib29rLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQYXNzd29yZCI+VGhlIHBhc3N3b3JkLiA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRQYXNzd29yZChzdHJpbmcgUGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KFBhc3N3b3JkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWxldGVOb2RlKHdvcmtib29rUGFzc3dvcmRQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHdvcmtib29rUGFzc3dvcmRQYXRoLCAoKGludClFbmNyeXB0ZWRQYWNrYWdlSGFuZGxlci5DYWxjdWxhdGVQYXNzd29yZEhhc2goUGFzc3dvcmQpKS5Ub1N0cmluZygieCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgbG9ja1N0cnVjdHVyZVBhdGggPSAiZDp3b3JrYm9va1Byb3RlY3Rpb24vQGxvY2tTdHJ1Y3R1cmUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb2NrcyB0aGUgc3RydWN0dXJlLHdoaWNoIHByZXZlbnRzIHVzZXJzIGZyb20gYWRkaW5nIG9yIGRlbGV0aW5nIHdvcmtzaGVldHMgb3IgZnJvbSBkaXNwbGF5aW5nIGhpZGRlbiB3b3Jrc2hlZXRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBMb2NrU3RydWN0dXJlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChsb2NrU3RydWN0dXJlUGF0aCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2wobG9ja1N0cnVjdHVyZVBhdGgsIHZhbHVlLCAgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBsb2NrV2luZG93c1BhdGggPSAiZDp3b3JrYm9va1Byb3RlY3Rpb24vQGxvY2tXaW5kb3dzIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9ja3MgdGhlIHBvc2l0aW9uIG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIExvY2tXaW5kb3dzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChsb2NrV2luZG93c1BhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKGxvY2tXaW5kb3dzUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgbG9ja1JldmlzaW9uUGF0aCA9ICJkOndvcmtib29rUHJvdGVjdGlvbi9AbG9ja1JldmlzaW9uIjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb2NrIHRoZSB3b3JrYm9vayBmb3IgcmV2aXNpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgTG9ja1JldmlzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChsb2NrUmV2aXNpb25QYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChsb2NrUmV2aXNpb25QYXRoLCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsUmFuZ2UuY3MgYi9FUFBsdXMvRXhjZWxSYW5nZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk2YzlkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsUmFuZ2UuY3MKQEAgLTAsMCArMSwxNjcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwordXNpbmcgU3lzdGVtLkRhdGE7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSByYW5nZSBvZiBjZWxscy4gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxSYW5nZSA6IEV4Y2VsUmFuZ2VCYXNlCisgICAgeworICAgICAgICAjcmVnaW9uICJDb25zdHJ1Y3RvcnMiCisgICAgICAgIGludGVybmFsIEV4Y2VsUmFuZ2UoRXhjZWxXb3Jrc2hlZXQgc2hlZXQpIDogCisgICAgICAgICAgICBiYXNlKHNoZWV0KQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFJhbmdlKEV4Y2VsV29ya3NoZWV0IHNoZWV0LCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgICAgIDogYmFzZShzaGVldCwgYWRkcmVzcykKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxSYW5nZShFeGNlbFdvcmtzaGVldCBzaGVldCwgaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbCkKKyAgICAgICAgICAgIDogYmFzZShzaGVldCkKKyAgICAgICAgeworICAgICAgICAgICAgX2Zyb21Sb3cgPSBmcm9tUm93OworICAgICAgICAgICAgX2Zyb21Db2wgPSBmcm9tQ29sOworICAgICAgICAgICAgX3RvUm93ID0gdG9Sb3c7CisgICAgICAgICAgICBfdG9Db2wgPSB0b0NvbDsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gIkluZGV4ZXJzIgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBY2Nlc3MgdGhlIHJhbmdlIHVzaW5nIGFuIGFkZHJlc3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJBZGRyZXNzIj5UaGUgYWRkcmVzczwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5BIHJhbmdlIG9iamVjdDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsUmFuZ2UgdGhpc1tzdHJpbmcgQWRkcmVzc10KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuTmFtZXMuQ29udGFpbnNLZXkoQWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3dvcmtzaGVldC5OYW1lc1tBZGRyZXNzXS5Jc05hbWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS5BZGRyZXNzID0gX3dvcmtzaGVldC5OYW1lc1tBZGRyZXNzXS5BZGRyZXNzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuQWRkcmVzcyA9IEFkZHJlc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFJhbmdlIEdldFRhYmxlQWRkZXNzKEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaXhTdGFydCA9IGFkZHJlc3MuSW5kZXhPZignWycpOworICAgICAgICAgICAgaWYgKGl4U3RhcnQgPT0gMCkgLy9FeHRlcm5hbCBBZGRyZXNzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGl4RW5kID0gYWRkcmVzcy5JbmRleE9mKCddJyxpeFN0YXJ0KzEpOworICAgICAgICAgICAgICAgIGlmIChpeFN0YXJ0ID49IDAgJiBpeEVuZCA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVybmFsID0gYWRkcmVzcy5TdWJzdHJpbmcoaXhTdGFydCArIDEsIGl4RW5kIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKFdvcmtzaGVldC5Xb3JrYm9vay5fZXh0ZXJuYWxSZWZlcmVuY2VzLkNvdW50IDwgZXh0ZXJuYWwpCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvL2ZvcmVhY2godmFyIAorICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBY2Nlc3MgYSBzaW5nbGUgY2VsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+VGhlIHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sIj5UaGUgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgcmFuZ2Ugb2JqZWN0PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxSYW5nZSB0aGlzW2ludCBSb3csIGludCBDb2xdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbGlkYXRlUm93Q29sKFJvdywgQ29sKTsKKworICAgICAgICAgICAgICAgIF9mcm9tQ29sID0gQ29sOworICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gUm93OworICAgICAgICAgICAgICAgIF90b0NvbCA9IENvbDsKKyAgICAgICAgICAgICAgICBfdG9Sb3cgPSBSb3c7CisgICAgICAgICAgICAgICAgYmFzZS5BZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFjY2VzcyBhIHJhbmdlIG9mIGNlbGxzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRnJvbVJvdyI+U3RhcnQgcm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tQ29sIj5TdGFydCBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlRvUm93Ij5FbmQgUm93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb0NvbCI+RW5kIENvbHVtbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlIHRoaXNbaW50IEZyb21Sb3csIGludCBGcm9tQ29sLCBpbnQgVG9Sb3csIGludCBUb0NvbF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsaWRhdGVSb3dDb2woRnJvbVJvdywgRnJvbUNvbCk7CisgICAgICAgICAgICAgICAgVmFsaWRhdGVSb3dDb2woVG9Sb3csIFRvQ29sKTsKKworICAgICAgICAgICAgICAgIF9mcm9tQ29sID0gRnJvbUNvbDsKKyAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IEZyb21Sb3c7CisgICAgICAgICAgICAgICAgX3RvQ29sID0gVG9Db2w7CisgICAgICAgICAgICAgICAgX3RvUm93ID0gVG9Sb3c7CisgICAgICAgICAgICAgICAgYmFzZS5BZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVmFsaWRhdGVSb3dDb2woaW50IFJvdywgaW50IENvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJvdyA8IDEgfHwgUm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUm93IG91dCBvZiByYW5nZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChDb2wgPCAxIHx8IENvbCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNvbHVtbiBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFJhbmdlQmFzZS5jcyBiL0VQUGx1cy9FeGNlbFJhbmdlQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWYyMDZjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsUmFuZ2VCYXNlLmNzCkBAIC0wLDAgKzEsMjg4NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDEtMjgKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKiBFeWFsIFNlYWd1bGwJCSAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nICAgICAgMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRhdGE7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHk7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sJCisgICAgLy8vIDxzdW1tYXJ5PgorCS8vLyBBIHJhbmdlIG9mIGNlbGxzIAorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEV4Y2VsUmFuZ2VCYXNlIDogRXhjZWxBZGRyZXNzLCBJRXhjZWxDZWxsLCBJRGlzcG9zYWJsZSwgSUVudW1lcmFibGU8RXhjZWxSYW5nZUJhc2U+LCBJRW51bWVyYXRvcjxFeGNlbFJhbmdlQmFzZT4KKwl7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJlZmVyZW5jZSB0byB0aGUgd29ya3NoZWV0CisJCS8vLyA8L3N1bW1hcnk+CisJCXByb3RlY3RlZCBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCQlpbnRlcm5hbCBFeGNlbFdvcmtib29rIF93b3JrYm9vayA9IG51bGw7CisJCXByaXZhdGUgZGVsZWdhdGUgdm9pZCBfY2hhbmdlUHJvcChfc2V0VmFsdWUgbWV0aG9kLCBvYmplY3QgdmFsdWUpOworCQlwcml2YXRlIGRlbGVnYXRlIHZvaWQgX3NldFZhbHVlKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCk7CisJCXByaXZhdGUgX2NoYW5nZVByb3AgX2NoYW5nZVByb3BNZXRob2Q7CisJCXByaXZhdGUgaW50IF9zdHlsZUlEOworICAgICAgICBwcml2YXRlIGNsYXNzIENvcGllZENlbGwKKyAgICAgICAgeworICAgICAgICAgICAgaW50ZXJuYWwgaW50IFJvdyB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBpbnQgQ29sdW1uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIG9iamVjdCBWYWx1ZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBzdHJpbmcgVHlwZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBvYmplY3QgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBpbnQ/IFN0eWxlSUQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgVXJpIEh5cGVyTGluayB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBFeGNlbENvbW1lbnQgQ29tbWVudCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBCeXRlIEZsYWcgeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisgICAgICAgIC8vcHJpdmF0ZSBjbGFzcyBDb3BpZWRGbGFnCisgICAgICAgIC8veworICAgICAgICAvLyAgICBpbnRlcm5hbCBpbnQgUm93IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8gICAgaW50ZXJuYWwgaW50IENvbHVtbiB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vICAgIGludGVybmFsIEJ5dGUgRmxhZyB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vfQorICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycworCQlpbnRlcm5hbCBFeGNlbFJhbmdlQmFzZShFeGNlbFdvcmtzaGVldCB4bFdvcmtzaGVldCkKKwkJeworCQkJX3dvcmtzaGVldCA9IHhsV29ya3NoZWV0OworCQkJX3dzID0gX3dvcmtzaGVldC5OYW1lOworICAgICAgICAgICAgX3dvcmtib29rID0gX3dvcmtzaGVldC5Xb3JrYm9vazsKKyAgICAgICAgICAgIHRoaXMuQWRkcmVzc0NoYW5nZSArPSBuZXcgRXZlbnRIYW5kbGVyKEV4Y2VsUmFuZ2VCYXNlX0FkZHJlc3NDaGFuZ2UpOworCQkJU2V0RGVsZWdhdGUoKTsKKwkJfQorCisgICAgICAgIHZvaWQgRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZShvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFRhYmxlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0UkNGcm9tVGFibGUoX3dvcmtib29rLl9wYWNrYWdlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNldERlbGVnYXRlKCk7CisgICAgICAgIH0KKwkJaW50ZXJuYWwgRXhjZWxSYW5nZUJhc2UoRXhjZWxXb3Jrc2hlZXQgeGxXb3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzKSA6CisJCQliYXNlKHhsV29ya3NoZWV0ID09IG51bGwgPyAiIiA6IHhsV29ya3NoZWV0Lk5hbWUsIGFkZHJlc3MpCisJCXsKKwkJCV93b3Jrc2hlZXQgPSB4bFdvcmtzaGVldDsKKyAgICAgICAgICAgIF93b3JrYm9vayA9IF93b3Jrc2hlZXQuV29ya2Jvb2s7CisgICAgICAgICAgICBiYXNlLlNldFJDRnJvbVRhYmxlKF93b3Jrc2hlZXQuX3BhY2thZ2UsIG51bGwpOworCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykpIF93cyA9IF93b3Jrc2hlZXQgPT0gbnVsbCA/ICIiIDogX3dvcmtzaGVldC5OYW1lOworICAgICAgICAgICAgdGhpcy5BZGRyZXNzQ2hhbmdlICs9IG5ldyBFdmVudEhhbmRsZXIoRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZSk7CisgICAgICAgICAgICBTZXREZWxlZ2F0ZSgpOworCQl9CisJCWludGVybmFsIEV4Y2VsUmFuZ2VCYXNlKEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgYm9vbCBpc05hbWUpIDoKKwkJCWJhc2UoeGxXb3Jrc2hlZXQgPT0gbnVsbCA/ICIiIDogeGxXb3Jrc2hlZXQuTmFtZSwgYWRkcmVzcywgaXNOYW1lKQorCQl7CisgICAgICAgICAgICBTZXRSQ0Zyb21UYWJsZSh3Yi5fcGFja2FnZSwgbnVsbCk7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0geGxXb3Jrc2hlZXQ7CisJCQlfd29ya2Jvb2sgPSB3YjsKKwkJCWlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSAoeGxXb3Jrc2hlZXQgPT0gbnVsbCA/IG51bGwgOiB4bFdvcmtzaGVldC5OYW1lKTsKKyAgICAgICAgICAgIHRoaXMuQWRkcmVzc0NoYW5nZSArPSBuZXcgRXZlbnRIYW5kbGVyKEV4Y2VsUmFuZ2VCYXNlX0FkZHJlc3NDaGFuZ2UpOworICAgICAgICAgICAgU2V0RGVsZWdhdGUoKTsKKwkJfQorICAgICAgICB+RXhjZWxSYW5nZUJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLkFkZHJlc3NDaGFuZ2UgLT0gbmV3IEV2ZW50SGFuZGxlcihFeGNlbFJhbmdlQmFzZV9BZGRyZXNzQ2hhbmdlKTsKKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gU2V0IFZhbHVlIERlbGVnYXRlcworICAgICAgICBwcml2YXRlIHZvaWQgU2V0RGVsZWdhdGUoKQorCQl7CisJCQlpZiAoX2Zyb21Sb3cgPT0gLTEpCisJCQl7CisJCQkJX2NoYW5nZVByb3BNZXRob2QgPSBTZXRVbmtub3duOworCQkJfQorCQkJLy9TaW5nbGUgY2VsbAorCQkJZWxzZSBpZiAoX2Zyb21Sb3cgPT0gX3RvUm93ICYmIF9mcm9tQ29sID09IF90b0NvbCAmJiBBZGRyZXNzZXMgPT0gbnVsbCkKKwkJCXsKKwkJCQlfY2hhbmdlUHJvcE1ldGhvZCA9IFNldFNpbmdsZTsKKwkJCX0KKwkJCS8vUmFuZ2UgKGV4IEExOkEyKQorCQkJZWxzZSBpZiAoQWRkcmVzc2VzID09IG51bGwpCisJCQl7CisJCQkJX2NoYW5nZVByb3BNZXRob2QgPSBTZXRSYW5nZTsKKwkJCX0KKwkJCS8vTXVsdGkgUmFuZ2UgKGV4IEExOkEyLEMxOkMyKQorCQkJZWxzZQorCQkJeworCQkJCV9jaGFuZ2VQcm9wTWV0aG9kID0gU2V0TXVsdGlSYW5nZTsKKwkJCX0KKwkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBXZSBkb250IGtub3cgdGhlIGFkZHJlc3MgeWV0LiBTZXQgdGhlIGRlbGVnYXRlIGZpcnN0IHRpbWUgYSBwcm9wZXJ0eSBpcyBzZXQuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0idmFsdWVNZXRob2QiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisJCXByaXZhdGUgdm9pZCBTZXRVbmtub3duKF9zZXRWYWx1ZSB2YWx1ZU1ldGhvZCwgb2JqZWN0IHZhbHVlKQorCQl7CisJCQkvL0FkZHJlc3MgaXMgbm90IHNldCB1c2UsIHNlbGVjdGVkIHJhbmdlCisJCQlpZiAoX2Zyb21Sb3cgPT0gLTEpCisJCQl7CisJCQkJU2V0VG9TZWxlY3RlZFJhbmdlKCk7CisJCQl9CisJCQlTZXREZWxlZ2F0ZSgpOworCQkJX2NoYW5nZVByb3BNZXRob2QodmFsdWVNZXRob2QsIHZhbHVlKTsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTZXQgYSBzaW5nbGUgY2VsbAorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlTWV0aG9kIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorCQlwcml2YXRlIHZvaWQgU2V0U2luZ2xlKF9zZXRWYWx1ZSB2YWx1ZU1ldGhvZCwgb2JqZWN0IHZhbHVlKQorCQl7CisJCQl2YWx1ZU1ldGhvZCh2YWx1ZSwgX2Zyb21Sb3csIF9mcm9tQ29sKTsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTZXQgYSByYW5nZQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlTWV0aG9kIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorCQlwcml2YXRlIHZvaWQgU2V0UmFuZ2UoX3NldFZhbHVlIHZhbHVlTWV0aG9kLCBvYmplY3QgdmFsdWUpCisJCXsKKwkJCVNldFZhbHVlQWRkcmVzcyh0aGlzLCB2YWx1ZU1ldGhvZCwgdmFsdWUpOworCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFNldCBhIG11bHRpcmFuZ2UgKEExOkEyLEMxOkMyKQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlTWV0aG9kIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorCQlwcml2YXRlIHZvaWQgU2V0TXVsdGlSYW5nZShfc2V0VmFsdWUgdmFsdWVNZXRob2QsIG9iamVjdCB2YWx1ZSkKKwkJeworCQkJU2V0VmFsdWVBZGRyZXNzKHRoaXMsIHZhbHVlTWV0aG9kLCB2YWx1ZSk7CisJCQlmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpCisJCQl7CisJCQkJU2V0VmFsdWVBZGRyZXNzKGFkZHJlc3MsIHZhbHVlTWV0aG9kLCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gU2V0IHRoZSBwcm9wZXJ0eSBmb3IgYW4gYWRkcmVzcworCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idmFsdWVNZXRob2QiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisJCXByaXZhdGUgdm9pZCBTZXRWYWx1ZUFkZHJlc3MoRXhjZWxBZGRyZXNzIGFkZHJlc3MsIF9zZXRWYWx1ZSB2YWx1ZU1ldGhvZCwgb2JqZWN0IHZhbHVlKQorCQl7CisJCQlJc1JhbmdlVmFsaWQoIiIpOworCQkJaWYgKF9mcm9tUm93ID09IDEgJiYgX2Zyb21Db2wgPT0gMSAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgX3RvQ29sID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSAgLy9GdWxsIHNoZWV0IChleCB3cy5DZWxscy5WYWx1ZT0wKS4gU2V0IHZhbHVlIGZvciBBMSBvbmx5IHRvIGF2b2lkIGhhbmdpbmcgCisJCQl7CisJCQkJdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcmVmZXJlbmNlIGFsbCBjZWxscy4gUGxlYXNlIHVzZSB0aGUgaW5kZXhlciB0byBzZXQgdGhlIHJhbmdlIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaW50IGNvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uOyBjb2wgPD0gYWRkcmVzcy5FbmQuQ29sdW1uOyBjb2wrKykKKwkJCQl7CisJCQkJCWZvciAoaW50IHJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3cgPD0gYWRkcmVzcy5FbmQuUm93OyByb3crKykKKwkJCQkJeworCQkJCQkJdmFsdWVNZXRob2QodmFsdWUsIHJvdywgY29sKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gU2V0IHByb3BlcnR5IG1ldGhvZHMKKwkJcHJpdmF0ZSB2b2lkIFNldF9TdHlsZUlEKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKKwkJeworICAgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCAoaW50KXZhbHVlKTsKKwkJfQorCQlwcml2YXRlIHZvaWQgU2V0X1N0eWxlTmFtZShvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpCisJCXsKKwkJCS8vX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKS5TZXROZXdTdHlsZU5hbWUodmFsdWUuVG9TdHJpbmcoKSwgX3N0eWxlSUQpOworICAgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCBfc3R5bGVJRCk7CisJCX0KKwkJcHJpdmF0ZSB2b2lkIFNldF9WYWx1ZShvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpCisJCXsKKwkJCS8vRXhjZWxDZWxsIGMgPSBfd29ya3NoZWV0LkNlbGwocm93LCBjb2wpOworICAgICAgICAgICAgdmFyIHNmaSA9IF93b3Jrc2hlZXQuX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgIGlmIChzZmkgaXMgaW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNwbGl0Rm9ybXVsYXMoX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbF0pOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZmkgIT0gbnVsbCkgX3dvcmtzaGVldC5fZm9ybXVsYXMuU2V0VmFsdWUocm93LCBjb2wsIHN0cmluZy5FbXB0eSk7CisJCQlfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHZhbHVlKTsKKwkJfQorCQlwcml2YXRlIHZvaWQgU2V0X0Zvcm11bGEob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQorCQl7CisJCQkvL0V4Y2VsQ2VsbCBjID0gX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKTsKKyAgICAgICAgICAgIHZhciBmID0gX3dvcmtzaGVldC5fZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgICAgICAgICAgaWYgKGYgaXMgaW50ICYmIChpbnQpZiA+PSAwKSBTcGxpdEZvcm11bGFzKF93b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2xdKTsKKworCQkJc3RyaW5nIGZvcm11bGEgPSAodmFsdWUgPT0gbnVsbCA/IHN0cmluZy5FbXB0eSA6IHZhbHVlLlRvU3RyaW5nKCkpOworCQkJaWYgKGZvcm11bGEgPT0gc3RyaW5nLkVtcHR5KQorCQkJeworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBzdHJpbmcuRW1wdHkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChmb3JtdWxhWzBdID09ICc9JykgdmFsdWUgPSBmb3JtdWxhLlN1YnN0cmluZygxLCBmb3JtdWxhLkxlbmd0aCAtIDEpOyAvLyByZW1vdmUgYW55IHN0YXJ0aW5nIGVxdWFsc2lnbi4KKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgZm9ybXVsYSk7CisgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBudWxsKTsKKyAgICAgICAgICAgIH0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBIYW5kbGVzIHNoYXJlZCBmb3JtdWxhcworCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgIGZvcm11bGE8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzIG9mIHRoZSBmb3JtdWxhPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJJc0FycmF5Ij5JZiB0aGUgZm9ydW1sYSBpcyBhbiBhcnJheSBmb3JtdWxhLjwvcGFyYW0+CisJCXByaXZhdGUgdm9pZCBTZXRfU2hhcmVkRm9ybXVsYShzdHJpbmcgdmFsdWUsIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLCBib29sIElzQXJyYXkpCisJCXsKKwkJCWlmIChfZnJvbVJvdyA9PSAxICYmIF9mcm9tQ29sID09IDEgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgIC8vRnVsbCBzaGVldCAoZXggd3MuQ2VsbHMuVmFsdWU9MCkuIFNldCB2YWx1ZSBmb3IgQTEgb25seSB0byBhdm9pZCBoYW5naW5nIAorCQkJeworCQkJCXRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGEgZm9ybXVsYSBmb3IgdGhlIGVudGlyZSB3b3Jrc2hlZXQiKSk7CisJCQl9CisJCQllbHNlIGlmIChhZGRyZXNzLlN0YXJ0LlJvdyA9PSBhZGRyZXNzLkVuZC5Sb3cgJiYgYWRkcmVzcy5TdGFydC5Db2x1bW4gPT0gYWRkcmVzcy5FbmQuQ29sdW1uICYmICFJc0FycmF5KSAgICAgICAgICAgICAvL2lzIGl0IHJlYWxseSBhIHNoYXJlZCBmb3JtdWxhPyBBcnJheWZvcm11bGFzIGNhbiBiZSBvbmUgY2VsbCBvbmx5CisJCQl7CisJCQkJLy9Ob3BlLCBzaW5nbGUgY2VsbC4gU2V0IHRoZSBmb3JtdWxhCisJCQkJU2V0X0Zvcm11bGEodmFsdWUsIGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy9SZW1vdmVGb3JtdWxzKGFkZHJlc3MpOworCQkJQ2hlY2tBbmRTcGxpdFNoYXJlZEZvcm11bGEoYWRkcmVzcyk7CisJCQlFeGNlbFdvcmtzaGVldC5Gb3JtdWxhcyBmID0gbmV3IEV4Y2VsV29ya3NoZWV0LkZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7CisJCQlmLkZvcm11bGEgPSB2YWx1ZTsKKwkJCWYuSW5kZXggPSBfd29ya3NoZWV0LkdldE1heFNoYXJlRnVuY3Rpb25JbmRleChJc0FycmF5KTsKKwkJCWYuQWRkcmVzcyA9IGFkZHJlc3MuRmlyc3RBZGRyZXNzOworCQkJZi5TdGFydENvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uOworCQkJZi5TdGFydFJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OworCQkJZi5Jc0FycmF5ID0gSXNBcnJheTsKKworCQkJX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuQWRkKGYuSW5kZXgsIGYpOworICAgICAgICAgICAgLy9fd29ya3NoZWV0LkNlbGwoYWRkcmVzcy5TdGFydC5Sb3csIGFkZHJlc3MuU3RhcnQuQ29sdW1uKS5TaGFyZWRGb3JtdWxhSUQgPSBmLkluZGV4OworICAgICAgICAgICAgLy9fd29ya3NoZWV0LkNlbGwoYWRkcmVzcy5TdGFydC5Sb3csIGFkZHJlc3MuU3RhcnQuQ29sdW1uKS5Gb3JtdWxhID0gdmFsdWU7CisKKwkJCWZvciAoaW50IGNvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uOyBjb2wgPD0gYWRkcmVzcy5FbmQuQ29sdW1uOyBjb2wrKykKKwkJCXsKKwkJCQlmb3IgKGludCByb3cgPSBhZGRyZXNzLlN0YXJ0LlJvdzsgcm93IDw9IGFkZHJlc3MuRW5kLlJvdzsgcm93KyspCisJCQkJeworCQkJCQkvL193b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuU2hhcmVkRm9ybXVsYUlEID0gZi5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fZm9ybXVsYXMuU2V0VmFsdWUocm93LCBjb2wsIGYuSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIG51bGwpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcml2YXRlIHZvaWQgU2V0X0h5cGVyTGluayhvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpCisJCXsKKwkJCS8vX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKS5IeXBlcmxpbmsgPSB2YWx1ZSBhcyBVcmk7CisgICAgICAgICAgICBpZiAodmFsdWUgaXMgVXJpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX2h5cGVyTGlua3MuU2V0VmFsdWUocm93LCBjb2wsIChVcmkpdmFsdWUpOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGlzIEV4Y2VsSHlwZXJMaW5rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCAoKEV4Y2VsSHlwZXJMaW5rKXZhbHVlKS5EaXNwbGF5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsICgoVXJpKXZhbHVlKS5PcmlnaW5hbFN0cmluZyk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5faHlwZXJMaW5rcy5TZXRWYWx1ZShyb3csIGNvbCwgKFVyaSludWxsKTsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIChVcmkpbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJcHJpdmF0ZSB2b2lkIFNldF9Jc1JpY2hUZXh0KG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKKwkJeworCQkJLy9fd29ya3NoZWV0LkNlbGwocm93LCBjb2wpLklzUmljaFRleHQgPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuX2ZsYWdzLlNldEZsYWdWYWx1ZShyb3csIGNvbCwgKGJvb2wpdmFsdWUsIENlbGxGbGFncy5SaWNoVGV4dCk7CisJCX0KKwkJcHJpdmF0ZSB2b2lkIEV4aXN0c19Db21tZW50KG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKKwkJeworCQkJdWxvbmcgY2VsbElEID0gR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgcm93LCBjb2wpOworCQkJaWYgKF93b3Jrc2hlZXQuQ29tbWVudHMuX2NvbW1lbnRzLkNvbnRhaW5zS2V5KGNlbGxJRCkpCisJCQl7CisJCQkJdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkNlbGwgezB9IGFscmVhZHkgY29udGFpbiBhIGNvbW1lbnQuIiwgbmV3IEV4Y2VsQ2VsbEFkZHJlc3Mocm93LCBjb2wpLkFkZHJlc3MpKSk7CisJCQl9CisKKwkJfQorCQlwcml2YXRlIHZvaWQgU2V0X0NvbW1lbnQob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQorCQl7CisJCQlzdHJpbmdbXSB2ID0gKHN0cmluZ1tdKXZhbHVlOworCQkJV29ya3NoZWV0LkNvbW1lbnRzLkFkZChuZXcgRXhjZWxSYW5nZUJhc2UoX3dvcmtzaGVldCwgR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpKSwgdlswXSwgdlsxXSk7CisJCQkvLyAgIF93b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuQ29tbWVudCA9IGNvbW1lbnQ7CisJCX0KKwkJI2VuZHJlZ2lvbgorCQlwcml2YXRlIHZvaWQgU2V0VG9TZWxlY3RlZFJhbmdlKCkKKwkJeworCQkJaWYgKF93b3Jrc2hlZXQuVmlldy5TZWxlY3RlZFJhbmdlID09ICIiKQorCQkJeworCQkJCUFkZHJlc3MgPSAiQTEiOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFkZHJlc3MgPSBfd29ya3NoZWV0LlZpZXcuU2VsZWN0ZWRSYW5nZTsKKwkJCX0KKwkJfQorCQlwcml2YXRlIHZvaWQgSXNSYW5nZVZhbGlkKHN0cmluZyB0eXBlKQorCQl7CisJCQlpZiAoX2Zyb21Sb3cgPD0gMCkKKwkJCXsKKwkJCQlpZiAoX2FkZHJlc3MgPT0gIiIpCisJCQkJeworCQkJCQlTZXRUb1NlbGVjdGVkUmFuZ2UoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKHR5cGUgPT0gIiIpCisJCQkJCXsKKwkJCQkJCXRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJSYW5nZSBpcyBub3QgdmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uOiB7MH0iLCBfYWRkcmVzcykpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJSYW5nZSBpcyBub3QgdmFsaWQgZm9yIHswfSA6IHsxfSIsIHR5cGUsIF9hZGRyZXNzKSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gVGhlIHN0eWxlb2JqZWN0IGZvciB0aGUgcmFuZ2UuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBFeGNlbFN0eWxlIFN0eWxlCisJCXsKKwkJCWdldAorCQkJeworCQkJCUlzUmFuZ2VWYWxpZCgic3R5bGluZyIpOworICAgICAgICAgICAgICAgIGludCBzPTA7CisgICAgICAgICAgICAgICAgaWYoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csX2Zyb21Db2wsIHJlZiBzKSkgLy9DZWxsIGV4aXN0cworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csMCwgcmVmIHMpKSAvL05vLCBjaGVjayBSb3cgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBXb3Jrc2hlZXQuR2V0Q29sdW1uKF9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGMuU3R5bGVJRDsgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJCQlyZXR1cm4gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVPYmplY3QocywgX3dvcmtzaGVldC5Qb3NpdGlvbklELCBBZGRyZXNzKTsKKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBUaGUgbmFtZWQgc3R5bGUKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBTdHlsZU5hbWUKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJSXNSYW5nZVZhbGlkKCJzdHlsaW5nIik7CisJCQkJaW50ICB4ZklkOworICAgICAgICAgICAgICAgIGlmIChfZnJvbVJvdyA9PSAxICYmIF90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhmSWQ9R2V0Q29sdW1uU3R5bGUoX2Zyb21Db2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfZnJvbUNvbCA9PSAxICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhmSWQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csIDAsIHJlZiB4ZklkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeGZJZCA9IEdldENvbHVtblN0eWxlKF9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4ZklkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csIF9mcm9tQ29sLCByZWYgeGZJZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHhmSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmSWQgPSBHZXRDb2x1bW5TdHlsZShfZnJvbUNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5zSUQ7CisgICAgICAgICAgICAgICAgaWYgKHhmSWQgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5zSUQ9U3R5bGUuU3R5bGVzLkNlbGxYZnNbMF0uWGZJZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnNJRD1TdHlsZS5TdHlsZXMuQ2VsbFhmc1t4ZklkXS5YZklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbnMgaW4gU3R5bGUuU3R5bGVzLk5hbWVkU3R5bGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5zLlN0eWxlWGZJZCA9PSBuc0lEKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnMuTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisJCQl9CisJCQlzZXQKKwkJCXsKKwkJCQlfc3R5bGVJRCA9IF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzLkdldFN0eWxlSWRGcm9tTmFtZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaW50IGNvbCA9IF9mcm9tQ29sOworICAgICAgICAgICAgICAgIGlmIChfZnJvbVJvdyA9PSAxICYmIF90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykgICAgLy9GdWxsIGNvbHVtbgorCQkJCXsKKwkJCQkJRXhjZWxDb2x1bW4gY29sdW1uOworCQkJCQkvL0dldCB0aGUgc3RhcnRjb2x1bW4KKwkJCQkJLy91bG9uZyBjb2xJRCA9IEV4Y2VsQ29sdW1uLkdldENvbHVtbklEKF93b3Jrc2hlZXQuU2hlZXRJRCwgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBfd29ya3NoZWV0LkdldFZhbHVlKDAsIF9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGM9PW51bGwpCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IF93b3Jrc2hlZXQuQ29sdW1uKF9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKF93b3Jrc2hlZXQuX3ZhbHVlcy5QcmV2Q2VsbChyZWYgcm93LCByZWYgY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyIHByZXZDb2wgPSAoRXhjZWxDb2x1bW4pX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbHVtbiA9IHByZXZDb2wuQ2xvbmUoX3dvcmtzaGVldCwgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHByZXZDb2wuQ29sdW1uTWF4ID0gY29sdW1uIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gKEV4Y2VsQ29sdW1uKWM7CisJCQkJCX0KKworICAgICAgICAgICAgICAgICAgICBjb2x1bW4uU3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5TdHlsZUlEID0gX3N0eWxlSUQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy92YXIgaW5kZXggPSBfd29ya3NoZWV0Ll9jb2x1bW5zLkluZGV4T2YoY29sSUQpOworICAgICAgICAgICAgICAgICAgICB2YXIgY29scyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgMCwgX2Zyb21Db2wgKyAxLCAwLCBfdG9Db2wpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29scy5OZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IF9mcm9tQ29sOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbHVtbi5Db2x1bW5NaW4gPD0gX3RvQ29sKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uTWF4ID4gX3RvQ29sKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29weUNvbHVtbihjb2x1bW4sIF90b0NvbCArIDEsIGNvbHVtbi5Db2x1bW5NYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gX3RvQ29sOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fc3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLlN0eWxlSUQgPSBfc3R5bGVJRDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xzLlZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRDb2wgPSAoRXhjZWxDb2x1bW4pY29scy5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sdW1uLkNvbHVtbk1heCA8IG5leHRDb2wuQ29sdW1uTWF4LTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5Db2x1bW5NYXggPSBuZXh0Q29sLkNvbHVtbk1heCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gbmV4dENvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scy5OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uTWF4IDwgX3RvQ29sKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gX3RvQ29sOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKGNvbHVtbi5Db2x1bW5NaW4gPT0gY29sdW1uKQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgY29sdW1uLkNvbHVtbk1heCA9IF90b0NvbDsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgICAgIC8vZWxzZSBpZiAoY29sdW1uLl9jb2x1bW5NYXggPCBfdG9Db2wpCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXIgbmV3Q29sID0gX3dvcmtzaGVldC5Db2x1bW4oY29sdW1uLl9jb2x1bW5NYXggKyAxKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbmV3Q29sLl9jb2x1bW5NYXggPSBfdG9Db2w7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbmV3Q29sLl9zdHlsZUlEID0gX3N0eWxlSUQ7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG5ld0NvbC5fc3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICBpZiAoX2Zyb21Db2wgPT0gMSAmJiBfdG9Db2wgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIC8vRnVsbFJvdworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgMSwgMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcm93cy5OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShyb3dzLlZhbHVlIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3dzLlJvdywgMCwgX3N0eWxlSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm93cy5OZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQl9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2Zyb21Db2wgPT0gMSAmJiBfdG9Db2wgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIC8vRnVsbFJvdworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IF9mcm9tUm93OyByIDw9IF90b1JvdzsgcisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LlJvdyhyKS5fc3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LlJvdyhyKS5TdHlsZUlEID0gX3N0eWxlSUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoISgoX2Zyb21Sb3cgPT0gMSAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpIHx8IChfZnJvbUNvbCA9PSAxICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykpKSAvL0NlbGwgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSBfZnJvbUNvbDsgYyA8PSBfdG9Db2w7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IF9mcm9tUm93OyByIDw9IF90b1JvdzsgcisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyLCBjLCBfc3R5bGVJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAvL09ubHkgc2V0IG5hbWUgb24gY3JlYXRlZCBjZWxscy4gKHVuY3JlYXRlZCBjZWxscyBpcyBzZXQgb24gZnVsbCByb3cgb3IgZnVsbCBjb2x1bW4pLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxzID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3dvcmtzaGVldC5fdmFsdWVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNlbGxzLk5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKGNlbGxzLlJvdywgY2VsbHMuQ29sdW1uLCBfc3R5bGVJRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9fY2hhbmdlUHJvcE1ldGhvZChTZXRfU3R5bGVOYW1lLCB2YWx1ZSk7CisJCQl9CisJCX0KKworICAgICAgICBwcml2YXRlIGludCBHZXRDb2x1bW5TdHlsZShpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgYz1udWxsOworICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3ZhbHVlcy5FeGlzdHMoMCwgY29sLCByZWYgYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjIGFzIEV4Y2VsQ29sdW1uKS5TdHlsZUlEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByb3cgPSAwOworICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll92YWx1ZXMuUHJldkNlbGwocmVmIHJvdywgcmVmIGNvbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uPV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csY29sKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgaWYoY29sdW1uLkNvbHVtbk1heD49Y29sKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFRoZSBzdHlsZSBJRC4gCisJCS8vLyBJdCBpcyBub3QgcmVjb21lbmRlZCB0byB1c2UgdGhpcyBvbmUuIFVzZSBOYW1lZCBzdHlsZXMgYXMgYW4gYWx0ZXJuYXRpdmUuCisJCS8vLyBJZiB5b3UgZG8sIG1ha2Ugc3VyZSB0aGF0IHlvdSB1c2UgdGhlIFN0eWxlLlVwZGF0ZVhtbCgpIG1ldGhvZCB0byB1cGRhdGUgYW55IG5ldyBzdHlsZXMgYWRkZWQgdG8gdGhlIHdvcmtib29rLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgaW50IFN0eWxlSUQKKwkJeworCQkJZ2V0CisJCQl7CisgICAgICAgICAgICAgICAgaW50IHM9MDsKKyAgICAgICAgICAgICAgICBpZighX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgX2Zyb21Db2wsIHJlZiBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKDAsIF9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKwkJCX0KKwkJCXNldAorCQkJeworCQkJCV9jaGFuZ2VQcm9wTWV0aG9kKFNldF9TdHlsZUlELCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gU2V0IHRoZSByYW5nZSB0byBhIHNwZWNpZmljIHZhbHVlCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBvYmplY3QgVmFsdWUKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJaWYgKElzTmFtZSkKKwkJCQl7CisJCQkJCWlmIChfd29ya3NoZWV0ID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXJldHVybiBfd29ya2Jvb2suX25hbWVzW19hZGRyZXNzXS5OYW1lVmFsdWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4gX3dvcmtzaGVldC5OYW1lc1tfYWRkcmVzc10uTmFtZVZhbHVlOyAKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoX2Zyb21Sb3cgPT0gX3RvUm93ICYmIF9mcm9tQ29sID09IF90b0NvbCkKKwkJCQkJeworCQkJCQkJcmV0dXJuIF93b3Jrc2hlZXQuR2V0VmFsdWUoX2Zyb21Sb3csIF9mcm9tQ29sKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiBHZXRWYWx1ZUFycmF5KCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzZXQKKwkJCXsKKwkJCQlpZiAoSXNOYW1lKQorCQkJCXsKKwkJCQkJaWYgKF93b3Jrc2hlZXQgPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJX3dvcmtib29rLl9uYW1lc1tfYWRkcmVzc10uTmFtZVZhbHVlID0gdmFsdWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlfd29ya3NoZWV0Lk5hbWVzW19hZGRyZXNzXS5OYW1lVmFsdWUgPSB2YWx1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlfY2hhbmdlUHJvcE1ldGhvZChTZXRfVmFsdWUsIHZhbHVlKTsKKwkJCQl9CisJCQl9CisJCX0KKworICAgICAgICBwcml2YXRlIGJvb2wgSXNJbmZpbml0eVZhbHVlKG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlPyB2YWx1ZUFzRG91YmxlID0gdmFsdWUgYXMgZG91YmxlPzsKKworICAgICAgICAgICAgaWYodmFsdWVBc0RvdWJsZS5IYXNWYWx1ZSAmJiAKKyAgICAgICAgICAgICAgICAoZG91YmxlLklzTmVnYXRpdmVJbmZpbml0eSh2YWx1ZUFzRG91YmxlLlZhbHVlKSB8fCBkb3VibGUuSXNQb3NpdGl2ZUluZmluaXR5KHZhbHVlQXNEb3VibGUuVmFsdWUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKwkJcHJpdmF0ZSBvYmplY3QgR2V0VmFsdWVBcnJheSgpCisJCXsKKwkJCUV4Y2VsQWRkcmVzc0Jhc2UgYWRkcjsKKwkJCWlmIChfZnJvbVJvdyA9PSAxICYmIF9mcm9tQ29sID09IDEgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKwkJCXsKKwkJCQlhZGRyID0gX3dvcmtzaGVldC5EaW1lbnNpb247CisJCQkJaWYgKGFkZHIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYWRkciA9IHRoaXM7CisJCQl9CisJCQlvYmplY3RbLF0gdiA9IG5ldyBvYmplY3RbYWRkci5fdG9Sb3cgLSBhZGRyLl9mcm9tUm93ICsgMSwgYWRkci5fdG9Db2wgLSBhZGRyLl9mcm9tQ29sICsgMV07CisKKwkJCWZvciAoaW50IGNvbCA9IGFkZHIuX2Zyb21Db2w7IGNvbCA8PSBhZGRyLl90b0NvbDsgY29sKyspCisJCQl7CisJCQkJZm9yIChpbnQgcm93ID0gYWRkci5fZnJvbVJvdzsgcm93IDw9IGFkZHIuX3RvUm93OyByb3crKykKKwkJCQl7CisJCQkJCWlmIChfd29ya3NoZWV0Ll92YWx1ZXMuRXhpc3RzKHJvdyxjb2wpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuUmljaFRleHQpKQorCQkJCQkJeworCQkJCQkJCXZbcm93IC0gYWRkci5fZnJvbVJvdywgY29sIC0gYWRkci5fZnJvbUNvbF0gPSBHZXRSaWNoVGV4dChyb3csIGNvbCkuVGV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQl2W3JvdyAtIGFkZHIuX2Zyb21Sb3csIGNvbCAtIGFkZHIuX2Zyb21Db2xdID0gX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiB2OworCQl9CisJCXByaXZhdGUgRXhjZWxBZGRyZXNzQmFzZSBHZXRBZGRyZXNzRGltKEV4Y2VsUmFuZ2VCYXNlIGFkZHIpCisJCXsKKwkJCWludCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2w7CisJCQl2YXIgZCA9IF93b3Jrc2hlZXQuRGltZW5zaW9uOworCQkJZnJvbVJvdyA9IGFkZHIuX2Zyb21Sb3cgPCBkLl9mcm9tUm93ID8gZC5fZnJvbVJvdyA6IGFkZHIuX2Zyb21Sb3c7CisJCQlmcm9tQ29sID0gYWRkci5fZnJvbUNvbCA8IGQuX2Zyb21Db2wgPyBkLl9mcm9tQ29sIDogYWRkci5fZnJvbUNvbDsKKworCQkJdG9Sb3cgPSBhZGRyLl90b1JvdyA+IGQuX3RvUm93ID8gZC5fdG9Sb3cgOiBhZGRyLl90b1JvdzsKKwkJCXRvQ29sID0gYWRkci5fdG9Db2wgPiBkLl90b0NvbCA/IGQuX3RvQ29sIDogYWRkci5fdG9Db2w7CisKKwkJCWlmIChhZGRyLl9mcm9tQ29sID09IGZyb21Sb3cgJiYgYWRkci5fZnJvbUNvbCA9PSBhZGRyLl9mcm9tQ29sICYmIGFkZHIuX3RvUm93ID09IHRvUm93ICYmIGFkZHIuX3RvQ29sID09IF90b0NvbCkKKwkJCXsKKwkJCQlyZXR1cm4gYWRkcjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoX2Zyb21Sb3cgPiBfdG9Sb3cgfHwgX2Zyb21Db2wgPiBfdG9Db2wpCisJCQkJeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b0NvbCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHJpdmF0ZSBvYmplY3QgR2V0U2luZ2xlVmFsdWUoKQorCQl7CisJCQlpZiAoSXNSaWNoVGV4dCkKKwkJCXsKKwkJCQlyZXR1cm4gUmljaFRleHQuVGV4dDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKF9mcm9tUm93LCBfZnJvbUNvbCk7CisJCQl9CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgc3RyaW5nIFRleHQKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJcmV0dXJuIEdldEZvcm1hdHRlZFRleHQoZmFsc2UpOworCQkJfQorCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIHJhbmdlLiBUaGUgbWluaW11bSB3aWR0aCBpcyB0aGUgdmFsdWUgb2YgdGhlIEV4Y2VsV29ya3NoZWV0LmRlZmF1bHRDb2x1bW5XaWR0aCBwcm9wZXJ0eS4KKwkJLy8vIE5vdGU6IENlbGxzIGNvbnRhaW5pbmcgZm9ybXVsYXMgYXJlIGlnbm9yZWQgc2luY2UgRVBQbHVzIGRvbid0IGhhdmUgYSBjYWxjdWxhdGlvbiBlbmdpbmUuCisJCS8vLyBXcmFwcGVkIGFuZCBtZXJnZWQgY2VsbHMgYXJlIGFsc28gaWdub3JlZC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHZvaWQgQXV0b0ZpdENvbHVtbnMoKQorCQl7CisJCQlBdXRvRml0Q29sdW1ucyhfd29ya3NoZWV0LkRlZmF1bHRDb2xXaWR0aCk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSByYW5nZS4KKwkJLy8vIE5vdGU6IENlbGxzIGNvbnRhaW5pbmcgZm9ybXVsYXMgYXJlIGlnbm9yZWQgaWYgbm8gY2FsY3VsYXRpb24gaXMgbWFkZS4KKwkJLy8vICAgICAgIFdyYXBwZWQgYW5kIG1lcmdlZCBjZWxscyBhcmUgYWxzbyBpZ25vcmVkLgorCQkvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtZXRob2Qgd2lsbCBub3Qgd29yayBpZiB5b3UgcnVuIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBHREk8L3JlbWFya3M+CisJCS8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+CisJCXB1YmxpYyB2b2lkIEF1dG9GaXRDb2x1bW5zKGRvdWJsZSBNaW5pbXVtV2lkdGgpCisJCXsKKwkJICAgIEF1dG9GaXRDb2x1bW5zKE1pbmltdW1XaWR0aCwgZG91YmxlLk1heFZhbHVlKTsKKwkJfQorCisJICAgIC8vLyA8c3VtbWFyeT4KKwkgICAgLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIHJhbmdlLgorICAgICAgICAvLy8gTm90ZTogQ2VsbHMgY29udGFpbmluZyBmb3JtdWxhcyBhcmUgaWdub3JlZCBpZiBubyBjYWxjdWxhdGlvbiBpcyBtYWRlLgorICAgICAgICAvLy8gICAgICAgV3JhcHBlZCBhbmQgbWVyZ2VkIGNlbGxzIGFyZSBhbHNvIGlnbm9yZWQuCisJICAgIC8vLyA8L3N1bW1hcnk+CisJICAgIC8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+CisJICAgIC8vLyA8cGFyYW0gbmFtZT0iTWF4aW11bVdpZHRoIj5NYXhpbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+CisJICAgIHB1YmxpYyB2b2lkIEF1dG9GaXRDb2x1bW5zKGRvdWJsZSBNaW5pbXVtV2lkdGgsIGRvdWJsZSBNYXhpbXVtV2lkdGgpCisJCXsKKyAgICAgICAgICAgIGlmIChfd29ya3NoZWV0LkRpbWVuc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfZnJvbUNvbCA8IDEgfHwgX2Zyb21Sb3cgPCAxKQorCQkJeworCQkJCVNldFRvU2VsZWN0ZWRSYW5nZSgpOworCQkJfQorICAgICAgICAgICAgdmFyIGZvbnRDYWNoZSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRm9udD4oKTsKKworCSAgICAgICAgYm9vbCBkb0FkanVzdCA9IF93b3Jrc2hlZXQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5nczsKKwkJCV93b3Jrc2hlZXQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGZhbHNlOworCQkJdmFyIGRyYXdXaWR0aHMgPSBfd29ya3NoZWV0LkRyYXdpbmdzLkdldERyYXdpbmdXaWR0aHMoKTsKKworCQkJdmFyIGZyb21Db2wgPSBfZnJvbUNvbCA+IF93b3Jrc2hlZXQuRGltZW5zaW9uLl9mcm9tQ29sID8gX2Zyb21Db2wgOiBfd29ya3NoZWV0LkRpbWVuc2lvbi5fZnJvbUNvbDsKKwkJCXZhciB0b0NvbCA9IF90b0NvbCA8IF93b3Jrc2hlZXQuRGltZW5zaW9uLl90b0NvbCA/IF90b0NvbCA6IF93b3Jrc2hlZXQuRGltZW5zaW9uLl90b0NvbDsKKwkJCWlmIChBZGRyZXNzZXMgPT0gbnVsbCkKKwkJCXsKKwkJCQlTZXRNaW5XaWR0aChNaW5pbXVtV2lkdGgsIGZyb21Db2wsIHRvQ29sKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3JlYWNoICh2YXIgYWRkciBpbiBBZGRyZXNzZXMpCisJCQkJeworCQkJCQlmcm9tQ29sID0gYWRkci5fZnJvbUNvbCA+IF93b3Jrc2hlZXQuRGltZW5zaW9uLl9mcm9tQ29sID8gYWRkci5fZnJvbUNvbCA6IF93b3Jrc2hlZXQuRGltZW5zaW9uLl9mcm9tQ29sOworCQkJCQl0b0NvbCA9IGFkZHIuX3RvQ29sIDwgX3dvcmtzaGVldC5EaW1lbnNpb24uX3RvQ29sID8gYWRkci5fdG9Db2wgOiBfd29ya3NoZWV0LkRpbWVuc2lvbi5fdG9Db2w7CisgICAgICAgICAgICAgICAgICAgIFNldE1pbldpZHRoKE1pbmltdW1XaWR0aCwgZnJvbUNvbCwgdG9Db2wpOworICAgICAgICAgICAgICAgIH0KKwkJCX0KKworCQkJLy9HZXQgYW55IGF1dG9maWx0ZXIgdG8gd2lkZW4gdGhlc2UgY29sdW1ucworCQkJdmFyIGFmQWRkciA9IG5ldyBMaXN0PEV4Y2VsQWRkcmVzc0Jhc2U+KCk7CisJCQlpZiAoX3dvcmtzaGVldC5BdXRvRmlsdGVyQWRkcmVzcyAhPSBudWxsKQorCQkJeworCQkJCWFmQWRkci5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoICAgIF93b3Jrc2hlZXQuQXV0b0ZpbHRlckFkZHJlc3MuX2Zyb21Sb3csCisJCQkJCQkJCQkJCQkJX3dvcmtzaGVldC5BdXRvRmlsdGVyQWRkcmVzcy5fZnJvbUNvbCwKKwkJCQkJCQkJCQkJCQlfd29ya3NoZWV0LkF1dG9GaWx0ZXJBZGRyZXNzLl9mcm9tUm93LAorCQkJCQkJCQkJCQkJCV93b3Jrc2hlZXQuQXV0b0ZpbHRlckFkZHJlc3MuX3RvQ29sKSk7CisJCQkJYWZBZGRyW2FmQWRkci5Db3VudCAtIDFdLl93cyA9IFdvcmtTaGVldDsKKwkJCX0KKwkJCWZvcmVhY2ggKHZhciB0YmwgaW4gX3dvcmtzaGVldC5UYWJsZXMpCisJCQl7CisJCQkJaWYgKHRibC5BdXRvRmlsdGVyQWRkcmVzcyAhPSBudWxsKQorCQkJCXsKKwkJCQkJYWZBZGRyLkFkZChuZXcgRXhjZWxBZGRyZXNzQmFzZSh0YmwuQXV0b0ZpbHRlckFkZHJlc3MuX2Zyb21Sb3csCisJCQkJCQkJCQkJCQkJCQkJCQkJdGJsLkF1dG9GaWx0ZXJBZGRyZXNzLl9mcm9tQ29sLAorCQkJCQkJCQkJCQkJCQkJCQkJCXRibC5BdXRvRmlsdGVyQWRkcmVzcy5fZnJvbVJvdywKKwkJCQkJCQkJCQkJCQkJCQkJCQl0YmwuQXV0b0ZpbHRlckFkZHJlc3MuX3RvQ29sKSk7CisJCQkJCWFmQWRkclthZkFkZHIuQ291bnQgLSAxXS5fd3MgPSBXb3JrU2hlZXQ7CisJCQkJfQorCQkJfQorCisJCQl2YXIgc3R5bGVzID0gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXM7CisJCQl2YXIgbmYgPSBzdHlsZXMuRm9udHNbc3R5bGVzLkNlbGxYZnNbMF0uRm9udElkXTsKKwkJCXZhciBmcyA9IEZvbnRTdHlsZS5SZWd1bGFyOworCQkJaWYgKG5mLkJvbGQpIGZzIHw9IEZvbnRTdHlsZS5Cb2xkOworCQkJaWYgKG5mLlVuZGVyTGluZSkgZnMgfD0gRm9udFN0eWxlLlVuZGVybGluZTsKKwkJCWlmIChuZi5JdGFsaWMpIGZzIHw9IEZvbnRTdHlsZS5JdGFsaWM7CisJCQlpZiAobmYuU3RyaWtlKSBmcyB8PSBGb250U3R5bGUuU3RyaWtlb3V0OworCQkJdmFyIG5mb250ID0gbmV3IEZvbnQobmYuTmFtZSwgbmYuU2l6ZSwgZnMpOworICAgICAgICAgICAgCisJCQl1c2luZyAodmFyIGIgPSBuZXcgQml0bWFwKDEsIDEpKQorCQkJeworCQkJCXVzaW5nICh2YXIgZyA9IEdyYXBoaWNzLkZyb21JbWFnZShiKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIGcuUGFnZVVuaXQgPSBHcmFwaGljc1VuaXQuUGl4ZWw7CisgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxTaXplID0gKGZsb2F0KU1hdGguVHJ1bmNhdGUoZy5NZWFzdXJlU3RyaW5nKCIwMCIsIG5mb250LCAxMDAwMCwgU3RyaW5nRm9ybWF0LkdlbmVyaWNUeXBvZ3JhcGhpYykuV2lkdGggLSBnLk1lYXN1cmVTdHJpbmcoIjAiLCBuZm9udCwgMTAwMDAsIFN0cmluZ0Zvcm1hdC5HZW5lcmljVHlwb2dyYXBoaWMpLldpZHRoKTsKKwkJCQkJZm9yZWFjaCAodmFyIGNlbGwgaW4gdGhpcykKKwkJCQkJeworCQkJCQkJaWYgKGNlbGwuTWVyZ2UgPT0gdHJ1ZSB8fCBjZWxsLlN0eWxlLldyYXBUZXh0KSBjb250aW51ZTsKKwkJCQkJCXZhciBmbnRJRCA9IHN0eWxlcy5DZWxsWGZzW2NlbGwuU3R5bGVJRF0uRm9udElkOworCQkJCQkgICAgRm9udCBmOworCQkJCQkgICAgaWYgKGZvbnRDYWNoZS5Db250YWluc0tleShmbnRJRCkpCisJCQkJCQl7CisJCQkJCQkJZiA9IGZvbnRDYWNoZVtmbnRJRF07CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJdmFyIGZudCA9IHN0eWxlcy5Gb250c1tmbnRJRF07CisJCQkJCQkJZnMgPSBGb250U3R5bGUuUmVndWxhcjsKKwkJCQkJCQlpZiAoZm50LkJvbGQpIGZzIHw9IEZvbnRTdHlsZS5Cb2xkOworCQkJCQkJCWlmIChmbnQuVW5kZXJMaW5lKSBmcyB8PSBGb250U3R5bGUuVW5kZXJsaW5lOworCQkJCQkJCWlmIChmbnQuSXRhbGljKSBmcyB8PSBGb250U3R5bGUuSXRhbGljOworCQkJCQkJCWlmIChmbnQuU3RyaWtlKSBmcyB8PSBGb250U3R5bGUuU3RyaWtlb3V0OworCQkJCQkJCWYgPSBuZXcgRm9udChmbnQuTmFtZSwgZm50LlNpemUsIGZzKTsKKwkJCQkJCQlmb250Q2FjaGUuQWRkKGZudElELCBmKTsKKwkJCQkJCX0KKworCQkJCQkJLy9UcnVuY2F0ZSgoe3BpeGVsc30tNSkve01heGltdW0gRGlnaXQgV2lkdGh9ICogMTAwKzAuNSkvMTAwCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gZy5NZWFzdXJlU3RyaW5nKGNlbGwuVGV4dEZvcldpZHRoLCBmLCAxMDAwMCwgU3RyaW5nRm9ybWF0LkdlbmVyaWNUeXBvZ3JhcGhpYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgciA9IHN0eWxlcy5DZWxsWGZzW2NlbGwuU3R5bGVJRF0uVGV4dFJvdGF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPD0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAoc2l6ZS5XaWR0aCArIDUpIC8gbm9ybWFsU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKHIgPD0gOTAgPyByIDogciAtIDkwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICgoKHNpemUuV2lkdGggLSBzaXplLkhlaWdodCkgKiBNYXRoLkFicyhTeXN0ZW0uTWF0aC5Db3MoU3lzdGVtLk1hdGguUEkgKiByIC8gMTgwLjApKSArIHNpemUuSGVpZ2h0KSArIDUpIC8gbm9ybWFsU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJCQkJZm9yZWFjaCAodmFyIGEgaW4gYWZBZGRyKQorCQkJCQkJeworCQkJCQkJCWlmIChhLkNvbGxpZGUoY2VsbCkgIT0gZUFkZHJlc3NDb2xsaXRpb24uTm8pCisJCQkJCQkJeworCQkJCQkJCQl3aWR0aCArPSAyLjI1OworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCWlmICh3aWR0aCA+IF93b3Jrc2hlZXQuQ29sdW1uKGNlbGwuX2Zyb21Db2wpLldpZHRoKQorCQkJCQkJeworCQkJCQkJCV93b3Jrc2hlZXQuQ29sdW1uKGNlbGwuX2Zyb21Db2wpLldpZHRoID0gd2lkdGggPiBNYXhpbXVtV2lkdGggPyBNYXhpbXVtV2lkdGggOiB3aWR0aDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCV93b3Jrc2hlZXQuRHJhd2luZ3MuQWRqdXN0V2lkdGgoZHJhd1dpZHRocyk7CisJCQlfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MgPSBkb0FkanVzdDsKKwkJfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRNaW5XaWR0aChkb3VibGUgbWluaW11bVdpZHRoLCBpbnQgZnJvbUNvbCwgaW50IHRvQ29sKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pihfd29ya3NoZWV0Ll92YWx1ZXMsIDAsIGZyb21Db2wsIDAsIHRvQ29sKTsKKyAgICAgICAgICAgIHZhciBwcmV2Q29sID0gZnJvbUNvbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsQ29sdW1uIGNvbCBpbiBpdGVyYXRvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2wuV2lkdGggPSBtaW5pbXVtV2lkdGg7CisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuRGVmYXVsdENvbFdpZHRoID4gbWluaW11bVdpZHRoICYmIGNvbC5Db2x1bW5NaW4gPiBwcmV2Q29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29sdW1uKHByZXZDb2wpOworICAgICAgICAgICAgICAgICAgICBuZXdDb2wuQ29sdW1uTWF4ID0gY29sLkNvbHVtbk1pbiAtIDE7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbC5XaWR0aCA9IG1pbmltdW1XaWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldkNvbCA9IGNvbC5Db2x1bW5NYXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuRGVmYXVsdENvbFdpZHRoID4gbWluaW11bVdpZHRoICYmIHByZXZDb2w8dG9Db2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29sdW1uKHByZXZDb2wpOworICAgICAgICAgICAgICAgIG5ld0NvbC5Db2x1bW5NYXggPSB0b0NvbDsKKyAgICAgICAgICAgICAgICBuZXdDb2wuV2lkdGggPSBtaW5pbXVtV2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgVGV4dEZvcldpZHRoCisJCXsKKwkJCWdldAorCQkJeworCQkJCXJldHVybiBHZXRGb3JtYXR0ZWRUZXh0KHRydWUpOworCQkJfQorCQl9CisJCXByaXZhdGUgc3RyaW5nIEdldEZvcm1hdHRlZFRleHQoYm9vbCBmb3JXaWR0aENhbGMpCisJCXsKKwkJCW9iamVjdCB2ID0gVmFsdWU7CisJCQlpZiAodiA9PSBudWxsKSByZXR1cm4gIiI7CisJCQl2YXIgc3R5bGVzID0gV29ya3NoZWV0Lldvcmtib29rLlN0eWxlczsKKwkJCXZhciBuZklEID0gc3R5bGVzLkNlbGxYZnNbU3R5bGVJRF0uTnVtYmVyRm9ybWF0SWQ7CisJCQlFeGNlbE51bWJlckZvcm1hdFhtbC5FeGNlbEZvcm1hdFRyYW5zbGF0b3IgbmYgPSBudWxsOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHlsZXMuTnVtYmVyRm9ybWF0cy5Db3VudDsgaSsrKQorCQkJeworCQkJCWlmIChuZklEID09IHN0eWxlcy5OdW1iZXJGb3JtYXRzW2ldLk51bUZtdElkKQorCQkJCXsKKwkJCQkJbmYgPSBzdHlsZXMuTnVtYmVyRm9ybWF0c1tpXS5Gb3JtYXRUcmFuc2xhdG9yOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXN0cmluZyBmb3JtYXQsIHRleHRGb3JtYXQ7CisJCQlpZiAoZm9yV2lkdGhDYWxjKQorCQkJeworCQkJCWZvcm1hdCA9IG5mLk5ldEZvcm1hdEZvcldpZHRoOworCQkJCXRleHRGb3JtYXQgPSBuZi5OZXRUZXh0Rm9ybWF0Rm9yV2lkdGg7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZm9ybWF0ID0gbmYuTmV0Rm9ybWF0OworCQkJCXRleHRGb3JtYXQgPSBuZi5OZXRUZXh0Rm9ybWF0OworCQkJfQorCisgICAgICAgICAgICByZXR1cm4gRm9ybWF0VmFsdWUodiwgbmYsIGZvcm1hdCwgdGV4dEZvcm1hdCk7CisJCX0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEZvcm1hdFZhbHVlKG9iamVjdCB2LCBFeGNlbE51bWJlckZvcm1hdFhtbC5FeGNlbEZvcm1hdFRyYW5zbGF0b3IgbmYsIHN0cmluZyBmb3JtYXQsIHN0cmluZyB0ZXh0Rm9ybWF0KQorICAgICAgICB7CisJCQlpZiAodiBpcyBkZWNpbWFsIHx8IHYuR2V0VHlwZSgpLklzUHJpbWl0aXZlKQorCQkJeworCQkJCWRvdWJsZSBkOworCQkJCXRyeQorCQkJCXsKKwkJCQkJZCA9IENvbnZlcnQuVG9Eb3VibGUodik7CisJCQkJfQorCQkJCWNhdGNoCisJCQkJeworCQkJCQlyZXR1cm4gIiI7CisJCQkJfQorCisJCQkJaWYgKG5mLkRhdGFUeXBlID09IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLmVGb3JtYXRUeXBlLk51bWJlcikKKwkJCQl7CisJCQkJCWlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuZi5GcmFjdGlvbkZvcm1hdCkpCisJCQkJCXsKKwkJCQkJCXJldHVybiBkLlRvU3RyaW5nKGZvcm1hdCwgbmYuQ3VsdHVyZSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmYuRm9ybWF0RnJhY3Rpb24oZCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAobmYuRGF0YVR5cGUgPT0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuZUZvcm1hdFR5cGUuRGF0ZVRpbWUpCisJCQkJeworCQkJCQl2YXIgZGF0ZSA9IERhdGVUaW1lLkZyb21PQURhdGUoZCk7CisJCQkJCXJldHVybiBkYXRlLlRvU3RyaW5nKGZvcm1hdCwgbmYuQ3VsdHVyZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAodiBpcyBEYXRlVGltZSkKKwkJCXsKKwkJCQlpZiAobmYuRGF0YVR5cGUgPT0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuZUZvcm1hdFR5cGUuRGF0ZVRpbWUpCisJCQkJeworCQkJCQlyZXR1cm4gKChEYXRlVGltZSl2KS5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkb3VibGUgZCA9ICgoRGF0ZVRpbWUpdikuVG9PQURhdGUoKTsKKwkJCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG5mLkZyYWN0aW9uRm9ybWF0KSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIGQuVG9TdHJpbmcoZm9ybWF0LCBuZi5DdWx0dXJlKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiBuZi5Gb3JtYXRGcmFjdGlvbihkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHYgaXMgVGltZVNwYW4pCisJCQl7CisJCQkJaWYgKG5mLkRhdGFUeXBlID09IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLmVGb3JtYXRUeXBlLkRhdGVUaW1lKQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBEYXRlVGltZSgoKFRpbWVTcGFuKXYpLlRpY2tzKS5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkb3VibGUgZCA9IChuZXcgRGF0ZVRpbWUoKChUaW1lU3Bhbil2KS5UaWNrcykpLlRvT0FEYXRlKCk7CisJCQkJCWlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuZi5GcmFjdGlvbkZvcm1hdCkpCisJCQkJCXsKKwkJCQkJCXJldHVybiBkLlRvU3RyaW5nKGZvcm1hdCwgbmYuQ3VsdHVyZSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmYuRm9ybWF0RnJhY3Rpb24oZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHRleHRGb3JtYXQgPT0gIiIpCisJCQkJeworCQkJCQlyZXR1cm4gdi5Ub1N0cmluZygpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gc3RyaW5nLkZvcm1hdCh0ZXh0Rm9ybWF0LCB2KTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdi5Ub1N0cmluZygpOworfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXRzIG9yIHNldHMgYSBmb3JtdWxhIGZvciBhIHJhbmdlLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgc3RyaW5nIEZvcm11bGEKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJaWYgKElzTmFtZSkKKwkJCQl7CisJCQkJCWlmIChfd29ya3NoZWV0ID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXJldHVybiBfd29ya2Jvb2suX25hbWVzW19hZGRyZXNzXS5OYW1lRm9ybXVsYTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiBfd29ya3NoZWV0Lk5hbWVzW19hZGRyZXNzXS5OYW1lRm9ybXVsYTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gX3dvcmtzaGVldC5HZXRGb3JtdWxhKF9mcm9tUm93LCBfZnJvbUNvbCk7ICAgICAgICAgICAgICAgICAgICAKKwkJCQl9CisJCQl9CisJCQlzZXQKKwkJCXsKKwkJCQlpZiAoSXNOYW1lKQorCQkJCXsKKwkJCQkJaWYgKF93b3Jrc2hlZXQgPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJX3dvcmtib29rLl9uYW1lc1tfYWRkcmVzc10uTmFtZUZvcm11bGEgPSB2YWx1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCV93b3Jrc2hlZXQuTmFtZXNbX2FkZHJlc3NdLk5hbWVGb3JtdWxhID0gdmFsdWU7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYodmFsdWU9PW51bGwgfHwgdmFsdWUuVHJpbSgpPT0iIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIGNlbGxzIHRvIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9mcm9tUm93ID09IF90b1JvdyAmJiBfZnJvbUNvbCA9PSBfdG9Db2wpCisJCQkJCXsKKwkJCQkJCVNldF9Gb3JtdWxhKHZhbHVlLCBfZnJvbVJvdywgX2Zyb21Db2wpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJU2V0X1NoYXJlZEZvcm11bGEodmFsdWUsIHRoaXMsIGZhbHNlKTsKKwkJCQkJCWlmIChBZGRyZXNzZXMgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpCisJCQkJCQkJeworCQkJCQkJCQlTZXRfU2hhcmVkRm9ybXVsYSh2YWx1ZSwgYWRkcmVzcywgZmFsc2UpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXRzIG9yIFNldCBhIGZvcm11bGEgaW4gUjFDMSBmb3JtYXQuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBzdHJpbmcgRm9ybXVsYVIxQzEKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJSXNSYW5nZVZhbGlkKCJGb3JtdWxhUjFDMSIpOworCQkJCXJldHVybiBfd29ya3NoZWV0LkdldEZvcm11bGFSMUMxKF9mcm9tUm93LCBfZnJvbUNvbCk7CisJCQl9CisJCQlzZXQKKwkJCXsKKwkJCQlJc1JhbmdlVmFsaWQoIkZvcm11bGFSMUMxIik7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLkxlbmd0aCA+IDAgJiYgdmFsdWVbMF0gPT0gJz0nKSB2YWx1ZSA9IHZhbHVlLlN1YnN0cmluZygxLCB2YWx1ZS5MZW5ndGggLSAxKTsgLy8gcmVtb3ZlIGFueSBzdGFydGluZyBlcXVhbHNpZ24uCisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5UcmltKCkgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgY2VsbHMgdG8gbnVsbAorICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzW0V4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIF9mcm9tUm93LCBfZnJvbUNvbCldLlZhbHVlID0gbnVsbDsgICAgCisgICAgICAgICAgICAgICAgfQorCQkJCWVsc2UgaWYgKEFkZHJlc3NlcyA9PSBudWxsKQorCQkJCXsKKwkJCQkJU2V0X1NoYXJlZEZvcm11bGEoRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMSh2YWx1ZSwgX2Zyb21Sb3csIF9mcm9tQ29sKSwgdGhpcywgZmFsc2UpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTZXRfU2hhcmVkRm9ybXVsYShFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKHZhbHVlLCBfZnJvbVJvdywgX2Zyb21Db2wpLCBuZXcgRXhjZWxBZGRyZXNzKFdvcmtTaGVldCwgRmlyc3RBZGRyZXNzKSwgZmFsc2UpOworCQkJCQlmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpCisJCQkJCXsKKwkJCQkJCVNldF9TaGFyZWRGb3JtdWxhKEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbiksIGFkZHJlc3MsIGZhbHNlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTZXQgdGhlIGh5cGVybGluayBwcm9wZXJ0eSBmb3IgYSByYW5nZSBvZiBjZWxscworCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgVXJpIEh5cGVybGluaworCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlJc1JhbmdlVmFsaWQoImZvcm11bGFSMUMxIik7CisJCQkJcmV0dXJuIF93b3Jrc2hlZXQuX2h5cGVyTGlua3MuR2V0VmFsdWUoX2Zyb21Sb3csIF9mcm9tQ29sKTsKKwkJCX0KKwkJCXNldAorCQkJeworCQkJCV9jaGFuZ2VQcm9wTWV0aG9kKFNldF9IeXBlckxpbmssIHZhbHVlKTsKKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJZiB0aGUgY2VsbHMgaW4gdGhlIHJhbmdlIGFyZSBtZXJnZWQuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBib29sIE1lcmdlCisJCXsKKwkJCWdldAorCQkJeworCQkJCUlzUmFuZ2VWYWxpZCgibWVyZ2luZyIpOworCQkJCWZvciAoaW50IGNvbCA9IF9mcm9tQ29sOyBjb2wgPD0gX3RvQ29sOyBjb2wrKykKKwkJCQl7CisJCQkJCWZvciAoaW50IHJvdyA9IF9mcm9tUm93OyByb3cgPD0gX3RvUm93OyByb3crKykKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoX3dvcmtzaGVldC5NZXJnZWRDZWxsc1tyb3csIGNvbF09PW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoIV93b3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShyb3csIGNvbCwgQ2VsbEZsYWdzLk1lcmdlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJc2V0CisJCQl7CisJCQkJSXNSYW5nZVZhbGlkKCJtZXJnaW5nIik7CisJCQkJLy9TZXRNZXJnZSh2YWx1ZSwgRmlyc3RBZGRyZXNzKTsKKwkJCSAgICBpZiAodmFsdWUpCisJCQkgICAgeworCQkJICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkFkZChuZXcgRXhjZWxBZGRyZXNzQmFzZShGaXJzdEFkZHJlc3MpLCB0cnVlKTsKKwkJCSAgICAgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKQorCQkJICAgICAgICB7CisJCQkgICAgICAgICAgICBmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpCisJCQkgICAgICAgICAgICB7CisJCQkgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5BZGQoYWRkcmVzcywgdHJ1ZSk7CisJCQkgICAgICAgICAgICAgICAgLy9TZXRNZXJnZSh2YWx1ZSwgYWRkcmVzcy5fYWRkcmVzcyk7CisJCQkgICAgICAgICAgICB9CisJCQkgICAgICAgIH0KKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCSAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5DbGVhcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKQorCQkJICAgICAgICB7CisJCQkgICAgICAgICAgICBmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpCisJCQkgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5DbGVhcihhZGRyZXNzKTsgOworCQkJICAgICAgICAgICAgfQorCQkJICAgICAgICB9CisJCQkgICAgICAgIAorCQkJICAgIH0KKwkJCX0KKwkJfQorCisgICAgICAgIC8vcHJpdmF0ZSB2b2lkIFNldE1lcmdlKGJvb2wgdmFsdWUsIHN0cmluZyBhZGRyZXNzKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgaWYgKF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuTGlzdC5Db250YWlucyhhZGRyZXNzKSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBTZXRDZWxsTWVyZ2UoZmFsc2UsIGFkZHJlc3MpOworICAgICAgICAvLyAgICAgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuTGlzdC5SZW1vdmUoYWRkcmVzcyk7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlIGlmICghQ2hlY2tNZXJnZURpZmYoZmFsc2UsIGFkZHJlc3MpKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJSYW5nZSBpcyBub3QgZnVsbHkgbWVyZ2VkLlNwZWNpZnkgdGhlIGV4YWN0IHJhbmdlIikpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGVsc2UKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgaWYgKENoZWNrTWVyZ2VEaWZmKGZhbHNlLCBhZGRyZXNzKSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBTZXRDZWxsTWVyZ2UodHJ1ZSwgYWRkcmVzcyk7CisgICAgICAgIC8vICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5MaXN0LkFkZChhZGRyZXNzKTsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBpZiAoIV93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuTGlzdC5Db250YWlucyhhZGRyZXNzKSkKKyAgICAgICAgLy8gICAgICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJDZWxscyBhcmUgYWxyZWFkeSBtZXJnZWQiKSk7CisgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTZXQgYW4gYXV0b2ZpbHRlciBmb3IgdGhlIHJhbmdlCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBib29sIEF1dG9GaWx0ZXIKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJSXNSYW5nZVZhbGlkKCJhdXRvZmlsdGVyIik7CisJCQkJRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzID0gX3dvcmtzaGVldC5BdXRvRmlsdGVyQWRkcmVzczsKKwkJCQlpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCQkJaWYgKF9mcm9tUm93ID49IGFkZHJlc3MuU3RhcnQuUm93CisJCQkJCQkmJgorCQkJCQkJX3RvUm93IDw9IGFkZHJlc3MuRW5kLlJvdworCQkJCQkJJiYKKwkJCQkJCV9mcm9tQ29sID49IGFkZHJlc3MuU3RhcnQuQ29sdW1uCisJCQkJCQkmJgorCQkJCQkJX3RvQ29sIDw9IGFkZHJlc3MuRW5kLkNvbHVtbikKKwkJCQl7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlzZXQKKwkJCXsKKwkJCQlJc1JhbmdlVmFsaWQoImF1dG9maWx0ZXIiKTsKKwkJCQlfd29ya3NoZWV0LkF1dG9GaWx0ZXJBZGRyZXNzID0gdGhpczsKKwkJCQlpZiAoX3dvcmtzaGVldC5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uX0ZpbHRlckRhdGFiYXNlIikpCisJCQkJeworCQkJCQlfd29ya3NoZWV0Lk5hbWVzLlJlbW92ZSgiX3hsbm0uX0ZpbHRlckRhdGFiYXNlIik7CisJCQkJfQorCQkJCXZhciByZXN1bHQgPSBfd29ya3NoZWV0Lk5hbWVzLkFkZCgiX3hsbm0uX0ZpbHRlckRhdGFiYXNlIiwgdGhpcyk7CisJCQkJcmVzdWx0LklzTmFtZUhpZGRlbiA9IHRydWU7CisJCQl9CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gSWYgdGhlIHZhbHVlIGlzIGluIHJpY2h0ZXh0IGZvcm1hdC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGJvb2wgSXNSaWNoVGV4dAorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlJc1JhbmdlVmFsaWQoInJpY2h0ZXh0Iik7CisJCQkJcmV0dXJuIF93b3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShfZnJvbVJvdywgX2Zyb21Db2wsQ2VsbEZsYWdzLlJpY2hUZXh0KTsKKwkJCX0KKwkJCXNldAorCQkJeworCQkJCV9jaGFuZ2VQcm9wTWV0aG9kKFNldF9Jc1JpY2hUZXh0LCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gSXMgdGhlIHJhbmdlIGEgcGFydCBvZiBhbiBBcnJheWZvcm11bGEKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGJvb2wgSXNBcnJheUZvcm11bGEKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJSXNSYW5nZVZhbGlkKCJhcnJheWZvcm11bGFzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShfZnJvbVJvdywgX2Zyb21Db2wsIENlbGxGbGFncy5BcnJheUZvcm11bGEpOworCQkJfQorCQl9CisJCUV4Y2VsUmljaFRleHRDb2xsZWN0aW9uIF9ydGMgPSBudWxsOworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBDZWxsIHZhbHVlIGlzIHJpY2h0ZXh0IGZvcm1hdHRlZC4gCisJCS8vLyBSaWNodGV4dC1wcm9wZXJ0eSBvbmx5IGFwcGx5IHRvIHRoZSBsZWZ0LXRvcCBjZWxsIG9mIHRoZSByYW5nZS4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uIFJpY2hUZXh0CisJCXsKKwkJCWdldAorCQkJeworCQkJCUlzUmFuZ2VWYWxpZCgicmljaHRleHQiKTsKKwkJCQlpZiAoX3J0YyA9PSBudWxsKQorCQkJCXsKKwkJCQkJX3J0YyA9IEdldFJpY2hUZXh0KF9mcm9tUm93LCBfZnJvbUNvbCk7CisJCQkJfQorCQkJCXJldHVybiBfcnRjOworCQkJfQorCQl9CisKKwkJcHJpdmF0ZSBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBHZXRSaWNoVGV4dChpbnQgcm93LCBpbnQgY29sKQorCQl7CisJCQlYbWxEb2N1bWVudCB4bWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciB2ID0gX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgIHZhciBpc1J0ID0gX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuUmljaFRleHQpOworICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoaXNSdCkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZSh4bWwsICI8ZDpzaSB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgPiIgKyB2LlRvU3RyaW5nKCkgKyAiPC9kOnNpPiIsIEVuY29kaW5nLlVURjgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl4bWwuTG9hZFhtbCgiPGQ6c2kgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiID48ZDpyPjxkOnQ+IiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUodi5Ub1N0cmluZygpKSArICI8L2Q6dD48L2Q6cj48L2Q6c2k+Iik7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXhtbC5Mb2FkWG1sKCI8ZDpzaSB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgLz4iKTsKKwkJCX0KKwkJCXZhciBydGMgPSBuZXcgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24oX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCB4bWwuU2VsZWN0U2luZ2xlTm9kZSgiZDpzaSIsIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciksIHRoaXMpOworCQkJcmV0dXJuIHJ0YzsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyByZXR1cm5zIHRoZSBjb21tZW50IG9iamVjdCBvZiB0aGUgZmlyc3QgY2VsbCBpbiB0aGUgcmFuZ2UKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsQ29tbWVudCBDb21tZW50CisJCXsKKwkJCWdldAorCQkJeworCQkJCUlzUmFuZ2VWYWxpZCgiY29tbWVudHMiKTsKKwkJCQl1bG9uZyBjZWxsSUQgPSBHZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBfZnJvbVJvdywgX2Zyb21Db2wpOworCQkJCWlmIChfd29ya3NoZWV0LkNvbW1lbnRzLl9jb21tZW50cy5Db250YWluc0tleShjZWxsSUQpKQorCQkJCXsKKwkJCQkJcmV0dXJuIF93b3Jrc2hlZXQuX2NvbW1lbnRzLl9jb21tZW50c1tjZWxsSURdIGFzIEV4Y2VsQ29tbWVudDsKKwkJCQl9CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gV29ya1NoZWV0IG9iamVjdCAKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldAorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlyZXR1cm4gX3dvcmtzaGVldDsKKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBBZGRyZXNzIGluY2x1ZGluZyBzaGVldG5hbWUKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBGdWxsQWRkcmVzcworCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlzdHJpbmcgZnVsbEFkZHJlc3MgPSBHZXRGdWxsQWRkcmVzcyhfd29ya3NoZWV0Lk5hbWUsIF9hZGRyZXNzKTsKKwkJCQlpZiAoQWRkcmVzc2VzICE9IG51bGwpCisJCQkJeworCQkJCQlmb3JlYWNoICh2YXIgYSBpbiBBZGRyZXNzZXMpCisJCQkJCXsKKwkJCQkJCWZ1bGxBZGRyZXNzICs9ICIsIiArIEdldEZ1bGxBZGRyZXNzKF93b3Jrc2hlZXQuTmFtZSwgYS5BZGRyZXNzKTsgOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBmdWxsQWRkcmVzczsKKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBBZGRyZXNzIGluY2x1ZGluZyBzaGVldG5hbWUKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0cmluZyBGdWxsQWRkcmVzc0Fic29sdXRlCisJCXsKKwkJCWdldAorCQkJeworCQkJCXN0cmluZyB3YndzUmVmID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoYmFzZS5fd2IpID8gYmFzZS5fd3MgOiAiWyIgKyBiYXNlLl93Yi5SZXBsYWNlKCInIiwgIicnIikgKyAiXSIgKyBfd3M7CisJCQkJc3RyaW5nIGZ1bGxBZGRyZXNzID0gR2V0RnVsbEFkZHJlc3Mod2J3c1JlZiwgR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sLCB0cnVlKSk7CisJCQkJaWYgKEFkZHJlc3NlcyAhPSBudWxsKQorCQkJCXsKKwkJCQkJZm9yZWFjaCAodmFyIGEgaW4gQWRkcmVzc2VzKQorCQkJCQl7CisJCQkJCQlmdWxsQWRkcmVzcyArPSAiLCIgKyBHZXRGdWxsQWRkcmVzcyh3YndzUmVmLCBHZXRBZGRyZXNzKGEuU3RhcnQuUm93LCBhLlN0YXJ0LkNvbHVtbiwgYS5FbmQuUm93LCBhLkVuZC5Db2x1bW4sIHRydWUpKTsgOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBmdWxsQWRkcmVzczsKKwkJCX0KKwkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRyZXNzIGluY2x1ZGluZyBzaGVldG5hbWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEZ1bGxBZGRyZXNzQWJzb2x1dGVOb0Z1bGxSb3dDb2wKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHdid3NSZWYgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShiYXNlLl93YikgPyBiYXNlLl93cyA6ICJbIiArIGJhc2UuX3diLlJlcGxhY2UoIiciLCAiJyciKSArICJdIiArIF93czsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZnVsbEFkZHJlc3MgPSBHZXRGdWxsQWRkcmVzcyh3YndzUmVmLCBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wsIHRydWUpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGEgaW4gQWRkcmVzc2VzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsQWRkcmVzcyArPSAiLCIgKyBHZXRGdWxsQWRkcmVzcyh3YndzUmVmLCBHZXRBZGRyZXNzKGEuU3RhcnQuUm93LCBhLlN0YXJ0LkNvbHVtbiwgYS5FbmQuUm93LCBhLkVuZC5Db2x1bW4sIHRydWUpLGZhbHNlKTsgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmdWxsQWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gUHJpdmF0ZSBNZXRob2RzCisgICAgICAgIC8vLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8vLyBDaGVjayBpZiB0aGUgcmFuZ2UgaXMgcGFydGx5IG1lcmdlZAorICAgICAgICAvLy8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJzdGFydFZhbHVlIj50aGUgc3RhcnRpbmcgdmFsdWU8L3BhcmFtPgorICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIGFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIC8vcHJpdmF0ZSBib29sIENoZWNrTWVyZ2VEaWZmKGJvb2wgc3RhcnRWYWx1ZSwgc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBFeGNlbEFkZHJlc3MgYSA9IG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgIC8vICAgIGZvciAoaW50IGNvbCA9IGEuY29sdW1uOyBjb2wgPD0gYS5fdG9Db2w7IGNvbCsrKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBmb3IgKGludCByb3cgPSBhLl9mcm9tUm93OyByb3cgPD0gYS5fdG9Sb3c7IHJvdysrKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9mbGFncy5HZXRGbGFnVmFsdWUocm93LCBjb2wsIENlbGxGbGFncy5NZXJnZWQpICE9IHN0YXJ0VmFsdWUpCisgICAgICAgIC8vICAgICAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHJldHVybiB0cnVlOworICAgICAgICAvL30KKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIFNldCB0aGUgbWVyZ2UgZmxhZyBmb3IgdGhlIHJhbmdlCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy9pbnRlcm5hbCB2b2lkIFNldENlbGxNZXJnZShib29sIHZhbHVlLCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIEV4Y2VsQWRkcmVzcyBhID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgLy8gICAgZm9yIChpbnQgY29sID0gYS5jb2x1bW47IGNvbCA8PSBhLl90b0NvbDsgY29sKyspCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGZvciAoaW50IHJvdyA9IGEuX2Zyb21Sb3c7IHJvdyA8PSBhLl90b1Jvdzsgcm93KyspCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgX3dvcmtzaGVldC5fZmxhZ3MuU2V0RmxhZ1ZhbHVlKHJvdywgY29sLHZhbHVlLENlbGxGbGFncy5NZXJnZWQpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTZXQgdGhlIHZhbHVlIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIHJpY2h0ZXh0IHByb3BlcnR5CisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPnRoZSB2YWx1ZTwvcGFyYW0+CisJCWludGVybmFsIHZvaWQgU2V0VmFsdWVSaWNoVGV4dChvYmplY3QgdmFsdWUpCisJCXsKKwkJCWlmIChfZnJvbVJvdyA9PSAxICYmIF9mcm9tQ29sID09IDEgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgIC8vRnVsbCBzaGVldCAoZXggd3MuQ2VsbHMuVmFsdWU9MCkuIFNldCB2YWx1ZSBmb3IgQTEgb25seSB0byBhdm9pZCBoYW5naW5nIAorCQkJeworCQkJCS8vX3dvcmtzaGVldC5DZWxsKDEsIDEpLlNldFZhbHVlUmljaFRleHQodmFsdWUpOworICAgICAgICAgICAgICAgIFNldFZhbHVlKHZhbHVlLCAxLCAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvL2ZvciAoaW50IGNvbCA9IF9mcm9tQ29sOyBjb2wgPD0gX3RvQ29sOyBjb2wrKykKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBmb3IgKGludCByb3cgPSBfZnJvbVJvdzsgcm93IDw9IF90b1Jvdzsgcm93KyspCisgICAgICAgICAgICAgICAgLy8gICAgeworCQkJCQkJLy9fd29ya3NoZWV0LkNlbGwocm93LCBjb2wpLlNldFZhbHVlUmljaFRleHQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUodmFsdWUsIF9mcm9tUm93LF9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgLy99CisJCQkJLy99CisJCQl9CisJCX0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0VmFsdWUob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LlNldFZhbHVlKHJvdywgY29sLCB2YWx1ZSk7CisgICAgICAgICAgIC8vIGlmICh2YWx1ZSBpcyBzdHJpbmcpIF93b3Jrc2hlZXQuX3R5cGVzLlNldFZhbHVlKHJvdywgY29sLCAiUyIpOyBlbHNlIF93b3Jrc2hlZXQuX3R5cGVzLlNldFZhbHVlKHJvdywgY29sLCAiIik7CisgICAgICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgIiIpOworICAgICAgICB9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJlbW92ZXMgYSBzaGFyZWQgZm9ybXVsYQorCQkvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvL3ByaXZhdGUgdm9pZCBSZW1vdmVGb3JtdWxzKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgTGlzdDxpbnQ+IHJlbW92ZWQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgIC8vICAgIGludCBmRnJvbVJvdywgZkZyb21Db2wsIGZUb1JvdywgZlRvQ29sOworICAgICAgICAvLyAgICBmb3JlYWNoIChpbnQgaW5kZXggaW4gX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuS2V5cykKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgRXhjZWxXb3Jrc2hlZXQuRm9ybXVsYXMgZiA9IF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzW2luZGV4XTsKKyAgICAgICAgLy8gICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoZi5BZGRyZXNzLCBvdXQgZkZyb21Sb3csIG91dCBmRnJvbUNvbCwgb3V0IGZUb1Jvdywgb3V0IGZUb0NvbCk7CisgICAgICAgIC8vICAgICAgICBpZiAoKChmRnJvbUNvbCA+PSBhZGRyZXNzLlN0YXJ0LkNvbHVtbiAmJiBmRnJvbUNvbCA8PSBhZGRyZXNzLkVuZC5Db2x1bW4pIHx8CisgICAgICAgIC8vICAgICAgICAgICAgIChmVG9Db2wgPj0gYWRkcmVzcy5TdGFydC5Db2x1bW4gJiYgZlRvQ29sIDw9IGFkZHJlc3MuRW5kLkNvbHVtbikpICYmCisgICAgICAgIC8vICAgICAgICAgICAgICgoZkZyb21Sb3cgPj0gYWRkcmVzcy5TdGFydC5Sb3cgJiYgZkZyb21Sb3cgPD0gYWRkcmVzcy5FbmQuUm93KSB8fAorICAgICAgICAvLyAgICAgICAgICAgICAoZlRvUm93ID49IGFkZHJlc3MuU3RhcnQuUm93ICYmIGZUb1JvdyA8PSBhZGRyZXNzLkVuZC5Sb3cpKSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBmRnJvbUNvbDsgY29sIDw9IGZUb0NvbDsgY29sKyspCisgICAgICAgIC8vICAgICAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSBmRnJvbVJvdzsgcm93IDw9IGZUb1Jvdzsgcm93KyspCisgICAgICAgIC8vICAgICAgICAgICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBpbnQuTWluVmFsdWUpOworICAgICAgICAvLyAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgICAgIHJlbW92ZWQuQWRkKGluZGV4KTsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBmb3JlYWNoIChpbnQgaW5kZXggaW4gcmVtb3ZlZCkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGluZGV4KTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30KKwkJaW50ZXJuYWwgdm9pZCBTZXRTaGFyZWRGb3JtdWxhSUQoaW50IGlkKQorCQl7CisJCQlmb3IgKGludCBjb2wgPSBfZnJvbUNvbDsgY29sIDw9IF90b0NvbDsgY29sKyspCisJCQl7CisJCQkJZm9yIChpbnQgcm93ID0gX2Zyb21Sb3c7IHJvdyA8PSBfdG9Sb3c7IHJvdysrKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fZm9ybXVsYXMuU2V0VmFsdWUocm93LCBjb2wsIGlkKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpdmF0ZSB2b2lkIENoZWNrQW5kU3BsaXRTaGFyZWRGb3JtdWxhKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcykKKwkJeworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykKKwkJCXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBfd29ya3NoZWV0Ll9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmIGlzIGludCAmJiAoaW50KWYgPj0gMCkKKwkJCQkJeworCQkJCQkJU3BsaXRGb3JtdWxhcyhhZGRyZXNzKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBTcGxpdEZvcm11bGFzKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcykKKwkJeworCQkJTGlzdDxpbnQ+IGZvcm11bGFzID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykKKwkJCXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKQorCQkJCXsKKwkJCQkJdmFyIGYgPSBfd29ya3NoZWV0Ll9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmIGlzIGludCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gKGludClmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDAgJiYgIWZvcm11bGFzLkNvbnRhaW5zKGlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXNbaWRdLklzQXJyYXkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxpZGUoX3dvcmtzaGVldC5DZWxsc1tfd29ya3NoZWV0Ll9zaGFyZWRGb3JtdWxhc1tpZF0uQWRkcmVzc10pID09IGVBZGRyZXNzQ29sbGl0aW9uLlBhcnRseSkgLy8gSWYgdGhlIGZvcm11bGEgaXMgYW4gYXJyYXkgZm9ybXVsYSBhbmQgaXRzIG9uIHRoZSBpbnNpZGUgdGhlIG92ZXJ3cml0aW5nIHJhbmdlIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4gbm90IG92ZXJ3cml0ZSBhIHBhcnQgb2YgYW4gYXJyYXktZm9ybXVsYSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYXMuQWRkKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisJCQkJfQorCQkJfQorCisJCQlmb3JlYWNoIChpbnQgaXggaW4gZm9ybXVsYXMpCisJCQl7CisgICAgICAgICAgICAgICAgU3BsaXRGb3JtdWxhKGFkZHJlc3MsIGl4KTsKKwkJCX0KKyAgICAgICAgCisgICAgICAgICAgICAvLy8vQ2xlYXIgYW55IGZvcm11bGEgcmVmZXJlbmNlcyBpbnNpZGUgdGhlIHJlZmVyZWQgcmFuZ2UKKyAgICAgICAgICAgIC8vX3dvcmtzaGVldC5fZm9ybXVsYXMuQ2xlYXIoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fdG9Sb3csIGFkZHJlc3MuX3RvUm93IC0gYWRkcmVzcy5fZnJvbVJvdyArIDEsIGFkZHJlc3MuX3RvQ29sIC0gYWRkcmVzcy5jb2x1bW4gKyAxKTsKKyAgICAgICAgfQorCisJCXByaXZhdGUgdm9pZCBTcGxpdEZvcm11bGEoRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzLCBpbnQgaXgpCisJCXsKKwkJCXZhciBmID0gX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXNbaXhdOworCQkJdmFyIGZSYW5nZSA9IF93b3Jrc2hlZXQuQ2VsbHNbZi5BZGRyZXNzXTsKKyAgICAgICAgICAgIHZhciBjb2xsaWRlID0gYWRkcmVzcy5Db2xsaWRlKGZSYW5nZSk7CisKKyAgICAgICAgICAgIC8vVGhlIGZvcm11bGEgaXMgaW5zaWRlIHRoZSBjdXJyZW5jdCByYW5nZSwgcmVtb3ZlIGl0CisJCQlpZiAoY29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5FcXVhbCB8fCBjb2xsaWRlID09IGVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZSkKKwkJCXsKKwkJCQlfd29ya3NoZWV0Ll9zaGFyZWRGb3JtdWxhcy5SZW1vdmUoaXgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKwkJCQkvL2ZSYW5nZS5TZXRTaGFyZWRGb3JtdWxhSUQoaW50Lk1pblZhbHVlKTsgCisJCQl9CisgICAgICAgICAgICB2YXIgZmlyc3RDZWxsQ29sbGlkZSA9IGFkZHJlc3MuQ29sbGlkZShuZXcgRXhjZWxBZGRyZXNzQmFzZShmUmFuZ2UuX2Zyb21Sb3csIGZSYW5nZS5fZnJvbUNvbCwgZlJhbmdlLl9mcm9tUm93LCBmUmFuZ2UuX2Zyb21Db2wpKTsKKyAgICAgICAgICAgIGlmIChjb2xsaWRlID09IGVBZGRyZXNzQ29sbGl0aW9uLlBhcnRseSAmJiAoZmlyc3RDZWxsQ29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUgfHwgZmlyc3RDZWxsQ29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5FcXVhbCkpIC8vRG8gd2UgbmVlZCB0byBzcGxpdD8gT25seSBpZiB0aGUgZnVuY3Rpb25zIGZpcnN0IHJvdyBpcyBpbnNpZGUgdGhlIG5ldyByYW5nZS4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1RoZSBmb3JtdWxhIHBhcnRseSBjb2xsaWRlcyB3aXRoIHRoZSBjdXJyZW50IHJhbmdlCisgICAgICAgICAgICAgICAgYm9vbCBmSXNTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgZm9ybXVsYVIxQzEgPSBmUmFuZ2UuRm9ybXVsYVIxQzE7CisgICAgICAgICAgICAgICAgLy9Ub3AgUmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAoZlJhbmdlLl9mcm9tUm93IDwgX2Zyb21Sb3cpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZlJhbmdlLl9mcm9tUm93LCBmUmFuZ2UuX2Zyb21Db2wsIF9mcm9tUm93IC0gMSwgZlJhbmdlLl90b0NvbCk7CisgICAgICAgICAgICAgICAgICAgIGZJc1NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vTGVmdCBSYW5nZQorICAgICAgICAgICAgICAgIGlmIChmUmFuZ2UuX2Zyb21Db2wgPCBhZGRyZXNzLl9mcm9tQ29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZJc1NldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBFeGNlbFdvcmtzaGVldC5Gb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5JbmRleCA9IF93b3Jrc2hlZXQuR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuU3RhcnRDb2wgPSBmUmFuZ2UuX2Zyb21Db2w7CisgICAgICAgICAgICAgICAgICAgICAgICBmLklzQXJyYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZJc1NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZSYW5nZS5fZnJvbVJvdyA8IGFkZHJlc3MuX2Zyb21Sb3cpCisgICAgICAgICAgICAgICAgICAgICAgICBmLlN0YXJ0Um93ID0gYWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLlN0YXJ0Um93ID0gZlJhbmdlLl9mcm9tUm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmUmFuZ2UuX3RvUm93IDwgYWRkcmVzcy5fdG9Sb3cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmFuZ2UuX3RvUm93LCBhZGRyZXNzLl9mcm9tQ29sIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5TdGFydFJvdywgZi5TdGFydENvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5fdG9Sb3csIGFkZHJlc3MuX2Zyb21Db2wgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLkZvcm11bGEgPSBUcmFuc2xhdGVGcm9tUjFDMShmb3JtdWxhUjFDMSwgZi5TdGFydFJvdywgZi5TdGFydENvbCk7CisgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSUQoZi5JbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vUmlnaHQgUmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAoZlJhbmdlLl90b0NvbCA+IGFkZHJlc3MuX3RvQ29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZJc1NldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBFeGNlbFdvcmtzaGVldC5Gb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5JbmRleCA9IF93b3Jrc2hlZXQuR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuSXNBcnJheSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuQWRkKGYuSW5kZXgsIGYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZklzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLlN0YXJ0Q29sID0gYWRkcmVzcy5fdG9Db2wgKyAxOworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5fZnJvbVJvdyA8IGZSYW5nZS5fZnJvbVJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuU3RhcnRSb3cgPSBmUmFuZ2UuX2Zyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5TdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZlJhbmdlLl90b1JvdyA8IGFkZHJlc3MuX3RvUm93KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5TdGFydFJvdywgZi5TdGFydENvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJhbmdlLl90b1JvdywgZlJhbmdlLl90b0NvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5TdGFydFJvdywgZi5TdGFydENvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5fdG9Sb3csIGZSYW5nZS5fdG9Db2wpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYuRm9ybXVsYSA9IFRyYW5zbGF0ZUZyb21SMUMxKGZvcm11bGFSMUMxLCBmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sKTsKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJRChmLkluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9Cb3R0b20gUmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAoZlJhbmdlLl90b1JvdyA+IGFkZHJlc3MuX3RvUm93KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZJc1NldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBFeGNlbFdvcmtzaGVldC5Gb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5JbmRleCA9IF93b3Jrc2hlZXQuR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuSXNBcnJheSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuQWRkKGYuSW5kZXgsIGYpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZi5TdGFydENvbCA9IGZSYW5nZS5fZnJvbUNvbDsKKyAgICAgICAgICAgICAgICAgICAgZi5TdGFydFJvdyA9IF90b1JvdyArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gVHJhbnNsYXRlRnJvbVIxQzEoZm9ybXVsYVIxQzEsIGYuU3RhcnRSb3csIGYuU3RhcnRDb2wpOworCisgICAgICAgICAgICAgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSYW5nZS5fdG9Sb3csIGZSYW5nZS5fdG9Db2wpOworICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzW2YuQWRkcmVzc10uU2V0U2hhcmVkRm9ybXVsYUlEKGYuSW5kZXgpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCQl9CisJCXByaXZhdGUgb2JqZWN0IENvbnZlcnREYXRhKEV4Y2VsVGV4dEZvcm1hdCBGb3JtYXQsIHN0cmluZyB2LCBpbnQgY29sLCBib29sIGlzVGV4dCkKKwkJeworCQkJaWYgKGlzVGV4dCAmJiAoRm9ybWF0LkRhdGFUeXBlcyA9PSBudWxsIHx8IEZvcm1hdC5EYXRhVHlwZXMuTGVuZ3RoIDwgY29sKSkgcmV0dXJuIHY7CisKKwkJCWRvdWJsZSBkOworCQkJRGF0ZVRpbWUgZHQ7CisJCQlpZiAoRm9ybWF0LkRhdGFUeXBlcyA9PSBudWxsIHx8IEZvcm1hdC5EYXRhVHlwZXMuTGVuZ3RoIDw9IGNvbCB8fCBGb3JtYXQuRGF0YVR5cGVzW2NvbF0gPT0gZURhdGFUeXBlcy5Vbmtub3duKQorCQkJeworCQkJCXN0cmluZyB2MiA9IHYuRW5kc1dpdGgoIiUiKSA/IHYuU3Vic3RyaW5nKDAsIHYuTGVuZ3RoIC0gMSkgOiB2OworCQkJCWlmIChkb3VibGUuVHJ5UGFyc2UodjIsIE51bWJlclN0eWxlcy5BbnksIEZvcm1hdC5DdWx0dXJlLCBvdXQgZCkpCisJCQkJeworCQkJCQlpZiAodjIgPT0gdikKKwkJCQkJeworCQkJCQkJcmV0dXJuIGQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4gZCAvIDEwMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoRGF0ZVRpbWUuVHJ5UGFyc2UodiwgRm9ybWF0LkN1bHR1cmUsIERhdGVUaW1lU3R5bGVzLk5vbmUsIG91dCBkdCkpCisJCQkJeworCQkJCQlyZXR1cm4gZHQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiB2OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzd2l0Y2ggKEZvcm1hdC5EYXRhVHlwZXNbY29sXSkKKwkJCQl7CisJCQkJCWNhc2UgZURhdGFUeXBlcy5OdW1iZXI6CisJCQkJCQlpZiAoZG91YmxlLlRyeVBhcnNlKHYsIE51bWJlclN0eWxlcy5BbnksIEZvcm1hdC5DdWx0dXJlLCBvdXQgZCkpCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuIGQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuIHY7CisJCQkJCQl9CisJCQkJCWNhc2UgZURhdGFUeXBlcy5EYXRlVGltZToKKwkJCQkJCWlmIChEYXRlVGltZS5UcnlQYXJzZSh2LCBGb3JtYXQuQ3VsdHVyZSwgRGF0ZVRpbWVTdHlsZXMuTm9uZSwgb3V0IGR0KSkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4gZHQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuIHY7CisJCQkJCQl9CisJCQkJCWNhc2UgZURhdGFUeXBlcy5QZXJjZW50OgorCQkJCQkJc3RyaW5nIHYyID0gdi5FbmRzV2l0aCgiJSIpID8gdi5TdWJzdHJpbmcoMCwgdi5MZW5ndGggLSAxKSA6IHY7CisJCQkJCQlpZiAoZG91YmxlLlRyeVBhcnNlKHYyLCBOdW1iZXJTdHlsZXMuQW55LCBGb3JtYXQuQ3VsdHVyZSwgb3V0IGQpKQorCQkJCQkJeworCQkJCQkJCXJldHVybiBkIC8gMTAwOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXJldHVybiB2OworCQkJCQkJfQorCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gdjsKKworCQkJCX0KKwkJCX0KKwkJfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gUHVibGljIE1ldGhvZHMKKwkJI3JlZ2lvbiBDb25kaXRpb25hbEZvcm1hdHRpbmcKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBmb3IgdGhpcyByYW5nZS4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIElSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZyBDb25kaXRpb25hbEZvcm1hdHRpbmcKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJcmV0dXJuIG5ldyBSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZyhfd29ya3NoZWV0LCBuZXcgRXhjZWxBZGRyZXNzKEFkZHJlc3MpKTsKKwkJCX0KKwkJfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gRGF0YVZhbGlkYXRpb24KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gRGF0YSB2YWxpZGF0aW9uIGZvciB0aGlzIHJhbmdlLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgSVJhbmdlRGF0YVZhbGlkYXRpb24gRGF0YVZhbGlkYXRpb24KKwkJeworCQkJZ2V0CisJCQl7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZURhdGFWYWxpZGF0aW9uKF93b3Jrc2hlZXQsIEFkZHJlc3MpOworCQkJfQorCQl9CisJCSNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiBMb2FkRnJvbURhdGFSZWFkZXIKKwkgICAgLy8vIDxzdW1tYXJ5PgorCSAgICAvLy8gTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhcmVhZGVyIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwgb2YgdGhlIHJhbmdlCisJICAgIC8vLyA8L3N1bW1hcnk+CisJICAgIC8vLyA8cGFyYW0gbmFtZT0iUmVhZGVyIj5UaGUgZGF0YXJlYWRlciB0byBsb2FkZnJvbTwvcGFyYW0+CisJICAgIC8vLyA8cGFyYW0gbmFtZT0iUHJpbnRIZWFkZXJzIj5QcmludCB0aGUgY29sdW1uIGNhcHRpb24gcHJvcGVydHkgKGlmIHNldCkgb3IgdGhlIGNvbHVtbm5hbWUgcHJvcGVydHkgaWYgbm90LCBvbiBmaXJzdCByb3c8L3BhcmFtPgorCSAgICAvLy8gPHBhcmFtIG5hbWU9IlRhYmxlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhYmxlPC9wYXJhbT4KKwkgICAgLy8vIDxwYXJhbSBuYW1lPSJUYWJsZVN0eWxlIj5UaGUgdGFibGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIGRhdGE8L3BhcmFtPgorCSAgICAvLy8gPHJldHVybnM+VGhlIGZpbGxlZCByYW5nZTwvcmV0dXJucz4KKwkgICAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tRGF0YVJlYWRlcihJRGF0YVJlYWRlciBSZWFkZXIsIGJvb2wgUHJpbnRIZWFkZXJzLCBzdHJpbmcgVGFibGVOYW1lLCBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlID0gVGFibGVTdHlsZXMuTm9uZSkKKwkgICAgeworCSAgICAgICAgdmFyIHIgPSBMb2FkRnJvbURhdGFSZWFkZXIoUmVhZGVyLCBQcmludEhlYWRlcnMpOworCisgICAgICAgICAgICBpbnQgcm93cyA9IHIuUm93cyAtIDE7CisJICAgICAgICBpZiAocm93cyA+PSAwICYmIHIuQ29sdW1ucyA+IDApCisJICAgICAgICB7CisJICAgICAgICAgICAgdmFyIHRibCA9IF93b3Jrc2hlZXQuVGFibGVzLkFkZChuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgX2Zyb21Db2wsIF9mcm9tUm93ICsgKHJvd3MgPD0gMCA/IDEgOiByb3dzKSwgX2Zyb21Db2wgKyByLkNvbHVtbnMgLSAxKSwgVGFibGVOYW1lKTsKKwkgICAgICAgICAgICB0YmwuU2hvd0hlYWRlciA9IFByaW50SGVhZGVyczsKKwkgICAgICAgICAgICB0YmwuVGFibGVTdHlsZSA9IFRhYmxlU3R5bGU7CisJICAgICAgICB9CisJICAgICAgICByZXR1cm4gcjsKKwkgICAgfQorCisJICAgIC8vLyA8c3VtbWFyeT4KKwkgICAgLy8vIExvYWQgdGhlIGRhdGEgZnJvbSB0aGUgZGF0YXJlYWRlciBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsIG9mIHRoZSByYW5nZQorCSAgICAvLy8gPC9zdW1tYXJ5PgorCSAgICAvLy8gPHBhcmFtIG5hbWU9IlJlYWRlciI+VGhlIGRhdGFyZWFkZXIgdG8gbG9hZCBmcm9tPC9wYXJhbT4KKwkgICAgLy8vIDxwYXJhbSBuYW1lPSJQcmludEhlYWRlcnMiPlByaW50IHRoZSBjYXB0aW9uIHByb3BlcnR5IChpZiBzZXQpIG9yIHRoZSBjb2x1bW5uYW1lIHByb3BlcnR5IGlmIG5vdCwgb24gZmlyc3Qgcm93PC9wYXJhbT4KKwkgICAgLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisJICAgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbURhdGFSZWFkZXIoSURhdGFSZWFkZXIgUmVhZGVyLCBib29sIFByaW50SGVhZGVycykKKwkgICAgeworCSAgICAgICAgaWYgKFJlYWRlciA9PSBudWxsKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJSZWFkZXIiLCAiUmVhZGVyIGNhbid0IGJlIG51bGwiKSk7CisJICAgICAgICB9CisJICAgICAgICBpbnQgZmllbGRDb3VudCA9IFJlYWRlci5GaWVsZENvdW50OworCSAgCisJICAgICAgICBpbnQgY29sID0gX2Zyb21Db2wsIHJvdyA9IF9mcm9tUm93OworCSAgICAgICAgaWYgKFByaW50SGVhZGVycykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQ291bnQ7IGkrKykKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIC8vIElmIG5vIGNhcHRpb24gaXMgc2V0LCB0aGUgQ29sdW1uTmFtZSBwcm9wZXJ0eSBpcyBjYWxsZWQgaW1wbGljaXRseS4KKwkgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sKyssIFJlYWRlci5HZXROYW1lKGkpKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgcm93Kys7CisJICAgICAgICAgICAgY29sID0gX2Zyb21Db2w7CisJICAgICAgICB9CisJICAgICAgICB3aGlsZShSZWFkZXIuUmVhZCgpKQorCSAgICAgICAgeworCSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRDb3VudDsgaSsrKQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sKyssIFJlYWRlci5HZXRWYWx1ZShpKSk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIHJvdysrOworCSAgICAgICAgICAgIGNvbCA9IF9mcm9tQ29sOworCSAgICAgICAgfQorCSAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ2VsbHNbX2Zyb21Sb3csIF9mcm9tQ29sLCByb3cgLSAxLCBfZnJvbUNvbCArIGZpZWxkQ291bnQgLSAxXTsKKwkgICAgfQorCSAgICAjZW5kcmVnaW9uCisJCSNyZWdpb24gTG9hZEZyb21EYXRhVGFibGUKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhdGFibGUgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJUYWJsZSI+VGhlIGRhdGF0YWJsZSB0byBsb2FkPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJQcmludEhlYWRlcnMiPlByaW50IHRoZSBjb2x1bW4gY2FwdGlvbiBwcm9wZXJ0eSAoaWYgc2V0KSBvciB0aGUgY29sdW1ubmFtZSBwcm9wZXJ0eSBpZiBub3QsIG9uIGZpcnN0IHJvdzwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iVGFibGVTdHlsZSI+VGhlIHRhYmxlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBkYXRhPC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisJCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbURhdGFUYWJsZShEYXRhVGFibGUgVGFibGUsIGJvb2wgUHJpbnRIZWFkZXJzLCBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlKQorCQl7CisJCQl2YXIgciA9IExvYWRGcm9tRGF0YVRhYmxlKFRhYmxlLCBQcmludEhlYWRlcnMpOworCisgICAgICAgICAgICBpbnQgcm93cyA9IChUYWJsZS5Sb3dzLkNvdW50ID09IDAgPyAxIDogVGFibGUuUm93cy5Db3VudCkgKyAoUHJpbnRIZWFkZXJzID8gMSA6IDApOworICAgICAgICAgICAgaWYgKHJvd3MgPj0gMCAmJiBUYWJsZS5Db2x1bW5zLkNvdW50PjApCisJCQl7CisgICAgICAgICAgICAgICAgdmFyIHRibCA9IF93b3Jrc2hlZXQuVGFibGVzLkFkZChuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgX2Zyb21Db2wsIF9mcm9tUm93ICsgcm93cyAtIDEsIF9mcm9tQ29sICsgVGFibGUuQ29sdW1ucy5Db3VudC0xKSwgVGFibGUuVGFibGVOYW1lKTsKKwkJCQl0YmwuU2hvd0hlYWRlciA9IFByaW50SGVhZGVyczsKKwkJCQl0YmwuVGFibGVTdHlsZSA9IFRhYmxlU3R5bGU7CisJCQl9CisJCSAgICByZXR1cm4gcjsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBMb2FkIHRoZSBkYXRhIGZyb20gdGhlIGRhdGF0YWJsZSBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsIG9mIHRoZSByYW5nZQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IlRhYmxlIj5UaGUgZGF0YXRhYmxlIHRvIGxvYWQ8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9IlByaW50SGVhZGVycyI+UHJpbnQgdGhlIGNhcHRpb24gcHJvcGVydHkgKGlmIHNldCkgb3IgdGhlIGNvbHVtbm5hbWUgcHJvcGVydHkgaWYgbm90LCBvbiBmaXJzdCByb3c8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+VGhlIGZpbGxlZCByYW5nZTwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tRGF0YVRhYmxlKERhdGFUYWJsZSBUYWJsZSwgYm9vbCBQcmludEhlYWRlcnMpCisJCXsKKwkJCWlmIChUYWJsZSA9PSBudWxsKQorCQkJeworCQkJCXRocm93IChuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJUYWJsZSBjYW4ndCBiZSBudWxsIikpOworCQkJfQorCisJCQlpbnQgY29sID0gX2Zyb21Db2wsIHJvdyA9IF9mcm9tUm93OworCQkJaWYgKFByaW50SGVhZGVycykKKwkJCXsKKwkJCQlmb3JlYWNoIChEYXRhQ29sdW1uIGRjIGluIFRhYmxlLkNvbHVtbnMpCisJCQkJeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBjYXB0aW9uIGlzIHNldCwgdGhlIENvbHVtbk5hbWUgcHJvcGVydHkgaXMgY2FsbGVkIGltcGxpY2l0bHkuCisJCQkJCV93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCBkYy5DYXB0aW9uKTsKKwkJCQl9CisJCQkJcm93Kys7CisJCQkJY29sID0gX2Zyb21Db2w7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChUYWJsZS5Sb3dzLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisJCQlmb3JlYWNoIChEYXRhUm93IGRyIGluIFRhYmxlLlJvd3MpCisJCQl7CisJCQkJZm9yZWFjaCAob2JqZWN0IHZhbHVlIGluIGRyLkl0ZW1BcnJheSkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9IERCTnVsbC5WYWx1ZSAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUuVG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2wrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJCQlyb3crKzsKKwkJCQljb2wgPSBfZnJvbUNvbDsKKwkJCX0KKyAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LCBfZnJvbUNvbCwgKHJvdyA9PSBfZnJvbVJvdyA/IF9mcm9tUm93IDogcm93IC0gMSksIF9mcm9tQ29sICsgVGFibGUuQ29sdW1ucy5Db3VudCAtIDFdOworCQl9CisJCSNlbmRyZWdpb24KKwkJI3JlZ2lvbiBMb2FkRnJvbUFycmF5cworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBMb2FkcyBkYXRhIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgYXJyYXlzIG9mIG9iamVjdHMgaW50byB0aGUgcmFuZ2UsIHN0YXJ0aW5nIGZyb20KKwkJLy8vIHRoZSB0b3AtbGVmdCBjZWxsLgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IkRhdGEiPlRoZSBkYXRhLjwvcGFyYW0+CisJCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUFycmF5cyhJRW51bWVyYWJsZTxvYmplY3RbXT4gRGF0YSkKKwkJeworCQkJLy90aGFueCB0byBBYmR1bGxpbiBmb3IgdGhlIGNvZGUgY29udHJpYnV0aW9uCisJCQlpZiAoRGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJkYXRhIik7CisKKwkJCWludCBjb2x1bW4gPSBfZnJvbUNvbCwgcm93ID0gX2Zyb21Sb3c7CisKKwkJCWZvcmVhY2ggKHZhciByb3dEYXRhIGluIERhdGEpCisJCQl7CisJCQkJY29sdW1uID0gX2Zyb21Db2w7CisJCQkJZm9yZWFjaCAodmFyIGNlbGxEYXRhIGluIHJvd0RhdGEpCisJCQkJeworCQkJCQlfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2x1bW4sIGNlbGxEYXRhKTsKKwkJCQkJY29sdW1uICs9IDE7CisJCQkJfQorCQkJCXJvdyArPSAxOworCQkJfQorCQkJcmV0dXJuIF93b3Jrc2hlZXQuQ2VsbHNbX2Zyb21Sb3csIF9mcm9tQ29sLCByb3cgLSAxLCBjb2x1bW4gLSAxXTsKKwkJfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gTG9hZEZyb21Db2xsZWN0aW9uCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIExvYWQgYSBjb2xsZWN0aW9uIGludG8gYSB0aGUgd29ya3NoZWV0IHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IHJvdyBvZiB0aGUgcmFuZ2UuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBkYXRhdHlwZSBpbiB0aGUgY29sbGVjdGlvbjwvdHlwZXBhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9IkNvbGxlY3Rpb24iPlRoZSBjb2xsZWN0aW9uIHRvIGxvYWQ8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+VGhlIGZpbGxlZCByYW5nZTwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tQ29sbGVjdGlvbjxUPihJRW51bWVyYWJsZTxUPiBDb2xsZWN0aW9uKQorCQl7CisJCQlyZXR1cm4gTG9hZEZyb21Db2xsZWN0aW9uPFQ+KENvbGxlY3Rpb24sIGZhbHNlLCBUYWJsZVN0eWxlcy5Ob25lLCBCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLCBudWxsKTsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBMb2FkIGEgY29sbGVjdGlvbiBvZiBUIGludG8gdGhlIHdvcmtzaGVldCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCByb3cgb2YgdGhlIHJhbmdlLgorCQkvLy8gRGVmYXVsdCBvcHRpb24gd2lsbCBsb2FkIGFsbCBwdWJsaWMgaW5zdGFuY2UgcHJvcGVydGllcyBvZiBUCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBkYXRhdHlwZSBpbiB0aGUgY29sbGVjdGlvbjwvdHlwZXBhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9IkNvbGxlY3Rpb24iPlRoZSBjb2xsZWN0aW9uIHRvIGxvYWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlByaW50SGVhZGVycyI+UHJpbnQgdGhlIHByb3BlcnR5IG5hbWVzIG9uIHRoZSBmaXJzdCByb3cuIElmIHRoZSBwcm9wZXJ0eSBpcyBkZWNvcmF0ZWQgd2l0aCBhIDxzZWUgY3JlZj0iRGlzcGxheU5hbWVBdHRyaWJ1dGUiLz4gb3IgYSA8c2VlIGNyZWY9IkRlc2NyaXB0aW9uQXR0cmlidXRlIi8+IHRoYXQgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSByZWZsZWN0ZWQgbWVtYmVyIG5hbWUuPC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisJCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUNvbGxlY3Rpb248VD4oSUVudW1lcmFibGU8VD4gQ29sbGVjdGlvbiwgYm9vbCBQcmludEhlYWRlcnMpCisJCXsKKwkJCXJldHVybiBMb2FkRnJvbUNvbGxlY3Rpb248VD4oQ29sbGVjdGlvbiwgUHJpbnRIZWFkZXJzLCBUYWJsZVN0eWxlcy5Ob25lLCBCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLCBudWxsKTsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBMb2FkIGEgY29sbGVjdGlvbiBvZiBUIGludG8gdGhlIHdvcmtzaGVldCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCByb3cgb2YgdGhlIHJhbmdlLgorCQkvLy8gRGVmYXVsdCBvcHRpb24gd2lsbCBsb2FkIGFsbCBwdWJsaWMgaW5zdGFuY2UgcHJvcGVydGllcyBvZiBUCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBkYXRhdHlwZSBpbiB0aGUgY29sbGVjdGlvbjwvdHlwZXBhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9IkNvbGxlY3Rpb24iPlRoZSBjb2xsZWN0aW9uIHRvIGxvYWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlByaW50SGVhZGVycyI+UHJpbnQgdGhlIHByb3BlcnR5IG5hbWVzIG9uIHRoZSBmaXJzdCByb3cuIElmIHRoZSBwcm9wZXJ0eSBpcyBkZWNvcmF0ZWQgd2l0aCBhIDxzZWUgY3JlZj0iRGlzcGxheU5hbWVBdHRyaWJ1dGUiLz4gb3IgYSA8c2VlIGNyZWY9IkRlc2NyaXB0aW9uQXR0cmlidXRlIi8+IHRoYXQgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSByZWZsZWN0ZWQgbWVtYmVyIG5hbWUuPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJUYWJsZVN0eWxlIj5XaWxsIGNyZWF0ZSBhIHRhYmxlIHdpdGggdGhpcyBzdHlsZS4gSWYgc2V0IHRvIFRhYmxlU3R5bGVzLk5vbmUgbm8gdGFibGUgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisJCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUNvbGxlY3Rpb248VD4oSUVudW1lcmFibGU8VD4gQ29sbGVjdGlvbiwgYm9vbCBQcmludEhlYWRlcnMsIFRhYmxlU3R5bGVzIFRhYmxlU3R5bGUpCisJCXsKKwkJCXJldHVybiBMb2FkRnJvbUNvbGxlY3Rpb248VD4oQ29sbGVjdGlvbiwgUHJpbnRIZWFkZXJzLCBUYWJsZVN0eWxlLCBCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLCBudWxsKTsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBMb2FkIGEgY29sbGVjdGlvbiBpbnRvIHRoZSB3b3Jrc2hlZXQgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgcm93IG9mIHRoZSByYW5nZS4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIGRhdGF0eXBlIGluIHRoZSBjb2xsZWN0aW9uPC90eXBlcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iQ29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24gdG8gbG9hZDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iUHJpbnRIZWFkZXJzIj5QcmludCB0aGUgcHJvcGVydHkgbmFtZXMgb24gdGhlIGZpcnN0IHJvdy4gQW55IHVuZGVyc2NvcmUgaW4gdGhlIHByb3BlcnR5IG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzcGFjZS4gSWYgdGhlIHByb3BlcnR5IGlzIGRlY29yYXRlZCB3aXRoIGEgPHNlZSBjcmVmPSJEaXNwbGF5TmFtZUF0dHJpYnV0ZSIvPiBvciBhIDxzZWUgY3JlZj0iRGVzY3JpcHRpb25BdHRyaWJ1dGUiLz4gdGhhdCBhdHRyaWJ1dGUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHJlZmxlY3RlZCBtZW1iZXIgbmFtZS48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9IlRhYmxlU3R5bGUiPldpbGwgY3JlYXRlIGEgdGFibGUgd2l0aCB0aGlzIHN0eWxlLiBJZiBzZXQgdG8gVGFibGVTdHlsZXMuTm9uZSBubyB0YWJsZSB3aWxsIGJlIGNyZWF0ZWQ8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Im1lbWJlckZsYWdzIj5Qcm9wZXJ0eSBmbGFncyB0byB1c2U8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Ik1lbWJlcnMiPlRoZSBwcm9wZXJ0aWVzIHRvIG91dHB1dC4gTXVzdCBiZSBvZiB0eXBlIFQ8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+VGhlIGZpbGxlZCByYW5nZTwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tQ29sbGVjdGlvbjxUPihJRW51bWVyYWJsZTxUPiBDb2xsZWN0aW9uLCBib29sIFByaW50SGVhZGVycywgVGFibGVTdHlsZXMgVGFibGVTdHlsZSwgQmluZGluZ0ZsYWdzIG1lbWJlckZsYWdzLCBNZW1iZXJJbmZvW10gTWVtYmVycykKKwkJeworCQkJdmFyIHR5cGUgPSB0eXBlb2YoVCk7CisJCQlpZiAoTWVtYmVycyA9PSBudWxsKQorCQkJeworCQkJCU1lbWJlcnMgPSB0eXBlLkdldFByb3BlcnRpZXMobWVtYmVyRmxhZ3MpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvcmVhY2ggKHZhciB0IGluIE1lbWJlcnMpCisJCQkJeworICAgICAgICAgICAgICAgICAgICBpZiAodC5EZWNsYXJpbmdUeXBlIT1udWxsICYmIHQuRGVjbGFyaW5nVHlwZSAhPSB0eXBlICYmICF0LkRlY2xhcmluZ1R5cGUuSXNTdWJjbGFzc09mKHR5cGUpKQorCQkJCQl7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZENhc3RFeGNlcHRpb24oIlN1cHBsaWVkIHByb3BlcnRpZXMgaW4gcGFyYW1ldGVyIFByb3BlcnRpZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIFQgKG9yIGFuIGFzc2lnbmFibGUgdHlwZSBmcm9tIFQiKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaW50IGNvbCA9IF9mcm9tQ29sLCByb3cgPSBfZnJvbVJvdzsKKwkJCWlmIChNZW1iZXJzLkxlbmd0aCA+IDAgJiYgUHJpbnRIZWFkZXJzKQorCQkJeworCQkJCWZvcmVhY2ggKHZhciB0IGluIE1lbWJlcnMpCisJCQkJeworICAgICAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRpb25BdHRyaWJ1dGUgPSB0LkdldEN1c3RvbUF0dHJpYnV0ZXModHlwZW9mKERlc2NyaXB0aW9uQXR0cmlidXRlKSwgZmFsc2UpLkZpcnN0T3JEZWZhdWx0KCkgYXMgRGVzY3JpcHRpb25BdHRyaWJ1dGU7CisJCQkJICAgIHZhciBoZWFkZXIgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbkF0dHJpYnV0ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBkZXNjcmlwdGlvbkF0dHJpYnV0ZS5EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5TmFtZUF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5HZXRDdXN0b21BdHRyaWJ1dGVzKHR5cGVvZiAoRGlzcGxheU5hbWVBdHRyaWJ1dGUpLCBmYWxzZSkuRmlyc3RPckRlZmF1bHQoKSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lQXR0cmlidXRlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlOYW1lQXR0cmlidXRlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gZGlzcGxheU5hbWVBdHRyaWJ1dGUuRGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gdC5OYW1lLlJlcGxhY2UoJ18nLCAnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCBoZWFkZXIpOworCQkJCX0KKwkJCQlyb3crKzsKKwkJCX0KKworCQkgICAgaWYgKCFDb2xsZWN0aW9uLkFueSgpICYmIChNZW1iZXJzLkxlbmd0aCA9PSAwIHx8IFByaW50SGVhZGVycyA9PSBmYWxzZSkpCisJCSAgICB7CisJCSAgICAgICAgcmV0dXJuIG51bGw7CisJCSAgICB9CisKKwkJCWlmIChNZW1iZXJzLkxlbmd0aCA9PSAwKQorCQkJeworCQkJCWZvcmVhY2ggKHZhciBpdGVtIGluIENvbGxlY3Rpb24pCisJCQkJeworCQkJCQlfd29ya3NoZWV0LkNlbGxzW3JvdysrLCBjb2xdLlZhbHVlID0gaXRlbTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ29sbGVjdGlvbikKKwkJCQl7CisJCQkJCWNvbCA9IF9mcm9tQ29sOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpcyBzdHJpbmcgfHwgaXRlbSBpcyBkZWNpbWFsIHx8IGl0ZW0gaXMgRGF0ZVRpbWUgfHwgaXRlbS5HZXRUeXBlKCkuSXNQcmltaXRpdmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2wrK10uVmFsdWUgPSBpdGVtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gTWVtYmVycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpcyBQcm9wZXJ0eUluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzW3JvdywgY29sKytdLlZhbHVlID0gKChQcm9wZXJ0eUluZm8pdCkuR2V0VmFsdWUoaXRlbSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgaXMgRmllbGRJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbCsrXS5WYWx1ZSA9ICgoRmllbGRJbmZvKXQpLkdldFZhbHVlKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0IGlzIE1ldGhvZEluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzW3JvdywgY29sKytdLlZhbHVlID0gKChNZXRob2RJbmZvKXQpLkludm9rZShpdGVtLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcm93Kys7CisJCQkJfQorCQkJfQorCisgICAgICAgICAgICBpZiAoX2Zyb21Sb3cgPT0gcm93LTEgJiYgUHJpbnRIZWFkZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgciA9IF93b3Jrc2hlZXQuQ2VsbHNbX2Zyb21Sb3csIF9mcm9tQ29sLCByb3cgLSAxLCBNZW1iZXJzLkxlbmd0aD09MCA/IGNvbCA6IGNvbCAtIDFdOworCisJCQlpZiAoVGFibGVTdHlsZSAhPSBUYWJsZVN0eWxlcy5Ob25lKQorCQkJeworCQkJCXZhciB0YmwgPSBfd29ya3NoZWV0LlRhYmxlcy5BZGQociwgIiIpOworCQkJCXRibC5TaG93SGVhZGVyID0gUHJpbnRIZWFkZXJzOworCQkJCXRibC5UYWJsZVN0eWxlID0gVGFibGVTdHlsZTsKKwkJCX0KKwkJCXJldHVybiByOworCQl9CisJCSNlbmRyZWdpb24KKwkJI3JlZ2lvbiBMb2FkRnJvbVRleHQKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gTG9hZHMgYSBDU1YgdGV4dCBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKwkJLy8vIERlZmF1bHQgc2V0dGluZ3MgaXMgQ29tbWEgc2VwYXJhdGlvbgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IlRleHQiPlRoZSBUZXh0PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPlRoZSByYW5nZSBjb250YWluaW5nIHRoZSBkYXRhPC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KHN0cmluZyBUZXh0KQorCQl7CisJCQlyZXR1cm4gTG9hZEZyb21UZXh0KFRleHQsIG5ldyBFeGNlbFRleHRGb3JtYXQoKSk7CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gTG9hZHMgYSBDU1YgdGV4dCBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgVGV4dDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iRm9ybWF0Ij5JbmZvcm1hdGlvbiBob3cgdG8gbG9hZCB0aGUgdGV4dDwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz5UaGUgcmFuZ2UgY29udGFpbmluZyB0aGUgZGF0YTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChzdHJpbmcgVGV4dCwgRXhjZWxUZXh0Rm9ybWF0IEZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KFRleHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByID0gX3dvcmtzaGVldC5DZWxsc1tfZnJvbVJvdywgX2Zyb21Db2xdOworICAgICAgICAgICAgICAgIHIuVmFsdWUgPSAiIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZvcm1hdCA9PSBudWxsKSBGb3JtYXQgPSBuZXcgRXhjZWxUZXh0Rm9ybWF0KCk7CisKKyAgICAgICAgICAgIHN0cmluZyBzcGxpdFJlZ2V4ID0gU3RyaW5nLkZvcm1hdCgiezB9KD89KD86W157MX1dKnsxfVteezF9XSp7MX0pKlteezF9XSokKSIsIEZvcm1hdC5FT0wsIEZvcm1hdC5UZXh0UXVhbGlmaWVyKTsKKyAgICAgICAgICAgIHN0cmluZ1tdIGxpbmVzID0gUmVnZXguU3BsaXQoVGV4dCwgc3BsaXRSZWdleCk7CisgICAgICAgICAgICBpbnQgcm93ID0gX2Zyb21Sb3c7CisgICAgICAgICAgICBpbnQgY29sID0gX2Zyb21Db2w7CisgICAgICAgICAgICBpbnQgbWF4Q29sID0gY29sOworICAgICAgICAgICAgaW50IGxpbmVObyA9IDE7CisgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgbGluZSBpbiBsaW5lcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZU5vID4gRm9ybWF0LlNraXBMaW5lc0JlZ2lubmluZyAmJiBsaW5lTm8gPD0gbGluZXMuTGVuZ3RoIC0gRm9ybWF0LlNraXBMaW5lc0VuZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbCA9IF9mcm9tQ29sOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdiA9ICIiOworICAgICAgICAgICAgICAgICAgICBib29sIGlzVGV4dCA9IGZhbHNlLCBpc1F1YWxpZmllciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbnQgUUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVRQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChjaGFyIGMgaW4gbGluZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZvcm1hdC5UZXh0UXVhbGlmaWVyICE9IDAgJiYgYyA9PSBGb3JtYXQuVGV4dFF1YWxpZmllcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGV4dCAmJiB2ICE9ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBUZXh0IFF1YWxpZmllciBpbiBsaW5lIDogezB9IiwgbGluZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNRdWFsaWZpZXIgPSAhaXNRdWFsaWZpZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVFDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFDb3VudCA+IDEgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KHYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSBuZXcgc3RyaW5nKEZvcm1hdC5UZXh0UXVhbGlmaWVyLCBRQ291bnQgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoUUNvdW50ID4gMiAmJiBzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gbmV3IHN0cmluZyhGb3JtYXQuVGV4dFF1YWxpZmllciwgKFFDb3VudCAtIDEpIC8gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUXVhbGlmaWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBGb3JtYXQuRGVsaW1pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LlNldFZhbHVlKHJvdywgY29sLCBDb252ZXJ0RGF0YShGb3JtYXQsIHYsIGNvbCAtIF9mcm9tQ29sLCBpc1RleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGV4dCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUUNvdW50ICUgMiA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRleHQgZGVsaW1pdGVyIGlzIG5vdCBjbG9zZWQgaW4gbGluZSA6IHswfSIsIGxpbmUpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoUUNvdW50ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdiArPSBuZXcgc3RyaW5nKEZvcm1hdC5UZXh0UXVhbGlmaWVyLCBRQ291bnQgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGluZVFDb3VudCAlIDIgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRleHQgZGVsaW1pdGVyIGlzIG5vdCBjbG9zZWQgaW4gbGluZSA6IHswfSIsIGxpbmUpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBDb252ZXJ0RGF0YShGb3JtYXQsIHYsIGNvbCAtIF9mcm9tQ29sLCBpc1RleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCA+IG1heENvbCkgbWF4Q29sID0gY29sOworICAgICAgICAgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZU5vKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5DZWxsc1tfZnJvbVJvdywgX2Zyb21Db2wsIHJvdyAtIDEsIG1heENvbF07CisgICAgICAgIH0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gTG9hZHMgYSBDU1YgdGV4dCBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgVGV4dDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iRm9ybWF0Ij5JbmZvcm1hdGlvbiBob3cgdG8gbG9hZCB0aGUgdGV4dDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iVGFibGVTdHlsZSI+Q3JlYXRlIGEgdGFibGUgd2l0aCB0aGlzIHN0eWxlPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJGaXJzdFJvd0lzSGVhZGVyIj5Vc2UgdGhlIGZpcnN0IHJvdyBhcyBoZWFkZXI8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KHN0cmluZyBUZXh0LCBFeGNlbFRleHRGb3JtYXQgRm9ybWF0LCBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlLCBib29sIEZpcnN0Um93SXNIZWFkZXIpCisJCXsKKwkJCXZhciByID0gTG9hZEZyb21UZXh0KFRleHQsIEZvcm1hdCk7CisKKwkJCXZhciB0YmwgPSBfd29ya3NoZWV0LlRhYmxlcy5BZGQociwgIiIpOworCQkJdGJsLlNob3dIZWFkZXIgPSBGaXJzdFJvd0lzSGVhZGVyOworCQkJdGJsLlRhYmxlU3R5bGUgPSBUYWJsZVN0eWxlOworCisJCQlyZXR1cm4gcjsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBMb2FkcyBhIENTViBmaWxlIGludG8gYSByYW5nZSBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IlRleHRGaWxlIj5UaGUgVGV4dGZpbGU8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KEZpbGVJbmZvIFRleHRGaWxlKQorCQl7CisJCQlyZXR1cm4gTG9hZEZyb21UZXh0KEZpbGUuUmVhZEFsbFRleHQoVGV4dEZpbGUuRnVsbE5hbWUsIEVuY29kaW5nLkFTQ0lJKSk7CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gTG9hZHMgYSBDU1YgZmlsZSBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJUZXh0RmlsZSI+VGhlIFRleHRmaWxlPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJGb3JtYXQiPkluZm9ybWF0aW9uIGhvdyB0byBsb2FkIHRoZSB0ZXh0PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChGaWxlSW5mbyBUZXh0RmlsZSwgRXhjZWxUZXh0Rm9ybWF0IEZvcm1hdCkKKwkJeworCQkJcmV0dXJuIExvYWRGcm9tVGV4dChGaWxlLlJlYWRBbGxUZXh0KFRleHRGaWxlLkZ1bGxOYW1lLCBGb3JtYXQuRW5jb2RpbmcpLCBGb3JtYXQpOworCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIExvYWRzIGEgQ1NWIGZpbGUgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0iVGV4dEZpbGUiPlRoZSBUZXh0ZmlsZTwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iRm9ybWF0Ij5JbmZvcm1hdGlvbiBob3cgdG8gbG9hZCB0aGUgdGV4dDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iVGFibGVTdHlsZSI+Q3JlYXRlIGEgdGFibGUgd2l0aCB0aGlzIHN0eWxlPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJGaXJzdFJvd0lzSGVhZGVyIj5Vc2UgdGhlIGZpcnN0IHJvdyBhcyBoZWFkZXI8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KEZpbGVJbmZvIFRleHRGaWxlLCBFeGNlbFRleHRGb3JtYXQgRm9ybWF0LCBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlLCBib29sIEZpcnN0Um93SXNIZWFkZXIpCisJCXsKKwkJCXJldHVybiBMb2FkRnJvbVRleHQoRmlsZS5SZWFkQWxsVGV4dChUZXh0RmlsZS5GdWxsTmFtZSwgRm9ybWF0LkVuY29kaW5nKSwgRm9ybWF0LCBUYWJsZVN0eWxlLCBGaXJzdFJvd0lzSGVhZGVyKTsKKwkJfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gR2V0VmFsdWUKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gR2V0IHRoZSBzdHJvbmdseSB0eXBlZCB2YWx1ZSBvZiB0aGUgY2VsbC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGU8L3R5cGVwYXJhbT4KKwkJLy8vIDxyZXR1cm5zPlRoZSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNhbid0IGJlIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQ8L3JldHVybnM+CisJCXB1YmxpYyBUIEdldFZhbHVlPFQ+KCkKKwkJeworCQkJcmV0dXJuIF93b3Jrc2hlZXQuR2V0VHlwZWRWYWx1ZTxUPihWYWx1ZSk7CisJCX0KKwkJI2VuZHJlZ2lvbgorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXQgYSByYW5nZSB3aXRoIGFuIG9mZnNldCBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgorCQkvLy8gVGhlIG5ldyByYW5nZSBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgY3VycmVudCByYW5nZQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IlJvd09mZnNldCI+Um93IE9mZnNldDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uT2Zmc2V0Ij5Db2x1bW4gT2Zmc2V0PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIE9mZnNldChpbnQgUm93T2Zmc2V0LCBpbnQgQ29sdW1uT2Zmc2V0KQorCQl7CisJCQlpZiAoX2Zyb21Sb3cgKyBSb3dPZmZzZXQgPCAxIHx8IF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0IDwgMSB8fCBfZnJvbVJvdyArIFJvd09mZnNldCA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzIHx8IF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0ID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisJCQl7CisJCQkJdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk9mZnNldCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7CisJCQl9CisJCQlzdHJpbmcgYWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3cgKyBSb3dPZmZzZXQsIF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0LCBfdG9Sb3cgKyBSb3dPZmZzZXQsIF90b0NvbCArIENvbHVtbk9mZnNldCk7CisJCQlyZXR1cm4gbmV3IEV4Y2VsUmFuZ2VCYXNlKF93b3Jrc2hlZXQsIGFkZHJlc3MpOworCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEdldCBhIHJhbmdlIHdpdGggYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0iUm93T2Zmc2V0Ij5Sb3cgT2Zmc2V0PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW5PZmZzZXQiPkNvbHVtbiBPZmZzZXQ8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Ik51bWJlck9mUm93cyI+TnVtYmVyIG9mIHJvd3MuIE1pbmltdW0gMTwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iTnVtYmVyT2ZDb2x1bW5zIj5OdW1iZXIgb2YgY29sdW1zLiBNaW5pbXVtIDE8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgT2Zmc2V0KGludCBSb3dPZmZzZXQsIGludCBDb2x1bW5PZmZzZXQsIGludCBOdW1iZXJPZlJvd3MsIGludCBOdW1iZXJPZkNvbHVtbnMpCisJCXsKKwkJCWlmIChOdW1iZXJPZlJvd3MgPCAxIHx8IE51bWJlck9mQ29sdW1ucyA8IDEpCisJCQl7CisJCQkJdGhyb3cgKG5ldyBFeGNlcHRpb24oIk51bWJlciBvZiByb3dzL2NvbHVtbnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpKTsKKwkJCX0KKwkJCU51bWJlck9mUm93cy0tOworCQkJTnVtYmVyT2ZDb2x1bW5zLS07CisJCQlpZiAoX2Zyb21Sb3cgKyBSb3dPZmZzZXQgPCAxIHx8IF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0IDwgMSB8fCBfZnJvbVJvdyArIFJvd09mZnNldCA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzIHx8IF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0ID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMgfHwKKwkJCQkgX2Zyb21Sb3cgKyBSb3dPZmZzZXQgKyBOdW1iZXJPZlJvd3MgPCAxIHx8IF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0ICsgTnVtYmVyT2ZDb2x1bW5zIDwgMSB8fCBfZnJvbVJvdyArIFJvd09mZnNldCArIE51bWJlck9mUm93cyA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzIHx8IF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0ICsgTnVtYmVyT2ZDb2x1bW5zID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisJCQl7CisJCQkJdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk9mZnNldCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7CisJCQl9CisJCQlzdHJpbmcgYWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3cgKyBSb3dPZmZzZXQsIF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0LCBfZnJvbVJvdyArIFJvd09mZnNldCArIE51bWJlck9mUm93cywgX2Zyb21Db2wgKyBDb2x1bW5PZmZzZXQgKyBOdW1iZXJPZkNvbHVtbnMpOworCQkJcmV0dXJuIG5ldyBFeGNlbFJhbmdlQmFzZShfd29ya3NoZWV0LCBhZGRyZXNzKTsKKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBBZGRzIGEgbmV3IGNvbW1lbnQgZm9yIHRoZSByYW5nZS4KKwkJLy8vIElmIHRoaXMgcmFuZ2UgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjZWxsLCB0aGUgdG9wIGxlZnQgY29tbWVudCBpcyByZXR1cm5lZCBieSB0aGUgbWV0aG9kLgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IlRleHQiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iQXV0aG9yIj48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+QSByZWZlcmVuY2UgY29tbWVudCBvZiB0aGUgdG9wIGxlZnQgY2VsbDwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsQ29tbWVudCBBZGRDb21tZW50KHN0cmluZyBUZXh0LCBzdHJpbmcgQXV0aG9yKQorCQl7CisJCSAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoQXV0aG9yKSkKKwkJICAgIHsKKwkJICAgICAgICBBdXRob3IgPSBUaHJlYWQuQ3VycmVudFByaW5jaXBhbC5JZGVudGl0eS5OYW1lOworCQkgICAgfQorICAgICAgICAgICAgLy9DaGVjayBpZiBhbnkgY29tbWVudHMgZXhpc3RzIGluIHRoZSByYW5nZSBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uCisJCQlfY2hhbmdlUHJvcE1ldGhvZChFeGlzdHNfQ29tbWVudCwgbnVsbCk7CisJCQkvL0NyZWF0ZSB0aGUgY29tbWVudHMKKwkJCV9jaGFuZ2VQcm9wTWV0aG9kKFNldF9Db21tZW50LCBuZXcgc3RyaW5nW10geyBUZXh0LCBBdXRob3IgfSk7CisKKwkJCXJldHVybiBfd29ya3NoZWV0LkNvbW1lbnRzW25ldyBFeGNlbENlbGxBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCldOworCQl9CisKKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIENvcGllcyB0aGUgcmFuZ2Ugb2YgY2VsbHMgdG8gYW4gb3RoZXIgcmFuZ2UKKyAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iRGVzdGluYXRpb24iPlRoZSBzdGFydCBjZWxsIHdoZXJlIHRoZSByYW5nZSB3aWxsIGJlIGNvcGllZC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5KEV4Y2VsUmFuZ2VCYXNlIERlc3RpbmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIHNhbWVXb3JrYm9vayA9IERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuV29ya2Jvb2sgPT0gX3dvcmtzaGVldC5Xb3JrYm9vazsKKyAgICAgICAgICAgIEV4Y2VsU3R5bGVzIHNvdXJjZVN0eWxlcyA9IF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzID0gRGVzdGluYXRpb24uX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXM7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBzdHlsZUNhc2hlID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisKKyAgICAgICAgICAgIC8vQ2xlYXIgYWxsIGV4aXN0aW5nIGNlbGxzOyAKKyAgICAgICAgICAgIGludCB0b1JvdyA9IF90b1JvdyAtIF9mcm9tUm93ICsgMSwKKyAgICAgICAgICAgICAgICB0b0NvbCA9IF90b0NvbCAtIF9mcm9tQ29sICsgMTsKKworICAgICAgICAgICAgc3RyaW5nIHMgPSAiIjsKKyAgICAgICAgICAgIGludCBpPTA7CisgICAgICAgICAgICBvYmplY3QgbyA9IG51bGw7CisgICAgICAgICAgICBieXRlIGZsYWc9MDsKKyAgICAgICAgICAgIFVyaSBobCA9IG51bGw7CisgICAgICAgICAgICBFeGNlbENvbW1lbnQgY29tbWVudD1udWxsOworCisgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3dvcmtzaGVldC5fdmFsdWVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgICAgICAgIHZhciBjb3BpZWRWYWx1ZSA9IG5ldyBMaXN0PENvcGllZENlbGw+KCk7CisgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcm93PWNzZS5Sb3c7CisgICAgICAgICAgICAgICAgdmFyIGNvbCA9IGNzZS5Db2x1bW47ICAgICAgIC8vSXNzdWUgMTUwNzAKKyAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IG5ldyBDb3BpZWRDZWxsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb3cgPSBEZXN0aW5hdGlvbi5fZnJvbVJvdyArIChyb3cgLSBfZnJvbVJvdyksCisgICAgICAgICAgICAgICAgICAgIENvbHVtbiA9IERlc3RpbmF0aW9uLl9mcm9tQ29sICsgKGNvbCAtIF9mcm9tQ29sKSwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWU9Y3NlLlZhbHVlCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBjc2UuVmFsdWUpOworCisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3R5cGVzLkV4aXN0cyhyb3csIGNvbCwgcmVmIHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll90eXBlcy5TZXRWYWx1ZShyb3csIGNvbCxzKTsKKyAgICAgICAgICAgICAgICAgICAgY2VsbC5UeXBlPXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX2Zvcm11bGFzLkV4aXN0cyhyb3csIGNvbCwgcmVmIG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8gaXMgaW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBfd29ya3NoZWV0LkdldEZvcm11bGEoY3NlLlJvdywgY3NlLkNvbHVtbikpOyAgICAvL1NoYXJlZCBmb3JtdWxhcywgc2V0IHRoZSBmb3JtdWxhIHBlciBjZWxsIHRvIHNpbXBsaWZ5CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkZvcm11bGE9X3dvcmtzaGVldC5HZXRGb3JtdWxhKGNzZS5Sb3csIGNzZS5Db2x1bW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9EZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLkZvcm11bGE9bzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihfd29ya3NoZWV0Ll9zdHlsZXMuRXhpc3RzKHJvdywgY29sLCByZWYgaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2FtZVdvcmtib29rKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3csIGNvbCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLlN0eWxlSUQ9aTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzdHlsZUNhc2hlW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRTdHlsZUlEID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gc3R5bGVzLkNsb25lU3R5bGUoc291cmNlU3R5bGVzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChvbGRTdHlsZUlELCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuU3R5bGVJRD1pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9oeXBlckxpbmtzLkV4aXN0cyhyb3csIGNvbCwgcmVmIGhsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5faHlwZXJMaW5rcy5TZXRWYWx1ZShyb3csIGNvbCwgaGwpOworICAgICAgICAgICAgICAgICAgICBjZWxsLkh5cGVyTGluaz1obDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihfd29ya3NoZWV0Ll9jb21tZW50c1N0b3JlLkV4aXN0cyhyb3csIGNvbCwgcmVmIGNvbW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2VsbC5Db21tZW50PWNvbW1lbnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX2ZsYWdzLkV4aXN0cyhyb3csIGNvbCwgcmVmIGZsYWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2VsbC5GbGFnID0gZmxhZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29waWVkVmFsdWUuQWRkKGNlbGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0NvcHkgc3R5bGVzIHdpdGggbm8gY2VsbCB2YWx1ZQorICAgICAgICAgICAgdmFyIGNzZXMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50Pihfd29ya3NoZWV0Ll9zdHlsZXMsIF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOworICAgICAgICAgICAgd2hpbGUgKGNzZXMuTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX3dvcmtzaGVldC5fdmFsdWVzLkV4aXN0cyhjc2VzLlJvdywgY3Nlcy5Db2x1bW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IERlc3RpbmF0aW9uLl9mcm9tUm93ICsgKGNzZXMuUm93IC0gX2Zyb21Sb3cpOworICAgICAgICAgICAgICAgICAgICB2YXIgY29sID0gRGVzdGluYXRpb24uX2Zyb21Db2wgKyAoY3Nlcy5Db2x1bW4gLSBfZnJvbUNvbCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsID0gbmV3IENvcGllZENlbGwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUm93ID0gcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uID0gY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBudWxsCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgaSA9IGNzZXMuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lV29ya2Jvb2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuU3R5bGVJRCA9IGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gc3R5bGVDYXNoZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkU3R5bGVJRCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHN0eWxlcy5DbG9uZVN0eWxlKHNvdXJjZVN0eWxlcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQob2xkU3R5bGVJRCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3csIGNvbCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLlN0eWxlSUQgPSBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvcGllZFZhbHVlLkFkZChjZWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgY29waWVkTWVyZ2VkQ2VsbHMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIEV4Y2VsQWRkcmVzcz4oKTsKKyAgICAgICAgICAgIC8vTWVyZ2VkIGNlbGxzCisgICAgICAgICAgICB2YXIgY3NlbSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuX2NlbGxzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgICAgICAgIHdoaWxlIChjc2VtLk5leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZighY29waWVkTWVyZ2VkQ2VsbHMuQ29udGFpbnNLZXkoY3NlbS5WYWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYWRyID0gbmV3IEV4Y2VsQWRkcmVzcyhfd29ya3NoZWV0Lk5hbWUsIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuTGlzdFtjc2VtLlZhbHVlXSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuQ29sbGlkZShhZHIpPT1lQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUpCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZE1lcmdlZENlbGxzLkFkZChjc2VtLlZhbHVlLCBuZXcgRXhjZWxBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl9mcm9tUm93ICsgKGFkci5TdGFydC5Sb3cgLSBfZnJvbVJvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX2Zyb21Db2wgKyAoYWRyLlN0YXJ0LkNvbHVtbiAtIF9mcm9tQ29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fZnJvbVJvdyArIChhZHIuRW5kLlJvdyAtIF9mcm9tUm93KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fZnJvbUNvbCArIChhZHIuRW5kLkNvbHVtbiAtIF9mcm9tQ29sKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJ0aWFsIG1lcmdlIG9mIHRoZSBhZGRyZXNzIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZE1lcmdlZENlbGxzLkFkZChjc2VtLlZhbHVlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5NZXJnZWRDZWxscy5DbGVhcihuZXcgRXhjZWxBZGRyZXNzQmFzZShEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIERlc3RpbmF0aW9uLl9mcm9tUm93K3RvUm93LTEsIERlc3RpbmF0aW9uLl9mcm9tQ29sK3RvQ29sLTEpKTsKKworICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdmFsdWVzLkNsZWFyKERlc3RpbmF0aW9uLl9mcm9tUm93LCBEZXN0aW5hdGlvbi5fZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2Zvcm11bGFzLkNsZWFyKERlc3RpbmF0aW9uLl9mcm9tUm93LCBEZXN0aW5hdGlvbi5fZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7CisgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll90eXBlcy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7CisgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9oeXBlckxpbmtzLkNsZWFyKERlc3RpbmF0aW9uLl9mcm9tUm93LCBEZXN0aW5hdGlvbi5fZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2ZsYWdzLkNsZWFyKERlc3RpbmF0aW9uLl9mcm9tUm93LCBEZXN0aW5hdGlvbi5fZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2NvbW1lbnRzU3RvcmUuQ2xlYXIoRGVzdGluYXRpb24uX2Zyb21Sb3csIERlc3RpbmF0aW9uLl9mcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcmVhY2godmFyIGNlbGwgaW4gY29waWVkVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5WYWx1ZSk7CisKKyAgICAgICAgICAgICAgICBpZihjZWxsLlR5cGUhPW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll90eXBlcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuVHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoY2VsbC5TdHlsZUlEIT1udWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5TdHlsZUlELlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihjZWxsLkZvcm11bGEhPW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZWxsLkZvcm11bGEgPSBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhjZWxsLkZvcm11bGEuVG9TdHJpbmcoKSwgRGVzdGluYXRpb24uX2Zyb21Sb3cgLSBfZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wgLSBfZnJvbUNvbCwgMCwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5Gb3JtdWxhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoY2VsbC5IeXBlckxpbmshPW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9oeXBlckxpbmtzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5IeXBlckxpbmspOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjZWxsLkNvbW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fY29tbWVudHNTdG9yZS5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuQ29tbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjZWxsLkZsYWcgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2ZsYWdzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5GbGFnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQWRkIG1lcmdlZCBjZWxscworICAgICAgICAgICAgZm9yZWFjaCh2YXIgbSBpbiBjb3BpZWRNZXJnZWRDZWxscy5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYobSE9bnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG0sIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL0Nsb25lIHRoZSBjZWxsCisgICAgICAgICAgICAgICAgLy92YXIgY29waWVkQ2VsbCA9IChfd29ya3NoZWV0Ll9jZWxsc1tHZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBjZWxsLl9mcm9tUm93LCBjZWxsLmNvbHVtbildIGFzIEV4Y2VsQ2VsbCk7CisKKyAgICAgICAgICAgICAgICAvL3ZhciBuZXdDZWxsID0gY29waWVkQ2VsbC5DbG9uZShEZXN0aW5hdGlvbi5fd29ya3NoZWV0LAorICAgICAgICAgICAgICAgIC8vICAgICAgICBEZXN0aW5hdGlvbi5fZnJvbVJvdyArIChjb3BpZWRDZWxsLlJvdyAtIF9mcm9tUm93KSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgRGVzdGluYXRpb24uY29sdW1uICsgKGNvcGllZENlbGwuQ29sdW1uIC0gY29sdW1uKSk7CisKKyAgICAgICAgLy8gICAgICAgIG5ld0NlbGwuTWVyZ2VJZCA9IF93b3Jrc2hlZXQuR2V0TWVyZ2VDZWxsSWQoY29waWVkQ2VsbC5Sb3csIGNvcGllZENlbGwuQ29sdW1uKTsKKworCisgICAgICAgIC8vICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG5ld0NlbGwuRm9ybXVsYSkpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgbmV3Q2VsbC5Gb3JtdWxhID0gRXhjZWxDZWxsLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKG5ld0NlbGwuRm9ybXVsYSwgbmV3Q2VsbC5Sb3cgLSBjb3BpZWRDZWxsLlJvdywgKG5ld0NlbGwuQ29sdW1uIC0gY29waWVkQ2VsbC5Db2x1bW4pLCAxLCAxKTsKKyAgICAgICAgLy8gICAgICAgIH0KKworICAgICAgICAvLyAgICAgICAgLy9JZiBpdHMgbm90IHRoZSBzYW1lIHdvcmtib29rIHdlIG11c3QgY29weSB0aGUgc3R5bGVzIHRvIHRoZSBuZXcgd29ya2Jvb2suCisgICAgICAgIC8vICAgICAgICBpZiAoIXNhbWVXb3JrYm9vaykKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShjZWxsLlN0eWxlSUQpKQorICAgICAgICAvLyAgICAgICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgbmV3Q2VsbC5TdHlsZUlEID0gc3R5bGVDYXNoZVtjZWxsLlN0eWxlSURdOworICAgICAgICAvLyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgICAgICBlbHNlCisgICAgICAgIC8vICAgICAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgICAgICBuZXdDZWxsLlN0eWxlSUQgPSBzdHlsZXMuQ2xvbmVTdHlsZShzb3VyY2VTdHlsZXMsIGNlbGwuU3R5bGVJRCk7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKGNlbGwuU3R5bGVJRCwgbmV3Q2VsbC5TdHlsZUlEKTsKKyAgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBuZXdDZWxscy5BZGQobmV3Q2VsbCk7CisgICAgICAgIC8vICAgICAgICBpZiAobmV3Q2VsbC5NZXJnZSkgbWVyZ2VkQ2VsbHMuQWRkKG5ld0NlbGwuQ2VsbElELCBuZXdDZWxsKTsKKyAgICAgICAgLy8gICAgfQorCisgICAgICAgIC8vICAgIC8vTm93IGNsZWFyIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgICAgLy8gICAgRGVzdGluYXRpb24uT2Zmc2V0KDAsIDAsIChfdG9Sb3cgLSBfZnJvbVJvdykgKyAxLCAoX3RvQ29sIC0gY29sdW1uKSArIDEpLkNsZWFyKCk7CisKKyAgICAgICAgLy8gICAgLy9BbmQgbGFzdCBhZGQgdGhlIG5ldyBjZWxscyB0byB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIG5ld0NlbGxzKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBEZXN0aW5hdGlvbi5Xb3Jrc2hlZXQuX2NlbGxzLkFkZChjZWxsKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICAvL0FkZCBtZXJnZWQgY2VsbHMKKyAgICAgICAgLy8gICAgaWYgKG1lcmdlZENlbGxzLkNvdW50ID4gMCkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgTGlzdDxFeGNlbEFkZHJlc3NCYXNlPiBtZXJnZWRBZGRyZXNzZXMgPSBuZXcgTGlzdDxFeGNlbEFkZHJlc3NCYXNlPigpOworICAgICAgICAvLyAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gbWVyZ2VkQ2VsbHMuVmFsdWVzKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIGlmICghSXNBZGRlZChjZWxsLCBtZXJnZWRBZGRyZXNzZXMpKQorICAgICAgICAvLyAgICAgICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgaW50IHN0YXJ0Um93ID0gY2VsbC5Sb3csIHN0YXJ0Q29sID0gY2VsbC5Db2x1bW4sIGVuZFJvdyA9IGNlbGwuUm93LCBlbmRDb2wgPSBjZWxsLkNvbHVtbiArIDE7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIHdoaWxlIChtZXJnZWRDZWxscy5Db250YWluc0tleShFeGNlbENlbGwuR2V0Q2VsbElEKERlc3RpbmF0aW9uLldvcmtzaGVldC5TaGVldElELCBlbmRSb3csIGVuZENvbCkpKQorICAgICAgICAvLyAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGwgbmV4dCA9IG1lcmdlZENlbGxzW0V4Y2VsQ2VsbC5HZXRDZWxsSUQoRGVzdGluYXRpb24uV29ya3NoZWV0LlNoZWV0SUQsIGVuZFJvdywgZW5kQ29sKV07CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5NZXJnZUlkICE9IG5leHQuTWVyZ2VJZCkKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGVuZENvbCsrOworICAgICAgICAvLyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgd2hpbGUgKElzTWVyZ2VkKG1lcmdlZENlbGxzLCBEZXN0aW5hdGlvbi5Xb3Jrc2hlZXQsIGVuZFJvdywgc3RhcnRDb2wsIGVuZENvbCAtIDEsIGNlbGwpKQorICAgICAgICAvLyAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBlbmRSb3crKzsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgfQorCisgICAgICAgIC8vICAgICAgICAgICAgICAgIG1lcmdlZEFkZHJlc3Nlcy5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2Uoc3RhcnRSb3csIHN0YXJ0Q29sLCBlbmRSb3cgLSAxLCBlbmRDb2wgLSAxKSk7CisgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgRGVzdGluYXRpb24uV29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3QuQWRkUmFuZ2UoKGZyb20gciBpbiBtZXJnZWRBZGRyZXNzZXMgc2VsZWN0IHIuQWRkcmVzcykpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorCisgICAgICAgIC8vcHJpdmF0ZSBib29sIElzQWRkZWQoRXhjZWxDZWxsIGNlbGwsIExpc3Q8RXhjZWxBZGRyZXNzQmFzZT4gbWVyZ2VkQWRkcmVzc2VzKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZm9yZWFjaCAodmFyIGFkZHJlc3MgaW4gbWVyZ2VkQWRkcmVzc2VzKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBpZiAoYWRkcmVzcy5Db2xsaWRlKG5ldyBFeGNlbEFkZHJlc3NCYXNlKGNlbGwuQ2VsbEFkZHJlc3MpKSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvL30KKworICAgICAgICAvL3ByaXZhdGUgYm9vbCBJc01lcmdlZChEaWN0aW9uYXJ5PHVsb25nLCBFeGNlbENlbGw+IG1lcmdlZENlbGxzLCBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIGludCByb3csIGludCBzdGFydENvbCwgaW50IGVuZENvbCwgRXhjZWxDZWxsIGNlbGwpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBmb3IgKGludCBjb2wgPSBzdGFydENvbDsgY29sIDw9IGVuZENvbDsgY29sKyspCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGlmICghbWVyZ2VkQ2VsbHMuQ29udGFpbnNLZXkoRXhjZWxDZWxsLkdldENlbGxJRCh3b3Jrc2hlZXQuU2hlZXRJRCwgcm93LCBjb2wpKSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgRXhjZWxDZWxsIG5leHQgPSBtZXJnZWRDZWxsc1tFeGNlbENlbGwuR2V0Q2VsbElEKHdvcmtzaGVldC5TaGVldElELCByb3csIGNvbCldOworICAgICAgICAvLyAgICAgICAgICAgIGlmIChjZWxsLk1lcmdlSWQgIT0gbmV4dC5NZXJnZUlkKQorICAgICAgICAvLyAgICAgICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIENsZWFyIGFsbCBjZWxscworCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgdm9pZCBDbGVhcigpCisJCXsKKwkJCURlbGV0ZSh0aGlzLCBmYWxzZSk7CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ3JlYXRlcyBhbiBhcnJheS1mb3JtdWxhLgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IkFycmF5Rm9ybXVsYSI+VGhlIGZvcm11bGE8L3BhcmFtPgorCQlwdWJsaWMgdm9pZCBDcmVhdGVBcnJheUZvcm11bGEoc3RyaW5nIEFycmF5Rm9ybXVsYSkKKwkJeworCQkJaWYgKEFkZHJlc3NlcyAhPSBudWxsKQorCQkJeworCQkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJBbiBBcnJheWZvcm11bGEgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgYWRkcmVzcyIpKTsKKwkJCX0KKwkJCVNldF9TaGFyZWRGb3JtdWxhKEFycmF5Rm9ybXVsYSwgdGhpcywgdHJ1ZSk7CisJCX0KKyAgICAgICAgLy9wcml2YXRlIHZvaWQgQ2xlYXIoRXhjZWxBZGRyZXNzQmFzZSBSYW5nZSkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIENsZWFyKFJhbmdlLCB0cnVlKTsKKyAgICAgICAgLy99CisgICAgICAgIGludGVybmFsIHZvaWQgRGVsZXRlKEV4Y2VsQWRkcmVzc0Jhc2UgUmFuZ2UsIGJvb2wgc2hpZnQpCisJCXsKKyAgICAgICAgICAgIC8vRGVsZXRlQ2hlY2tNZXJnZWRDZWxscyhSYW5nZSk7CisgICAgICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkNsZWFyKFJhbmdlKTsKKwkJCS8vRmlyc3QgZmluZCB0aGUgc3RhcnQgY2VsbAorICAgICAgICAgICAgaW50IGZyb21Sb3csIGZyb21Db2w7CisgICAgICAgICAgICB2YXIgZCA9IFdvcmtzaGVldC5EaW1lbnNpb247CisgICAgICAgICAgICBpZiAoZCAhPSBudWxsICYmIFJhbmdlLl9mcm9tUm93IDw9IGQuX2Zyb21Sb3cgJiYgUmFuZ2UuX3RvUm93ID49IGQuX3RvUm93KSAvL0VudGlyZVJvdz8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcm9tUm93ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcm9tUm93ID0gUmFuZ2UuX2Zyb21Sb3c7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCAmJiBSYW5nZS5fZnJvbUNvbCA8PSBkLl9mcm9tQ29sICYmIFJhbmdlLl90b0NvbCA+PSBkLl90b0NvbCkgLy9FbnRpcmVSb3c/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbUNvbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJvbUNvbCA9IFJhbmdlLl9mcm9tQ29sOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcm93cyA9IFJhbmdlLl90b1JvdyAtIGZyb21Sb3cgKyAxOworICAgICAgICAgICAgdmFyIGNvbHMgPSBSYW5nZS5fdG9Db2wgLSBmcm9tQ29sICsgMTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7CisgICAgICAgICAgICBfd29ya3NoZWV0Ll90eXBlcy5EZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29scywgc2hpZnQpOworICAgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7CisgICAgICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5EZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29scywgc2hpZnQpOworICAgICAgICAgICAgX3dvcmtzaGVldC5faHlwZXJMaW5rcy5EZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29scywgc2hpZnQpOworICAgICAgICAgICAgX3dvcmtzaGVldC5fZmxhZ3MuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuX2NvbW1lbnRzU3RvcmUuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKKworICAgICAgICAgICAgLy9pZihzaGlmdCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgX3dvcmtzaGVldC5BZGp1c3RGb3JtdWxhc1Jvdyhmcm9tUm93LCByb3dzKTsKKyAgICAgICAgICAgIC8vfQorCisJCQkvL0NsZWFyIG11bHRpIGFkZHJlc3NlcyBhcyB3ZWxsCisJCQlpZiAoQWRkcmVzc2VzICE9IG51bGwpCisJCQl7CisJCQkJZm9yZWFjaCAodmFyIHN1YiBpbiBBZGRyZXNzZXMpCisJCQkJeworCQkJCQlEZWxldGUoc3ViLCBzaGlmdCk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlbGV0ZUNoZWNrTWVyZ2VkQ2VsbHMoRXhjZWxBZGRyZXNzQmFzZSBSYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlbW92ZUl0ZW1zID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFkZHIgaW4gV29ya3NoZWV0Lk1lcmdlZENlbGxzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhZGRyQ29sID0gUmFuZ2UuQ29sbGlkZShuZXcgRXhjZWxBZGRyZXNzKFJhbmdlLldvcmtTaGVldCwgYWRkcikpOworICAgICAgICAgICAgICAgIGlmIChhZGRyQ29sICE9IGVBZGRyZXNzQ29sbGl0aW9uLk5vKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJDb2wgPT0gZUFkZHJlc3NDb2xsaXRpb24uSW5zaWRlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVJdGVtcy5BZGQoYWRkcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IHJlbW92ZS9vdmVyd3JpdGUgYSBwYXJ0IG9mIGNlbGxzIHRoYXQgYXJlIG1lcmdlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIHJlbW92ZUl0ZW1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdvcmtzaGVldC5NZXJnZWRDZWxscy5SZW1vdmUoaXRlbSk7CisJCQl9CisJCX0KKwkJI2VuZHJlZ2lvbgorCQkjcmVnaW9uIElEaXNwb3NhYmxlIE1lbWJlcnMKKworCQlwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKwkJeworCQkJLy9fd29ya3NoZWV0ID0gbnVsbDsgICAgICAgICAgICAKKwkJfQorCisJCSNlbmRyZWdpb24KKwkJI3JlZ2lvbiAiRW51bWVyYXRvciIKKyAgICAgICAgLy9pbnQgX2luZGV4OworICAgICAgICAvL3Vsb25nIF90b0NlbGxJZDsKKyAgICAgICAgLy9pbnQgX2VudW1BZGRyZXNzSXg7CisgICAgICAgIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gY2VsbEVudW07CisJCXB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFJhbmdlQmFzZT4gR2V0RW51bWVyYXRvcigpCisJCXsKKwkJCVJlc2V0KCk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCisJCUlFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorCQl7CisJCQlSZXNldCgpOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBUaGUgY3VycmVudCByYW5nZSB3aGVuIGVudW1lcmF0aW5nCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBDdXJyZW50CisJCXsKKwkJCWdldAorCQkJeworCQkJCXJldHVybiBuZXcgRXhjZWxSYW5nZUJhc2UoX3dvcmtzaGVldCwgRXhjZWxBZGRyZXNzQmFzZS5HZXRBZGRyZXNzKGNlbGxFbnVtLlJvdywgY2VsbEVudW0uQ29sdW1uKSk7CisJCQl9CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBUaGUgY3VycmVudCByYW5nZSB3aGVuIGVudW1lcmF0aW5nCisJCS8vLyA8L3N1bW1hcnk+CisJCW9iamVjdCBJRW51bWVyYXRvci5DdXJyZW50CisJCXsKKwkJCWdldAorCQkJeworCQkJCXJldHVybiAoKG9iamVjdCkobmV3IEV4Y2VsUmFuZ2VCYXNlKF93b3Jrc2hlZXQsIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0QWRkcmVzcyhjZWxsRW51bS5Sb3csIGNlbGxFbnVtLkNvbHVtbikpKSk7CisJCQl9CisJCX0KKworCQlpbnQgX2VudW1BZGRyZXNzSXggPSAtMTsKKyAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQorCQl7CisgICAgICAgICAgICBpZiAoY2VsbEVudW0uTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2FkZHJlc3NlcyE9bnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZW51bUFkZHJlc3NJeCsrOworICAgICAgICAgICAgICAgIGlmIChfZW51bUFkZHJlc3NJeCA8IF9hZGRyZXNzZXMuQ291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZWxsRW51bSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgCisgICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fZnJvbVJvdywgCisgICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fZnJvbUNvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fdG9Sb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3Nlc1tfZW51bUFkZHJlc3NJeF0uX3RvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCBSZXNldCgpCisJCXsKKyAgICAgICAgICAgIF9lbnVtQWRkcmVzc0l4ID0gLTE7CisgICAgICAgICAgICBjZWxsRW51bSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7CisgICAgICAgIH0KKworICAgICAgICAvL3ByaXZhdGUgdm9pZCBHZXROZXh0SW5kZXhFbnVtKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2wpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBpZiAoX2luZGV4ID49IF93b3Jrc2hlZXQuX2NlbGxzLkNvdW50KSByZXR1cm47CisgICAgICAgIC8vICAgIEV4Y2VsQ2VsbCBjZWxsID0gX3dvcmtzaGVldC5fY2VsbHNbX2luZGV4XSBhcyBFeGNlbENlbGw7CisgICAgICAgIC8vICAgIHdoaWxlIChjZWxsLkNvbHVtbiA+IHRvQ29sIHx8IGNlbGwuQ29sdW1uIDwgZnJvbUNvbCkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgaWYgKGNlbGwuQ29sdW1uIDwgZnJvbUNvbCkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBfaW5kZXggPSBfd29ya3NoZWV0Ll9jZWxscy5JbmRleE9mKEV4Y2VsQWRkcmVzcy5HZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBjZWxsLlJvdywgZnJvbUNvbCkpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIF9pbmRleCA9IF93b3Jrc2hlZXQuX2NlbGxzLkluZGV4T2YoRXhjZWxBZGRyZXNzLkdldENlbGxJRChfd29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuUm93ICsgMSwgZnJvbUNvbCkpOworICAgICAgICAvLyAgICAgICAgfQorCisgICAgICAgIC8vICAgICAgICBpZiAoX2luZGV4IDwgMCkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBfaW5kZXggPSB+X2luZGV4OworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgaWYgKF9pbmRleCA+PSBfd29ya3NoZWV0Ll9jZWxscy5Db3VudCB8fCBfd29ya3NoZWV0Ll9jZWxsc1tfaW5kZXhdLlJhbmdlSUQgPiBfdG9DZWxsSWQpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBjZWxsID0gX3dvcmtzaGVldC5fY2VsbHNbX2luZGV4XSBhcyBFeGNlbENlbGw7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy99CisKKyAgICAgICAgLy9wcml2YXRlIHZvaWQgR2V0U3RhcnRJbmRleEVudW0oaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIF9pbmRleCA9IF93b3Jrc2hlZXQuX2NlbGxzLkluZGV4T2YoRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBmcm9tUm93LCBmcm9tQ29sKSk7CisgICAgICAgIC8vICAgIF90b0NlbGxJZCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgLy8gICAgaWYgKF9pbmRleCA8IDApCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIF9pbmRleCA9IH5faW5kZXg7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgX2luZGV4LS07CisgICAgICAgIC8vfQorICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxSYW5nZUNvcHlPcHRpb25GbGFncy5jcyBiL0VQUGx1cy9FeGNlbFJhbmdlQ29weU9wdGlvbkZsYWdzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODUzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxSYW5nZUNvcHlPcHRpb25GbGFncy5jcwpAQCAtMCwwICsxLDE2IEBACivvu791c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGbGFnIGVudW0sIHNwZWNpZnkgYWxsIGZsYWdzIHRoYXQgeW91IHdhbnQgdG8gZXhjbHVkZSBmcm9tIHRoZSBjb3B5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgW0ZsYWdzXSAgICAKKyAgICBwdWJsaWMgZW51bSBFeGNlbFJhbmdlQ29weU9wdGlvbkZsYWdzIDogaW50CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFeGNsdWRlIGZvcm11bGFzIGZyb20gYmVpbmcgY29waWVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEV4Y2x1ZGVGb3JtdWxhcyA9IDB4MSwKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxSb3cuY3MgYi9FUFBsdXMvRXhjZWxSb3cuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMmQxZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbFJvdy5jcwpAQCAtMCwwICsxLDM5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS+RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS+RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisJaW50ZXJuYWwgY2xhc3MgUm93SW50ZXJuYWwKKyAgICB7CisgICAgICAgIGludGVybmFsIGRvdWJsZSBIZWlnaHQ9LTE7CisgICAgICAgIGludGVybmFsIGJvb2wgSGlkZGVuOworICAgICAgICBpbnRlcm5hbCBib29sIENvbGxhcHNlZDsgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBzaG9ydCBPdXRsaW5lTGV2ZWw7CisgICAgICAgIGludGVybmFsIGJvb2wgUGFnZUJyZWFrOworICAgICAgICBpbnRlcm5hbCBib29sIFBob25ldGljOworICAgICAgICBpbnRlcm5hbCBib29sIEN1c3RvbUhlaWdodDsKKyAgICAgICAgaW50ZXJuYWwgaW50IE1lcmdlSUQ7CisgICAgICAgIGludGVybmFsIFJvd0ludGVybmFsIENsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3dJbnRlcm5hbCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSGVpZ2h0PUhlaWdodCwKKyAgICAgICAgICAgICAgICBIaWRkZW49SGlkZGVuLAorICAgICAgICAgICAgICAgIENvbGxhcHNlZD1Db2xsYXBzZWQsCisgICAgICAgICAgICAgICAgT3V0bGluZUxldmVsPU91dGxpbmVMZXZlbCwKKyAgICAgICAgICAgICAgICBQYWdlQnJlYWs9UGFnZUJyZWFrLAorICAgICAgICAgICAgICAgIFBob25ldGljPVBob25ldGljLAorICAgICAgICAgICAgICAgIEN1c3RvbUhlaWdodD1DdXN0b21IZWlnaHQsCisgICAgICAgICAgICAgICAgTWVyZ2VJRD1NZXJnZUlECisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKwkvLy8gUmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHJvdyBpbiB0aGUgc3ByZWFkc2hlZXQuCisJLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgRXhjZWxSb3cgOiBJUmFuZ2VJRAorCXsKKwkJcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCQlwcml2YXRlIFhtbEVsZW1lbnQgX3Jvd0VsZW1lbnQgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnRlcm5hbCBSb3dJRC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgdWxvbmcgUm93SUQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRSb3dJRChfd29ya3NoZWV0LlNoZWV0SUQsIFJvdyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJI3JlZ2lvbiBFeGNlbFJvdyBDb25zdHJ1Y3RvcgorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFJvdyBjbGFzcy4gCisJCS8vLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkhCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0iV29ya3NoZWV0Ij5UaGUgcGFyZW50IHdvcmtzaGVldDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisJCWludGVybmFsIEV4Y2VsUm93KEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldCwgaW50IHJvdykKKwkJeworCQkJX3dvcmtzaGVldCA9IFdvcmtzaGVldDsKKyAgICAgICAgICAgIFJvdyA9IHJvdzsKKwkJfQorCQkjZW5kcmVnaW9uCisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgcm93LgorCQkvLy8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBYbWxOb2RlIE5vZGUgeyBnZXQgeyByZXR1cm4gKF9yb3dFbGVtZW50KTsgfSB9CisKKwkJI3JlZ2lvbiBFeGNlbFJvdyBIaWRkZW4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorCQkvLy8gQWxsb3dzIHRoZSByb3cgdG8gYmUgaGlkZGVuIGluIHRoZSB3b3Jrc2hlZXQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGJvb2wgSGlkZGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByPShSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5IaWRkZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIHIuSGlkZGVuPXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKwkJI2VuZHJlZ2lvbgorCisJCSNyZWdpb24gRXhjZWxSb3cgSGVpZ2h0CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKwkJLy8vIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcm93CisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBkb3VibGUgSGVpZ2h0CisgICAgICAgIHsKKwkJCWdldAorCQkJeworICAgICAgICAgICAgICAgIHZhciByID0gKFJvd0ludGVybmFsKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShSb3csIDApOworICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwgfHwgci5IZWlnaHQ8MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRlZmF1bHRSb3dIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByLkhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBfd29ya3NoZWV0LkRyYXdpbmdzLkdldERyYXdpbmdXaWR0aHMoKTsKKyAgICAgICAgICAgICAgICAgICAgci5IZWlnaHQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5EcmF3aW5ncy5BZGp1c3RIZWlnaHQocG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgci5IZWlnaHQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHIuSGlkZGVuICYmIHZhbHVlICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBIaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci5DdXN0b21IZWlnaHQgPSAodmFsdWUgIT0gX3dvcmtzaGVldC5EZWZhdWx0Um93SGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXQgdG8gdHJ1ZSBpZiBZb3UgZG9uJ3Qgd2FudCB0aGUgcm93IHRvIEF1dG9zaXplCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEN1c3RvbUhlaWdodCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CisgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuQ3VzdG9tSGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICByLkN1c3RvbUhlaWdodCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisJCSNlbmRyZWdpb24KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX3N0eWxlTmFtZSA9ICIiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBjb2x1bW4gdXNpbmcgYSBzdHlsZSBuYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0eWxlSUQgPSBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZUlkRnJvbU5hbWUodmFsdWUpOworICAgICAgICAgICAgICAgIF9zdHlsZU5hbWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSByb3cgdXNpbmcgdGhlIHN0eWxlIElELiAgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgU3R5bGVJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKFJvdywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUoUm93LCAwLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSb3dudW1iZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBSb3cKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIG91dGxpbmUgbGV2ZWwgaXMgc2V0IHRoaXMgdGVsbHMgdGhhdCB0aGUgcm93IGlzIGNvbGxhcHNlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBDb2xsYXBzZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHI9KFJvd0ludGVybmFsKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShSb3csIDApOworICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByLkNvbGxhcHNlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CisgICAgICAgICAgICAgICAgci5Db2xsYXBzZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBPdXRsaW5lIGxldmVsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IE91dGxpbmVMZXZlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcj0oUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CisgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5PdXRsaW5lTGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIHIuT3V0bGluZUxldmVsPShzaG9ydCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgIFJvd0ludGVybmFsIEdldFJvd0ludGVybmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CisgICAgICAgICAgICBpZiAociA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIgPSBuZXcgUm93SW50ZXJuYWwoKTsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUoUm93LCAwLCByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvdyBwaG9uZXRpYyBJbmZvcm1hdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQaG9uZXRpYyAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CisgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuUGhvbmV0aWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIHIuUGhvbmV0aWMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3R5bGUgYXBwbGllZCB0byB0aGUgd2hvbGUgcm93LiBPbmx5IGVmZmVrdCBjZWxscyB3aXRoIG5vIGluZGl2aWR1YWwgc3R5bGUgc2V0LiAKKyAgICAgICAgLy8vIFVzZSBFeGNlbFJhbmdlIG9iamVjdCBpZiB5b3Ugd2FudCB0byBzZXQgc3BlY2lmaWMgc3R5bGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVPYmplY3QoU3R5bGVJRCxfd29ya3NoZWV0LlBvc2l0aW9uSUQgLFJvdy5Ub1N0cmluZygpICsgIjoiICsgUm93LlRvU3RyaW5nKCkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgbWFudWFsIHBhZ2UgYnJlYWsgYWZ0ZXIgdGhlIHJvdy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgUGFnZUJyZWFrCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByID0gKFJvd0ludGVybmFsKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShSb3csIDApOworICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByLlBhZ2VCcmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CisgICAgICAgICAgICAgICAgci5QYWdlQnJlYWsgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBNZXJnZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHNbUm93LCAwXSAhPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoUm93LCAxLCBSb3csIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldFJvd0lEKGludCBzaGVldElELCBpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCh1bG9uZylzaGVldElEKSArICgoKHVsb25nKXJvdykgPDwgMjkpOworCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICNyZWdpb24gSVJhbmdlSUQgTWVtYmVycworCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgdWxvbmcgSVJhbmdlSUQuUmFuZ2VJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUm93SUQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUm93ID0gKChpbnQpKHZhbHVlID4+IDI5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvcGllcyB0aGUgY3VycmVudCByb3cgdG8gYSBuZXcgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkZWQiPlRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIGNvcHkgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDbG9uZShFeGNlbFdvcmtzaGVldCBhZGRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxSb3cgbmV3Um93ID0gYWRkZWQuUm93KFJvdyk7CisgICAgICAgICAgICBuZXdSb3cuQ29sbGFwc2VkID0gQ29sbGFwc2VkOworICAgICAgICAgICAgbmV3Um93LkhlaWdodCA9IEhlaWdodDsKKyAgICAgICAgICAgIG5ld1Jvdy5IaWRkZW4gPSBIaWRkZW47CisgICAgICAgICAgICBuZXdSb3cuT3V0bGluZUxldmVsID0gT3V0bGluZUxldmVsOworICAgICAgICAgICAgbmV3Um93LlBhZ2VCcmVhayA9IFBhZ2VCcmVhazsKKyAgICAgICAgICAgIG5ld1Jvdy5QaG9uZXRpYyA9IFBob25ldGljOworICAgICAgICAgICAgbmV3Um93Ll9zdHlsZU5hbWUgPSBfc3R5bGVOYW1lOworICAgICAgICAgICAgbmV3Um93LlN0eWxlSUQgPSBTdHlsZUlEOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsU2hlZXRQcm90ZWN0aW9uLmNzIGIvRVBQbHVzL0V4Y2VsU2hlZXRQcm90ZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzY0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxTaGVldFByb3RlY3Rpb24uY3MKQEAgLTAsMCArMSwzMzMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTAzLTE0CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkVuY3J5cHRpb247CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTaGVldCBwcm90ZWN0aW9uCisgICAgLy8vPHNlZWFsc28gY3JlZj0iRXhjZWxFbmNyeXB0aW9uIi8+IAorICAgIC8vLzxzZWVhbHNvIGNyZWY9IkV4Y2VsUHJvdGVjdGlvbiIvPiAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTaGVldFByb3RlY3Rpb24gOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsU2hlZXRQcm90ZWN0aW9uIChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlLEV4Y2VsV29ya3NoZWV0IHdzKSA6CisgICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gd3MuU2NoZW1hTm9kZU9yZGVyOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2lzUHJvdGVjdGVkUGF0aD0iZDpzaGVldFByb3RlY3Rpb24vQHNoZWV0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIHdvcmtzaGVldCBpcyBwcm90ZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIElzUHJvdGVjdGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfaXNQcm90ZWN0ZWRQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfaXNQcm90ZWN0ZWRQYXRoLCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFsbG93RWRpdE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEFsbG93RWRpdFNjZW5hcmlvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoX2lzUHJvdGVjdGVkUGF0aCk7IC8vZGVsZXRlIHRoZSB3aG9sZSBzaGVldHByb3RlY3Rpb24gbm9kZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTZWxlY3RMb2NrZWRDZWxsc1BhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQHNlbGVjdExvY2tlZENlbGxzIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gc2VsZWN0IGxvY2tlZCBjZWxscworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd1NlbGVjdExvY2tlZENlbGxzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93U2VsZWN0TG9ja2VkQ2VsbHNQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dTZWxlY3RMb2NrZWRDZWxsc1BhdGgsICF2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd1NlbGVjdFVubG9ja2VkQ2VsbHNQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BzZWxlY3RVbmxvY2tlZENlbGxzIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gc2VsZWN0IHVubG9ja2VkIGNlbGxzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93U2VsZWN0VW5sb2NrZWRDZWxscworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd1NlbGVjdFVubG9ja2VkQ2VsbHNQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzUGF0aCwgIXZhbHVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dPYmplY3RQYXRoPSJkOnNoZWV0UHJvdGVjdGlvbi9Ab2JqZWN0cyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGVkaXQgb2JqZWN0cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd0VkaXRPYmplY3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dPYmplY3RQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dPYmplY3RQYXRoLCAhdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTY2VuYXJpb3NQYXRoPSJkOnNoZWV0UHJvdGVjdGlvbi9Ac2NlbmFyaW9zIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gZWRpdCBzZW5hcmlvcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd0VkaXRTY2VuYXJpb3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dTY2VuYXJpb3NQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dTY2VuYXJpb3NQYXRoLCAhdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dGb3JtYXRDZWxsc1BhdGg9ImQ6c2hlZXRQcm90ZWN0aW9uL0Bmb3JtYXRDZWxscyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGZvcm1hdCBjZWxscworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd0Zvcm1hdENlbGxzIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0Zvcm1hdENlbGxzUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dGb3JtYXRDZWxsc1BhdGgsICF2YWx1ZSwgdHJ1ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0Zvcm1hdENvbHVtbnNQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0Bmb3JtYXRDb2x1bW5zIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gRm9ybWF0IGNvbHVtbnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQWxsb3dGb3JtYXRDb2x1bW5zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Q29sdW1uc1BhdGgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Q29sdW1uc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93Rm9ybWF0Um93c1BhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQGZvcm1hdFJvd3MiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGxvdyB1c2VycyB0byBGb3JtYXQgcm93cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd0Zvcm1hdFJvd3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dGb3JtYXRSb3dzUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dGb3JtYXRSb3dzUGF0aCwgIXZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0luc2VydENvbHVtbnNQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BpbnNlcnRDb2x1bW5zIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gaW5zZXJ0IGNvbHVtbnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRDb2x1bW5zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0Q29sdW1uc1BhdGgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0Q29sdW1uc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dJbnNlcnRSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AaW5zZXJ0Um93cyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIEZvcm1hdCByb3dzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93SW5zZXJ0Um93cworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydFJvd3NQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydFJvd3NQYXRoLCAhdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0luc2VydEh5cGVybGlua3NQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BpbnNlcnRIeXBlcmxpbmtzIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gaW5zZXJ0IGh5cGVybGlua3MKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRIeXBlcmxpbmtzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0SHlwZXJsaW5rc1BhdGgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0SHlwZXJsaW5rc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93RGVsZXRlQ29sdW1ucyA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZGVsZXRlQ29sdW1ucyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGRlbGV0ZSBjb2x1bW5zCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93RGVsZXRlQ29sdW1ucworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZUNvbHVtbnMsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93RGVsZXRlQ29sdW1ucywgIXZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dEZWxldGVSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZGVsZXRlUm93cyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGRlbGV0ZSByb3dzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93RGVsZXRlUm93cworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZVJvd3NQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZVJvd3NQYXRoLCAhdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93U29ydFBhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQHNvcnQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGxvdyB1c2VycyB0byBzb3J0IGEgcmFuZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQWxsb3dTb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93U29ydFBhdGgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93U29ydFBhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dBdXRvRmlsdGVyUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AYXV0b0ZpbHRlciI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIHVzZSBhdXRvZmlsdGVycworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd0F1dG9GaWx0ZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dBdXRvRmlsdGVyUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dBdXRvRmlsdGVyUGF0aCwgIXZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dQaXZvdFRhYmxlc1BhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQHBpdm90VGFibGVzIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gdXNlIHBpdm90dGFibGVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93UGl2b3RUYWJsZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dQaXZvdFRhYmxlc1BhdGgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93UGl2b3RUYWJsZXNQYXRoLCAhdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3Bhc3N3b3JkUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AcGFzc3dvcmQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIGEgcGFzc3dvcmQgZm9yIHRoZSBzaGVldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQYXNzd29yZCI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0UGFzc3dvcmQoc3RyaW5nIFBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNQcm90ZWN0ZWQgPT0gZmFsc2UpIElzUHJvdGVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgUGFzc3dvcmQgPSBQYXNzd29yZC5UcmltKCk7CisgICAgICAgICAgICBpZiAoUGFzc3dvcmQgPT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3Bhc3N3b3JkUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIChub2RlIGFzIFhtbEF0dHJpYnV0ZSkuT3duZXJFbGVtZW50LkF0dHJpYnV0ZXMuUmVtb3ZlKG5vZGUgYXMgWG1sQXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaGFzaCA9IEVuY3J5cHRlZFBhY2thZ2VIYW5kbGVyLkNhbGN1bGF0ZVBhc3N3b3JkSGFzaChQYXNzd29yZCk7CisgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9wYXNzd29yZFBhdGgsICgoaW50KWhhc2gpLlRvU3RyaW5nKCJ4IikpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxTdHlsZUNvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRXhjZWxTdHlsZUNvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0MDhmZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbFN0eWxlQ29sbGVjdGlvbi5jcwpAQCAtMCwwICsxLDE0NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5MaW5xOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJhc2UgY29sbGVjdGlvbiBjbGFzcyBmb3Igc3R5bGVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHN0eWxlIHR5cGU8L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxTdHlsZUNvbGxlY3Rpb248VD4gOiBJRW51bWVyYWJsZTxUPgorICAgIHsKKyAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NldE5leHRJZE1hbnVhbCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgX3NldE5leHRJZE1hbnVhbDsKKyAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uKGJvb2wgU2V0TmV4dElkTWFudWFsKQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0TmV4dElkTWFudWFsID0gU2V0TmV4dElkTWFudWFsOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBYbWxOb2RlIFRvcE5vZGUgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBMaXN0PFQ+IF9saXN0ID0gbmV3IExpc3Q8VD4oKTsKKyAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX2RpYyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7CisgICAgICAgIGludGVybmFsIGludCBOZXh0SWQ9MDsKKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZTxUPiBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIFQgdGhpc1tpbnQgUG9zaXRpb25JRF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0W1Bvc2l0aW9uSURdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vaW50ZXJuYWwgaW50IEFkZChUIGl0ZW0pCisgICAgICAgIC8veworICAgICAgICAvLyAgICBfbGlzdC5BZGQoaXRlbSk7CisgICAgICAgIC8vICAgIGlmIChfc2V0TmV4dElkTWFudWFsKSBOZXh0SWQrKzsKKyAgICAgICAgLy8gICAgcmV0dXJuIF9saXN0LkNvdW50LTE7CisgICAgICAgIC8vfQorICAgICAgICBpbnRlcm5hbCBpbnQgQWRkKHN0cmluZyBrZXksIFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3QuQWRkKGl0ZW0pOworICAgICAgICAgICAgaWYgKCFfZGljLkNvbnRhaW5zS2V5KGtleS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSkgX2RpYy5BZGQoa2V5LlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIF9saXN0LkNvdW50IC0gMSk7CisgICAgICAgICAgICBpZiAoX3NldE5leHRJZE1hbnVhbCkgTmV4dElkKys7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuQ291bnQtMTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaW5kcyB0aGUga2V5IAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+dGhlIGtleSB0byBiZSBmb3VuZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2JqIj5UaGUgZm91bmQgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UcnVlIGlmIGZvdW5kPC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBib29sIEZpbmRCeUlEKHN0cmluZyBrZXksIHJlZiBUIG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kaWMuQ29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmogPSBfbGlzdFtfZGljW2tleS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpXV07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZpbmQgSW5kZXgKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIGludCBGaW5kSW5kZXhCeUlEKHN0cmluZyBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZGljLkNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kaWNba2V5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzS2V5KHN0cmluZyBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfZGljLkNvbnRhaW5zS2V5KGtleSk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTb3J0KENvbXBhcmlzb248VD4gYykKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3QuU29ydChjKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFN0eWxlcy5jcyBiL0VQUGx1cy9FeGNlbFN0eWxlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmRmMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsU3R5bGVzLmNzCkBAIC0wLDAgKzEsMTAwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS+RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS+RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOwordXNpbmcgZHJhdz1TeXN0ZW0uRHJhd2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworCS8vLyA8c3VtbWFyeT4KKwkvLy8gQ29udGFpbnRzIGFsbCBzaGFyZWQgY2VsbCBzdHlsZXMgZm9yIGEgd29ya2Jvb2sKKwkvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTdHlsZXMgOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIGNvbnN0IHN0cmluZyBOdW1iZXJGb3JtYXRzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpudW1GbXRzIjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIEZvbnRzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpmb250cyI7CisgICAgICAgIGNvbnN0IHN0cmluZyBGaWxsc1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6ZmlsbHMiOworICAgICAgICBjb25zdCBzdHJpbmcgQm9yZGVyc1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6Ym9yZGVycyI7CisgICAgICAgIGNvbnN0IHN0cmluZyBDZWxsU3R5bGVYZnNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmNlbGxTdHlsZVhmcyI7CisgICAgICAgIGNvbnN0IHN0cmluZyBDZWxsWGZzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpjZWxsWGZzIjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIENlbGxTdHlsZXNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmNlbGxTdHlsZXMiOworICAgICAgICBjb25zdCBzdHJpbmcgZHhmc1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6ZHhmcyI7CisKKyAgICAgICAgLy9pbnRlcm5hbCBEaWN0aW9uYXJ5PGludCwgRXhjZWxYZnM+IFN0eWxlcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRXhjZWxYZnM+KCk7CisgICAgICAgIFhtbERvY3VtZW50IF9zdHlsZVhtbDsKKyAgICAgICAgRXhjZWxXb3JrYm9vayBfd2I7CisgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25hbWVTcGFjZU1hbmFnZXI7CisgICAgICAgIGludGVybmFsIGludCBfbmV4dERmeE51bUZtdElEID0gMTY0OworICAgICAgICBpbnRlcm5hbCBFeGNlbFN0eWxlcyhYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIsIFhtbERvY3VtZW50IHhtbCwgRXhjZWxXb3JrYm9vayB3YikgOgorICAgICAgICAgICAgYmFzZShOYW1lU3BhY2VNYW5hZ2VyLCB4bWwpCisgICAgICAgIHsgICAgICAgCisgICAgICAgICAgICBfc3R5bGVYbWw9eG1sOworICAgICAgICAgICAgX3diID0gd2I7CisgICAgICAgICAgICBfbmFtZVNwYWNlTWFuYWdlciA9IE5hbWVTcGFjZU1hbmFnZXI7CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAibnVtRm10cyIsICJmb250cyIsICJmaWxscyIsICJib3JkZXJzIiwgImNlbGxTdHlsZVhmcyIsICJjZWxsWGZzIiwgImNlbGxTdHlsZXMiLCAiZHhmcyIgfTsKKyAgICAgICAgICAgIExvYWRGcm9tRG9jdW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb2FkcyB0aGUgc3R5bGUgWE1MIHRvIG1lbW9yeQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgTG9hZEZyb21Eb2N1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vTnVtYmVyRm9ybWF0cworICAgICAgICAgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwuQWRkQnVpbGRJbihOYW1lU3BhY2VNYW5hZ2VyLCBOdW1iZXJGb3JtYXRzKTsKKyAgICAgICAgICAgIFhtbE5vZGUgbnVtTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKE51bWJlckZvcm1hdHNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAobnVtTm9kZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBudW1Ob2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwgbmYgPSBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoX25hbWVTcGFjZU1hbmFnZXIsIG4pOworICAgICAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZChuZi5JZCwgbmYpOworICAgICAgICAgICAgICAgICAgICBpZiAobmYuTnVtRm10SWQgPj0gTnVtYmVyRm9ybWF0cy5OZXh0SWQpIE51bWJlckZvcm1hdHMuTmV4dElkPW5mLk51bUZtdElkKzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZvbnRzCisgICAgICAgICAgICBYbWxOb2RlIGZvbnROb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoRm9udHNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gZm9udE5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxGb250WG1sIGYgPSBuZXcgRXhjZWxGb250WG1sKF9uYW1lU3BhY2VNYW5hZ2VyLCBuKTsKKyAgICAgICAgICAgICAgICBGb250cy5BZGQoZi5JZCwgZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRmlsbHMKKyAgICAgICAgICAgIFhtbE5vZGUgZmlsbE5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShGaWxsc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBmaWxsTm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlbEZpbGxYbWwgZjsKKyAgICAgICAgICAgICAgICBpZiAobi5GaXJzdENoaWxkICE9IG51bGwgJiYgbi5GaXJzdENoaWxkLkxvY2FsTmFtZSA9PSAiZ3JhZGllbnRGaWxsIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGYgPSBuZXcgRXhjZWxHcmFkaWVudEZpbGxYbWwoX25hbWVTcGFjZU1hbmFnZXIsIG4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmID0gbmV3IEV4Y2VsRmlsbFhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGxzLkFkZChmLklkLCBmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9Cb3JkZXJzCisgICAgICAgICAgICBYbWxOb2RlIGJvcmRlck5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShCb3JkZXJzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIGJvcmRlck5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxCb3JkZXJYbWwgYiA9IG5ldyBFeGNlbEJvcmRlclhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7CisgICAgICAgICAgICAgICAgQm9yZGVycy5BZGQoYi5JZCwgYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vY2VsbFN0eWxlWGZzCisgICAgICAgICAgICBYbWxOb2RlIHN0eWxlWGZzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKENlbGxTdHlsZVhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmIChzdHlsZVhmc05vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gc3R5bGVYZnNOb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgaXRlbSA9IG5ldyBFeGNlbFhmcyhfbmFtZVNwYWNlTWFuYWdlciwgbiwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIENlbGxTdHlsZVhmcy5BZGQoaXRlbS5JZCwgaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYbWxOb2RlIHN0eWxlTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKENlbGxYZnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlTm9kZS5DaGlsZE5vZGVzLkNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sTm9kZSBuID0gc3R5bGVOb2RlLkNoaWxkTm9kZXNbaV07CisgICAgICAgICAgICAgICAgRXhjZWxYZnMgaXRlbSA9IG5ldyBFeGNlbFhmcyhfbmFtZVNwYWNlTWFuYWdlciwgbiwgdGhpcyk7CisgICAgICAgICAgICAgICAgQ2VsbFhmcy5BZGQoaXRlbS5JZCwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vY2VsbFN0eWxlCisgICAgICAgICAgICBYbWxOb2RlIG5hbWVkU3R5bGVOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoQ2VsbFN0eWxlc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmIChuYW1lZFN0eWxlTm9kZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBuYW1lZFN0eWxlTm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsTmFtZWRTdHlsZVhtbCBpdGVtID0gbmV3IEV4Y2VsTmFtZWRTdHlsZVhtbChfbmFtZVNwYWNlTWFuYWdlciwgbiwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIE5hbWVkU3R5bGVzLkFkZChpdGVtLk5hbWUsIGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9keGZzUGF0aAorICAgICAgICAgICAgWG1sTm9kZSBkeGZzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKGR4ZnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAoZHhmc05vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIHggaW4gZHhmc05vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIGl0ZW0gPSBuZXcgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyhfbmFtZVNwYWNlTWFuYWdlciwgeCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIER4ZnMuQWRkKGl0ZW0uSWQsIGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFN0eWxlIEdldFN0eWxlT2JqZWN0KGludCBJZCxpbnQgUG9zaXRpb25JRCwgc3RyaW5nIEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJZCA8IDApIElkID0gMDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxTdHlsZSh0aGlzLCBQcm9wZXJ0eUNoYW5nZSwgUG9zaXRpb25JRCwgQWRkcmVzcywgSWQpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhhbmRlbHMgY2hhbmdlcyBvZiBwcm9wZXJ0aWVzIG9uIHRoZSBzdHlsZSBvYmplY3RzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VuZGVyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIGludCBQcm9wZXJ0eUNoYW5nZShTdHlsZUJhc2Ugc2VuZGVyLCBTdHlsZS5TdHlsZUNoYW5nZUV2ZW50QXJncyBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKGUuQWRkcmVzcyk7CisgICAgICAgICAgICB2YXIgd3MgPSBfd2IuV29ya3NoZWV0c1tlLlBvc2l0aW9uSURdOworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gc3R5bGVDYXNoZSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgLy9TZXQgc2luZ2xlIGFkZHJlc3MKKyAgICAgICAgICAgIGxvY2sgKHdzLl9zdHlsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0U3R5bGVBZGRyZXNzKHNlbmRlciwgZSwgYWRkcmVzcywgd3MsIHJlZiBzdHlsZUNhc2hlKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5BZGRyZXNzZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vSGFuZGxlIG11bHRpYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpbm5lckFkZHJlc3MgaW4gYWRkcmVzcy5BZGRyZXNzZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFN0eWxlQWRkcmVzcyhzZW5kZXIsIGUsIGlubmVyQWRkcmVzcywgd3MsIHJlZiBzdHlsZUNhc2hlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFN0eWxlQWRkcmVzcyhTdHlsZUJhc2Ugc2VuZGVyLCBTdHlsZS5TdHlsZUNoYW5nZUV2ZW50QXJncyBlLCBFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsIEV4Y2VsV29ya3NoZWV0IHdzLCByZWYgRGljdGlvbmFyeTxpbnQsIGludD4gc3R5bGVDYXNoZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkZHJlc3MuU3RhcnQuQ29sdW1uID09IDAgfHwgYWRkcmVzcy5TdGFydC5Sb3cgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiZXJyb3IgYWRkcmVzcyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vQ29sdW1ucworICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzcy5TdGFydC5Sb3cgPT0gMSAmJiBhZGRyZXNzLkVuZC5Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxDb2x1bW4gY29sdW1uOworICAgICAgICAgICAgICAgIGludCBjb2wgPSBhZGRyZXNzLlN0YXJ0LkNvbHVtbiwgcm93ID0gMDsKKyAgICAgICAgICAgICAgICAvL0dldCB0aGUgc3RhcnRjb2x1bW4KKyAgICAgICAgICAgICAgICBpZiAoIXdzLl92YWx1ZXMuRXhpc3RzKDAsIGFkZHJlc3MuU3RhcnQuQ29sdW1uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHdzLkNvbHVtbihhZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IChFeGNlbENvbHVtbil3cy5fdmFsdWVzLkdldFZhbHVlKDAsIGFkZHJlc3MuU3RhcnQuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHdoaWxlIChjb2x1bW4uQ29sdW1uTWluIDw9IGFkZHJlc3MuRW5kLkNvbHVtbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uTWF4ID4gYWRkcmVzcy5FbmQuQ29sdW1uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q29sID0gd3MuQ29weUNvbHVtbihjb2x1bW4sIGFkZHJlc3MuRW5kLkNvbHVtbiArIDEsIGNvbHVtbi5Db2x1bW5NYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLkNvbHVtbk1heCA9IGFkZHJlc3MuRW5kLkNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHdzLl9zdHlsZXMuR2V0VmFsdWUoMCwgY29sdW1uLkNvbHVtbk1pbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZSgwLCBjb2x1bW4uQ29sdW1uTWluLCBzdHlsZUNhc2hlW3NdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lEKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQocywgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUoMCwgY29sdW1uLkNvbHVtbk1pbiwgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9pbmRleCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICghd3MuX3ZhbHVlcy5OZXh0Q2VsbChyZWYgcm93LCByZWYgY29sKSB8fCByb3cgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX2NvbHVtbk1heCA9IGFkZHJlc3MuRW5kLkNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gKHdzLl92YWx1ZXMuR2V0VmFsdWUoMCwgY29sKSBhcyBFeGNlbENvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29sdW1uLl9jb2x1bW5NYXggPCBhZGRyZXNzLkVuZC5Db2x1bW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q29sID0gd3MuQ29sdW1uKGNvbHVtbi5fY29sdW1uTWF4ICsgMSkgYXMgRXhjZWxDb2x1bW47CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbC5fY29sdW1uTWF4ID0gYWRkcmVzcy5FbmQuQ29sdW1uOworCisgICAgICAgICAgICAgICAgICAgIHZhciBzID0gd3MuX3N0eWxlcy5HZXRWYWx1ZSgwLCBjb2x1bW4uQ29sdW1uTWluKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkocykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKDAsIGNvbHVtbi5Db2x1bW5NaW4sIHN0eWxlQ2FzaGVbc10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZSgwLCBjb2x1bW4uQ29sdW1uTWluLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX2NvbHVtbk1heCA9IGFkZHJlc3MuRW5kLkNvbHVtbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL1NldCBmb3IgaW5kaXZpZHVhbCBjZWxscyBpbiB0aGUgc3Bhbi4gV2UgbG9vcCBhbGwgY2VsbHMgaGVyZSBzaW5jZSB0aGUgY2VsbHMgYXJlIHNvcnRlZCB3aXRoIGNvbHVtbnMgZmlyc3QuCisgICAgICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHdzLl9zdHlsZXMsIDEsIGFkZHJlc3MuX2Zyb21Db2wsIGFkZHJlc3MuX3RvUm93LCBhZGRyZXNzLl90b0NvbCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3NlLkNvbHVtbiA+PSBhZGRyZXNzLlN0YXJ0LkNvbHVtbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY3NlLkNvbHVtbiA8PSBhZGRyZXNzLkVuZC5Db2x1bW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KGNzZS5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUoY3NlLlJvdywgY3NlLkNvbHVtbiwgc3R5bGVDYXNoZVtjc2UuVmFsdWVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbY3NlLlZhbHVlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3SWQgPSBzdC5HZXROZXdJRChDZWxsWGZzLCBzZW5kZXIsIGUuU3R5bGVDbGFzcywgZS5TdHlsZVByb3BlcnR5LCBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChjc2UuVmFsdWUsIG5ld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2UuVmFsdWUgPSBuZXdJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dzLlNldFN0eWxlKGNzZS5Sb3csIGNzZS5Db2x1bW4sIG5ld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vVXBkYXRlIGNlbGxzIHdpdGggc3R5bGVkIGNvbHVtbnMKKyAgICAgICAgICAgICAgICBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50Pih3cy5fc3R5bGVzLCAxLCAwLCBhZGRyZXNzLl90b1JvdywgMCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gYWRkcmVzcy5fZnJvbVJvdzsgYyA8PSBhZGRyZXNzLl90b0NvbDsgYysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzLl9zdHlsZXMuRXhpc3RzKGNzZS5Sb3csIGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KGNzZS5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShjc2UuUm93LCBjLCBzdHlsZUNhc2hlW2NzZS5WYWx1ZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbY3NlLlZhbHVlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKGNzZS5WYWx1ZSwgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShjc2UuUm93LCBjLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL1Jvd3MKKyAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3MuU3RhcnQuQ29sdW1uID09IDEgJiYgYWRkcmVzcy5FbmQuQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHJvd051bSA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3dOdW0gPD0gYWRkcmVzcy5FbmQuUm93OyByb3dOdW0rKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzID0gd3MuX3N0eWxlcy5HZXRWYWx1ZShyb3dOdW0sIDApOworICAgICAgICAgICAgICAgICAgICBpZiAocyA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2l0ZXJhdGUgYWxsIGNvbHVtbnMgYW5kIHNldCB0aGUgcm93IHRvIHRoZSBzdHlsZSBvZiB0aGUgbGFzdCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50Pih3cy5fc3R5bGVzLCAwLCAxLCAwLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gY3NlLlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gd3MuX3ZhbHVlcy5HZXRWYWx1ZShjc2UuUm93LCBjc2UuQ29sdW1uKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMuQ29sdW1uTWF4IDwgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjLkNvbHVtbk1pbjsgY29sIDwgYy5Db2x1bW5NYXg7IGNvbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzLl9zdHlsZXMuRXhpc3RzKHJvd051bSwgY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5fc3R5bGVzLlNldFZhbHVlKHJvd051bSwgY29sLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKHJvd051bSwgMCwgcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjc2UuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShyb3dOdW0sIDAsIHN0eWxlQ2FzaGVbc10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5fc3R5bGVzLlNldFZhbHVlKHJvd051bSwgMCwgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUocm93TnVtLCAwLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL1VwZGF0ZSBpbmRpdmlkdWFsIGNlbGxzIAorICAgICAgICAgICAgICAgIHZhciBjc2UyID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4od3MuX3N0eWxlcywgYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgYWRkcmVzcy5fdG9Sb3csIGFkZHJlc3MuX3RvQ29sKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3NlMi5OZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGNzZTIuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShjc2UyLlJvdywgY3NlMi5Db2x1bW4sIHN0eWxlQ2FzaGVbc10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjc2UyLlZhbHVlID0gbmV3SWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL1VwZGF0ZSBjZWxscyB3aXRoIHN0eWxlZCByb3dzCisgICAgICAgICAgICAgICAgY3NlMiA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHdzLl9zdHlsZXMsIDAsIDEsIDAsIGFkZHJlc3MuX3RvQ29sKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3NlMi5OZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCByID0gYWRkcmVzcy5fZnJvbVJvdzsgciA8PSBhZGRyZXNzLl90b1JvdzsgcisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzLl9zdHlsZXMuRXhpc3RzKHIsIGNzZTIuQ29sdW1uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGNzZTIuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkocykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShyLCBjc2UyLkNvbHVtbiwgc3R5bGVDYXNoZVtzXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKHMsIG5ld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUociwgY3NlMi5Db2x1bW4sIG5ld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgIC8vQ2VsbHJhbmdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5TdGFydC5Db2x1bW47IGNvbCA8PSBhZGRyZXNzLkVuZC5Db2x1bW47IGNvbCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gYWRkcmVzcy5TdGFydC5Sb3c7IHJvdyA8PSBhZGRyZXNzLkVuZC5Sb3c7IHJvdysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEdldFN0eWxlSWQod3MsIHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKHJvdywgY29sLCBzdHlsZUNhc2hlW3NdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQocywgbmV3SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKHJvdywgY29sLCBuZXdJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBpbnQgR2V0U3R5bGVJZChFeGNlbFdvcmtzaGVldCB3cywgaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHY9MDsKKyAgICAgICAgICAgIGlmICh3cy5fc3R5bGVzLkV4aXN0cyhyb3csIGNvbCwgcmVmIHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3cy5fc3R5bGVzLkV4aXN0cyhyb3csIDAsIHJlZiB2KSkgLy9GaXJzdCBSb3cKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIC8vIHRoZW4gY29sdW1uCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod3MuX3N0eWxlcy5FeGlzdHMoMCwgY29sLCByZWYgdikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcj0wLGM9Y29sOworICAgICAgICAgICAgICAgICAgICAgICAgaWYod3MuX3ZhbHVlcy5QcmV2Q2VsbChyZWYgcixyZWYgYykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbj13cy5fdmFsdWVzLkdldFZhbHVlKDAsYykgYXMgRXhjZWxDb2x1bW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiAhPSBudWxsICYmIGNvbHVtbi5Db2x1bW5NYXggPj0gY29sKSAvL0ZpeGVzIGlzc3VlIDE1MTc0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3MuX3N0eWxlcy5HZXRWYWx1ZSgwLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIYW5kbGVzIHByb3BlcnR5IGNoYW5nZXMgb24gTmFtZWQgc3R5bGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBpbnQgTmFtZWRTdHlsZVByb3BlcnR5Q2hhbmdlKFN0eWxlQmFzZSBzZW5kZXIsIFN0eWxlLlN0eWxlQ2hhbmdlRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJRChlLkFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gQ2VsbFN0eWxlWGZzW05hbWVkU3R5bGVzW2luZGV4XS5TdHlsZVhmSWRdLkdldE5ld0lEKENlbGxTdHlsZVhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgaW50IHByZXZJeD1OYW1lZFN0eWxlc1tpbmRleF0uU3R5bGVYZklkOworICAgICAgICAgICAgICAgIE5hbWVkU3R5bGVzW2luZGV4XS5TdHlsZVhmSWQgPSBuZXdJZDsKKyAgICAgICAgICAgICAgICBOYW1lZFN0eWxlc1tpbmRleF0uU3R5bGUuSW5kZXggPSBuZXdJZDsKKworICAgICAgICAgICAgICAgIE5hbWVkU3R5bGVzW2luZGV4XS5YZklkID0gaW50Lk1pblZhbHVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzdHlsZSBpbiBDZWxsWGZzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLlhmSWQgPT0gcHJldkl4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5YZklkID0gbmV3SWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxOdW1iZXJGb3JtYXRYbWw+IE51bWJlckZvcm1hdHMgPSBuZXcgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxOdW1iZXJGb3JtYXRYbWw+KCk7CisgICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbEZvbnRYbWw+IEZvbnRzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsRm9udFhtbD4oKTsKKyAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsRmlsbFhtbD4gRmlsbHMgPSBuZXcgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxGaWxsWG1sPigpOworICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxCb3JkZXJYbWw+IEJvcmRlcnMgPSBuZXcgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxCb3JkZXJYbWw+KCk7CisgICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4gQ2VsbFN0eWxlWGZzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPigpOworICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IENlbGxYZnMgPSBuZXcgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+KCk7CisgICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbE5hbWVkU3R5bGVYbWw+IE5hbWVkU3R5bGVzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsTmFtZWRTdHlsZVhtbD4oKTsKKyAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmc+IER4ZnMgPSBuZXcgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZz4oKTsKKyAgICAgICAgCisgICAgICAgIGludGVybmFsIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gIiI7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbE5hbWVkU3R5bGVYbWwgQ3JlYXRlTmFtZWRTdHlsZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZU5hbWVkU3R5bGUobmFtZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRTdHlsZVhtbCBDcmVhdGVOYW1lZFN0eWxlKHN0cmluZyBuYW1lLCBFeGNlbFN0eWxlIFRlbXBsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3diLlN0eWxlcy5OYW1lZFN0eWxlcy5FeGlzdHNLZXkobmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJLZXkgezB9IGFscmVhZHkgZXhpc3RzIGluIGNvbGxlY3Rpb24iLCBuYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEV4Y2VsTmFtZWRTdHlsZVhtbCBzdHlsZTsKKyAgICAgICAgICAgIHN0eWxlID0gbmV3IEV4Y2VsTmFtZWRTdHlsZVhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0aGlzKTsKKyAgICAgICAgICAgIGludCB4ZklkQ29weSwgcG9zaXRpb25JRDsKKyAgICAgICAgICAgIEV4Y2VsU3R5bGVzIHN0eWxlczsKKyAgICAgICAgICAgIGlmIChUZW1wbGF0ZSA9PSBudWxsKQorICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgc3R5bGUuU3R5bGUgPSBuZXcgRXhjZWxTdHlsZSh0aGlzLCBOYW1lZFN0eWxlUHJvcGVydHlDaGFuZ2UsIC0xLCBuYW1lLCAwKTsKKyAgICAgICAgICAgICAgICB4ZklkQ29weSA9IDA7CisgICAgICAgICAgICAgICAgcG9zaXRpb25JRCA9IC0xOworICAgICAgICAgICAgICAgIHN0eWxlcyA9IHRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRlbXBsYXRlLlBvc2l0aW9uSUQgPCAwICYmIFRlbXBsYXRlLlN0eWxlcz09dGhpcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhmSWRDb3B5ID0gVGVtcGxhdGUuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSUQ9VGVtcGxhdGUuUG9zaXRpb25JRDsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVzID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgLy9zdHlsZS5TdHlsZSA9IG5ldyBFeGNlbFN0eWxlKHRoaXMsIE5hbWVkU3R5bGVQcm9wZXJ0eUNoYW5nZSwgVGVtcGxhdGUuUG9zaXRpb25JRCwgbmFtZSwgVGVtcGxhdGUuSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAvL3N0eWxlLlN0eWxlWGZJZCA9IFRlbXBsYXRlLkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4ZklkQ29weSA9IFRlbXBsYXRlLlhmSWQ7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSUQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVzID0gVGVtcGxhdGUuU3R5bGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vQ2xvbmUgbmFtZWRzdHlsZQorICAgICAgICAgICAgaW50IHN0eWxlWGZJZCA9IENsb25lU3R5bGUoc3R5bGVzLCB4ZklkQ29weSwgdHJ1ZSk7CisgICAgICAgICAgICAvL0Nsb3NlIGNlbGxzIHN0eWxlCisgICAgICAgICAgICBDZWxsU3R5bGVYZnNbc3R5bGVYZklkXS5YZklkID0gQ2VsbFN0eWxlWGZzLkNvdW50LTE7CisgICAgICAgICAgICBpbnQgeGZpZCA9IENsb25lU3R5bGUoc3R5bGVzLCB4ZklkQ29weSwgZmFsc2UsIHRydWUpOyAvL0Fsd2F5cyBhZGQgYSBuZXcgc3R5bGUgKFdlIGNyZWF0ZSBhIG5ldyBuYW1lZCBzdHlsZSBoZXJlKQorICAgICAgICAgICAgQ2VsbFhmc1t4ZmlkXS5YZklkID0gc3R5bGVYZklkOworICAgICAgICAgICAgc3R5bGUuU3R5bGUgPSBuZXcgRXhjZWxTdHlsZSh0aGlzLCBOYW1lZFN0eWxlUHJvcGVydHlDaGFuZ2UsIHBvc2l0aW9uSUQsIG5hbWUsIHN0eWxlWGZJZCk7CisgICAgICAgICAgICBzdHlsZS5TdHlsZVhmSWQgPSBzdHlsZVhmSWQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN0eWxlLk5hbWUgPSBuYW1lOworICAgICAgICAgICAgaW50IGl4ID1fd2IuU3R5bGVzLk5hbWVkU3R5bGVzLkFkZChzdHlsZS5OYW1lLCBzdHlsZSk7CisgICAgICAgICAgICBzdHlsZS5TdHlsZS5TZXRJbmRleChpeCk7CisgICAgICAgICAgICAvL3N0eWxlLlN0eWxlLlhmSWQgPSBpeDsKKyAgICAgICAgICAgIHJldHVybiBzdHlsZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVYbWwoKQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdmVVbnVzZWRTdHlsZXMoKTsKKworICAgICAgICAgICAgLy9OdW1iZXJGb3JtYXQKKyAgICAgICAgICAgIFhtbE5vZGUgbmZOb2RlPV9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKE51bWJlckZvcm1hdHNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAobmZOb2RlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShOdW1iZXJGb3JtYXRzUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbmZOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoTnVtYmVyRm9ybWF0c1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZk5vZGUuUmVtb3ZlQWxsKCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgaW50IG5vcm1hbEl4ID0gTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJRCgiTm9ybWFsIik7CisgICAgICAgICAgICBpZiAoTmFtZWRTdHlsZXMuQ291bnQgPiAwICYmIG5vcm1hbEl4Pj0wICYmIE5hbWVkU3R5bGVzW25vcm1hbEl4XS5TdHlsZS5OdW1iZXJmb3JtYXQuTnVtRm10SUQgPj0gMTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsTnVtYmVyRm9ybWF0WG1sIG5mID0gTnVtYmVyRm9ybWF0c1tOdW1iZXJGb3JtYXRzLkZpbmRJbmRleEJ5SUQoTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlN0eWxlLk51bWJlcmZvcm1hdC5JZCldOworICAgICAgICAgICAgICAgIG5mTm9kZS5BcHBlbmRDaGlsZChuZi5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJudW1GbXQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKKyAgICAgICAgICAgICAgICBuZi5uZXdJRCA9IGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoIChFeGNlbE51bWJlckZvcm1hdFhtbCBuZiBpbiBOdW1iZXJGb3JtYXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFuZi5CdWlsZEluIC8qJiYgbmYubmV3SUQ8MCovKSAvL0J1aWxkaW4gZm9ybWF0cyBhcmUgbm90IHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZk5vZGUuQXBwZW5kQ2hpbGQobmYuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgibnVtRm10IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7CisgICAgICAgICAgICAgICAgICAgIG5mLm5ld0lEID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKG5mTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vRm9udAorICAgICAgICAgICAgY291bnQ9MDsKKyAgICAgICAgICAgIFhtbE5vZGUgZm50Tm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKEZvbnRzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgZm50Tm9kZS5SZW1vdmVBbGwoKTsKKworICAgICAgICAgICAgLy9Ob3JtYWwgc2hvdWxkIGJlIGZpcnN0IGluIHRoZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBpZiAoTmFtZWRTdHlsZXMuQ291bnQgPiAwICYmIG5vcm1hbEl4ID49IDAgJiYgTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlN0eWxlLkZvbnQuSW5kZXggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsRm9udFhtbCBmbnQgPSBGb250c1tOYW1lZFN0eWxlc1tub3JtYWxJeF0uU3R5bGUuRm9udC5JbmRleF07CisgICAgICAgICAgICAgICAgZm50Tm9kZS5BcHBlbmRDaGlsZChmbnQuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgiZm9udCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKSkpOworICAgICAgICAgICAgICAgIGZudC5uZXdJRCA9IGNvdW50Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsRm9udFhtbCBmbnQgaW4gRm9udHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZudC51c2VDbnQgPiAwLyogJiYgZm50Lm5ld0lEPDAqLykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZudE5vZGUuQXBwZW5kQ2hpbGQoZm50LkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoImZvbnQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKKyAgICAgICAgICAgICAgICAgICAgZm50Lm5ld0lEID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKGZudE5vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKCJjb3VudCIsIGNvdW50LlRvU3RyaW5nKCkpOworCisKKyAgICAgICAgICAgIC8vRmlsbHMKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIFhtbE5vZGUgZmlsbHNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoRmlsbHNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBmaWxsc05vZGUuUmVtb3ZlQWxsKCk7CisgICAgICAgICAgICBGaWxsc1swXS51c2VDbnQgPSAxOyAgICAvL011c3QgZXhpc3QgKG5vbmUpOyAgCisgICAgICAgICAgICBGaWxsc1sxXS51c2VDbnQgPSAxOyAgICAvL011c3QgZXhpc3QgKGdyYXkxMjUpOworICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxGaWxsWG1sIGZpbGwgaW4gRmlsbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGwudXNlQ250ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbGxzTm9kZS5BcHBlbmRDaGlsZChmaWxsLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoImZpbGwiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsbC5uZXdJRCA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKGZpbGxzTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vQm9yZGVycworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgWG1sTm9kZSBib3JkZXJzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKEJvcmRlcnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBib3JkZXJzTm9kZS5SZW1vdmVBbGwoKTsKKyAgICAgICAgICAgIEJvcmRlcnNbMF0udXNlQ250ID0gMTsgICAgLy9NdXN0IGV4aXN0IGJsYW5rOworICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxCb3JkZXJYbWwgYm9yZGVyIGluIEJvcmRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJvcmRlci51c2VDbnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyc05vZGUuQXBwZW5kQ2hpbGQoYm9yZGVyLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoImJvcmRlciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKSkpOworICAgICAgICAgICAgICAgICAgICBib3JkZXIubmV3SUQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoYm9yZGVyc05vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKCJjb3VudCIsIGNvdW50LlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBYbWxOb2RlIHN0eWxlWGZzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKENlbGxTdHlsZVhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmIChzdHlsZVhmc05vZGUgPT0gbnVsbCAmJiBOYW1lZFN0eWxlcy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShDZWxsU3R5bGVYZnNQYXRoKTsKKyAgICAgICAgICAgICAgICBzdHlsZVhmc05vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShDZWxsU3R5bGVYZnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTmFtZWRTdHlsZXMuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0eWxlWGZzTm9kZS5SZW1vdmVBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vTmFtZWRTdHlsZXMKKyAgICAgICAgICAgIGNvdW50ID0gbm9ybWFsSXggPiAtMSA/IDEgOiAwOyAgLy9JZiB3ZSBoYXZlIGEgbm9ybWFsIHN0eWxlLCB3ZSBtYWtlIHN1cmUgaXQncyBhZGRlZCBmaXJzdC4KKworICAgICAgICAgICAgWG1sTm9kZSBjZWxsU3R5bGVOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoQ2VsbFN0eWxlc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmKGNlbGxTdHlsZU5vZGUhPW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VsbFN0eWxlTm9kZS5SZW1vdmVBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhtbE5vZGUgY2VsbFhmc05vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShDZWxsWGZzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgY2VsbFhmc05vZGUuUmVtb3ZlQWxsKCk7CisKKyAgICAgICAgICAgIGlmIChOYW1lZFN0eWxlcy5Db3VudCA+IDAgJiYgbm9ybWFsSXggPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lZFN0eWxlc1tub3JtYWxJeF0ubmV3SUQgPSAwOworICAgICAgICAgICAgICAgIEFkZE5hbWVkU3R5bGUoMCwgc3R5bGVYZnNOb2RlLCBjZWxsWGZzTm9kZSwgTmFtZWRTdHlsZXNbbm9ybWFsSXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsTmFtZWRTdHlsZVhtbCBzdHlsZSBpbiBOYW1lZFN0eWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0eWxlLk5hbWUuRXF1YWxzKCJub3JtYWwiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFkZE5hbWVkU3R5bGUoY291bnQrKywgc3R5bGVYZnNOb2RlLCBjZWxsWGZzTm9kZSwgc3R5bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHlsZS5uZXdJRCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNlbGxTdHlsZU5vZGUuQXBwZW5kQ2hpbGQoc3R5bGUuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgiY2VsbFN0eWxlIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2VsbFN0eWxlTm9kZSE9bnVsbCkgKGNlbGxTdHlsZU5vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKCJjb3VudCIsIGNvdW50LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKHN0eWxlWGZzTm9kZSAhPSBudWxsKSAoc3R5bGVYZnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgLy9DZWxsU3R5bGUKKyAgICAgICAgICAgIGludCB4Zml4ID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsWGZzIHhmIGluIENlbGxYZnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHhmLnVzZUNudCA+IDAgJiYgIShub3JtYWxJeCA+PSAwICYmIE5hbWVkU3R5bGVzW25vcm1hbEl4XS5YZklkID09IHhmaXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2VsbFhmc05vZGUuQXBwZW5kQ2hpbGQoeGYuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgieGYiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKKyAgICAgICAgICAgICAgICAgICAgeGYubmV3SUQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeGZpeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKGNlbGxYZnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgLy9TZXQgZHhmIHN0eWxpbmcgZm9yIGNvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgICAgICAgICAgIFhtbE5vZGUgZHhmc05vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShkeGZzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdzIGluIF93Yi5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZiBpbiB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2YuU3R5bGUuSGFzVmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IER4ZnMuRmluZEluZGV4QnlJRChjZi5TdHlsZS5JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlKWNmKS5EeGZJZCA9IER4ZnMuQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHhmcy5BZGQoY2YuU3R5bGUuSWQsIGNmLlN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbSA9ICgoWG1sRG9jdW1lbnQpVG9wTm9kZSkuQ3JlYXRlRWxlbWVudCgiZCIsICJkeGYiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YuU3R5bGUuQ3JlYXRlTm9kZXMobmV3IFhtbEhlbHBlckluc3RhbmNlKE5hbWVTcGFjZU1hbmFnZXIsIGVsZW0pLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHhmc05vZGUuQXBwZW5kQ2hpbGQoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUpY2YpLkR4ZklkID0gaXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHhmc05vZGUgIT0gbnVsbCkgKGR4ZnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBEeGZzLkNvdW50LlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZE5hbWVkU3R5bGUoaW50IGlkLCBYbWxOb2RlIHN0eWxlWGZzTm9kZSxYbWxOb2RlIGNlbGxYZnNOb2RlLCBFeGNlbE5hbWVkU3R5bGVYbWwgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHlsZVhmcyA9IENlbGxTdHlsZVhmc1tzdHlsZS5TdHlsZVhmSWRdOworICAgICAgICAgICAgc3R5bGVYZnNOb2RlLkFwcGVuZENoaWxkKHN0eWxlWGZzLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoInhmIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pLCB0cnVlKSk7CisgICAgICAgICAgICBzdHlsZVhmcy5uZXdJRCA9IGlkOworICAgICAgICAgICAgc3R5bGVYZnMuWGZJZCA9IHN0eWxlLlN0eWxlWGZJZDsKKworICAgICAgICAgICAgdmFyIGl4ID0gQ2VsbFhmcy5GaW5kSW5kZXhCeUlEKHN0eWxlWGZzLklkKTsKKyAgICAgICAgICAgIGlmIChpeCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VsbFhmc05vZGUuQXBwZW5kQ2hpbGQoc3R5bGVYZnMuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgieGYiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihpZDwwKSBDZWxsWGZzW2l4XS5YZklkID0gaWQ7CisgICAgICAgICAgICAgICAgY2VsbFhmc05vZGUuQXBwZW5kQ2hpbGQoQ2VsbFhmc1tpeF0uQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgieGYiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKKyAgICAgICAgICAgICAgICBDZWxsWGZzW2l4XS51c2VDbnQgPSAwOworICAgICAgICAgICAgICAgIENlbGxYZnNbaXhdLm5ld0lEID0gaWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHlsZS5YZklkID49IDApCisgICAgICAgICAgICAgICAgc3R5bGUuWGZJZCA9IENlbGxYZnNbc3R5bGUuWGZJZF0ubmV3SUQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3R5bGUuWGZJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgUmVtb3ZlVW51c2VkU3R5bGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2VsbFhmc1swXS51c2VDbnQgPSAxOyAvL0ZpcnN0IGl0ZW0gaXMgYWxsd2F5cyB1c2VkLgorICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgc2hlZXQgaW4gX3diLldvcmtzaGVldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHNoZWV0Ll9zdHlsZXMpOworICAgICAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGNzZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbFhmc1t2XS51c2VDbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsTmFtZWRTdHlsZVhtbCBucyBpbiBOYW1lZFN0eWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDZWxsU3R5bGVYZnNbbnMuU3R5bGVYZklkXS51c2VDbnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxYZnMgeGYgaW4gQ2VsbFhmcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeGYudXNlQ250ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4Zi5Gb250SWQgPj0gMCkgRm9udHNbeGYuRm9udElkXS51c2VDbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhmLkZpbGxJZCA+PSAwKSBGaWxsc1t4Zi5GaWxsSWRdLnVzZUNudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoeGYuQm9yZGVySWQgPj0gMCkgQm9yZGVyc1t4Zi5Cb3JkZXJJZF0udXNlQ250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxYZnMgeGYgaW4gQ2VsbFN0eWxlWGZzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh4Zi51c2VDbnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhmLkZvbnRJZCA+PSAwKSBGb250c1t4Zi5Gb250SWRdLnVzZUNudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoeGYuRmlsbElkID49IDApIEZpbGxzW3hmLkZpbGxJZF0udXNlQ250Kys7CisgICAgICAgICAgICAgICAgICAgIGlmICh4Zi5Cb3JkZXJJZCA+PSAwKSBCb3JkZXJzW3hmLkJvcmRlcklkXS51c2VDbnQrKzsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgR2V0U3R5bGVJZEZyb21OYW1lKHN0cmluZyBOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IE5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQoTmFtZSk7CisgICAgICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZCA9IE5hbWVkU3R5bGVzW2ldLlhmSWQ7CisgICAgICAgICAgICAgICAgaWYgKGlkIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdHlsZVhmSWQ9TmFtZWRTdHlsZXNbaV0uU3R5bGVYZklkOworICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBuZXdTdHlsZSA9IENlbGxTdHlsZVhmc1tzdHlsZVhmSWRdLkNvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUuWGZJZCA9IHN0eWxlWGZJZDsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBDZWxsWGZzLkZpbmRJbmRleEJ5SUQobmV3U3R5bGUuSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IENlbGxYZnMuQWRkKG5ld1N0eWxlLklkLCBuZXdTdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTmFtZWRTdHlsZXNbaV0uWGZJZD1pZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIC8vdGhyb3cobmV3IEV4Y2VwdGlvbigiTmFtZWQgc3R5bGUgZG9lcyBub3QgZXhpc3QiKSk7ICAgICAgICAJICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICNyZWdpb24gWG1sSGVscEZ1bmN0aW9ucworICAgICAgICBwcml2YXRlIGludCBHZXRYbWxOb2RlSW50KFhtbE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKEdldFhtbE5vZGUobm9kZSksIG91dCBpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRYbWxOb2RlKFhtbE5vZGUgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9kZS5WYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlLlZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIGludCBDbG9uZVN0eWxlKEV4Y2VsU3R5bGVzIHN0eWxlLCBpbnQgc3R5bGVJRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENsb25lU3R5bGUoc3R5bGUsIHN0eWxlSUQsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IENsb25lU3R5bGUoRXhjZWxTdHlsZXMgc3R5bGUsIGludCBzdHlsZUlELCBib29sIGlzTmFtZWRTdHlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENsb25lU3R5bGUoc3R5bGUsIHN0eWxlSUQsIGlzTmFtZWRTdHlsZSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBDbG9uZVN0eWxlKEV4Y2VsU3R5bGVzIHN0eWxlLCBpbnQgc3R5bGVJRCwgYm9vbCBpc05hbWVkU3R5bGUsIGJvb2wgYWxsd2F5c0FkZCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxYZnMgeGZzOworICAgICAgICAgICAgbG9jayAoc3R5bGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRTdHlsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhmcyA9IHN0eWxlLkNlbGxTdHlsZVhmc1tzdHlsZUlEXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeGZzID0gc3R5bGUuQ2VsbFhmc1tzdHlsZUlEXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXhjZWxYZnMgbmV3WGZzID0geGZzLkNvcHkodGhpcyk7CisgICAgICAgICAgICAgICAgLy9OdW1iZXJmb3JtYXQKKyAgICAgICAgICAgICAgICBpZiAoeGZzLk51bWJlckZvcm1hdElkID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vcmFrZTM2OiBUd28gcHJvYmxlbXMgaGVyZS4uLgorICAgICAgICAgICAgICAgICAgICAvL3Jha2UzNjogIDEuIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggd2hlbiBmb3JtYXQgc3RheXMgZXF1YWwgdG8gU3RyaW5nLkVtcHR5LCBpdCBhZGRzIGEgc3RyaW5nLmVtcHR5IHRvIHRoZSBsaXN0IG9mIE51bWJlciBGb3JtYXRzCisgICAgICAgICAgICAgICAgICAgIC8vcmFrZTM2OiAgMi4gd2hlbiBhZGRpbmcgYSBzZWNvbmQgc2hlZXQsIGlmIHRoZSBudW1iZXJmb3JtYXRpZCA9PSAxNjQsIGl0IGZpbmRzIHRoZSAxNjQgYWRkZWQgYnkgcHJldmlvdXMgc2hlZXRzIGJ1dCB3YXMgdXNpbmcgdGhlIGFycmF5IGluZGV4CisgICAgICAgICAgICAgICAgICAgIC8vcmFrZTM2OiAgICAgIGZvciB0aGUgbnVtYmVyZm9ybWF0aWQKKworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZm9ybWF0ID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZm10IGluIHN0eWxlLk51bWJlckZvcm1hdHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbXQuTnVtRm10SWQgPT0geGZzLk51bWJlckZvcm1hdElkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZtdC5Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9yYWtlMzY6IERvbid0IGFkZCBhbm90aGVyIGZvcm1hdCBpZiBpdCdzIGJsYW5rCisgICAgICAgICAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoZm9ybWF0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl4ID0gTnVtYmVyRm9ybWF0cy5GaW5kSW5kZXhCeUlEKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIpIHsgRm9ybWF0ID0gZm9ybWF0LCBOdW1GbXRJZCA9IE51bWJlckZvcm1hdHMuTmV4dElkKysgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZChmb3JtYXQsIGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmFrZTM2OiBVc2UgdGhlIGp1c3QgYWRkZWQgZm9ybWF0IGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3WGZzLk51bWJlckZvcm1hdElkID0gaXRlbS5OdW1GbXRJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Jha2UzNjogVXNlIHRoZSBmb3JtYXQgaWQgZGVmaW5lZCBieSB0aGUgaW5kZXguLi4gbm90IHRoZSBpbmRleCBpdHNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuTnVtYmVyRm9ybWF0SWQgPSBOdW1iZXJGb3JtYXRzW2l4XS5OdW1GbXRJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vRm9udAorICAgICAgICAgICAgICAgIGlmICh4ZnMuRm9udElkID4gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXggPSBGb250cy5GaW5kSW5kZXhCeUlEKHhmcy5Gb250LklkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxGb250WG1sIGl0ZW0gPSBzdHlsZS5Gb250c1t4ZnMuRm9udElkXS5Db3B5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpeCA9IEZvbnRzLkFkZCh4ZnMuRm9udC5JZCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkZvbnRJZCA9IGl4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vQm9yZGVyCisgICAgICAgICAgICAgICAgaWYgKHhmcy5Cb3JkZXJJZCA+IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl4ID0gQm9yZGVycy5GaW5kSW5kZXhCeUlEKHhmcy5Cb3JkZXIuSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXggPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEJvcmRlclhtbCBpdGVtID0gc3R5bGUuQm9yZGVyc1t4ZnMuQm9yZGVySWRdLkNvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl4ID0gQm9yZGVycy5BZGQoeGZzLkJvcmRlci5JZCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkJvcmRlcklkID0gaXg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9GaWxsCisgICAgICAgICAgICAgICAgaWYgKHhmcy5GaWxsSWQgPiAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IEZpbGxzLkZpbmRJbmRleEJ5SUQoeGZzLkZpbGwuSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXggPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHN0eWxlLkZpbGxzW3hmcy5GaWxsSWRdLkNvcHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl4ID0gRmlsbHMuQWRkKHhmcy5GaWxsLklkLCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdYZnMuRmlsbElkID0gaXg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9OYW1lZCBzdHlsZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBpZiAoeGZzLlhmSWQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gc3R5bGUuQ2VsbFN0eWxlWGZzW3hmcy5YZklkXS5JZDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0lkID0gQ2VsbFN0eWxlWGZzLkZpbmRJbmRleEJ5SUQoaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3SWQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3WGZzLlhmSWQgPSBuZXdJZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHN0eWxlLl93YiE9X3diICYmIGFsbHdheXNBZGQ9PWZhbHNlKSAvL05vdCB0aGUgc2FtZSB3b3JrYm9vaywgY29weSB0aGUgbmFtZWRzdHlsZSB0byB0aGUgd29ya2Jvb2sgb3IgbWF0Y2ggdGhlIGlkCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuc0ZpbmQgPSBzdHlsZS5OYW1lZFN0eWxlcy5Ub0RpY3Rpb25hcnkoZCA9PiAoZC5TdHlsZVhmSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc0ZpbmQuQ29udGFpbnNLZXkoeGZzLlhmSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdCA9IG5zRmluZFt4ZnMuWGZJZF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5hbWVkU3R5bGVzLkV4aXN0c0tleShzdC5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5YZklkID0gTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJRChzdC5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5zID0gQ3JlYXRlTmFtZWRTdHlsZShzdC5OYW1lLCBzdC5TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5YZklkID0gTmFtZWRTdHlsZXMuQ291bnQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgICAgICAgICBpZiAoaXNOYW1lZFN0eWxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBDZWxsU3R5bGVYZnMuQWRkKG5ld1hmcy5JZCwgbmV3WGZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbHdheXNBZGQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQ2VsbFhmcy5BZGQobmV3WGZzLklkLCBuZXdYZnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBDZWxsWGZzLkZpbmRJbmRleEJ5SUQobmV3WGZzLklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBDZWxsWGZzLkFkZChuZXdYZnMuSWQsIG5ld1hmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsVGV4dEZvcm1hdC5jcyBiL0VQUGx1cy9FeGNlbFRleHRGb3JtYXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NDkyNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbFRleHRGb3JtYXQuY3MKQEAgLTAsMCArMSwxMzEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDExLTAxLTAxCisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERpc2NyaWJlcyBhIGNvbHVtbiB3aGVuIHJlYWRpbmcgYSB0ZXh0IHVzaW5nIHRoZSBFeGNlbFJhbmdlQmFzZS5Mb2FkRnJvbVRleHQgbWV0aG9kCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlRGF0YVR5cGVzCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMZXQgdGhlIHRoZSBpbXBvcnQgZGVjaWRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBVbmtub3duLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHdheXMgYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN0cmluZywKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ5IHRvIGNvbnZlcnQgaXQgdG8gYSBudW1iZXIuIElmIGl0IGZhaWxzIHRoZW4gYWRkIGl0IGFzIGEgc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBOdW1iZXIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRyeSB0byBjb252ZXJ0IGl0IHRvIGEgZGF0ZS4gSWYgaXQgZmFpbHMgdGhlbiBhZGQgaXQgYXMgYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIERhdGVUaW1lLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcnkgdG8gY29udmVydCBpdCB0byBhIG51bWJlciBhbmQgZGl2aWRlIHdpdGggMTAwLiAKKyAgICAgICAgLy8vIFJlbW92ZXMgYW55IHRhaWxpbmcgcGVyY2VudCBzaWduICglKS4gSWYgaXQgZmFpbHMgdGhlbiBhZGQgaXQgYXMgYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBlcmNlbnQKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEZXNjcmliZXMgaG93IHRvIHNwbGl0IGEgQ1NWIHRleHQuIFVzZWQgYnkgdGhlIEV4Y2VsUmFuZ2UuTG9hZEZyb21UZXh0IG1ldGhvZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVGV4dEZvcm1hdAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVzY3JpYmVzIGhvdyB0byBzcGxpdCBhIENTViB0ZXh0CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIERlZmF1bHQgdmFsdWVzCisgICAgICAgIC8vLyA8bGlzdD4KKyAgICAgICAgLy8vIDxsaXN0aGVhZGVyPjx0ZXJtPlByb3BlcnR5PC90ZXJtPjxkZXNjcmlwdGlvbj5WYWx1ZTwvZGVzY3JpcHRpb24+PC9saXN0aGVhZGVyPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+RGVsaW1pdGVyPC90ZXJtPjxkZXNjcmlwdGlvbj4sPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgICAgICAgIC8vLyA8aXRlbT48dGVybT5UZXh0UXVhbGlmaWVyPC90ZXJtPjxkZXNjcmlwdGlvbj5Ob25lIChcMCk8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPkVPTDwvdGVybT48ZGVzY3JpcHRpb24+Q1JMRjwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+Q3VsdHVyZTwvdGVybT48ZGVzY3JpcHRpb24+Q3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZTwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+RGF0YVR5cGVzPC90ZXJtPjxkZXNjcmlwdGlvbj5FbmQgb2YgbGluZSBkZWZhdWx0IENSTEY8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPlNraXBMaW5lc0JlZ2lubmluZzwvdGVybT48ZGVzY3JpcHRpb24+MDwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+U2tpcExpbmVzRW5kPC90ZXJtPjxkZXNjcmlwdGlvbj4wPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgICAgICAgIC8vLyA8aXRlbT48dGVybT5FbmNvZGluZzwvdGVybT48ZGVzY3JpcHRpb24+RW5jb2RpbmcuQVNDSUk8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVGV4dEZvcm1hdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGltaXRlciA9ICcsJzsKKyAgICAgICAgICAgIFRleHRRdWFsaWZpZXIgPSAnXDAnOworICAgICAgICAgICAgRU9MID0gIlxyXG4iOworICAgICAgICAgICAgQ3VsdHVyZSA9IEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmU7CisgICAgICAgICAgICBEYXRhVHlwZXM9bnVsbDsKKyAgICAgICAgICAgIFNraXBMaW5lc0JlZ2lubmluZyA9IDA7CisgICAgICAgICAgICBTa2lwTGluZXNFbmQgPSAwOworICAgICAgICAgICAgRW5jb2Rpbmc9RW5jb2RpbmcuQVNDSUk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVsaW1pdGVyIGNoYXJhY3RlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2hhciBEZWxpbWl0ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXh0IHF1YWxpZmllciBjaGFyYWN0ZXIgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjaGFyIFRleHRRdWFsaWZpZXIge2dldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEVuZCBvZiBsaW5lIGNoYXJhY3RlcnMuIERlZmF1bHQgQ1JMRgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEVPTCB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERhdGF0eXBlcyBsaXN0IGZvciBlYWNoIGNvbHVtbiAoaWYgY29sdW1uIGlzIG5vdCBwcmVzZW50IFVua25vd24gaXMgYXNzdW1lZCkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVEYXRhVHlwZXNbXSBEYXRhVHlwZXMgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDdWx0dXJlIHVzZWQgd2hlbiBwYXJzaW5nLiBEZWZhdWx0IEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEN1bHR1cmVJbmZvIEN1bHR1cmUge2dldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE51bWJlciBvZiBsaW5lcyBza2lwZWQgaW4gdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlLiBEZWZhdWx0IDAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgU2tpcExpbmVzQmVnaW5uaW5nIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtYmVyIG9mIGxpbmVzIHNraXBlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBEZWZhdWx0IDAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgU2tpcExpbmVzRW5kIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gT25seSB1c2VkIHdoZW4gcmVhZGluZyBmaWxlcyBmcm9tIGRpc2sgdXNpbmcgYSBGaWxlSW5mbyBvYmplY3QuIERlZmF1bHQgQXNjSUkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEVuY29kaW5nIEVuY29kaW5nIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxXb3JrYm9vay5jcyBiL0VQUGx1cy9FeGNlbFdvcmtib29rLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWEwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxXb3JrYm9vay5jcwpAQCAtMCwwICsxLDExNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAyMDExLTAxLTAxCisgKiBKYW4gS+RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqIFJpY2hhcmQgVGFsbGVudAkJRml4IGVzY2FwaW5nIG9mIHF1b3RlcwkJCQkJMjAxMi0xMC0zMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLlZCQTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXA7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKwkjcmVnaW9uIFB1YmxpYyBFbnVtIEV4Y2VsQ2FsY01vZGUKKwkvLy8gPHN1bW1hcnk+CisJLy8vIEhvdyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGN1bGF0ZSBmb3JtdWxhcyBpbiB0aGUgd29ya2Jvb2sKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBlbnVtIEV4Y2VsQ2FsY01vZGUKKwl7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEluZGljYXRlcyB0aGF0IGNhbGN1bGF0aW9ucyBpbiB0aGUgd29ya2Jvb2sgYXJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VsbCB2YWx1ZXMgY2hhbmdlLiAKKwkJLy8vIFRoZSBhcHBsaWNhdGlvbiByZWNhbGN1bGF0ZXMgdGhvc2UgY2VsbHMgdGhhdCBhcmUgZGVwZW5kZW50IG9uIG90aGVyIGNlbGxzIHRoYXQgY29udGFpbiBjaGFuZ2VkIHZhbHVlcy4gCisJCS8vLyBUaGlzIG1vZGUgb2YgY2FsY3VsYXRpb24gaGVscHMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgY2FsY3VsYXRpb25zLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlBdXRvbWF0aWMsCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEluZGljYXRlcyB0YWJsZXMgYmUgZXhjbHVkZWQgZHVyaW5nIGF1dG9tYXRpYyBjYWxjdWxhdGlvbgorCQkvLy8gPC9zdW1tYXJ5PgorCQlBdXRvbWF0aWNOb1RhYmxlLAorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJbmRpY2F0ZXMgdGhhdCBjYWxjdWxhdGlvbnMgaW4gdGhlIHdvcmtib29rIGJlIHRyaWdnZXJlZCBtYW51YWxseSBieSB0aGUgdXNlci4gCisJCS8vLyA8L3N1bW1hcnk+CisJCU1hbnVhbAorCX0KKwkjZW5kcmVnaW9uCisKKwkvLy8gPHN1bW1hcnk+CisJLy8vIFJlcHJlc2VudHMgdGhlIEV4Y2VsIHdvcmtib29rIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSAKKwkvLy8gZG9jdW1lbnQgcHJvcGVydGllcyBhbmQgd29ya3NoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rLgorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFdvcmtib29rIDogWG1sSGVscGVyLCBJRGlzcG9zYWJsZQorCXsKKwkJaW50ZXJuYWwgY2xhc3MgU2hhcmVkU3RyaW5nSXRlbQorCQl7CisJCQlpbnRlcm5hbCBpbnQgcG9zOworCQkJaW50ZXJuYWwgc3RyaW5nIFRleHQ7CisJCQlpbnRlcm5hbCBib29sIGlzUmljaFRleHQgPSBmYWxzZTsKKwkJfQorCQkjcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcworCQlpbnRlcm5hbCBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisJCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXRzIF93b3Jrc2hlZXRzOworCQlwcml2YXRlIE9mZmljZVByb3BlcnRpZXMgX3Byb3BlcnRpZXM7CisKKwkJcHJpdmF0ZSBFeGNlbFN0eWxlcyBfc3R5bGVzOworCQkjZW5kcmVnaW9uCisKKwkJI3JlZ2lvbiBFeGNlbFdvcmtib29rIENvbnN0cnVjdG9yCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsV29ya2Jvb2sgY2xhc3MuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0icGFja2FnZSI+VGhlIHBhcmVudCBwYWNrYWdlPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5OYW1lc3BhY2VNYW5hZ2VyPC9wYXJhbT4KKwkJaW50ZXJuYWwgRXhjZWxXb3JrYm9vayhFeGNlbFBhY2thZ2UgcGFja2FnZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKSA6CisJCQliYXNlKG5hbWVzcGFjZU1hbmFnZXIpCisJCXsKKwkJCV9wYWNrYWdlID0gcGFja2FnZTsKKwkJCVdvcmtib29rVXJpID0gbmV3IFVyaSgiL3hsL3dvcmtib29rLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOworCQkJU2hhcmVkU3RyaW5nc1VyaSA9IG5ldyBVcmkoIi94bC9zaGFyZWRTdHJpbmdzLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOworCQkJU3R5bGVzVXJpID0gbmV3IFVyaSgiL3hsL3N0eWxlcy54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKworCQkJX25hbWVzID0gbmV3IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24odGhpcyk7CisJCQlfbmFtZXNwYWNlTWFuYWdlciA9IG5hbWVzcGFjZU1hbmFnZXI7CisJCQlUb3BOb2RlID0gV29ya2Jvb2tYbWwuRG9jdW1lbnRFbGVtZW50OworCQkJU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImZpbGVWZXJzaW9uIiwgImZpbGVTaGFyaW5nIiwgIndvcmtib29rUHIiLCAid29ya2Jvb2tQcm90ZWN0aW9uIiwgImJvb2tWaWV3cyIsICJzaGVldHMiLCAiZnVuY3Rpb25Hcm91cHMiLCAiZnVuY3Rpb25Qcm90b3R5cGVzIiwgImV4dGVybmFsUmVmZXJlbmNlcyIsICJkZWZpbmVkTmFtZXMiLCAiY2FsY1ByIiwgIm9sZVNpemUiLCAiY3VzdG9tV29ya2Jvb2tWaWV3cyIsICJwaXZvdENhY2hlcyIsICJzbWFydFRhZ1ByIiwgInNtYXJ0VGFnVHlwZXMiLCAid2ViUHVibGlzaGluZyIsICJmaWxlUmVjb3ZlcnlQciIsIH07CisJCSAgICBGdWxsQ2FsY09uTG9hZCA9IHRydWU7ICAvL0Z1bGwgY2FsY3VsYXRpb24gb24gbG9hZCBieSBkZWZhdWx0LCBmb3IgYm90aCBuZXcgd29ya2Jvb2tzIGFuZCB0ZW1wbGF0ZXMuCisJCQlHZXRTaGFyZWRTdHJpbmdzKCk7CisJCX0KKwkJI2VuZHJlZ2lvbgorCisJCWludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBTaGFyZWRTdHJpbmdJdGVtPiBfc2hhcmVkU3RyaW5ncyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgU2hhcmVkU3RyaW5nSXRlbT4oKTsgLy9Vc2VkIHdoZW4gcmVhZGluZyBjZWxscy4KKwkJaW50ZXJuYWwgTGlzdDxTaGFyZWRTdHJpbmdJdGVtPiBfc2hhcmVkU3RyaW5nc0xpc3QgPSBuZXcgTGlzdDxTaGFyZWRTdHJpbmdJdGVtPigpOyAvL1VzZWQgd2hlbiByZWFkaW5nIGNlbGxzLgorCQlpbnRlcm5hbCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIF9uYW1lczsKKwkJaW50ZXJuYWwgaW50IF9uZXh0RHJhd2luZ0lEID0gMDsKKwkJaW50ZXJuYWwgaW50IF9uZXh0VGFibGVJRCA9IGludC5NaW5WYWx1ZTsKKyAgICAgICAgaW50ZXJuYWwgaW50IF9uZXh0UGl2b3RUYWJsZUlEID0gaW50Lk1pblZhbHVlOworCQlpbnRlcm5hbCBYbWxOYW1lc3BhY2VNYW5hZ2VyIF9uYW1lc3BhY2VNYW5hZ2VyOworICAgICAgICBpbnRlcm5hbCBGb3JtdWxhUGFyc2VyIF9mb3JtdWxhUGFyc2VyID0gbnVsbDsKKwkgICAgaW50ZXJuYWwgRm9ybXVsYVBhcnNlck1hbmFnZXIgX3BhcnNlck1hbmFnZXI7CisgICAgICAgIGludGVybmFsIENlbGxTdG9yZTxMaXN0PFRva2VuPj4gX2Zvcm11bGFUb2tlbnM7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJlYWQgc2hhcmVkIHN0cmluZ3MgdG8gbGlzdAorCQkvLy8gPC9zdW1tYXJ5PgorCQlwcml2YXRlIHZvaWQgR2V0U2hhcmVkU3RyaW5ncygpCisJCXsKKwkJCWlmIChfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHMoU2hhcmVkU3RyaW5nc1VyaSkpCisJCQl7CisJCQkJdmFyIHhtbCA9IF9wYWNrYWdlLkdldFhtbEZyb21VcmkoU2hhcmVkU3RyaW5nc1VyaSk7CisJCQkJWG1sTm9kZUxpc3QgbmwgPSB4bWwuU2VsZWN0Tm9kZXMoIi8vZDpzc3QvZDpzaSIsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJCV9zaGFyZWRTdHJpbmdzTGlzdCA9IG5ldyBMaXN0PFNoYXJlZFN0cmluZ0l0ZW0+KCk7CisJCQkJaWYgKG5sICE9IG51bGwpCisJCQkJeworCQkJCQlmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gbmwpCisJCQkJCXsKKwkJCQkJCVhtbE5vZGUgbiA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDp0IiwgTmFtZVNwYWNlTWFuYWdlcik7CisJCQkJCQlpZiAobiAhPSBudWxsKQorCQkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zaGFyZWRTdHJpbmdzTGlzdC5BZGQobmV3IFNoYXJlZFN0cmluZ0l0ZW0oKSB7IFRleHQgPSBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyhuLklubmVyVGV4dCkgfSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJX3NoYXJlZFN0cmluZ3NMaXN0LkFkZChuZXcgU2hhcmVkU3RyaW5nSXRlbSgpIHsgVGV4dCA9IG5vZGUuSW5uZXJYbWwsIGlzUmljaFRleHQgPSB0cnVlIH0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgICAgIC8vRGVsZXRlIHRoZSBzaGFyZWQgc3RyaW5nIHBhcnQsIGl0IHdpbGwgYmUgcmVjcmVhdGVkIHdoZW4gdGhlIHBhY2thZ2UgaXMgc2F2ZWQuCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJlbCBpbiBQYXJ0LkdldFJlbGF0aW9uc2hpcHMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWwuVGFyZ2V0VXJpLk9yaWdpbmFsU3RyaW5nLkVuZHNXaXRoKCJzaGFyZWRzdHJpbmdzLnhtbCIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChyZWwuSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9wYWNrYWdlLlBhY2thZ2UuRGVsZXRlUGFydChTaGFyZWRTdHJpbmdzVXJpKTsgLy9SZW1vdmUgdGhlIHBhcnQsIGl0IGlzIHJlY3JlYXRlZCB3aGVuIHNhdmVkLgorCQkJfQorCQl9CisJCWludGVybmFsIHZvaWQgR2V0RGVmaW5lZE5hbWVzKCkKKwkJeworCQkJWG1sTm9kZUxpc3QgbmwgPSBXb3JrYm9va1htbC5TZWxlY3ROb2RlcygiLy9kOmRlZmluZWROYW1lcy9kOmRlZmluZWROYW1lIiwgTmFtZVNwYWNlTWFuYWdlcik7CisJCQlpZiAobmwgIT0gbnVsbCkKKwkJCXsKKwkJCQlmb3JlYWNoIChYbWxFbGVtZW50IGVsZW0gaW4gbmwpCisJCQkJeyAKKwkJCQkJc3RyaW5nIGZ1bGxBZGRyZXNzID0gZWxlbS5Jbm5lclRleHQ7CisKKwkJCQkJaW50IGxvY2FsU2hlZXRJRDsKKwkJCQkJRXhjZWxXb3Jrc2hlZXQgbmFtZVdvcmtzaGVldDsKKwkJCQkJaWYoIWludC5UcnlQYXJzZShlbGVtLkdldEF0dHJpYnV0ZSgibG9jYWxTaGVldElkIiksIG91dCBsb2NhbFNoZWV0SUQpKQorCQkJCQl7CisJCQkJCQlsb2NhbFNoZWV0SUQgPSAtMTsKKwkJCQkJCW5hbWVXb3Jrc2hlZXQ9bnVsbDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW5hbWVXb3Jrc2hlZXQ9V29ya3NoZWV0c1tsb2NhbFNoZWV0SUQgKyAxXTsKKwkJCQkJfQorCQkJCQl2YXIgYWRkcmVzc1R5cGUgPSBFeGNlbEFkZHJlc3NCYXNlLklzVmFsaWQoZnVsbEFkZHJlc3MpOworCQkJCQlFeGNlbFJhbmdlQmFzZSByYW5nZTsKKwkJCQkJRXhjZWxOYW1lZFJhbmdlIG5hbWVkUmFuZ2U7CisKKwkJCQkJaWYgKGZ1bGxBZGRyZXNzLkluZGV4T2YoIlsiKSA9PSAwKQorCQkJCQl7CisJCQkJCQlpbnQgc3RhcnQgPSBmdWxsQWRkcmVzcy5JbmRleE9mKCJbIik7CisJCQkJCQlpbnQgZW5kID0gZnVsbEFkZHJlc3MuSW5kZXhPZigiXSIsIHN0YXJ0KTsKKwkJCQkJCWlmIChzdGFydCA+PSAwICYmIGVuZCA+PSAwKQorCQkJCQkJeworCisJCQkJCQkJc3RyaW5nIGV4dGVybmFsSW5kZXggPSBmdWxsQWRkcmVzcy5TdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOworCQkJCQkJCWludCBpbmRleDsKKwkJCQkJCQlpZiAoaW50LlRyeVBhcnNlKGV4dGVybmFsSW5kZXgsIG91dCBpbmRleCkpCisJCQkJCQkJeworCQkJCQkJCQlpZiAoaW5kZXggPiAwICYmIGluZGV4IDw9IF9leHRlcm5hbFJlZmVyZW5jZXMuQ291bnQpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWZ1bGxBZGRyZXNzID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKDAsIHN0YXJ0KSArICJbIiArIF9leHRlcm5hbFJlZmVyZW5jZXNbaW5kZXggLSAxXSArICJdIiArIGZ1bGxBZGRyZXNzLlN1YnN0cmluZyhlbmQgKyAxKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChhZGRyZXNzVHlwZSA9PSBFeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkludmFsaWQgfHwgYWRkcmVzc1R5cGUgPT0gRXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5JbnRlcm5hbE5hbWUgfHwgYWRkcmVzc1R5cGUgPT0gRXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5FeHRlcm5hbE5hbWUgfHwgYWRkcmVzc1R5cGU9PUV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuRm9ybXVsYSB8fCBhZGRyZXNzVHlwZT09RXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5FeHRlcm5hbEFkZHJlc3MpICAgIC8vQSB2YWx1ZSBvciBhIGZvcm11bGEKKwkJCQkJeworCQkJCQkJZG91YmxlIHZhbHVlOworCQkJCQkJcmFuZ2UgPSBuZXcgRXhjZWxSYW5nZUJhc2UodGhpcywgbmFtZVdvcmtzaGVldCwgZWxlbS5HZXRBdHRyaWJ1dGUoIm5hbWUiKSwgdHJ1ZSk7CisJCQkJCQlpZiAobmFtZVdvcmtzaGVldCA9PSBudWxsKQorCQkJCQkJeworCQkJCQkJCW5hbWVkUmFuZ2UgPSBfbmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIHJhbmdlKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQluYW1lZFJhbmdlID0gbmFtZVdvcmtzaGVldC5OYW1lcy5BZGQoZWxlbS5HZXRBdHRyaWJ1dGUoIm5hbWUiKSwgcmFuZ2UpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZiAoZnVsbEFkZHJlc3MuU3RhcnRzV2l0aCgiXCIiKSkgLy9TdHJpbmcgdmFsdWUKKwkJCQkJCXsKKwkJCQkJCQluYW1lZFJhbmdlLk5hbWVWYWx1ZSA9IGZ1bGxBZGRyZXNzLlN1YnN0cmluZygxLGZ1bGxBZGRyZXNzLkxlbmd0aC0yKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKGRvdWJsZS5UcnlQYXJzZShmdWxsQWRkcmVzcywgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHZhbHVlKSkKKwkJCQkJCXsKKwkJCQkJCQluYW1lZFJhbmdlLk5hbWVWYWx1ZSA9IHZhbHVlOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzIHx8IGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuRXh0ZXJuYWxOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhciByID0gbmV3IEV4Y2VsQWRkcmVzcyhmdWxsQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgbmFtZWRSYW5nZS5OYW1lRm9ybXVsYSA9ICdcJ1snICsgci5fd2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRSYW5nZS5OYW1lRm9ybXVsYSA9IGZ1bGxBZGRyZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJRXhjZWxBZGRyZXNzIGFkZHIgPSBuZXcgRXhjZWxBZGRyZXNzKGZ1bGxBZGRyZXNzLCBfcGFja2FnZSwgbnVsbCk7CisJCQkJCQlpZiAobG9jYWxTaGVldElEID4gLTEpCisJCQkJCQl7CisJCQkJCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkZHIuX3dzKSkKKwkJCQkJCQl7CisJCQkJCQkJCW5hbWVkUmFuZ2UgPSBXb3Jrc2hlZXRzW2xvY2FsU2hlZXRJRCArIDFdLk5hbWVzLkFkZChlbGVtLkdldEF0dHJpYnV0ZSgibmFtZSIpLCBuZXcgRXhjZWxSYW5nZUJhc2UodGhpcywgV29ya3NoZWV0c1tsb2NhbFNoZWV0SUQgKyAxXSwgZnVsbEFkZHJlc3MsIGZhbHNlKSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW5hbWVkUmFuZ2UgPSBXb3Jrc2hlZXRzW2xvY2FsU2hlZXRJRCArIDFdLk5hbWVzLkFkZChlbGVtLkdldEF0dHJpYnV0ZSgibmFtZSIpLCBuZXcgRXhjZWxSYW5nZUJhc2UodGhpcywgV29ya3NoZWV0c1thZGRyLl93c10sIGZ1bGxBZGRyZXNzLCBmYWxzZSkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQl2YXIgd3MgPSBXb3Jrc2hlZXRzW2FkZHIuX3dzXTsKKwkJCQkJCQluYW1lZFJhbmdlID0gX25hbWVzLkFkZChlbGVtLkdldEF0dHJpYnV0ZSgibmFtZSIpLCBuZXcgRXhjZWxSYW5nZUJhc2UodGhpcywgd3MsIGZ1bGxBZGRyZXNzLCBmYWxzZSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChlbGVtLkdldEF0dHJpYnV0ZSgiaGlkZGVuIikgPT0gIjEiICYmIG5hbWVkUmFuZ2UgIT0gbnVsbCkgbmFtZWRSYW5nZS5Jc05hbWVIaWRkZW4gPSB0cnVlOworCQkJCQlpZighc3RyaW5nLklzTnVsbE9yRW1wdHkoZWxlbS5HZXRBdHRyaWJ1dGUoImNvbW1lbnQiKSkpIG5hbWVkUmFuZ2UuTmFtZUNvbW1lbnQ9ZWxlbS5HZXRBdHRyaWJ1dGUoImNvbW1lbnQiKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJI3JlZ2lvbiBXb3Jrc2hlZXRzCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIHdvcmtzaGVldHMgaW4gdGhlIHdvcmtib29rLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgRXhjZWxXb3Jrc2hlZXRzIFdvcmtzaGVldHMKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJaWYgKF93b3Jrc2hlZXRzID09IG51bGwpCisJCQkJeworCQkJCQl2YXIgc2hlZXRzTm9kZSA9IF93b3JrYm9va1htbC5Eb2N1bWVudEVsZW1lbnQuU2VsZWN0U2luZ2xlTm9kZSgiZDpzaGVldHMiLCBfbmFtZXNwYWNlTWFuYWdlcik7CisJCQkJCWlmIChzaGVldHNOb2RlID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXNoZWV0c05vZGUgPSBDcmVhdGVOb2RlKCJkOnNoZWV0cyIpOworCQkJCQl9CisJCQkJCQorCQkJCQlfd29ya3NoZWV0cyA9IG5ldyBFeGNlbFdvcmtzaGVldHMoX3BhY2thZ2UsIF9uYW1lc3BhY2VNYW5hZ2VyLCBzaGVldHNOb2RlKTsKKwkJCQl9CisJCQkJcmV0dXJuIChfd29ya3NoZWV0cyk7CisJCQl9CisJCX0KKwkJI2VuZHJlZ2lvbgorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBuYW1lZCByYW5nZXMKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gTmFtZXMKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJcmV0dXJuIF9uYW1lczsKKwkJCX0KKwkJfQorCQkjcmVnaW9uIFdvcmtib29rIFByb3BlcnRpZXMKKwkJZGVjaW1hbCBfc3RhbmRhcmRGb250V2lkdGggPSBkZWNpbWFsLk1pblZhbHVlOworICAgICAgICBzdHJpbmcgX2ZvbnRJRCA9ICIiOworICAgICAgICBpbnRlcm5hbCBGb3JtdWxhUGFyc2VyIEZvcm11bGFQYXJzZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9mb3JtdWxhUGFyc2VyID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZm9ybXVsYVBhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihfcGFja2FnZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2Zvcm11bGFQYXJzZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCSAgICBwdWJsaWMgRm9ybXVsYVBhcnNlck1hbmFnZXIgRm9ybXVsYVBhcnNlck1hbmFnZXIKKwkgICAgeworCSAgICAgICAgZ2V0CisJICAgICAgICB7CisJICAgICAgICAgICAgaWYgKF9wYXJzZXJNYW5hZ2VyID09IG51bGwpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBfcGFyc2VyTWFuYWdlciA9IG5ldyBGb3JtdWxhUGFyc2VyTWFuYWdlcihGb3JtdWxhUGFyc2VyKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgcmV0dXJuIF9wYXJzZXJNYW5hZ2VyOworCSAgICAgICAgfQorCSAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorCQkvLy8gTWF4IGZvbnQgd2lkdGggZm9yIHRoZSB3b3JrYm9vaworICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtZXRob2QgdXNlcyBHREkuIElmIHlvdSB1c2UgQXN1cmUgb3IgYW5vdGhlciBlbnZpcm9ubWVudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgR0RJLCB5b3UgaGF2ZSB0byBzZXQgdGhpcyB2YWx1ZSBtYW51YWxseSBpZiB5b3UgZG9uJ3QgdXNlIHRoZSBzdGFuZGFyZCBDYWxpYnJpIGZvbnQ8L3JlbWFya3M+CisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBkZWNpbWFsIE1heEZvbnRXaWR0aCAKKwkJeworCQkJZ2V0CisJCQl7CisgICAgICAgICAgICAgICAgaWYgKF9zdGFuZGFyZEZvbnRXaWR0aCA9PSBkZWNpbWFsLk1pblZhbHVlIHx8IF9mb250SUQgIT0gU3R5bGVzLkZvbnRzWzBdLklkKQorCQkJCXsKKwkJCQkJdmFyIGZvbnQgPSBTdHlsZXMuRm9udHNbMF07CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IG5ldyBGb250KGZvbnQuTmFtZSwgZm9udC5TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdGFuZGFyZEZvbnRXaWR0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBfZm9udElEID0gZm9udC5JZDsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSB0aGUgUHJlc2VudGFpb25Db3JlIERlcGVuZGVuY2V5LiBUaGlzIG1pZ2h0IGVmZmVjdCBjb21wb25lbnRzIHJ1bm5pbmcgdW5kZXIgQXp1cmUgbm90IGhhdmluZyBzdXBwb3J0IGZvciBHREkrCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVHlwZWZhY2UgdGYgPSBuZXcgVHlwZWZhY2UobmV3IFN5c3RlbS5XaW5kb3dzLk1lZGlhLkZvbnRGYW1pbHkoZm9udC5OYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb250Lkl0YWxpYykgPyBGb250U3R5bGVzLk5vcm1hbCA6IEZvbnRTdHlsZXMuSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb250LkJvbGQpID8gRm9udFdlaWdodHMuQm9sZCA6IEZvbnRXZWlnaHRzLk5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250U3RyZXRjaGVzLk5vcm1hbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvcihpbnQgaT0wO2k8MTA7aSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXIgZnQgPSBuZXcgU3lzdGVtLldpbmRvd3MuTWVkaWEuRm9ybWF0dGVkVGV4dCgiMDEyMzQ1Njc4OSIuU3Vic3RyaW5nKGksMSksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIFN5c3RlbS5XaW5kb3dzLkZsb3dEaXJlY3Rpb24uTGVmdFRvUmlnaHQsIHRmLCBmb250LlNpemUgKiAoOTZEIC8gNzJEKSwgbmV3IERyYXdpbmdCcnVzaCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHZhciB3aWR0aD0oaW50KU1hdGguUm91bmQoZnQuV2lkdGgsMCk7ICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpZih3aWR0aD5fc3RhbmRhcmRGb250V2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgX3N0YW5kYXJkRm9udFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgc2l6ZSA9IG5ldyBTeXN0ZW0uV2luZG93cy5TaXplIHsgV2lkdGggPSBmdC5XaWR0aEluY2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZSwgSGVpZ2h0ID0gZnQuSGVpZ2h0IH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdGFuZGFyZEZvbnRXaWR0aCA9IEdldFdpZHRoUGl4ZWxzKGYsIjEyMzQ1Njc4OTAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3RhbmRhcmRGb250V2lkdGggPD0gMCkgLy9ObyBHREk/CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YW5kYXJkRm9udFdpZHRoID0gKGludCkoZm9udC5TaXplICogKDJEIC8gM0QpKTsgLy9BcHJveC4gZm9yIENhbGlicmkuCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggICAvL0Vycm9yLCBzZXQgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3RhbmRhcmRGb250V2lkdGggPSAoaW50KShmb250LlNpemUgKiAoMkQgLyAzRCkpOyAvL0Fwcm94IGZvciBDYWxpYnJpLgorICAgICAgICAgICAgICAgICAgICB9CisJCQkJfQorCQkJCXJldHVybiBfc3RhbmRhcmRGb250V2lkdGg7CisJCQl9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RhbmRhcmRGb250V2lkdGggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKwkJfQorCisJICAgIGludGVybmFsIHN0YXRpYyBkZWNpbWFsIEdldFdpZHRoUGl4ZWxzKEZvbnQgZiwgc3RyaW5nIHMpCisJICAgIHsKKwkgICAgICAgIHZhciByZXQgPSAwTTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgYiA9IG5ldyBCaXRtYXAoMSwgMSkpCisJICAgICAgICB7CisJICAgICAgICAgICAgdXNpbmcgKEdyYXBoaWNzIGcgPSBHcmFwaGljcy5Gcm9tSW1hZ2UoYikpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBnLlBhZ2VVbml0ID0gR3JhcGhpY3NVbml0LlBpeGVsOworCisJICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5MZW5ndGg7IGkrKykKKwkgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzW2ldOworCSAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0KKwkgICAgICAgICAgICAgICAgICAgICAgICAoZGVjaW1hbCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5UcnVuY2F0ZSgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuTWVhc3VyZVN0cmluZyhuZXcgc3RyaW5nKGMsIDIpLCBmLCAxMDAwLCBTdHJpbmdGb3JtYXQuR2VuZXJpY1R5cG9ncmFwaGljKS5XaWR0aCAtCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLk1lYXN1cmVTdHJpbmcobmV3IHN0cmluZyhjLCAxKSwgZiwgMTAwMCwgU3RyaW5nRm9ybWF0LkdlbmVyaWNUeXBvZ3JhcGhpYykuV2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gcmV0KQorCSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHdpZHRoOworCSAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorCSAgICAgICAgcmV0dXJuIHJldDsKKwkgICAgfQorCisJICAgIEV4Y2VsUHJvdGVjdGlvbiBfcHJvdGVjdGlvbiA9IG51bGw7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEFjY2VzcyBwcm9wZXJ0aWVzIHRvIHByb3RlY3Qgb3IgdW5wcm90ZWN0IGEgd29ya2Jvb2sKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsUHJvdGVjdGlvbiBQcm90ZWN0aW9uCisJCXsKKwkJCWdldAorCQkJeworCQkJCWlmIChfcHJvdGVjdGlvbiA9PSBudWxsKQorCQkJCXsKKwkJCQkJX3Byb3RlY3Rpb24gPSBuZXcgRXhjZWxQcm90ZWN0aW9uKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIHRoaXMpOworCQkJCQlfcHJvdGVjdGlvbi5TY2hlbWFOb2RlT3JkZXIgPSBTY2hlbWFOb2RlT3JkZXI7CisJCQkJfQorCQkJCXJldHVybiBfcHJvdGVjdGlvbjsKKwkJCX0KKwkJfSAgICAgICAgCisJCUV4Y2VsV29ya2Jvb2tWaWV3IF92aWV3ID0gbnVsbDsKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQWNjZXNzIHRvIHdvcmtib29rIHZpZXcgcHJvcGVydGllcworCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgRXhjZWxXb3JrYm9va1ZpZXcgVmlldworCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlpZiAoX3ZpZXcgPT0gbnVsbCkKKwkJCQl7CisJCQkJCV92aWV3ID0gbmV3IEV4Y2VsV29ya2Jvb2tWaWV3KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIHRoaXMpOworCQkJCX0KKwkJCQlyZXR1cm4gX3ZpZXc7CisJCQl9CisJCX0KKyAgICAgICAgRXhjZWxWYmFQcm9qZWN0IF92YmEgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgVkJBIHByb2plY3QuCisgICAgICAgIC8vLyBOdWxsIGlmIG5vIHByb2plY3QgZXhpc3RzLgorICAgICAgICAvLy8gVXNlIFdvcmtib29rLkNyZWF0ZVZCQVByb2plY3QgdG8gY3JlYXRlIGEgbmV3IFZCQS1Qcm9qZWN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFZiYVByb2plY3QgVmJhUHJvamVjdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ZiYSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoRXhjZWxWYmFQcm9qZWN0LlBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ZiYSA9IG5ldyBFeGNlbFZiYVByb2plY3QodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF92YmE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYW4gZW1wdHkgVkJBIHByb2plY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVZCQVByb2plY3QoKQorICAgICAgICB7CisjaWYgIU1PTk8KKyAgICAgICAgICAgIGlmIChfdmJhICE9IG51bGwgfHwgX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoRXhjZWxWYmFQcm9qZWN0LlBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZCQSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzLiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgX3ZiYSA9IG5ldyBFeGNlbFZiYVByb2plY3QodGhpcyk7CisgICAgICAgICAgICBfdmJhLkNyZWF0ZSgpOworI2VuZGlmCisjaWYgTU9OTworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQ3JlYXRpbmcgYSBWQkEgcHJvamVjdCBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIE1vbm8uIik7CisjZW5kaWYKKwkJCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFVSSSB0byB0aGUgd29ya2Jvb2sgaW5zaWRlIHRoZSBwYWNrYWdlCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIFVyaSBXb3JrYm9va1VyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVVJJIHRvIHRoZSBzdHlsZXMgaW5zaWRlIHRoZSBwYWNrYWdlCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIFVyaSBTdHlsZXNVcmkgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisJCS8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVSSSB0byB0aGUgc2hhcmVkIHN0cmluZ3MgaW5zaWRlIHRoZSBwYWNrYWdlCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIFVyaSBTaGFyZWRTdHJpbmdzVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB3b3JrYm9vaydzIHBhcnQgd2l0aGluIHRoZSBwYWNrYWdlCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0IHsgcmV0dXJuIChfcGFja2FnZS5QYWNrYWdlLkdldFBhcnQoV29ya2Jvb2tVcmkpKTsgfSB9CisJCQorCQkjcmVnaW9uIFdvcmtib29rWG1sCisJCXByaXZhdGUgWG1sRG9jdW1lbnQgX3dvcmtib29rWG1sOworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkYXRhIHJlcHJlc2VudGluZyB0aGUgd29ya2Jvb2sgaW4gdGhlIHBhY2thZ2UuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBYbWxEb2N1bWVudCBXb3JrYm9va1htbAorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlpZiAoX3dvcmtib29rWG1sID09IG51bGwpCisJCQkJeworCQkJCQlDcmVhdGVXb3JrYm9va1htbChfbmFtZXNwYWNlTWFuYWdlcik7CisJCQkJfQorCQkJCXJldHVybiAoX3dvcmtib29rWG1sKTsKKwkJCX0KKwkJfQorICAgICAgICBjb25zdCBzdHJpbmcgY29kZU1vZHVsZU5hbWVQYXRoID0gImQ6d29ya2Jvb2tQci9AY29kZU5hbWUiOworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQ29kZU1vZHVsZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoY29kZU1vZHVsZU5hbWVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoY29kZU1vZHVsZU5hbWVQYXRoLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIENvZGVOYW1lQ2hhbmdlKHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29kZU1vZHVsZU5hbWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVkJBLkV4Y2VsVkJBTW9kdWxlIENvZGVNb2R1bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFZiYVByb2plY3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYmFQcm9qZWN0Lk1vZHVsZXNbQ29kZU1vZHVsZU5hbWVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgZGF0ZTE5MDRQYXRoID0gImQ6d29ya2Jvb2tQci9AZGF0ZTE5MDQiOworICAgICAgICBpbnRlcm5hbCBjb25zdCBkb3VibGUgZGF0ZTE5MDRPZmZzZXQgPSAzNjUuNSAqIDQ7ICAvLyBvZmZzZXQgdG8gZml4IDE5MDAgYW5kIDE5MDQgZGlmZmVyZW5jZXMsIDQgT0xFIHllYXJzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBkYXRlIHN5c3RlbXMgdXNlZCBieSBNaWNyb3NvZnQgRXhjZWwgY2FuIGJlIGJhc2VkIG9uIG9uZSBvZiB0d28gZGlmZmVyZW50IGRhdGVzLiBCeSBkZWZhdWx0LCBhIHNlcmlhbCBudW1iZXIgb2YgMSBpbiBNaWNyb3NvZnQgRXhjZWwgcmVwcmVzZW50cyBKYW51YXJ5IDEsIDE5MDAuCisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCBmb3IgdGhlIHNlcmlhbCBudW1iZXIgMSBjYW4gYmUgY2hhbmdlZCB0byByZXByZXNlbnQgSmFudWFyeSAyLCAxOTA0LgorICAgICAgICAvLy8gVGhpcyBvcHRpb24gd2FzIGluY2x1ZGVkIGluIE1pY3Jvc29mdCBFeGNlbCBmb3IgV2luZG93cyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBFeGNlbCBmb3IgdGhlIE1hY2ludG9zaCwgd2hpY2ggZGVmYXVsdHMgdG8gSmFudWFyeSAyLCAxOTA0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBEYXRlMTkwNAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woZGF0ZTE5MDRQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChEYXRlMTkwNCAhPSB2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIExpa2UgRXhjZWwgd2hlbiB0aGUgb3B0aW9uIGl0J3MgY2hhbmdlZCB1cGRhdGUgaXQgYWxsIGNlbGxzIHdpdGggRGF0ZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gV29ya3NoZWV0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5VcGRhdGVDZWxsc1dpdGhEYXRlMTkwNFNldHRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKGRhdGUxOTA0UGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAKKyAgICAgICAKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ3JlYXRlIG9yIHJlYWQgdGhlIFhNTCBmb3IgdGhlIHdvcmtib29rLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwcml2YXRlIHZvaWQgQ3JlYXRlV29ya2Jvb2tYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorCQl7CisJCQlpZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKFdvcmtib29rVXJpKSkKKwkJCQlfd29ya2Jvb2tYbWwgPSBfcGFja2FnZS5HZXRYbWxGcm9tVXJpKFdvcmtib29rVXJpKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBjcmVhdGUgYSBuZXcgd29ya2Jvb2sgcGFydCBhbmQgYWRkIHRvIHRoZSBwYWNrYWdlCisJCQkJUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnRXb3JrYm9vayA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydChXb3JrYm9va1VyaSwgQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKworCQkJCS8vIGNyZWF0ZSB0aGUgd29ya2Jvb2sKKwkJCQlfd29ya2Jvb2tYbWwgPSBuZXcgWG1sRG9jdW1lbnQobmFtZXNwYWNlTWFuYWdlci5OYW1lVGFibGUpOyAgICAgICAgICAgICAgICAKKwkJCQkKKwkJCQlfd29ya2Jvb2tYbWwuUHJlc2VydmVXaGl0ZXNwYWNlID0gRXhjZWxQYWNrYWdlLnByZXNlcnZlV2hpdGVzcGFjZTsKKwkJCQkvLyBjcmVhdGUgdGhlIHdvcmtib29rIGVsZW1lbnQKKwkJCQlYbWxFbGVtZW50IHdiRWxlbSA9IF93b3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJ3b3JrYm9vayIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKworCQkJCS8vIEFkZCB0aGUgcmVsYXRpb25zaGlwcyBuYW1lc3BhY2UKKwkJCQl3YkVsZW0uU2V0QXR0cmlidXRlKCJ4bWxuczpyIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOworCisJCQkJX3dvcmtib29rWG1sLkFwcGVuZENoaWxkKHdiRWxlbSk7CisKKwkJCQkvLyBjcmVhdGUgdGhlIGJvb2tWaWV3cyBhbmQgd29ya2Jvb2tzIGVsZW1lbnQKKwkJCQlYbWxFbGVtZW50IGJvb2tWaWV3cyA9IF93b3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJib29rVmlld3MiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisJCQkJd2JFbGVtLkFwcGVuZENoaWxkKGJvb2tWaWV3cyk7CisJCQkJWG1sRWxlbWVudCB3b3JrYm9va1ZpZXcgPSBfd29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgid29ya2Jvb2tWaWV3IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworCQkJCWJvb2tWaWV3cy5BcHBlbmRDaGlsZCh3b3JrYm9va1ZpZXcpOworCisJCQkJLy8gc2F2ZSBpdCB0byB0aGUgcGFja2FnZQorCQkJCVN0cmVhbVdyaXRlciBzdHJlYW0gPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnRXb3JrYm9vay5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisJCQkJX3dvcmtib29rWG1sLlNhdmUoc3RyZWFtKTsKKwkJCQkvL3N0cmVhbS5DbG9zZSgpOworCQkJCV9wYWNrYWdlLlBhY2thZ2UuRmx1c2goKTsKKwkJCX0KKwkJfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gU3R5bGVzWG1sCisJCXByaXZhdGUgWG1sRG9jdW1lbnQgX3N0eWxlc1htbDsKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZGF0YSByZXByZXNlbnRpbmcgdGhlIHN0eWxlcyBpbiB0aGUgcGFja2FnZS4gCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBYbWxEb2N1bWVudCBTdHlsZXNYbWwKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJaWYgKF9zdHlsZXNYbWwgPT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHMoU3R5bGVzVXJpKSkKKwkJCQkJCV9zdHlsZXNYbWwgPSBfcGFja2FnZS5HZXRYbWxGcm9tVXJpKFN0eWxlc1VyaSk7CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gY3JlYXRlIGEgbmV3IHN0eWxlcyBwYXJ0IGFuZCBhZGQgdG8gdGhlIHBhY2thZ2UKKwkJCQkJCVBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5DcmVhdGVQYXJ0KFN0eWxlc1VyaSwgQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zdHlsZXMreG1sIiwgX3BhY2thZ2UuQ29tcHJlc3Npb24pOworCQkJCQkJLy8gY3JlYXRlIHRoZSBzdHlsZSBzaGVldAorCisJCQkJCQlTdHJpbmdCdWlsZGVyIHhtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCI8c3R5bGVTaGVldCB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiPiIpOworCQkJCQkJeG1sLkFwcGVuZCgiPG51bUZtdHMgLz4iKTsKKwkJCQkJCXhtbC5BcHBlbmQoIjxmb250cyBjb3VudD1cIjFcIj48Zm9udD48c3ogdmFsPVwiMTFcIiAvPjxuYW1lIHZhbD1cIkNhbGlicmlcIiAvPjwvZm9udD48L2ZvbnRzPiIpOworCQkJCQkJeG1sLkFwcGVuZCgiPGZpbGxzPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT1cIm5vbmVcIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9XCJncmF5MTI1XCIgLz48L2ZpbGw+PC9maWxscz4iKTsKKwkJCQkJCXhtbC5BcHBlbmQoIjxib3JkZXJzPjxib3JkZXI+PGxlZnQgLz48cmlnaHQgLz48dG9wIC8+PGJvdHRvbSAvPjxkaWFnb25hbCAvPjwvYm9yZGVyPjwvYm9yZGVycz4iKTsKKwkJCQkJCXhtbC5BcHBlbmQoIjxjZWxsU3R5bGVYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiAvPjwvY2VsbFN0eWxlWGZzPiIpOworCQkJCQkJeG1sLkFwcGVuZCgiPGNlbGxYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiB4ZklkPVwiMFwiIC8+PC9jZWxsWGZzPiIpOworCQkJCQkJeG1sLkFwcGVuZCgiPGNlbGxTdHlsZXM+PGNlbGxTdHlsZSBuYW1lPVwiTm9ybWFsXCIgeGZJZD1cIjBcIiBidWlsdGluSWQ9XCIwXCIgLz48L2NlbGxTdHlsZXM+Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kKCI8ZHhmcyBjb3VudD1cIjBcIiAvPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZCgiPC9zdHlsZVNoZWV0PiIpOworCQkJCQkJCisJCQkJCQlfc3R5bGVzWG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisJCQkJCQlfc3R5bGVzWG1sLkxvYWRYbWwoeG1sLlRvU3RyaW5nKCkpOworCQkJCQkJCisJCQkJCQkvL1NhdmUgaXQgdG8gdGhlIHBhY2thZ2UKKwkJCQkJCVN0cmVhbVdyaXRlciBzdHJlYW0gPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworCisJCQkJCQlfc3R5bGVzWG1sLlNhdmUoc3RyZWFtKTsKKwkJCQkJCS8vc3RyZWFtLkNsb3NlKCk7CisJCQkJCQlfcGFja2FnZS5QYWNrYWdlLkZsdXNoKCk7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHdvcmtib29rIGFuZCB0aGUgbmV3IHNoYXJlZCBzdHJpbmdzIHBhcnQKKwkJCQkJCV9wYWNrYWdlLldvcmtib29rLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3JrYm9va1VyaSwgU3R5bGVzVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9zdHlsZXMiKTsKKwkJCQkJCV9wYWNrYWdlLlBhY2thZ2UuRmx1c2goKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gKF9zdHlsZXNYbWwpOworCQkJfQorCQkJc2V0CisJCQl7CisJCQkJX3N0eWxlc1htbCA9IHZhbHVlOworCQkJfQorCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFBhY2thZ2Ugc3R5bGVzIGNvbGxlY3Rpb24uIFVzZWQgaW50ZXJuYWxseSB0byBhY2Nlc3Mgc3R5bGUgZGF0YS4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsU3R5bGVzIFN0eWxlcworCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlpZiAoX3N0eWxlcyA9PSBudWxsKQorCQkJCXsKKwkJCQkJX3N0eWxlcyA9IG5ldyBFeGNlbFN0eWxlcyhOYW1lU3BhY2VNYW5hZ2VyLCBTdHlsZXNYbWwsIHRoaXMpOworCQkJCX0KKwkJCQlyZXR1cm4gX3N0eWxlczsKKwkJCX0KKwkJfQorCQkjZW5kcmVnaW9uCisKKwkJI3JlZ2lvbiBPZmZpY2UgRG9jdW1lbnQgUHJvcGVydGllcworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBUaGUgb2ZmaWNlIGRvY3VtZW50IHByb3BlcnRpZXMKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIE9mZmljZVByb3BlcnRpZXMgUHJvcGVydGllcworCQl7CisJCQlnZXQgCisJCQl7CisJCQkJaWYgKF9wcm9wZXJ0aWVzID09IG51bGwpCisJCQkJeworCQkJCQkvLyAgQ3JlYXRlIGEgTmFtZXNwYWNlTWFuYWdlciB0byBoYW5kbGUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCAKKwkJCQkJLy8gIGFuZCBjcmVhdGUgYSBwcmVmaXggZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZTogICAgICAgICAgICAgICAgICAgCisJCQkJCV9wcm9wZXJ0aWVzID0gbmV3IE9mZmljZVByb3BlcnRpZXMoX3BhY2thZ2UsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJCX0KKwkJCQlyZXR1cm4gX3Byb3BlcnRpZXM7CisJCQl9CisJCX0KKwkJI2VuZHJlZ2lvbgorCisJCSNyZWdpb24gQ2FsY01vZGUKKwkJcHJpdmF0ZSBzdHJpbmcgQ0FMQ19NT0RFX1BBVEggPSAiZDpjYWxjUHIvQGNhbGNNb2RlIjsKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ2FsY3VsYXRpb24gbW9kZSBmb3IgdGhlIHdvcmtib29rLgorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgRXhjZWxDYWxjTW9kZSBDYWxjTW9kZQorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlzdHJpbmcgY2FsY01vZGUgPSBHZXRYbWxOb2RlU3RyaW5nKENBTENfTU9ERV9QQVRIKTsKKwkJCQlzd2l0Y2ggKGNhbGNNb2RlKQorCQkJCXsKKwkJCQkJY2FzZSAiYXV0b05vVGFibGUiOgorCQkJCQkJcmV0dXJuIEV4Y2VsQ2FsY01vZGUuQXV0b21hdGljTm9UYWJsZTsKKwkJCQkJY2FzZSAibWFudWFsIjoKKwkJCQkJCXJldHVybiBFeGNlbENhbGNNb2RlLk1hbnVhbDsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiBFeGNlbENhbGNNb2RlLkF1dG9tYXRpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCX0KKwkJCX0KKwkJCXNldAorCQkJeworCQkJCXN3aXRjaCAodmFsdWUpCisJCQkJeworCQkJCQljYXNlIEV4Y2VsQ2FsY01vZGUuQXV0b21hdGljTm9UYWJsZToKKwkJCQkJCVNldFhtbE5vZGVTdHJpbmcoQ0FMQ19NT0RFX1BBVEgsICJhdXRvTm9UYWJsZSIpIDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEV4Y2VsQ2FsY01vZGUuTWFudWFsOgorCQkJCQkJU2V0WG1sTm9kZVN0cmluZyhDQUxDX01PREVfUEFUSCwgIm1hbnVhbCIpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlTZXRYbWxOb2RlU3RyaW5nKENBTENfTU9ERV9QQVRILCAiYXV0byIpOworCQkJCQkJYnJlYWs7CisKKwkJCQl9CisJCQl9CisJCQkjZW5kcmVnaW9uCisJCX0KKworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBGVUxMX0NBTENfT05fTE9BRF9QQVRIID0gImQ6Y2FsY1ByL0BmdWxsQ2FsY09uTG9hZCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNob3VsZCBFeGNlbCBkbyBhIGZ1bGwgY2FsY3VsYXRpb24gYWZ0ZXIgdGhlIHdvcmtib29rIGhhcyBiZWVuIGxvYWRlZD8KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIHRydWUgZm9yIGJvdGggbmV3IHdvcmtib29rcyBhbmQgbG9hZGVkIHRlbXBsYXRlcyhvbiBsb2FkKS4gSWYgdGhpcyBpcyBub3QgdGhlIHdhbnRlZCBiZWhhdmlvciBzZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZS48L3JlbWFya3M+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEZ1bGxDYWxjT25Mb2FkCisJICAgIHsKKwkgICAgICAgIGdldAorCSAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChGVUxMX0NBTENfT05fTE9BRF9QQVRIKTsgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHNldAorCSAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKEZVTExfQ0FMQ19PTl9MT0FEX1BBVEgsIHZhbHVlKTsKKwkgICAgICAgIH0KKwkgICAgfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gV29ya2Jvb2sgUHJpdmF0ZSBNZXRob2RzCisJCQkKKwkJI3JlZ2lvbiBTYXZlIC8vIFdvcmtib29rIFNhdmUKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gU2F2ZXMgdGhlIHdvcmtib29rIGFuZCBhbGwgaXRzIGNvbXBvbmVudHMgdG8gdGhlIHBhY2thZ2UuCisJCS8vLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkhCisJCS8vLyA8L3N1bW1hcnk+CisJCWludGVybmFsIHZvaWQgU2F2ZSgpICAvLyBXb3JrYm9vayBTYXZlCisJCXsKKwkJCWlmIChXb3Jrc2hlZXRzLkNvdW50ID09IDApCisJCQkJdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSB3b3JrYm9vayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHdvcmtzaGVldCIpOworCisJCQlEZWxldGVDYWxjQ2hhaW4oKTsKKworICAgICAgICAgICAgaWYgKF92YmEgPT0gbnVsbCAmJiAhX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoRXhjZWxWYmFQcm9qZWN0LlBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoUGFydC5Db250ZW50VHlwZSAhPSBFeGNlbFBhY2thZ2UuY29udGVudFR5cGVXb3JrYm9va0RlZmF1bHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQYXJ0LkNvbnRlbnRUeXBlID0gRXhjZWxQYWNrYWdlLmNvbnRlbnRUeXBlV29ya2Jvb2tEZWZhdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoUGFydC5Db250ZW50VHlwZSAhPSBFeGNlbFBhY2thZ2UuY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBhcnQuQ29udGVudFR5cGUgPSBFeGNlbFBhY2thZ2UuY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIFVwZGF0ZURlZmluZWROYW1lc1htbCgpOworCisJCQkvLyBzYXZlIHRoZSB3b3JrYm9vaworCQkJaWYgKF93b3JrYm9va1htbCAhPSBudWxsKQorCQkJeworCQkJCV9wYWNrYWdlLlNhdmVQYXJ0KFdvcmtib29rVXJpLCBfd29ya2Jvb2tYbWwpOworCQkJfQorCisJCQkvLyBzYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JrYm9vaworCQkJaWYgKF9wcm9wZXJ0aWVzICE9IG51bGwpCisJCQl7CisJCQkJX3Byb3BlcnRpZXMuU2F2ZSgpOworCQkJfQorCisJCQkvLyBzYXZlIHRoZSBzdHlsZSBzaGVldAorCQkJU3R5bGVzLlVwZGF0ZVhtbCgpOworCQkJX3BhY2thZ2UuU2F2ZVBhcnQoU3R5bGVzVXJpLCBfc3R5bGVzWG1sKTsKKworCQkJLy8gc2F2ZSBhbGwgdGhlIG9wZW4gd29ya3NoZWV0cworCQkJdmFyIGlzUHJvdGVjdGVkID0gUHJvdGVjdGlvbi5Mb2NrV2luZG93cyB8fCBQcm90ZWN0aW9uLkxvY2tTdHJ1Y3R1cmU7CisJCQlmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgaW4gV29ya3NoZWV0cykKKwkJCXsKKwkJCQlpZiAoaXNQcm90ZWN0ZWQgJiYgUHJvdGVjdGlvbi5Mb2NrV2luZG93cykKKwkJCQl7CisJCQkJCXdvcmtzaGVldC5WaWV3LldpbmRvd1Byb3RlY3Rpb24gPSB0cnVlOworCQkJCX0KKwkJCQl3b3Jrc2hlZXQuU2F2ZSgpOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5QYXJ0LlNhdmVIYW5kbGVyID0gd29ya3NoZWV0LlNhdmVIYW5kbGVyOworCQkJfQorCisgICAgICAgICAgICB2YXIgcGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydChTaGFyZWRTdHJpbmdzVXJpLCBFeGNlbFBhY2thZ2UuY29udGVudFR5cGVTaGFyZWRTdHJpbmcsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgIHBhcnQuU2F2ZUhhbmRsZXIgPSBTYXZlU2hhcmVkU3RyaW5nSGFuZGxlcjsKKyAgICAgICAgICAgIFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3JrYm9va1VyaSwgU2hhcmVkU3RyaW5nc1VyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvc2hhcmVkU3RyaW5ncyIpOworICAgICAgICAgICAgLy9VcGRhdGVTaGFyZWRTdHJpbmdzWG1sKCk7CisJCQkKKwkJCS8vIERhdGEgdmFsaWRhdGlvbgorCQkJVmFsaWRhdGVEYXRhVmFsaWRhdGlvbnMoKTsKKworICAgICAgICAgICAgLy9WQkEKKyAgICAgICAgICAgIGlmIChfdmJhIT1udWxsKQorICAgICAgICAgICAgeworI2lmICFNT05PCisgICAgICAgICAgICAgICAgVmJhUHJvamVjdC5TYXZlKCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworCQl9CisJCXByaXZhdGUgdm9pZCBEZWxldGVDYWxjQ2hhaW4oKQorCQl7CisJCQkvL1JlbW92ZSB0aGUgY2FsYyBjaGFpbiBpZiBpdCBleGlzdHMuCisJCQlVcmkgdXJpQ2FsY0NoYWluID0gbmV3IFVyaSgiL3hsL2NhbGNDaGFpbi54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKwkJCWlmIChfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHModXJpQ2FsY0NoYWluKSkKKwkJCXsKKwkJCQlVcmkgY2FsY0NoYWluID0gbmV3IFVyaSgiY2FsY0NoYWluLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOworCQkJCWZvcmVhY2ggKHZhciByZWxhdGlvbnNoaXAgaW4gX3BhY2thZ2UuV29ya2Jvb2suUGFydC5HZXRSZWxhdGlvbnNoaXBzKCkpCisJCQkJeworCQkJCQlpZiAocmVsYXRpb25zaGlwLlRhcmdldFVyaSA9PSBjYWxjQ2hhaW4pCisJCQkJCXsKKwkJCQkJCV9wYWNrYWdlLldvcmtib29rLlBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcC5JZCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBkZWxldGUgdGhlIGNhbGNDaGFpbiBwYXJ0CisJCQkJX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KHVyaUNhbGNDaGFpbik7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgVmFsaWRhdGVEYXRhVmFsaWRhdGlvbnMoKQorCQl7CisJCQlmb3JlYWNoICh2YXIgc2hlZXQgaW4gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cykKKwkJCXsKKyAgICAgICAgICAgICAgICBpZiAoIShzaGVldCBpcyBFeGNlbENoYXJ0c2hlZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXQuRGF0YVZhbGlkYXRpb25zLlZhbGlkYXRlQWxsKCk7CisgICAgICAgICAgICAgICAgfQorCQkJfQorCQl9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNhdmVTaGFyZWRTdHJpbmdIYW5kbGVyKFppcE91dHB1dFN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTGV2ZWwgY29tcHJlc3Npb25MZXZlbCwgc3RyaW5nIGZpbGVOYW1lKQorCQl7CisgICAgICAgICAgICAvL1BhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBzdHJpbmdQYXJ0OworICAgICAgICAgICAgLy9pZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKFNoYXJlZFN0cmluZ3NVcmkpKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBzdHJpbmdQYXJ0PV9wYWNrYWdlLlBhY2thZ2UuR2V0UGFydChTaGFyZWRTdHJpbmdzVXJpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHN0cmluZ1BhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoU2hhcmVkU3RyaW5nc1VyaSwgQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbCIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgIC8vUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKFdvcmtib29rVXJpLCBTaGFyZWRTdHJpbmdzVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9zaGFyZWRTdHJpbmdzIik7CisgICAgICAgICAgICAvL30KKworCQkJLy9TdHJlYW1Xcml0ZXIgc3cgPSBuZXcgU3RyZWFtV3JpdGVyKHN0cmluZ1BhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgLy9Jbml0IFppcAorICAgICAgICAgICAgc3RyZWFtLkNvbXByZXNzaW9uTGV2ZWwgPSAoT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsKWNvbXByZXNzaW9uTGV2ZWw7CisgICAgICAgICAgICBzdHJlYW0uUHV0TmV4dEVudHJ5KGZpbGVOYW1lKTsKKworICAgICAgICAgICAgdmFyIGNhY2hlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBzdyA9IG5ldyBTdHJlYW1Xcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCIgPz48c3N0IHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgY291bnQ9XCJ7MH1cIiB1bmlxdWVDb3VudD1cInswfVwiPiIsIF9zaGFyZWRTdHJpbmdzLkNvdW50KTsKKwkJCWZvcmVhY2ggKHN0cmluZyB0IGluIF9zaGFyZWRTdHJpbmdzLktleXMpCisJCQl7CisKKwkJCQlTaGFyZWRTdHJpbmdJdGVtIHNzaSA9IF9zaGFyZWRTdHJpbmdzW3RdOworCQkJCWlmIChzc2kuaXNSaWNoVGV4dCkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPHNpPiIpOworICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VXRpbC5FeGNlbEVuY29kZVN0cmluZyhjYWNoZSwgdCk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPC9zaT4iKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuTGVuZ3RoID4gMCAmJiAodFswXSA9PSAnICcgfHwgdFt0Lkxlbmd0aCAtIDFdID09ICcgJyB8fCB0LkNvbnRhaW5zKCIgICIpIHx8IHQuQ29udGFpbnMoIlx0IikgfHwgdC5Db250YWlucygiXG4iKSB8fCB0LkNvbnRhaW5zKCJcbiIpKSkgICAvL0ZpeGVzIGlzc3VlIDE0ODQ5CisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPHNpPjx0IHhtbDpzcGFjZT1cInByZXNlcnZlXCI+Iik7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoIjxzaT48dD4iKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VXRpbC5FeGNlbEVuY29kZVN0cmluZyhjYWNoZSwgQ29udmVydFV0aWwuRXhjZWxFc2NhcGVTdHJpbmcodCkpOworICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoIjwvdD48L3NpPiIpOworCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUuTGVuZ3RoID4gMHg2MDAwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZShjYWNoZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKwkJCX0KKyAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPC9zc3Q+Iik7CisgICAgICAgICAgICBzdy5Xcml0ZShjYWNoZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHN3LkZsdXNoKCk7CisgICAgICAgICAgICBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya2Jvb2tVcmksIFNoYXJlZFN0cmluZ3NVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3NoYXJlZFN0cmluZ3MiKTsKKwkJfQorCQlwcml2YXRlIHZvaWQgVXBkYXRlRGVmaW5lZE5hbWVzWG1sKCkKKwkJeworCQkJdHJ5CisJCQl7CisgICAgICAgICAgICAgICAgWG1sTm9kZSB0b3AgPSBXb3JrYm9va1htbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6ZGVmaW5lZE5hbWVzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisJCQkJaWYgKCFFeGlzdHNOYW1lcygpKQorCQkJCXsKKwkJCQkJaWYgKHRvcCAhPSBudWxsKSBUb3BOb2RlLlJlbW92ZUNoaWxkKHRvcCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKHRvcCA9PSBudWxsKQorCQkJCQl7CisJCQkJCQlDcmVhdGVOb2RlKCJkOmRlZmluZWROYW1lcyIpOworCQkJCQkJdG9wID0gV29ya2Jvb2tYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmRlZmluZWROYW1lcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdG9wLlJlbW92ZUFsbCgpOworCQkJCQl9CisJCQkJCWZvcmVhY2ggKEV4Y2VsTmFtZWRSYW5nZSBuYW1lIGluIF9uYW1lcykKKwkJCQkJeworCisJCQkJCQlYbWxFbGVtZW50IGVsZW0gPSBXb3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJkZWZpbmVkTmFtZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKwkJCQkJCXRvcC5BcHBlbmRDaGlsZChlbGVtKTsKKwkJCQkJCWVsZW0uU2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZS5OYW1lKTsKKwkJCQkJCWlmIChuYW1lLklzTmFtZUhpZGRlbikgZWxlbS5TZXRBdHRyaWJ1dGUoImhpZGRlbiIsICIxIik7CisJCQkJCQlpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUuTmFtZUNvbW1lbnQpKSBlbGVtLlNldEF0dHJpYnV0ZSgiY29tbWVudCIsIG5hbWUuTmFtZUNvbW1lbnQpOworCQkJCQkJU2V0TmFtZUVsZW1lbnQobmFtZSwgZWxlbSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgd3MgaW4gX3dvcmtzaGVldHMpCisJCQkJeworICAgICAgICAgICAgICAgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChFeGNlbE5hbWVkUmFuZ2UgbmFtZSBpbiB3cy5OYW1lcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW0gPSBXb3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJkZWZpbmVkTmFtZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AuQXBwZW5kQ2hpbGQoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lLk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJsb2NhbFNoZWV0SWQiLCBuYW1lLkxvY2FsU2hlZXRJZC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5Jc05hbWVIaWRkZW4pIGVsZW0uU2V0QXR0cmlidXRlKCJoaWRkZW4iLCAiMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZS5OYW1lQ29tbWVudCkpIGVsZW0uU2V0QXR0cmlidXRlKCJjb21tZW50IiwgbmFtZS5OYW1lQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TmFtZUVsZW1lbnQobmFtZSwgZWxlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQl9CisJCQl9CisJCQljYXRjaCAoRXhjZXB0aW9uIGV4KQorCQkJeworCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkludGVybmFsIGVycm9yIHVwZGF0aW5nIG5hbWVkIHJhbmdlcyAiLGV4KTsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBTZXROYW1lRWxlbWVudChFeGNlbE5hbWVkUmFuZ2UgbmFtZSwgWG1sRWxlbWVudCBlbGVtKQorCQl7CisJCQlpZiAobmFtZS5Jc05hbWUpCisJCQl7CisJCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUuTmFtZUZvcm11bGEpKQorCQkJCXsKKwkJCQkJaWYgKChuYW1lLk5hbWVWYWx1ZS5HZXRUeXBlKCkuSXNQcmltaXRpdmUgfHwgbmFtZS5OYW1lVmFsdWUgaXMgZG91YmxlIHx8IG5hbWUuTmFtZVZhbHVlIGlzIGRlY2ltYWwpKQorCQkJCQl7CisJCQkJCQllbGVtLklubmVyVGV4dCA9IENvbnZlcnQuVG9Eb3VibGUobmFtZS5OYW1lVmFsdWUsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlRvU3RyaW5nKCJSMTUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsgCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAobmFtZS5OYW1lVmFsdWUgaXMgRGF0ZVRpbWUpCisJCQkJCXsKKwkJCQkJCWVsZW0uSW5uZXJUZXh0ID0gKChEYXRlVGltZSluYW1lLk5hbWVWYWx1ZSkuVG9PQURhdGUoKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWVsZW0uSW5uZXJUZXh0ID0gIlwiIiArIG5hbWUuTmFtZVZhbHVlLlRvU3RyaW5nKCkgKyAiXCIiOworCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZWxlbS5Jbm5lclRleHQgPSBuYW1lLk5hbWVGb3JtdWxhOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICBlbGVtLklubmVyVGV4dCA9IG5hbWUuRnVsbEFkZHJlc3NBYnNvbHV0ZTsKKwkJCX0KKwkJfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJcyB0aGVpciBhbnkgbmFtZXMgaW4gdGhlIHdvcmtib29rIG9yIGluIHRoZSBzaGVldHMuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cmV0dXJucz4/PC9yZXR1cm5zPgorCQlwcml2YXRlIGJvb2wgRXhpc3RzTmFtZXMoKQorCQl7CisJCQlpZiAoX25hbWVzLkNvdW50ID09IDApCisJCQl7CisJCQkJZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgd3MgaW4gV29ya3NoZWV0cykKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZih3cy5OYW1lcy5Db3VudD4wKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfSAgICAgICAgCisJCSNlbmRyZWdpb24KKworCQkjZW5kcmVnaW9uCisJCWludGVybmFsIGJvb2wgRXhpc3RzVGFibGVOYW1lKHN0cmluZyBOYW1lKQorCQl7CisJCQlmb3JlYWNoICh2YXIgd3MgaW4gV29ya3NoZWV0cykKKwkJCXsKKwkJCQlpZih3cy5UYWJsZXMuX3RhYmxlTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisJCQkJeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaW50ZXJuYWwgYm9vbCBFeGlzdHNQaXZvdFRhYmxlTmFtZShzdHJpbmcgTmFtZSkKKwkJeworCQkJZm9yZWFjaCAodmFyIHdzIGluIFdvcmtzaGVldHMpCisJCQl7CisJCQkJaWYgKHdzLlBpdm90VGFibGVzLl9waXZvdFRhYmxlTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisJCQkJeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaW50ZXJuYWwgdm9pZCBBZGRQaXZvdFRhYmxlKHN0cmluZyBjYWNoZUlELCBVcmkgZGVmVXJpKQorCQl7CisJCQlDcmVhdGVOb2RlKCJkOnBpdm90Q2FjaGVzIik7CisKKwkJCVhtbEVsZW1lbnQgaXRlbSA9IFdvcmtib29rWG1sLkNyZWF0ZUVsZW1lbnQoInBpdm90Q2FjaGUiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisJCQlpdGVtLlNldEF0dHJpYnV0ZSgiY2FjaGVJZCIsIGNhY2hlSUQpOworCQkJdmFyIHJlbCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShXb3JrYm9va1VyaSwgZGVmVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdENhY2hlRGVmaW5pdGlvbiIpOworCQkJaXRlbS5TZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7CisKKwkJCXZhciBwaXZvdENhY2hlcyA9IFdvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpwaXZvdENhY2hlcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJcGl2b3RDYWNoZXMuQXBwZW5kQ2hpbGQoaXRlbSk7CisJCX0KKwkJaW50ZXJuYWwgTGlzdDxzdHJpbmc+IF9leHRlcm5hbFJlZmVyZW5jZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgIC8vaW50ZXJuYWwgYm9vbCBfaXNDYWxjdWxhdGVkPWZhbHNlOworCQlpbnRlcm5hbCB2b2lkIEdldEV4dGVybmFsUmVmZXJlbmNlcygpCisJCXsKKwkJCVhtbE5vZGVMaXN0IG5sID0gV29ya2Jvb2tYbWwuU2VsZWN0Tm9kZXMoIi8vZDpleHRlcm5hbFJlZmVyZW5jZXMvZDpleHRlcm5hbFJlZmVyZW5jZSIsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJaWYgKG5sICE9IG51bGwpCisJCQl7CisJCQkJZm9yZWFjaCAoWG1sRWxlbWVudCBlbGVtIGluIG5sKQorCQkJCXsKKwkJCQkJc3RyaW5nIHJJRCA9IGVsZW0uR2V0QXR0cmlidXRlKCJyOmlkIik7CisJCQkJCXZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcChySUQpOworCQkJCQl2YXIgcGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuR2V0UGFydChVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSkpOworCQkJCQlYbWxEb2N1bWVudCB4bWxFeHRSZWYgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9hZFhtbFNhZmUoeG1sRXh0UmVmLCBwYXJ0LkdldFN0cmVhbSgpKTsgCisKKwkJCQkJWG1sRWxlbWVudCBib29rPXhtbEV4dFJlZi5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6ZXh0ZXJuYWxCb29rIiwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKwkJCQkJaWYoYm9vayE9bnVsbCkKKwkJCQkJeworCQkJCQkJc3RyaW5nIHJJZF9FeHRSZWYgPSBib29rLkdldEF0dHJpYnV0ZSgicjppZCIpOworCQkJCQkJdmFyIHJlbF9leHRSZWYgPSBwYXJ0LkdldFJlbGF0aW9uc2hpcChySWRfRXh0UmVmKTsKKwkJCQkJCWlmIChyZWxfZXh0UmVmICE9IG51bGwpCisJCQkJCQl7CisJCQkJCQkJX2V4dGVybmFsUmVmZXJlbmNlcy5BZGQocmVsX2V4dFJlZi5UYXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcpOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zaGFyZWRTdHJpbmdzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NoYXJlZFN0cmluZ3MuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBfc2hhcmVkU3RyaW5ncyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX3NoYXJlZFN0cmluZ3NMaXN0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NoYXJlZFN0cmluZ3NMaXN0LkNsZWFyKCk7CisgICAgICAgICAgICAgICAgX3NoYXJlZFN0cmluZ3NMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF92YmEgPSBudWxsOworICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXRzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dvcmtzaGVldHMuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9wYWNrYWdlID0gbnVsbDsKKyAgICAgICAgICAgIF9wcm9wZXJ0aWVzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChfZm9ybXVsYVBhcnNlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9mb3JtdWxhUGFyc2VyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfZm9ybXVsYVBhcnNlciA9IG51bGw7CisgICAgICAgICAgICB9ICAgCisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIFJlYWRBbGxUYWJsZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX25leHRUYWJsZUlEID4gMCkgcmV0dXJuOworICAgICAgICAgICAgX25leHRUYWJsZUlEID0gMTsKKyAgICAgICAgICAgIF9uZXh0UGl2b3RUYWJsZUlEID0gMTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBXb3Jrc2hlZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpIC8vRml4ZXMgMTUyNzMuIENoYXJ0c2hlZXRzIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiB3cy5UYWJsZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YmwuSWQgPj0gX25leHRUYWJsZUlEKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uZXh0VGFibGVJRCA9IHRibC5JZCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHB0IGluIHdzLlBpdm90VGFibGVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHQuQ2FjaGVJRCA+PSBfbmV4dFBpdm90VGFibGVJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmV4dFBpdm90VGFibGVJRCA9IHB0LkNhY2hlSUQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvLyBlbmQgV29ya2Jvb2sKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFdvcmtib29rVmlldy5jcyBiL0VQUGx1cy9FeGNlbFdvcmtib29rVmlldy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWExNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsV29ya2Jvb2tWaWV3LmNzCkBAIC0wLDAgKzEsMjEyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAyMDExLTExLTAyCisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWNjZXNzIHRvIHdvcmtib29rIHZpZXcgcHJvcGVydGllcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsV29ya2Jvb2tWaWV3IDogWG1sSGVscGVyCisgICAgeworICAgICAgICAjcmVnaW9uIEV4Y2VsV29ya3NoZWV0VmlldyBDb25zdHJ1Y3RvcgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IEV4Y2VsV29ya2Jvb2tWaWV3IHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIAorICAgICAgICAvLy8gdmlldyBzdGF0ZXMgb2YgdGhlIHdvcmtzaGVldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJucyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndiIj48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtib29rVmlldyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIEV4Y2VsV29ya2Jvb2sgd2IpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIG5vZGUpCisJCXsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IHdiLlNjaGVtYU5vZGVPcmRlcjsKKwkJfQorCQkjZW5kcmVnaW9uCisgICAgICAgIGNvbnN0IHN0cmluZyBMRUZUX1BBVEg9ImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0B4V2luZG93IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuIEluIHR3aXBzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IExlZnQKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KExFRlRfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKExFRlRfUEFUSCx2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVE9QX1BBVEg9ImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0B5V2luZG93IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuIEluIHR3aXBzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFRvcAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoVE9QX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUT1BfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFdJRFRIX1BBVEg9ImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0B3aW5kb3dXaWR0aCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdpZHRoIG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuIEluIHR3aXBzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFdpZHRoCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChXSURUSF9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoV0lEVEhfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIEhFSUdIVF9QQVRIPSJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9Ad2luZG93SGVpZ2h0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSGVpZ2h0IG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuIEluIHR3aXBzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IEhlaWdodAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoSEVJR0hUX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhIRUlHSFRfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIE1JTklNSVpFRF9QQVRIPSJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9AbWluaW1pemVkIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdHJ1ZSB0aGUgdGhlIHdvcmtib29rIHdpbmRvdyBpcyBtaW5pbWl6ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIE1pbmltaXplZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woTUlOSU1JWkVEX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhNSU5JTUlaRURfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNIT1dWRVJUSUNBTFNDUk9MTF9QQVRIID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BzaG93VmVydGljYWxTY3JvbGwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaG93IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd1ZlcnRpY2FsU2Nyb2xsQmFyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChTSE9XVkVSVElDQUxTQ1JPTExfUEFUSCx0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKFNIT1dWRVJUSUNBTFNDUk9MTF9QQVRILCB2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNIT1dIT1JJWk9OVEFMU0NSX1BBVEggPSAiZDpib29rVmlld3MvZDp3b3JrYm9va1ZpZXcvQHNob3dIb3Jpem9udGFsU2Nyb2xsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvdyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd0hvcml6b250YWxTY3JvbGxCYXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKFNIT1dIT1JJWk9OVEFMU0NSX1BBVEgsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woU0hPV0hPUklaT05UQUxTQ1JfUEFUSCwgdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBTSE9XU0hFRVRUQUJTX1BBVEggPSAiZDpib29rVmlld3MvZDp3b3JrYm9va1ZpZXcvQHNob3dTaGVldFRhYnMiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaG93IHRoZSBzaGVldCB0YWJzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dTaGVldFRhYnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKFNIT1dTSEVFVFRBQlNfUEFUSCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChTSE9XU0hFRVRUQUJTX1BBVEgsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXQgdGhlIHdpbmRvdyBwb3NpdGlvbiBpbiB0d2lwcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlZnQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9wIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndpZHRoIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlaWdodCI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0V2luZG93U2l6ZShpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBMZWZ0ID0gbGVmdDsKKyAgICAgICAgICAgIFRvcCA9IHRvcDsKKyAgICAgICAgICAgIFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgQUNUSVZFVEFCX1BBVEggPSAiZDpib29rVmlld3MvZDp3b3JrYm9va1ZpZXcvQGFjdGl2ZVRhYiI7CisgICAgICAgIHB1YmxpYyBpbnQgQWN0aXZlVGFiIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdj1HZXRYbWxOb2RlSW50KEFDVElWRVRBQl9QQVRIKTsKKyAgICAgICAgICAgICAgICBpZiAodiA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQUNUSVZFVEFCX1BBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxXb3Jrc2hlZXQuY3MgYi9FUFBsdXMvRXhjZWxXb3Jrc2hlZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ZDE2MwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9FeGNlbFdvcmtzaGVldC5jcwpAQCAtMCwwICsxLDQxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMS0xMS0wMgorICogSmFuIEvkbGxtYW4gICAgICAgICAgVG90YWwgcmV3cml0ZSAgICAgICAgICAgICAgIDIwMTAtMDMtMDEKKyAqIEphbiBL5GxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbmZpZ3VyYXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHk7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKK3VzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgSW9uaWMuWmlwOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdvcmtzaGVldCBoaWRkZW4gZW51bWVyYXRpb24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVXb3JrU2hlZXRIaWRkZW4KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3Jrc2hlZXQgaXMgdmlzaWJsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBWaXNpYmxlLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgd29ya3NoZWV0IGlzIGhpZGRlbiBidXQgY2FuIGJlIHNob3duIGJ5IHRoZSB1c2VyIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSGlkZGVuLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgd29ya3NoZWV0IGlzIGhpZGRlbiBhbmQgY2Fubm90IGJlIHNob3duIGJ5IHRoZSB1c2VyIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVmVyeUhpZGRlbgorICAgIH0KKyAgICBbRmxhZ3NdCisgICAgaW50ZXJuYWwgZW51bSBDZWxsRmxhZ3MKKyAgICB7CisgICAgICAgIC8vTWVyZ2VkID0gMHgxLAorICAgICAgICBSaWNoVGV4dCA9IDB4MiwKKyAgICAgICAgU2hhcmVkRm9ybXVsYSA9IDB4NCwKKyAgICAgICAgQXJyYXlGb3JtdWxhID0gMHg4CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwcmVzZW50cyBhbiBFeGNlbCBDaGFydHNoZWV0IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gaXRzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0c2hlZXQgOiBFeGNlbFdvcmtzaGVldAorICAgIHsKKyAgICAgICAgLy9FeGNlbERyYXdpbmdzIGRyYXdzOworICAgICAgICBwdWJsaWMgRXhjZWxDaGFydHNoZWV0KFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIEV4Y2VsUGFja2FnZSBwY2ssIHN0cmluZyByZWxJRCwgVXJpIHVyaVdvcmtzaGVldCwgc3RyaW5nIHNoZWV0TmFtZSwgaW50IHNoZWV0SUQsIGludCBwb3NpdGlvbklELCBlV29ya1NoZWV0SGlkZGVuIGhpZGRlbiwgZUNoYXJ0VHlwZSBjaGFydFR5cGUpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIHBjaywgcmVsSUQsIHVyaVdvcmtzaGVldCwgc2hlZXROYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBoaWRkZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuRHJhd2luZ3MuQWRkQ2hhcnQoIkNoYXJ0IDEiLCBjaGFydFR5cGUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0c2hlZXQoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgRXhjZWxQYWNrYWdlIHBjaywgc3RyaW5nIHJlbElELCBVcmkgdXJpV29ya3NoZWV0LCBzdHJpbmcgc2hlZXROYW1lLCBpbnQgc2hlZXRJRCwgaW50IHBvc2l0aW9uSUQsIGVXb3JrU2hlZXRIaWRkZW4gaGlkZGVuKSA6CisgICAgICAgICAgICBiYXNlKG5zLCBwY2ssIHJlbElELCB1cmlXb3Jrc2hlZXQsIHNoZWV0TmFtZSwgc2hlZXRJRCwgcG9zaXRpb25JRCwgaGlkZGVuKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnQgQ2hhcnQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoRXhjZWxDaGFydClEcmF3aW5nc1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisJLy8vIFJlcHJlc2VudHMgYW4gRXhjZWwgd29ya3NoZWV0IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gaXRzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMKKwkvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFdvcmtzaGVldCA6IFhtbEhlbHBlciwgSUVxdWFsaXR5Q29tcGFyZXI8RXhjZWxXb3Jrc2hlZXQ+LCBJRGlzcG9zYWJsZQorCXsKKyAgICAgICAgaW50ZXJuYWwgY2xhc3MgRm9ybXVsYXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEZvcm11bGFzKElTb3VyY2VDb2RlVG9rZW5pemVyIHRva2VuaXplcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdG9rZW5pemVyID0gdG9rZW5pemVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIElTb3VyY2VDb2RlVG9rZW5pemVyIF90b2tlbml6ZXI7CisgICAgICAgICAgICBpbnRlcm5hbCBpbnQgSW5kZXggeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEFkZHJlc3MgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgYm9vbCBJc0FycmF5IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IFN0YXJ0Um93IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgU3RhcnRDb2wgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwcml2YXRlIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbnMge2dldDsgc2V0O30KKworICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldEZvcm11bGEoaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIHdvcmtzaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RhcnRSb3cgPT0gcm93ICYmIFN0YXJ0Q29sID09IGNvbHVtbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGb3JtdWxhOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChUb2tlbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoRm9ybXVsYSwgd29ya3NoZWV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RyaW5nIGYgPSAiIjsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdG9rZW4gaW4gVG9rZW5zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEZvcm11bGFBZGRyZXNzKHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgKz0gYS5HZXRPZmZzZXQocm93IC0gU3RhcnRSb3csIGNvbHVtbiAtIFN0YXJ0Q29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgKz0gdG9rZW4uVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29sbGVjdGlvbiBjb250YWluaW5nIG1lcmdlZCBjZWxsIGFkZHJlc3NlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgTWVyZ2VDZWxsc0NvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxzdHJpbmc+CisgICAgICAgIHsKKyAgICAgICAgICAgIGludGVybmFsIE1lcmdlQ2VsbHNDb2xsZWN0aW9uKCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPGludD4gX2NlbGxzID0gbmV3IENlbGxTdG9yZTxpbnQ+KCk7CisgICAgICAgICAgICBMaXN0PHN0cmluZz4gX2xpc3QgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBpbnRlcm5hbCBMaXN0PHN0cmluZz4gTGlzdCB7IGdldCB7cmV0dXJuIF9saXN0O30gfQorICAgICAgICAgICAgcHVibGljIHN0cmluZyB0aGlzW2ludCByb3csIGludCBjb2x1bW5dCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXg9LTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY2VsbHMuRXhpc3RzKHJvdywgY29sdW1uLCByZWYgaXgpICYmIGl4ID49IDAgJiYgaXggPCBMaXN0LkNvdW50KSAgLy9GaXhlcyBpc3N1ZSAxNTA3NQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTGlzdFtpeF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdGhpc1tpbnQgaW5kZXhdCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbaW5kZXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgQWRkKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgYm9vbCBkb1ZhbGlkYXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpeD0wOworCisgICAgICAgICAgICAgICAgLy9WYWxpZGF0ZQorICAgICAgICAgICAgICAgIGlmIChkb1ZhbGlkYXRlICYmIFZhbGlkYXRlKGFkZHJlc3MpID09IGZhbHNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBtZXJnZSBhbmQgYWxyZWFkeSBtZXJnZWQgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2sodGhpcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl4ID0gX2xpc3QuQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIF9saXN0LkFkZChhZGRyZXNzLkFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBTZXRJbmRleChhZGRyZXNzLCBpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgVmFsaWRhdGUoRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpeD0wOworICAgICAgICAgICAgICAgIGlmKF9jZWxscy5FeGlzdHMoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgcmVmIGl4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpeD49MCAmJiBpeCA8IF9saXN0LkNvdW50ICYmIF9saXN0W2l4XSE9bnVsbCAmJiBhZGRyZXNzLkFkZHJlc3MgPT0gX2xpc3RbaXhdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX2NlbGxzLCBhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBhZGRyZXNzLl90b1JvdywgYWRkcmVzcy5fdG9Db2wpOworICAgICAgICAgICAgICAgIC8vY2VsbHMKKyAgICAgICAgICAgICAgICB3aGlsZShjc2UuTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL0VudGlyZSBjb2x1bW4KKyAgICAgICAgICAgICAgICBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PihfY2VsbHMsIDAsIGFkZHJlc3MuX2Zyb21Db2wsIDAsIGFkZHJlc3MuX3RvQ29sKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9FbnRpcmUgcm93CisgICAgICAgICAgICAgICAgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX2NlbGxzLCBhZGRyZXNzLl9mcm9tUm93LCAwLCBhZGRyZXNzLl90b1JvdywgMCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFNldEluZGV4KEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgaW50IGl4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID09IDEgJiYgYWRkcmVzcy5fdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpIC8vRW50aXJlIHJvdworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NlbGxzLlNldFZhbHVlKDAsIGNvbCwgaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3MuX2Zyb21Db2wgPT0gMSAmJiBhZGRyZXNzLl90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgLy9FbnRpcmUgcm93CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbHMuU2V0VmFsdWUocm93LCAwLCBpeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gYWRkcmVzcy5fZnJvbVJvdzsgcm93IDw9IGFkZHJlc3MuX3RvUm93OyByb3crKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbHMuU2V0VmFsdWUocm93LCBjb2wsIGl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZShzdHJpbmcgSXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbGlzdC5SZW1vdmUoSXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlPHN0cmluZz4gTWVtYmVycworCisgICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8c3RyaW5nPiBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworCisgICAgICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgQ2xlYXIoRXhjZWxBZGRyZXNzQmFzZSBEZXN0aW5hdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX2NlbGxzLCBEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIERlc3RpbmF0aW9uLl90b1JvdywgRGVzdGluYXRpb24uX3RvQ29sKTsKKyAgICAgICAgICAgICAgICB2YXIgdXNlZD1uZXcgSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgd2hpbGUoY3NlLk5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB2PWNzZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VkLkNvbnRhaW5zKHYpICYmIF9saXN0W3ZdIT1udWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRyPW5ldyBFeGNlbEFkZHJlc3NCYXNlKF9saXN0W3ZdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKERlc3RpbmF0aW9uLkNvbGxpZGUoYWRyKSA9PSBFeGNlbEFkZHJlc3NCYXNlLmVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZSB8fCBEZXN0aW5hdGlvbi5Db2xsaWRlKGFkcik9PUV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uRXF1YWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkNhbid0IGRlbGV0ZSBtZXJnZWQgY2VsbHMuIEEgcmFuZ2UgaXMgcGFydGx5IG1lcmdlZCB3aXRoIHRoZSBkZWxldGVkIHJhbmdlLiB7MH0iLCBhZHIuX2FkZHJlc3MpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLkFkZCh2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9jZWxscy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIERlc3RpbmF0aW9uLl90b1JvdyAtIERlc3RpbmF0aW9uLl9mcm9tUm93ICsgMSwgRGVzdGluYXRpb24uX3RvQ29sIC0gRGVzdGluYXRpb24uX2Zyb21Db2wgKyAxKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoKHZhciBpIGluIHVzZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdFtpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIENlbGxTdG9yZTxvYmplY3Q+IF92YWx1ZXM7CisgICAgICAgIGludGVybmFsIENlbGxTdG9yZTxzdHJpbmc+IF90eXBlczsKKyAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPGludD4gX3N0eWxlczsKKyAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPG9iamVjdD4gX2Zvcm11bGFzOworICAgICAgICBpbnRlcm5hbCBGbGFnQ2VsbFN0b3JlIF9mbGFnczsKKyAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPExpc3Q8VG9rZW4+PiBfZm9ybXVsYVRva2VuczsKKworICAgICAgICBpbnRlcm5hbCBDZWxsU3RvcmU8VXJpPiBfaHlwZXJMaW5rczsKKyAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPEV4Y2VsQ29tbWVudD4gX2NvbW1lbnRzU3RvcmU7CisKKyAgICAgICAgaW50ZXJuYWwgRGljdGlvbmFyeTxpbnQsIEZvcm11bGFzPiBfc2hhcmVkRm9ybXVsYXMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIEZvcm11bGFzPigpOworICAgICAgICBpbnRlcm5hbCBpbnQgX21pbkNvbCA9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICAgICAgICBpbnRlcm5hbCBpbnQgX21heENvbCA9IDA7CisgICAgICAgICNyZWdpb24gV29ya3NoZWV0IFByaXZhdGUgUHJvcGVydGllcworICAgICAgICBpbnRlcm5hbCBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisJCXByaXZhdGUgVXJpIF93b3Jrc2hlZXRVcmk7CisJCXByaXZhdGUgc3RyaW5nIF9uYW1lOworCQlwcml2YXRlIGludCBfc2hlZXRJRDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3Bvc2l0aW9uSUQ7CisJCXByaXZhdGUgc3RyaW5nIF9yZWxhdGlvbnNoaXBJRDsKKwkJcHJpdmF0ZSBYbWxEb2N1bWVudCBfd29ya3NoZWV0WG1sOworICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldFZpZXcgX3NoZWV0VmlldzsKKwkJaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXIgX2hlYWRlckZvb3RlcjsKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uIEV4Y2VsV29ya3NoZWV0IENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4Y2VsUGFja2FnZSI+UGFja2FnZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVsSUQiPlJlbGF0aW9uc2hpcCBJRDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpV29ya3NoZWV0Ij5VUkk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0TmFtZSI+TmFtZSBvZiB0aGUgc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0SUQiPlNoZWV0IGlkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3NpdGlvbklEIj5Qb3NpdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGlkZSI+aGlkZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlLCBzdHJpbmcgcmVsSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaVdvcmtzaGVldCwgc3RyaW5nIHNoZWV0TmFtZSwgaW50IHNoZWV0SUQsIGludCBwb3NpdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdvcmtTaGVldEhpZGRlbiBoaWRlKSA6CisgICAgICAgICAgICBiYXNlKG5zLCBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAic2hlZXRQciIsICJ0YWJDb2xvciIsICJvdXRsaW5lUHIiLCAicGFnZVNldFVwUHIiLCAiZGltZW5zaW9uIiwgInNoZWV0Vmlld3MiLCAic2hlZXRGb3JtYXRQciIsICJjb2xzIiwgInNoZWV0RGF0YSIsICJzaGVldFByb3RlY3Rpb24iLCAicHJvdGVjdGVkUmFuZ2VzIiwic2NlbmFyaW9zIiwgImF1dG9GaWx0ZXIiLCAic29ydFN0YXRlIiwgImRhdGFDb25zb2xpZGF0ZSIsICJjdXN0b21TaGVldFZpZXdzIiwgImN1c3RvbVNoZWV0Vmlld3MiLCAibWVyZ2VDZWxscyIsICJwaG9uZXRpY1ByIiwgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIsICJkYXRhVmFsaWRhdGlvbnMiLCAiaHlwZXJsaW5rcyIsICJwcmludE9wdGlvbnMiLCAicGFnZU1hcmdpbnMiLCAicGFnZVNldHVwIiwgImhlYWRlckZvb3RlciIsICJsaW5lUHJpbnQiLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIsICJjdXN0b21Qcm9wZXJ0aWVzIiwgImNlbGxXYXRjaGVzIiwgImlnbm9yZWRFcnJvcnMiLCAic21hcnRUYWdzIiwgImRyYXdpbmciLCAibGVnYWN5RHJhd2luZyIsICJsZWdhY3lEcmF3aW5nSEYiLCAicGljdHVyZSIsICJvbGVPYmplY3RzIiwgImFjdGl2ZVhDb250cm9scyIsICJ3ZWJQdWJsaXNoSXRlbXMiLCAidGFibGVQYXJ0cyIgLCAiZXh0THN0IiB9OworICAgICAgICAgICAgX3BhY2thZ2UgPSBleGNlbFBhY2thZ2U7ICAgCisgICAgICAgICAgICBfcmVsYXRpb25zaGlwSUQgPSByZWxJRDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXRVcmkgPSB1cmlXb3Jrc2hlZXQ7CisgICAgICAgICAgICBfbmFtZSA9IHNoZWV0TmFtZTsKKyAgICAgICAgICAgIF9zaGVldElEID0gc2hlZXRJRDsKKyAgICAgICAgICAgIF9wb3NpdGlvbklEID0gcG9zaXRpb25JRDsKKyAgICAgICAgICAgIEhpZGRlbiA9IGhpZGU7CisgICAgICAgICAgIAorICAgICAgICAgICAgLyoqKiogQ2VsbHN0b3JlICoqKiovCisgICAgICAgICAgICBfdmFsdWVzPW5ldyBDZWxsU3RvcmU8b2JqZWN0PigpOworICAgICAgICAgICAgX3R5cGVzID0gbmV3IENlbGxTdG9yZTxzdHJpbmc+KCk7CisgICAgICAgICAgICBfc3R5bGVzID0gbmV3IENlbGxTdG9yZTxpbnQ+KCk7CisgICAgICAgICAgICBfZm9ybXVsYXMgPSBuZXcgQ2VsbFN0b3JlPG9iamVjdD4oKTsKKyAgICAgICAgICAgIF9mbGFncyA9IG5ldyBGbGFnQ2VsbFN0b3JlKCk7CisgICAgICAgICAgICBfY29tbWVudHNTdG9yZSA9IG5ldyBDZWxsU3RvcmU8RXhjZWxDb21tZW50PigpOworICAgICAgICAgICAgX2h5cGVyTGlua3MgPSBuZXcgQ2VsbFN0b3JlPFVyaT4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX25hbWVzID0gbmV3IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24oV29ya2Jvb2ssdGhpcyk7CisKKyAgICAgICAgICAgIENyZWF0ZVhtbCgpOworICAgICAgICAgICAgVG9wTm9kZSA9IF93b3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgVXJpIHRvIHRoZSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBwYWNrYWdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIFVyaSBXb3Jrc2hlZXRVcmkgeyBnZXQgeyByZXR1cm4gKF93b3Jrc2hlZXRVcmkpOyB9IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFppcC5aaXBQYWNrYWdlUGFydCBmb3IgdGhlIHdvcmtzaGVldCB3aXRoaW4gdGhlIHBhY2thZ2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQgeyByZXR1cm4gKF9wYWNrYWdlLlBhY2thZ2UuR2V0UGFydChXb3Jrc2hlZXRVcmkpKTsgfSB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBJRCBmb3IgdGhlIHdvcmtzaGVldCdzIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSB3b3JrYm9vayBpbiB0aGUgcGFja2FnZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUmVsYXRpb25zaGlwSUQgeyBnZXQgeyByZXR1cm4gKF9yZWxhdGlvbnNoaXBJRCk7IH0gfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGludCBTaGVldElEIHsgZ2V0IHsgcmV0dXJuIChfc2hlZXRJRCk7IH0gfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcG9zaXRpb24gb2YgdGhlIHdvcmtzaGVldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgaW50IFBvc2l0aW9uSUQgeyBnZXQgeyByZXR1cm4gKF9wb3NpdGlvbklEKTsgfSBzZXQgeyBfcG9zaXRpb25JRCA9IHZhbHVlOyB9IH0KKwkJI3JlZ2lvbiBXb3Jrc2hlZXQgUHVibGljIFByb3BlcnRpZXMKKyAgICAJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGluZGV4IGluIHRoZSB3b3Jrc2hlZXRzIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBJbmRleCB7IGdldCB7IHJldHVybiAoX3Bvc2l0aW9uSUQpOyB9IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcmVzcyBmb3IgYXV0b2ZpbHRlcgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRXhjZWxSYW5nZUJhc2UuQXV0b0ZpbHRlciIgLz4gICAgICAgIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSBBdXRvRmlsdGVyQWRkcmVzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgICAgIHN0cmluZyBhZGRyZXNzID0gR2V0WG1sTm9kZVN0cmluZygiZDphdXRvRmlsdGVyL0ByZWYiKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmF1dG9GaWx0ZXIvQHJlZiIsIHZhbHVlLkFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDaGVja1NoZWV0VHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzIGlzIEV4Y2VsQ2hhcnRzaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVGhpcyBwcm9wZXJ0eSBvciBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBmb3IgYSBDaGFydHNoZWV0IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJucyBhIEV4Y2VsV29ya3NoZWV0VmlldyBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIHNldCB0aGUgdmlldyBzdGF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3Jrc2hlZXQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEV4Y2VsV29ya3NoZWV0VmlldyBWaWV3CisJCXsKKwkJCWdldAorCQkJeworCQkJCWlmIChfc2hlZXRWaWV3ID09IG51bGwpCisJCQkJeworICAgICAgICAgICAgICAgICAgICBYbWxOb2RlIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6c2hlZXRWaWV3cy9kOnNoZWV0VmlldyIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOnNoZWV0Vmlld3MvZDpzaGVldFZpZXciKTsgLy90aGlzIG9uZSBzaG91bHMgYWx3YXlzIGV4aXN0LiBidXQgY2hlY2sgYW55d2F5CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnNoZWV0Vmlld3MvZDpzaGVldFZpZXciLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfc2hlZXRWaWV3ID0gbmV3IEV4Y2VsV29ya3NoZWV0VmlldyhOYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCB0aGlzKTsKKwkJCQl9CisJCQkJcmV0dXJuIChfc2hlZXRWaWV3KTsKKwkJCX0KKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFRoZSB3b3Jrc2hlZXQncyBkaXNwbGF5IG5hbWUgYXMgaXQgYXBwZWFycyBvbiB0aGUgdGFiCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBzdHJpbmcgTmFtZQorCQl7CisJCQlnZXQgeyByZXR1cm4gKF9uYW1lKTsgfQorCQkJc2V0CisJCQl7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IF9uYW1lKSByZXR1cm47CisgICAgICAgICAgICAgICAgdmFsdWU9X3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5WYWxpZGF0ZUZpeFNoZWV0TmFtZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCh2YXIgd3MgaW4gV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHdzLlBvc2l0aW9uSUQhPVBvc2l0aW9uSUQgJiYgd3MuTmFtZS5FcXVhbHModmFsdWUsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIldvcmtzaGVldCBuYW1lIG11c3QgYmUgdW5pcXVlIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLlNldFhtbE5vZGVTdHJpbmcoc3RyaW5nLkZvcm1hdCgiZDpzaGVldHMvZDpzaGVldFtAc2hlZXRJZD17MH1dL0BuYW1lIiwgX3NoZWV0SUQpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQ2hhbmdlTmFtZXModmFsdWUpOworCisgICAgICAgICAgICAgICAgX25hbWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKwkJfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGFuZ2VOYW1lcyhzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vUmVuYW1lcyBuYW1lIGluIHRoaXMgV29ya3NoZWV0OworICAgICAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gV29ya2Jvb2suTmFtZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG4uTmFtZUZvcm11bGEpICYmIG4uTmFtZVZhbHVlPT1udWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbi5DaGFuZ2VXb3Jrc2hlZXQoX25hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gd3MuTmFtZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuLk5hbWVGb3JtdWxhKSAmJiBuLk5hbWVWYWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uQ2hhbmdlV29ya3NoZWV0KF9uYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBfbmFtZXM7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBuYW1lZCByYW5nZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gTmFtZXMgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJbmRpY2F0ZXMgaWYgdGhlIHdvcmtzaGVldCBpcyBoaWRkZW4gaW4gdGhlIHdvcmtib29rCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBlV29ya1NoZWV0SGlkZGVuIEhpZGRlbgorCQl7CisJCQlnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRlPV9wYWNrYWdlLldvcmtib29rLkdldFhtbE5vZGVTdHJpbmcoc3RyaW5nLkZvcm1hdCgiZDpzaGVldHMvZDpzaGVldFtAc2hlZXRJZD17MH1dL0BzdGF0ZSIsIF9zaGVldElEKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICJoaWRkZW4iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVXb3JrU2hlZXRIaWRkZW4uSGlkZGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAidmVyeUhpZGRlbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5WZXJ5SGlkZGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlOworICAgICAgICAgICAgfQorCQkJc2V0CisJCQl7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBlV29ya1NoZWV0SGlkZGVuLlZpc2libGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLkRlbGV0ZU5vZGUoc3RyaW5nLkZvcm1hdCgiZDpzaGVldHMvZDpzaGVldFtAc2hlZXRJZD17MH1dL0BzdGF0ZSIsIF9zaGVldElEKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHY9dmFsdWUuVG9TdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHY9di5TdWJzdHJpbmcoMCwxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpK3YuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suU2V0WG1sTm9kZVN0cmluZyhzdHJpbmcuRm9ybWF0KCJkOnNoZWV0cy9kOnNoZWV0W0BzaGVldElkPXswfV0vQHN0YXRlIiwgX3NoZWV0SUQpLHYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgfQorCQl9CisgICAgICAgIGRvdWJsZSBfZGVmYXVsdFJvd0hlaWdodCA9IGRvdWJsZS5OYU47CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKwkJLy8vIEdldC9zZXQgdGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGFsbCByb3dzIGluIHRoZSB3b3Jrc2hlZXQKKwkJLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBEZWZhdWx0Um93SGVpZ2h0CisJCXsKKwkJCWdldCAKKwkJCXsKKyAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChkb3VibGUuSXNOYU4oX2RlZmF1bHRSb3dIZWlnaHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RlZmF1bHRSb3dIZWlnaHQgPSBHZXRYbWxOb2RlRG91YmxlKCJkOnNoZWV0Rm9ybWF0UHIvQGRlZmF1bHRSb3dIZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZG91YmxlLklzTmFOKF9kZWZhdWx0Um93SGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2RlZmF1bHRSb3dIZWlnaHQgPSAxNTsgLy8gRXhjZWwgZGVmYXVsdCBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJCQlyZXR1cm4gX2RlZmF1bHRSb3dIZWlnaHQ7CisJCQl9CisJCQlzZXQKKwkJCXsKKyAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgICAgIF9kZWZhdWx0Um93SGVpZ2h0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Um93SGVpZ2h0IiwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJkOnNoZWV0Rm9ybWF0UHIvQGN1c3RvbUhlaWdodCIsIHZhbHVlICE9IDE1KTsKKworICAgICAgICAgICAgICAgIGlmIChkb3VibGUuSXNOYU4oR2V0WG1sTm9kZURvdWJsZSgiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Q29sV2lkdGgiKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWZhdWx0Q29sV2lkdGggPSA5LjE0MDYyNTsKKyAgICAgICAgICAgICAgICB9CisJCQl9CisJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0L3NldCB0aGUgZGVmYXVsdCB3aWR0aCBvZiBhbGwgcm93cyBpbiB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgRGVmYXVsdENvbFdpZHRoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgZG91YmxlIHJldCA9IEdldFhtbE5vZGVEb3VibGUoImQ6c2hlZXRGb3JtYXRQci9AZGVmYXVsdENvbFdpZHRoIik7CisgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05hTihyZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gOS4xNDA2MjU7IC8vIEV4Y2VsJ3MgZGVmYXVsdCB3aWR0aAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOnNoZWV0Rm9ybWF0UHIvQGRlZmF1bHRDb2xXaWR0aCIsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKworICAgICAgICAgICAgICAgIGlmIChkb3VibGUuSXNOYU4oR2V0WG1sTm9kZURvdWJsZSgiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Um93SGVpZ2h0IikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFJvd0hlaWdodCA9IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiogPG91dGxpbmVQciBhcHBseVN0eWxlcz0iMSIgc3VtbWFyeUJlbG93PSIwIiBzdW1tYXJ5UmlnaHQ9IjAiIC8+ICoqLworICAgICAgICBjb25zdCBzdHJpbmcgb3V0TGluZVN1bW1hcnlCZWxvd1BhdGggPSAiZDpzaGVldFByL2Q6b3V0bGluZVByL0BzdW1tYXJ5QmVsb3ciOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdW1tYXJ5IHJvd3MgYmVsb3cgZGV0YWlscyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgT3V0TGluZVN1bW1hcnlCZWxvdworICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wob3V0TGluZVN1bW1hcnlCZWxvd1BhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKG91dExpbmVTdW1tYXJ5QmVsb3dQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIG91dExpbmVTdW1tYXJ5UmlnaHRQYXRoID0gImQ6c2hlZXRQci9kOm91dGxpbmVQci9Ac3VtbWFyeVJpZ2h0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3VtbWFyeSByb3dzIHRvIHJpZ2h0IG9mIGRldGFpbHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgT3V0TGluZVN1bW1hcnlSaWdodAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChvdXRMaW5lU3VtbWFyeVJpZ2h0UGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcob3V0TGluZVN1bW1hcnlSaWdodFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgb3V0TGluZUFwcGx5U3R5bGVQYXRoID0gImQ6c2hlZXRQci9kOm91dGxpbmVQci9AYXBwbHlTdHlsZXMiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBdXRvbWF0aWMgc3R5bGVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIE91dExpbmVBcHBseVN0eWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKG91dExpbmVBcHBseVN0eWxlUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcob3V0TGluZUFwcGx5U3R5bGVQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIHRhYkNvbG9yUGF0aCA9ICJkOnNoZWV0UHIvZDp0YWJDb2xvci9AcmdiIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29sb3Igb2YgdGhlIHNoZWV0IHRhYgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQ29sb3IgVGFiQ29sb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcodGFiQ29sb3JQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sID09ICIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkVtcHR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoaW50LlBhcnNlKGNvbCwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyh0YWJDb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBjb2RlTW9kdWxlTmFtZVBhdGggPSAiZDpzaGVldFByL0Bjb2RlTmFtZSI7CisgICAgICAgIGludGVybmFsIHN0cmluZyBDb2RlTW9kdWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhjb2RlTW9kdWxlTmFtZVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhjb2RlTW9kdWxlTmFtZVBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIENvZGVOYW1lQ2hhbmdlKHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29kZU1vZHVsZU5hbWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVkJBLkV4Y2VsVkJBTW9kdWxlIENvZGVNb2R1bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9wYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXNbQ29kZU1vZHVsZU5hbWVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBXb3Jrc2hlZXRYbWwKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gVGhlIFhNTCBkb2N1bWVudCBob2xkaW5nIHRoZSB3b3Jrc2hlZXQgZGF0YS4KKyAgICAgICAgLy8vIEFsbCBjb2x1bW4sIHJvdywgY2VsbCwgcGFnZWJyZWFrLCBtZXJnZWQgY2VsbCBhbmQgaHlwZXJsaW5rLWRhdGEgYXJlIGxvYWRlZCBpbnRvIG1lbW9yeSBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCB3aGVuIGxvYWRpbmcgdGhlIGRvY3VtZW50LiAgICAgICAgCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyBYbWxEb2N1bWVudCBXb3Jrc2hlZXRYbWwKKwkJeworCQkJZ2V0CisJCQl7CisJCQkJcmV0dXJuIChfd29ya3NoZWV0WG1sKTsKKwkJCX0KKwkJfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbiBfdm1sRHJhd2luZ3MgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWbWwgZHJhd2luZ3MuIHVuZGVybGF5aW5nIG9iamVjdCBmb3IgY29tbWVudHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24gVm1sRHJhd2luZ3NDb21tZW50cworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDcmVhdGVWbWxDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdm1sRHJhd2luZ3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxDb21tZW50Q29sbGVjdGlvbiBfY29tbWVudHMgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb2xsZWN0aW9uIG9mIGNvbW1lbnRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbW1lbnRDb2xsZWN0aW9uIENvbW1lbnRzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKF9jb21tZW50cyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVm1sQ29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBfY29tbWVudHMgPSBuZXcgRXhjZWxDb21tZW50Q29sbGVjdGlvbihfcGFja2FnZSwgdGhpcywgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfY29tbWVudHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVZtbENvbGxlY3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdm1sTm9kZSA9IF93b3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50LlNlbGVjdFNpbmdsZU5vZGUoImQ6bGVnYWN5RHJhd2luZy9AcjppZCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKHZtbE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3MgPSBuZXcgRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24oX3BhY2thZ2UsIHRoaXMsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChQYXJ0LlJlbGF0aW9uc2hpcEV4aXN0cyh2bWxOb2RlLlZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcCh2bWxOb2RlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZtbFVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKworICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3MgPSBuZXcgRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24oX3BhY2thZ2UsIHRoaXMsIHZtbFVyaSk7CisgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5ncy5SZWxJZCA9IHJlbC5JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlWG1sKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldFhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgX3dvcmtzaGVldFhtbC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSBFeGNlbFBhY2thZ2UucHJlc2VydmVXaGl0ZXNwYWNlOworICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhY2tQYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5HZXRQYXJ0KFdvcmtzaGVldFVyaSk7CisgICAgICAgICAgICBzdHJpbmcgeG1sID0gIiI7CisKKyAgICAgICAgICAgIC8vIEZpcnN0IENvbHVtbnMsIHJvd3MsIGNlbGxzLCBtZXJnZWNlbGxzLCBoeXBlcmxpbmtzIGFuZCBwYWdlYnJlYWtlcyBhcmUgbG9hZGVkIGZyb20gYSB4bWxzdHJlYW0gdG8gb3B0aW1pemUgc3BlZWQuLi4KKyAgICAgICAgICAgIGJvb2wgZG9BZGp1c3QgPSBfcGFja2FnZS5Eb0FkanVzdERyYXdpbmdzOworICAgICAgICAgICAgX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGZhbHNlOworICAgICAgICAgICAgU3RyZWFtIHN0cmVhbSA9IHBhY2tQYXJ0LkdldFN0cmVhbSgpOworCisgICAgICAgICAgICBYbWxUZXh0UmVhZGVyIHhyID0gbmV3IFhtbFRleHRSZWFkZXIoc3RyZWFtKTsKKyAgICAgICAgICAgIHhyLlByb2hpYml0RHRkID0gdHJ1ZTsKKyAgICAgICAgICAgIHhyLldoaXRlc3BhY2VIYW5kbGluZyA9IFdoaXRlc3BhY2VIYW5kbGluZy5Ob25lOworICAgICAgICAgICAgTG9hZENvbHVtbnMoeHIpOyAgICAvL2NvbHVtblhtbAorICAgICAgICAgICAgbG9uZyBzdGFydCA9IHN0cmVhbS5Qb3NpdGlvbjsKKyAgICAgICAgICAgIExvYWRDZWxscyh4cik7CisgICAgICAgICAgICB2YXIgbmV4dEVsZW1lbnRMZW5ndGggPSBHZXRBdHRyaWJ1dGVMZW5ndGgoeHIpOworICAgICAgICAgICAgbG9uZyBlbmQgPSBzdHJlYW0uUG9zaXRpb24gLSBuZXh0RWxlbWVudExlbmd0aDsKKyAgICAgICAgICAgIExvYWRNZXJnZUNlbGxzKHhyKTsKKyAgICAgICAgICAgIExvYWRIeXBlckxpbmtzKHhyKTsKKyAgICAgICAgICAgIExvYWRSb3dQYWdlQnJlYWtlcyh4cik7CisgICAgICAgICAgICBMb2FkQ29sUGFnZUJyZWFrZXMoeHIpOworICAgICAgICAgICAgLy8uLi50aGVuIHRoZSByZXN0IG9mIHRoZSBYbWwgaXMgZXh0cmFjdGVkIGFuZCBsb2FkZWQgaW50byB0aGUgV29ya3NoZWV0WG1sIGRvY3VtZW50LgorICAgICAgICAgICAgc3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBFbmNvZGluZyBlbmNvZGluZzsKKyAgICAgICAgICAgIHhtbCA9IEdldFdvcmtTaGVldFhtbChzdHJlYW0sIHN0YXJ0LCBlbmQsIG91dCBlbmNvZGluZyk7CisKKyAgICAgICAgICAgIC8vZmlyc3QgY2hhciBpcyBpbnZhbGlkIHNvbWV0aW1lcz8/IAorICAgICAgICAgICAgaWYgKHhtbFswXSAhPSAnPCcpCisgICAgICAgICAgICAgICAgTG9hZFhtbFNhZmUoX3dvcmtzaGVldFhtbCwgeG1sLlN1YnN0cmluZygxLCB4bWwuTGVuZ3RoIC0gMSksIGVuY29kaW5nKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMb2FkWG1sU2FmZShfd29ya3NoZWV0WG1sLCB4bWwsIGVuY29kaW5nKTsKKworICAgICAgICAgICAgX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGRvQWRqdXN0OworICAgICAgICAgICAgQ2xlYXJOb2RlcygpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCB0aGUgbGVudGggb2YgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgLy8vIENvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYXR0cmlidXRlcyBjYW4gYmUgZXh0cmVtbHkgbG9uZyBzb20gZ2V0IGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlcyB0byBmaW5ldHVuZSBwb3NpdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0QXR0cmlidXRlTGVuZ3RoKFhtbFRleHRSZWFkZXIgeHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4ci5Ob2RlVHlwZSAhPSBYbWxOb2RlVHlwZS5FbGVtZW50KSByZXR1cm4gMDsKKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhyLkF0dHJpYnV0ZUNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGE9eHIuR2V0QXR0cmlidXRlKGkpOworICAgICAgICAgICAgICAgIGxlbmd0aCArPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhKSA/IDAgOiBhLkxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRSb3dQYWdlQnJlYWtlcyhYbWxUZXh0UmVhZGVyIHhyKQorICAgICAgICB7CisgICAgICAgICAgICBpZighUmVhZFVudGlsKHhyLCAicm93QnJlYWtzIiwiY29sQnJlYWtzIikpIHJldHVybjsKKyAgICAgICAgICAgIHdoaWxlICh4ci5SZWFkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSAiYnJrIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ci5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbGVtZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHhyLkdldEF0dHJpYnV0ZSgiaWQiKSwgb3V0IGlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3coaWQpLlBhZ2VCcmVhayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBMb2FkQ29sUGFnZUJyZWFrZXMoWG1sVGV4dFJlYWRlciB4cikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFSZWFkVW50aWwoeHIsICJjb2xCcmVha3MiKSkgcmV0dXJuOworICAgICAgICAgICAgd2hpbGUgKHhyLlJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeHIuTG9jYWxOYW1lID09ICJicmsiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhyLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLkVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoeHIuR2V0QXR0cmlidXRlKCJpZCIpLCBvdXQgaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbihpZCkuUGFnZUJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ2xlYXJOb2RlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xzIiwgTmFtZVNwYWNlTWFuYWdlcikhPW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29scyIsIE5hbWVTcGFjZU1hbmFnZXIpLlJlbW92ZUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOm1lcmdlQ2VsbHMiLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOm1lcmdlQ2VsbHMiLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpoeXBlcmxpbmtzIiwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpoeXBlcmxpbmtzIiwgTmFtZVNwYWNlTWFuYWdlcikuUmVtb3ZlQWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6cm93QnJlYWtzIiwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dCcmVha3MiLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xCcmVha3MiLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmNvbEJyZWFrcyIsIE5hbWVTcGFjZU1hbmFnZXIpLlJlbW92ZUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IGludCBCTE9DS1NJWkU9ODE5MjsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0V29ya1NoZWV0WG1sKFN0cmVhbSBzdHJlYW0sIGxvbmcgc3RhcnQsIGxvbmcgZW5kLCBvdXQgRW5jb2RpbmcgZW5jb2RpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmVhbVJlYWRlciBzciA9IG5ldyBTdHJlYW1SZWFkZXIoc3RyZWFtKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICAgICAgY2hhcltdIGJsb2NrOworICAgICAgICAgICAgaW50IHBvczsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOyAgICAgICAgICAgIAorICAgICAgICAgICAgTWF0Y2ggc3RhcnRtTWF0Y2gsIGVuZE1hdGNoOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHN0cmVhbS5MZW5ndGggPCBCTE9DS1NJWkUgPyAoaW50KXN0cmVhbS5MZW5ndGggOiBCTE9DS1NJWkU7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgY2hhcltzaXplXTsKKyAgICAgICAgICAgICAgICBwb3MgPSBzci5SZWFkQmxvY2soYmxvY2ssIDAsIHNpemUpOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNiLkFwcGVuZChibG9jaywwLHBvcyk7CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoIDwgc3RhcnQgKyAyMCAmJiBsZW5ndGggPCBlbmQpOworICAgICAgICAgICAgc3RhcnRtTWF0Y2ggPSBSZWdleC5NYXRjaChzYi5Ub1N0cmluZygpLCBzdHJpbmcuRm9ybWF0KCIoPFtePl0qezB9W14+XSo+KSIsICJzaGVldERhdGEiKSk7CisgICAgICAgICAgICBpZiAoIXN0YXJ0bU1hdGNoLlN1Y2Nlc3MpIC8vTm90IGZvdW5kCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBzci5DdXJyZW50RW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIHN0cmluZyB4bWwgPSBzLlN1YnN0cmluZygwLCBzdGFydG1NYXRjaC5JbmRleCk7IAorICAgICAgICAgICAgICAgIGlmKHN0YXJ0bU1hdGNoLlZhbHVlLkVuZHNXaXRoKCIvPiIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sICs9IHMuU3Vic3RyaW5nKHN0YXJ0bU1hdGNoLkluZGV4LCBzLkxlbmd0aCAtIHN0YXJ0bU1hdGNoLkluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyLlBlZWsoKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoqKiogRml4ZXMgaXNzdWUgMTQ3ODguIEZpeCBieSBQaGlsaXAgR2FycmV0dCAqKioqLworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBlbmRTZWVrU3RhcnQgPSBlbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbmRTZWVrU3RhcnQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRTZWVrU3RhcnQgPSBNYXRoLk1heChlbmRTZWVrU3RhcnQgLSBCTE9DS1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gKGludCkoZW5kIC0gZW5kU2Vla1N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uU2VlayhlbmRTZWVrU3RhcnQsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbmV3IGNoYXJbc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3IgPSBuZXcgU3RyZWFtUmVhZGVyKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gc3IuUmVhZEJsb2NrKGJsb2NrLCAwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGJsb2NrLCAwLCBwb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZE1hdGNoID0gUmVnZXguTWF0Y2gocywgc3RyaW5nLkZvcm1hdCgiKDwvW14+XSp7MH1bXj5dKj4pIiwgInNoZWV0RGF0YSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kTWF0Y2guU3VjY2VzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmRNYXRjaCA9IFJlZ2V4Lk1hdGNoKHMsIHN0cmluZy5Gb3JtYXQoIig8L1tePl0qezB9W14+XSo+KSIsICJzaGVldERhdGEiKSk7CisgICAgICAgICAgICAgICAgICAgIHhtbCArPSAiPHNoZWV0RGF0YS8+IiArIHMuU3Vic3RyaW5nKGVuZE1hdGNoLkluZGV4ICsgZW5kTWF0Y2guTGVuZ3RoLCBzLkxlbmd0aCAtIChlbmRNYXRjaC5JbmRleCArIGVuZE1hdGNoLkxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3IuUGVlaygpID4gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4bWwgKz0gc3IuUmVhZFRvRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gc3IuQ3VycmVudEVuY29kaW5nOworICAgICAgICAgICAgICAgIHJldHVybiB4bWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdldEJsb2NrUG9zKHN0cmluZyB4bWwsIHN0cmluZyB0YWcsIHJlZiBpbnQgc3RhcnQsIHJlZiBpbnQgZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBNYXRjaCBzdGFydG1NYXRjaCwgZW5kTWF0Y2g7CisgICAgICAgICAgICBzdGFydG1NYXRjaCA9IFJlZ2V4Lk1hdGNoKHhtbC5TdWJzdHJpbmcoc3RhcnQpLCBzdHJpbmcuRm9ybWF0KCIoPFtePl0qezB9W14+XSo+KSIsIHRhZykpOyAvLyI8W2EtekEtWjpdKiIgKyB0YWcgKyAiWz9dKj4iKTsKKworICAgICAgICAgICAgaWYgKCFzdGFydG1NYXRjaC5TdWNjZXNzKSAvL05vdCBmb3VuZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7CisgICAgICAgICAgICAgICAgZW5kID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHN0YXJ0UG9zPXN0YXJ0bU1hdGNoLkluZGV4K3N0YXJ0OworICAgICAgICAgICAgaWYoc3RhcnRtTWF0Y2guVmFsdWUuU3Vic3RyaW5nKHN0YXJ0bU1hdGNoLlZhbHVlLkxlbmd0aC0yLDEpPT0iLyIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kID0gc3RhcnRQb3MgKyBzdGFydG1NYXRjaC5MZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kTWF0Y2ggPSBSZWdleC5NYXRjaCh4bWwuU3Vic3RyaW5nKHN0YXJ0KSwgc3RyaW5nLkZvcm1hdCgiKDwvW14+XSp7MH1bXj5dKj4pIiwgdGFnKSk7CisgICAgICAgICAgICAgICAgaWYgKGVuZE1hdGNoLlN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmRNYXRjaC5JbmRleCArIGVuZE1hdGNoLkxlbmd0aCArIHN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRQb3M7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBib29sIFJlYWRVbnRpbChYbWxUZXh0UmVhZGVyIHhyLHBhcmFtcyBzdHJpbmdbXSB0YWdOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeHIuRU9GKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoIUFycmF5LkV4aXN0cyh0YWdOYW1lLCB0YWcgPT4geHIuTG9jYWxOYW1lLkVuZHNXaXRoKHRhZykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoeHIuRU9GKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHhyLkxvY2FsTmFtZS5FbmRzV2l0aCh0YWdOYW1lWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRDb2x1bW5zIChYbWxUZXh0UmVhZGVyIHhyKS8vKHN0cmluZyB4bWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xMaXN0ID0gbmV3IExpc3Q8SVJhbmdlSUQ+KCk7CisgICAgICAgICAgICBpZiAoUmVhZFVudGlsKHhyLCAiY29scyIsICJzaGVldERhdGEiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKHhtbCAhPSAiIikKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIC8vdmFyIHhyPW5ldyBYbWxUZXh0UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoeG1sKSk7CisgICAgICAgICAgICAgICAgd2hpbGUoeHIuUmVhZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhyLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLldoaXRlc3BhY2UpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoeHIuTG9jYWxOYW1lICE9ICJjb2wiKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhyLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLkVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4gPSBpbnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJtaW4iKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ29sdW1uIGNvbCA9IG5ldyBFeGNlbENvbHVtbih0aGlzLCBtaW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2wuQ29sdW1uTWF4ID0gaW50LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgibWF4IikpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sLldpZHRoID0geHIuR2V0QXR0cmlidXRlKCJ3aWR0aCIpID09IG51bGwgPyAwIDogZG91YmxlLlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgid2lkdGgiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLkJlc3RGaXQgPSB4ci5HZXRBdHRyaWJ1dGUoImJlc3RGaXQiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiYmVzdEZpdCIpID09ICIxIiA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuQ29sbGFwc2VkID0geHIuR2V0QXR0cmlidXRlKCJjb2xsYXBzZWQiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiY29sbGFwc2VkIikgPT0gIjEiID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5QaG9uZXRpYyA9IHhyLkdldEF0dHJpYnV0ZSgicGhvbmV0aWMiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgicGhvbmV0aWMiKSA9PSAiMSIgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2wuT3V0bGluZUxldmVsID0gKHNob3J0KSh4ci5HZXRBdHRyaWJ1dGUoIm91dGxpbmVMZXZlbCIpID09IG51bGwgPyAwIDogaW50LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgib3V0bGluZUxldmVsIiksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuSGlkZGVuID0geHIuR2V0QXR0cmlidXRlKCJoaWRkZW4iKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiaGlkZGVuIikgPT0gIjEiID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZSgwLCBtaW4sIGNvbCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0eWxlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoeHIuR2V0QXR0cmlidXRlKCJzdHlsZSIpID09IG51bGwgfHwgIWludC5UcnlQYXJzZSh4ci5HZXRBdHRyaWJ1dGUoInN0eWxlIiksIG91dCBzdHlsZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdHlsZXMuU2V0VmFsdWUoMCwgbWluLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCB1bnRpbCB0aGUgbm9kZSBpcyBmb3VuZC4gSWYgbm90IGZvdW5kIHRoZSB4bWxyZWFkZXIgaXMgcmVzZXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZVRleHQiPlRleHQgdG8gc2VhcmNoIGZvcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWx0Tm9kZSI+QWx0ZXJuYXRpdmUgdGV4dCB0byBzZWFyY2ggZm9yPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBSZWFkWG1sUmVhZGVyVW50aWwoWG1sVGV4dFJlYWRlciB4ciwgc3RyaW5nIG5vZGVUZXh0LCBzdHJpbmcgYWx0Tm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeHIuTG9jYWxOYW1lID09IG5vZGVUZXh0IHx8IHhyLkxvY2FsTmFtZSA9PSBhbHROb2RlKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlKHhyLlJlYWQoKSk7CisgICAgICAgICAgICB4ci5DbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvYWQgSHlwZXJsaW5rcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InhyIj5UaGUgcmVhZGVyPC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRIeXBlckxpbmtzKFhtbFRleHRSZWFkZXIgeHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghUmVhZFVudGlsKHhyLCAiaHlwZXJsaW5rcyIsICJyb3dCcmVha3MiLCAiY29sQnJlYWtzIikpIHJldHVybjsKKyAgICAgICAgICAgIHdoaWxlICh4ci5SZWFkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSAiaHlwZXJsaW5rIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2w7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoeHIuR2V0QXR0cmlidXRlKCJyZWYiKSwgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsSHlwZXJMaW5rIGhsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhyLkdldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcykgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJJZCA9IHhyLkdldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJpID0gUGFydC5HZXRSZWxhdGlvbnNoaXAocklkKS5UYXJnZXRVcmk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJpLklzQWJzb2x1dGVVcmkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobCA9IG5ldyBFeGNlbEh5cGVyTGluayh1cmkuQWJzb2x1dGVVcmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGwgPSBuZXcgRXhjZWxIeXBlckxpbmsodXJpLk9yaWdpbmFsU3RyaW5nLCBVcmlLaW5kLkFic29sdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGwgPSBuZXcgRXhjZWxIeXBlckxpbmsodXJpLk9yaWdpbmFsU3RyaW5nLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhsLlJJZCA9IHJJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJJZCk7IC8vRGVsZXRlIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIHJlY3JlYXRlZCB3aGVuIHdlIHNhdmUgdGhlIHBhY2thZ2UuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeHIuR2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhsID0gbmV3IEV4Y2VsSHlwZXJMaW5rKHhyLkdldEF0dHJpYnV0ZSgibG9jYXRpb24iKSwgeHIuR2V0QXR0cmlidXRlKCJkaXNwbGF5IikpOworICAgICAgICAgICAgICAgICAgICAgICAgaGwuUm93U3Bhbm4gPSB0b1JvdyAtIGZyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICBobC5Db2xTcGFubiA9IHRvQ29sIC0gZnJvbUNvbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0dCA9IHhyLkdldEF0dHJpYnV0ZSgidG9vbHRpcCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHR0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaGwuVG9vbFRpcCA9IHR0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9oeXBlckxpbmtzLlNldFZhbHVlKGZyb21Sb3csIGZyb21Db2wsIGhsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvYWQgY2VsbHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBMb2FkQ2VsbHMoWG1sVGV4dFJlYWRlciB4cikKKyAgICAgICAgeworICAgICAgICAgICAgLy92YXIgY2VsbExpc3Q9bmV3IExpc3Q8SVJhbmdlSUQ+KCk7CisgICAgICAgICAgICAvL3ZhciByb3dMaXN0ID0gbmV3IExpc3Q8SVJhbmdlSUQ+KCk7CisgICAgICAgICAgICAvL3ZhciBmb3JtdWxhTGlzdCA9IG5ldyBMaXN0PElSYW5nZUlEPigpOworICAgICAgICAgICAgUmVhZFVudGlsKHhyLCAic2hlZXREYXRhIiwgIm1lcmdlQ2VsbHMiLCAiaHlwZXJsaW5rcyIsICJyb3dCcmVha3MiLCAiY29sQnJlYWtzIik7CisgICAgICAgICAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3M9bnVsbDsKKyAgICAgICAgICAgIHN0cmluZyB0eXBlPSIiOworICAgICAgICAgICAgaW50IHN0eWxlPTA7CisgICAgICAgICAgICBpbnQgcm93ID0gMDsKKyAgICAgICAgICAgIGludCBjb2wgPSAwOworICAgICAgICAgICAgeHIuUmVhZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAoIXhyLkVPRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRW5kRWxlbWVudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoeHIuTG9jYWxOYW1lID09ICJyb3ciKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB4ci5HZXRBdHRyaWJ1dGUoInIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBDb252ZXJ0LlRvSW50MzIocik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoRG9BZGRSb3coeHIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgMCwgQWRkUm93KHhyLCByb3cpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHhyLkdldEF0dHJpYnV0ZSgicyIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0eWxlcy5TZXRWYWx1ZShyb3csIDAsIGludC5QYXJzZSh4ci5HZXRBdHRyaWJ1dGUoInMiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeHIuTG9jYWxOYW1lID09ICJjIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKGNlbGwgIT0gbnVsbCkgY2VsbExpc3QuQWRkKGNlbGwpOworICAgICAgICAgICAgICAgICAgICAvL2NlbGwgPSBuZXcgRXhjZWxDZWxsKHRoaXMsIHhyLkdldEF0dHJpYnV0ZSgiciIpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB4ci5HZXRBdHRyaWJ1dGUoInIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9IYW5kbGUgY2VsbHMgd2l0aCBubyByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbCsrOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKHJvdywgY29sLCByb3csIGNvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2Uocik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBhZGRyZXNzLl9mcm9tQ29sOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vRGF0ZXR5cGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhyLkdldEF0dHJpYnV0ZSgidCIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9eHIuR2V0QXR0cmlidXRlKCJ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgdHlwZSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvL1N0eWxlCisgICAgICAgICAgICAgICAgICAgIGlmKHhyLkdldEF0dHJpYnV0ZSgicyIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPWludC5QYXJzZSh4ci5HZXRBdHRyaWJ1dGUoInMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIHN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgbnVsbCk7IC8vVE9ETzpCZXR0ZXIgUGVyZm9ybWFuY2UgPz8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB4ci5SZWFkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHhyLkxvY2FsTmFtZSA9PSAidiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZUZyb21YbWwoeHIsIHR5cGUsIHN0eWxlLCBhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoeHIuTG9jYWxOYW1lID09ICJmIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ID0geHIuR2V0QXR0cmlidXRlKCJ0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCB4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2Zvcm11bGFMaXN0LkFkZChjZWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09ICJzaGFyZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzaSA9IHhyLkdldEF0dHJpYnV0ZSgic2kiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZkluZGV4ID0gaW50LlBhcnNlKHNpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm9ybXVsYXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgc2ZJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZkFkZHJlc3MgPSB4ci5HZXRBdHRyaWJ1dGUoInJlZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3JtdWxhID0gQ29udmVydFV0aWwuRXhjZWxEZWNvZGVTdHJpbmcoeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm11bGEgIT0gIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKHNmSW5kZXgsIG5ldyBGb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpIHsgSW5kZXggPSBzZkluZGV4LCBGb3JtdWxhID0gZm9ybXVsYSwgQWRkcmVzcyA9IGZBZGRyZXNzLCBTdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3csIFN0YXJ0Q29sID0gYWRkcmVzcy5fZnJvbUNvbCB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHIuUmVhZCgpOyAgLy9Tb21ldGhpbmcgaXMgd3JvbmcgaW4gdGhlIHNoZWV0LCByZWFkIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID09ICJhcnJheSIpIC8vVE9ETzogQXJyYXkgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydCB5ZXQuIFJlYWQgdGhlIGZvcm11bGEgZm9yIHRoZSBzdGFydCBjZWxsIG9ubHkuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhQWRkcmVzcyA9IHhyLkdldEF0dHJpYnV0ZSgicmVmIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZm9ybXVsYSA9IHhyLlJlYWRFbGVtZW50Q29udGVudEFzU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWZJbmRleCA9IEdldE1heFNoYXJlRnVuY3Rpb25JbmRleCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBhZkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKGFmSW5kZXgsIG5ldyBGb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpIHsgSW5kZXggPSBhZkluZGV4LCBGb3JtdWxhID0gZm9ybXVsYSwgQWRkcmVzcyA9IGFBZGRyZXNzLCBTdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3csIFN0YXJ0Q29sID0gYWRkcmVzcy5fZnJvbUNvbCwgSXNBcnJheSA9IHRydWUgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyA/Pz8gc29tZSBvdGhlciB0eXBlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsgIC8vU29tZXRoaW5nIGlzIHdyb25nIGluIHRoZSBzaGVldCwgcmVhZCBuZXh0CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh4ci5Mb2NhbE5hbWUgPT0gImlzIikgICAvL0lubGluZSBzdHJpbmcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSAidCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgQ29udmVydFV0aWwuRXhjZWxEZWNvZGVTdHJpbmcoeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9jZWxsLl92YWx1ZSA9IHhyLlJlYWRJbm5lclhtbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCB4ci5SZWFkT3V0ZXJYbWwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgInJ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBfZmxhZ3MuU2V0RmxhZ1ZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIHRydWUsIENlbGxGbGFncy5SaWNoVGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2NlbGwuSXNSaWNoVGV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9pZiAoY2VsbCAhPSBudWxsKSBjZWxsTGlzdC5BZGQoY2VsbCk7CisKKyAgICAgICAgICAgIC8vX2NlbGxzID0gbmV3IFJhbmdlQ29sbGVjdGlvbihjZWxsTGlzdCk7CisgICAgICAgICAgICAvL19yb3dzID0gbmV3IFJhbmdlQ29sbGVjdGlvbihyb3dMaXN0KTsKKyAgICAgICAgICAgIC8vX2Zvcm11bGFDZWxscyA9IG5ldyBSYW5nZUNvbGxlY3Rpb24oZm9ybXVsYUxpc3QpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIERvQWRkUm93KFhtbFRleHRSZWFkZXIgeHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjID0geHIuR2V0QXR0cmlidXRlKCJyIik9PW51bGwgPyAwOjE7CisgICAgICAgICAgICBpZiAoeHIuR2V0QXR0cmlidXRlKCJzcGFucyIpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHhyLkF0dHJpYnV0ZUNvdW50ID4gYzsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMb2FkIG1lcmdlZCBjZWxscworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InhyIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgTG9hZE1lcmdlQ2VsbHMoWG1sVGV4dFJlYWRlciB4cikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUmVhZFVudGlsKHhyLCAibWVyZ2VDZWxscyIsICJoeXBlcmxpbmtzIiwgInJvd0JyZWFrcyIsICJjb2xCcmVha3MiKSAmJiAheHIuRU9GKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh4ci5SZWFkKCkpCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh4ci5Mb2NhbE5hbWUgIT0gIm1lcmdlQ2VsbCIpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFkZHJlc3MgPSB4ci5HZXRBdHRyaWJ1dGUoInJlZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sOworICAgICAgICAgICAgICAgICAgICAgICAgLy9FeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKGFkZHJlc3MsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgKGludCByb3cgPSBmcm9tUm93OyByb3cgPD0gdG9Sb3c7IHJvdysrKQorICAgICAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmb3IgKGludCBjb2wgPSBmcm9tQ29sOyBjb2wgPD0gdG9Db2w7IGNvbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIF9mbGFncy5TZXRGbGFnVmFsdWUocm93LCBjb2wsIHRydWUsQ2VsbEZsYWdzLk1lcmdlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vX21lcmdlZENlbGxzLkxpc3QuQWRkKGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLkFkZChuZXcgRXhjZWxBZGRyZXNzKGFkZHJlc3MpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXBkYXRlIG1lcmdlZCBjZWxscworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN3Ij5UaGUgd3JpdGVyPC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFVwZGF0ZU1lcmdlZENlbGxzKFN0cmVhbVdyaXRlciBzdykKKyAgICAgICAgeworICAgICAgICAgICAgc3cuV3JpdGUoIjxtZXJnZUNlbGxzPiIpOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGFkZHJlc3MgaW4gX21lcmdlZENlbGxzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3LldyaXRlKCI8bWVyZ2VDZWxsIHJlZj1cInswfVwiIC8+IiwgYWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdy5Xcml0ZSgiPC9tZXJnZUNlbGxzPiIpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWRzIGEgcm93IGZyb20gdGhlIFhNTCByZWFkZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgUm93SW50ZXJuYWwgQWRkUm93KFhtbFRleHRSZWFkZXIgeHIsIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUm93SW50ZXJuYWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbGxhcHNlZD0oeHIuR2V0QXR0cmlidXRlKCJjb2xsYXBzZWQiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiY29sbGFwc2VkIik9PSAiMSIgPyB0cnVlIDogZmFsc2UpLAorICAgICAgICAgICAgICAgIE91dGxpbmVMZXZlbCA9ICh4ci5HZXRBdHRyaWJ1dGUoIm91dGxpbmVMZXZlbCIpID09IG51bGwgPyAoc2hvcnQpMCA6IHNob3J0LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgib3V0bGluZUxldmVsIiksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSwKKyAgICAgICAgICAgICAgICBIZWlnaHQgPSAoeHIuR2V0QXR0cmlidXRlKCJodCIpID09IG51bGwgPyAtMSA6IGRvdWJsZS5QYXJzZSh4ci5HZXRBdHRyaWJ1dGUoImh0IiksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSwKKyAgICAgICAgICAgICAgICBIaWRkZW4gPSAoeHIuR2V0QXR0cmlidXRlKCJoaWRkZW4iKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiaGlkZGVuIikgPT0gIjEiID8gdHJ1ZSA6IGZhbHNlKSwKKyAgICAgICAgICAgICAgICBQaG9uZXRpYyA9IHhyLkdldEF0dHJpYnV0ZSgicGgiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgicGgiKSA9PSAiMSIgPyB0cnVlIDogZmFsc2UsCisgICAgICAgICAgICAgICAgQ3VzdG9tSGVpZ2h0ID0geHIuR2V0QXR0cmlidXRlKCJjdXN0b21IZWlnaHQiKSA9PSBudWxsID8gZmFsc2UgOiB4ci5HZXRBdHRyaWJ1dGUoImN1c3RvbUhlaWdodCIpPT0iMSIKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0VmFsdWVGcm9tWG1sKFhtbFRleHRSZWFkZXIgeHIsIHN0cmluZyB0eXBlLCBpbnQgc3R5bGVJRCwgaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9YbWxOb2RlIHZub2RlID0gY29sTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnYiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIC8vaWYgKHZub2RlID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gInMiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpeCA9IHhyLlJlYWRFbGVtZW50Q29udGVudEFzSW50KCk7CisgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgX3BhY2thZ2UuV29ya2Jvb2suX3NoYXJlZFN0cmluZ3NMaXN0W2l4XS5UZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoX3BhY2thZ2UuV29ya2Jvb2suX3NoYXJlZFN0cmluZ3NMaXN0W2l4XS5pc1JpY2hUZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZsYWdzLlNldEZsYWdWYWx1ZShyb3csIGNvbCwgdHJ1ZSwgQ2VsbEZsYWdzLlJpY2hUZXh0KTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3RyIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCAoeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSE9IjAiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJlIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBHZXRFcnJvclR5cGUoeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2ID0geHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB2YXIgbmYgPSBXb3JrYm9vay5TdHlsZXMuQ2VsbFhmc1tzdHlsZUlEXS5OdW1iZXJGb3JtYXRJZDsKKyAgICAgICAgICAgICAgICBpZiAoKG5mID49IDE0ICYmIG5mIDw9IDIyKSB8fCAobmYgPj0gNDUgJiYgbmYgPD0gNDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2LCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmVzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtib29rLkRhdGUxOTA0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSBFeGNlbFdvcmtib29rLmRhdGUxOTA0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA+PSAtNjU3NDM1LjAgJiYgcmVzIDwgMjk1ODQ2NS45OTk5OTk5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIERhdGVUaW1lLkZyb21PQURhdGUocmVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2LCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgZG91YmxlLk5hTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIG9iamVjdCBHZXRFcnJvclR5cGUoc3RyaW5nIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFeGNlbEVycm9yVmFsdWUuUGFyc2Uodi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIC8vc3dpdGNoKHYuVG9VcHBlcigpKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBjYXNlICIjRElWLzAhIjoKKyAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZS5jcmUoZUVycm9yVHlwZS5EaXYwKTsKKyAgICAgICAgICAgIC8vICAgIGNhc2UgIiNSRUYhIjoKKyAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLlJlZik7CisgICAgICAgICAgICAvLyAgICBjYXNlICIjTi9BIjoKKyAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLk5BKTsKKyAgICAgICAgICAgIC8vICAgIGNhc2UgIiNOQU1FPyI6CisgICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OYW1lKTsKKyAgICAgICAgICAgIC8vICAgIGNhc2UgIiNOVUxMISI6CisgICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OdWxsKTsKKyAgICAgICAgICAgIC8vICAgIGNhc2UgIiNOVU0hIjoKKyAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLk51bSk7CisgICAgICAgICAgICAvLyAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyAgICAgICAgLy9wcml2YXRlIHN0cmluZyBHZXRTaGFyZWRTdHJpbmcoaW50IHN0cmluZ0lEKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgc3RyaW5nIHJldFZhbHVlID0gbnVsbDsKKyAgICAgICAgLy8gICAgWG1sTm9kZUxpc3Qgc3RyaW5nTm9kZXMgPSB4bFBhY2thZ2UuV29ya2Jvb2suU2hhcmVkU3RyaW5nc1htbC5TZWxlY3ROb2RlcyhzdHJpbmcuRm9ybWF0KCIvL2Q6c2kiLCBzdHJpbmdJRCksIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAvLyAgICBYbWxOb2RlIHN0cmluZ05vZGUgPSBzdHJpbmdOb2Rlc1tzdHJpbmdJRF07CisgICAgICAgIC8vICAgIGlmIChzdHJpbmdOb2RlICE9IG51bGwpCisgICAgICAgIC8vICAgICAgICByZXRWYWx1ZSA9IHN0cmluZ05vZGUuSW5uZXJUZXh0OworICAgICAgICAvLyAgICByZXR1cm4gKHJldFZhbHVlKTsKKyAgICAgICAgLy99CisgICAgICAgICNlbmRyZWdpb24KKwkJI3JlZ2lvbiBIZWFkZXJGb290ZXIKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGhlYWRlciBhbmQgZm9vdGVyIGNsYXNzIHdoaWNoIGFsbG93cyB5b3UgdG8gCisJCS8vLyBzZXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZvciBhbGwgb2RkLCBldmVuIGFuZCBmaXJzdCBwYWdlcyBvZiB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRvIGZvcm1hdCB0aGUgdGV4dCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdAorICAgICAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgorICAgICAgICAvLy8gPGxpc3RoZWFkZXI+PHRlcm0+UHJlZml4PC90ZXJtPjxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+PC9saXN0aGVhZGVyPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtVPC90ZXJtPjxkZXNjcmlwdGlvbj5VbmRlcmxpbmVkPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgICAgICAgIC8vLyA8aXRlbT48dGVybT4mYW1wO0U8L3Rlcm0+PGRlc2NyaXB0aW9uPkRvdWJsZSBVbmRlcmxpbmU8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPiZhbXA7Szp4eHh4eHg8L3Rlcm0+PGRlc2NyaXB0aW9uPkNvbG9yLiBleCAmYW1wO0s6RkYwMDAwIGZvciByZWQ8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPiZhbXA7IkZvbnQsUmVndWxhciBCb2xkIEl0YWxpYyI8L3Rlcm0+PGRlc2NyaXB0aW9uPkNoYW5nZXMgdGhlIGZvbnQuIFJlZ3VsYXIgb3IgQm9sZCBvciBJdGFsaWMgb3IgQm9sZCBJdGFsaWMgY2FuIGJlIHVzZWQuIGV4ICZhbXA7IkFyaWFsLEJvbGQgSXRhbGljIjwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtubjwvdGVybT48ZGVzY3JpcHRpb24+Q2hhbmdlIGZvbnQgc2l6ZS4gbm4gaXMgYW4gaW50ZWdlci4gZXggJmFtcDsyNDwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtHPC90ZXJtPjxkZXNjcmlwdGlvbj5QbGFjZWhvbGRlciBmb3IgaW1hZ2VzLiBJbWFnZXMgY2FuIG5vdCBiZSBhZGRlZCBieSB0aGUgbGlicmFyeSwgYnV0IGl0cyBwb3NzaWJsZSB0byB1c2UgaW4gYSB0ZW1wbGF0ZS48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyIEhlYWRlckZvb3RlcgorCQl7CisJCQlnZXQKKwkJCXsKKwkJCQlpZiAoX2hlYWRlckZvb3RlciA9PSBudWxsKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgWG1sTm9kZSBoZWFkZXJGb290ZXJOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmhlYWRlckZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyRm9vdGVyTm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRm9vdGVyTm9kZT0gQ3JlYXRlTm9kZSgiZDpoZWFkZXJGb290ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgX2hlYWRlckZvb3RlciA9IG5ldyBFeGNlbEhlYWRlckZvb3RlcihOYW1lU3BhY2VNYW5hZ2VyLCBoZWFkZXJGb290ZXJOb2RlLCB0aGlzKTsKKwkJCQl9ICAgICAgICAgICAgICAgIAorCQkJCXJldHVybiAoX2hlYWRlckZvb3Rlcik7CisJCQl9CisJCX0KKwkJI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gIlByaW50ZXJTZXR0aW5ncyIKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJpbnRlciBzZXR0aW5ncworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQcmludGVyU2V0dGluZ3MgUHJpbnRlclNldHRpbmdzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcyA9IG5ldyBFeGNlbFByaW50ZXJTZXR0aW5ncyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBwcy5TY2hlbWFOb2RlT3JkZXIgPSBTY2hlbWFOb2RlT3JkZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworCQkjZW5kcmVnaW9uIC8vIEVORCBXb3Jrc2hlZXQgUHVibGljIFByb3BlcnRpZXMKKworCQkjcmVnaW9uIFdvcmtzaGVldCBQdWJsaWMgTWV0aG9kcworICAgICAgICAKKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIGNlbGwgd2l0aGluIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXIgaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJjb2wiPlRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+CQkKKyAgICAgICAgLy9pbnRlcm5hbCBFeGNlbENlbGwgQ2VsbChpbnQgcm93LCBpbnQgY29sKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgcmV0dXJuIG5ldyBFeGNlbENlbGwoX3ZhbHVlcywgcm93LCBjb2wpOworICAgICAgICAvL30KKyAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gYSByYW5nZSBvZiBjZWxscworICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgCisgICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlIENlbGxzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFJhbmdlKHRoaXMsIDEsIDEsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzZWxlY3RlZCByYW5nZSBvZiBjZWxscworICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgCisgICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlIFNlbGVjdGVkUmFuZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUmFuZ2UodGhpcywgVmlldy5TZWxlY3RlZFJhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBNZXJnZUNlbGxzQ29sbGVjdGlvbiBfbWVyZ2VkQ2VsbHMgPSBuZXcgTWVyZ2VDZWxsc0NvbGxlY3Rpb24oKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcmVzc2VzIHRvIG1lcmdlZCByYW5nZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIE1lcmdlQ2VsbHNDb2xsZWN0aW9uIE1lcmdlZENlbGxzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9tZXJnZWRDZWxsczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gYW4gaW5kaXZpZHVhbCByb3cgd2l0aGluIHRoZSB3b3Jrc2hlZXQgc28geW91IGNhbiBzZXQgaXRzIHByb3BlcnRpZXMuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93IG51bWJlciBpbiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHVibGljIEV4Y2VsUm93IFJvdyhpbnQgcm93KQorCQl7CisgICAgICAgICAgICAvL0V4Y2VsUm93IHI7CisgICAgICAgICAgICAvL3Vsb25nIGlkID0gRXhjZWxSb3cuR2V0Um93SUQoX3NoZWV0SUQsIHJvdyk7CisgICAgICAgICAgICAvL1RPRE86IEZpeGEuCisgICAgICAgICAgICAvL3ZhciB2ID0gX3ZhbHVlcy5HZXRWYWx1ZShyb3csIDApOworICAgICAgICAgICAgLy9pZiAodiE9bnVsbCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgdmFyIHJpPShSb3dJbnRlcm5hbCl2OworICAgICAgICAgICAgLy8gICAgciA9IG5ldyBFeGNlbFJvdyh0aGlzLCByb3cpCisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgLy9yID0gbmV3IEV4Y2VsUm93KHRoaXMsIHJvdyk7CisgICAgICAgICAgICAgICAgLy9fdmFsdWVzLlNldFZhbHVlKHJvdywgMCwgcik7CisgICAgICAgICAgICAgICAgLy9fcm93cy5BZGQocik7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAocm93IDwgMSB8fCByb3cgPiBFeGNlbFBhY2thZ2UuTWF4Um93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJSb3cgbnVtYmVyIG91dCBvZiBib3VuZHMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUm93KHRoaXMsIHJvdyk7CisgICAgICAgICAgICAvL3JldHVybiByOworCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIGNvbHVtbiB3aXRoaW4gdGhlIHdvcmtzaGVldCBzbyB5b3UgY2FuIHNldCBpdHMgcHJvcGVydGllcy4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJjb2wiPlRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxDb2x1bW4gQ29sdW1uKGludCBjb2wpCisJCXsgICAgICAgICAgICAKKyAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAoY29sIDwgMSB8fCBjb2wgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDb2x1bW4gbnVtYmVyIG91dCBvZiBib3VuZHMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgY29sdW1uID0gX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjb2wpIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAgICAgaWYgKGNvbHVtbiE9bnVsbCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5NaW4gIT0gY29sdW1uLkNvbHVtbk1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhDb2wgPSBjb2x1bW4uQ29sdW1uTWF4OworICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gY29sOworICAgICAgICAgICAgICAgICAgICBFeGNlbENvbHVtbiBjb3B5ID0gQ29weUNvbHVtbihjb2x1bW4sIGNvbCArIDEsIG1heENvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByPTAsIGM9Y29sOworICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLlByZXZDZWxsKHJlZiByLCByZWYgYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBfdmFsdWVzLkdldFZhbHVlKDAsIGMpIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Q29sID0gY29sdW1uLkNvbHVtbk1heDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heENvbCA+PSBjb2wpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5Db2x1bW5NYXggPSBjb2wtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhDb2wgPiBjb2wpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxDb2x1bW4gbmV3QyA9IENvcHlDb2x1bW4oY29sdW1uLCBjb2wgKyAxLCBtYXhDb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvcHlDb2x1bW4oY29sdW1uLCBjb2wsIGNvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9mb3JlYWNoIChFeGNlbENvbHVtbiBjaGVja0NvbHVtbiBpbiBfY29sdW1ucykKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBpZiAoY29sID4gY2hlY2tDb2x1bW4uQ29sdW1uTWluICYmIGNvbCA8PSBjaGVja0NvbHVtbi5Db2x1bW5NYXgpCisgICAgICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgICAgIC8vICAgICAgICBpbnQgbWF4Q29sID0gY2hlY2tDb2x1bW4uQ29sdW1uTWF4OworICAgICAgICAgICAgICAgIC8vICAgICAgICBjaGVja0NvbHVtbi5Db2x1bW5NYXggPSBjb2wgLSAxOworICAgICAgICAgICAgICAgIC8vICAgICAgICBpZiAobWF4Q29sID4gY29sKQorICAgICAgICAgICAgICAgIC8vICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBFeGNlbENvbHVtbiBuZXdDID0gQ29weUNvbHVtbihjaGVja0NvbHVtbiwgY29sICsgMSwgbWF4Q29sKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gQ29weUNvbHVtbihjaGVja0NvbHVtbiwgY29sLGNvbCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIGNvbHVtbiA9IG5ldyBFeGNlbENvbHVtbih0aGlzLCBjb2wpOworICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoMCwgY29sLCBjb2x1bW4pOworICAgICAgICAgICAgICAgIC8vX2NvbHVtbnMuQWRkKGNvbHVtbik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjsKKwkJfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOYW1lOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sdW1uIENvcHlDb2x1bW4oRXhjZWxDb2x1bW4gYywgaW50IGNvbCwgaW50IG1heENvbCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxDb2x1bW4gbmV3QyA9IG5ldyBFeGNlbENvbHVtbih0aGlzLCBjb2wpOworICAgICAgICAgICAgbmV3Qy5Db2x1bW5NYXggPSBtYXhDb2wgPCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyA/IG1heENvbCA6IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICAgICAgICAgICAgaWYgKGMuU3R5bGVOYW1lICE9ICIiKQorICAgICAgICAgICAgICAgIG5ld0MuU3R5bGVOYW1lID0gYy5TdHlsZU5hbWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV3Qy5TdHlsZUlEID0gYy5TdHlsZUlEOworCisgICAgICAgICAgICBuZXdDLk91dGxpbmVMZXZlbCA9IGMuT3V0bGluZUxldmVsOworICAgICAgICAgICAgbmV3Qy5QaG9uZXRpYyA9IGMuUGhvbmV0aWM7CisgICAgICAgICAgICBuZXdDLkJlc3RGaXQgPSBjLkJlc3RGaXQ7CisgICAgICAgICAgICAvL19jb2x1bW5zLkFkZChuZXdDKTsKKyAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoMCwgY29sLCBuZXdDKTsKKyAgICAgICAgICAgIG5ld0MuX3dpZHRoID0gYy5fd2lkdGg7CisgICAgICAgICAgICBuZXdDLl9oaWRkZW4gPSBjLl9oaWRkZW47CisgICAgICAgICAgICByZXR1cm4gbmV3QzsKKyAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1ha2UgdGhlIGN1cnJlbnQgd29ya3NoZWV0IGFjdGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgU2VsZWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVmlldy5UYWJTZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAvL1NlbGVjdChBZGRyZXNzLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZWxlY3RzIGEgcmFuZ2UgaW4gdGhlIHdvcmtzaGVldC4gVGhlIGFjdGl2ZSBjZWxsIGlzIHRoZSB0b3Btb3N0IGNlbGwuCisgICAgICAgIC8vLyBNYWtlIHRoZSBjdXJyZW50IHdvcmtzaGVldCBhY3RpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+QW4gYWRkcmVzcyByYW5nZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNlbGVjdChzdHJpbmcgQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgU2VsZWN0KEFkZHJlc3MsIHRydWUpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlbGVjdHMgYSByYW5nZSBpbiB0aGUgd29ya3NoZWV0LiBUaGUgYWN0aWNlIGNlbGwgaXMgdGhlIHRvcG1vc3QgY2VsbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJBZGRyZXNzIj5BIHJhbmdlIG9mIGNlbGxzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTZWxlY3RTaGVldCI+TWFrZSB0aGUgc2hlZXQgYWN0aXZlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2VsZWN0KHN0cmluZyBBZGRyZXNzLCBib29sIFNlbGVjdFNoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgaW50IGZyb21Db2wsIGZyb21Sb3csIHRvQ29sLCB0b1JvdzsKKyAgICAgICAgICAgIC8vR2V0IHJvd3MgYW5kIGNvbHVtbnMgYW5kIHZhbGlkYXRlIGFzIHdlbGwKKyAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoQWRkcmVzcywgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7CisKKyAgICAgICAgICAgIGlmIChTZWxlY3RTaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWaWV3LlRhYlNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZpZXcuU2VsZWN0ZWRSYW5nZSA9IEFkZHJlc3M7CisgICAgICAgICAgICBWaWV3LkFjdGl2ZUNlbGwgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2VsZWN0cyBhIHJhbmdlIGluIHRoZSB3b3Jrc2hlZXQuIFRoZSBhY3RpdmUgY2VsbCBpcyB0aGUgdG9wbW9zdCBjZWxsIG9mIHRoZSBmaXJzdCBhZGRyZXNzLgorICAgICAgICAvLy8gTWFrZSB0aGUgY3VycmVudCB3b3Jrc2hlZXQgYWN0aXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPkFuIGFkZHJlc3MgcmFuZ2U8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZWxlY3QoRXhjZWxBZGRyZXNzIEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICBTZWxlY3QoQWRkcmVzcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2VsZWN0cyBhIHJhbmdlIGluIHRoZSB3b3Jrc2hlZXQuIFRoZSBhY3RpdmUgY2VsbCBpcyB0aGUgdG9wbW9zdCBjZWxsIG9mIHRoZSBmaXJzdCBhZGRyZXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPkEgcmFuZ2Ugb2YgY2VsbHM8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlNlbGVjdFNoZWV0Ij5NYWtlIHRoZSBzaGVldCBhY3RpdmU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZWxlY3QoRXhjZWxBZGRyZXNzIEFkZHJlc3MsIGJvb2wgU2VsZWN0U2hlZXQpCisgICAgICAgIHsKKworICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChTZWxlY3RTaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWaWV3LlRhYlNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZyBzZWxBZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKEFkZHJlc3MuU3RhcnQuUm93LCBBZGRyZXNzLlN0YXJ0LkNvbHVtbikgKyAiOiIgKyBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoQWRkcmVzcy5FbmQuUm93LCBBZGRyZXNzLkVuZC5Db2x1bW4pOworICAgICAgICAgICAgaWYgKEFkZHJlc3MuQWRkcmVzc2VzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGEgaW4gQWRkcmVzcy5BZGRyZXNzZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWxBZGRyZXNzICs9ICIgIiArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhhLlN0YXJ0LlJvdywgYS5TdGFydC5Db2x1bW4pICsgIjoiICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGEuRW5kLlJvdywgYS5FbmQuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWaWV3LlNlbGVjdGVkUmFuZ2UgPSBzZWxBZGRyZXNzOworICAgICAgICAgICAgVmlldy5BY3RpdmVDZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKEFkZHJlc3MuU3RhcnQuUm93LCBBZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisgICAgICAgIH0KKworCQkjcmVnaW9uIEluc2VydFJvdworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnNlcnRzIGEgbmV3IHJvdyBpbnRvIHRoZSBzcHJlYWRzaGVldC4gIEV4aXN0aW5nIHJvd3MgYmVsb3cgdGhlIHBvc2l0aW9uIGFyZSAKKyAgICAgICAgLy8vIHNoaWZ0ZWQgZG93bi4gIEFsbCBmb3JtdWxhIGFyZSB1cGRhdGVkIHRvIHRha2UgYWNjb3VudCBvZiB0aGUgbmV3IHJvdy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dGcm9tIj5UaGUgcG9zaXRpb24gb2YgdGhlIG5ldyByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPk51bWJlciBvZiByb3dzIHRvIGluc2VydDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEluc2VydFJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluc2VydFJvdyhyb3dGcm9tLCByb3dzLCAwKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBJbnNlcnRzIGEgbmV3IHJvdyBpbnRvIHRoZSBzcHJlYWRzaGVldC4gIEV4aXN0aW5nIHJvd3MgYmVsb3cgdGhlIHBvc2l0aW9uIGFyZSAKKwkJLy8vIHNoaWZ0ZWQgZG93bi4gIEFsbCBmb3JtdWxhIGFyZSB1cGRhdGVkIHRvIHRha2UgYWNjb3VudCBvZiB0aGUgbmV3IHJvdy4KKwkJLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dGcm9tIj5UaGUgcG9zaXRpb24gb2YgdGhlIG5ldyByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPk51bWJlciBvZiByb3dzIHRvIGluc2VydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvcHlTdHlsZXNGcm9tUm93Ij5Db3B5IFN0eWxlcyBmcm9tIHRoaXMgcm93LiBBcHBsaWVkIHRvIGFsbCBpbnNlcnRlZCByb3dzPC9wYXJhbT4KKwkJcHVibGljIHZvaWQgIEluc2VydFJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MsIGludCBjb3B5U3R5bGVzRnJvbVJvdykKKwkJeworICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgZCA9IERpbWVuc2lvbjsKKworICAgICAgICAgICAgaWYgKHJvd0Zyb20gPCAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJyb3dGcm9tIGNhbid0IGJlIGxlc3NlciB0aGF0IDEiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQ2hlY2sgdGhhdCBjZWxscyBhcmVuJ3Qgc2hpZnRlZCBvdXRzaWRlIHRoZSBib3VuZHJpZXMKKyAgICAgICAgICAgIGlmIChkICE9IG51bGwgJiYgZC5FbmQuUm93ID4gcm93RnJvbSAmJiBkLkVuZC5Sb3cgKyByb3dzID4gRXhjZWxQYWNrYWdlLk1heFJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkNhbid0IGluc2VydC4gUm93cyB3aWxsIGJlIHNoaWZ0ZWQgb3V0c2lkZSB0aGUgYm91bmRyaWVzIG9mIHRoZSB3b3Jrc2hlZXQuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2NrICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF92YWx1ZXMuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7CisgICAgICAgICAgICAgICAgX3N0eWxlcy5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7CisgICAgICAgICAgICAgICAgX3R5cGVzLkluc2VydChyb3dGcm9tLCAwLCByb3dzLCAwKTsKKyAgICAgICAgICAgICAgICBfY29tbWVudHNTdG9yZS5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7CisgICAgICAgICAgICAgICAgX2h5cGVyTGlua3MuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgICAgICAgICAgIF9mbGFncy5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZiBpbiBfc2hhcmVkRm9ybXVsYXMuVmFsdWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuU3RhcnRSb3cgPj0gcm93RnJvbSkgZi5TdGFydFJvdyArPSByb3dzOworICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKGYuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhLl9mcm9tUm93ID49IHJvd0Zyb20pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuX2Zyb21Sb3cgKz0gcm93czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuX3RvUm93ICs9IHJvd3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5fdG9Sb3cgPj0gcm93RnJvbSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYS5fdG9Sb3cgKz0gcm93czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoYS5fZnJvbVJvdywgYS5fZnJvbUNvbCwgYS5fdG9Sb3csIGEuX3RvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhmLkZvcm11bGEsIHJvd3MsIDAsIHJvd0Zyb20sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX2Zvcm11bGFzKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjc2UuVmFsdWUgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKGNzZS5WYWx1ZS5Ub1N0cmluZygpLCByb3dzLCAwLCByb3dGcm9tLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpeE1lcmdlZENlbGxzUm93KHJvd0Zyb20sIHJvd3MsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weVN0eWxlc0Zyb21Sb3cgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNzZVMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50Pihfc3R5bGVzLCBjb3B5U3R5bGVzRnJvbVJvdywgMCwgY29weVN0eWxlc0Zyb21Sb3csIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsgLy9GaXhlcyBpc3N1ZSAxNTA2OCAsIDE1MDkwCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGNzZVMuTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHJvd3M7IHIrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKHJvd0Zyb20gKyByLCBjc2VTLkNvbHVtbiwgY3NlUy5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBUYWJsZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YmwuQWRkcmVzcyA9IHRibC5BZGRyZXNzLkFkZFJvdyhyb3dGcm9tLCByb3dzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5zZXJ0cyBhIG5ldyBjb2x1bW4gaW50byB0aGUgc3ByZWFkc2hlZXQuICBFeGlzdGluZyBjb2x1bW5zIGJlbG93IHRoZSBwb3NpdGlvbiBhcmUgCisgICAgICAgIC8vLyBzaGlmdGVkIGRvd24uICBBbGwgZm9ybXVsYSBhcmUgdXBkYXRlZCB0byB0YWtlIGFjY291bnQgb2YgdGhlIG5ldyBjb2x1bW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uRnJvbSI+VGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5zIj5OdW1iZXIgb2YgY29sdW1ucyB0byBpbnNlcnQ8L3BhcmFtPiAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIEluc2VydENvbHVtbihpbnQgY29sdW1uRnJvbSwgaW50IGNvbHVtbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluc2VydENvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zLCAwKTsKKyAgICAgICAgfQorICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIEluc2VydHMgYSBuZXcgY29sdW1uIGludG8gdGhlIHNwcmVhZHNoZWV0LiAgRXhpc3RpbmcgY29sdW1uIHRvIHRoZSBsZWZ0IGFyZSAKKyAgICAgICAgLy8vIHNoaWZ0ZWQuICBBbGwgZm9ybXVsYSBhcmUgdXBkYXRlZCB0byB0YWtlIGFjY291bnQgb2YgdGhlIG5ldyBjb2x1bW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uRnJvbSI+VGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgY29sdW1uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5zIj5OdW1iZXIgb2YgY29sdW1ucyB0byBpbnNlcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3B5U3R5bGVzRnJvbUNvbHVtbiI+Q29weSBTdHlsZXMgZnJvbSB0aGlzIGNvbHVtbi4gQXBwbGllZCB0byBhbGwgaW5zZXJ0ZWQgY29sdW1uczwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEluc2VydENvbHVtbihpbnQgY29sdW1uRnJvbSwgaW50IGNvbHVtbnMsIGludCBjb3B5U3R5bGVzRnJvbUNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgIHZhciBkID0gRGltZW5zaW9uOworCisgICAgICAgICAgICBpZiAoY29sdW1uRnJvbSA8IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvbHVtbkZyb20gY2FuJ3QgYmUgbGVzc2VyIHRoYXQgMSIpKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQ2hlY2sgdGhhdCBjZWxscyBhcmVuJ3Qgc2hpZnRlZCBvdXRzaWRlIHRoZSBib3VuZHJpZXMKKyAgICAgICAgICAgIGlmIChkICE9IG51bGwgJiYgZC5FbmQuQ29sdW1uID4gY29sdW1uRnJvbSAmJiBkLkVuZC5Db2x1bW4gKyBjb2x1bW5zID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkNhbid0IGluc2VydC4gQ29sdW1ucyB3aWxsIGJlIHNoaWZ0ZWQgb3V0c2lkZSB0aGUgYm91bmRyaWVzIG9mIHRoZSB3b3Jrc2hlZXQuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2NrICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF92YWx1ZXMuSW5zZXJ0KDAsIGNvbHVtbkZyb20sIDAsIGNvbHVtbnMpOworICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX3N0eWxlcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX3R5cGVzLkluc2VydCgwLCBjb2x1bW5Gcm9tLCAwLCBjb2x1bW5zKTsKKyAgICAgICAgICAgICAgICBfY29tbWVudHNTdG9yZS5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX2h5cGVyTGlua3MuSW5zZXJ0KDAsIGNvbHVtbkZyb20sIDAsIGNvbHVtbnMpOworICAgICAgICAgICAgICAgIF9mbGFncy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZiBpbiBfc2hhcmVkRm9ybXVsYXMuVmFsdWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuU3RhcnRDb2wgPj0gY29sdW1uRnJvbSkgZi5TdGFydENvbCArPSBjb2x1bW5zOworICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKGYuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhLl9mcm9tQ29sID49IGNvbHVtbkZyb20pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuX2Zyb21Db2wgKz0gY29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuX3RvQ29sICs9IGNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5fdG9Db2wgPj0gY29sdW1uRnJvbSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYS5fdG9Db2wgKz0gY29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoYS5fZnJvbVJvdywgYS5fZnJvbUNvbCwgYS5fdG9Sb3csIGEuX3RvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhmLkZvcm11bGEsIDAsIGNvbHVtbnMsIDAsIGNvbHVtbkZyb20pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfZm9ybXVsYXMpOworICAgICAgICAgICAgICAgIHdoaWxlIChjc2UuTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzZS5WYWx1ZSBpcyBzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzZS5WYWx1ZSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoY3NlLlZhbHVlLlRvU3RyaW5nKCksIDAsIGNvbHVtbnMsIDAsIGNvbHVtbkZyb20pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRml4TWVyZ2VkQ2VsbHNDb2x1bW4oY29sdW1uRnJvbSwgY29sdW1ucywgZmFsc2UpOworCisgICAgICAgICAgICAgICAgdmFyIGNzZWMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAwLCAxLCAwLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICAgICAgdmFyIGxzdCA9IG5ldyBMaXN0PEV4Y2VsQ29sdW1uPigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb2wgaW4gY3NlYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2wgaXMgRXhjZWxDb2x1bW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxzdC5BZGQoKEV4Y2VsQ29sdW1uKWNvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbHN0LkNvdW50LTE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBsc3RbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjLl9jb2x1bW5NaW4gPj0gY29sdW1uRnJvbSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuX2NvbHVtbk1pbiArIGNvbHVtbnMgPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWluICs9IGNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWluID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLl9jb2x1bW5NYXggKyBjb2x1bW5zIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuX2NvbHVtbk1heCArPSBjb2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuX2NvbHVtbk1heCA9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuX2NvbHVtbk1heCA+PSBjb2x1bW5Gcm9tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2MgPSBjLl9jb2x1bW5NYXggLSBjb2x1bW5Gcm9tOworICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWF4ID0gY29sdW1uRnJvbSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBDb3B5Q29sdW1uKGMsIGNvbHVtbkZyb20gKyBjb2x1bW5zLCBjb2x1bW5Gcm9tICsgY29sdW1ucyArIGNjKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoY29weVN0eWxlc0Zyb21Db2x1bW4gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjb2x1bW5zOyBjKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2wgPSB0aGlzLkNvbHVtbihjb2x1bW5Gcm9tICsgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2wuU3R5bGVJRCA9IHRoaXMuQ29sdW1uKGNvcHlTdHlsZXNGcm9tQ29sdW1uKS5TdHlsZUlEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vQWRqdXN0IHRhYmxlcworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gVGFibGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkZyb20gPiB0YmwuQWRkcmVzcy5TdGFydC5Db2x1bW4gJiYgY29sdW1uRnJvbSA8PSB0YmwuQWRkcmVzcy5FbmQuQ29sdW1uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRUYWJsZUNvbHVtbnMoY29sdW1uRnJvbSwgY29sdW1ucywgdGJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRibC5BZGRyZXNzPXRibC5BZGRyZXNzLkFkZENvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEluc2VydFRhYmxlQ29sdW1ucyhpbnQgY29sdW1uRnJvbSwgaW50IGNvbHVtbnMsIEV4Y2VsVGFibGUgdGJsKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbm9kZSA9IHRibC5Db2x1bW5zWzBdLlRvcE5vZGUuUGFyZW50Tm9kZTsKKyAgICAgICAgICAgIHZhciBpeCA9IGNvbHVtbkZyb20gLSB0YmwuQWRkcmVzcy5TdGFydC5Db2x1bW4gLSAxOworICAgICAgICAgICAgdmFyIGluc1BvcyA9IG5vZGUuQ2hpbGROb2Rlc1tpeF07CisgICAgICAgICAgICBpeCArPSAyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5hbWUgPQorICAgICAgICAgICAgICAgICAgICB0YmwuQ29sdW1ucy5HZXRVbmlxdWVOYW1lKHN0cmluZy5Gb3JtYXQoIkNvbHVtbnswfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaXgrKykuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKTsKKyAgICAgICAgICAgICAgICBYbWxFbGVtZW50IHRhYmxlQ29sdW1uID0KKyAgICAgICAgICAgICAgICAgICAgKFhtbEVsZW1lbnQpIHRibC5UYWJsZVhtbC5DcmVhdGVOb2RlKFhtbE5vZGVUeXBlLkVsZW1lbnQsICJ0YWJsZUNvbHVtbiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5TZXRBdHRyaWJ1dGUoImlkIiwgKHRibC5Db2x1bW5zLkNvdW50ICsgaSArIDEpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpbnNQb3MgPSBub2RlLkluc2VydEFmdGVyKHRhYmxlQ29sdW1uLCBpbnNQb3MpOworICAgICAgICAgICAgfSAvL0NyZWF0ZSB0YmwgQ29sdW1uCisgICAgICAgICAgICB0YmwuX2NvbHMgPSBuZXcgRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24odGJsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYSB2YWx1ZSB0byB0aGUgcm93IG9mIG1lcmdlZCBjZWxscyB0byBmaXggZm9yIGluc2VydHMgb3IgZGVsZXRlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dzIj48L3BhcmFtPiAKKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWxldGUiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBGaXhNZXJnZWRDZWxsc1JvdyhpbnQgcm93LCBpbnQgcm93cywgYm9vbCBkZWxldGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWxldGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLl9jZWxscy5EZWxldGUocm93LCAwLCByb3dzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWVyZ2VkQ2VsbHMuX2NlbGxzLkluc2VydChyb3csIDAsIHJvd3MsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PGludD4gcmVtb3ZlSW5kZXggPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tZXJnZWRDZWxscy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoIF9tZXJnZWRDZWxsc1tpXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHIgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShfbWVyZ2VkQ2VsbHNbaV0pLCBuZXdBZGRyOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBZGRyID0gYWRkci5EZWxldGVSb3cocm93LCByb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdBZGRyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kZXguQWRkKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkciA9IGFkZHIuQWRkUm93KHJvdywgcm93cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3QWRkci5BZGRyZXNzICE9IGFkZHIuQWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIF9tZXJnZWRDZWxscy5fY2VsbHMuSW5zZXJ0KHJvdywgMCwgcm93cywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLlNldEluZGV4KG5ld0FkZHIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0W2ldID0gbmV3QWRkci5fYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByZW1vdmVJbmRleC5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0LlJlbW92ZUF0KHJlbW92ZUluZGV4W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgdmFsdWUgdG8gdGhlIHJvdyBvZiBtZXJnZWQgY2VsbHMgdG8gZml4IGZvciBpbnNlcnRzIG9yIGRlbGV0ZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1ucyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWxldGUiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBGaXhNZXJnZWRDZWxsc0NvbHVtbihpbnQgY29sdW1uLCBpbnQgY29sdW1ucywgYm9vbCBkZWxldGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWxldGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLl9jZWxscy5EZWxldGUoMCwgY29sdW1uLCAwLCBjb2x1bW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWVyZ2VkQ2VsbHMuX2NlbGxzLkluc2VydCgwLCBjb2x1bW4sIDAsIGNvbHVtbnMpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8aW50PiByZW1vdmVJbmRleCA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21lcmdlZENlbGxzLkNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShfbWVyZ2VkQ2VsbHNbaV0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxBZGRyZXNzQmFzZSBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoX21lcmdlZENlbGxzW2ldKSwgbmV3QWRkcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkciA9IGFkZHIuRGVsZXRlQ29sdW1uKGNvbHVtbiwgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3QWRkciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluZGV4LkFkZChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FkZHIgPSBhZGRyLkFkZENvbHVtbihjb2x1bW4sIGNvbHVtbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLlNldEluZGV4KG5ld0FkZHIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0W2ldID0gbmV3QWRkci5fYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByZW1vdmVJbmRleC5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0LlJlbW92ZUF0KHJlbW92ZUluZGV4W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgRml4U2hhcmVkRm9ybXVsYXNSb3dzKGludCBwb3NpdGlvbiwgaW50IHJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8Rm9ybXVsYXM+IGFkZGVkID0gbmV3IExpc3Q8Rm9ybXVsYXM+KCk7CisgICAgICAgICAgICBMaXN0PEZvcm11bGFzPiBkZWxldGVkID0gbmV3IExpc3Q8Rm9ybXVsYXM+KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBpZCBpbiBfc2hhcmVkRm9ybXVsYXMuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZiA9IF9zaGFyZWRGb3JtdWxhc1tpZF07CisgICAgICAgICAgICAgICAgaW50IGZyb21Db2wsIGZyb21Sb3csIHRvQ29sLCB0b1JvdzsKKworICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoZi5BZGRyZXNzLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIG91dCB0b1Jvdywgb3V0IHRvQ29sKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gZnJvbVJvdyAmJiBwb3NpdGlvbisoTWF0aC5BYnMocm93cykpIDw9IHRvUm93KSAvL0luc2VydC9kZWxldGUgaXMgd2hpdGhpbiB0aGUgc2hhcmUgZm9ybXVsYSBhZGRyZXNzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocm93cyA+IDApIC8vSW5zZXJ0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKSArICI6IiArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhwb3NpdGlvbiAtIDEsIHRvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JvdyAhPSBmcm9tUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm11bGFzIG5ld0YgPSBuZXcgRm9ybXVsYXMoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGLlN0YXJ0Q29sID0gZi5TdGFydENvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGLlN0YXJ0Um93ID0gcG9zaXRpb24gKyByb3dzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0YuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhwb3NpdGlvbiArIHJvd3MsIGZyb21Db2wpICsgIjoiICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHRvUm93ICsgcm93cywgdG9Db2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0YuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlRnJvbVIxQzEoRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzEoZi5Gb3JtdWxhLCBmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sKSwgcG9zaXRpb24sIGYuU3RhcnRDb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLkFkZChuZXdGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tUm93IC0gcm93cyA8IHRvUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sLCB0b1Jvdytyb3dzLCB0b0NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wpICsgIjoiICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHRvUm93ICsgcm93cywgdG9Db2wpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uIDw9IHRvUm93KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvd3MgPiAwKSAvL0luc2VydCBiZWZvcmUgc2hpZnQgZG93bgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLlN0YXJ0Um93ICs9IHJvd3M7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbC5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhmLkZvcm11bGEsIHJvd3MsIDAsIHBvc2l0aW9uLCAwKTsgLy9SZWNhbGMgdGhlIGNlbGxzIHBvc2l0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3cgKyByb3dzLCBmcm9tQ29sKSArICI6IiArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyh0b1JvdyArIHJvd3MsIHRvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSUQoaW50Lk1pblZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSBmcm9tUm93ICYmIHBvc2l0aW9uICsgTWF0aC5BYnMocm93cykgPiB0b1JvdykgIC8vRGVsZXRlIHRoZSBmb3JtdWxhIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQuQWRkKGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUm93ID0gdG9Sb3cgKyByb3dzIDwgcG9zaXRpb24gLSAxID8gcG9zaXRpb24gLSAxIDogdG9Sb3cgKyByb3dzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSBmcm9tUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVJvdyA9IGZyb21Sb3cgKyByb3dzIDwgcG9zaXRpb24gPyBwb3NpdGlvbiA6IGZyb21Sb3cgKyByb3dzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxzW2YuQWRkcmVzc10uU2V0U2hhcmVkRm9ybXVsYUlEKGYuSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZi5TdGFydFJvdyA9IGZyb21Sb3c7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbC5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhmLkZvcm11bGEsIHJvd3MsIDAsIHBvc2l0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFkZEZvcm11bGFzKGFkZGVkLCBwb3NpdGlvbiwgcm93cyk7CisKKyAgICAgICAgICAgIC8vUmVtb3ZlIGZvcm11bGFzCisgICAgICAgICAgICBmb3JlYWNoIChGb3JtdWxhcyBmIGluIGRlbGV0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NoYXJlZEZvcm11bGFzLlJlbW92ZShmLkluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9GaXggRm9ybXVsYXMKKyAgICAgICAgICAgIGFkZGVkID0gbmV3IExpc3Q8Rm9ybXVsYXM+KCk7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaWQgaW4gX3NoYXJlZEZvcm11bGFzLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGYgPSBfc2hhcmVkRm9ybXVsYXNbaWRdOworICAgICAgICAgICAgICAgIFVwZGF0ZVNoYXJlZEZvcm11bGFSb3cocmVmIGYsIHBvc2l0aW9uLCByb3dzLCByZWYgYWRkZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWRkRm9ybXVsYXMoYWRkZWQsIHBvc2l0aW9uLCByb3dzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRGb3JtdWxhcyhMaXN0PEZvcm11bGFzPiBhZGRlZCwgaW50IHBvc2l0aW9uLCBpbnQgcm93cykKKyAgICAgICAgeworICAgICAgICAgICAgLy9BZGQgbmV3IGZvcm11bGFzCisgICAgICAgICAgICBmb3JlYWNoIChGb3JtdWxhcyBmIGluIGFkZGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGYuSW5kZXggPSBHZXRNYXhTaGFyZUZ1bmN0aW9uSW5kZXgoZmFsc2UpOworICAgICAgICAgICAgICAgIF9zaGFyZWRGb3JtdWxhcy5BZGQoZi5JbmRleCwgZik7CisgICAgICAgICAgICAgICAgQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSUQoZi5JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlU2hhcmVkRm9ybXVsYVJvdyhyZWYgRm9ybXVsYXMgZm9ybXVsYSwgaW50IHN0YXJ0Um93LCBpbnQgcm93cywgcmVmIExpc3Q8Rm9ybXVsYXM+IG5ld0Zvcm11bGFzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZnJvbVJvdyxmcm9tQ29sLCB0b1JvdywgdG9Db2w7CisgICAgICAgICAgICBpbnQgbmV3Rm9ybXVsYXNDb3VudCA9IG5ld0Zvcm11bGFzLkNvdW50OworICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhmb3JtdWxhLkFkZHJlc3MsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOworICAgICAgICAgICAgLy9pbnQgcmVmU3BsaXRzID0gUmVnZXguU3BsaXQoZm9ybXVsYS5Gb3JtdWxhLCAiI1JFRiEiKS5HZXRVcHBlckJvdW5kKDApOworICAgICAgICAgICAgc3RyaW5nIGZvcm11YWxSMUMxOworICAgICAgICAgICAgaWYgKHJvd3MgPiAwIHx8IGZyb21Sb3cgPD0gc3RhcnRSb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9ybXVhbFIxQzEgPSBFeGNlbFJhbmdlQmFzZS5UcmFuc2xhdGVUb1IxQzEoZm9ybXVsYS5Gb3JtdWxhLCBmb3JtdWxhLlN0YXJ0Um93LCBmb3JtdWxhLlN0YXJ0Q29sKTsKKyAgICAgICAgICAgICAgICBmb3JtdWxhLkZvcm11bGEgPSBFeGNlbFJhbmdlQmFzZS5UcmFuc2xhdGVGcm9tUjFDMShmb3JtdWFsUjFDMSwgZnJvbVJvdywgZm9ybXVsYS5TdGFydENvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9ybXVhbFIxQzEgPSBFeGNlbFJhbmdlQmFzZS5UcmFuc2xhdGVUb1IxQzEoZm9ybXVsYS5Gb3JtdWxhLCBmb3JtdWxhLlN0YXJ0Um93LXJvd3MsIGZvcm11bGEuU3RhcnRDb2wpOworICAgICAgICAgICAgICAgIGZvcm11bGEuRm9ybXVsYSA9IEV4Y2VsUmFuZ2VCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKGZvcm11YWxSMUMxLCBmb3JtdWxhLlN0YXJ0Um93LCBmb3JtdWxhLlN0YXJ0Q29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vYm9vbCBpc1JlZiA9IGZhbHNlOworICAgICAgICAgICAgLy9Gb3JtdWxhcyByZXN0Rm9ybXVsYT1mb3JtdWxhOworICAgICAgICAgICAgc3RyaW5nIHByZXZGb3JtdWFsUjFDMSA9IGZvcm11YWxSMUMxOworICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gZnJvbVJvdzsgcm93IDw9IHRvUm93OyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBmcm9tQ29sOyBjb2wgPD0gdG9Db2w7IGNvbCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5ld0Zvcm11bGE7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjdXJyZW50Rm9ybXVsYVIxQzE7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb3dzID4gMCB8fCByb3cgPCBzdGFydFJvdykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMShmb3JtdWFsUjFDMSwgcm93LCBjb2wpLCByb3dzLCAwLCBzdGFydFJvdywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybXVsYVIxQzEgPSBFeGNlbFJhbmdlQmFzZS5UcmFuc2xhdGVUb1IxQzEobmV3Rm9ybXVsYSwgcm93LCBjb2wpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMShmb3JtdWFsUjFDMSwgcm93LXJvd3MsIGNvbCksIHJvd3MsIDAsIHN0YXJ0Um93LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGb3JtdWxhUjFDMSA9IEV4Y2VsUmFuZ2VCYXNlLlRyYW5zbGF0ZVRvUjFDMShuZXdGb3JtdWxhLCByb3csIGNvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb3JtdWxhUjFDMSAhPSBwcmV2Rm9ybXVhbFIxQzEpIC8vbmV3Rm9ybXVsYS5Db250YWlucygiI1JFRiEiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAocmVmU3BsaXRzID09IDAgfHwgUmVnZXguU3BsaXQobmV3Rm9ybXVsYSwgIiNSRUYhIikuR2V0VXBwZXJCb3VuZCgwKSAhPSByZWZTcGxpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaXNSZWYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSBmcm9tUm93ICYmIGNvbCA9PSBmcm9tQ29sKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGEuRm9ybXVsYSA9IG5ld0Zvcm11bGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Zvcm11bGFzLkNvdW50ID09IG5ld0Zvcm11bGFzQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZm9ybXVsYS5TdGFydFJvdywgZm9ybXVsYS5TdGFydENvbCwgcm93IC0gMSwgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uU3RhcnRSb3csIG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uU3RhcnRDb2wsIHJvdyAtIDEsIGNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZGb3JtdWxhID0gbmV3IEZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmRm9ybXVsYS5Gb3JtdWxhID0gbmV3Rm9ybXVsYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZGb3JtdWxhLlN0YXJ0Um93ID0gcm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkZvcm11bGEuU3RhcnRDb2wgPSBjb2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYXMuQWRkKHJlZkZvcm11bGEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXN0Rm9ybXVsYSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkZvcm11YWxSMUMxID0gY3VycmVudEZvcm11bGFSMUMxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBpc1JlZiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzUmVmID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAvL2lmIChyZXN0Rm9ybXVsYT09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuZXdGb3JtdWxhcy5Db3VudCA9PSBuZXdGb3JtdWxhc0NvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmb3JtdWxhLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZm9ybXVsYS5TdGFydFJvdywgZm9ybXVsYS5TdGFydENvbCwgcm93IC0gMSwgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAvL3sKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLlN0YXJ0Um93LCBuZXdGb3JtdWxhc1swXS5TdGFydENvbCwgcm93IC0gMSwgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc3RGb3JtdWxhID0gbmV3IEZvcm11bGFzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc3RGb3JtdWxhLkZvcm11bGEgPSBuZXdGb3JtdWxhOworICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXN0Rm9ybXVsYS5TdGFydFJvdyA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzdEZvcm11bGEuU3RhcnRDb2wgPSBjb2w7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25ld0Zvcm11bGFzLkFkZChyZXN0Rm9ybXVsYSk7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb3dzIDwgMCAmJiBmb3JtdWxhLlN0YXJ0Um93ID4gc3RhcnRSb3cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZvcm11bGEuU3RhcnRSb3cgKyByb3dzIDwgc3RhcnRSb3cpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JtdWxhLlN0YXJ0Um93ID0gc3RhcnRSb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcm11bGEuU3RhcnRSb3cgKz0gcm93czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3Rm9ybXVsYXMuQ291bnQgPiBuZXdGb3JtdWxhc0NvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLlN0YXJ0Um93LCBuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLlN0YXJ0Q29sLCB0b1JvdywgdG9Db2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIERlbGV0ZVJvdworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+QSByb3cgdG8gYmUgZGVsZXRlZDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBEZWxldGVSb3cocm93LCAxKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBzdGFydCByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPk51bWJlciBvZiByb3dzIHRvIGRlbGV0ZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAocm93RnJvbSA8IDEgfHwgcm93RnJvbSArIHJvd3MgPiBFeGNlbFBhY2thZ2UuTWF4Um93cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIlJvdyBvdXQgb2YgcmFuZ2UuIFNwYW5zIGZyb20gMSB0byAiICsgRXhjZWxQYWNrYWdlLk1heFJvd3MuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sgKHRoaXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3ZhbHVlcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgICAgICAgICAgIF90eXBlcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgICAgICAgICAgIF9zdHlsZXMuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgICAgICAgICBfZmxhZ3MuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgICAgICAgICBfY29tbWVudHNTdG9yZS5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgICAgICAgICAgIF9oeXBlckxpbmtzLkRlbGV0ZShyb3dGcm9tLCAwLCByb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisKKyAgICAgICAgICAgICAgICBBZGp1c3RGb3JtdWxhc1Jvdyhyb3dGcm9tLCByb3dzKTsKKyAgICAgICAgICAgICAgICBGaXhNZXJnZWRDZWxsc1Jvdyhyb3dGcm9tLCByb3dzLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gVGFibGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGJsLkFkZHJlc3MgPSB0YmwuQWRkcmVzcy5EZWxldGVSb3cocm93RnJvbSwgcm93cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBmcm9tIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj5UaGUgY29sdW1uIHRvIGJlIGRlbGV0ZWQ8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW4oaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlQ29sdW1uKGNvbHVtbiwxKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCBjb2x1bW4gZnJvbSB0aGUgd29ya3NoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbkZyb20iPlRoZSBzdGFydCBjb2x1bW48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbnMiPk51bWJlciBvZiBjb2x1bW5zIHRvIGRlbGV0ZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUNvbHVtbihpbnQgY29sdW1uRnJvbSwgaW50IGNvbHVtbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb2x1bW5Gcm9tIDwgMSB8fCBjb2x1bW5Gcm9tICsgY29sdW1ucyA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNvbHVtbiBvdXQgb2YgcmFuZ2UuIFNwYW5zIGZyb20gMSB0byAiICsgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sgKHRoaXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbCA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgY29sdW1uRnJvbSkgYXMgRXhjZWxDb2x1bW47CisgICAgICAgICAgICAgICAgaWYgKGNvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAwOyAKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjb2x1bW5Gcm9tOworICAgICAgICAgICAgICAgICAgICBpZihfdmFsdWVzLlByZXZDZWxsKHJlZiByLHJlZiBjKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbC5fY29sdW1uTWF4ID49IGNvbHVtbkZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLkNvbHVtbk1heD1jb2x1bW5Gcm9tLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfdmFsdWVzLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX3R5cGVzLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX2Zvcm11bGFzLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX3N0eWxlcy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOworICAgICAgICAgICAgICAgIF9mbGFncy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOworICAgICAgICAgICAgICAgIF9jb21tZW50c1N0b3JlLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CisgICAgICAgICAgICAgICAgX2h5cGVyTGlua3MuRGVsZXRlKDAsIGNvbHVtbkZyb20sIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBjb2x1bW5zKTsKKworICAgICAgICAgICAgICAgIEFkanVzdEZvcm11bGFzQ29sdW1uKGNvbHVtbkZyb20sIGNvbHVtbnMpOworICAgICAgICAgICAgICAgIEZpeE1lcmdlZENlbGxzQ29sdW1uKGNvbHVtbkZyb20sIGNvbHVtbnMsIHRydWUpOworCisgICAgICAgICAgICAgICAgdmFyIGNzZWMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAwLCBjb2x1bW5Gcm9tLCAwLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNvbHVtbiBpbiBjc2VjKSAgICAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gaXMgRXhjZWxDb2x1bW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gKEV4Y2VsQ29sdW1uKWNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLl9jb2x1bW5NaW4gPj0gY29sdW1uRnJvbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLl9jb2x1bW5NaW4gLT0gY29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLl9jb2x1bW5NYXggLT0gY29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gVGFibGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkZyb20gPj0gdGJsLkFkZHJlc3MuU3RhcnQuQ29sdW1uICYmIGNvbHVtbkZyb20gPD0gdGJsLkFkZHJlc3MuRW5kLkNvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0YmwuQ29sdW1uc1swXS5Ub3BOb2RlLlBhcmVudE5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXggPSBjb2x1bW5Gcm9tIC0gdGJsLkFkZHJlc3MuU3RhcnQuQ29sdW1uOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuQ2hpbGROb2Rlcy5Db3VudCA+IGl4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5SZW1vdmVDaGlsZChub2RlLkNoaWxkTm9kZXNbaXhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICAgICAgdGJsLl9jb2xzID0gbmV3IEV4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uKHRibCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0YmwuQWRkcmVzcyA9IHRibC5BZGRyZXNzLkRlbGV0ZUNvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGp1c3RGb3JtdWxhc1JvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkZWxTRiA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzZiBpbiBfc2hhcmVkRm9ybXVsYXMuVmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IEV4Y2VsQWRkcmVzcyhzZi5BZGRyZXNzKS5EZWxldGVSb3cocm93RnJvbSwgcm93cyk7CisgICAgICAgICAgICAgICAgaWYgKGE9PW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZWxTRi5BZGQoc2YuSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZi5BZGRyZXNzID0gYS5BZGRyZXNzOworICAgICAgICAgICAgICAgICAgICBpZiAoc2YuU3RhcnRSb3cgPiByb3dGcm9tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE1hdGguTWluKHNmLlN0YXJ0Um93IC0gcm93RnJvbSwgcm93cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhzZi5Gb3JtdWxhLCAtciwgMCwgcm93RnJvbSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZi5TdGFydFJvdyAtPSByOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl4IGluIGRlbFNGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zaGFyZWRGb3JtdWxhcy5SZW1vdmUoaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsU0YgPSBudWxsOworICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF9mb3JtdWxhcywgMSwgMSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgICAgIHdoaWxlIChjc2UuTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3NlLlZhbHVlID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhjc2UuVmFsdWUuVG9TdHJpbmcoKSwgLXJvd3MsIDAsIHJvd0Zyb20sIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIEFkanVzdEZvcm11bGFzQ29sdW1uKGludCBjb2x1bW5Gcm9tLCBpbnQgY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRlbFNGID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNmIGluIF9zaGFyZWRGb3JtdWxhcy5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGEgPSBuZXcgRXhjZWxBZGRyZXNzKHNmLkFkZHJlc3MpLkRlbGV0ZUNvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKKyAgICAgICAgICAgICAgICBpZiAoYSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsU0YuQWRkKHNmLkluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2YuQWRkcmVzcyA9IGEuQWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgLy9zZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhzZi5Gb3JtdWxhLCAwLCAtY29sdW1ucywgMCwgY29sdW1uRnJvbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZi5TdGFydENvbCA+IGNvbHVtbkZyb20pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gTWF0aC5NaW4oc2YuU3RhcnRDb2wgLSBjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNmLkZvcm11bGEgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKHNmLkZvcm11bGEsIDAsIC1jLCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNmLlN0YXJ0Q29sLT0gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vc2YuQWRkcmVzcyA9IGEuQWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgLy9zZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhzZi5Gb3JtdWxhLCAwLC1jb2x1bW5zLDAsIGNvbHVtbkZyb20pOworICAgICAgICAgICAgICAgICAgICAvL2lmIChzZi5TdGFydENvbCA+PSBjb2x1bW5Gcm9tKQorICAgICAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgc2YuU3RhcnRDb2wgLT0gc2YuU3RhcnRDb2w7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpeCBpbiBkZWxTRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGl4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbFNGID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfZm9ybXVsYXMsIDEsIDEsICBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzZS5WYWx1ZSBpcyBzdHJpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjc2UuVmFsdWUgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKGNzZS5WYWx1ZS5Ub1N0cmluZygpLCAwLCAtY29sdW1ucywgMCwgY29sdW1uRnJvbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlbGV0ZXMgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBudW1iZXIgb2YgdGhlIHN0YXJ0IHJvdyB0byBiZSBkZWxldGVkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dzIj5OdW1iZXIgb2Ygcm93cyB0byBkZWxldGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoaWZ0T3RoZXJSb3dzVXAiPk5vdCB1c2VkLiBSb3dzIGFyZSBhbHdheXMgc2hpZnRlZDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MsIGJvb2wgc2hpZnRPdGhlclJvd3NVcCkKKwkJeworICAgICAgICAgICAgRGVsZXRlUm93KHJvd0Zyb20sIHJvd3MpOworICAgICAgICB9CisJCSNlbmRyZWdpb24KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IHRoZSBjZWxsIHZhbHVlIGZyb20gdGh3IHdvcmtzaGVldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+VGhlIHJvdyBudW1iZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvbHVtbiI+VGhlIHJvdyBudW1iZXI8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIHZhbHVlPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb2JqZWN0IEdldFZhbHVlKGludCBSb3csIGludCBDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAvL3Vsb25nIGNlbGxJRCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKFNoZWV0SUQsIFJvdywgQ29sdW1uKTsKKyAgICAgICAgICAgIHZhciB2ID0gX3ZhbHVlcy5HZXRWYWx1ZShSb3csIENvbHVtbik7CisgICAgICAgICAgICBpZiAodiE9bnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ZhciBjZWxsID0gKChFeGNlbENlbGwpX2NlbGxzW2NlbGxJRF0pOworICAgICAgICAgICAgICAgIGlmIChfZmxhZ3MuR2V0RmxhZ1ZhbHVlKFJvdywgQ29sdW1uLCBDZWxsRmxhZ3MuUmljaFRleHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmplY3QpQ2VsbHNbUm93LCBDb2x1bW5dLlJpY2hUZXh0LlRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCBhIHN0cm9uZ2x5IHR5cGVkIGNlbGwgdmFsdWUgZnJvbSB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlPC90eXBlcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgVCBHZXRWYWx1ZTxUPihpbnQgUm93LCBpbnQgQ29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgLy91bG9uZyBjZWxsSUQ9RXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoU2hlZXRJRCwgUm93LCBDb2x1bW4pOworICAgICAgICAgICAgdmFyIHYgPSBfdmFsdWVzLkdldFZhbHVlKFJvdywgQ29sdW1uKTsgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHY9PW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vdmFyIGNlbGw9KChFeGNlbENlbGwpX2NlbGxzW2NlbGxJRF0pOworICAgICAgICAgICAgaWYgKF9mbGFncy5HZXRGbGFnVmFsdWUoUm93LCBDb2x1bW4sIENlbGxGbGFncy5SaWNoVGV4dCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKShvYmplY3QpQ2VsbHNbUm93LCBDb2x1bW5dLlJpY2hUZXh0LlRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFR5cGVkVmFsdWU8VD4odik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9UaGFua3MgdG8gTWljaGFlbCBUcmFuIGZvciBwYXJ0cyBvZiB0aGlzIG1ldGhvZAorICAgICAgICBpbnRlcm5hbCBUIEdldFR5cGVkVmFsdWU8VD4ob2JqZWN0IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUeXBlIGZyb21UeXBlID0gdi5HZXRUeXBlKCk7CisgICAgICAgICAgICBUeXBlIHRvVHlwZSA9IHR5cGVvZihUKTsKKyAgICAgICAgICAgIGlmIChmcm9tVHlwZSA9PSB0b1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgY252ID0gVHlwZURlc2NyaXB0b3IuR2V0Q29udmVydGVyKGZyb21UeXBlKTsKKyAgICAgICAgICAgIGlmICh0b1R5cGUgPT0gdHlwZW9mKERhdGVUaW1lKSkgICAgLy9IYW5kbGUgZGF0ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbVR5cGUgPT0gdHlwZW9mKFRpbWVTcGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFQpKG9iamVjdCkobmV3IERhdGVUaW1lKCgoVGltZVNwYW4pdikuVGlja3MpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZyb21UeXBlID09IHR5cGVvZihzdHJpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgZHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChEYXRlVGltZS5UcnlQYXJzZSh2LlRvU3RyaW5nKCksIG91dCBkdCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVCkob2JqZWN0KShkdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbnYuQ2FuQ29udmVydFRvKHR5cGVvZihkb3VibGUpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKShvYmplY3QpKERhdGVUaW1lLkZyb21PQURhdGUoKGRvdWJsZSljbnYuQ29udmVydFRvKHYsIHR5cGVvZihkb3VibGUpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0b1R5cGUgPT0gdHlwZW9mKFRpbWVTcGFuKSkgICAgLy9IYW5kbGUgdGltZXNwYW4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbVR5cGUgPT0gdHlwZW9mKERhdGVUaW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFQpKG9iamVjdCkobmV3IFRpbWVTcGFuKCgoRGF0ZVRpbWUpdikuVGlja3MpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZyb21UeXBlID09IHR5cGVvZihzdHJpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGltZVNwYW4gdHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChUaW1lU3Bhbi5UcnlQYXJzZSh2LlRvU3RyaW5nKCksIG91dCB0cykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVCkob2JqZWN0KSh0cyk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNudi5DYW5Db252ZXJ0VG8odHlwZW9mKGRvdWJsZSkpKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVCkob2JqZWN0KShuZXcgVGltZVNwYW4oRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKGRvdWJsZSkpKS5UaWNrcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgMTQ2ODIgLS0gIkdldFZhbHVlPGRlY2ltYWw+KCkgd29uJ3QgY29udmVydCBzdHJpbmdzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIHN1Z2dlc3RlZCwgYWZ0ZXIgYWxsIHNwZWNpYWwgY2FzZXMsIGFsbCAuTkVUIHRvIGRvIGl0J3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZmVycmVkIGNvbnZlcnNpb24gcmF0aGVyIHRoYW4gc2ltcGx5IHJldHVybmluZyB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVClDb252ZXJ0LkNoYW5nZVR5cGUodiwgdHlwZW9mKFQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIHByZXZpb3VzIGJlaGF2aW91ciAtLSBubyBjb252ZXJzaW9uIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY252LkNhbkNvbnZlcnRUbyh0b1R5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKFQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvVHlwZS5Jc0dlbmVyaWNUeXBlICYmIHRvVHlwZS5HZXRHZW5lcmljVHlwZURlZmluaXRpb24oKS5FcXVhbHModHlwZW9mKE51bGxhYmxlPD4pKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlID0gTnVsbGFibGUuR2V0VW5kZXJseWluZ1R5cGUodG9UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnYuQ2FuQ29udmVydFRvKHRvVHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKFQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKGZyb21UeXBlPT10eXBlb2YoZG91YmxlKSAmJiB0b1R5cGU9PXR5cGVvZihkZWNpbWFsKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKShvYmplY3QpQ29udmVydC5Ub0RlY2ltYWwodik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnJvbVR5cGUgPT0gdHlwZW9mKGRlY2ltYWwpICYmIHRvVHlwZSA9PSB0eXBlb2YoZG91YmxlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKShvYmplY3QpQ29udmVydC5Ub0RvdWJsZSh2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgdmFsdWUgb2YgYSBjZWxsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5UaGUgY29sdW1uIG51bWJlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVmFsdWUiPlRoZSB2YWx1ZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNldFZhbHVlKGludCBSb3csIGludCBDb2x1bW4sIG9iamVjdCBWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChSb3cgPCAxIHx8IENvbHVtbiA8IDEgfHwgUm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgQ29sdW1uID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUm93IG9yIENvbHVtbiBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoUm93LCBDb2x1bW4sIFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXQgdGhlIHZhbHVlIG9mIGEgY2VsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPlRoZSBFeGNlbCBhZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJWYWx1ZSI+VGhlIHZhbHVlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0VmFsdWUoc3RyaW5nIEFkZHJlc3MsIG9iamVjdCBWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgIGludCByb3csIGNvbDsKKyAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Um93Q29sKEFkZHJlc3MsIG91dCByb3csIG91dCBjb2wsIHRydWUpOworICAgICAgICAgICAgaWYgKHJvdyA8IDEgfHwgY29sIDwgMSB8fCByb3cgPiBFeGNlbFBhY2thZ2UuTWF4Um93cyAmJiBjb2wgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJBZGRyZXNzIGlzIGludmFsaWQgb3Igb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBWYWx1ZSk7ICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gTWVyZ2VDZWxsSWQKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXQgTWVyZ2VDZWxsIEluZGV4IE5vCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBHZXRNZXJnZUNlbGxJZChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tZXJnZWRDZWxscy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYoIXN0cmluZy5Jc051bGxPckVtcHR5KCBfbWVyZ2VkQ2VsbHNbaV0pKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbFJhbmdlIHJhbmdlID0gQ2VsbHNbX21lcmdlZENlbGxzW2ldXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuU3RhcnQuUm93IDw9IHJvdyAmJiByb3cgPD0gcmFuZ2UuRW5kLlJvdykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLlN0YXJ0LkNvbHVtbiA8PSBjb2x1bW4gJiYgY29sdW1uIDw9IHJhbmdlLkVuZC5Db2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisJCSNlbmRyZWdpb24gLy8gRU5EIFdvcmtzaGVldCBQdWJsaWMgTWV0aG9kcworCisJCSNyZWdpb24gV29ya3NoZWV0IFByaXZhdGUgTWV0aG9kcworCisJCSNyZWdpb24gV29ya3NoZWV0IFNhdmUKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTYXZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIERlbGV0ZVByaW50ZXJTZXR0aW5ncygpOworCisgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXRYbWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpcyBFeGNlbENoYXJ0c2hlZXQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBoZWFkZXIgJiBmb290ZXIgKGlmIGRlZmluZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2hlYWRlckZvb3RlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlckZvb3Rlci5TYXZlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gRGltZW5zaW9uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRlbGV0ZUFsbE5vZGUoImQ6ZGltZW5zaW9uL0ByZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFhtbE5vZGVTdHJpbmcoImQ6ZGltZW5zaW9uL0ByZWYiLCBkLkFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEcmF3aW5ncy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIG5vZGUgaWYgbm8gZHJhd2luZ3MgZXhpc3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoImQ6ZHJhd2luZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTYXZlQ29tbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlckZvb3Rlci5TYXZlSGVhZGVyRm9vdGVySW1hZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYXZlVGFibGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYXZlUGl2b3RUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChEcmF3aW5ncy5VcmlEcmF3aW5nIT1udWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERyYXdpbmdzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgUGFydC5EZWxldGVSZWxhdGlvbnNoaXAoRHJhd2luZ3MuX2RyYXdpbmdSZWxhdGlvbi5JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfcGFja2FnZS5QYWNrYWdlLkRlbGV0ZVBhcnQoRHJhd2luZ3MuVXJpRHJhd2luZyk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0UGFjayA9IERyYXdpbmdzLlBhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBEcmF3aW5ncy5EcmF3aW5nWG1sLlNhdmUocGFydFBhY2suR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxEcmF3aW5nIGQgaW4gRHJhd2luZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgaXMgRXhjZWxDaGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnQgYyA9IChFeGNlbENoYXJ0KWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuQ2hhcnRYbWwuU2F2ZShjLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIFNhdmVIYW5kbGVyKFppcE91dHB1dFN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTGV2ZWwgY29tcHJlc3Npb25MZXZlbCwgc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vSW5pdCBaaXAKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNvZGVjQnVmZmVyU2l6ZSA9IDgwOTY7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5Db21wcmVzc2lvbkxldmVsID0gKE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbCljb21wcmVzc2lvbkxldmVsOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uUHV0TmV4dEVudHJ5KGZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgU2F2ZVhtbChzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgCisKKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIFNhdmVzIHRoZSB3b3Jrc2hlZXQgdG8gdGhlIHBhY2thZ2UuCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9pbnRlcm5hbCB2b2lkIFNhdmUoKSAgLy8gV29ya3NoZWV0IFNhdmUKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIERlbGV0ZVByaW50ZXJTZXR0aW5ncygpOworCisgICAgICAgIC8vICAgIGlmIChfd29ya3NoZWV0WG1sICE9IG51bGwpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gICAgICAgIC8vIHNhdmUgdGhlIGhlYWRlciAmIGZvb3RlciAoaWYgZGVmaW5lZCkKKyAgICAgICAgLy8gICAgICAgIGlmIChfaGVhZGVyRm9vdGVyICE9IG51bGwpCisgICAgICAgIC8vICAgICAgICAgICAgSGVhZGVyRm9vdGVyLlNhdmUoKTsKKworICAgICAgICAvLyAgICAgICAgdmFyIGQgPSBEaW1lbnNpb247CisgICAgICAgIC8vICAgICAgICBpZiAoZCA9PSBudWxsKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHRoaXMuRGVsZXRlQWxsTm9kZSgiZDpkaW1lbnNpb24vQHJlZiIpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHRoaXMuU2V0WG1sTm9kZVN0cmluZygiZDpkaW1lbnNpb24vQHJlZiIsIGQuQWRkcmVzcyk7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgLy8gICAgICAgIGlmIChfZHJhd2luZ3MgIT0gbnVsbCAmJiBfZHJhd2luZ3MuQ291bnQgPT0gMCkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICAvL1JlbW92ZSBub2RlIGlmIG5vIGRyYXdpbmdzIGV4aXN0cy4KKyAgICAgICAgLy8gICAgICAgICAgICBEZWxldGVOb2RlKCJkOmRyYXdpbmciKTsKKyAgICAgICAgLy8gICAgICAgIH0KKworICAgICAgICAvLyAgICAgICAgU2F2ZUNvbW1lbnRzKCk7CisgICAgICAgIC8vICAgICAgICBIZWFkZXJGb290ZXIuU2F2ZUhlYWRlckZvb3RlckltYWdlcygpOworICAgICAgICAvLyAgICAgICAgU2F2ZVRhYmxlcygpOworICAgICAgICAvLyAgICAgICAgU2F2ZVBpdm90VGFibGVzKCk7CisgICAgICAgIC8vICAgICAgICBTYXZlWG1sKCk7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyAgICBpZiAoRHJhd2luZ3MuVXJpRHJhd2luZyE9bnVsbCkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgaWYgKERyYXdpbmdzLkNvdW50ID09IDApCisgICAgICAgIC8vICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChEcmF3aW5ncy5fZHJhd2luZ1JlbGF0aW9uLklkKTsKKyAgICAgICAgLy8gICAgICAgICAgICBfcGFja2FnZS5QYWNrYWdlLkRlbGV0ZVBhcnQoRHJhd2luZ3MuVXJpRHJhd2luZyk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydFBhY2sgPSBEcmF3aW5ncy5QYXJ0OworICAgICAgICAvLyAgICAgICAgICAgIERyYXdpbmdzLkRyYXdpbmdYbWwuU2F2ZShwYXJ0UGFjay5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgIC8vICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxEcmF3aW5nIGQgaW4gRHJhd2luZ3MpCisgICAgICAgIC8vICAgICAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAoZCBpcyBFeGNlbENoYXJ0KQorICAgICAgICAvLyAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBFeGNlbENoYXJ0IGMgPSAoRXhjZWxDaGFydClkOworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgYy5DaGFydFhtbC5TYXZlKGMuUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy99CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVsZXRlIHRoZSBwcmludGVyc2V0dGluZ3MgcmVsYXRpb25zaGlwIGFuZCBwYXJ0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgRGVsZXRlUHJpbnRlclNldHRpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9EZWxldGUgdGhlIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBwYWdlU2V0dXAgdGFnCisgICAgICAgICAgICBYbWxBdHRyaWJ1dGUgYXR0ciA9IChYbWxBdHRyaWJ1dGUpV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpwYWdlU2V0dXAvQHI6aWQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gYXR0ci5WYWx1ZTsKKyAgICAgICAgICAgICAgICAvL0ZpcnN0IGRlbGV0ZSB0aGUgYXR0cmlidXRlIGZyb20gdGhlIFhNTAorICAgICAgICAgICAgICAgIGF0dHIuT3duZXJFbGVtZW50LkF0dHJpYnV0ZXMuUmVtb3ZlKGF0dHIpOworICAgICAgICAgICAgICAgIGlmKFBhcnQuUmVsYXRpb25zaGlwRXhpc3RzKHJlbElEKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJRCk7CisgICAgICAgICAgICAgICAgICAgIFVyaSBwcmludGVyU2V0dGluZ3NVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgICAgICAgICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJlbC5JZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9EZWxldGUgdGhlIHBhcnQgZnJvbSB0aGUgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICBpZihfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHMocHJpbnRlclNldHRpbmdzVXJpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KHByaW50ZXJTZXR0aW5nc1VyaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNhdmVDb21tZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY29tbWVudHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NvbW1lbnRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbW1lbnRzLlVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChfY29tbWVudHMuUmVsSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KF9jb21tZW50cy5VcmkpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFJlbW92ZUxlZ2FjeURyYXdpbmdSZWwoVm1sRHJhd2luZ3NDb21tZW50cy5SZWxJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY29tbWVudHMuVXJpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb21tZW50cy5Vcmk9bmV3IFVyaShzdHJpbmcuRm9ybWF0KEAiL3hsL2NvbW1lbnRzezB9LnhtbCIsIFNoZWV0SUQpLCBVcmlLaW5kLlJlbGF0aXZlKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihfY29tbWVudHMuUGFydD09bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbW1lbnRzLlBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoX2NvbW1lbnRzLlVyaSwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbW1lbnRzK3htbCIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya3NoZWV0VXJpLCBfY29tbWVudHMuVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKyIvY29tbWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfY29tbWVudHMuQ29tbWVudFhtbC5TYXZlKF9jb21tZW50cy5QYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzLlVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChfdm1sRHJhd2luZ3MuUmVsSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KF92bWxEcmF3aW5ncy5VcmkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3MuVXJpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5ncy5VcmkgPSBYbWxIZWxwZXIuR2V0TmV3VXJpKF9wYWNrYWdlLlBhY2thZ2UsIEAiL3hsL2RyYXdpbmdzL3ZtbERyYXdpbmd7MH0udm1sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF92bWxEcmF3aW5ncy5QYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5ncy5QYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5DcmVhdGVQYXJ0KF92bWxEcmF3aW5ncy5VcmksICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudm1sRHJhd2luZyIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya3NoZWV0VXJpLCBfdm1sRHJhd2luZ3MuVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi92bWxEcmF3aW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmxlZ2FjeURyYXdpbmcvQHI6aWQiLCByZWwuSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzLlJlbElkID0gcmVsLklkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5ncy5WbWxEcmF3aW5nWG1sLlNhdmUoX3ZtbERyYXdpbmdzLlBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTYXZlIGFsbCB0YWJsZSBkYXRhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBTYXZlVGFibGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBUYWJsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRibC5TaG93SGVhZGVyIHx8IHRibC5TaG93VG90YWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29sTnVtID0gdGJsLkFkZHJlc3MuX2Zyb21Db2w7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb2xWYWwgPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb2wgaW4gdGJsLkNvbHVtbnMpCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuPWNvbC5OYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGJsLlNob3dIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRibC5Xb3JrU2hlZXQuR2V0VmFsdWU8c3RyaW5nPih0YmwuQWRkcmVzcy5fZnJvbVJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsLkFkZHJlc3MuX2Zyb21Db2wgKyBjb2wuUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjb2wuTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuTmFtZSA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjb2wuTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbFZhbC5Db250YWlucyhuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiVGFibGUgezB9IENvbHVtbiB7MX0gZG9lcyBub3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLiIsIHRibC5OYW1lLCBjb2wuTmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbFZhbC5BZGQobik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2wuTmFtZSA9IENvbnZlcnRVdGlsLkV4Y2VsRW5jb2RlU3RyaW5nKGNvbC5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YmwuU2hvd0hlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHRibC5BZGRyZXNzLl9mcm9tUm93LCBjb2xOdW0sIGNvbC5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YmwuU2hvd1RvdGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFRhYmxlVG90YWxGdW5jdGlvbih0YmwsIGNvbCwgY29sTnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoY29sLkNhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbVJvdyA9IHRibC5TaG93SGVhZGVyID8gdGJsLkFkZHJlc3MuX2Zyb21Sb3cgKyAxIDogdGJsLkFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvUm93ID0gdGJsLlNob3dUb3RhbCA/IHRibC5BZGRyZXNzLl90b1JvdyAtIDEgOiB0YmwuQWRkcmVzcy5fdG9Sb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gZnJvbVJvdzsgcm93IDw9IHRvUm93OyByb3crKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2VsbChyb3csIGNvbE51bSkuRm9ybXVsYSA9IGNvbC5DYWxjdWxhdGVkQ29sdW1uRm9ybXVsYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYShyb3csIGNvbE51bSwgY29sLkNhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29sTnVtKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh0YmwuUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGJsLlRhYmxlVXJpID0gR2V0TmV3VXJpKF9wYWNrYWdlLlBhY2thZ2UsIEAiL3hsL3RhYmxlcy90YWJsZXswfS54bWwiLCB0YmwuSWQpOworICAgICAgICAgICAgICAgICAgICB0YmwuUGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydCh0YmwuVGFibGVVcmksICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZSt4bWwiLCBXb3JrYm9vay5fcGFja2FnZS5Db21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0YmwuUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdGJsLlRhYmxlWG1sLlNhdmUoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3Jrc2hlZXRVcmksIHRibC5UYWJsZVVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvdGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgdGJsLlJlbGF0aW9uc2hpcElEID0gcmVsLklkOworCisgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6dGFibGVQYXJ0cyIpOworICAgICAgICAgICAgICAgICAgICBYbWxOb2RlIHRibHMgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6dGFibGVQYXJ0cyIsTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRibE5vZGUgPSB0YmxzLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgidGFibGVQYXJ0IixFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgICAgIHRibHMuQXBwZW5kQ2hpbGQodGJsTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHRibE5vZGUuU2V0QXR0cmlidXRlKCJpZCIsRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSB0YmwuUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdGJsLlRhYmxlWG1sLlNhdmUoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIFNldFRhYmxlVG90YWxGdW5jdGlvbihFeGNlbFRhYmxlIHRibCwgRXhjZWxUYWJsZUNvbHVtbiBjb2wsIGludCBjb2xOdW09LTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0YmwuU2hvd1RvdGFsID09IGZhbHNlKSByZXR1cm47CisgICAgICAgICAgICBpZiAoY29sTnVtID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGJsLkNvbHVtbnMuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YmwuQ29sdW1uc1tpXS5OYW1lID09IGNvbC5OYW1lKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xOdW0gPSB0YmwuQWRkcmVzcy5fZnJvbUNvbCArIGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uID09IFJvd0Z1bmN0aW9ucy5DdXN0b20pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgY29sLlRvdGFsc1Jvd0Zvcm11bGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uICE9IFJvd0Z1bmN0aW9ucy5Ob25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuQXZlcmFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldEZvcm11bGEodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIEdldFRvdGFsRnVuY3Rpb24oY29sLCAiMTAxIikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUm93RnVuY3Rpb25zLkNvdW50OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDIiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuQ291bnROdW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuTWF4OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuTWluOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuU3RkRGV2OgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDciKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuVmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMTAiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuU3VtOgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDkiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJVbmtub3duIFJvd0Z1bmN0aW9uIGVudW0iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIGNvbC5Ub3RhbHNSb3dMYWJlbCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHZvaWQgU2V0Rm9ybXVsYShpbnQgcm93LCBpbnQgY29sLCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgdmFsdWUpOworICAgICAgICAgICAgaWYgKCFfdmFsdWVzLkV4aXN0cyhyb3csIGNvbCkpIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0U3R5bGUoaW50IHJvdywgaW50IGNvbCwgaW50IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCB2YWx1ZSk7CisgICAgICAgICAgICBpZighX3ZhbHVlcy5FeGlzdHMocm93LGNvbCkpIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgU2F2ZVBpdm90VGFibGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHB0IGluIFBpdm90VGFibGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwdC5EYXRhRmllbGRzLkNvdW50ID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgcGFyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgaWYocHQuRGF0YU9uUm93cz09dHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9ICBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5DcmVhdGVOb2RlKCJkOnJvd0ZpZWxkcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9ICBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5DcmVhdGVOb2RlKCJkOmNvbEZpZWxkcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpmaWVsZFtAIHg9IFwiLTJcIl0iLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGZpZWxkTm9kZSA9IHB0LlBpdm90VGFibGVYbWwuQ3JlYXRlRWxlbWVudCgiZmllbGQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJ4IiwgIi0yIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLkFwcGVuZENoaWxkKGZpZWxkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyIHdzID0gV29ya2Jvb2suV29ya3NoZWV0c1twdC5DYWNoZURlZmluaXRpb24uU291cmNlUmFuZ2UuV29ya1NoZWV0XTsKKyAgICAgICAgICAgICAgICB2YXIgdCA9IHdzLlRhYmxlcy5HZXRGcm9tUmFuZ2UocHQuQ2FjaGVEZWZpbml0aW9uLlNvdXJjZVJhbmdlKTsKKyAgICAgICAgICAgICAgICB2YXIgZmllbGRzID0KKyAgICAgICAgICAgICAgICAgICAgcHQuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5TZWxlY3ROb2RlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICJkOnBpdm90Q2FjaGVEZWZpbml0aW9uL2Q6Y2FjaGVGaWVsZHMvZDpjYWNoZUZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaW50IGl4ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZmxkcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBub2RlIGluIGZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID49IHB0LkNhY2hlRGVmaW5pdGlvbi5Tb3VyY2VSYW5nZS5Db2x1bW5zKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbGROYW1lID0gbm9kZS5HZXRBdHRyaWJ1dGUoIm5hbWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpeGVzIGlzc3VlIDE1Mjk1IGR1cCBuYW1lIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZmxkTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxkTmFtZSA9ICh0ID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwdC5DYWNoZURlZmluaXRpb24uU291cmNlUmFuZ2UuT2Zmc2V0KDAsIGl4KyssIDEsIDEpLlZhbHVlLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0LkNvbHVtbnNbaXgrK10uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxkcy5Db250YWlucyhmbGROYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxkTmFtZSA9IEdldE5ld05hbWUoZmxkcywgZmxkTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmbGRzLkFkZChmbGROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJuYW1lIiwgZmxkTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRmIGluIHB0LkRhdGFGaWVsZHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShkZi5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGYuRnVuY3Rpb24gPT0gRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGYuRmllbGQuTmFtZTsgLy9OYW1lIG11c3QgYmUgc2V0IG9yIEV4Y2VsIHdpbGwgY3Jhc2ggb24gcmVuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZi5GdW5jdGlvbi5Ub1N0cmluZygpICsgIiBvZiAiICsgZGYuRmllbGQuTmFtZTsgLy9OYW1lIG11c3QgYmUgc2V0IG9yIEV4Y2VsIHdpbGwgY3Jhc2ggb24gcmVuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01ha2Ugc3VyZSBuYW1lIGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdOYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHB0LkRhdGFGaWVsZHMuRXhpc3RzRGZOYW1lKG5ld05hbWUsIGRmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuYW1lICsgKGkrKykuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmLk5hbWUgPSBuZXdOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0LlBpdm90VGFibGVYbWwuU2F2ZShwdC5QYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUpKTsKKyAgICAgICAgICAgICAgICBwdC5DYWNoZURlZmluaXRpb24uQ2FjaGVEZWZpbml0aW9uWG1sLlNhdmUocHQuQ2FjaGVEZWZpbml0aW9uLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0TmV3TmFtZShIYXNoU2V0PHN0cmluZz4gZmxkcywgc3RyaW5nIGZsZE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpeCA9IDI7CisgICAgICAgICAgICB3aGlsZSAoZmxkcy5Db250YWlucyhmbGROYW1lICsgaXguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxkTmFtZSArIGl4LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldFRvdGFsRnVuY3Rpb24oRXhjZWxUYWJsZUNvbHVtbiBjb2wsc3RyaW5nIEZ1bmN0aW9uTnVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiU1VCVE9UQUwoezB9LHsxfVt7Mn1dKSIsIEZ1bmN0aW9uTnVtLCBjb2wuX3RibC5OYW1lLCBjb2wuTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNhdmVYbWwoU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9DcmVhdGUgdGhlIG5vZGVzIGlmIHRoZXkgZG8gbm90IGV4aXN0LgorICAgICAgICAgICAgU3RyZWFtV3JpdGVyIHN3ID0gbmV3IFN0cmVhbVdyaXRlcihzdHJlYW0sIFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjgsIDY1NTM2KTsKKyAgICAgICAgICAgIGlmICh0aGlzIGlzIEV4Y2VsQ2hhcnRzaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdy5Xcml0ZShfd29ya3NoZWV0WG1sLk91dGVyWG1sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOmNvbHMiKTsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOnNoZWV0RGF0YSIpOworICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6bWVyZ2VDZWxscyIpOworICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6aHlwZXJsaW5rcyIpOworICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6cm93QnJlYWtzIik7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiZDpjb2xCcmVha3MiKTsKKworICAgICAgICAgICAgICAgIC8vU3RyZWFtV3JpdGVyIHN3PW5ldyBTdHJlYW1Xcml0ZXIoUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgICAgICAgICAgdmFyIHhtbCA9IF93b3Jrc2hlZXRYbWwuT3V0ZXJYbWw7CisgICAgICAgICAgICAgICAgaW50IGNvbFN0YXJ0ID0gMCwgY29sRW5kID0gMDsKKyAgICAgICAgICAgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJjb2xzIiwgcmVmIGNvbFN0YXJ0LCByZWYgY29sRW5kKTsKKworICAgICAgICAgICAgICAgIHN3LldyaXRlKHhtbC5TdWJzdHJpbmcoMCwgY29sU3RhcnQpKTsKKyAgICAgICAgICAgICAgICB2YXIgY29sQnJlYWtzID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgICAgIC8vaWYgKF9jb2x1bW5zLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICBVcGRhdGVDb2x1bW5EYXRhKHN3KTsKKyAgICAgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgICAgIGludCBjZWxsU3RhcnQgPSBjb2xFbmQsIGNlbGxFbmQgPSBjb2xFbmQ7CisgICAgICAgICAgICAgICAgR2V0QmxvY2tQb3MoeG1sLCAic2hlZXREYXRhIiwgcmVmIGNlbGxTdGFydCwgcmVmIGNlbGxFbmQpOworCisgICAgICAgICAgICAgICAgc3cuV3JpdGUoeG1sLlN1YnN0cmluZyhjb2xFbmQsIGNlbGxTdGFydCAtIGNvbEVuZCkpOworICAgICAgICAgICAgICAgIHZhciByb3dCcmVha3MgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgVXBkYXRlUm93Q2VsbERhdGEoc3cpOworCisgICAgICAgICAgICAgICAgaW50IG1lcmdlU3RhcnQgPSBjZWxsRW5kLCBtZXJnZUVuZCA9IGNlbGxFbmQ7CisKKyAgICAgICAgICAgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJtZXJnZUNlbGxzIiwgcmVmIG1lcmdlU3RhcnQsIHJlZiBtZXJnZUVuZCk7CisgICAgICAgICAgICAgICAgc3cuV3JpdGUoeG1sLlN1YnN0cmluZyhjZWxsRW5kLCBtZXJnZVN0YXJ0IC0gY2VsbEVuZCkpOworCisgICAgICAgICAgICAgICAgQ2xlYW51cE1lcmdlZENlbGxzKF9tZXJnZWRDZWxscyk7CisgICAgICAgICAgICAgICAgaWYgKF9tZXJnZWRDZWxscy5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVcGRhdGVNZXJnZWRDZWxscyhzdyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGh5cGVyU3RhcnQgPSBtZXJnZUVuZCwgaHlwZXJFbmQgPSBtZXJnZUVuZDsKKyAgICAgICAgICAgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJoeXBlcmxpbmtzIiwgcmVmIGh5cGVyU3RhcnQsIHJlZiBoeXBlckVuZCk7CisgICAgICAgICAgICAgICAgc3cuV3JpdGUoeG1sLlN1YnN0cmluZyhtZXJnZUVuZCwgaHlwZXJTdGFydCAtIG1lcmdlRW5kKSk7CisgICAgICAgICAgICAgICAgLy9pZiAoX2h5cGVyTGlua0NlbGxzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICBVcGRhdGVIeXBlckxpbmtzKHN3KTsKKyAgICAgICAgICAgICAgICAvLyB9CisKKyAgICAgICAgICAgICAgICBpbnQgcm93QnJlYWtTdGFydCA9IGh5cGVyRW5kLCByb3dCcmVha0VuZCA9IGh5cGVyRW5kOworICAgICAgICAgICAgICAgIEdldEJsb2NrUG9zKHhtbCwgInJvd0JyZWFrcyIsIHJlZiByb3dCcmVha1N0YXJ0LCByZWYgcm93QnJlYWtFbmQpOworICAgICAgICAgICAgICAgIHN3LldyaXRlKHhtbC5TdWJzdHJpbmcoaHlwZXJFbmQsIHJvd0JyZWFrU3RhcnQgLSBoeXBlckVuZCkpOworICAgICAgICAgICAgICAgIC8vaWYgKHJvd0JyZWFrcy5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgVXBkYXRlUm93QnJlYWtzKHN3KTsKKyAgICAgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgICAgIGludCBjb2xCcmVha1N0YXJ0ID0gcm93QnJlYWtFbmQsIGNvbEJyZWFrRW5kID0gcm93QnJlYWtFbmQ7CisgICAgICAgICAgICAgICAgR2V0QmxvY2tQb3MoeG1sLCAiY29sQnJlYWtzIiwgcmVmIGNvbEJyZWFrU3RhcnQsIHJlZiBjb2xCcmVha0VuZCk7CisgICAgICAgICAgICAgICAgc3cuV3JpdGUoeG1sLlN1YnN0cmluZyhyb3dCcmVha0VuZCwgY29sQnJlYWtTdGFydCAtIHJvd0JyZWFrRW5kKSk7CisgICAgICAgICAgICAgICAgLy9pZiAoY29sQnJlYWtzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICBVcGRhdGVDb2xCcmVha3Moc3cpOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIHN3LldyaXRlKHhtbC5TdWJzdHJpbmcoY29sQnJlYWtFbmQsIHhtbC5MZW5ndGggLSBjb2xCcmVha0VuZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3cuRmx1c2goKTsKKyAgICAgICAgICAgIC8vc3cuQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDbGVhbnVwTWVyZ2VkQ2VsbHMoTWVyZ2VDZWxsc0NvbGxlY3Rpb24gX21lcmdlZENlbGxzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaT0wOworICAgICAgICAgICAgd2hpbGUgKGkgPCBfbWVyZ2VkQ2VsbHMuTGlzdC5Db3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX21lcmdlZENlbGxzW2ldID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbWVyZ2VkQ2VsbHMuTGlzdC5SZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlQ29sQnJlYWtzKFN0cmVhbVdyaXRlciBzdykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBicmVha3MgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAwLCAwLCAwLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICAgICAgICAvL2ZvcmVhY2ggKEV4Y2VsQ29sdW1uIGNvbCBpbiBfY29sdW1ucykKKyAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbD1jc2UuVmFsdWUgYXMgRXhjZWxDb2x1bW47CisgICAgICAgICAgICAgICAgaWYgKGNvbCAhPSBudWxsICYmIGNvbC5QYWdlQnJlYWspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVha3MuQXBwZW5kRm9ybWF0KCI8YnJrIGlkPVwiezB9XCIgbWF4PVwiMTYzODNcIiBtYW49XCIxXCIgLz4iLCBjc2UuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3LldyaXRlKHN0cmluZy5Gb3JtYXQoIjxjb2xCcmVha3MgY291bnQ9XCJ7MH1cIiBtYW51YWxCcmVha0NvdW50PVwiezB9XCI+ezF9PC9jb2xCcmVha3M+IiwgY291bnQsIGJyZWFrcy5Ub1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlUm93QnJlYWtzKFN0cmVhbVdyaXRlciBzdykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBicmVha3M9bmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3ZhbHVlcywgMCwgMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIDApOworICAgICAgICAgICAgLy9mb3JlYWNoKEV4Y2VsUm93IHJvdyBpbiBfcm93cykgICAgICAgICAgICAKKyAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJvdz1jc2UuVmFsdWUgYXMgUm93SW50ZXJuYWw7CisgICAgICAgICAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIHJvdy5QYWdlQnJlYWspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVha3MuQXBwZW5kRm9ybWF0KCI8YnJrIGlkPVwiezB9XCIgbWF4PVwiMTA0ODU3NVwiIG1hbj1cIjFcIiAvPiIsIGNzZS5Sb3cpOworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb3VudD4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3LldyaXRlKHN0cmluZy5Gb3JtYXQoIjxyb3dCcmVha3MgY291bnQ9XCJ7MH1cIiBtYW51YWxCcmVha0NvdW50PVwiezB9XCI+ezF9PC9yb3dCcmVha3M+IiwgY291bnQsIGJyZWFrcy5Ub1N0cmluZygpKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluc2VydHMgdGhlIGNvbHMgY29sbGVjdGlvbiBpbnRvIHRoZSBYTUwgZG9jdW1lbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFVwZGF0ZUNvbHVtbkRhdGEoU3RyZWFtV3JpdGVyIHN3KQorICAgICAgICB7CisgICAgICAgICAgICAvL0V4Y2VsQ29sdW1uIHByZXZDb2wgPSBudWxsOyAgIC8vY29tbWVudGVkIG91dCAxMS8xLTEyIEpLIAorICAgICAgICAgICAgLy9mb3JlYWNoIChFeGNlbENvbHVtbiBjb2wgaW4gX2NvbHVtbnMpCisgICAgICAgICAgICAvL3sgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyAgICBpZiAocHJldkNvbCAhPSBudWxsKQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIGlmKHByZXZDb2wuQ29sdW1uTWF4ICE9IGNvbC5Db2x1bW5NaW4tMSkKKyAgICAgICAgICAgIC8vICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIHByZXZDb2wuX2NvbHVtbk1heD1jb2wuQ29sdW1uTWluLTE7CisgICAgICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy8gICAgcHJldkNvbCA9IGNvbDsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF92YWx1ZXMsIDAsIDEsIDAsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgICAgIC8vc3cuV3JpdGUoIjxjb2xzPiIpOworICAgICAgICAgICAgLy9mb3JlYWNoIChFeGNlbENvbHVtbiBjb2wgaW4gX2NvbHVtbnMpCisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxjb2xzPiIpOworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY29sID0gY3NlLlZhbHVlIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAgICAgICAgIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPiBjZWxsWGZzID0gX3BhY2thZ2UuV29ya2Jvb2suU3R5bGVzLkNlbGxYZnM7CisKKyAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPGNvbCBtaW49XCJ7MH1cIiBtYXg9XCJ7MX1cIiIsIGNvbC5Db2x1bW5NaW4sIGNvbC5Db2x1bW5NYXgpOworICAgICAgICAgICAgICAgIGlmIChjb2wuSGlkZGVuID09IHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL3NiWG1sLkFwcGVuZCgiIHdpZHRoPVwiMFwiIGhpZGRlbj1cIjFcIiBjdXN0b21XaWR0aD1cIjFcIiIpOworICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIGhpZGRlbj1cIjFcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuQmVzdEZpdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCIgYmVzdEZpdD1cIjFcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdy5Xcml0ZShzdHJpbmcuRm9ybWF0KEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsICIgd2lkdGg9XCJ7MH1cIiBjdXN0b21XaWR0aD1cIjFcIiIsIGNvbC5XaWR0aCkpOworICAgICAgICAgICAgICAgIGlmIChjb2wuT3V0bGluZUxldmVsID4gMCkKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIiBvdXRsaW5lTGV2ZWw9XCJ7MH1cIiAiLCBjb2wuT3V0bGluZUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5Db2xsYXBzZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wuSGlkZGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIiBjb2xsYXBzZWQ9XCIxXCIgaGlkZGVuPVwiMVwiIik7IC8vQWx3YXlzIGhpZGRlbgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb2wuUGhvbmV0aWMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIHBob25ldGljPVwiMVwiIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHN0eWxlSUQgPSBjb2wuU3R5bGVJRCA+PSAwID8gY2VsbFhmc1tjb2wuU3R5bGVJRF0ubmV3SUQgOiBjb2wuU3R5bGVJRDsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGVJRCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIHN0eWxlPVwiezB9XCIiLCBzdHlsZUlEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3cuV3JpdGUoIiAvPiIpOworCisgICAgICAgICAgICAgICAgLy9pZiAoY29sLlBhZ2VCcmVhaykKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBjb2xCcmVha3MuQWRkKGNvbC5Db2x1bW5NaW4pOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPC9jb2xzPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluc2VydCByb3cgYW5kIGNlbGxzIGludG8gdGhlIFhNTCBkb2N1bWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlUm93Q2VsbERhdGEoU3RyZWFtV3JpdGVyIHN3KQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4gY2VsbFhmcyA9IF9wYWNrYWdlLldvcmtib29rLlN0eWxlcy5DZWxsWGZzOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgcm93ID0gLTE7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2JYbWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgdmFyIHNzID0gX3BhY2thZ2UuV29ya2Jvb2suX3NoYXJlZFN0cmluZ3M7CisgICAgICAgICAgICB2YXIgc3R5bGVzID0gX3BhY2thZ2UuV29ya2Jvb2suU3R5bGVzOworICAgICAgICAgICAgdmFyIGNhY2hlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPHNoZWV0RGF0YT4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9TZXQgYSB2YWx1ZSBmb3IgY2VsbHMgd2l0aCBzdHlsZSBhbmQgbm8gdmFsdWUgc2V0LgorICAgICAgICAgICAgdmFyIGNzZVN0eWxlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX3N0eWxlcywgMCwgMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIGNzZVN0eWxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFfdmFsdWVzLkV4aXN0cyhjc2VTdHlsZS5Sb3csIGNzZVN0eWxlLkNvbHVtbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKGNzZVN0eWxlLlJvdywgY3NlU3R5bGUuQ29sdW1uLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAxLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgICAgICAgLy9mb3JlYWNoIChJUmFuZ2VJRCByIGluIF9jZWxscykKKyAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNzZS5Db2x1bW4+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdHlsZUlEID0gY2VsbFhmc1tzdHlsZXMuR2V0U3R5bGVJZCh0aGlzLCBjc2UuUm93LCBjc2UuQ29sdW1uKV0ubmV3SUQ7CisgICAgICAgICAgICAgICAgICAgIC8vQWRkIHRoZSByb3cgZWxlbWVudCBpZiBpdCdzIGEgbmV3IHJvdworICAgICAgICAgICAgICAgICAgICBpZiAoY3NlLlJvdyAhPSByb3cpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlUm93KGNhY2hlLCBjZWxsWGZzLCByb3csIGNzZS5Sb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gY3NlLlJvdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvYmplY3QgdiA9IGNzZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvcm11bGEgPSBfZm9ybXVsYXMuR2V0VmFsdWUoY3NlLlJvdywgY3NlLkNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtdWxhIGlzIGludCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNmSWQgPSAoaW50KWZvcm11bGE7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IF9zaGFyZWRGb3JtdWxhc1soaW50KXNmSWRdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuQWRkcmVzcy5JbmRleE9mKCc6JykgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLlN0YXJ0Q29sID09IGNzZS5Db2x1bW4gJiYgZi5TdGFydFJvdyA9PSBjc2UuUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuSXNBcnJheSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiezV9PjxmIHJlZj1cInsyfVwiIHQ9XCJhcnJheVwiPnszfTwvZj57NH08L2M+IiwgY3NlLkNlbGxBZGRyZXNzLCBzdHlsZUlEIDwgMCA/IDAgOiBzdHlsZUlELCBmLkFkZHJlc3MsIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZi5Gb3JtdWxhKSwgR2V0Rm9ybXVsYVZhbHVlKHYpLCBHZXRDZWxsVHlwZSh2LHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGMgcj1cInswfVwiIHM9XCJ7MX1cIns2fT48ZiByZWY9XCJ7Mn1cIiB0PVwic2hhcmVkXCIgIHNpPVwiezN9XCI+ezR9PC9mPns1fTwvYz4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQsIGYuQWRkcmVzcywgc2ZJZCwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShmLkZvcm11bGEpLCBHZXRGb3JtdWxhVmFsdWUodiksIEdldENlbGxUeXBlKHYsdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZi5Jc0FycmF5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiIC8+IiwgY3NlLkNlbGxBZGRyZXNzLCBzdHlsZUlEIDwgMCA/IDAgOiBzdHlsZUlEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiezR9PjxmIHQ9XCJzaGFyZWRcIiBzaT1cInsyfVwiIC8+ezN9PC9jPiIsIGNzZS5DZWxsQWRkcmVzcywgc3R5bGVJRCA8IDAgPyAwIDogc3R5bGVJRCwgc2ZJZCwgR2V0Rm9ybXVsYVZhbHVlKHYpLCBHZXRDZWxsVHlwZSh2LHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGFsc28gaGF2ZSBhIHNpbmdsZSBjZWxsIGFycmF5IGZvcm11bGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmLklzQXJyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCJ7NX0+PGYgcmVmPVwiezJ9XCIgdD1cImFycmF5XCI+ezN9PC9mPns0fTwvYz4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQsIHN0cmluZy5Gb3JtYXQoInswfTp7MX0iLCBmLkFkZHJlc3MsIGYuQWRkcmVzcyksIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZi5Gb3JtdWxhKSwgR2V0Rm9ybXVsYVZhbHVlKHYpLCBHZXRDZWxsVHlwZSh2LHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiPiIsIGYuQWRkcmVzcywgc3R5bGVJRCA8IDAgPyAwIDogc3R5bGVJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGY+ezB9PC9mPnsxfTwvYz4iLCBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGYuRm9ybXVsYSksIEdldEZvcm11bGFWYWx1ZSh2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm11bGEhPW51bGwgJiYgZm9ybXVsYS5Ub1N0cmluZygpIT0iIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiezJ9PiIsIGNzZS5DZWxsQWRkcmVzcywgc3R5bGVJRCA8IDAgPyAwIDogc3R5bGVJRCwgR2V0Q2VsbFR5cGUodix0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxmPnswfTwvZj57MX08L2M+IiwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShmb3JtdWxhLlRvU3RyaW5nKCkpLCBHZXRGb3JtdWxhVmFsdWUodikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiBzdHlsZUlEID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCIgLz4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSB8fCB2IGlzIGRvdWJsZSB8fCB2IGlzIGRlY2ltYWwgfHwgdiBpcyBEYXRlVGltZSB8fCB2IGlzIFRpbWVTcGFuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RyaW5nIHN2ID0gR2V0VmFsdWVGb3JYbWwodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGMgcj1cInswfVwiIHM9XCJ7MX1cIiB7Mn0+IiwgY3NlLkNlbGxBZGRyZXNzLCBzdHlsZUlEIDwgMCA/IDAgOiBzdHlsZUlELCBHZXRDZWxsVHlwZSh2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiezB9PC9jPiIsIEdldEZvcm11bGFWYWx1ZSh2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcy5Db250YWluc0tleSh2LlRvU3RyaW5nKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeCA9IHNzLkNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3MuQWRkKHYuVG9TdHJpbmcoKSwgbmV3IEV4Y2VsV29ya2Jvb2suU2hhcmVkU3RyaW5nSXRlbSgpIHsgaXNSaWNoVGV4dCA9IF9mbGFncy5HZXRGbGFnVmFsdWUoY3NlLlJvdyxjc2UuQ29sdW1uLENlbGxGbGFncy5SaWNoVGV4dCksIHBvcyA9IGl4IH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXggPSBzc1t2LlRvU3RyaW5nKCldLnBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCIgdD1cInNcIj4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjx2PnswfTwvdj48L2M+IiwgaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLy8vVXBkYXRlIGh5cGVybGlua3MuCisgICAgICAgICAgICAgICAgICAgLy9pZiAoY2VsbC5IeXBlcmxpbmsgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgIC8vICAgIF9oeXBlckxpbmtDZWxscy5BZGQoY2VsbC5DZWxsSUQpOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgLy9FeGNlbFJvdworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pbnQgbmV3Um93PSgoRXhjZWxSb3cpY3NlLlZhbHVlKS5Sb3c7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlUm93KGNhY2hlLCBjZWxsWGZzLCByb3csIGNzZS5Sb3cpOworICAgICAgICAgICAgICAgICAgICByb3cgPSBjc2UuUm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUuTGVuZ3RoID4gMHg2MDAwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZShjYWNoZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJvdyAhPSAtMSkgY2FjaGUuQXBwZW5kKCI8L3Jvdz4iKTsKKyAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPC9zaGVldERhdGE+Iik7CisgICAgICAgICAgICBzdy5Xcml0ZShjYWNoZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHN3LkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIG9iamVjdCBHZXRGb3JtdWxhVmFsdWUob2JqZWN0IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKF9wYWNrYWdlLldvcmtib29rLl9pc0NhbGN1bGF0ZWQpCisgICAgICAgICAgICAvL3sgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LlRvU3RyaW5nKCkhPSIiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiPHY+IiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoR2V0VmFsdWVGb3JYbWwodikpICsgIjwvdj4iOyAvL0ZpeGVzIGlzc3VlIDE1MDcxCisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0Q2VsbFR5cGUob2JqZWN0IHYsIGJvb2wgYWxsb3dTdHI9ZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2IGlzIGJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIgdD1cImJcIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgodiBpcyBkb3VibGUgJiYgZG91YmxlLklzSW5maW5pdHkoKGRvdWJsZSl2KSkgfHwgdiBpcyBFeGNlbEVycm9yVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIgdD1cImVcIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGFsbG93U3RyICYmIHYhPW51bGwgJiYgISh2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSB8fCB2IGlzIGRvdWJsZSB8fCB2IGlzIGRlY2ltYWwgfHwgdiBpcyBEYXRlVGltZSB8fCB2IGlzIFRpbWVTcGFuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiB0PVwic3RyXCIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFZhbHVlRm9yWG1sKG9iamVjdCB2KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgczsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2IGlzIERhdGVUaW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNkdiA9ICgoRGF0ZVRpbWUpdikuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Jvb2suRGF0ZTE5MDQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNkdiAtPSBFeGNlbFdvcmtib29rLmRhdGUxOTA0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNkdi5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpcyBUaW1lU3BhbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBuZXcgRGF0ZVRpbWUoKChUaW1lU3Bhbil2KS5UaWNrcykuVG9PQURhdGUoKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHYuR2V0VHlwZSgpLklzUHJpbWl0aXZlIHx8IHYgaXMgZG91YmxlIHx8IHYgaXMgZGVjaW1hbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2IGlzIGRvdWJsZSAmJiBkb3VibGUuSXNOYU4oKGRvdWJsZSl2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaXMgZG91YmxlICYmIGRvdWJsZS5Jc0luZmluaXR5KChkb3VibGUpdikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAiI05VTSEiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IENvbnZlcnQuVG9Eb3VibGUodiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuVG9TdHJpbmcoIlIxNSIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgPSB2LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSAiMCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVSb3coU3RyaW5nQnVpbGRlciBjYWNoZSwgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IGNlbGxYZnMsIGludCBwcmV2Um93LCBpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHJldlJvdyAhPSAtMSkgY2FjaGUuQXBwZW5kKCI8L3Jvdz4iKTsKKyAgICAgICAgICAgIC8vdWxvbmcgcm93SUQgPSBFeGNlbFJvdy5HZXRSb3dJRChTaGVldElELCByb3cpOworICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8cm93IHI9XCJ7MH1cIiAiLCByb3cpOworICAgICAgICAgICAgUm93SW50ZXJuYWwgY3VyclJvdyA9IF92YWx1ZXMuR2V0VmFsdWUocm93LCAwKSBhcyBSb3dJbnRlcm5hbDsKKyAgICAgICAgICAgIGlmIChjdXJyUm93ICE9IG51bGwpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5IaWRkZW4gPT0gdHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiaHQ9XCIwXCIgaGlkZGVuPVwiMVwiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyUm93LkhlaWdodCAhPSBEZWZhdWx0Um93SGVpZ2h0ICYmIGN1cnJSb3cuSGVpZ2h0Pj0wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KHN0cmluZy5Gb3JtYXQoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgImh0PVwiezB9XCIgIiwgY3VyclJvdy5IZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuQ3VzdG9tSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoImN1c3RvbUhlaWdodD1cIjFcIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjdXJyUm93Lk91dGxpbmVMZXZlbCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIm91dGxpbmVMZXZlbCA9XCJ7MH1cIiAiLCBjdXJyUm93Lk91dGxpbmVMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LkNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuSGlkZGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiIGNvbGxhcHNlZD1cIjFcIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoIiBjb2xsYXBzZWQ9XCIxXCIgaGlkZGVuPVwiMVwiICIpOyAvL0Fsd2F5cyBoaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5QaG9uZXRpYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgicGg9XCIxXCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHMgPSBfc3R5bGVzLkdldFZhbHVlKHJvdywgMCk7CisgICAgICAgICAgICBpZiAocyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCJzPVwiezB9XCIgY3VzdG9tRm9ybWF0PVwiMVwiIiwgY2VsbFhmc1tzXS5uZXdJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWNoZS5BcHBlbmQoIj4iKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVSb3coU3RyZWFtV3JpdGVyIHN3LCBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4gY2VsbFhmcywgaW50IHByZXZSb3csIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmV2Um93ICE9IC0xKSBzdy5Xcml0ZSgiPC9yb3c+Iik7CisgICAgICAgICAgICAvL3Vsb25nIHJvd0lEID0gRXhjZWxSb3cuR2V0Um93SUQoU2hlZXRJRCwgcm93KTsKKyAgICAgICAgICAgIHN3LldyaXRlKCI8cm93IHI9XCJ7MH1cIiAiLCByb3cpOworICAgICAgICAgICAgUm93SW50ZXJuYWwgY3VyclJvdyA9IF92YWx1ZXMuR2V0VmFsdWUocm93LCAwKSBhcyBSb3dJbnRlcm5hbDsKKyAgICAgICAgICAgIGlmIChjdXJyUm93IT1udWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LkhpZGRlbiA9PSB0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoImh0PVwiMFwiIGhpZGRlbj1cIjFcIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyclJvdy5IZWlnaHQgIT0gRGVmYXVsdFJvd0hlaWdodCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKHN0cmluZy5Gb3JtYXQoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgImh0PVwiezB9XCIgIiwgY3VyclJvdy5IZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuQ3VzdG9tSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiY3VzdG9tSGVpZ2h0PVwiMVwiICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuT3V0bGluZUxldmVsID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCJvdXRsaW5lTGV2ZWwgPVwiezB9XCIgIiwgY3VyclJvdy5PdXRsaW5lTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5Db2xsYXBzZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LkhpZGRlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIGNvbGxhcHNlZD1cIjFcIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIGNvbGxhcHNlZD1cIjFcIiBoaWRkZW49XCIxXCIgIik7IC8vQWx3YXlzIGhpZGRlbgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LlBob25ldGljKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoInBoPVwiMVwiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBzID0gX3N0eWxlcy5HZXRWYWx1ZShyb3csIDApOworICAgICAgICAgICAgaWYgKHMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3LldyaXRlKCJzPVwiezB9XCIgY3VzdG9tRm9ybWF0PVwiMVwiIiwgY2VsbFhmc1tzXS5uZXdJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdy5Xcml0ZSgiPiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXBkYXRlIHhtbCB3aXRoIGh5cGVybGlua3MgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3ciPlRoZSBzdHJlYW08L3BhcmFtPgorICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlSHlwZXJMaW5rcyhTdHJlYW1Xcml0ZXIgc3cpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBoeXBzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxVcmk+KF9oeXBlckxpbmtzKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvL2ZvcmVhY2ggKHVsb25nIGNlbGwgaW4gX2h5cGVyTGlua3MpCisgICAgICAgICAgICAgICAgd2hpbGUoY3NlLk5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxoeXBlcmxpbmtzPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvL2ludCByb3csIGNvbDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVyaSA9IF9oeXBlckxpbmtzLkdldFZhbHVlKGNzZS5Sb3csIGNzZS5Db2x1bW4pOworICAgICAgICAgICAgICAgICAgICAvL0V4Y2VsQ2VsbCBjZWxsID0gX2NlbGxzW2NlbGxJZF0gYXMgRXhjZWxDZWxsOworICAgICAgICAgICAgICAgICAgICBpZiAodXJpIGlzIEV4Y2VsSHlwZXJMaW5rICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eSgodXJpIGFzIEV4Y2VsSHlwZXJMaW5rKS5SZWZlcmVuY2VBZGRyZXNzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxIeXBlckxpbmsgaGwgPSB1cmkgYXMgRXhjZWxIeXBlckxpbms7CisgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPGh5cGVybGluayByZWY9XCJ7MH1cIiBsb2NhdGlvbj1cInsxfVwiIHsyfXszfS8+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHNbY3NlLlJvdywgY3NlLkNvbHVtbiwgY3NlLlJvdyArIGhsLlJvd1NwYW5uLCBjc2UuQ29sdW1uICsgaGwuQ29sU3Bhbm5dLkFkZHJlc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEZ1bGxBZGRyZXNzKFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoTmFtZSksIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoaGwuUmVmZXJlbmNlQWRkcmVzcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLklzTnVsbE9yRW1wdHkoaGwuRGlzcGxheSkgPyAiIiA6ICJkaXNwbGF5PVwiIiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoaGwuRGlzcGxheSkgKyAiXCIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Jc051bGxPckVtcHR5KGhsLlRvb2xUaXApID8gIiIgOiAidG9vbHRpcD1cIiIgKyBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGhsLlRvb2xUaXApICsgIlwiICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHVyaSE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlkOworICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGh5cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmkgaXMgRXhjZWxIeXBlckxpbmspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlwID0gKChFeGNlbEh5cGVyTGluayl1cmkpLk9yaWdpbmFsVXJpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5cCA9IHVyaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoeXBzLkNvbnRhaW5zS2V5KGh5cC5PcmlnaW5hbFN0cmluZykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBoeXBzW2h5cC5PcmlnaW5hbFN0cmluZ107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKGh5cCwgUGFja2FnaW5nLlRhcmdldE1vZGUuRXh0ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFIeXBlcmxpbmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmkgaXMgRXhjZWxIeXBlckxpbmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEh5cGVyTGluayBobCA9IHVyaSBhcyBFeGNlbEh5cGVyTGluazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxoeXBlcmxpbmsgcmVmPVwiezB9XCIgezJ9ezN9cjppZD1cInsxfVwiIC8+IiwgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGNzZS5Sb3csIGNzZS5Db2x1bW4pLCByZWxhdGlvbnNoaXAuSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Jc051bGxPckVtcHR5KGhsLkRpc3BsYXkpID8gIiIgOiAiZGlzcGxheT1cIiIgKyBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGhsLkRpc3BsYXkpICsgIlwiICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuSXNOdWxsT3JFbXB0eShobC5Ub29sVGlwKSA/ICIiIDogInRvb2x0aXA9XCIiICsgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShobC5Ub29sVGlwKSArICJcIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxoeXBlcmxpbmsgcmVmPVwiezB9XCIgcjppZD1cInsxfVwiIC8+IiwgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGNzZS5Sb3csIGNzZS5Db2x1bW4pLCByZWxhdGlvbnNoaXAuSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHJlbGF0aW9uc2hpcC5JZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vY2VsbC5IeXBlckxpbmtSSWQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIjwvaHlwZXJsaW5rcz4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIHRoZSBoeXBlcmxpbmtzIG5vZGUgaW4gdGhlIFhNTAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIFhtbE5vZGUgQ3JlYXRlSHlwZXJMaW5rQ29sbGVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEVsZW1lbnQgaGw9X3dvcmtzaGVldFhtbC5DcmVhdGVFbGVtZW50KCJoeXBlcmxpbmtzIixFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICBYbWxOb2RlIHByZXZOb2RlID0gX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29uZGl0aW9uYWxGb3JtYXR0aW5nIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBpZiAocHJldk5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2Tm9kZSA9IF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOm1lcmdlQ2VsbHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByZXZOb2RlID0gX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6c2hlZXREYXRhIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50Lkluc2VydEFmdGVyKGhsLCBwcmV2Tm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGltZW5zaW9uIGFkZHJlc3MgZm9yIHRoZSB3b3Jrc2hlZXQuIAorICAgICAgICAvLy8gVG9wIGxlZnQgY2VsbCB0byBCb3R0b20gcmlnaHQuCisgICAgICAgIC8vLyBJZiB0aGUgd29ya3NoZWV0IGhhcyBubyBjZWxscywgbnVsbCBpcyByZXR1cm5lZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSBEaW1lbnNpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpbnQgZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sOworICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLkdldERpbWVuc2lvbihvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIG91dCB0b1Jvdywgb3V0IHRvQ29sKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkci5fd3MgPSBOYW1lOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsU2hlZXRQcm90ZWN0aW9uIF9wcm90ZWN0aW9uPW51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFjY2VzcyB0byBzaGVldCBwcm90ZWN0aW9uIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsU2hlZXRQcm90ZWN0aW9uIFByb3RlY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9wcm90ZWN0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcHJvdGVjdGlvbiA9IG5ldyBFeGNlbFNoZWV0UHJvdGVjdGlvbihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9wcm90ZWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbiBfcHJvdGVjdGVkUmFuZ2VzOworICAgICAgICBwdWJsaWMgRXhjZWxQcm90ZWN0ZWRSYW5nZUNvbGxlY3Rpb24gUHJvdGVjdGVkUmFuZ2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcHJvdGVjdGVkUmFuZ2VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0ZWRSYW5nZXMgPSBuZXcgRXhjZWxQcm90ZWN0ZWRSYW5nZUNvbGxlY3Rpb24oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9wcm90ZWN0ZWRSYW5nZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIERyYXdpbmcKKyAgICAgICAgRXhjZWxEcmF3aW5ncyBfZHJhd2luZ3MgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb2xsZWN0aW9uIG9mIGRyYXdpbmctb2JqZWN0cyBsaWtlIHNoYXBlcywgaW1hZ2VzIGFuZCBjaGFydHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ3MgRHJhd2luZ3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kcmF3aW5ncyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RyYXdpbmdzID0gbmV3IEV4Y2VsRHJhd2luZ3MoX3BhY2thZ2UsIHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgRXhjZWxUYWJsZUNvbGxlY3Rpb24gX3RhYmxlcyA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRhYmxlcyBkZWZpbmVkIGluIHRoZSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlQ29sbGVjdGlvbiBUYWJsZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoV29ya2Jvb2suX25leHRUYWJsZUlEID09IGludC5NaW5WYWx1ZSkgV29ya2Jvb2suUmVhZEFsbFRhYmxlcygpOworICAgICAgICAgICAgICAgIGlmIChfdGFibGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGFibGVzID0gbmV3IEV4Y2VsVGFibGVDb2xsZWN0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3RhYmxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uIF9waXZvdFRhYmxlcyA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBpdm90dGFibGVzIGRlZmluZWQgaW4gdGhlIHdvcmtzaGVldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24gUGl2b3RUYWJsZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoX3Bpdm90VGFibGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Jvb2suX25leHRQaXZvdFRhYmxlSUQgPT0gaW50Lk1pblZhbHVlKSBXb3JrYm9vay5SZWFkQWxsVGFibGVzKCk7CisgICAgICAgICAgICAgICAgICAgIF9waXZvdFRhYmxlcyA9IG5ldyBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3Bpdm90VGFibGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xsZWN0aW9uIF9jb25kaXRpb25hbEZvcm1hdHRpbmcgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25kaXRpb25hbEZvcm1hdHRpbmcgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LiBVc2UgdGhlIEFkZCBtZXRob2RzIHRvIGNyZWF0ZSBDb25kaXRpb25hbEZvcm1hdHRpbmcgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3Jrc2hlZXQuIFRoZW4KKyAgICAgICAgLy8vIHNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UgcmV0dXJuZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24iLz4KKyAgICAgICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbiBDb25kaXRpb25hbEZvcm1hdHRpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24odGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfY29uZGl0aW9uYWxGb3JtYXR0aW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gX2RhdGFWYWxpZGF0aW9uID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGF0YVZhbGlkYXRpb24gZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LiBVc2UgdGhlIEFkZCBtZXRob2RzIHRvIGNyZWF0ZSBEYXRhVmFsaWRhdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3Jrc2hlZXQuIFRoZW4KKyAgICAgICAgLy8vIHNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UgcmV0dXJuZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbiIvPgorICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gRGF0YVZhbGlkYXRpb25zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKF9kYXRhVmFsaWRhdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RhdGFWYWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFWYWxpZGF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQmFja2dyb3VuZEltYWdlIF9iYWNrZ3JvdW5kSW1hZ2UgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbiBpbWFnZSBkaXNwbGF5ZWQgYXMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHdvcmtzaGVldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQmFja2dyb3VuZEltYWdlIEJhY2tncm91bmRJbWFnZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2JhY2tncm91bmRJbWFnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JhY2tncm91bmRJbWFnZSA9IG5ldyBFeGNlbEJhY2tncm91bmRJbWFnZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iYWNrZ3JvdW5kSW1hZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJucyB0aGUgc3R5bGUgSUQgZ2l2ZW4gYSBzdHlsZSBuYW1lLiAgCisJCS8vLyBUaGUgc3R5bGUgSUQgd2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBmb3VuZCwgYnV0IG9ubHkgaWYgdGhlIHN0eWxlIG5hbWUgZXhpc3RzIQorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IlN0eWxlTmFtZSI+PC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJaW50ZXJuYWwgaW50IEdldFN0eWxlSUQoc3RyaW5nIFN0eWxlTmFtZSkKKwkJeworCQkJRXhjZWxOYW1lZFN0eWxlWG1sIG5hbWVkU3R5bGU9bnVsbDsKKyAgICAgICAgICAgIFdvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlcy5GaW5kQnlJRChTdHlsZU5hbWUsIHJlZiBuYW1lZFN0eWxlKTsKKyAgICAgICAgICAgIGlmIChuYW1lZFN0eWxlLlhmSWQgPT0gaW50Lk1pblZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWVkU3R5bGUuWGZJZD1Xb3JrYm9vay5TdHlsZXMuQ2VsbFhmcy5GaW5kSW5kZXhCeUlEKG5hbWVkU3R5bGUuU3R5bGUuSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hbWVkU3R5bGUuWGZJZDsKKwkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgd29ya2Jvb2sgb2JqZWN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFdvcmtib29rIFdvcmtib29rCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcGFja2FnZS5Xb3JrYm9vazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisgICAgICAgICNlbmRyZWdpb24gIC8vIEVORCBXb3Jrc2hlZXQgUHJpdmF0ZSBNZXRob2RzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IHRoZSBuZXh0IElEIGZyb20gYSBzaGFyZWQgZm9ybXVsYSBvciBhbiBBcnJheSBmb3JtdWxhCisgICAgICAgIC8vLyBTaGFyZWRmb3J1bWxhcyB3aWxsIGhhdmUgYW4gaWQgZnJvbSAwLXguIEFycmF5IGZvcm11bGEgaWRzIHN0YXJ0IGZyb20gMHg0MDAwMDAxLS4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNBcnJheSI+SWYgdGhlIGZvcm11bGEgaXMgYW4gYXJyYXkgZm9ybXVsYTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIGludCBHZXRNYXhTaGFyZUZ1bmN0aW9uSW5kZXgoYm9vbCBpc0FycmF5KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaT1fc2hhcmVkRm9ybXVsYXMuQ291bnQgKyAxOworICAgICAgICAgICAgaWYgKGlzQXJyYXkpCisgICAgICAgICAgICAgICAgaSB8PSAweDQwMDAwMDAwOworCisgICAgICAgICAgICB3aGlsZShfc2hhcmVkRm9ybXVsYXMuQ29udGFpbnNLZXkoaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRIRkxlZ2FjeURyYXdpbmdSZWwoc3RyaW5nIHJlbElEKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmxlZ2FjeURyYXdpbmdIRi9AcjppZCIsIHJlbElEKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZUxlZ2FjeURyYXdpbmdSZWwoc3RyaW5nIHJlbElEKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbiA9IFdvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJkOmxlZ2FjeURyYXdpbmdbQHI6aWQ9XCJ7MH1cIl0iLCByZWxJRCksIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKG4gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIFVwZGF0ZUNlbGxzV2l0aERhdGUxOTA0U2V0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzKTsKKyAgICAgICAgICAgIHZhciBvZmZzZXQgPSBXb3JrYm9vay5EYXRlMTkwNCA/IC1FeGNlbFdvcmtib29rLmRhdGUxOTA0T2Zmc2V0IDogRXhjZWxXb3JrYm9vay5kYXRlMTkwNE9mZnNldDsKKyAgICAgICAgICAgIHdoaWxlKGNzZS5Nb3ZlTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjc2UuVmFsdWUgaXMgRGF0ZVRpbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNkdiA9ICgoRGF0ZVRpbWUpY3NlLlZhbHVlKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2R2ICs9IG9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3NlLlZhbHVlID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZShzZHYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0Rm9ybXVsYShpbnQgcm93LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdiA9IF9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgICBpZiAodiBpcyBpbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zaGFyZWRGb3JtdWxhc1soaW50KXZdLkdldEZvcm11bGEocm93LGNvbCwgTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldEZvcm11bGFSMUMxKGludCByb3csIGludCBjb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2ID0gX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgIGlmICh2IGlzIGludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2YgPSBfc2hhcmVkRm9ybXVsYXNbKGludCl2XTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzEoc2YuRm9ybXVsYSwgc2YuU3RhcnRSb3csIHNmLlN0YXJ0Q29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzEodi5Ub1N0cmluZygpLCByb3csIGNvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERpc3Bvc2VJbnRlcm5hbChJRGlzcG9zYWJsZSBjYW5kaWRhdGVEaXNwb3NhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlRGlzcG9zYWJsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZURpc3Bvc2FibGUuRGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZUludGVybmFsKF92YWx1ZXMpOworICAgICAgICAgICAgRGlzcG9zZUludGVybmFsKF9mb3JtdWxhcyk7CisgICAgICAgICAgICBEaXNwb3NlSW50ZXJuYWwoX2ZsYWdzKTsKKyAgICAgICAgICAgIERpc3Bvc2VJbnRlcm5hbChfaHlwZXJMaW5rcyk7CisgICAgICAgICAgICBEaXNwb3NlSW50ZXJuYWwoX3N0eWxlcyk7CisgICAgICAgICAgICBEaXNwb3NlSW50ZXJuYWwoX3R5cGVzKTsKKyAgICAgICAgICAgIERpc3Bvc2VJbnRlcm5hbChfY29tbWVudHNTdG9yZSk7CisgICAgICAgICAgICBEaXNwb3NlSW50ZXJuYWwoX2Zvcm11bGFUb2tlbnMpOworCisgICAgICAgICAgICBfdmFsdWVzID0gbnVsbDsKKyAgICAgICAgICAgIF9mb3JtdWxhcyA9IG51bGw7CisgICAgICAgICAgICBfZmxhZ3MgPSBudWxsOworICAgICAgICAgICAgX2h5cGVyTGlua3MgPSBudWxsOworICAgICAgICAgICAgX3N0eWxlcyA9IG51bGw7CisgICAgICAgICAgICBfdHlwZXMgPSBudWxsOworICAgICAgICAgICAgX2NvbW1lbnRzU3RvcmUgPSBudWxsOworICAgICAgICAgICAgX2Zvcm11bGFUb2tlbnMgPSBudWxsOworCisgICAgICAgICAgICBfcGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICBfcGl2b3RUYWJsZXMgPSBudWxsOworICAgICAgICAgICAgX3Byb3RlY3Rpb24gPSBudWxsOworICAgICAgICAgICAgaWYoX3NoYXJlZEZvcm11bGFzICE9IG51bGwpIF9zaGFyZWRGb3JtdWxhcy5DbGVhcigpOworICAgICAgICAgICAgX3NoYXJlZEZvcm11bGFzID0gbnVsbDsKKyAgICAgICAgICAgIF9zaGVldFZpZXcgPSBudWxsOworICAgICAgICAgICAgX3RhYmxlcyA9IG51bGw7CisgICAgICAgICAgICBfdm1sRHJhd2luZ3MgPSBudWxsOworICAgICAgICAgICAgX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9IG51bGw7CisgICAgICAgICAgICBfZGF0YVZhbGlkYXRpb24gPSBudWxsOworICAgICAgICAgICAgX2RyYXdpbmdzID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCB0aGUgRXhjZWxDb2x1bW4gZm9yIGNvbHVtbiAoc3BhbiBDb2x1bW5NaW4gYW5kIENvbHVtbk1heCkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sdW1uIEdldENvbHVtbihpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYyA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgY29sdW1uKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvdyA9IDAsIGNvbCA9IGNvbHVtbjsKKyAgICAgICAgICAgICAgICBpZiAoX3ZhbHVlcy5QcmV2Q2VsbChyZWYgcm93LCByZWYgY29sKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBfdmFsdWVzLkdldFZhbHVlKDAsIGNvbCkgYXMgRXhjZWxDb2x1bW47CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5Db2x1bW5NYXggPj0gY29sdW1uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYzsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKEV4Y2VsV29ya3NoZWV0IHgsIEV4Y2VsV29ya3NoZWV0IHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB4Lk5hbWUgPT0geS5OYW1lICYmIHguU2hlZXRJRCA9PSB5LlNoZWV0SUQgJiYgeC5Xb3Jrc2hlZXRYbWwuT3V0ZXJYbWwgPT0geS5Xb3Jrc2hlZXRYbWwuT3V0ZXJYbWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEdldEhhc2hDb2RlKEV4Y2VsV29ya3NoZWV0IG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG9iai5Xb3Jrc2hlZXRYbWwuT3V0ZXJYbWwuR2V0SGFzaENvZGUoKTsKKyAgICAgICAgfQorCX0gIC8vIEVORCBjbGFzcyBXb3Jrc2hlZXQKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFdvcmtzaGVldFZpZXcuY3MgYi9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRWaWV3LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGEwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRWaWV3LmNzCkBAIC0wLDAgKzEsNDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBL5GxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBL5GxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisJLy8vIDxzdW1tYXJ5PgorCS8vLyBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgdmlldyBzdGF0ZXMgb2YgdGhlIHdvcmtzaGVldAorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEV4Y2VsV29ya3NoZWV0VmlldyA6IFhtbEhlbHBlcgorCXsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHdvcmtzaGVldCBwYW5lcyBhZnRlciBhIGZyZWV6ZSBvciBzcGxpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEV4Y2VsV29ya3NoZWV0UGFuZXMgOiBYbWxIZWxwZXIKKyAgICAgICAgeworICAgICAgICAgICAgWG1sRWxlbWVudCBfc2VsZWN0aW9uTm9kZSA9IG51bGw7CisgICAgICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldFBhbmVzKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkgOgorICAgICAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodG9wTm9kZS5OYW1lPT0ic2VsZWN0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25Ob2RlPXRvcE5vZGUgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBfYWN0aXZlQ2VsbFBhdGggPSAiQGFjdGl2ZUNlbGwiOworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFNldCB0aGUgYWN0aXZlIGNlbGwuIE11c3QgYmUgc2V0IHdpdGhpbiB0aGUgU2VsZWN0ZWRSYW5nZS4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEFjdGl2ZUNlbGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhZGRyZXNzID0gR2V0WG1sTm9kZVN0cmluZyhfYWN0aXZlQ2VsbFBhdGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJBMSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyb21Db2wsIGZyb21Sb3csIHRvQ29sLCB0b1JvdzsKKyAgICAgICAgICAgICAgICAgICAgaWYoX3NlbGVjdGlvbk5vZGU9PW51bGwpIENyZWF0ZVNlbGVjdGlvbkVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyh2YWx1ZSwgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2FjdGl2ZUNlbGxQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFhtbEVsZW1lbnQpVG9wTm9kZSkuR2V0QXR0cmlidXRlKCJzcXJlZiIpID09ICIiKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUmFuZ2UgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86QWRkIGZpeCBmb3Igb3V0IG9mIHJhbmdlIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVNlbGVjdGlvbkVsZW1lbnQoKQorICAgICAgICAgICAgeworIAkgICAgICAgICAgICBfc2VsZWN0aW9uTm9kZT1Ub3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoX3NlbGVjdGlvbk5vZGUpOworICAgICAgICAgICAgICAgIFRvcE5vZGU9X3NlbGVjdGlvbk5vZGU7ICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3RyaW5nIF9zZWxlY3Rpb25SYW5nZVBhdGggPSAiQHNxcmVmIjsKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBTZWxlY3RlZCBDZWxscy5Vc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggQWN0aXZlQ2VsbAorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgIAorICAgICAgICAgICAgcHVibGljIHN0cmluZyBTZWxlY3RlZFJhbmdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IEdldFhtbE5vZGVTdHJpbmcoX3NlbGVjdGlvblJhbmdlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkExIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbUNvbCwgZnJvbVJvdywgdG9Db2wsIHRvUm93OworICAgICAgICAgICAgICAgICAgICBpZihfc2VsZWN0aW9uTm9kZT09bnVsbCkgQ3JlYXRlU2VsZWN0aW9uRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKHZhbHVlLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIG91dCB0b1Jvdywgb3V0IHRvQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2VsZWN0aW9uUmFuZ2VQYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFhtbEVsZW1lbnQpVG9wTm9kZSkuR2V0QXR0cmlidXRlKCJhY3RpdmVDZWxsIikgPT0gIiIpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlQ2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzpBZGQgZml4IGZvciBvdXQgb2YgcmFuZ2UgaGVyZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisJCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKworCQkjcmVnaW9uIEV4Y2VsV29ya3NoZWV0VmlldyBDb25zdHJ1Y3RvcgorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBDcmVhdGVzIGEgbmV3IEV4Y2VsV29ya3NoZWV0VmlldyB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSB2aWV3IHN0YXRlcyBvZiB0aGUgd29ya3NoZWV0LgorCQkvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ieGxXb3Jrc2hlZXQiPjwvcGFyYW0+CisJCWludGVybmFsIEV4Y2VsV29ya3NoZWV0VmlldyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsICBFeGNlbFdvcmtzaGVldCB4bFdvcmtzaGVldCkgOgorICAgICAgICAgICAgYmFzZShucywgbm9kZSkKKwkJeworICAgICAgICAgICAgX3dvcmtzaGVldCA9IHhsV29ya3NoZWV0OworICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInNoZWV0Vmlld3MiLCAic2hlZXRWaWV3IiwgInBhbmUiLCAic2VsZWN0aW9uIiB9OworICAgICAgICAgICAgUGFuZXMgPSBMb2FkUGFuZXMoKTsgCisJCX0KKworCQkjZW5kcmVnaW9uCisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXRQYW5lc1tdIExvYWRQYW5lcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE5vZGVMaXN0IG5vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygiLy9kOnNlbGVjdGlvbiIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYobm9kZXMuQ291bnQ9PTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzW10geyBuZXcgRXhjZWxXb3Jrc2hlZXRQYW5lcyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlKSB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0UGFuZXNbXSBwYW5lcyA9IG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzW25vZGVzLkNvdW50XTsKKyAgICAgICAgICAgICAgICBpbnQgaT0wOworICAgICAgICAgICAgICAgIGZvcmVhY2goWG1sRWxlbWVudCBlbGVtIGluIG5vZGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuZXNbaSsrXSA9IG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzKE5hbWVTcGFjZU1hbmFnZXIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGFuZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJI3JlZ2lvbiBTaGVldFZpZXdFbGVtZW50CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNoZWV0VmlldyBlbGVtZW50CisJCS8vLyA8L3N1bW1hcnk+CisJCXByb3RlY3RlZCBpbnRlcm5hbCBYbWxFbGVtZW50IFNoZWV0Vmlld0VsZW1lbnQKKwkJeworCQkJZ2V0IAorCQkJeworCQkJCXJldHVybiAoWG1sRWxlbWVudClUb3BOb2RlOworCQkJfQorCQl9CisJCSNlbmRyZWdpb24KKwkJI3JlZ2lvbiBUYWJTZWxlY3RlZAorICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnQgX3NlbGVjdGlvbk5vZGUgPSBudWxsOworICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnQgU2VsZWN0aW9uTm9kZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VsZWN0aW9uTm9kZSA9IFNoZWV0Vmlld0VsZW1lbnQuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnNlbGVjdGlvbiIsIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAoX3NlbGVjdGlvbk5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25Ob2RlID0gX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgICAgICBTaGVldFZpZXdFbGVtZW50LkFwcGVuZENoaWxkKF9zZWxlY3Rpb25Ob2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zZWxlY3Rpb25Ob2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiBQdWJsaWMgTWV0aG9kcyAmIFByb3BlcnRpZXMKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGFjdGl2ZSBjZWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEFjdGl2ZUNlbGwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhbmVzW1BhbmVzLkdldFVwcGVyQm91bmQoMCldLkFjdGl2ZUNlbGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGFuZXNbUGFuZXMuR2V0VXBwZXJCb3VuZCgwKV0uQWN0aXZlQ2VsbCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlbGVjdGVkIENlbGxzIGluIHRoZSB3b3Jrc2hlZXQuVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEFjdGl2ZUNlbGwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBTZWxlY3RlZFJhbmdlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQYW5lc1tQYW5lcy5HZXRVcHBlckJvdW5kKDApXS5TZWxlY3RlZFJhbmdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGFuZXNbUGFuZXMuR2V0VXBwZXJCb3VuZCgwKV0uU2VsZWN0ZWRSYW5nZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyBpZiB0aGUgd29ya3NoZWV0IGlzIHNlbGVjdGVkIHdpdGhpbiB0aGUgd29ya2Jvb2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgVGFiU2VsZWN0ZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAdGFiU2VsZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIC8vIGVuc3VyZSBubyBvdGhlciB3b3Jrc2hlZXQgaGFzIGl0cyB0YWJTZWxlY3RlZCBhdHRyaWJ1dGUgc2V0IHRvIDEKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgc2hlZXQgaW4gX3dvcmtzaGVldC5fcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQuVmlldy5UYWJTZWxlY3RlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIFNoZWV0Vmlld0VsZW1lbnQuU2V0QXR0cmlidXRlKCJ0YWJTZWxlY3RlZCIsICIxIik7CisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgYm9va1ZpZXcgPSBfd29ya3NoZWV0Lldvcmtib29rLldvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp3b3JrYm9va1ZpZXciLCBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChib29rVmlldyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29rVmlldy5TZXRBdHRyaWJ1dGUoImFjdGl2ZVRhYiIsIChfd29ya3NoZWV0LlBvc2l0aW9uSUQgLSAxKS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB0YWJTZWxlY3RlZCIsICIwIik7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFNldHMgdGhlIHZpZXcgbW9kZSBvZiB0aGUgd29ya3NoZWV0IHRvIHBhZ2VsYXlvdXQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIGJvb2wgUGFnZUxheW91dFZpZXcKKwkJeworCQkJZ2V0CisJCQl7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB2aWV3IikgPT0gInBhZ2VMYXlvdXQiOworCQkJfQorCQkJc2V0CisJCQl7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIsICJwYWdlTGF5b3V0Iik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTaGVldFZpZXdFbGVtZW50LlJlbW92ZUF0dHJpYnV0ZSgidmlldyIpOworCQkJfQorCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgdGhlIHZpZXcgbW9kZSBvZiB0aGUgd29ya3NoZWV0IHRvIHBhZ2VicmVhaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQYWdlQnJlYWtWaWV3CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIpID09ICJwYWdlQnJlYWtQcmV2aWV3IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHZpZXciLCAicGFnZUJyZWFrUHJldmlldyIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU2hlZXRWaWV3RWxlbWVudC5SZW1vdmVBdHRyaWJ1dGUoInZpZXciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTaG93IGdyaWRsaW5lcyBpbiB0aGUgd29ya3NoZWV0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dHcmlkTGluZXMgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHNob3dHcmlkTGluZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzaG93R3JpZExpbmVzIiwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNob3cgdGhlIENvbHVtbi9Sb3cgaGVhZGVycyAoY29udGFpbmcgY29sdW1uIGxldHRlcnMgYW5kIHJvdyBudW1iZXJzKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaG93SGVhZGVycworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93Um93Q29sSGVhZGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNob3dSb3dDb2xIZWFkZXJzIiwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdpbmRvdyB6b29tIG1hZ25pZmljYXRpb24gZm9yIGN1cnJlbnQgdmlldyByZXByZXNlbnRpbmcgcGVyY2VudCB2YWx1ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgWm9vbVNjYWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAem9vbVNjYWxlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAxMCB8fCB2YWx1ZSA+IDQwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlpvb21lIHNjYWxlIG91dCBvZiByYW5nZSAoMTAtNDAwKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAem9vbVNjYWxlIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNoZWV0IGlzIGluICdyaWdodCB0byBsZWZ0JyBkaXNwbGF5IG1vZGUuIFdoZW4gaW4gdGhpcyBtb2RlLENvbHVtbiBBIGlzIG9uIHRoZSBmYXIgcmlnaHQsIENvbHVtbiBCIDtpcyBvbmUgY29sdW1uIGxlZnQgb2YgQ29sdW1uIEEsIGFuZCBzbyBvbi4gQWxzbyxpbmZvcm1hdGlvbiBpbiBjZWxscyBpcyBkaXNwbGF5ZWQgaW4gdGhlIFJpZ2h0IHRvIExlZnQgZm9ybWF0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBSaWdodFRvTGVmdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkByaWdodFRvTGVmdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHJpZ2h0VG9MZWZ0IiwgdmFsdWUgPT0gdHJ1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBXaW5kb3dQcm90ZWN0aW9uIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkB3aW5kb3dQcm90ZWN0aW9uIixmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHdpbmRvd1Byb3RlY3Rpb24iLHZhbHVlLGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWZlcmVuY2UgdG8gdGhlIHBhbmVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldFBhbmVzW10gUGFuZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIHN0cmluZyBfcGFuZU5vZGVQYXRoID0gImQ6cGFuZSI7CisgICAgICAgIHN0cmluZyBfc2VsZWN0aW9uTm9kZVBhdGggPSAiZDpzZWxlY3Rpb24iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGcmVlemUgdGhlIGNvbHVtbnMvcm93cyB0byBsZWZ0IGFuZCBhYm92ZSB0aGUgY2VsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEZyZWV6ZVBhbmVzKGludCBSb3csIGludCBDb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzpmaXggdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNwbGl0cyBhcyB3ZWxsLgorICAgICAgICAgICAgaWYgKFJvdyA9PSAxICYmIENvbHVtbiA9PSAxKSBVbkZyZWV6ZVBhbmVzKCk7CisgICAgICAgICAgICBzdHJpbmcgc3FSZWYgPSBTZWxlY3RlZFJhbmdlLCBhY3RpdmVDZWxsID0gQWN0aXZlQ2VsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgWG1sRWxlbWVudCBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgaWYgKHBhbmVOb2RlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfcGFuZU5vZGVQYXRoKTsKKyAgICAgICAgICAgICAgICBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFuZU5vZGUuUmVtb3ZlQWxsKCk7ICAgLy9DbGVhciBhbGwgYXR0cmlidXRlcworICAgICAgICAgICAgaWYgKENvbHVtbiA+IDEpIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgieFNwbGl0IiwgKENvbHVtbiAtIDEpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKFJvdyA+IDEpIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgieVNwbGl0IiwgKFJvdyAtIDEpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJ0b3BMZWZ0Q2VsbCIsIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhSb3csIENvbHVtbikpOworICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJzdGF0ZSIsICJmcm96ZW4iKTsKKworICAgICAgICAgICAgUmVtb3ZlU2VsZWN0aW9uKCk7CisKKyAgICAgICAgICAgIGlmIChSb3cgPiAxICYmIENvbHVtbj09MSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYW5lTm9kZS5TZXRBdHRyaWJ1dGUoImFjdGl2ZVBhbmUiLCAiYm90dG9tTGVmdCIpOworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsPVRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgc2VsLlNldEF0dHJpYnV0ZSgicGFuZSIsICJib3R0b21MZWZ0Iik7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoc3FSZWYgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOworICAgICAgICAgICAgICAgIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOworICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5zZXJ0QWZ0ZXIoc2VsLCBwYW5lTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChDb2x1bW4gPiAxICYmIFJvdyA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgiYWN0aXZlUGFuZSIsICJ0b3BSaWdodCIpOworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsID0gVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInNlbGVjdGlvbiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBzZWwuU2V0QXR0cmlidXRlKCJwYW5lIiwgInRvcFJpZ2h0Iik7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoc3FSZWYgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOworICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5zZXJ0QWZ0ZXIoc2VsLCBwYW5lTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJhY3RpdmVQYW5lIiwgImJvdHRvbVJpZ2h0Iik7CisgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBzZWwxID0gVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInNlbGVjdGlvbiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBzZWwxLlNldEF0dHJpYnV0ZSgicGFuZSIsICJ0b3BSaWdodCIpOworICAgICAgICAgICAgICAgIHN0cmluZyBjZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKDEsIENvbHVtbik7CisgICAgICAgICAgICAgICAgc2VsMS5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBjZWxsKTsKKyAgICAgICAgICAgICAgICBzZWwxLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBjZWxsKTsKKyAgICAgICAgICAgICAgICBwYW5lTm9kZS5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDEsIHBhbmVOb2RlKTsKKworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsMiA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgY2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhSb3csIDEpOworICAgICAgICAgICAgICAgIHNlbDIuU2V0QXR0cmlidXRlKCJwYW5lIiwgImJvdHRvbUxlZnQiKTsKKyAgICAgICAgICAgICAgICBzZWwyLlNldEF0dHJpYnV0ZSgiYWN0aXZlQ2VsbCIsIGNlbGwpOworICAgICAgICAgICAgICAgIHNlbDIuU2V0QXR0cmlidXRlKCJzcXJlZiIsIGNlbGwpOworICAgICAgICAgICAgICAgIHNlbDEuUGFyZW50Tm9kZS5JbnNlcnRBZnRlcihzZWwyLCBzZWwxKTsKKworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsMyA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgc2VsMy5TZXRBdHRyaWJ1dGUoInBhbmUiLCAiYm90dG9tUmlnaHQiKTsKKyAgICAgICAgICAgICAgICBpZihhY3RpdmVDZWxsIT0iIikgc2VsMy5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoc3FSZWYhPSIiKSBzZWwzLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBzcVJlZik7CisgICAgICAgICAgICAgICAgc2VsMi5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDMsIHNlbDIpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBQYW5lcz1Mb2FkUGFuZXMoKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgUmVtb3ZlU2VsZWN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9GaW5kIHNlbGVjdGlvbiBub2RlcyBhbmQgcmVtb3ZlIHRoZW0gICAgICAgICAgICAKKyAgICAgICAgICAgIFhtbE5vZGVMaXN0IHNlbGVjdGlvbnMgPSBUb3BOb2RlLlNlbGVjdE5vZGVzKF9zZWxlY3Rpb25Ob2RlUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIHNlbCBpbiBzZWxlY3Rpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKHNlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVW5sb2NrIGFsbCByb3dzIGFuZCBjb2x1bW5zIHRvIHNjcm9sbCBmcmVlbHkKKyAgICAgICAgLy8vIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2b2lkIFVuRnJlZXplUGFuZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgc3FSZWYgPSBTZWxlY3RlZFJhbmdlLCBhY3RpdmVDZWxsID0gQWN0aXZlQ2VsbDsKKworICAgICAgICAgICAgWG1sRWxlbWVudCBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgaWYgKHBhbmVOb2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFuZU5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChwYW5lTm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZW1vdmVTZWxlY3Rpb24oKTsKKworICAgICAgICAgICAgUGFuZXM9TG9hZFBhbmVzKCk7CisKKyAgICAgICAgICAgIFNlbGVjdGVkUmFuZ2UgPSBzcVJlZjsKKyAgICAgICAgICAgIEFjdGl2ZUNlbGwgPSBhY3RpdmVDZWxsOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRzLmNzIGIvRVBQbHVzL0V4Y2VsV29ya3NoZWV0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJhNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0V4Y2VsV29ya3NoZWV0cy5jcwpAQCAtMCwwICsxLDEyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS+RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlhtbDsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVkJBOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKwkvLy8gPHN1bW1hcnk+CisJLy8vIFRoZSBjb2xsZWN0aW9uIG9mIHdvcmtzaGVldHMgZm9yIHRoZSB3b3JrYm9vaworCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEV4Y2VsV29ya3NoZWV0cyA6IFhtbEhlbHBlciwgSUVudW1lcmFibGU8RXhjZWxXb3Jrc2hlZXQ+LCBJRGlzcG9zYWJsZQorCXsKKwkJI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BjazsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PGludCwgRXhjZWxXb3Jrc2hlZXQ+IF93b3Jrc2hlZXRzOworCQlwcml2YXRlIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25hbWVzcGFjZU1hbmFnZXI7CisJCSNlbmRyZWdpb24KKwkJI3JlZ2lvbiBFeGNlbFdvcmtzaGVldHMgQ29uc3RydWN0b3IKKwkJaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXRzKEV4Y2VsUGFja2FnZSBwY2ssIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpIDoKKyAgICAgICAgICAgIGJhc2UobnNtLCB0b3BOb2RlKQorCQl7CisJCQlfcGNrID0gcGNrOworICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIgPSBuc207CisJCQlfd29ya3NoZWV0cyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRXhjZWxXb3Jrc2hlZXQ+KCk7CisJCQlpbnQgcG9zaXRpb25JRCA9IDE7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgc2hlZXROb2RlIGluIHRvcE5vZGUuQ2hpbGROb2RlcykKKwkJCXsKKyAgICAgICAgICAgICAgICBpZiAoc2hlZXROb2RlLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLkVsZW1lbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IHNoZWV0Tm9kZS5BdHRyaWJ1dGVzWyJuYW1lIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIC8vR2V0IHRoZSByZWxhdGlvbnNoaXAgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxJZCA9IHNoZWV0Tm9kZS5BdHRyaWJ1dGVzWyJyOmlkIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGludCBzaGVldElEID0gQ29udmVydC5Ub0ludDMyKHNoZWV0Tm9kZS5BdHRyaWJ1dGVzWyJzaGVldElkIl0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vSGlkZGVuIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIGVXb3JrU2hlZXRIaWRkZW4gaGlkZGVuID0gZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlOworICAgICAgICAgICAgICAgICAgICBYbWxOb2RlIGF0dHIgPSBzaGVldE5vZGUuQXR0cmlidXRlc1sic3RhdGUiXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IFRyYW5zbGF0ZUhpZGRlbihhdHRyLlZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgc2hlZXRSZWxhdGlvbiA9IHBjay5Xb3JrYm9vay5QYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJZCk7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmlXb3Jrc2hlZXQgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocGNrLldvcmtib29rLldvcmtib29rVXJpLCBzaGVldFJlbGF0aW9uLlRhcmdldFVyaSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9hZGQgdGhlIHdvcmtzaGVldAorICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXRSZWxhdGlvbi5SZWxhdGlvbnNoaXBUeXBlLkVuZHNXaXRoKCJjaGFydHNoZWV0IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCBuZXcgRXhjZWxDaGFydHNoZWV0KF9uYW1lc3BhY2VNYW5hZ2VyLCBfcGNrLCByZWxJZCwgdXJpV29ya3NoZWV0LCBuYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBoaWRkZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbElkLCB1cmlXb3Jrc2hlZXQsIG5hbWUsIHNoZWV0SUQsIHBvc2l0aW9uSUQsIGhpZGRlbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSUQrKzsKKyAgICAgICAgICAgICAgICB9CisJCQl9CisJCX0KKworICAgICAgICBwcml2YXRlIGVXb3JrU2hlZXRIaWRkZW4gVHJhbnNsYXRlSGlkZGVuKHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJoaWRkZW4iOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5IaWRkZW47CisgICAgICAgICAgICAgICAgY2FzZSAidmVyeUhpZGRlbiI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlV29ya1NoZWV0SGlkZGVuLlZlcnlIaWRkZW47CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVXb3JrU2hlZXRIaWRkZW4uVmlzaWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisJCSNyZWdpb24gRXhjZWxXb3Jrc2hlZXRzIFB1YmxpYyBQcm9wZXJ0aWVzCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vaworCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgaW50IENvdW50CisJCXsKKwkJCWdldCB7IHJldHVybiAoX3dvcmtzaGVldHMuQ291bnQpOyB9CisJCX0KKwkJI2VuZHJlZ2lvbgorICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBFUlJfRFVQX1dPUktTSEVFVCA9ICJBIHdvcmtzaGVldCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd29ya2Jvb2siOworICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgV09SS1NIRUVUX0NPTlRFTlRUWVBFID0gQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENIQVJUU0hFRVRfQ09OVEVOVFRZUEUgPSBAImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNoYXJ0c2hlZXQreG1sIjsKKwkJI3JlZ2lvbiBFeGNlbFdvcmtzaGVldHMgUHVibGljIE1ldGhvZHMKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9yZWFjaCBzdXBwb3J0CisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cmV0dXJucz5BbiBlbnVtZXJhdG9yPC9yZXR1cm5zPgorCQlwdWJsaWMgSUVudW1lcmF0b3I8RXhjZWxXb3Jrc2hlZXQ+IEdldEVudW1lcmF0b3IoKQorCQl7CisJCQlyZXR1cm4gKF93b3Jrc2hlZXRzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCkpOworICAgICAgICB9CisgICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworCisgICAgICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKF93b3Jrc2hlZXRzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCQkjcmVnaW9uIEFkZCBXb3Jrc2hlZXQKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQWRkcyBhIG5ldyBibGFuayB3b3Jrc2hlZXQuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtib29rPC9wYXJhbT4KKwkJcHVibGljIEV4Y2VsV29ya3NoZWV0IEFkZChzdHJpbmcgTmFtZSkKKwkJeworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gQWRkU2hlZXQoTmFtZSxmYWxzZSwgbnVsbCk7CisJCQlyZXR1cm4gd29ya3NoZWV0OworCQl9CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgQWRkU2hlZXQoc3RyaW5nIE5hbWUsIGJvb2wgaXNDaGFydCwgZUNoYXJ0VHlwZT8gY2hhcnRUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2hlZXRJRDsKKyAgICAgICAgICAgIFVyaSB1cmlXb3Jrc2hlZXQ7CisgICAgICAgICAgICBsb2NrIChfd29ya3NoZWV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOYW1lID0gVmFsaWRhdGVGaXhTaGVldE5hbWUoTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKEdldEJ5TmFtZShOYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKEVSUl9EVVBfV09SS1NIRUVUICsgIiA6ICIgKyBOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEdldFNoZWV0VVJJKHJlZiBOYW1lLCBvdXQgc2hlZXRJRCwgb3V0IHVyaVdvcmtzaGVldCwgaXNDaGFydCk7CisgICAgICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHdvcmtzaGVldFBhcnQgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlXb3Jrc2hlZXQsIGlzQ2hhcnQgPyBDSEFSVFNIRUVUX0NPTlRFTlRUWVBFIDogV09SS1NIRUVUX0NPTlRFTlRUWVBFLCBfcGNrLkNvbXByZXNzaW9uKTsKKworICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBuZXcsIGVtcHR5IHdvcmtzaGVldCBhbmQgc2F2ZSBpdCB0byB0aGUgcGFja2FnZQorICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1Xb3Jrc2hlZXQgPSBuZXcgU3RyZWFtV3JpdGVyKHdvcmtzaGVldFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IHdvcmtzaGVldFhtbCA9IENyZWF0ZU5ld1dvcmtzaGVldChpc0NoYXJ0KTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXRYbWwuU2F2ZShzdHJlYW1Xb3Jrc2hlZXQpOworICAgICAgICAgICAgICAgIF9wY2suUGFja2FnZS5GbHVzaCgpOworCisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbCA9IENyZWF0ZVdvcmtib29rUmVsKE5hbWUsIHNoZWV0SUQsIHVyaVdvcmtzaGVldCwgaXNDaGFydCk7CisKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb25JRCA9IF93b3Jrc2hlZXRzLkNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQ7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2hhcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQgPSBuZXcgRXhjZWxDaGFydHNoZWV0KF9uYW1lc3BhY2VNYW5hZ2VyLCBfcGNrLCByZWwsIHVyaVdvcmtzaGVldCwgTmFtZSwgc2hlZXRJRCwgcG9zaXRpb25JRCwgZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlLCAoZUNoYXJ0VHlwZSljaGFydFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQgPSBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbCwgdXJpV29ya3NoZWV0LCBOYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBlV29ya1NoZWV0SGlkZGVuLlZpc2libGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCB3b3Jrc2hlZXQpOworI2lmICFNT05PCisgICAgICAgICAgICAgICAgaWYgKF9wY2suV29ya2Jvb2suVmJhUHJvamVjdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcGNrLldvcmtib29rLlZiYVByb2plY3QuR2V0TW9kdWxlTmFtZUZyb21Xb3Jrc2hlZXQod29ya3NoZWV0KTsKKyAgICAgICAgICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkKG5ldyBFeGNlbFZCQU1vZHVsZSh3b3Jrc2hlZXQuQ29kZU5hbWVDaGFuZ2UpIHsgTmFtZSA9IG5hbWUsIENvZGUgPSAiIiwgQXR0cmlidXRlcyA9IF9wY2suV29ya2Jvb2suVmJhUHJvamVjdC5HZXREb2N1bWVudEF0dHJpYnV0ZXMoTmFtZSwgIjB7MDAwMjA4MjAtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSIpLCBUeXBlID0gZU1vZHVsZVR5cGUuRG9jdW1lbnQsIEhlbHBDb250ZXh0ID0gMCB9KTsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvZGVNb2R1bGVOYW1lID0gbmFtZTsKKworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc2hlZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIGNvcHkgb2YgYSB3b3Jrc2hlZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgd29ya2Jvb2s8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvcHkiPlRoZSB3b3Jrc2hlZXQgdG8gYmUgY29waWVkPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEV4Y2VsV29ya3NoZWV0IEFkZChzdHJpbmcgTmFtZSwgRXhjZWxXb3Jrc2hlZXQgQ29weSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAoX3dvcmtzaGVldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNoZWV0SUQ7CisgICAgICAgICAgICAgICAgVXJpIHVyaVdvcmtzaGVldDsKKyAgICAgICAgICAgICAgICBpZiAoQ29weSBpcyBFeGNlbENoYXJ0c2hlZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gbm90IGNvcHkgYSBjaGFydHNoZWV0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoR2V0QnlOYW1lKE5hbWUpICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oRVJSX0RVUF9XT1JLU0hFRVQpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBHZXRTaGVldFVSSShyZWYgTmFtZSwgb3V0IHNoZWV0SUQsIG91dCB1cmlXb3Jrc2hlZXQsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgY29weSBvZiB0aGUgd29ya3NoZWV0IFhNTAorICAgICAgICAgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCB3b3Jrc2hlZXRQYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpV29ya3NoZWV0LCBXT1JLU0hFRVRfQ09OVEVOVFRZUEUsIF9wY2suQ29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1Xb3Jrc2hlZXQgPSBuZXcgU3RyZWFtV3JpdGVyKHdvcmtzaGVldFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IHdvcmtzaGVldFhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHdvcmtzaGVldFhtbC5Mb2FkWG1sKENvcHkuV29ya3NoZWV0WG1sLk91dGVyWG1sKTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXRYbWwuU2F2ZShzdHJlYW1Xb3Jrc2hlZXQpOworICAgICAgICAgICAgICAgIC8vc3RyZWFtV29ya3NoZWV0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgX3Bjay5QYWNrYWdlLkZsdXNoKCk7CisKKworICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgcmVsYXRpb24gdG8gdGhlIHdvcmtib29rCisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gQ3JlYXRlV29ya2Jvb2tSZWwoTmFtZSwgc2hlZXRJRCwgdXJpV29ya3NoZWV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgYWRkZWQgPSBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbElELCB1cmlXb3Jrc2hlZXQsIE5hbWUsIHNoZWV0SUQsIF93b3Jrc2hlZXRzLkNvdW50ICsgMSwgZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlKTsKKworICAgICAgICAgICAgICAgIC8vQ29weSBjb21tZW50cworICAgICAgICAgICAgICAgIGlmIChDb3B5LkNvbW1lbnRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvcHlDb21tZW50KENvcHksIGFkZGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ29weS5WbWxEcmF3aW5nc0NvbW1lbnRzLkNvdW50ID4gMCkgICAgLy9WbWwgZHJhd2luZ3MgYXJlIGNvcGllZCBhcyBwYXJ0IG9mIHRoZSBjb21tZW50cy4gCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb3B5Vm1sRHJhd2luZyhDb3B5LCBhZGRlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9Db3B5IEhlYWRlckZvb3RlcgorICAgICAgICAgICAgICAgIENvcHlIZWFkZXJGb290ZXJQaWN0dXJlcyhDb3B5LCBhZGRlZCk7CisKKyAgICAgICAgICAgICAgICAvL0NvcHkgYWxsIHJlbGF0aW9uc2hpcHMgCisgICAgICAgICAgICAgICAgLy9Db3B5UmVsYXRpb25TaGlwcyhDb3B5LCBhZGRlZCk7CisgICAgICAgICAgICAgICAgaWYgKENvcHkuRHJhd2luZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29weURyYXdpbmcoQ29weSwgYWRkZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQ29weS5UYWJsZXMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29weVRhYmxlKENvcHksIGFkZGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKENvcHkuUGl2b3RUYWJsZXMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29weVBpdm90VGFibGUoQ29weSwgYWRkZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQ29weS5OYW1lcy5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb3B5U2hlZXROYW1lcyhDb3B5LCBhZGRlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9Db3B5IGFsbCBjZWxscworICAgICAgICAgICAgICAgIENsb25lQ2VsbHMoQ29weSwgYWRkZWQpOworCisgICAgICAgICAgICAgICAgLy9Db3B5IHRoZSBWQkEgY29kZQorI2lmICFNT05PCisgICAgICAgICAgICAgICAgaWYgKF9wY2suV29ya2Jvb2suVmJhUHJvamVjdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcGNrLldvcmtib29rLlZiYVByb2plY3QuR2V0TW9kdWxlTmFtZUZyb21Xb3Jrc2hlZXQoYWRkZWQpOworICAgICAgICAgICAgICAgICAgICBfcGNrLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5BZGQobmV3IEV4Y2VsVkJBTW9kdWxlKGFkZGVkLkNvZGVOYW1lQ2hhbmdlKSB7IE5hbWUgPSBuYW1lLCBDb2RlID0gQ29weS5Db2RlTW9kdWxlLkNvZGUsIEF0dHJpYnV0ZXMgPSBfcGNrLldvcmtib29rLlZiYVByb2plY3QuR2V0RG9jdW1lbnRBdHRyaWJ1dGVzKE5hbWUsICIwezAwMDIwODIwLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0Nn0iKSwgVHlwZSA9IGVNb2R1bGVUeXBlLkRvY3VtZW50LCBIZWxwQ29udGV4dCA9IDAgfSk7CisgICAgICAgICAgICAgICAgICAgIENvcHkuQ29kZU1vZHVsZU5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgX3dvcmtzaGVldHMuQWRkKF93b3Jrc2hlZXRzLkNvdW50ICsgMSwgYWRkZWQpOworCisgICAgICAgICAgICAgICAgLy9SZW1vdmUgYW55IHJlbGF0aW9uIHRvIHByaW50ZXJzZXR0aW5ncy4KKyAgICAgICAgICAgICAgICBYbWxOb2RlIHBhZ2VTZXR1cCA9IGFkZGVkLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6cGFnZVNldHVwIiwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIGlmIChwYWdlU2V0dXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEF0dHJpYnV0ZSBhdHRyID0gKFhtbEF0dHJpYnV0ZSlwYWdlU2V0dXAuQXR0cmlidXRlcy5HZXROYW1lZEl0ZW0oImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxJRCA9IGF0dHIuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBkZWxldGUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBYTUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTZXR1cC5BdHRyaWJ1dGVzLlJlbW92ZShhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRzaGVldCBBZGRDaGFydChzdHJpbmcgTmFtZSwgZUNoYXJ0VHlwZSBjaGFydFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoRXhjZWxDaGFydHNoZWV0KUFkZFNoZWV0KE5hbWUsIHRydWUsIGNoYXJ0VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlTaGVldE5hbWVzKEV4Y2VsV29ya3NoZWV0IENvcHksIEV4Y2VsV29ya3NoZWV0IGFkZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgbmFtZSBpbiBDb3B5Lk5hbWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsTmFtZWRSYW5nZSBuZXdOYW1lOworICAgICAgICAgICAgICAgIGlmICghbmFtZS5Jc05hbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5Xb3JrU2hlZXQgPT0gQ29weS5OYW1lKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gYWRkZWQuTmFtZXMuQWRkKG5hbWUuTmFtZSwgYWRkZWQuQ2VsbHNbbmFtZS5GaXJzdEFkZHJlc3NdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBhZGRlZC5OYW1lcy5BZGQobmFtZS5OYW1lLCBhZGRlZC5Xb3JrYm9vay5Xb3Jrc2hlZXRzW25hbWUuV29ya1NoZWV0XS5DZWxsc1tuYW1lLkZpcnN0QWRkcmVzc10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld05hbWU9YWRkZWQuTmFtZXMuQWRkRm9ybXVsYShuYW1lLk5hbWUsIG5hbWUuRm9ybXVsYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld05hbWU9YWRkZWQuTmFtZXMuQWRkVmFsdWUobmFtZS5OYW1lLCBuYW1lLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBuZXdOYW1lLk5hbWVDb21tZW50ID0gbmFtZS5OYW1lQ29tbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDb3B5VGFibGUoRXhjZWxXb3Jrc2hlZXQgQ29weSwgRXhjZWxXb3Jrc2hlZXQgYWRkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBwcmV2TmFtZSA9ICIiOworICAgICAgICAgICAgLy9GaXJzdCBjb3B5IHRoZSB0YWJsZSBYTUwKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gQ29weS5UYWJsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHhtbD10YmwuVGFibGVYbWwuT3V0ZXJYbWw7CisgICAgICAgICAgICAgICAgaW50IElkID0gX3Bjay5Xb3JrYm9vay5fbmV4dFRhYmxlSUQrKzsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKKyAgICAgICAgICAgICAgICBpZiAocHJldk5hbWUgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gQ29weS5UYWJsZXMuR2V0TmV3VGFibGVOYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IGludC5QYXJzZShwcmV2TmFtZS5TdWJzdHJpbmcoNSkpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0cmluZy5Gb3JtYXQoIlRhYmxlezB9IiwgaXgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3Bjay5Xb3JrYm9vay5FeGlzdHNQaXZvdFRhYmxlTmFtZShuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0cmluZy5Gb3JtYXQoIlRhYmxlezB9IiwgKytpeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldk5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHhtbERvYy5Mb2FkWG1sKHhtbCk7CisgICAgICAgICAgICAgICAgeG1sRG9jLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp0YWJsZS9AaWQiLCB0YmwuTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSBJZC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIHhtbERvYy5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGUvQG5hbWUiLCB0YmwuTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSBuYW1lOworICAgICAgICAgICAgICAgIHhtbERvYy5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGUvQGRpc3BsYXlOYW1lIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gbmFtZTsKKyAgICAgICAgICAgICAgICB4bWwgPSB4bWxEb2MuT3V0ZXJYbWw7CisKKyAgICAgICAgICAgICAgICB2YXIgdXJpVGJsID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvdGFibGVzL3RhYmxlezB9LnhtbCIsIElkKSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlUYmwsICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZSt4bWwiLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtVGJsID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1UYmwuV3JpdGUoeG1sKTsKKyAgICAgICAgICAgICAgICAvL3N0cmVhbVRibC5DbG9zZSgpOworICAgICAgICAgICAgICAgIHN0cmVhbVRibC5GbHVzaCgpOworCisgICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCBhbmQgYWRkIHRoZSBJRCB0byB0aGUgd29ya3NoZWV0IHhtbC4KKyAgICAgICAgICAgICAgICB2YXIgcmVsID0gYWRkZWQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKGFkZGVkLldvcmtzaGVldFVyaSx1cmlUYmwpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3RhYmxlIik7CisKKyAgICAgICAgICAgICAgICBpZiAodGJsLlJlbGF0aW9uc2hpcElEID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdG9wTm9kZSA9IGFkZGVkLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGVQYXJ0cyIsIHRibC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvcE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQuQ3JlYXRlTm9kZSgiZDp0YWJsZVBhcnRzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BOb2RlID0gYWRkZWQuV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp0YWJsZVBhcnRzIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbSA9IGFkZGVkLldvcmtzaGVldFhtbC5DcmVhdGVFbGVtZW50KCJ0YWJsZVBhcnQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJpZCIsRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEF0dHJpYnV0ZSByZWxBdHQ7CisgICAgICAgICAgICAgICAgICAgIHJlbEF0dCA9IGFkZGVkLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoIi8vZDp0YWJsZVBhcnRzL2Q6dGFibGVQYXJ0L0ByOmlkWy49J3swfSddIiwgdGJsLlJlbGF0aW9uc2hpcElEKSwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVsQXR0LlZhbHVlID0gcmVsLklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgQ29weVBpdm90VGFibGUoRXhjZWxXb3Jrc2hlZXQgQ29weSwgRXhjZWxXb3Jrc2hlZXQgYWRkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBwcmV2TmFtZSA9ICIiOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBDb3B5LlBpdm90VGFibGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB4bWwgPSB0YmwuUGl2b3RUYWJsZVhtbC5PdXRlclhtbDsKKyAgICAgICAgICAgICAgICBpbnQgSWQgPSBfcGNrLldvcmtib29rLl9uZXh0UGl2b3RUYWJsZUlEKys7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKKyAgICAgICAgICAgICAgICBpZiAocHJldk5hbWUgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gQ29weS5QaXZvdFRhYmxlcy5HZXROZXdUYWJsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl4PWludC5QYXJzZShwcmV2TmFtZS5TdWJzdHJpbmcoMTApKSsxOworICAgICAgICAgICAgICAgICAgICBuYW1lID0gc3RyaW5nLkZvcm1hdCgiUGl2b3RUYWJsZXswfSIsIGl4KTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9wY2suV29ya2Jvb2suRXhpc3RzUGl2b3RUYWJsZU5hbWUobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzdHJpbmcuRm9ybWF0KCJQaXZvdFRhYmxlezB9IiwgKytpeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldk5hbWU9bmFtZTsKKyAgICAgICAgICAgICAgICBYbWxEb2N1bWVudCB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICAvL1RPRE86IEZpeCBzYXZlIHBpdm90dGFibGUgaGVyZQorICAgICAgICAgICAgICAgIC8vQ29weS5TYXZlKCk7ICAgIC8vU2F2ZSB0aGUgd29ya3NoZWV0IGZpcnN0CisgICAgICAgICAgICAgICAgeG1sRG9jLkxvYWRYbWwoeG1sKTsKKyAgICAgICAgICAgICAgICAvL3htbERvYy5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGUvQGlkIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gSWQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB4bWxEb2MuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnBpdm90VGFibGVEZWZpbml0aW9uL0BuYW1lIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gbmFtZTsKKyAgICAgICAgICAgICAgICB4bWwgPSB4bWxEb2MuT3V0ZXJYbWw7CisKKyAgICAgICAgICAgICAgICB2YXIgdXJpVGJsID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvcGl2b3RUYWJsZXMvcGl2b3RUYWJsZXswfS54bWwiLCBJZCksIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgIHZhciBwYXJ0VGJsID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpVGJsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUGl2b3RUYWJsZSAsIF9wY2suQ29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1UYmwgPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnRUYmwuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgICAgICAgICAgIHN0cmVhbVRibC5Xcml0ZSh4bWwpOworICAgICAgICAgICAgICAgIC8vc3RyZWFtVGJsLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtVGJsLkZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICB4bWwgPSB0YmwuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5PdXRlclhtbDsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIHVyaUNkID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvcGl2b3RDYWNoZS9waXZvdGNhY2hlZGVmaW5pdGlvbnswfS54bWwiLCBJZCksIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgIHdoaWxlIChfcGNrLlBhY2thZ2UuUGFydEV4aXN0cyh1cmlDZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1cmlDZCA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiL3hsL3Bpdm90Q2FjaGUvcGl2b3RjYWNoZWRlZmluaXRpb257MH0ueG1sIiwgKytJZCksIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBwYXJ0Q2QgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlDZCwgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90Q2FjaGVEZWZpbml0aW9uLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtQ2QgPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnRDZC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtQ2QuV3JpdGUoeG1sKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DZC5GbHVzaCgpOworCisgICAgICAgICAgICAgICAgeG1sID0gIjxwaXZvdENhY2hlUmVjb3JkcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgY291bnQ9XCIwXCIgLz4iOworICAgICAgICAgICAgICAgIHZhciB1cmlSZWMgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9waXZvdENhY2hlL3Bpdm90cmVjb3Jkc3swfS54bWwiLCBJZCksIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgIHdoaWxlIChfcGNrLlBhY2thZ2UuUGFydEV4aXN0cyh1cmlSZWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXJpUmVjID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvcGl2b3RDYWNoZS9waXZvdHJlY29yZHN7MH0ueG1sIiwgKytJZCksIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgcGFydFJlYyA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KHVyaVJlYywgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90Q2FjaGVSZWNvcmRzLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtUmVjID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0UmVjLkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1SZWMuV3JpdGUoeG1sKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1SZWMuRmx1c2goKTsKKworICAgICAgICAgICAgICAgIC8vY3JlYXRlIHRoZSByZWxhdGlvbnNoaXAgYW5kIGFkZCB0aGUgSUQgdG8gdGhlIHdvcmtzaGVldCB4bWwuCisgICAgICAgICAgICAgICAgYWRkZWQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKGFkZGVkLldvcmtzaGVldFVyaSwgdXJpVGJsKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdFRhYmxlIik7CisgICAgICAgICAgICAgICAgcGFydFRibC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHRibC5SZWxhdGlvbnNoaXAuU291cmNlVXJpLCB1cmlDZCksIHRibC5DYWNoZURlZmluaXRpb24uUmVsYXRpb25zaGlwLlRhcmdldE1vZGUsIHRibC5DYWNoZURlZmluaXRpb24uUmVsYXRpb25zaGlwLlJlbGF0aW9uc2hpcFR5cGUpOworICAgICAgICAgICAgICAgIHBhcnRDZC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHVyaUNkLCB1cmlSZWMpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90Q2FjaGVSZWNvcmRzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlIZWFkZXJGb290ZXJQaWN0dXJlcyhFeGNlbFdvcmtzaGVldCBDb3B5LCBFeGNlbFdvcmtzaGVldCBhZGRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENvcHkuVG9wTm9kZSAhPSBudWxsICYmIENvcHkuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmhlYWRlckZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpPT1udWxsKSByZXR1cm47CisgICAgICAgICAgICAvL0NvcHkgdGhlIHRleHRzCisgICAgICAgICAgICBDb3B5VGV4dChDb3B5LkhlYWRlckZvb3Rlci5fb2RkSGVhZGVyLCBhZGRlZC5IZWFkZXJGb290ZXIuT2RkSGVhZGVyKTsKKyAgICAgICAgICAgIENvcHlUZXh0KENvcHkuSGVhZGVyRm9vdGVyLl9vZGRGb290ZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5PZGRGb290ZXIpOworICAgICAgICAgICAgQ29weVRleHQoQ29weS5IZWFkZXJGb290ZXIuX2V2ZW5IZWFkZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5FdmVuSGVhZGVyKTsKKyAgICAgICAgICAgIENvcHlUZXh0KENvcHkuSGVhZGVyRm9vdGVyLl9ldmVuRm9vdGVyLCBhZGRlZC5IZWFkZXJGb290ZXIuRXZlbkZvb3Rlcik7CisgICAgICAgICAgICBDb3B5VGV4dChDb3B5LkhlYWRlckZvb3Rlci5fZmlyc3RIZWFkZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5GaXJzdEhlYWRlcik7CisgICAgICAgICAgICBDb3B5VGV4dChDb3B5LkhlYWRlckZvb3Rlci5fZmlyc3RGb290ZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5GaXJzdEZvb3Rlcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQ29weSBhbnkgaW1hZ2VzOworICAgICAgICAgICAgaWYgKENvcHkuSGVhZGVyRm9vdGVyLlBpY3R1cmVzLkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVcmkgc291cmNlID0gQ29weS5IZWFkZXJGb290ZXIuUGljdHVyZXMuVXJpOworICAgICAgICAgICAgICAgIFVyaSBkZXN0ID0gWG1sSGVscGVyLkdldE5ld1VyaShfcGNrLlBhY2thZ2UsIEAiL3hsL2RyYXdpbmdzL3ZtbERyYXdpbmd7MH0udm1sIik7CisgICAgICAgICAgICAgICAgYWRkZWQuRGVsZXRlTm9kZSgiZDpsZWdhY3lEcmF3aW5nSEYiKTsKKworICAgICAgICAgICAgICAgIC8vdmFyIHBhcnQgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydChkZXN0LCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmciLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChFeGNlbFZtbERyYXdpbmdQaWN0dXJlIHBpYyBpbiBDb3B5LkhlYWRlckZvb3Rlci5QaWN0dXJlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gYWRkZWQuSGVhZGVyRm9vdGVyLlBpY3R1cmVzLkFkZChwaWMuSWQsIHBpYy5JbWFnZVVyaSwgcGljLlRpdGxlLCBwaWMuV2lkdGgsIHBpYy5IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxBdHRyaWJ1dGUgYXR0IGluIHBpYy5Ub3BOb2RlLkF0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLlRvcE5vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKGF0dC5OYW1lLCBhdHQuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uVG9wTm9kZS5Jbm5lclhtbCA9IHBpYy5Ub3BOb2RlLklubmVyWG1sOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDb3B5VGV4dChFeGNlbEhlYWRlckZvb3RlclRleHQgZnJvbSwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IHRvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICB0by5MZWZ0QWxpZ25lZFRleHQ9ZnJvbS5MZWZ0QWxpZ25lZFRleHQ7CisgICAgICAgICAgICB0by5DZW50ZXJlZFRleHQgPSBmcm9tLkNlbnRlcmVkVGV4dDsKKyAgICAgICAgICAgIHRvLlJpZ2h0QWxpZ25lZFRleHQgPSBmcm9tLlJpZ2h0QWxpZ25lZFRleHQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENsb25lQ2VsbHMoRXhjZWxXb3Jrc2hlZXQgQ29weSwgRXhjZWxXb3Jrc2hlZXQgYWRkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgc2FtZVdvcmtib29rPShDb3B5Lldvcmtib29rID09IF9wY2suV29ya2Jvb2spOworCisgICAgICAgICAgICBib29sIGRvQWRqdXN0ID0gX3Bjay5Eb0FkanVzdERyYXdpbmdzOworICAgICAgICAgICAgX3Bjay5Eb0FkanVzdERyYXdpbmdzID0gZmFsc2U7CisgICAgICAgICAgICBhZGRlZC5NZXJnZWRDZWxscy5MaXN0LkFkZFJhbmdlKENvcHkuTWVyZ2VkQ2VsbHMuTGlzdCk7CisgICAgICAgICAgICAvL0Zvcm11bGFzCisgICAgICAgICAgICAvL2ZvcmVhY2ggKElSYW5nZUlEIGYgaW4gQ29weS5fZm9ybXVsYUNlbGxzKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBhZGRlZC5fZm9ybXVsYUNlbGxzLkFkZChmKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9TaGFyZWQgRm9ybXVsYXMKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gQ29weS5fc2hhcmVkRm9ybXVsYXMuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRlZC5fc2hhcmVkRm9ybXVsYXMuQWRkKGtleSwgQ29weS5fc2hhcmVkRm9ybXVsYXNba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IHN0eWxlQ2FzaGUgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIC8vQ2VsbHMKKyAgICAgICAgICAgIGludCByb3csY29sOworICAgICAgICAgICAgdmFyIHZhbCA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KENvcHkuX3ZhbHVlcyk7CisgICAgICAgICAgICAvL29iamVjdCBmPW51bGw7CisgICAgICAgICAgICAvL2ZvcmVhY2ggKHZhciBhZGRyIGluIHZhbCkKKyAgICAgICAgICAgIHdoaWxlKHZhbC5OZXh0KCkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vcm93PShpbnQpYWRkcj4+MzI7CisgICAgICAgICAgICAgICAgLy9jb2w9KGludClhZGRyJjMyOworICAgICAgICAgICAgICAgIHJvdyA9IHZhbC5Sb3c7CisgICAgICAgICAgICAgICAgY29sID0gdmFsLkNvbHVtbjsKKyAgICAgICAgICAgICAgICAvL2FkZGVkLl9jZWxscy5BZGQoY2VsbC5DbG9uZShhZGRlZCkpOworICAgICAgICAgICAgICAgIGludCBzdHlsZUlEPTA7CisgICAgICAgICAgICAgICAgaWYgKHJvdyA9PSAwKSAvL0NvbHVtbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBDb3B5Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2wpIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBjLkNsb25lKGFkZGVkLCBjLkNvbHVtbk1pbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS5TdHlsZUlEID0gYy5TdHlsZUlEOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgY2xvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJRCA9IGMuU3R5bGVJRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wgPT0gMCkgLy9Sb3cKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByPUNvcHkuUm93KHJvdyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuQ2xvbmUoYWRkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJRCA9IHIuU3R5bGVJRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkZWQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgci5DbG9uZShhZGRlZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHN0eWxlSUQgPSBDb3B5VmFsdWVzKENvcHksIGFkZGVkLCByb3csIGNvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc2FtZVdvcmtib29rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoc3R5bGVJRCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLl9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIHN0eWxlQ2FzaGVbc3R5bGVJRF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBhZGRlZC5Xb3JrYm9vay5TdHlsZXMuQ2xvbmVTdHlsZShDb3B5Lldvcmtib29rLlN0eWxlcywgc3R5bGVJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzdHlsZUlELCBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLl9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkZWQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGRvQWRqdXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29weVZhbHVlcyhFeGNlbFdvcmtzaGVldCBDb3B5LCBFeGNlbFdvcmtzaGVldCBhZGRlZCwgaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkZWQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgQ29weS5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKSk7CisgICAgICAgICAgICB2YXIgdCA9IENvcHkuX3R5cGVzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkZWQuX3R5cGVzLlNldFZhbHVlKHJvdywgY29sLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGUgZmw9MDsKKyAgICAgICAgICAgIGlmIChDb3B5Ll9mbGFncy5FeGlzdHMocm93LGNvbCxyZWYgZmwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZGVkLl9mbGFncy5TZXRWYWx1ZShyb3csIGNvbCwgZmwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdiA9IENvcHkuX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkZWQuU2V0Rm9ybXVsYShyb3csIGNvbCwgdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcyA9IENvcHkuX3N0eWxlcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgICBpZiAocyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZGVkLl9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGYgPSBDb3B5Ll9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZGVkLl9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDb3B5Q29tbWVudChFeGNlbFdvcmtzaGVldCBDb3B5LCBFeGNlbFdvcmtzaGVldCB3b3JrU2hlZXQpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vRmlyc3QgY29weSB0aGUgZHJhd2luZyBYTUwKKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBDb3B5LkNvbW1lbnRzLkNvbW1lbnRYbWwuSW5uZXJYbWw7CisgICAgICAgICAgICB2YXIgdXJpQ29tbWVudCA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiL3hsL2NvbW1lbnRzezB9LnhtbCIsIHdvcmtTaGVldC5TaGVldElEKSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICBpZiAoX3Bjay5QYWNrYWdlLlBhcnRFeGlzdHModXJpQ29tbWVudCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXJpQ29tbWVudCA9IFhtbEhlbHBlci5HZXROZXdVcmkoX3Bjay5QYWNrYWdlLCAiL3hsL2RyYXdpbmdzL3ZtbGRyYXdpbmd7MH0udm1sIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpQ29tbWVudCwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbW1lbnRzK3htbCIsIF9wY2suQ29tcHJlc3Npb24pOworCisgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtRHJhd2luZyA9IG5ldyBTdHJlYW1Xcml0ZXIocGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgICAgICBzdHJlYW1EcmF3aW5nLldyaXRlKHhtbCk7CisgICAgICAgICAgICAvL3N0cmVhbURyYXdpbmcuQ2xvc2UoKTsKKyAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuRmx1c2goKTsKKworICAgICAgICAgICAgLy9BZGQgdGhlIHJlbGF0aW9uc2hpcCBJRCB0byB0aGUgd29ya3NoZWV0IHhtbC4KKyAgICAgICAgICAgIHZhciBjb21tZW50UmVsYXRpb24gPSB3b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKHdvcmtTaGVldC5Xb3Jrc2hlZXRVcmksdXJpQ29tbWVudCksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvY29tbWVudHMiKTsKKworICAgICAgICAgICAgeG1sID0gQ29weS5WbWxEcmF3aW5nc0NvbW1lbnRzLlZtbERyYXdpbmdYbWwuSW5uZXJYbWw7CisKKyAgICAgICAgICAgIHZhciB1cmlWbWwgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9kcmF3aW5ncy92bWxkcmF3aW5nezB9LnZtbCIsIHdvcmtTaGVldC5TaGVldElEKSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICBpZiAoX3Bjay5QYWNrYWdlLlBhcnRFeGlzdHModXJpVm1sKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1cmlWbWwgPSBYbWxIZWxwZXIuR2V0TmV3VXJpKF9wY2suUGFja2FnZSwgIi94bC9kcmF3aW5ncy92bWxkcmF3aW5nezB9LnZtbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdm1sUGFydCA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KHVyaVZtbCwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC52bWxEcmF3aW5nIiwgX3Bjay5Db21wcmVzc2lvbik7CisgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtVm1sID0gbmV3IFN0cmVhbVdyaXRlcih2bWxQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgICAgICAgIHN0cmVhbVZtbC5Xcml0ZSh4bWwpOworICAgICAgICAgICAgLy9zdHJlYW1WbWwuQ2xvc2UoKTsKKyAgICAgICAgICAgIHN0cmVhbVZtbC5GbHVzaCgpOworCisgICAgICAgICAgICB2YXIgbmV3Vm1sUmVsID0gd29ya1NoZWV0LlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaSh3b3JrU2hlZXQuV29ya3NoZWV0VXJpLHVyaVZtbCksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvdm1sRHJhd2luZyIpOworCisgICAgICAgICAgICAvL0FkZCB0aGUgcmVsYXRpb25zaGlwIElEIHRvIHRoZSB3b3Jrc2hlZXQgeG1sLgorICAgICAgICAgICAgWG1sRWxlbWVudCBlID0gd29ya1NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6bGVnYWN5RHJhd2luZyIsIF9uYW1lc3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JrU2hlZXQuQ3JlYXRlTm9kZSgiZDpsZWdhY3lEcmF3aW5nIik7CisgICAgICAgICAgICAgICAgZSA9IHdvcmtTaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmxlZ2FjeURyYXdpbmciLCBfbmFtZXNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZS5TZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIG5ld1ZtbFJlbC5JZCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlEcmF3aW5nKEV4Y2VsV29ya3NoZWV0IENvcHksIEV4Y2VsV29ya3NoZWV0IHdvcmtTaGVldC8qLCBQYWNrYWdlUmVsYXRpb25zaGlwIHIqLykKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvL0NoZWNrIGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGRyYXdpbmdzCisgICAgICAgICAgICAvL2lmKF94bFBhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKHIuVGFyZ2V0VXJpKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIC8vRmlyc3QgY29weSB0aGUgZHJhd2luZyBYTUwgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RyaW5nIHhtbCA9IENvcHkuRHJhd2luZ3MuRHJhd2luZ1htbC5PdXRlclhtbDsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2YXIgdXJpRHJhdz1uZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9kcmF3aW5ncy9kcmF3aW5nezB9LnhtbCIsIHdvcmtTaGVldC5TaGVldElEKSwgIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgICAgIHZhciBwYXJ0PSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlEcmF3LCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZyt4bWwiLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtRHJhd2luZyA9IG5ldyBTdHJlYW1Xcml0ZXIocGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtRHJhd2luZy5Xcml0ZSh4bWwpOworICAgICAgICAgICAgICAgIC8vc3RyZWFtRHJhd2luZy5DbG9zZSgpOworICAgICAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuRmx1c2goKTsKKworICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IGRyYXdYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBkcmF3WG1sLkxvYWRYbWwoeG1sKTsKKyAgICAgICAgICAgICAgICAvL0FkZCB0aGUgcmVsYXRpb25zaGlwIElEIHRvIHRoZSB3b3Jrc2hlZXQgeG1sLgorICAgICAgICAgICAgICAgIHZhciBkcmF3UmVsYXRpb24gPSB3b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKHdvcmtTaGVldC5Xb3Jrc2hlZXRVcmksdXJpRHJhdyksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvZHJhd2luZyIpOworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZSA9IHdvcmtTaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmRyYXdpbmciLCBfbmFtZXNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgICAgICBlLlNldEF0dHJpYnV0ZSgiaWQiLEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzLCBkcmF3UmVsYXRpb24uSWQpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxEcmF3aW5nIGRyYXcgaW4gQ29weS5EcmF3aW5ncykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3IGlzIEV4Y2VsQ2hhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSBkcmF3IGFzIEV4Y2VsQ2hhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWwgPSBjaGFydC5DaGFydFhtbC5Jbm5lclhtbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFVyaUNoYXJ0ID0gWG1sSGVscGVyLkdldE5ld1VyaShfcGNrLlBhY2thZ2UsICIveGwvY2hhcnRzL2NoYXJ0ezB9LnhtbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0UGFydCA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KFVyaUNoYXJ0LCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5jaGFydCt4bWwiLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1DaGFydCA9IG5ldyBTdHJlYW1Xcml0ZXIoY2hhcnRQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNoYXJ0LldyaXRlKHhtbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3N0cmVhbUNoYXJ0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DaGFydC5GbHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3cgY3JlYXRlIHRoZSBuZXcgcmVsYXRpb25zaGlwIHRvIHRoZSBjb3BpZWQgY2hhcnQgeG1sCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldlJlbElEPWRyYXcuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6Z3JhcGhpY0ZyYW1lL2E6Z3JhcGhpYy9hOmdyYXBoaWNEYXRhL2M6Y2hhcnQvQHI6aWQiLCBDb3B5LkRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaSh1cmlEcmF3LFVyaUNoYXJ0KSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9jaGFydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQXR0cmlidXRlIHJlbEF0dCA9IGRyYXdYbWwuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCIvL2M6Y2hhcnQvQHI6aWRbLj0nezB9J10iLCBwcmV2UmVsSUQpLCBDb3B5LkRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbEF0dC5WYWx1ZT1yZWwuSWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJhdyBpcyBFeGNlbFBpY3R1cmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGljdHVyZSBwaWMgPSBkcmF3IGFzIEV4Y2VsUGljdHVyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmkgPSBwaWMuVXJpUGljOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHModXJpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGljUGFydCA9IHdvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpLCBwaWMuQ29udGVudFR5cGUsIENvbXByZXNzaW9uTGV2ZWwuTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLkltYWdlLlNhdmUocGljUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSwgcGljLkltYWdlRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaSh3b3JrU2hlZXQuV29ya3NoZWV0VXJpLCB1cmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2ltYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpeGVzIHByb2JsZW0gd2l0aCBpbnZhbGlkIGltYWdlIHdoZW4gdGhlIHNhbWUgaW1hZ2UgaXMgdXNlZCBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbE5vZGUgcmVsQXR0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3WG1sLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy94ZHI6cGljL3hkcjpudlBpY1ByL3hkcjpjTnZQci9AbmFtZVsuPSd7MH0nXS8uLi8uLi8uLi94ZHI6YmxpcEZpbGwvYTpibGlwL0ByOmVtYmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy5OYW1lKSwgQ29weS5EcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlbEF0dCE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxBdHQuVmFsdWUgPSByZWwuSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3Bjay5faW1hZ2VzLkNvbnRhaW5zS2V5KHBpYy5JbWFnZUhhc2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wY2suX2ltYWdlc1twaWMuSW1hZ2VIYXNoXS5SZWZDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vcmV3cml0ZSB0aGUgZHJhd2luZyB4bWwgd2l0aCB0aGUgbmV3IHJlbElEJ3MKKyAgICAgICAgICAgICAgICBzdHJlYW1EcmF3aW5nID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1EcmF3aW5nLldyaXRlKGRyYXdYbWwuT3V0ZXJYbWwpOworICAgICAgICAgICAgICAgLy8gc3RyZWFtRHJhd2luZy5DbG9zZSgpOworICAgICAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuRmx1c2goKTsKKworICAgICAgICAgICAgLy99CisgICAgICAgIH0KKworCQlwcml2YXRlIHZvaWQgQ29weVZtbERyYXdpbmcoRXhjZWxXb3Jrc2hlZXQgb3JpZ1NoZWV0LCBFeGNlbFdvcmtzaGVldCBuZXdTaGVldCkKKwkJeworCQkJdmFyIHhtbCA9IG9yaWdTaGVldC5WbWxEcmF3aW5nc0NvbW1lbnRzLlZtbERyYXdpbmdYbWwuT3V0ZXJYbWw7CisJCQl2YXIgdm1sVXJpID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvZHJhd2luZ3Mvdm1sRHJhd2luZ3swfS52bWwiLCBuZXdTaGVldC5TaGVldElEKSwgVXJpS2luZC5SZWxhdGl2ZSk7CisJCQl2YXIgcGFydCA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KHZtbFVyaSwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC52bWxEcmF3aW5nIiwgX3Bjay5Db21wcmVzc2lvbik7CisJCQl1c2luZyAodmFyIHN0cmVhbURyYXdpbmcgPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpKQorCQkJeworCQkJCXN0cmVhbURyYXdpbmcuV3JpdGUoeG1sKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1EcmF3aW5nLkZsdXNoKCk7CisgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIC8vQWRkIHRoZSByZWxhdGlvbnNoaXAgSUQgdG8gdGhlIHdvcmtzaGVldCB4bWwuCisJCQl2YXIgdm1sUmVsYXRpb24gPSBuZXdTaGVldC5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkobmV3U2hlZXQuV29ya3NoZWV0VXJpLHZtbFVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvdm1sRHJhd2luZyIpOworCQkJdmFyIGUgPSBuZXdTaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmxlZ2FjeURyYXdpbmciLCBfbmFtZXNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKwkJCWlmIChlID09IG51bGwpCisJCQl7CisJCQkJZSA9IG5ld1NoZWV0LldvcmtzaGVldFhtbC5DcmVhdGVOb2RlKFhtbE5vZGVUeXBlLkVudGl0eSwgIi8vZDpsZWdhY3lEcmF3aW5nIiwgX25hbWVzcGFjZU1hbmFnZXIuTG9va3VwTmFtZXNwYWNlKCJkIikpIGFzIFhtbEVsZW1lbnQ7CisJCQl9CisJCQlpZiAoZSAhPSBudWxsKQorCQkJeworCQkJCWUuU2V0QXR0cmlidXRlKCJpZCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzLCB2bWxSZWxhdGlvbi5JZCk7CisJCQl9CisJCX0KKworCQlzdHJpbmcgQ3JlYXRlV29ya2Jvb2tSZWwoc3RyaW5nIE5hbWUsIGludCBzaGVldElELCBVcmkgdXJpV29ya3NoZWV0LCBib29sIGlzQ2hhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgd29ya2Jvb2sgYW5kIHRoZSBuZXcgd29ya3NoZWV0CisgICAgICAgICAgICB2YXIgcmVsID0gX3Bjay5Xb3JrYm9vay5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoX3Bjay5Xb3JrYm9vay5Xb3JrYm9va1VyaSwgdXJpV29ya3NoZWV0KSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi8iICsgKGlzQ2hhcnQgPyAiY2hhcnRzaGVldCIgOiAid29ya3NoZWV0IikpOworICAgICAgICAgICAgX3Bjay5QYWNrYWdlLkZsdXNoKCk7CisKKyAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBuZXcgc2hlZXQgbm9kZQorICAgICAgICAgICAgWG1sRWxlbWVudCB3b3Jrc2hlZXROb2RlID0gX3Bjay5Xb3JrYm9vay5Xb3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJzaGVldCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgIHdvcmtzaGVldE5vZGUuU2V0QXR0cmlidXRlKCJuYW1lIiwgTmFtZSk7CisgICAgICAgICAgICB3b3Jrc2hlZXROb2RlLlNldEF0dHJpYnV0ZSgic2hlZXRJZCIsIHNoZWV0SUQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3b3Jrc2hlZXROb2RlLlNldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcywgcmVsLklkKTsKKworICAgICAgICAgICAgVG9wTm9kZS5BcHBlbmRDaGlsZCh3b3Jrc2hlZXROb2RlKTsKKyAgICAgICAgICAgIHJldHVybiByZWwuSWQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdldFNoZWV0VVJJKHJlZiBzdHJpbmcgTmFtZSwgb3V0IGludCBzaGVldElELCBvdXQgVXJpIHVyaVdvcmtzaGVldCwgYm9vbCBpc0NoYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gVmFsaWRhdGVGaXhTaGVldE5hbWUoTmFtZSk7CisKKyAgICAgICAgICAgIC8vRmlyc3QgZmluZCBtYXhpbXVtIGV4aXN0aW5nIHNoZWV0SUQKKyAgICAgICAgICAgIHNoZWV0SUQgPSAwOworICAgICAgICAgICAgZm9yZWFjaCh2YXIgd3MgaW4gdGhpcykKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHdzLlNoZWV0SUQgPiBzaGVldElEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRJRCA9IHdzLlNoZWV0SUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2Ugbm93IGhhdmUgdGhlIG1heCBleGlzdGluZyB2YWx1ZXMsIHNvIGFkZCBvbmUKKyAgICAgICAgICAgIHNoZWV0SUQrKzsKKworICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXcgd29ya3NoZWV0IHRvIHRoZSBwYWNrYWdlCisgICAgICAgICAgICBpZiAoaXNDaGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1cmlXb3Jrc2hlZXQgPSBuZXcgVXJpKCIveGwvY2hhcnRzaGVldHMvY2hhcnRzaGVldCIgKyBzaGVldElELlRvU3RyaW5nKCkgKyAiLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVyaVdvcmtzaGVldCA9IG5ldyBVcmkoIi94bC93b3Jrc2hlZXRzL3NoZWV0IiArIHNoZWV0SUQuVG9TdHJpbmcoKSArICIueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgVmFsaWRhdGVGaXhTaGVldE5hbWUoc3RyaW5nIE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcmVtb3ZlIGludmFsaWQgY2hhcmFjdGVycworICAgICAgICAgICAgaWYgKFZhbGlkYXRlTmFtZShOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoTmFtZS5JbmRleE9mKCc6JykgPiAtMSkgTmFtZSA9IE5hbWUuUmVwbGFjZSgiOiIsICIgIik7CisgICAgICAgICAgICAgICAgaWYgKE5hbWUuSW5kZXhPZignLycpID4gLTEpIE5hbWUgPSBOYW1lLlJlcGxhY2UoIi8iLCAiICIpOworICAgICAgICAgICAgICAgIGlmIChOYW1lLkluZGV4T2YoJ1xcJykgPiAtMSkgTmFtZSA9IE5hbWUuUmVwbGFjZSgiXFwiLCAiICIpOworICAgICAgICAgICAgICAgIGlmIChOYW1lLkluZGV4T2YoJz8nKSA+IC0xKSBOYW1lID0gTmFtZS5SZXBsYWNlKCI/IiwgIiAiKTsKKyAgICAgICAgICAgICAgICBpZiAoTmFtZS5JbmRleE9mKCdbJykgPiAtMSkgTmFtZSA9IE5hbWUuUmVwbGFjZSgiWyIsICIgIik7CisgICAgICAgICAgICAgICAgaWYgKE5hbWUuSW5kZXhPZignXScpID4gLTEpIE5hbWUgPSBOYW1lLlJlcGxhY2UoIl0iLCAiICIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTmFtZS5UcmltKCkgPT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgd29ya3NoZWV0IGNhbiBub3QgaGF2ZSBhbiBlbXB0eSBuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTmFtZS5MZW5ndGggPiAzMSkgTmFtZSA9IE5hbWUuU3Vic3RyaW5nKDAsIDMxKTsgICAvL0Egc2hlZXQgY2FuIGhhdmUgbWF4IDMxIGNoYXIncyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsaWRhdGUgdGhlIHNoZWV0bmFtZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBOYW1lPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRydWUgaWYgdmFsaWQ8L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZU5hbWUoc3RyaW5nIE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXguSXNNYXRjaChOYW1lLCBAIjp8XD98L3xcXHxcW3xcXSIpOworICAgICAgICB9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQ3JlYXRlcyB0aGUgWE1MIGRvY3VtZW50IHJlcHJlc2VudGluZyBhIG5ldyBlbXB0eSB3b3Jrc2hlZXQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJaW50ZXJuYWwgWG1sRG9jdW1lbnQgQ3JlYXRlTmV3V29ya3NoZWV0KGJvb2wgaXNDaGFydCkKKwkJeworCQkJWG1sRG9jdW1lbnQgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1XcyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KGlzQ2hhcnQgPyAiY2hhcnRzaGVldCIgOiAid29ya3NoZWV0IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgZWxlbVdzLlNldEF0dHJpYnV0ZSgieG1sbnM6ciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKTsKKyAgICAgICAgICAgIHhtbERvYy5BcHBlbmRDaGlsZChlbGVtV3MpOworCisKKyAgICAgICAgICAgIGlmIChpc0NoYXJ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0UHIgPSB4bWxEb2MuQ3JlYXRlRWxlbWVudCgic2hlZXRQciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBlbGVtV3MuQXBwZW5kQ2hpbGQoZWxlbVNoZWV0UHIpOworCisgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtU2hlZXRWaWV3cyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXdzIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIGVsZW1Xcy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3cyk7CisKKyAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1TaGVldFZpZXcgPSB4bWxEb2MuQ3JlYXRlRWxlbWVudCgic2hlZXRWaWV3IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIGVsZW1TaGVldFZpZXcuU2V0QXR0cmlidXRlKCJ3b3JrYm9va1ZpZXdJZCIsICIwIik7CisgICAgICAgICAgICAgICAgZWxlbVNoZWV0Vmlldy5TZXRBdHRyaWJ1dGUoInpvb21Ub0ZpdCIsICIxIik7CisKKyAgICAgICAgICAgICAgICBlbGVtU2hlZXRWaWV3cy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1TaGVldFZpZXdzID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoInNoZWV0Vmlld3MiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgZWxlbVdzLkFwcGVuZENoaWxkKGVsZW1TaGVldFZpZXdzKTsKKworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0VmlldyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXciLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgZWxlbVNoZWV0Vmlldy5TZXRBdHRyaWJ1dGUoIndvcmtib29rVmlld0lkIiwgIjAiKTsKKyAgICAgICAgICAgICAgICBlbGVtU2hlZXRWaWV3cy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3KTsKKworICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0Rm9ybWF0UHIgPSB4bWxEb2MuQ3JlYXRlRWxlbWVudCgic2hlZXRGb3JtYXRQciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBlbGVtU2hlZXRGb3JtYXRQci5TZXRBdHRyaWJ1dGUoImRlZmF1bHRSb3dIZWlnaHQiLCAiMTUiKTsKKyAgICAgICAgICAgICAgICBlbGVtV3MuQXBwZW5kQ2hpbGQoZWxlbVNoZWV0Rm9ybWF0UHIpOworCisgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtU2hlZXREYXRhID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoInNoZWV0RGF0YSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBlbGVtV3MuQXBwZW5kQ2hpbGQoZWxlbVNoZWV0RGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4geG1sRG9jOworCQl9CisJCSNlbmRyZWdpb24KKwkJI3JlZ2lvbiBEZWxldGUgV29ya3NoZWV0CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIERlbGV0ZXMgYSB3b3Jrc2hlZXQgZnJvbSB0aGUgY29sbGVjdGlvbgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5UaGUgcG9zaXRpb24gb2YgdGhlIHdvcmtzaGVldCBpbiB0aGUgd29ya2Jvb2s8L3BhcmFtPgorCQlwdWJsaWMgdm9pZCBEZWxldGUoaW50IEluZGV4KQorCQl7CisJCQkvKgorICAgICAgICAgICAgKiBIYWNrIHRvIHByZWZldGNoIGFsbCB0aGUgZHJhd2luZ3MsCisgICAgICAgICAgICAqIHNvIHRoYXQgYWxsIHRoZSBpbWFnZXMgYXJlIHJlZmVyZW5jZWQsIAorICAgICAgICAgICAgKiB0byBwcmV2ZW50IHRoZSBkZWxldGlvbiBvZiB0aGUgaW1hZ2UgZmlsZSwgCisgICAgICAgICAgICAqIHdoZW4gcmVmZXJlbmNlZCBtb3JlIHRoYW4gb25jZQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBfd29ya3NoZWV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZHJhd2luZ3MgPSB3cy5WYWx1ZS5EcmF3aW5nczsgCisgICAgICAgICAgICB9CQkJCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IF93b3Jrc2hlZXRzW0luZGV4XTsKKyAgICAgICAgICAgIGlmICh3b3Jrc2hlZXQuRHJhd2luZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5EcmF3aW5ncy5DbGVhckRyYXdpbmdzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vUmVtb3ZlIGFsbCBjb21tZW50cworICAgICAgICAgICAgaWYgKCEod29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCkgJiYgd29ya3NoZWV0LkNvbW1lbnRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29tbWVudHMuQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgICAgLy9EZWxldGUgYW55IHBhcnRzIHN0aWxsIHdpdGggcmVsYXRpb25zIHRvIHRoZSBXb3Jrc2hlZXQuCisgICAgICAgICAgICBEZWxldGVSZWxhdGlvbnNBbmRQYXJ0cyh3b3Jrc2hlZXQuUGFydCk7CisKKworICAgICAgICAgICAgLy9EZWxldGUgdGhlIHdvcmtzaGVldCBwYXJ0IGFuZCByZWxhdGlvbiBmcm9tIHRoZSBwYWNrYWdlIAorCQkJX3Bjay5Xb3JrYm9vay5QYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcCh3b3Jrc2hlZXQuUmVsYXRpb25zaGlwSUQpOworCisgICAgICAgICAgICAvL0RlbGV0ZSB3b3Jrc2hlZXQgZnJvbSB0aGUgd29ya2Jvb2sgWE1MCisJCQlYbWxOb2RlIHNoZWV0c05vZGUgPSBfcGNrLldvcmtib29rLldvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp3b3JrYm9vay9kOnNoZWV0cyIsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKwkJCWlmIChzaGVldHNOb2RlICE9IG51bGwpCisJCQl7CisJCQkJWG1sTm9kZSBzaGVldE5vZGUgPSBzaGVldHNOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiLi9kOnNoZWV0W0BzaGVldElkPXswfV0iLCB3b3Jrc2hlZXQuU2hlZXRJRCksIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKwkJCQlpZiAoc2hlZXROb2RlICE9IG51bGwpCisJCQkJeworCQkJCQlzaGVldHNOb2RlLlJlbW92ZUNoaWxkKHNoZWV0Tm9kZSk7CisJCQkJfQorCQkJfQorCQkJX3dvcmtzaGVldHMuUmVtb3ZlKEluZGV4KTsKKyAgICAgICAgICAgIGlmIChfcGNrLldvcmtib29rLlZiYVByb2plY3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGNrLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5SZW1vdmUod29ya3NoZWV0LkNvZGVNb2R1bGUpOworICAgICAgICAgICAgfQorCQkJUmVpbmRleFdvcmtzaGVldERpY3Rpb25hcnkoKTsKKyAgICAgICAgICAgIC8vSWYgdGhlIGFjdGl2ZSBzaGVldCBpcyBkZWxldGVkLCBzZXQgdGhlIGZpcnN0IHRhYiBhcyBhY3RpdmUuCisgICAgICAgICAgICBpZiAoX3Bjay5Xb3JrYm9vay5WaWV3LkFjdGl2ZVRhYiA+PSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5WaWV3LkFjdGl2ZVRhYiA9IF9wY2suV29ya2Jvb2suVmlldy5BY3RpdmVUYWItMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfcGNrLldvcmtib29rLlZpZXcuQWN0aXZlVGFiID09IHdvcmtzaGVldC5TaGVldElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5WaWV3LlRhYlNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmtzaGVldCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVsZXRlUmVsYXRpb25zQW5kUGFydHMoUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZWxzID0gcGFydC5HZXRSZWxhdGlvbnNoaXBzKCkuVG9MaXN0KCk7CisgICAgICAgICAgICBmb3IoaW50IGk9MDtpPHJlbHMuQ291bnQ7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZWwgPSByZWxzW2ldOworICAgICAgICAgICAgICAgIGlmIChyZWwuUmVsYXRpb25zaGlwVHlwZSAhPSBFeGNlbFBhY2thZ2Uuc2NoZW1hSW1hZ2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVSZWxhdGlvbnNBbmRQYXJ0cyhfcGNrLlBhY2thZ2UuR2V0UGFydChVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFydC5EZWxldGVSZWxhdGlvbnNoaXAocmVsLklkKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIF9wY2suUGFja2FnZS5EZWxldGVQYXJ0KHBhcnQuVXJpKTsKKyAgICAgICAgfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIERlbGV0ZXMgYSB3b3Jrc2hlZXQgZnJvbSB0aGUgY29sbGVjdGlvbgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQgaW4gdGhlIHdvcmtib29rPC9wYXJhbT4KKwkJcHVibGljIHZvaWQgRGVsZXRlKHN0cmluZyBuYW1lKQorCQl7CisJCQl2YXIgc2hlZXQgPSB0aGlzW25hbWVdOworCQkJaWYgKHNoZWV0ID09IG51bGwpCisJCQl7CisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkNvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBkZWxldGUgJ3swfSciLCBuYW1lKSk7CisJCQl9CisJCQlEZWxldGUoc2hlZXQuUG9zaXRpb25JRCk7CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVsZXRlIGEgd29ya3NoZWV0IGZyb20gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJXb3Jrc2hlZXQiPlRoZSB3b3Jrc2hlZXQgdG8gZGVsZXRlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlKEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldCkKKwkJeworICAgICAgICAgICAgaWYgKFdvcmtzaGVldC5Qb3NpdGlvbklEIDw9IF93b3Jrc2hlZXRzLkNvdW50ICYmIFdvcmtzaGVldCA9PSBfd29ya3NoZWV0c1tXb3Jrc2hlZXQuUG9zaXRpb25JRF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGVsZXRlKFdvcmtzaGVldC5Qb3NpdGlvbklEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJXb3Jrc2hlZXQgaXMgbm90IGluIHRoZSBjb2xsZWN0aW9uLiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisJCXByaXZhdGUgdm9pZCBSZWluZGV4V29ya3NoZWV0RGljdGlvbmFyeSgpCisJCXsKKwkJCXZhciBpbmRleCA9IDE7CisJCQl2YXIgd29ya3NoZWV0cyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRXhjZWxXb3Jrc2hlZXQ+KCk7CisJCQlmb3JlYWNoICh2YXIgZW50cnkgaW4gX3dvcmtzaGVldHMpCisJCQl7CisJCQkJZW50cnkuVmFsdWUuUG9zaXRpb25JRCA9IGluZGV4OworCQkJCXdvcmtzaGVldHMuQWRkKGluZGV4KyssIGVudHJ5LlZhbHVlKTsKKwkJCX0KKwkJCV93b3Jrc2hlZXRzID0gd29ya3NoZWV0czsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgdGhlIHdvcmtzaGVldCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0iUG9zaXRpb25JRCI+VGhlIHBvc2l0aW9uIG9mIHRoZSB3b3Jrc2hlZXQuIDEtYmFzZTwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBFeGNlbFdvcmtzaGVldCB0aGlzW2ludCBQb3NpdGlvbklEXQorCQl7CisJCQlnZXQKKwkJCXsKKwkJCSAgICBpZiAoX3dvcmtzaGVldHMuQ29udGFpbnNLZXkoUG9zaXRpb25JRCkpCisJCQkgICAgeworCQkJICAgICAgICByZXR1cm4gX3dvcmtzaGVldHNbUG9zaXRpb25JRF07CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICAgIHRocm93IChuZXcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCJXb3Jrc2hlZXQgcG9zaXRpb24gb3V0IG9mIHJhbmdlLiIpKTsKKwkJCSAgICB9CisJCQl9CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBSZXR1cm5zIHRoZSB3b3Jrc2hlZXQgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBuYW1lCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldDwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXB1YmxpYyBFeGNlbFdvcmtzaGVldCB0aGlzW3N0cmluZyBOYW1lXQorCQl7CisJCQlnZXQKKwkJCXsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0QnlOYW1lKE5hbWUpOworCQkJfQorCQl9CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIENvcGllcyB0aGUgbmFtZWQgd29ya3NoZWV0IGFuZCBjcmVhdGVzIGEgbmV3IHdvcmtzaGVldCBpbiB0aGUgc2FtZSB3b3JrYm9vaworCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyB3b3Jrc2hlZXQ8L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Ik5ld05hbWUiPlRoZSBuYW1lIG9mIHRoZSBuZXcgd29ya3NoZWV0IHRvIGNyZWF0ZTwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz5UaGUgbmV3IGNvcHkgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya3NoZWV0cyBjb2xsZWN0aW9uPC9yZXR1cm5zPgorCQlwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgQ29weShzdHJpbmcgTmFtZSwgc3RyaW5nIE5ld05hbWUpCisJCXsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IENvcHkgPSB0aGlzW05hbWVdOworICAgICAgICAgICAgaWYgKENvcHkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ29weSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBjb3B5ICd7MH0nIiwgTmFtZSkpOworCisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBhZGRlZCA9IEFkZChOZXdOYW1lLCBDb3B5KTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICAgICAgfQorCQkjZW5kcmVnaW9uCisgICAgICAgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IEdldEJ5U2hlZXRJRChpbnQgbG9jYWxTaGVldElEKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3cyBpbiB0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3cy5TaGVldElEID09IGxvY2FsU2hlZXRJRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IEdldEJ5TmFtZShzdHJpbmcgTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KE5hbWUpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0ID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCBpbiBfd29ya3NoZWV0cy5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldC5OYW1lLkVxdWFscyhOYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgICAgICAgICAgeGxXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHhsV29ya3NoZWV0KTsKKyAgICAgICAgfQorCQkjcmVnaW9uIE1vdmVCZWZvcmUgYW5kIE1vdmVBZnRlciBNZXRob2RzCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIE1vdmVzIHRoZSBzb3VyY2Ugd29ya3NoZWV0IHRvIHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIHRhcmdldCB3b3Jrc2hlZXQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2VOYW1lIj5UaGUgbmFtZSBvZiB0aGUgc291cmNlIHdvcmtzaGVldDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idGFyZ2V0TmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3b3Jrc2hlZXQ8L3BhcmFtPgorCQlwdWJsaWMgdm9pZCBNb3ZlQmVmb3JlKHN0cmluZyBzb3VyY2VOYW1lLCBzdHJpbmcgdGFyZ2V0TmFtZSkKKwkJeworCQkJTW92ZShzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBmYWxzZSk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBNb3ZlcyB0aGUgc291cmNlIHdvcmtzaGVldCB0byB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSB0YXJnZXQgd29ya3NoZWV0CisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlUG9zaXRpb25JZCI+VGhlIGlkIG9mIHRoZSBzb3VyY2Ugd29ya3NoZWV0PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ0YXJnZXRQb3NpdGlvbklkIj5UaGUgaWQgb2YgdGhlIHRhcmdldCB3b3Jrc2hlZXQ8L3BhcmFtPgorCQlwdWJsaWMgdm9pZCBNb3ZlQmVmb3JlKGludCBzb3VyY2VQb3NpdGlvbklkLCBpbnQgdGFyZ2V0UG9zaXRpb25JZCkKKwkJeworCQkJTW92ZShzb3VyY2VQb3NpdGlvbklkLCB0YXJnZXRQb3NpdGlvbklkLCBmYWxzZSk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBNb3ZlcyB0aGUgc291cmNlIHdvcmtzaGVldCB0byB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIHRhcmdldCB3b3Jrc2hlZXQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2VOYW1lIj5UaGUgbmFtZSBvZiB0aGUgc291cmNlIHdvcmtzaGVldDwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idGFyZ2V0TmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3b3Jrc2hlZXQ8L3BhcmFtPgorCQlwdWJsaWMgdm9pZCBNb3ZlQWZ0ZXIoc3RyaW5nIHNvdXJjZU5hbWUsIHN0cmluZyB0YXJnZXROYW1lKQorCQl7CisJCQlNb3ZlKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIHRydWUpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gTW92ZXMgdGhlIHNvdXJjZSB3b3Jrc2hlZXQgdG8gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0YXJnZXQgd29ya3NoZWV0CisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlUG9zaXRpb25JZCI+VGhlIGlkIG9mIHRoZSBzb3VyY2Ugd29ya3NoZWV0PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJ0YXJnZXRQb3NpdGlvbklkIj5UaGUgaWQgb2YgdGhlIHRhcmdldCB3b3Jrc2hlZXQ8L3BhcmFtPgorCQlwdWJsaWMgdm9pZCBNb3ZlQWZ0ZXIoaW50IHNvdXJjZVBvc2l0aW9uSWQsIGludCB0YXJnZXRQb3NpdGlvbklkKQorCQl7CisJCQlNb3ZlKHNvdXJjZVBvc2l0aW9uSWQsIHRhcmdldFBvc2l0aW9uSWQsIHRydWUpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlTmFtZSI+PC9wYXJhbT4KKwkJcHVibGljIHZvaWQgTW92ZVRvU3RhcnQoc3RyaW5nIHNvdXJjZU5hbWUpCisJCXsKKwkJCXZhciBzb3VyY2VTaGVldCA9IHRoaXNbc291cmNlTmFtZV07CisJCQlpZiAoc291cmNlU2hlZXQgPT0gbnVsbCkKKwkJCXsKKwkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk1vdmUgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgdG8gbW92ZSAnezB9JyIsIHNvdXJjZU5hbWUpKTsKKwkJCX0KKwkJCU1vdmUoc291cmNlU2hlZXQuUG9zaXRpb25JRCwgMSwgZmFsc2UpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlUG9zaXRpb25JZCI+PC9wYXJhbT4KKwkJcHVibGljIHZvaWQgTW92ZVRvU3RhcnQoaW50IHNvdXJjZVBvc2l0aW9uSWQpCisJCXsKKwkJCU1vdmUoc291cmNlUG9zaXRpb25JZCwgMSwgZmFsc2UpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlTmFtZSI+PC9wYXJhbT4KKwkJcHVibGljIHZvaWQgTW92ZVRvRW5kKHN0cmluZyBzb3VyY2VOYW1lKQorCQl7CisJCQl2YXIgc291cmNlU2hlZXQgPSB0aGlzW3NvdXJjZU5hbWVdOworCQkJaWYgKHNvdXJjZVNoZWV0ID09IG51bGwpCisJCQl7CisJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJNb3ZlIHdvcmtzaGVldCBlcnJvcjogQ291bGQgbm90IGZpbmQgd29ya3NoZWV0IHRvIG1vdmUgJ3swfSciLCBzb3VyY2VOYW1lKSk7CisJCQl9CisJCQlNb3ZlKHNvdXJjZVNoZWV0LlBvc2l0aW9uSUQsIF93b3Jrc2hlZXRzLkNvdW50LCB0cnVlKTsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIAorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9InNvdXJjZVBvc2l0aW9uSWQiPjwvcGFyYW0+CisJCXB1YmxpYyB2b2lkIE1vdmVUb0VuZChpbnQgc291cmNlUG9zaXRpb25JZCkKKwkJeworCQkJTW92ZShzb3VyY2VQb3NpdGlvbklkLCBfd29ya3NoZWV0cy5Db3VudCwgdHJ1ZSk7CisJCX0KKworCQlwcml2YXRlIHZvaWQgTW92ZShzdHJpbmcgc291cmNlTmFtZSwgc3RyaW5nIHRhcmdldE5hbWUsIGJvb2wgcGxhY2VBZnRlcikKKwkJeworCQkJdmFyIHNvdXJjZVNoZWV0ID0gdGhpc1tzb3VyY2VOYW1lXTsKKwkJCWlmIChzb3VyY2VTaGVldCA9PSBudWxsKQorCQkJeworCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBtb3ZlICd7MH0nIiwgc291cmNlTmFtZSkpOworCQkJfQorCQkJdmFyIHRhcmdldFNoZWV0ID0gdGhpc1t0YXJnZXROYW1lXTsKKwkJCWlmICh0YXJnZXRTaGVldCA9PSBudWxsKQorCQkJeworCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBtb3ZlICd7MH0nIiwgdGFyZ2V0TmFtZSkpOworCQkJfQorCQkJTW92ZShzb3VyY2VTaGVldC5Qb3NpdGlvbklELCB0YXJnZXRTaGVldC5Qb3NpdGlvbklELCBwbGFjZUFmdGVyKTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBNb3ZlKGludCBzb3VyY2VQb3NpdGlvbklkLCBpbnQgdGFyZ2V0UG9zaXRpb25JZCwgYm9vbCBwbGFjZUFmdGVyKQorCQl7CisgICAgICAgICAgICAvLyBCdWdmaXg6IGlmIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSB0aGUgc2FtZSB3b3Jrc2hlZXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgY3JlYXRlIGEgZHVwbGljYXRlCisgICAgICAgICAgICAvLyAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgYSBjb3JydXB0IHdvcmtib29rLiAvc3dtYWwgMjAxNC0wNS0xMAorCQkgICAgaWYgKHNvdXJjZVBvc2l0aW9uSWQgPT0gdGFyZ2V0UG9zaXRpb25JZCkgcmV0dXJuOworCisgICAgICAgICAgICBsb2NrIChfd29ya3NoZWV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlU2hlZXQgPSB0aGlzW3NvdXJjZVBvc2l0aW9uSWRdOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VTaGVldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJNb3ZlIHdvcmtzaGVldCBlcnJvcjogQ291bGQgbm90IGZpbmQgd29ya3NoZWV0IGF0IHBvc2l0aW9uICd7MH0nIiwgc291cmNlUG9zaXRpb25JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0U2hlZXQgPSB0aGlzW3RhcmdldFBvc2l0aW9uSWRdOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTaGVldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJNb3ZlIHdvcmtzaGVldCBlcnJvcjogQ291bGQgbm90IGZpbmQgd29ya3NoZWV0IGF0IHBvc2l0aW9uICd7MH0nIiwgdGFyZ2V0UG9zaXRpb25JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc291cmNlUG9zaXRpb25JZCA9PSB0YXJnZXRQb3NpdGlvbklkICYmIF93b3Jrc2hlZXRzLkNvdW50IDwgMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsJCS8vLS0tIG5vIHJlYXNvbiB0byBhdHRlbXB0IHRvIHJlLWFycmFuZ2UgYSBzaW5nbGUgaXRlbSB3aXRoIGl0c2VsZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IDE7CisgICAgICAgICAgICAgICAgdmFyIG5ld09yZGVyID0gbmV3IERpY3Rpb25hcnk8aW50LCBFeGNlbFdvcmtzaGVldD4oKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW50cnkgaW4gX3dvcmtzaGVldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuS2V5ID09IHRhcmdldFBvc2l0aW9uSWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGxhY2VBZnRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTaGVldC5Qb3NpdGlvbklEID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3JkZXIuQWRkKGluZGV4KyssIHNvdXJjZVNoZWV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuVmFsdWUuUG9zaXRpb25JRCA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3JkZXIuQWRkKGluZGV4KyssIGVudHJ5LlZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlQWZ0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU2hlZXQuUG9zaXRpb25JRCA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yZGVyLkFkZChpbmRleCsrLCBzb3VyY2VTaGVldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuS2V5ID09IHNvdXJjZVBvc2l0aW9uSWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LlZhbHVlLlBvc2l0aW9uSUQgPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yZGVyLkFkZChpbmRleCsrLCBlbnRyeS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3dvcmtzaGVldHMgPSBuZXdPcmRlcjsKKworICAgICAgICAgICAgICAgIE1vdmVTaGVldFhtbE5vZGUoc291cmNlU2hlZXQsIHRhcmdldFNoZWV0LCBwbGFjZUFmdGVyKTsKKyAgICAgICAgICAgIH0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBNb3ZlU2hlZXRYbWxOb2RlKEV4Y2VsV29ya3NoZWV0IHNvdXJjZVNoZWV0LCBFeGNlbFdvcmtzaGVldCB0YXJnZXRTaGVldCwgYm9vbCBwbGFjZUFmdGVyKQorCQl7CisgICAgICAgICAgICBsb2NrIChUb3BOb2RlLk93bmVyRG9jdW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZU5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiZDpzaGVldFtAc2hlZXRJZCA9ICd7MH0nXSIsIHNvdXJjZVNoZWV0LlNoZWV0SUQpLCBfbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgdmFyIHRhcmdldE5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiZDpzaGVldFtAc2hlZXRJZCA9ICd7MH0nXSIsIHRhcmdldFNoZWV0LlNoZWV0SUQpLCBfbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5vZGUgPT0gbnVsbCB8fCB0YXJnZXROb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTb3VyY2UgU2hlZXRJZCBhbmQgVGFyZ2V0IFNoZWV0SWQgbXVzdCBiZSB2YWxpZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGxhY2VBZnRlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5zZXJ0QWZ0ZXIoc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5zZXJ0QmVmb3JlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkJfQorCisJCSNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2hlZXQgaW4gdGhpcy5fd29ya3NoZWV0cy5WYWx1ZXMpIAorICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpc2hlZXQpLkRpc3Bvc2UoKTsgCisgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICBfd29ya3NoZWV0cyA9IG51bGw7CisgICAgICAgICAgICAgX3BjayA9IG51bGw7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9IC8vIGVuZCBjbGFzcyBXb3Jrc2hlZXRzCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9udFNpemUuY3MgYi9FUFBsdXMvRm9udFNpemUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1YTcyNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb250U2l6ZS5jcwpAQCAtMCwwICsxLDI0MiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIHB1YmxpYyBjbGFzcyBGb250U2l6ZUluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBGb250U2l6ZUluZm8oZmxvYXQgaGVpZ2h0LCBmbG9hdCB3aWR0aCkKKyAgICAgICAgeworICAgICAgICAgICAgV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgZmxvYXQgSGVpZ2h0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGZsb2F0IFdpZHRoIHsgZ2V0OyBzZXQ7IH0KKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb250U2l6ZQorICAgIHsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRpYyBEaWN0aW9uYXJ5PHN0cmluZywgRGljdGlvbmFyeTxmbG9hdCwgRm9udFNpemVJbmZvPj4gRm9udEhlaWdodHMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIERpY3Rpb25hcnk8ZmxvYXQsIEZvbnRTaXplSW5mbz4+KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKQorICAgICAgICB7CisgICAgICAgICAgICB7IlRpbWVzIE5ldyBSb21hbiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjIsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjQsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE2LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOCwxNzEpfX19LAorICAgICAgICAgICAgeyJBcmlhbCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTIwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMyw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjQsMTkwKX19fSwKKyAgICAgICAgICAgIHsiQ291cmllciBOZXciLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDYsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjQsNzcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE5LDEwMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDQsMjA1KX19fSwKKyAgICAgICAgICAgIHsiU3ltYm9sIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEyLDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMSwxNzEpfX19LAorICAgICAgICAgICAgeyJXaW5nZGluZ3MiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCwxNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDE3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMjApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwyMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDI2KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMjgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwzMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDM2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMzkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCw0Myl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDQ3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsNTApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSw2NCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDg2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTE3LDEyOSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NiwxNzIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA4LDIzMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTQsNDU3KX19fSwKKyAgICAgICAgICAgIHsiU2ltU3VuIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNiwxNzEpfX19LAorICAgICAgICAgICAgeyJDZW50dXJ5IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMTgsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA5LDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwxOTApfX19LAorICAgICAgICAgICAgeyJTeWxmYWVuIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDgsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYzLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjksNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjcsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1MiwxNzEpfX19LAorICAgICAgICAgICAgeyJDYW1icmlhIE1hdGgiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDg1LDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygxMDIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDExNyw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMTI0LDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygxNDcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygxNjIsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygxODYsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygyMDksMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygyMjMsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygyNDgsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbygyNzAsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbygyODUsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbygzNzEsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg0OTMsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbyg3MzksNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbyg5ODYsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMTMxNyw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbygyMDQ3LDE4OSl9fX0sCisgICAgICAgICAgICB7Ill1IEdvdGhpYyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU3LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTksMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3OCwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDE1NCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNiw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzYsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTUxLDE5MCl9fX0sCisgICAgICAgICAgICB7IkRlbmdYaWFuIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjEsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE1LDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOCwxOTcpfX19LAorICAgICAgICAgICAgeyJBcmlhbCBVbmljb2RlIE1TIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM2LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY4LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTAsMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzcsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODIsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQyLDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MCwxOTApfX19LAorICAgICAgICAgICAgeyJDYWxpYnJpIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNjUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDg3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNCwxNzMpfX19LAorICAgICAgICAgICAgeyJDYWxpYnJpIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNjUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDg3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNCwxNzMpfX19LAorICAgICAgICAgICAgeyJHZW9yZ2lhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTE4LDU5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDc5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSwxMDUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE3LDIwOSl9fX0sCisgICAgICAgICAgICB7IkNhbWJyaWEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDExOCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTAsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE4LDE4OSl9fX0sCisgICAgICAgICAgICB7Ik1hcmxldHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTMpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiwxNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDE2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwyMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDI0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMjcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwyOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDMyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDIsMzUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NCwzNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDU1LDQ4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzEsNjQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMDMsOTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxMzUsMTI4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDE3OCwxNzEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oMzQ4LDM0MSl9fX0sCisgICAgICAgICAgICB7IkFyaWFsIEJsYWNrIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMCwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMzLDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MiwxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ1LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDksMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1NSwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU3LDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzQsMzIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5Nyw0Myl9LHs3MixuZXcgRm9udFNpemVJbmZvKDE0Nyw2NCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE5NSw4NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNTksMTE0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDUxNiwyMjcpfX19LAorICAgICAgICAgICAgeyJDYW5kYXJhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNCwxODgpfX19LAorICAgICAgICAgICAgeyJDb21pYyBTYW5zIE1TIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI4LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzIsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNiwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU0LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTcsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MywyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDk4LDM5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTQ3LDU5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTkwLDc4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI1OCwxMDQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTExLDIwOCl9fX0sCisgICAgICAgICAgICB7IkNvbnNvbGFzIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjEsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE1LDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOCwxODcpfX19LAorICAgICAgICAgICAgeyJDb25zdGFudGlhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDkzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNCwxODYpfX19LAorICAgICAgICAgICAgeyJDb3JiZWwiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw1MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsOTApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM0LDE3OSl9fX0sCisgICAgICAgICAgICB7IkVicmltYSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDk0LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTM4LDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTg0LDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0NSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0OTAsMTg0KX19fSwKKyAgICAgICAgICAgIHsiRnJhbmtsaW4gR290aGljIE1lZGl1bSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTI2LDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDc1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCwxMDApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDIwMCl9fX0sCisgICAgICAgICAgICB7IkdhYnJpb2xhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyNSw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjYsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDMyLDYpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygzMyw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oNDAsOCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDQ0LDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg1MSwxMCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDU2LDExKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNjEsMTIpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg2NiwxMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDczLDE0KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNzYsMTUpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg5OCwxOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEzMSwyNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDE5NSwzOCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDI2Miw1MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygzNDksNjkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNjkzLDEzNyl9fX0sCisgICAgICAgICAgICB7IkdhZHVnaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTIwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMyw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg0KX19fSwKKyAgICAgICAgICAgIHsiSW1wYWN0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYzLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMTksNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEyLDkzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMCwxODUpfX19LAorICAgICAgICAgICAgeyJKYXZhbmVzZSBUZXh0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygzMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMzMsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDM5LDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbyg0MSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oNDksMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbyg1MywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDYxLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNzAsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg3NCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDgyLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oOTAsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg5NCwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDEyMiwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDE2MiwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDI0Myw1Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDMyNCw3Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbyg0MzMsMTAxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDg2MCwyMDApfX19LAorICAgICAgICAgICAgeyJMZWVsYXdhZGVlIFVJIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzYsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODQpfX19LAorICAgICAgICAgICAgeyJMZWVsYXdhZGVlIFVJIFNlbWlsaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTM2LDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDcwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg3KX19fSwKKyAgICAgICAgICAgIHsiTHVjaWRhIENvbnNvbGUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMTcsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTYsNzcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA4LDEwMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTQsMjA1KX19fSwKKyAgICAgICAgICAgIHsiTHVjaWRhIFNhbnMgVW5pY29kZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMzApfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSw0MCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDExNyw2MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OCw4MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTAsMTA4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU1OCwyMTYpfX19LAorICAgICAgICAgICAgeyJNYWxndW4gR290aGljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNSwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDIsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUxLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTIsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NSwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcyLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTMsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzcsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQyLDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4NCwxODgpfX19LAorICAgICAgICAgICAgeyJNYWxndW4gR290aGljIFNlbWlsaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzUsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQyLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDUsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUyLDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTUsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MiwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkzLDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTM3LDU0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgxLDcyKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0Miw5Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODQsMTkwKX19fSwKKyAgICAgICAgICAgIHsiTWljcm9zb2Z0IEhpbWFsYXlhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNCw1KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsNil9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSw4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDEwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwxMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDEyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMTYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwyMSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEzNiwzMil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MSw0Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDIsNTcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgxLDExNCl9fX0sCisgICAgICAgICAgICB7Ik1pY3Jvc29mdCBKaGVuZ0hlaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTIyLDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYyLDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNyw5OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODEsMTk4KX19fSwKKyAgICAgICAgICAgIHsiTWljcm9zb2Z0IEpoZW5nSGVpIFVJIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjMsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjQsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzOSwxOTgpfX19LAorICAgICAgICAgICAgeyJNaWNyb3NvZnQgSmhlbmdIZWkgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMiw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Miw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTcsOTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgxLDE5Nil9fX0sCisgICAgICAgICAgICB7Ik1pY3Jvc29mdCBKaGVuZ0hlaSBVSSBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTIyLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYyLDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNyw5OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzksMTk2KX19fSwKKyAgICAgICAgICAgIHsiTWljcm9zb2Z0IE5ldyBUYWkgTHVlIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MiwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY3LDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODksMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzQsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzgsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM3LDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3MiwxODQpfX19LAorICAgICAgICAgICAgeyJNaWNyb3NvZnQgUGhhZ3NQYSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg2LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTI4LDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTcxLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyOCw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTIsMTg0KX19fSwKKyAgICAgICAgICAgIHsiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMywxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ1LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDExNyw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE0LDE5MCl9fX0sCisgICAgICAgICAgICB7Ik1pY3Jvc29mdCBUYWkgTGUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDQsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjYsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NywzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEzMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3Myw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDU5LDE4NCl9fX0sCisgICAgICAgICAgICB7Ik1pY3Jvc29mdCBZYUhlaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ5LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg2LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTI4LDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTcwLDc1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyOCwxMDApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDcxLDIwMCl9fX0sCisgICAgICAgICAgICB7Ik1pY3Jvc29mdCBZYUhlaSBVSSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ5LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg2LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTI4LDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTcwLDc1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyOCwxMDApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM5LDIwMCl9fX0sCisgICAgICAgICAgICB7Ik1pY3Jvc29mdCBZYUhlaSBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDIsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTMsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NywyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg4LDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTMyLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc2LDczKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzNiw5OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTksMTk1KX19fSwKKyAgICAgICAgICAgIHsiTWljcm9zb2Z0IFlhSGVpIFVJIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjgsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzAsNzMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDk4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ2OSwxOTUpfX19LAorICAgICAgICAgICAgeyJNaWNyb3NvZnQgWWkgQmFpdGkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMiwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzgsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTYsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3NCwzMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNDksNjYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMTk4LDg4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDM5OCwxNzUpfX19LAorICAgICAgICAgICAgeyJNaW5nTGlVLUV4dEIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzksNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3NiwxNzEpfX19LAorICAgICAgICAgICAgeyJQTWluZ0xpVS1FeHRCIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwxNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDE3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsMjMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzMCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzksNjApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDgwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3NiwxNjApfX19LAorICAgICAgICAgICAgeyJNaW5nTGlVX0hLU0NTLUV4dEIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzksNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3NiwxNzEpfX19LAorICAgICAgICAgICAgeyJNb25nb2xpYW4gQmFpdGkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NiwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MywzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjcsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjIzLDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0NywxNzEpfX19LAorICAgICAgICAgICAgeyJNViBCb2xpIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDIwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMjIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDI2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMzQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4OSw0NSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzEsOTApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjMxLDEyMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1OTcsMjM5KX19fSwKKyAgICAgICAgICAgIHsiTXlhbm1hciBUZXh0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyNSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjYsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI5LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygzMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzYsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzOSwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQ1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNTAsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg1MywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDU4LDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNjQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg2NywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDg4LDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTE2LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDIzMyw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygzMDksOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNjQ3LDE4NCl9fX0sCisgICAgICAgICAgICB7Ik5pcm1hbGEgVUkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODQpfX19LAorICAgICAgICAgICAgeyJOaXJtYWxhIFVJIFNlbWlsaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4Nyl9fX0sCisgICAgICAgICAgICB7IlBhbGF0aW5vIExpbm90eXBlIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM0LDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ3LDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY3LDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTAsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc4LDY0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MCw4Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzgsMTcxKX19fSwKKyAgICAgICAgICAgIHsiU2Vnb2UgTURMMiBBc3NldHMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMywxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQyLDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDQsMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1NSwzMSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDcxLDQxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDEzNSw4Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygxNzgsMTEwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDM0OCwyMTkpfX19LAorICAgICAgICAgICAgeyJTZWdvZSBQcmludCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezExLG5ldyBGb250U2l6ZUluZm8oMzEsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygzMywxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDM5LDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oNDIsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0OSwxOCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDU1LDIwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNTgsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg2NSwyMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDcxLDI2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNzQsMjcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg5NywzNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEyOSw0Nyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNzApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyNTksOTQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMzQ3LDEyNSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg2ODcsMjQ4KX19fSwKKyAgICAgICAgICAgIHsiU2Vnb2UgU2NyaXB0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjMsMTApfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzMsMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNiwxNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDUsMjApfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg1MCwyMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDU1LDIzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTksMjYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg2MiwyNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDgxLDM1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTA5LDQ3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw3MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIxNCw5NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyODcsMTI1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU3MSwyNDgpfX19LAorICAgICAgICAgICAgeyJTZWdvZSBVSSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4NCl9fX0sCisgICAgICAgICAgICB7IlNlZ29lIFVJIEJsYWNrIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMywxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwzMCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDQwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4Miw3OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDUsMTA2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4OCwyMTIpfX19LAorICAgICAgICAgICAgeyJTZWdvZSBVSSBFbW9qaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4NCl9fX0sCisgICAgICAgICAgICB7IlNlZ29lIFVJIEhpc3RvcmljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg0KX19fSwKKyAgICAgICAgICAgIHsiU2Vnb2UgVUkgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDkxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODEpfX19LAorICAgICAgICAgICAgeyJTZWdvZSBVSSBTZW1pYm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE5Nil9fX0sCisgICAgICAgICAgICB7IlNlZ29lIFVJIFNlbWlsaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4Nyl9fX0sCisgICAgICAgICAgICB7IlNlZ29lIFVJIFN5bWJvbCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4NCl9fX0sCisgICAgICAgICAgICB7Ik5TaW1TdW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNiwxNzEpfX19LAorICAgICAgICAgICAgeyJTaW1TdW4tRXh0QiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygyOSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDMsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1NiwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc0LDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE0Nyw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygxOTYsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oMzkwLDE3MSl9fX0sCisgICAgICAgICAgICB7IlNpdGthIFNtYWxsIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMiwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM2LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oNDAsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0NiwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ5LDIwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTUsMjIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDYxLDI2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oODAsMzMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDYsNDQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjEyLDg4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI4NCwxMTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTY0LDIzNSl9fX0sCisgICAgICAgICAgICB7IlNpdGthIFRleHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTksMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NywzMSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiw0MSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDUsODEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjczLDEwOSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NDQsMjE2KX19fSwKKyAgICAgICAgICAgIHsiU2l0a2EgU3ViaGVhZGluZyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTksMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NywyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDUsNzYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjczLDEwMSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NDQsMjAxKX19fSwKKyAgICAgICAgICAgIHsiU2l0a2EgSGVhZGluZyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTksMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NywyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDUsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjczLDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU0NCwxOTApfX19LAorICAgICAgICAgICAgeyJTaXRrYSBEaXNwbGF5IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDc3LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNSw2OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzMsOTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTQ0LDE4MSl9fX0sCisgICAgICAgICAgICB7IlNpdGthIEJhbm5lciIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTksMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NywyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDUsNjUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjczLDg3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU0NCwxNzMpfX19LAorICAgICAgICAgICAgeyJUYWhvbWEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OCwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTUsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA3LDkzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxMiwxODYpfX19LAorICAgICAgICAgICAgeyJUcmVidWNoZXQgTVMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjQsNjcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE5LDkwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxOCwxNzkpfX19LAorICAgICAgICAgICAgeyJWZXJkYW5hIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMywxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzksMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDI0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMzEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCw0MSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTYsODEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA3LDEwOSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTgsMjE2KX19fSwKKyAgICAgICAgICAgIHsiV2ViZGluZ3MiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIyLDExKX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsMTMpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDE2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywyMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDI0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMjcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwyOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDMyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMzUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwzNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDQ4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzgsNjQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDk2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU1LDEyOCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDYsMTcxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxMCwzNDEpfX19LAorICAgICAgICAgICAgeyJZdSBHb3RoaWMgVUkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODQpfX19LAorICAgICAgICAgICAgeyJZdSBHb3RoaWMgVUkgU2VtaWJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxOTYpfX19LAorICAgICAgICAgICAgeyJZdSBHb3RoaWMgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI2LDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oNDAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0NCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ3LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTMsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1NiwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDYxLDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzcsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDIsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjA1LDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI3NSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NTAsMTgzKX19fSwKKyAgICAgICAgICAgIHsiWXUgR290aGljIFVJIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDY4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTgxKX19fSwKKyAgICAgICAgICAgIHsiWXUgR290aGljIE1lZGl1bSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNjEsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NywyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDUsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjc1LDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU0OSwxODkpfX19LAorICAgICAgICAgICAgeyJZdSBHb3RoaWMgVUkgU2VtaWxpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDcwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg3KX19fSwKKyAgICAgICAgICAgIHsiTVQgRXh0cmEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTMpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDE2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwyMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM2LDI0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDAsMjgpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwzMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ4LDMzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMzYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NiwzOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcxLDQ5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTUsNjUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDk4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTkyLDEzMSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNTcsMTc0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDUxMSwzNDcpfX19LAorICAgICAgICAgICAgeyJBZ2VuY3kgRkIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiw4KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEwKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ0LDE0KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxNil9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDIxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMjgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDU2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNiw3NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzAsMTQ4KX19fSwKKyAgICAgICAgICAgIHsiQWxnZXJpYW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM0LDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTAsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY4LDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTg0LDc3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0NCwxMDMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDg4LDIwNSl9fX0sCisgICAgICAgICAgICB7IkJvb2sgQW50aXF1YSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgzLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjAsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM4LDE3MSl9fX0sCisgICAgICAgICAgICB7IkFyaWFsIE5hcnJvdyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxMyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDIyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMjkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDU4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCw3OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTgsMTU2KX19fSwKKyAgICAgICAgICAgIHsiQXJpYWwgUm91bmRlZCBNVCBCb2xkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Niw3Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsMTAyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNCwyMDIpfX19LAorICAgICAgICAgICAgeyJCYXNrZXJ2aWxsZSBPbGQgRmFjZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYyLDYzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNiw4NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzAsMTY4KX19fSwKKyAgICAgICAgICAgIHsiQmF1aGF1cyA5MyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjUsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzMsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNywxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQyLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDUsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTcsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NCwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMCwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxOTksNzMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjY2LDk3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDUzMSwxOTQpfX19LAorICAgICAgICAgICAgeyJCZWxsIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYzLDY0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOCw4Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzMsMTcxKX19fSwKKyAgICAgICAgICAgIHsiQmVybmFyZCBNVCBDb25kZW5zZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDE3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDMxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Niw2Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsODQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDE2Nyl9fX0sCisgICAgICAgICAgICB7IkJvZG9uaSBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMzEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY0LDYzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyMCw4NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzgsMTY3KX19fSwKKyAgICAgICAgICAgIHsiQm9kb25pIE1UIEJsYWNrIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDI0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMzEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSw0Mil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsODQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE1LDExMil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjgsMjI0KX19fSwKKyAgICAgICAgICAgIHsiQm9kb25pIE1UIENvbmRlbnNlZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDYpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNyw3KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsOCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDE2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMjIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDMyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYyLDQzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNiw1OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzEsMTE1KX19fSwKKyAgICAgICAgICAgIHsiQm9kb25pIE1UIFBvc3RlciBDb21wcmVzc2VkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsNil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCw4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCw5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwxMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDE0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMTgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDI4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDM4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSw0OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsOTYpfX19LAorICAgICAgICAgICAgeyJCb29rbWFuIE9sZCBTdHlsZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMzApfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4Miw0MCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNzkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDEwNil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzcsMjExKX19fSwKKyAgICAgICAgICAgIHsiQnJhZGxleSBIYW5kIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTAsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY4LDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTAsNDEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDgyKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MCwxMTApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDc4LDIxOSl9fX0sCisgICAgICAgICAgICB7IkJyaXRhbm5pYyBCb2xkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Niw3OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsMTA1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNCwyMDkpfX19LAorICAgICAgICAgICAgeyJCZXJsaW4gU2FucyBGQiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMywxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzksMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ1LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OCwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTUsNzYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA3LDEwMil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTEsMjAzKX19fSwKKyAgICAgICAgICAgIHsiQmVybGluIFNhbnMgRkIgRGVtaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMzApfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OCw0MCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTUsODEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA3LDEwOCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTIsMjE1KX19fSwKKyAgICAgICAgICAgIHsiQnJvYWR3YXkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwzMSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDQxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw4Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTAsMTExKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNywyMTkpfX19LAorICAgICAgICAgICAgeyJCcnVzaCBTY3JpcHQgTVQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NywzMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzIsNjUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjMwLDg3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1NywxNzQpfX19LAorICAgICAgICAgICAgeyJCb29rc2hlbGYgU3ltYm9sIDciLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDE2KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksMTgpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMiwyMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM0LDIxKX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzgsMjQpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MSwyNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQzLDI3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTYsMzUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3NCw0Nyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNzEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNDcsOTUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMTk2LDEyNil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbygzOTAsMjUxKX19fSwKKyAgICAgICAgICAgIHsiQ2FsaWZvcm5pYW4gRkIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjIsNjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE2LDkxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOSwxODEpfX19LAorICAgICAgICAgICAgeyJDYWxpc3RvIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMzMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDY1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMSw4Nyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjAsMTc0KX19fSwKKyAgICAgICAgICAgIHsiQ2FzdGVsbGFyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDIxKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMjMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NiwyNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDI3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMzUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4Myw0Nil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjUsOTIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjIwLDEyMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzcsMjQ1KX19fSwKKyAgICAgICAgICAgIHsiQ2VudHVyeSBTY2hvb2xib29rIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMTkwKX19fSwKKyAgICAgICAgICAgIHsiQ2VudGF1ciIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDYsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMzEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY1LDYzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyMCw4NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDAsMTY3KX19fSwKKyAgICAgICAgICAgIHsiQ2hpbGxlciIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDIzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDYwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCw4MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDYsMTYwKX19fSwKKyAgICAgICAgICAgIHsiQ29sb25uYSBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ4LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NiwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg3LDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3Myw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzEsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDU5LDE3MSl9fX0sCisgICAgICAgICAgICB7IkNvb3BlciBCbGFjayIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsNzcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjExLDEwMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjAsMjA1KX19fSwKKyAgICAgICAgICAgIHsiQ29wcGVycGxhdGUgR290aGljIEJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDI1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjYpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwzNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDQ2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OCw5MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTEsMTIyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMCwyNDMpfX19LAorICAgICAgICAgICAgeyJDb3BwZXJwbGF0ZSBHb3RoaWMgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDI1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwzNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc4LDQ2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw5Mil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDksMTIzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxOCwyNDYpfX19LAorICAgICAgICAgICAgeyJDdXJseiBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDEsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NSwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg4LDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3Myw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzMsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDYyLDE4Myl9fX0sCisgICAgICAgICAgICB7IkVsZXBoYW50IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxNil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMjApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwyMil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDI0KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMjcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwyOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDM2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsNDkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDczKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDk3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCwxMzApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDQ2LDI1OCl9fX0sCisgICAgICAgICAgICB7IkVuZ3JhdmVycyBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE2KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsNDEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDgzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMSwxMTApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE5LDIxOSl9fX0sCisgICAgICAgICAgICB7IkVyYXMgQm9sZCBJVEMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwzMSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDQyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw4Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsMTExKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNSwyMjIpfX19LAorICAgICAgICAgICAgeyJFcmFzIERlbWkgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDM5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw3OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsMTA0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNSwyMDgpfX19LAorICAgICAgICAgICAgeyJFcmFzIExpZ2h0IElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI3LDE4Myl9fX0sCisgICAgICAgICAgICB7IkVyYXMgTWVkaXVtIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw3Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsOTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI2LDE5NSl9fX0sCisgICAgICAgICAgICB7IkZlbGl4IFRpdGxpbmciLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjAsNzUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDEwMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjQsMTk4KX19fSwKKyAgICAgICAgICAgIHsiRm9ydGUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzEsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5NSwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODgsNjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjUzLDkxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDUwMywxODEpfX19LAorICAgICAgICAgICAgeyJGcmFua2xpbiBHb3RoaWMgQm9vayIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2OCw3NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjQsMTAwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwyMDApfX19LAorICAgICAgICAgICAgeyJGcmFua2xpbiBHb3RoaWMgRGVtaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2OCw3NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjQsMTAwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwyMDApfX19LAorICAgICAgICAgICAgeyJGcmFua2xpbiBHb3RoaWMgRGVtaSBDb25kIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDY1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCw4Nyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMTc0KX19fSwKKyAgICAgICAgICAgIHsiRnJhbmtsaW4gR290aGljIEhlYXZ5IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDc1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCwxMDApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDIwMCl9fX0sCisgICAgICAgICAgICB7IkZyYW5rbGluIEdvdGhpYyBNZWRpdW0gQ29uZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDMzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2OCw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjQsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDE3NCl9fX0sCisgICAgICAgICAgICB7IkZyZWVzdHlsZSBTY3JpcHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDEwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OCwxMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUwLDEzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMTcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwyMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzIsNDQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDU4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1NCwxMTcpfX19LAorICAgICAgICAgICAgeyJGcmVuY2ggU2NyaXB0IE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiw5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDEyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwxNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDE4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMjMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDQ3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCw2Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDYsMTI1KX19fSwKKyAgICAgICAgICAgIHsiRm9vdGxpZ2h0IE1UIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTksMTg4KX19fSwKKyAgICAgICAgICAgIHsiR2FyYW1vbmQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDMwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTcsODApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDMyLDE2MCl9fX0sCisgICAgICAgICAgICB7IkdpZ2kiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDcpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODIsNjYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQyLDg4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxNzUpfX19LAorICAgICAgICAgICAgeyJHaWxsIFNhbnMgTVQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjMsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI2LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMzLDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzcsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQzLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDgsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU2LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzEsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODQsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQzLDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMSwxNzEpfX19LAorICAgICAgICAgICAgeyJHaWxsIFNhbnMgTVQgQ29uZGVuc2VkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiw5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDEyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MCwxNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDE4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMjMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY5LDQ3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNiw2Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzQsMTI1KX19fSwKKyAgICAgICAgICAgIHsiR2lsbCBTYW5zIFVsdHJhIEJvbGQgQ29uZGVuc2VkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODksMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc2LDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzNSw5OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjgsMTk4KX19fSwKKyAgICAgICAgICAgIHsiR2lsbCBTYW5zIFVsdHJhIEJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiwxMSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDEzKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsMTQpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxNil9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDE4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMjEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwyMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDI1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMjcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwzMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDMyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzEsNDEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5Myw1NSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsODIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsMTA5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSwxNDYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI4LDI5MSl9fX0sCisgICAgICAgICAgICB7Ikdsb3VjZXN0ZXIgTVQgRXh0cmEgQ29uZGVuc2VkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCw5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDEyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTQpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwxNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDE5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMjUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDQ5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSw2Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMTMyKX19fSwKKyAgICAgICAgICAgIHsiR2lsbCBTYW5zIE1UIEV4dCBDb25kZW5zZWQgQm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNyw3KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsOCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDE3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMjIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDMzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDQ0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNCw1OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTAsMTE3KX19fSwKKyAgICAgICAgICAgIHsiQ2VudHVyeSBHb3RoaWMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE0LDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNywxODkpfX19LAorICAgICAgICAgICAgeyJHb3VkeSBPbGQgU3R5bGUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUwLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjMsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzMsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjMxLDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1MSwxNzEpfX19LAorICAgICAgICAgICAgeyJHb3VkeSBTdG91dCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDExKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsMTIpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMywxMyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDE2KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywyMCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM5LDIyKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDIsMjQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NiwyNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDUwLDI5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTMsMzEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2OCw0MCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg5LDUzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw3OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3OCwxMDYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDE0MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzMsMjgwKX19fSwKKyAgICAgICAgICAgIHsiSGFybG93IFNvbGlkIEl0YWxpYyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTAsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MiwxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDY4LDIyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTAsMzApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc5LDYwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzOCw4MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzQsMTU5KX19fSwKKyAgICAgICAgICAgIHsiSGFycmluZ3RvbiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTEsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIxLDE4OSl9fX0sCisgICAgICAgICAgICB7IkhhZXR0ZW5zY2h3ZWlsZXIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNCwxMyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0MywxNil9LHszNixuZXcgRm9udFNpemVJbmZvKDU1LDIxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzMsMjgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTQ4LDU2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDE5OCw3NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbygzOTEsMTUwKX19fSwKKyAgICAgICAgICAgIHsiSGlnaCBUb3dlciBUZXh0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNjIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE3LDgyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzMiwxNjQpfX19LAorICAgICAgICAgICAgeyJJbXByaW50IE1UIFNoYWRvdyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDMzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI3LDE3NCl9fX0sCisgICAgICAgICAgICB7IkluZm9ybWFsIFJvbWFuIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgzLDY4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0NSw5MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzksMTgxKX19fSwKKyAgICAgICAgICAgIHsiQmxhY2thZGRlciBJVEMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCw4KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM0LDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxMSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMTMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwxNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDE1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjgsMTkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwyNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzksNTEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDY3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3NCwxMzUpfX19LAorICAgICAgICAgICAgeyJFZHdhcmRpYW4gU2NyaXB0IElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDIzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMzEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTcxLDYxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyOCw4Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTQsMTYzKX19fSwKKyAgICAgICAgICAgIHsiS3Jpc3RlbiBJVEMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjQsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY4LDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc4LDc3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MCwxMDMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDczLDIwNSl9fX0sCisgICAgICAgICAgICB7Ikpva2VybWFuIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM1LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzksMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ4LDIxKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTIsMjMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1NiwyNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDYxLDI2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzYsMzQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDEsNDYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjAyLDkxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI3MCwxMjIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTY5LDI0NCl9fX0sCisgICAgICAgICAgICB7Ikp1aWNlIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNyw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsOCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDEwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDEzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMTQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwxOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDI0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzNil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw0OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsNjQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM2LDEyOCl9fX0sCisgICAgICAgICAgICB7Ikt1bnN0bGVyIFNjcmlwdCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCw3KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsOCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDEwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDEyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwxNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDIzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzNCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw0NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsNjApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM3LDEyMCl9fX0sCisgICAgICAgICAgICB7IldpZGUgTGF0aW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDE0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDIwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMjQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwyNil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDMwKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMzMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwzNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDQwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsNDMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCw0Nil9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDU5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsNzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDExOSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MywxNTgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDIxMil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzMsNDIyKX19fSwKKyAgICAgICAgICAgIHsiTHVjaWRhIEJyaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzksMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ1LDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzOSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksNzgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDEwNCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjYsMjA3KX19fSwKKyAgICAgICAgICAgIHsiTHVjaWRhIENhbGxpZ3JhcGh5IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMywxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDE3KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwyMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDIyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjQpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MiwyNil9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDMzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsNDQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgzLDg2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0NiwxMTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDg5LDIyNyl9fX0sCisgICAgICAgICAgICB7IkxlZWxhd2FkZWUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjAsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDk4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMywxOTYpfX19LAorICAgICAgICAgICAgeyJMdWNpZGEgRmF4IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMzIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OCw0Mil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsODUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjExLDExMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjIsMjI2KX19fSwKKyAgICAgICAgICAgIHsiTHVjaWRhIEhhbmR3cml0aW5nIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE3KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwyMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDIzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MiwyNil9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDMzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTAsNDQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgxLDg3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MiwxMTYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgzLDIzMSl9fX0sCisgICAgICAgICAgICB7Ikx1Y2lkYSBTYW5zIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDI0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMzIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCw0Mil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksODQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDExMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjYsMjI1KX19fSwKKyAgICAgICAgICAgIHsiTHVjaWRhIFNhbnMgVHlwZXdyaXRlciIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzOSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksNzcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDEwMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjQsMjA1KX19fSwKKyAgICAgICAgICAgIHsiTWFnbmV0byIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsMTIpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiwxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDE1KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTYpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDIxKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMjIpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywyNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ3LDI3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDksMjkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwzNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg0LDQ5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw3NCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2OCw5OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjQsMTMyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0NSwyNjMpfX19LAorICAgICAgICAgICAgeyJNYWlhbmRyYSBHRCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDc2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMiwxMDIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIyLDIwMCl9fX0sCisgICAgICAgICAgICB7Ik1hdHVyYSBNVCBTY3JpcHQgQ2FwaXRhbHMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiwxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIzLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjUsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMyLDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzYsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDIwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDgsMjIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MywyNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU2LDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzIsMzMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5NSw0Mil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxOTAsODQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjUzLDExMSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1MDQsMjIxKX19fSwKKyAgICAgICAgICAgIHsiTWlzdHJhbCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ3LDE3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDMwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0NCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2OSw1OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjYsNzgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDUwLDE1NCl9fX0sCisgICAgICAgICAgICB7Ik1vZGVybiBOby4gMjAiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywxNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDE4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzMCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjAsNTkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE0LDc5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNywxNTYpfX19LAorICAgICAgICAgICAgeyJNaWNyb3NvZnQgVWlnaHVyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMyw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjMsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDYpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzAsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMzLDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNyw5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDIsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NSwxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUyLDEyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMTMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwxNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDc2LDE4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDI0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzNil9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwMiw0OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzIsNjQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDc2LDEyOCl9fX0sCisgICAgICAgICAgICB7Ik1vbm90eXBlIENvcnNpdmEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ3LDE2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDksMTcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyMil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDI5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3MCw1Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjUsNzYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDUzLDE1MSl9fX0sCisgICAgICAgICAgICB7Ik5pYWdhcmEgRW5ncmF2ZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMyw5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzUsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwxMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDExKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMTIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OCwxNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc3LDIwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzMCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NCwzOSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDcsNTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDA3LDEwMyl9fX0sCisgICAgICAgICAgICB7Ik5pYWdhcmEgU29saWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMyw5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzUsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwxMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDExKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMTIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OCwxNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc3LDIwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzMCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NCwzOSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDcsNTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDA3LDEwMyl9fX0sCisgICAgICAgICAgICB7Ik9DUiBBIEV4dGVuZGVkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMywxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM1LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzksMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MiwyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ1LDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTcsMzApfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3Niw0MCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTIsNzgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjAyLDEwNCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MDIsMjA3KX19fSwKKyAgICAgICAgICAgIHsiT2xkIEVuZ2xpc2ggVGV4dCBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw2Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDksODgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE4LDE3NSl9fX0sCisgICAgICAgICAgICB7Ik9ueXgiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMyw5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzUsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwxMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQyLDExKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMTEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OCwxNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc3LDE5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwyOSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1MiwzOSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDMsNTApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDk3KX19fSwKKyAgICAgICAgICAgIHsiTVMgT3V0bG9vayIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygyOSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc4LDMzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NCw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDYsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDEwLDE3Mil9fX0sCisgICAgICAgICAgICB7IlBhbGFjZSBTY3JpcHQgTVQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSw5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDEyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMTMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwxNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDIxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzMSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MCw0MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTMsNTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI1LDEwOCl9fX0sCisgICAgICAgICAgICB7IlBhcHlydXMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIzLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyNCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDksMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU4LDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNjEsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg4MCwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwNCwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMTAsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjc5LDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU1NiwxOTcpfX19LAorICAgICAgICAgICAgeyJQYXJjaG1lbnQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw0KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsNCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDQpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNyw1KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiw3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0Niw4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDksOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDExKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMTQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDIxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY5LDI4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNiwzNyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTAsNzMpfX19LAorICAgICAgICAgICAgeyJQZXJwZXR1YSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxMyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDIyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMjkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTcxLDU5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyOCw3OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTMsMTU2KX19fSwKKyAgICAgICAgICAgIHsiUGVycGV0dWEgVGl0bGluZyBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDExKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTMpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE2KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTgpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyNSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDMyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksNDMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDg1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCwxMTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE4LDIyNyl9fX0sCisgICAgICAgICAgICB7IlBsYXliaWxsIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygyOSw5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzMsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNSwxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDIsMTIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NSwxMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDU4LDE3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzcsMjMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTUzLDQ2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwMyw2MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MDUsMTIyKX19fSwKKyAgICAgICAgICAgIHsiUG9vciBSaWNoYXJkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDcwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMTg3KX19fSwKKyAgICAgICAgICAgIHsiUHJpc3RpbmEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjMsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzIsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNiwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQwLDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDMsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NywxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUyLDE2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTUsMTcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MSwyMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDk0LDMwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4Nyw2MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDgsODEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDk0LDE2Mil9fX0sCisgICAgICAgICAgICB7IlJhZ2UgSXRhbGljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMSwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsMzMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgyLDY2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0Miw4OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTc3KX19fSwKKyAgICAgICAgICAgIHsiUmF2aWUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIyLDEwKX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsMTIpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCwxNCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI1LDE1KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjksMTgpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwyMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM3LDIzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMjYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwyOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDMwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTIsMzMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywzNSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY3LDQ2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsNjEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDkxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc5LDEyMil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzgsMTYyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3MiwzMjQpfX19LAorICAgICAgICAgICAgeyJNUyBSZWZlcmVuY2UgU2FucyBTZXJpZiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsNDEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDgxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMSwxMDkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE4LDIxNil9fX0sCisgICAgICAgICAgICB7Ik1TIFJlZmVyZW5jZSBTcGVjaWFsdHkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCwxMyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDE2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDIzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMjUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwyOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDMyKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMzUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwzOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDQyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsNDQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSw1OCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDc3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwxMTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksMTUzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMywyMDUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIzLDQwOCl9fX0sCisgICAgICAgICAgICB7IlJvY2t3ZWxsIENvbmRlbnNlZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNyw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDEwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDEzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMTQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwxOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDIzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzNSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw0Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTIsNjIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIyLDEyNSl9fX0sCisgICAgICAgICAgICB7IlJvY2t3ZWxsIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCw5Myl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjAsMTg1KX19fSwKKyAgICAgICAgICAgIHsiUm9ja3dlbGwgRXh0cmEgQm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDExKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTMpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE3KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywyMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjQpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyNSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDMzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsNDQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDg4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMSwxMTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIwLDIzNCl9fX0sCisgICAgICAgICAgICB7IlNjcmlwdCBNVCBCb2xkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDY4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNSw5MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjgsMTgwKX19fSwKKyAgICAgICAgICAgIHsiU2hvd2NhcmQgR290aGljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDYzLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY1LDc2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOSwxMDEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM1LDIwMCl9fX0sCisgICAgICAgICAgICB7IlNuYXAgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTMpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNCwxNCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDE2KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwyMSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDIzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMjUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NCwyOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ2LDMwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTAsMzIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSw0Mil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg0LDU1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw4Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NywxMTEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI1LDE0OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDMsMjk1KX19fSwKKyAgICAgICAgICAgIHsiU3RlbmNpbCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ2LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgzLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTksOTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM2LDE5Nil9fX0sCisgICAgICAgICAgICB7IlR3IENlbiBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTIsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIxLDE4OCl9fX0sCisgICAgICAgICAgICB7IlR3IENlbiBNVCBDb25kZW5zZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMTgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwyMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjAsNDcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE0LDYyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNCwxMjUpfX19LAorICAgICAgICAgICAgeyJUdyBDZW4gTVQgQ29uZGVuc2VkIEV4dHJhIEJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTgpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDMxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NSw2Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsODQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE0LDE2Nyl9fX0sCisgICAgICAgICAgICB7IlRlbXB1cyBTYW5zIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDExKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE2KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTgpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ0LDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDgsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyNSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDMyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODcsNDMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTczLDg1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzMCwxMTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDU4LDIyNil9fX0sCisgICAgICAgICAgICB7IlZpbmVyIEhhbmQgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMyw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjQsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMiwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oNDAsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ4LDIwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTMsMjIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1OCwyNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDYxLDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzksMzMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDQsNDMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjA4LDg3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI3NywxMTYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTUyLDIzMil9fX0sCisgICAgICAgICAgICB7IlZpdmFsZGkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw4KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsOSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDEwKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxMil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE0KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDYsMTUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwxNil9LHszNixuZXcgRm9udFNpemVJbmZvKDYzLDIwKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMjcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDU1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNSw3Myl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDgsMTQ2KX19fSwKKyAgICAgICAgICAgIHsiVmxhZGltaXIgU2NyaXB0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDEzKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMjIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSwzMCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjksNTkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI1LDc5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0OCwxNTgpfX19LAorICAgICAgICAgICAgeyJXaW5nZGluZ3MgMiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsMTIpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDE3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwyMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDI0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMjcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwzMSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDMzKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMzYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0Myw0MCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDQyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksNTQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSw3Myl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMTA5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU2LDE0NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsMTk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNCwzODYpfX19LAorICAgICAgICAgICAgeyJXaW5nZGluZ3MgMyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEzKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTQpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE5KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMjEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwyNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM1LDI2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDMzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTYsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA4LDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNCwxODkpfX19LAorICAgICAgICAgICAgeyJCdXh0b24gU2tldGNoIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM0LDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MiwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY3LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTAsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc4LDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzOCw5OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzMsMTk2KX19fSwKKyAgICAgICAgICAgIHsiU2Vnb2UgTWFya2VyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDkpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDEyKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTIpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyMCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDI3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw1NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTIsNzMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIyLDE0Nil9fX0sCisgICAgICAgICAgICB7IlNrZXRjaEZsb3cgUHJpbnQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwyMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDIxKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMjMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwyNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDI3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMzUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSw0Nyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNzApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsOTMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE1LDEyNCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjcsMjQ4KX19fSwKKyAgICAgICAgICAgIHsiTWljcm9zb2Z0IE1IZWkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDcsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQzLDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODcpfX19LAorICAgICAgICAgICAgeyJNaWNyb3NvZnQgTmVvR290aGljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ3LDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgxLDcyKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0Myw5Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTkxKX19fSwKKyAgICAgICAgICAgIHsiU2Vnb2UgV1AgQmxhY2siLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjksMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ3LDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMjIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDY5LDMwKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTEsNDApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgxLDc5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MywxMDYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDIxMil9fX0sCisgICAgICAgICAgICB7IlNlZ29lIFdQIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDcyKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTkxKX19fSwKKyAgICAgICAgICAgIHsiU2Vnb2UgV1AgU2VtaWJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxOTYpfX19LAorICAgICAgICAgICAgeyJTZWdvZSBXUCBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4MSl9fX0sCisgICAgICAgICAgICB7IlNlZ29lIFdQIFNlbWlMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4Nyl9fX0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvQ2FsY3VsYXRlRXh0ZW50aW9ucy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9DYWxjdWxhdGVFeHRlbnRpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjNmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvQ2FsY3VsYXRlRXh0ZW50aW9ucy5jcwpAQCAtMCwwICsxLDIwNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgICAgICAgICAgICAgICAgICAyMDEyLTAzLTA0ICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGN1bGF0aW9uRXh0ZW5zaW9uCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3JrYm9vayB3b3JrYm9vaykKKyAgICAgICAgeworICAgICAgICAgICAgQ2FsY3VsYXRlKHdvcmtib29rLCBuZXcgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbigpe0FsbG93Q2lyY3VsYXJlUmVmZXJlbmNlcz1mYWxzZX0pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDYWxjdWxhdGUodGhpcyBFeGNlbFdvcmtib29rIHdvcmtib29rLCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXQod29ya2Jvb2spOworCisgICAgICAgICAgICB2YXIgZGMgPSBEZXBlbmRlbmN5Q2hhaW5GYWN0b3J5LkNyZWF0ZSh3b3JrYm9vaywgb3B0aW9ucyk7CisgICAgICAgICAgICB3b3JrYm9vay5Gb3JtdWxhUGFyc2VyLkluaXROZXdDYWxjKCk7CisgICAgICAgICAgICBpZiAod29ya2Jvb2suRm9ybXVsYVBhcnNlci5Mb2dnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RyaW5nLkZvcm1hdCgiU3RhcnRpbmcuLi4gbnVtYmVyIG9mIGNlbGxzIHRvIHBhcnNlOiB7MH0iLCBkYy5saXN0LkNvdW50KTsKKyAgICAgICAgICAgICAgICB3b3JrYm9vay5Gb3JtdWxhUGFyc2VyLkxvZ2dlci5Mb2cobXNnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9UT0RPOiBSZW1vdmUgd2hlbiB0ZXN0cyBhcmUgZG9uZS4gT3V0cHV0cyB0aGUgZGMgdG8gYSB0ZXh0IGZpbGUuIAorICAgICAgICAgICAgLy92YXIgZmlsZURjID0gbmV3IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoImM6XFx0ZW1wXFxkYy50eHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGRjLmxpc3QuQ291bnQ7IGkrKykKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgZmlsZURjLldyaXRlTGluZShpLlRvU3RyaW5nKCkgKyAiLCIgKyBkYy5saXN0W2ldLkNvbHVtbi5Ub1N0cmluZygpICsgIiwiICsgZGMubGlzdFtpXS5Sb3cuVG9TdHJpbmcoKSArICIsIiArIChkYy5saXN0W2ldLndzPT1udWxsID8gIiIgOiBkYy5saXN0W2ldLndzLk5hbWUpICsgIiwiICsgZGMubGlzdFtpXS5Gb3JtdWxhKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9maWxlRGMuQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vZmlsZURjID0gbmV3IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoImM6XFx0ZW1wXFxkY29yZGVyLnR4dCIpOworICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGRjLkNhbGNPcmRlci5Db3VudDsgaSsrKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBmaWxlRGMuV3JpdGVMaW5lKGRjLkNhbGNPcmRlcltpXS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9maWxlRGMuQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vZmlsZURjID0gbnVsbDsKKworICAgICAgICAgICAgLy9UT0RPOiBBZGQgY2FsY3VsYXRpb24gaGVyZQorCisgICAgICAgICAgICBDYWxjQ2hhaW4od29ya2Jvb2ssIHdvcmtib29rLkZvcm11bGFQYXJzZXIsIGRjKTsKKworICAgICAgICAgICAgLy93b3JrYm9vay5faXNDYWxjdWxhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICBDYWxjdWxhdGUod29ya3NoZWV0LCBuZXcgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXQod29ya3NoZWV0Lldvcmtib29rKTsKKyAgICAgICAgICAgIC8vd29ya3NoZWV0Lldvcmtib29rLl9mb3JtdWxhUGFyc2VyID0gbnVsbDsgVE9ETzpDYW50IHJlc2V0LiBEb24ndCB3b3JrIHdpdGggdXNlcmRlZmluZWQgb3Igb3ZlcnJpZGVkIHdvcmtzaGVldCBmdW5jdGlvbnMgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBkYyA9IERlcGVuZGVuY3lDaGFpbkZhY3RvcnkuQ3JlYXRlKHdvcmtzaGVldCwgb3B0aW9ucyk7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gd29ya3NoZWV0Lldvcmtib29rLkZvcm11bGFQYXJzZXI7CisgICAgICAgICAgICBwYXJzZXIuSW5pdE5ld0NhbGMoKTsKKyAgICAgICAgICAgIGlmIChwYXJzZXIuTG9nZ2VyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0cmluZy5Gb3JtYXQoIlN0YXJ0aW5nLi4uIG51bWJlciBvZiBjZWxscyB0byBwYXJzZTogezB9IiwgZGMubGlzdC5Db3VudCk7CisgICAgICAgICAgICAgICAgcGFyc2VyLkxvZ2dlci5Mb2cobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENhbGNDaGFpbih3b3Jrc2hlZXQuV29ya2Jvb2ssIHBhcnNlciwgZGMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDYWxjdWxhdGUodGhpcyBFeGNlbFJhbmdlQmFzZSByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2FsY3VsYXRlKHJhbmdlLCBuZXcgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxSYW5nZUJhc2UgcmFuZ2UsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdChyYW5nZS5fd29ya2Jvb2spOworICAgICAgICAgICAgdmFyIHBhcnNlciA9IHJhbmdlLl93b3JrYm9vay5Gb3JtdWxhUGFyc2VyOworICAgICAgICAgICAgcGFyc2VyLkluaXROZXdDYWxjKCk7CisgICAgICAgICAgICB2YXIgZGMgPSBEZXBlbmRlbmN5Q2hhaW5GYWN0b3J5LkNyZWF0ZShyYW5nZSwgb3B0aW9ucyk7CisgICAgICAgICAgICBDYWxjQ2hhaW4ocmFuZ2UuX3dvcmtib29rLCBwYXJzZXIsIGRjKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIG9iamVjdCBDYWxjdWxhdGUodGhpcyBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBGb3JtdWxhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ2FsY3VsYXRlKHdvcmtzaGVldCwgRm9ybXVsYSwgbmV3IEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBvYmplY3QgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgRm9ybXVsYSwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eShGb3JtdWxhLlRyaW0oKSkpIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIEluaXQod29ya3NoZWV0Lldvcmtib29rKTsKKyAgICAgICAgICAgICAgICB2YXIgcGFyc2VyID0gd29ya3NoZWV0Lldvcmtib29rLkZvcm11bGFQYXJzZXI7CisgICAgICAgICAgICAgICAgcGFyc2VyLkluaXROZXdDYWxjKCk7CisgICAgICAgICAgICAgICAgaWYgKEZvcm11bGFbMF0gPT0gJz0nKSBGb3JtdWxhID0gRm9ybXVsYS5TdWJzdHJpbmcoMSk7IC8vUmVtb3ZlIGFueSBzdGFydGluZyBlcXVhbCBzaWduCisgICAgICAgICAgICAgICAgdmFyIGRjID0gRGVwZW5kZW5jeUNoYWluRmFjdG9yeS5DcmVhdGUod29ya3NoZWV0LCBGb3JtdWxhLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICB2YXIgZiA9IGRjLmxpc3RbMF07CisgICAgICAgICAgICAgICAgZGMuQ2FsY09yZGVyLlJlbW92ZUF0KGRjLkNhbGNPcmRlci5Db3VudCAtIDEpOworCisgICAgICAgICAgICAgICAgQ2FsY0NoYWluKHdvcmtzaGVldC5Xb3JrYm9vaywgcGFyc2VyLCBkYyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLlBhcnNlQ2VsbChmLlRva2Vucywgd29ya3NoZWV0Lk5hbWUsIC0xLCAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGV4Lk1lc3NhZ2UsIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2FsY0NoYWluKEV4Y2VsV29ya2Jvb2sgd2IsIEZvcm11bGFQYXJzZXIgcGFyc2VyLCBEZXBlbmRlbmN5Q2hhaW4gZGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkZWJ1ZyA9IHBhcnNlci5Mb2dnZXIgIT0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpeCBpbiBkYy5DYWxjT3JkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBkYy5saXN0W2l4XTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB3cyA9IHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElEKGl0ZW0uU2hlZXRJRCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gcGFyc2VyLlBhcnNlQ2VsbChpdGVtLlRva2Vucywgd3MgPT0gbnVsbCA/ICIiIDogd3MuTmFtZSwgaXRlbS5Sb3csIGl0ZW0uQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUod2IsIGl0ZW0sIHYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5Mb2dnZXIuTG9nQ2VsbENvdW50ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuU2xlZXAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoZmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBFeGNlbEVycm9yVmFsdWUuUGFyc2UoRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIFNldFZhbHVlKHdiLCBpdGVtLCBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgSW5pdChFeGNlbFdvcmtib29rIHdvcmtib29rKQorICAgICAgICB7CisgICAgICAgICAgICB3b3JrYm9vay5fZm9ybXVsYVRva2VucyA9IG5ldyBDZWxsU3RvcmU8TGlzdDxUb2tlbj4+KCk7OworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdzIGluIHdvcmtib29rLldvcmtzaGVldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCEod3MgaXMgRXhjZWxDaGFydHNoZWV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cy5fZm9ybXVsYVRva2VucyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5fZm9ybXVsYVRva2Vucy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd3MuX2Zvcm11bGFUb2tlbnMgPSBuZXcgQ2VsbFN0b3JlPExpc3Q8VG9rZW4+PigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2V0VmFsdWUoRXhjZWxXb3JrYm9vayB3b3JrYm9vaywgRm9ybXVsYUNlbGwgaXRlbSwgb2JqZWN0IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpdGVtLkNvbHVtbiA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpdGVtLlNoZWV0SUQgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdvcmtib29rLk5hbWVzW2l0ZW0uUm93XS5OYW1lVmFsdWUgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc2ggPSB3b3JrYm9vay5Xb3Jrc2hlZXRzLkdldEJ5U2hlZXRJRChpdGVtLlNoZWV0SUQpOworICAgICAgICAgICAgICAgICAgICBzaC5OYW1lc1tpdGVtLlJvd10uTmFtZVZhbHVlID0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gd29ya2Jvb2suV29ya3NoZWV0cy5HZXRCeVNoZWV0SUQoaXRlbS5TaGVldElEKTsKKyAgICAgICAgICAgICAgICBzaGVldC5fdmFsdWVzLlNldFZhbHVlKGl0ZW0uUm93LCBpdGVtLkNvbHVtbiwgdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRGVwZW5kZW5jeUNoYWluL0RlcGVuZGVuY3lDaGFpbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRGVwZW5kZW5jeUNoYWluLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzkzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRGVwZW5kZW5jeUNoYWluL0RlcGVuZGVuY3lDaGFpbi5jcwpAQCAtMCwwICsxLDE3IEBACit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBpbnRlcm5hbCBjbGFzcyBEZXBlbmRlbmN5Q2hhaW4KKyAgICB7CisgICAgICAgIGludGVybmFsIExpc3Q8Rm9ybXVsYUNlbGw+IGxpc3QgPSBuZXcgTGlzdDxGb3JtdWxhQ2VsbD4oKTsKKyAgICAgICAgaW50ZXJuYWwgRGljdGlvbmFyeTx1bG9uZywgaW50PiBpbmRleCA9IG5ldyBEaWN0aW9uYXJ5PHVsb25nLCBpbnQ+KCk7CisgICAgICAgIGludGVybmFsIExpc3Q8aW50PiBDYWxjT3JkZXIgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgIGludGVybmFsIHZvaWQgQWRkKEZvcm11bGFDZWxsIGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3QuQWRkKGYpOworICAgICAgICAgICAgZi5JbmRleCA9IGxpc3QuQ291bnQgLSAxOworICAgICAgICAgICAgaW5kZXguQWRkKEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKGYuU2hlZXRJRCwgZi5Sb3csIGYuQ29sdW1uKSwgZi5JbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9EZXBlbmRlbnlDaGFpbkZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRGVwZW5kZW5jeUNoYWluL0RlcGVuZGVueUNoYWluRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUwODE3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9EZXBlbmRlbnlDaGFpbkZhY3RvcnkuY3MKQEAgLTAsMCArMSwzNjYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAgICAgICAgICAgICAgICAgMjAxMi0wMy0wNCAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGVwZW5kZW5jeUNoYWluRmFjdG9yeQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIERlcGVuZGVuY3lDaGFpbiBDcmVhdGUoRXhjZWxXb3JrYm9vayB3YiwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGVwQ2hhaW4gPSBuZXcgRGVwZW5kZW5jeUNoYWluKCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gd2IuV29ya3NoZWV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHdiLkZvcm11bGFQYXJzZXIuTGV4ZXIsIHdzLkNlbGxzLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgR2V0V29ya3NoZWV0TmFtZXMod3MsIGRlcENoYWluLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgbmFtZSBpbiB3Yi5OYW1lcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5OYW1lVmFsdWU9PW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHZXRDaGFpbihkZXBDaGFpbiwgd2IuRm9ybXVsYVBhcnNlci5MZXhlciwgbmFtZSwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlcENoYWluOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIERlcGVuZGVuY3lDaGFpbiBDcmVhdGUoRXhjZWxXb3Jrc2hlZXQgd3MsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgd3MuQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgICAgICAgIHZhciBkZXBDaGFpbiA9IG5ldyBEZXBlbmRlbmN5Q2hhaW4oKTsKKworICAgICAgICAgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHdzLldvcmtib29rLkZvcm11bGFQYXJzZXIuTGV4ZXIsIHdzLkNlbGxzLCBvcHRpb25zKTsKKworICAgICAgICAgICAgR2V0V29ya3NoZWV0TmFtZXMod3MsIGRlcENoYWluLCBvcHRpb25zKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlcENoYWluOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0YXRpYyBEZXBlbmRlbmN5Q2hhaW4gQ3JlYXRlKEV4Y2VsV29ya3NoZWV0IHdzLCBzdHJpbmcgRm9ybXVsYSwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICB3cy5DaGVja1NoZWV0VHlwZSgpOworICAgICAgICAgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOworCisgICAgICAgICAgICBHZXRDaGFpbihkZXBDaGFpbiwgd3MuV29ya2Jvb2suRm9ybXVsYVBhcnNlci5MZXhlciwgd3MsIEZvcm11bGEsIG9wdGlvbnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZGVwQ2hhaW47CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldFdvcmtzaGVldE5hbWVzKEV4Y2VsV29ya3NoZWV0IHdzLCBEZXBlbmRlbmN5Q2hhaW4gZGVwQ2hhaW4sIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIG5hbWUgaW4gd3MuTmFtZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldENoYWluKGRlcENoYWluLCB3cy5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyLkxleGVyLCBuYW1lLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIERlcGVuZGVuY3lDaGFpbiBDcmVhdGUoRXhjZWxSYW5nZUJhc2UgcmFuZ2UsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOworCisgICAgICAgICAgICBHZXRDaGFpbihkZXBDaGFpbiwgcmFuZ2UuV29ya3NoZWV0Lldvcmtib29rLkZvcm11bGFQYXJzZXIuTGV4ZXIsIHJhbmdlLCBvcHRpb25zKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlcENoYWluOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgR2V0Q2hhaW4oRGVwZW5kZW5jeUNoYWluIGRlcENoYWluLCBJTGV4ZXIgbGV4ZXIsIEV4Y2VsTmFtZWRSYW5nZSBuYW1lLCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IG5hbWUuV29ya3NoZWV0OworICAgICAgICAgICAgdmFyIGlkID0gRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQod3M9PW51bGw/MDp3cy5TaGVldElELCBuYW1lLkluZGV4LCAwKTsKKyAgICAgICAgICAgIGlmICghZGVwQ2hhaW4uaW5kZXguQ29udGFpbnNLZXkoaWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmID0gbmV3IEZvcm11bGFDZWxsKCkgeyBTaGVldElEID0gd3MgPT0gbnVsbCA/IDAgOiB3cy5TaGVldElELCBSb3cgPSBuYW1lLkluZGV4LCBDb2x1bW4gPSAwLCBGb3JtdWxhPW5hbWUuTmFtZUZvcm11bGEgfTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGYuRm9ybXVsYSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmLlRva2VucyA9IGxleGVyLlRva2VuaXplKGYuRm9ybXVsYSwgKHdzPT1udWxsID8gbnVsbCA6IHdzLk5hbWUpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuX3dvcmtib29rLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKG5hbWUuSW5kZXgsIDAsIGYuVG9rZW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKG5hbWUuSW5kZXgsIDAsIGYuVG9rZW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXBDaGFpbi5BZGQoZik7CisgICAgICAgICAgICAgICAgICAgIEZvbGxvd0NoYWluKGRlcENoYWluLCBsZXhlcixuYW1lLl93b3JrYm9vaywgd3MsIGYsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldENoYWluKERlcGVuZGVuY3lDaGFpbiBkZXBDaGFpbiwgSUxleGVyIGxleGVyLCBFeGNlbFdvcmtzaGVldCB3cywgc3RyaW5nIGZvcm11bGEsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGYgPSBuZXcgRm9ybXVsYUNlbGwoKSB7IFNoZWV0SUQgPSB3cy5TaGVldElELCBSb3cgPSAtMSwgQ29sdW1uID0gLTEgfTsKKyAgICAgICAgICAgIGYuRm9ybXVsYSA9IGZvcm11bGE7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGYuRm9ybXVsYSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZi5Ub2tlbnMgPSBsZXhlci5Ub2tlbml6ZShmLkZvcm11bGEsIHdzLk5hbWUpLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIGRlcENoYWluLkFkZChmKTsKKyAgICAgICAgICAgICAgICBGb2xsb3dDaGFpbihkZXBDaGFpbiwgbGV4ZXIsIHdzLldvcmtib29rLCB3cywgZiwgb3B0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldENoYWluKERlcGVuZGVuY3lDaGFpbiBkZXBDaGFpbiwgSUxleGVyIGxleGVyLCBFeGNlbFJhbmdlQmFzZSBSYW5nZSwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBSYW5nZS5Xb3Jrc2hlZXQ7CisgICAgICAgICAgICB2YXIgZnMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pih3cy5fZm9ybXVsYXMsIFJhbmdlLlN0YXJ0LlJvdywgUmFuZ2UuU3RhcnQuQ29sdW1uLCBSYW5nZS5FbmQuUm93LCBSYW5nZS5FbmQuQ29sdW1uKTsKKyAgICAgICAgICAgIHdoaWxlIChmcy5OZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZzLlZhbHVlID09IG51bGwgfHwgZnMuVmFsdWUuVG9TdHJpbmcoKS5UcmltKCkgPT0gIiIpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHZhciBpZCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKHdzLlNoZWV0SUQsIGZzLlJvdywgZnMuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlcENoYWluLmluZGV4LkNvbnRhaW5zS2V5KGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBmID0gbmV3IEZvcm11bGFDZWxsKCkgeyBTaGVldElEID0gd3MuU2hlZXRJRCwgUm93ID0gZnMuUm93LCBDb2x1bW4gPSBmcy5Db2x1bW4gfTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZzLlZhbHVlIGlzIGludCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gd3MuX3NoYXJlZEZvcm11bGFzWyhpbnQpZnMuVmFsdWVdLkdldEZvcm11bGEoZnMuUm93LCBmcy5Db2x1bW4sIHdzLk5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gZnMuVmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGYuRm9ybXVsYSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYuVG9rZW5zID0gbGV4ZXIuVG9rZW5pemUoZi5Gb3JtdWxhLCBSYW5nZS5Xb3Jrc2hlZXQuTmFtZSkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5fZm9ybXVsYVRva2Vucy5TZXRWYWx1ZShmcy5Sb3csIGZzLkNvbHVtbiwgZi5Ub2tlbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVwQ2hhaW4uQWRkKGYpOworICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93Q2hhaW4oZGVwQ2hhaW4sIGxleGVyLCB3cy5Xb3JrYm9vaywgd3MsIGYsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGZvbGxvd3MgdGhlIGNhbGN1bGF0aW9uIGNoYWluIHRvIGdldCB0aGUgb3JkZXIgb2YgdGhlIGNhbGN1bGF0aW9uCisgICAgICAgIC8vLyBHb3RvICghKSBpcyB1c2VkIGludGVybmFsbHkgdG8gcHJldmVudCBzdGFja292ZXJmbG93IG9uIGV4dHJlbWx5IGxhcmdldCBkZXBlbmRlbmN5IHRyZWVzICh0aGF0IGlzLCBtYW55IHJlY3Vyc2l2ZSBmb3JtdWxhcykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVwQ2hhaW4iPlRoZSBkZXBlbmRlbmN5IGNoYWluIG9iamVjdDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV4ZXIiPlRoZSBmb3JtdWxhIHRva2VuaXplcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id2IiPlRoZSB3b3JrYm9vayB3aGVyZSB0aGUgZm9ybXVsYSBjb21lcyBmcm9tPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3cyI+VGhlIHdvcmtzaGVldCB3aGVyZSB0aGUgZm9ybXVsYSBjb21lcyBmcm9tPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmIj5UaGUgY2VsbCBmdW5jdGlvbiBvYmplY3Q8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9wdGlvbnMiPkNhbGN1bHRhaXRvbiBvcHRpb25zPC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGb2xsb3dDaGFpbihEZXBlbmRlbmN5Q2hhaW4gZGVwQ2hhaW4sIElMZXhlciBsZXhlciwgRXhjZWxXb3JrYm9vayB3YiwgRXhjZWxXb3Jrc2hlZXQgd3MsIEZvcm11bGFDZWxsIGYsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgU3RhY2s8Rm9ybXVsYUNlbGw+IHN0YWNrID0gbmV3IFN0YWNrPEZvcm11bGFDZWxsPigpOworICAgICAgICBpdGVyYXRlVG9rZW46CisgICAgICAgICAgICB3aGlsZSAoZi50b2tlbkl4IDwgZi5Ub2tlbnMuQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBmLlRva2Vuc1tmLnRva2VuSXhdOworICAgICAgICAgICAgICAgIGlmICh0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFkciA9IG5ldyBFeGNlbEZvcm11bGFBZGRyZXNzKHQuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWRyLlRhYmxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkci5TZXRSQ0Zyb21UYWJsZSh3cy5fcGFja2FnZSwgbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZi5Sb3csIGYuQ29sdW1uLCBmLlJvdywgZi5Db2x1bW4pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChhZHIuV29ya1NoZWV0ID09IG51bGwgJiYgYWRyLkNvbGxpZGUobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZi5Sb3csIGYuQ29sdW1uLCBmLlJvdywgZi5Db2x1bW4pKSE9RXhjZWxBZGRyZXNzQmFzZS5lQWRkcmVzc0NvbGxpdGlvbi5ObykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJDaXJjdWxhciBSZWZlcmVuY2UgaW4gY2VsbCB7MH0iLCBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoZi5Sb3csIGYuQ29sdW1uKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChhZHIuX2Zyb21Sb3cgPiAwICYmIGFkci5fZnJvbUNvbCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHIuV29ya1NoZWV0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi53cyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cyA9IHdzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmLndzLlNoZWV0SUQgIT0gZi5TaGVldElEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cyA9IHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElEKGYuU2hlZXRJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3MgPSB3Yi5Xb3Jrc2hlZXRzW2Fkci5Xb3JrU2hlZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi53cyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaXRlcmF0b3IgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihmLndzLl9mb3JtdWxhcywgYWRyLlN0YXJ0LlJvdywgYWRyLlN0YXJ0LkNvbHVtbiwgYWRyLkVuZC5Sb3csIGFkci5FbmQuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmFtZVZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFkcldiLCBhZHJXcywgYWRyTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxOYW1lZFJhbmdlIG5hbWU7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UuU3BsaXRBZGRyZXNzKHQuVmFsdWUsIG91dCBhZHJXYiwgb3V0IGFkcldzLCBvdXQgYWRyTmFtZSwgZi53cz09bnVsbCA/ICIiIDogZi53cy5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHJXcykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLndzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cyA9IHdiLldvcmtzaGVldHNbYWRyV3NdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZi53cy5OYW1lcy5Db250YWluc0tleSh0LlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZi53cy5OYW1lc1thZHJOYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdiLk5hbWVzLkNvbnRhaW5zS2V5KGFkck5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB3Yi5OYW1lc1thZHJOYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5hbWUgIT0gbnVsbCkgZi53cyA9IG5hbWUuV29ya3NoZWV0OyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdiLk5hbWVzLkNvbnRhaW5zS2V5KGFkck5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gd2IuTmFtZXNbdC5WYWx1ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRyV3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3MgPSBuYW1lLldvcmtzaGVldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5OYW1lVmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaXRlcmF0b3IgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihmLndzLl9mb3JtdWxhcywgbmFtZS5TdGFydC5Sb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLlN0YXJ0LkNvbHVtbiwgbmFtZS5FbmQuUm93LCBuYW1lLkVuZC5Db2x1bW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gRXhjZWxBZGRyZXNzQmFzZS5HZXRDZWxsSUQobmFtZS5Mb2NhbFNoZWV0SWQsIG5hbWUuSW5kZXgsIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXBDaGFpbi5pbmRleC5Db250YWluc0tleShpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmYgPSBuZXcgRm9ybXVsYUNlbGwoKSB7IFNoZWV0SUQgPSBuYW1lLkxvY2FsU2hlZXRJZCwgUm93ID0gbmFtZS5JbmRleCwgQ29sdW1uID0gMCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZi5Gb3JtdWxhID0gbmFtZS5OYW1lRm9ybXVsYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYuVG9rZW5zID0gbmFtZS5Mb2NhbFNoZWV0SWQgPT0gLTEgPyBsZXhlci5Ub2tlbml6ZShyZi5Gb3JtdWxhKS5Ub0xpc3QoKSA6IGxleGVyLlRva2VuaXplKHJmLkZvcm11bGEsIHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElEKG5hbWUuTG9jYWxTaGVldElkKS5OYW1lKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcENoYWluLkFkZChyZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLlB1c2goZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSByZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpdGVyYXRlVG9rZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXIgaW4gc3RhY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Q2VsbElEKHBhci5TaGVldElELCBwYXIuUm93LCBwYXIuQ29sdW1uKSA9PSBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIG5hbWUgezB9IiwgbmFtZS5OYW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLnRva2VuSXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcENoYWluLkNhbGNPcmRlci5BZGQoZi5JbmRleCk7CisgICAgICAgICAgICBpZiAoc3RhY2suQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGYgPSBzdGFjay5Qb3AoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaXRlcmF0ZUNlbGxzOgorCisgICAgICAgICAgICB3aGlsZSAoZi5pdGVyYXRvciAhPSBudWxsICYmIGYuaXRlcmF0b3IuTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ID0gZi5pdGVyYXRvci5WYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IHYuVG9TdHJpbmcoKS5UcmltKCkgPT0gIiIpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHZhciBpZCA9IEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Q2VsbElEKGYud3MuU2hlZXRJRCwgZi5pdGVyYXRvci5Sb3csIGYuaXRlcmF0b3IuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlcENoYWluLmluZGV4LkNvbnRhaW5zS2V5KGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciByZiA9IG5ldyBGb3JtdWxhQ2VsbCgpIHsgU2hlZXRJRCA9IGYud3MuU2hlZXRJRCwgUm93ID0gZi5pdGVyYXRvci5Sb3csIENvbHVtbiA9IGYuaXRlcmF0b3IuQ29sdW1uIH07CisgICAgICAgICAgICAgICAgICAgIGlmIChmLml0ZXJhdG9yLlZhbHVlIGlzIGludCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmYuRm9ybXVsYSA9IGYud3MuX3NoYXJlZEZvcm11bGFzWyhpbnQpdl0uR2V0Rm9ybXVsYShmLml0ZXJhdG9yLlJvdywgZi5pdGVyYXRvci5Db2x1bW4sIHdzLk5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmYuRm9ybXVsYSA9IHYuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZi53cyA9IGYud3M7CisgICAgICAgICAgICAgICAgICAgIHJmLlRva2VucyA9IGxleGVyLlRva2VuaXplKHJmLkZvcm11bGEsIGYud3MuTmFtZSkuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHdzLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKHJmLlJvdywgcmYuQ29sdW1uLCByZi5Ub2tlbnMpOworICAgICAgICAgICAgICAgICAgICBkZXBDaGFpbi5BZGQocmYpOworICAgICAgICAgICAgICAgICAgICBzdGFjay5QdXNoKGYpOworICAgICAgICAgICAgICAgICAgICBmID0gcmY7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaXRlcmF0ZVRva2VuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFyIGluIHN0YWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeGNlbEFkZHJlc3NCYXNlLkdldENlbGxJRChwYXIud3MuU2hlZXRJRCwgcGFyLml0ZXJhdG9yLlJvdywgcGFyLml0ZXJhdG9yLkNvbHVtbikgPT0gaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5BbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIGNlbGwgezB9IXsxfSIsIHBhci53cy5OYW1lLCBFeGNlbEFkZHJlc3MuR2V0QWRkcmVzcyhmLlJvdywgZi5Db2x1bW4pKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHN0YWNrLlBvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpdGVyYXRlQ2VsbHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmLnRva2VuSXgrKzsKKyAgICAgICAgICAgIGdvdG8gaXRlcmF0ZVRva2VuOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9Gb3JtdWxhQ2VsbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRm9ybXVsYUNlbGwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5MjgyOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRm9ybXVsYUNlbGwuY3MKQEAgLTAsMCArMSw0MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCit7CisgICAgaW50ZXJuYWwgY2xhc3MgRm9ybXVsYUNlbGwKKyAgICB7CisgICAgICAgIGludGVybmFsIGludCBJbmRleCB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIGludCBTaGVldElEIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgaW50IFJvdyB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIGludCBDb2x1bW4geyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIExpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIGludCB0b2tlbkl4ID0gMDsKKyAgICAgICAgaW50ZXJuYWwgaW50IGFkZHJlc3NJeCA9IDA7CisgICAgICAgIGludGVybmFsIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gaXRlcmF0b3I7CisgICAgICAgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IHdzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3NTFhYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FcHBsdXNFeGNlbERhdGFQcm92aWRlci5jcwpAQCAtMCwwICsxLDUwMiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIHB1YmxpYyBjbGFzcyBFcHBsdXNFeGNlbERhdGFQcm92aWRlciA6IEV4Y2VsRGF0YVByb3ZpZGVyCisgICAgeworICAgICAgICBwdWJsaWMgY2xhc3MgUmFuZ2VJbmZvIDogSVJhbmdlSW5mbworICAgICAgICB7CisgICAgICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldCBfd3M7CisgICAgICAgICAgICBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+IF92YWx1ZXMgPSBudWxsOworICAgICAgICAgICAgaW50IF9mcm9tUm93LCBfdG9Sb3csIF9mcm9tQ29sLCBfdG9Db2w7CisgICAgICAgICAgICBpbnQgX2NlbGxDb3VudCA9IDA7CisgICAgICAgICAgICBFeGNlbEFkZHJlc3NCYXNlIF9hZGRyZXNzOworICAgICAgICAgICAgSUNlbGxJbmZvIF9jZWxsOworCisgICAgICAgICAgICBwdWJsaWMgUmFuZ2VJbmZvKEV4Y2VsV29ya3NoZWV0IHdzLCBpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93cyA9IHdzOworICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKKyAgICAgICAgICAgICAgICBfZnJvbUNvbCA9IGZyb21Db2w7CisgICAgICAgICAgICAgICAgX3RvUm93ID0gdG9Sb3c7CisgICAgICAgICAgICAgICAgX3RvQ29sID0gdG9Db2w7CisgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgICAgICAgICAgICBfYWRkcmVzcy5fd3MgPSB3cy5OYW1lOworICAgICAgICAgICAgICAgIF92YWx1ZXMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pih3cy5fdmFsdWVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgICAgICAgICAgICBfY2VsbCA9IG5ldyBDZWxsSW5mbyhfd3MsIF92YWx1ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IEdldE5DZWxscygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoX3RvUm93IC0gX2Zyb21Sb3cpICsgMSkgKiAoKF90b0NvbCAtIF9mcm9tQ29sKSArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0VtcHR5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2NlbGxDb3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfdmFsdWVzLk5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5SZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc011bHRpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2NlbGxDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3ZhbHVlcy5OZXh0KCkgJiYgX3ZhbHVlcy5OZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5SZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuUmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2NlbGxDb3VudCA+IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJQ2VsbEluZm8gQ3VycmVudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfY2VsbDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF93czsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL192YWx1ZXMgPSBudWxsOworICAgICAgICAgICAgICAgIC8vX3dzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvL19jZWxsID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2JqZWN0IFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvci5DdXJyZW50CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2VsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXMuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF92YWx1ZXMuSW5pdCgpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIE5leHRDZWxsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2VsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXMuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPElDZWxsSW5mbz4gR2V0RW51bWVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2UgQWRkcmVzcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfYWRkcmVzczsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb2JqZWN0IEdldFZhbHVlKGludCByb3csIGludCBjb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF93cy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgR2V0T2Zmc2V0KGludCByb3dPZmZzZXQsIGludCBjb2xPZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF92YWx1ZXMuUm93IDwgX2Zyb21Sb3cgfHwgX3ZhbHVlcy5Db2x1bW4gPCBfZnJvbUNvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfd3MuR2V0VmFsdWUoX2Zyb21Sb3cgKyByb3dPZmZzZXQsIF9mcm9tQ29sICsgY29sT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93cy5HZXRWYWx1ZShfdmFsdWVzLlJvdyArIHJvd09mZnNldCwgX3ZhbHVlcy5Db2x1bW4gKyBjb2xPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBDZWxsSW5mbyA6IElDZWxsSW5mbworICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBfd3M7CisgICAgICAgICAgICBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+IF92YWx1ZXM7CisgICAgICAgICAgICBpbnRlcm5hbCBDZWxsSW5mbyhFeGNlbFdvcmtzaGVldCB3cywgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dzID0gd3M7CisgICAgICAgICAgICAgICAgX3ZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfdmFsdWVzLkNlbGxBZGRyZXNzOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUm93CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZXMuUm93OyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZXMuQ29sdW1uOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfd3MuR2V0Rm9ybXVsYShfdmFsdWVzLlJvdywgX3ZhbHVlcy5Db2x1bW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfdmFsdWVzLlZhbHVlOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgVmFsdWVEb3VibGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoX3ZhbHVlcy5WYWx1ZSwgdHJ1ZSk7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgVmFsdWVEb3VibGVMb2dpY2FsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKF92YWx1ZXMuVmFsdWUsIGZhbHNlKTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgSXNIaWRkZW5Sb3cKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJvdz1fd3MuX3ZhbHVlcy5HZXRWYWx1ZShfdmFsdWVzLlJvdywgMCkgYXMgUm93SW50ZXJuYWw7CisgICAgICAgICAgICAgICAgICAgIGlmKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93LkhpZGRlbiB8fCByb3cuSGVpZ2h0PT0wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0V4Y2VsRXJyb3IKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5Jc0Vycm9yVmFsdWUoX3ZhbHVlcy5WYWx1ZSk7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElMaXN0PFRva2VuPiBUb2tlbnMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dzLl9mb3JtdWxhVG9rZW5zLkdldFZhbHVlKF92YWx1ZXMuUm93LCBfdmFsdWVzLkNvbHVtbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGNsYXNzIE5hbWVJbmZvIDogRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB1bG9uZyBJZCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBJTGlzdDxUb2tlbj4gVG9rZW5zIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgVmFsdWUgeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX2N1cnJlbnRXb3Jrc2hlZXQ7CisgICAgICAgIHByaXZhdGUgUmFuZ2VBZGRyZXNzRmFjdG9yeSBfcmFuZ2VBZGRyZXNzRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHVsb25nLCBJTmFtZUluZm8+IF9uYW1lcz1uZXcgRGljdGlvbmFyeTx1bG9uZyxJTmFtZUluZm8+KCk7CisKKyAgICAgICAgcHVibGljIEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IHBhY2thZ2U7CisKKyAgICAgICAgICAgIF9yYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3Jrc2hlZXROYW1lcyhzdHJpbmcgd29ya3NoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3M9X3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXRdOworICAgICAgICAgICAgaWYgKHdzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdzLk5hbWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9wYWNrYWdlLldvcmtib29rLk5hbWVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElSYW5nZUluZm8gR2V0UmFuZ2Uoc3RyaW5nIHdvcmtzaGVldCwgaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldCh3b3Jrc2hlZXQpOworICAgICAgICAgICAgdmFyIHdzTmFtZSA9IHN0cmluZy5Jc051bGxPckVtcHR5KHdvcmtzaGVldCkgPyBfY3VycmVudFdvcmtzaGVldC5OYW1lIDogd29ya3NoZWV0OworICAgICAgICAgICAgdmFyIHdzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3c05hbWVdOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZUluZm8od3MsIGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b0NvbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElSYW5nZUluZm8gR2V0UmFuZ2Uoc3RyaW5nIHdvcmtzaGVldCwgaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcyh3b3Jrc2hlZXQsIGFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGFkZHIuVGFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyLlNldFJDRnJvbVRhYmxlKF9wYWNrYWdlLCBuZXcgRXhjZWxBZGRyZXNzQmFzZShyb3csIGNvbHVtbiwgcm93LCBjb2x1bW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU2V0Q3VycmVudFdvcmtzaGVldChhZGRyLldvcmtTaGVldCk7IAorICAgICAgICAgICAgdmFyIHdzTmFtZSA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFkZHIuV29ya1NoZWV0KSA/IF9jdXJyZW50V29ya3NoZWV0Lk5hbWUgOiBhZGRyLldvcmtTaGVldDsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd3NOYW1lXTsKKyAgICAgICAgICAgIC8vcmV0dXJuIG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KHdzLl92YWx1ZXMsIGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl90b0NvbCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlSW5mbyh3cywgYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSU5hbWVJbmZvIEdldE5hbWUoc3RyaW5nIHdvcmtzaGVldCwgc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsTmFtZWRSYW5nZSBuYW1lSXRlbTsKKyAgICAgICAgICAgIHVsb25nIGlkOyAgICAgICAgICAgIAorICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3M7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkod29ya3NoZWV0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihfcGFja2FnZS5fd29ya2Jvb2suTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYW1lSXRlbSA9IF9wYWNrYWdlLl93b3JrYm9vay5OYW1lc1tuYW1lXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cyA9IF9wYWNrYWdlLl93b3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldF07CisgICAgICAgICAgICAgICAgaWYgKHdzICE9bnVsbCAmJiB3cy5OYW1lcy5Db250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVJdGVtID0gd3MuTmFtZXNbbmFtZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9wYWNrYWdlLl93b3JrYm9vay5OYW1lcy5Db250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVJdGVtID0gX3BhY2thZ2UuX3dvcmtib29rLk5hbWVzW25hbWVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZCA9IEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Q2VsbElEKG5hbWVJdGVtLkxvY2FsU2hlZXRJZCwgbmFtZUl0ZW0uSW5kZXgsIDApOworCisgICAgICAgICAgICBpZiAoX25hbWVzLkNvbnRhaW5zS2V5KGlkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX25hbWVzW2lkXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmkgPSBuZXcgTmFtZUluZm8oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSWQgPSBpZCwKKyAgICAgICAgICAgICAgICAgICAgTmFtZSA9IG5hbWUsCisgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldCA9IG5hbWVJdGVtLldvcmtzaGVldD09bnVsbCA/IG5hbWVJdGVtLl93cyA6IG5hbWVJdGVtLldvcmtzaGVldC5OYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgRm9ybXVsYSA9IG5hbWVJdGVtLkZvcm11bGEKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGlmIChuYW1lSXRlbS5fZnJvbVJvdyA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuaS5WYWx1ZSA9IG5ldyBSYW5nZUluZm8obmFtZUl0ZW0uV29ya3NoZWV0ID8/IHdzLCBuYW1lSXRlbS5fZnJvbVJvdywgbmFtZUl0ZW0uX2Zyb21Db2wsIG5hbWVJdGVtLl90b1JvdywgbmFtZUl0ZW0uX3RvQ29sKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmkuVmFsdWUgPSBuYW1lSXRlbS5WYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX25hbWVzLkFkZChpZCwgbmkpOworICAgICAgICAgICAgICAgIHJldHVybiBuaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUVudW1lcmFibGU8b2JqZWN0PiBHZXRSYW5nZVZhbHVlcyhzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldChFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKGFkZHJlc3MpKTsKKyAgICAgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgICAgIHZhciB3c05hbWUgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhZGRyLldvcmtTaGVldCkgPyBfY3VycmVudFdvcmtzaGVldC5OYW1lIDogYWRkci5Xb3JrU2hlZXQ7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dzTmFtZV07CisgICAgICAgICAgICByZXR1cm4gKG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KHdzLl92YWx1ZXMsIGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl90b0NvbCkpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb2JqZWN0IEdldFZhbHVlKGludCByb3csIGludCBjb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfY3VycmVudFdvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sdW1uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzTWVyZ2VkKGludCByb3csIGludCBjb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Ll9mbGFncy5HZXRGbGFnVmFsdWUocm93LCBjb2x1bW4sIENlbGxGbGFncy5NZXJnZWQpOworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Lk1lcmdlZENlbGxzW3JvdywgY29sdW1uXSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNIaWRkZW4oaW50IHJvdywgaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0LkNvbHVtbihjb2x1bW4pLkhpZGRlbiB8fCBfY3VycmVudFdvcmtzaGVldC5Db2x1bW4oY29sdW1uKS5XaWR0aCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQuUm93KHJvdykuSGlkZGVuIHx8IF9jdXJyZW50V29ya3NoZWV0LlJvdyhjb2x1bW4pLkhlaWdodCA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBHZXRDZWxsVmFsdWUoc3RyaW5nIHNoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldChzaGVldE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4Y2VsQ2VsbEFkZHJlc3MgR2V0RGltZW5zaW9uRW5kKHN0cmluZyB3b3Jrc2hlZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsQ2VsbEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXRdLkRpbWVuc2lvbi5FbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaHt9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRXb3Jrc2hlZXQoRXhjZWxBZGRyZXNzSW5mbyBhZGRyZXNzSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFkZHJlc3NJbmZvLldvcmtzaGVldElzU3BlY2lmaWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1thZGRyZXNzSW5mby5Xb3Jrc2hlZXRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2N1cnJlbnRXb3Jrc2hlZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY3VycmVudFdvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXRDdXJyZW50V29ya3NoZWV0KHN0cmluZyB3b3Jrc2hlZXROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHdvcmtzaGVldE5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXTsgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvL3B1YmxpYyBvdmVycmlkZSB2b2lkIFNldENlbGxWYWx1ZShzdHJpbmcgYWRkcmVzcywgb2JqZWN0IHZhbHVlKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdmFyIGFkZHJlc3NJbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZShhZGRyZXNzKTsKKyAgICAgICAgLy8gICAgdmFyIHJhID0gX3JhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGFkZHJlc3MpOworICAgICAgICAvLyAgICBTZXRDdXJyZW50V29ya3NoZWV0KGFkZHJlc3NJbmZvKTsKKyAgICAgICAgLy8gICAgLy92YXIgdmFsdWVJbmZvID0gKElDYWxjRW5naW5lVmFsdWVJbmZvKV9jdXJyZW50V29ya3NoZWV0OworICAgICAgICAvLyAgICAvL3ZhbHVlSW5mby5TZXRGb3JtdWxhVmFsdWUocmEuRnJvbVJvdyArIDEsIHJhLkZyb21Db2wgKyAxLCB2YWx1ZSk7CisgICAgICAgIC8vICAgIF9jdXJyZW50V29ya3NoZWV0LkNlbGxzW3JhLkZyb21Sb3cgKyAxLCByYS5Gcm9tQ29sICsgMV0uVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgLy99CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgRXhjZWxNYXhDb2x1bW5zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1uczsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBFeGNlbE1heFJvd3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEV4Y2VsUGFja2FnZS5NYXhSb3dzOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdldFJhbmdlRm9ybXVsYShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldCh3b3Jrc2hlZXROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBfY3VycmVudFdvcmtzaGVldC5HZXRGb3JtdWxhKHJvdywgY29sdW1uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgR2V0UmFuZ2VWYWx1ZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldCh3b3Jrc2hlZXROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBfY3VycmVudFdvcmtzaGVldC5HZXRWYWx1ZShyb3csIGNvbHVtbik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBHZXRGb3JtYXQob2JqZWN0IHZhbHVlLCBzdHJpbmcgZm9ybWF0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3R5bGVzID0gX3BhY2thZ2UuV29ya2Jvb2suU3R5bGVzOworICAgICAgICAgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwuRXhjZWxGb3JtYXRUcmFuc2xhdG9yIGZ0PW51bGw7CisgICAgICAgICAgICBmb3JlYWNoKHZhciBmIGluIHN0eWxlcy5OdW1iZXJGb3JtYXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGYuRm9ybWF0PT1mb3JtYXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmdD1mLkZvcm1hdFRyYW5zbGF0b3I7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGZ0PT1udWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ0PW5ldyBFeGNlbE51bWJlckZvcm1hdFhtbC5FeGNlbEZvcm1hdFRyYW5zbGF0b3IoZm9ybWF0LCAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRXhjZWxSYW5nZUJhc2UuRm9ybWF0VmFsdWUodmFsdWUsIGZ0LGZvcm1hdCwgZnQuTmV0Rm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgTGlzdDxMZXhpY2FsQW5hbHlzaXMuVG9rZW4+IEdldFJhbmdlRm9ybXVsYVRva2VucyhzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd29ya3NoZWV0TmFtZV0uX2Zvcm11bGFUb2tlbnMuR2V0VmFsdWUocm93LCBjb2x1bW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNSb3dIaWRkZW4oc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXS5Sb3cocm93KS5IZWlnaHQgPT0gMCB8fCAKKyAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXS5Sb3cocm93KS5IaWRkZW47CisKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBfbmFtZXMgPSBuZXcgRGljdGlvbmFyeTx1bG9uZywgSU5hbWVJbmZvPigpOyAvL1Jlc2V0IG5hbWUgY2FjaGUuICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLmNzLm9yaWcgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuY3Mub3JpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc5NzYyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLmNzLm9yaWcKQEAgLTAsMCArMSw0NjIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIgOiBFeGNlbERhdGFQcm92aWRlcgorICAgIHsKKyAgICAgICAgcHVibGljIGNsYXNzIFJhbmdlSW5mbyA6IElSYW5nZUluZm8KKyAgICAgICAgeworICAgICAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXQgX3dzOworICAgICAgICAgICAgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiBfdmFsdWVzID0gbnVsbDsKKyAgICAgICAgICAgIGludCBfZnJvbVJvdywgX3RvUm93LCBfZnJvbUNvbCwgX3RvQ29sOworICAgICAgICAgICAgaW50IF9jZWxsQ291bnQgPSAwOworICAgICAgICAgICAgRXhjZWxBZGRyZXNzQmFzZSBfYWRkcmVzczsKKyAgICAgICAgICAgIElDZWxsSW5mbyBfY2VsbDsKKworICAgICAgICAgICAgcHVibGljIFJhbmdlSW5mbyhFeGNlbFdvcmtzaGVldCB3cywgaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfd3MgPSB3czsKKyAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IGZyb21Sb3c7CisgICAgICAgICAgICAgICAgX2Zyb21Db2wgPSBmcm9tQ29sOworICAgICAgICAgICAgICAgIF90b1JvdyA9IHRvUm93OworICAgICAgICAgICAgICAgIF90b0NvbCA9IHRvQ29sOworICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7CisgICAgICAgICAgICAgICAgX3ZhbHVlcyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KHdzLl92YWx1ZXMsIF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOworICAgICAgICAgICAgICAgIF9jZWxsID0gbmV3IENlbGxJbmZvKF93cywgX3ZhbHVlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgR2V0TkNlbGxzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChfdG9Sb3cgLSBfZnJvbVJvdykgKyAxKSAqICgoX3RvQ29sIC0gX2Zyb21Db2wpICsgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzRW1wdHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY2VsbENvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF92YWx1ZXMuTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzTXVsdGkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY2VsbENvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLk5leHQoKSAmJiBfdmFsdWVzLk5leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5SZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfY2VsbENvdW50ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElDZWxsSW5mbyBDdXJyZW50CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jZWxsOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vX3ZhbHVlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgLy9fd3MgPSBudWxsOworICAgICAgICAgICAgICAgIC8vX2NlbGwgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvYmplY3QgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yLkN1cnJlbnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jZWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlcy5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF92YWx1ZXMuSW5pdCgpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIE5leHRDZWxsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2VsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXMuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPElDZWxsSW5mbz4gR2V0RW51bWVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSBBZGRyZXNzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9hZGRyZXNzOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgR2V0VmFsdWUoaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBHZXRPZmZzZXQoaW50IHJvd09mZnNldCwgaW50IGNvbE9mZnNldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ZhbHVlcy5Sb3cgPCBfZnJvbVJvdyB8fCBfdmFsdWVzLkNvbHVtbiA8IF9mcm9tQ29sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93cy5HZXRWYWx1ZShfZnJvbUNvbCArIHJvd09mZnNldCwgX2Zyb21Db2wgKyBjb2xPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dzLkdldFZhbHVlKF92YWx1ZXMuUm93ICsgcm93T2Zmc2V0LCBfdmFsdWVzLkNvbHVtbiArIGNvbE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBjbGFzcyBDZWxsSW5mbyA6IElDZWxsSW5mbworICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBfd3M7CisgICAgICAgICAgICBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+IF92YWx1ZXM7CisgICAgICAgICAgICBpbnRlcm5hbCBDZWxsSW5mbyhFeGNlbFdvcmtzaGVldCB3cywgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dzID0gd3M7CisgICAgICAgICAgICAgICAgX3ZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfdmFsdWVzLkNlbGxBZGRyZXNzOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUm93CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZXMuUm93OyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZXMuQ29sdW1uOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfd3MuR2V0Rm9ybXVsYShfdmFsdWVzLlJvdywgX3ZhbHVlcy5Db2x1bW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfdmFsdWVzLlZhbHVlOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgVmFsdWVEb3VibGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoX3ZhbHVlcy5WYWx1ZSwgdHJ1ZSk7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgVmFsdWVEb3VibGVMb2dpY2FsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKF92YWx1ZXMuVmFsdWUsIGZhbHNlKTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgSXNIaWRkZW5Sb3cKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJvdz1fd3MuX3ZhbHVlcy5HZXRWYWx1ZShfdmFsdWVzLlJvdywgMCkgYXMgUm93SW50ZXJuYWw7CisgICAgICAgICAgICAgICAgICAgIGlmKHJvdyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93LkhpZGRlbiB8fCByb3cuSGVpZ2h0PT0wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0V4Y2VsRXJyb3IKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5Jc0Vycm9yVmFsdWUoX3ZhbHVlcy5WYWx1ZSk7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElMaXN0PFRva2VuPiBUb2tlbnMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dzLl9mb3JtdWxhVG9rZW5zLkdldFZhbHVlKF92YWx1ZXMuUm93LCBfdmFsdWVzLkNvbHVtbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGNsYXNzIE5hbWVJbmZvIDogRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB1bG9uZyBJZCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBJTGlzdDxUb2tlbj4gVG9rZW5zIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgVmFsdWUgeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX2N1cnJlbnRXb3Jrc2hlZXQ7CisgICAgICAgIHByaXZhdGUgUmFuZ2VBZGRyZXNzRmFjdG9yeSBfcmFuZ2VBZGRyZXNzRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHVsb25nLCBJTmFtZUluZm8+IF9uYW1lcz1uZXcgRGljdGlvbmFyeTx1bG9uZyxJTmFtZUluZm8+KCk7CisKKyAgICAgICAgcHVibGljIEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IHBhY2thZ2U7CisKKyAgICAgICAgICAgIF9yYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3Jrc2hlZXROYW1lcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuTmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3JrYm9va05hbWVWYWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3BhY2thZ2UuV29ya2Jvb2suTmFtZXM7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElSYW5nZUluZm8gR2V0UmFuZ2Uoc3RyaW5nIHdvcmtzaGVldCwgaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcyh3b3Jrc2hlZXQsIGFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGFkZHIuVGFibGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyLlNldFJDRnJvbVRhYmxlKF9wYWNrYWdlLCBuZXcgRXhjZWxBZGRyZXNzQmFzZShyb3csIGNvbHVtbiwgcm93LCBjb2x1bW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU2V0Q3VycmVudFdvcmtzaGVldChhZGRyLldvcmtTaGVldCk7IAorICAgICAgICAgICAgdmFyIHdzTmFtZSA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFkZHIuV29ya1NoZWV0KSA/IF9jdXJyZW50V29ya3NoZWV0Lk5hbWUgOiBhZGRyLldvcmtTaGVldDsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd3NOYW1lXTsKKyAgICAgICAgICAgIC8vcmV0dXJuIG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KHdzLl92YWx1ZXMsIGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl90b0NvbCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlSW5mbyh3cywgYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSU5hbWVJbmZvIEdldE5hbWUoc3RyaW5nIHdvcmtzaGVldCwgc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsTmFtZWRSYW5nZSBuYW1lSXRlbTsKKyAgICAgICAgICAgIHVsb25nIGlkOyAgICAgICAgICAgIAorICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3M7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkod29ya3NoZWV0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihfcGFja2FnZS5fd29ya2Jvb2suTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYW1lSXRlbSA9IF9wYWNrYWdlLl93b3JrYm9vay5OYW1lc1tuYW1lXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cyA9IF9wYWNrYWdlLl93b3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldF07CisgICAgICAgICAgICAgICAgaWYgKHdzICE9bnVsbCAmJiB3cy5OYW1lcy5Db250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVJdGVtID0gX3BhY2thZ2UuX3dvcmtib29rLk5hbWVzW25hbWVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfcGFja2FnZS5fd29ya2Jvb2suTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYW1lSXRlbSA9IF9wYWNrYWdlLl93b3JrYm9vay5OYW1lc1tuYW1lXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWQgPSBFeGNlbEFkZHJlc3NCYXNlLkdldENlbGxJRChuYW1lSXRlbS5Mb2NhbFNoZWV0SWQsIG5hbWVJdGVtLkluZGV4LCAwKTsKKworICAgICAgICAgICAgaWYgKF9uYW1lcy5Db250YWluc0tleShpZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lc1tpZF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5pID0gbmV3IE5hbWVJbmZvKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElkID0gaWQsCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSBuYW1lLAorICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXQgPSBuYW1lSXRlbS5Xb3Jrc2hlZXQ9PW51bGwgPyBuYW1lSXRlbS5fd3MgOiBuYW1lSXRlbS5Xb3Jrc2hlZXQuTmFtZSwgCisgICAgICAgICAgICAgICAgICAgIEZvcm11bGEgPSBuYW1lSXRlbS5Gb3JtdWxhCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZUl0ZW0uX2Zyb21Sb3cgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmkuVmFsdWUgPSBuZXcgUmFuZ2VJbmZvKG5hbWVJdGVtLldvcmtzaGVldCA/PyB3cywgbmFtZUl0ZW0uX2Zyb21Sb3csIG5hbWVJdGVtLl9mcm9tQ29sLCBuYW1lSXRlbS5fdG9Sb3csIG5hbWVJdGVtLl90b0NvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5pLlZhbHVlID0gbmFtZUl0ZW0uVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9uYW1lcy5BZGQoaWQsIG5pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElFbnVtZXJhYmxlPG9iamVjdD4gR2V0UmFuZ2VWYWx1ZXMoc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldEN1cnJlbnRXb3Jrc2hlZXQoRXhjZWxBZGRyZXNzSW5mby5QYXJzZShhZGRyZXNzKSk7CisgICAgICAgICAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgICAgICB2YXIgd3NOYW1lID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRkci5Xb3JrU2hlZXQpID8gX2N1cnJlbnRXb3Jrc2hlZXQuTmFtZSA6IGFkZHIuV29ya1NoZWV0OworICAgICAgICAgICAgdmFyIHdzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3c05hbWVdOworICAgICAgICAgICAgcmV0dXJuIChuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pih3cy5fdmFsdWVzLCBhZGRyLl9mcm9tUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl90b1JvdywgYWRkci5fdG9Db2wpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG9iamVjdCBHZXRWYWx1ZShpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbHVtbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc01lcmdlZChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShyb3csIGNvbHVtbiwgQ2VsbEZsYWdzLk1lcmdlZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc0hpZGRlbihpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuQ29sdW1uKGNvbHVtbikuSGlkZGVuIHx8IF9jdXJyZW50V29ya3NoZWV0LkNvbHVtbihjb2x1bW4pLldpZHRoID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICBfY3VycmVudFdvcmtzaGVldC5Sb3cocm93KS5IaWRkZW4gfHwgX2N1cnJlbnRXb3Jrc2hlZXQuUm93KGNvbHVtbikuSGVpZ2h0ID09IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldENlbGxWYWx1ZShzdHJpbmcgc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRDdXJyZW50V29ya3NoZWV0KHNoZWV0TmFtZSk7CisgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0Q3VycmVudFdvcmtzaGVldChFeGNlbEFkZHJlc3NJbmZvIGFkZHJlc3NJbmZvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWRkcmVzc0luZm8uV29ya3NoZWV0SXNTcGVjaWZpZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW2FkZHJlc3NJbmZvLldvcmtzaGVldF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfY3VycmVudFdvcmtzaGVldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRXb3Jrc2hlZXQoc3RyaW5nIHdvcmtzaGVldE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkod29ya3NoZWV0TmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldE5hbWVdOyAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY3VycmVudFdvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0Q2VsbFZhbHVlKHN0cmluZyBhZGRyZXNzLCBvYmplY3QgdmFsdWUpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB2YXIgYWRkcmVzc0luZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKGFkZHJlc3MpOworICAgICAgICAvLyAgICB2YXIgcmEgPSBfcmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoYWRkcmVzcyk7CisgICAgICAgIC8vICAgIFNldEN1cnJlbnRXb3Jrc2hlZXQoYWRkcmVzc0luZm8pOworICAgICAgICAvLyAgICAvL3ZhciB2YWx1ZUluZm8gPSAoSUNhbGNFbmdpbmVWYWx1ZUluZm8pX2N1cnJlbnRXb3Jrc2hlZXQ7CisgICAgICAgIC8vICAgIC8vdmFsdWVJbmZvLlNldEZvcm11bGFWYWx1ZShyYS5Gcm9tUm93ICsgMSwgcmEuRnJvbUNvbCArIDEsIHZhbHVlKTsKKyAgICAgICAgLy8gICAgX2N1cnJlbnRXb3Jrc2hlZXQuQ2VsbHNbcmEuRnJvbVJvdyArIDEsIHJhLkZyb21Db2wgKyAxXS5WYWx1ZSA9IHZhbHVlOworICAgICAgICAvL30KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBFeGNlbE1heENvbHVtbnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEV4Y2VsTWF4Um93cworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gRXhjZWxQYWNrYWdlLk1heFJvd3M7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0UmFuZ2VGb3JtdWxhKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRDdXJyZW50V29ya3NoZWV0KHdvcmtzaGVldE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0LkdldEZvcm11bGEocm93LCBjb2x1bW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBHZXRSYW5nZVZhbHVlKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRDdXJyZW50V29ya3NoZWV0KHdvcmtzaGVldE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0LkdldFZhbHVlKHJvdywgY29sdW1uKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdldEZvcm1hdChvYmplY3QgdmFsdWUsIHN0cmluZyBmb3JtYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHlsZXMgPSBfcGFja2FnZS5Xb3JrYm9vay5TdHlsZXM7CisgICAgICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbC5FeGNlbEZvcm1hdFRyYW5zbGF0b3IgZnQ9bnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2godmFyIGYgaW4gc3R5bGVzLk51bWJlckZvcm1hdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoZi5Gb3JtYXQ9PWZvcm1hdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZ0PWYuRm9ybWF0VHJhbnNsYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoZnQ9PW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnQ9bmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkV4Y2VsRm9ybWF0VHJhbnNsYXRvcihmb3JtYXQsIC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBFeGNlbFJhbmdlQmFzZS5Gb3JtYXRWYWx1ZSh2YWx1ZSwgZnQsZm9ybWF0LCBmdC5OZXRGb3JtYXQpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBMaXN0PExleGljYWxBbmFseXNpcy5Ub2tlbj4gR2V0UmFuZ2VGb3JtdWxhVG9rZW5zKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXS5fZm9ybXVsYVRva2Vucy5HZXRWYWx1ZShyb3csIGNvbHVtbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc1Jvd0hpZGRlbihzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGIgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldE5hbWVdLlJvdyhyb3cpLkhlaWdodCA9PSAwIHx8IAorICAgICAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldE5hbWVdLlJvdyhyb3cpLkhpZGRlbjsKKworICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgIH0KKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c05hbWVWYWx1ZVByb3ZpZGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c05hbWVWYWx1ZVByb3ZpZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDc5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIgOiBJTmFtZVZhbHVlUHJvdmlkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworICAgICAgICBwcml2YXRlIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gX3ZhbHVlczsKKworICAgICAgICBwdWJsaWMgRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgICAgICAgICAgX3ZhbHVlcyA9IF9leGNlbERhdGFQcm92aWRlci5HZXRXb3JrYm9va05hbWVWYWx1ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNOYW1lZFZhbHVlKHN0cmluZyBrZXksIHN0cmluZyB3cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYod3MhPW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzTmFtZXMgPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0V29ya3NoZWV0TmFtZXMod3MpOworICAgICAgICAgICAgICAgIGlmKHdzTmFtZXMhPW51bGwgJiYgd3NOYW1lcy5Db250YWluc0tleShrZXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXMgIT0gbnVsbCAmJiBfdmFsdWVzLkNvbnRhaW5zS2V5KGtleSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0TmFtZWRWYWx1ZShzdHJpbmcga2V5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3ZhbHVlc1trZXldOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWxvYWQoKQorICAgICAgICB7CisgICAgICAgICAgICBfdmFsdWVzID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFdvcmtib29rTmFtZVZhbHVlcygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0V4Y2VsQ2VsbFN0YXRlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0V4Y2VsQ2VsbFN0YXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjU1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRXhjZWxDZWxsU3RhdGUuY3MKQEAgLTAsMCArMSw0NSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwKK3sKKyAgICBbRmxhZ3NdCisgICAgcHVibGljIGVudW0gRXhjZWxDZWxsU3RhdGUKKyAgICB7CisgICAgICAgIEhpZGRlbkNlbGwgPSAxLAorICAgICAgICBDb250YWluc0Vycm9yID0gMiwKKyAgICAgICAgSXNSZXN1bHRPZlN1YnRvdGFsID0gNAorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRDb2xsZWN0aW9uVXRpbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRDb2xsZWN0aW9uVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc1ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudENvbGxlY3Rpb25VdGlsLmNzCkBAIC0wLDAgKzEsODUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXJndW1lbnRDb2xsZWN0aW9uVXRpbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIF9kb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIgX29iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXI7CisKKyAgICAgICAgcHVibGljIEFyZ3VtZW50Q29sbGVjdGlvblV0aWwoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyKCksIG5ldyBPYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFyZ3VtZW50Q29sbGVjdGlvblV0aWwoCisgICAgICAgICAgICBEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIGRvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIsIAorICAgICAgICAgICAgT2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlciBvYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyKQorICAgICAgICB7CisgICAgICAgICAgICBfZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciA9IGRvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXI7CisgICAgICAgICAgICBfb2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlciA9IG9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoYm9vbCBpZ25vcmVIaWRkZW4sIGJvb2wgaWdub3JlRXJyb3JzLCBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlci5Db252ZXJ0QXJncyhpZ25vcmVIaWRkZW4sIGlnbm9yZUVycm9ycywgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPG9iamVjdD4gQXJnc1RvT2JqZWN0RW51bWVyYWJsZShib29sIGlnbm9yZUhpZGRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfb2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlci5Db252ZXJ0QXJncyhpZ25vcmVIaWRkZW4sIGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBkb3VibGUgQ2FsY3VsYXRlQ29sbGVjdGlvbihJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBjb2xsZWN0aW9uLCBkb3VibGUgcmVzdWx0LCBGdW5jPEZ1bmN0aW9uQXJndW1lbnQsIGRvdWJsZSwgZG91YmxlPiBhY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNvbGxlY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0uVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBDYWxjdWxhdGVDb2xsZWN0aW9uKChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilpdGVtLlZhbHVlLCByZXN1bHQsIGFjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFjdGlvbihpdGVtLCByZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGFkOGIxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlci5jcwpAQCAtMCwwICsxLDM2IEBACivvu78gLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmd1bWVudFBhcnNlcgorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBQYXJzZShvYmplY3Qgb2JqKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzE3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyRmFjdG9yeS5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXJndW1lbnRQYXJzZXJGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBBcmd1bWVudFBhcnNlciBDcmVhdGVBcmd1bWVudFBhcnNlcihEYXRhVHlwZSBkYXRhVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkludGVnZXI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50QXJndW1lbnRQYXJzZXIoKTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkJvb2xlYW46CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbEFyZ3VtZW50UGFyc2VyKCk7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5EZWNpbWFsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZUFyZ3VtZW50UGFyc2VyKCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIm5vbiBzdXBwb3J0ZWQgYXJndW1lbnQgcGFyc2VyIHR5cGUgIiArIGRhdGFUeXBlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlcnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vycy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNhODM4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlcnMuY3MKQEAgLTAsMCArMSw2NyBAQAor77u/dXNpbmcgU3lzdGVtOworLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXJndW1lbnRQYXJzZXJzCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgX3N5bmNSb290ID0gbmV3IG9iamVjdCgpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8RGF0YVR5cGUsIEFyZ3VtZW50UGFyc2VyPiBfcGFyc2VycyA9IG5ldyBEaWN0aW9uYXJ5PERhdGFUeXBlLCBBcmd1bWVudFBhcnNlcj4oKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudFBhcnNlckZhY3RvcnkgX3BhcnNlckZhY3Rvcnk7CisKKyAgICAgICAgcHVibGljIEFyZ3VtZW50UGFyc2VycygpCisgICAgICAgICAgICA6IHRoaXMobmV3IEFyZ3VtZW50UGFyc2VyRmFjdG9yeSgpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBcmd1bWVudFBhcnNlcnMoQXJndW1lbnRQYXJzZXJGYWN0b3J5IGZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChmYWN0b3J5KS5OYW1lZCgiYXJndW1lbnRQYXJzZXJmYWN0b3J5IikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBfcGFyc2VyRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXJndW1lbnRQYXJzZXIgR2V0UGFyc2VyKERhdGFUeXBlIGRhdGFUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9wYXJzZXJzLkNvbnRhaW5zS2V5KGRhdGFUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NrIChfc3luY1Jvb3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIV9wYXJzZXJzLkNvbnRhaW5zS2V5KGRhdGFUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3BhcnNlcnMuQWRkKGRhdGFUeXBlLCBfcGFyc2VyRmFjdG9yeS5DcmVhdGVBcmd1bWVudFBhcnNlcihkYXRhVHlwZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9wYXJzZXJzW2RhdGFUeXBlXTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQm9vbEFyZ3VtZW50UGFyc2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Cb29sQXJndW1lbnRQYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlNmRhZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQm9vbEFyZ3VtZW50UGFyc2VyLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBCb29sQXJndW1lbnRQYXJzZXIgOiBBcmd1bWVudFBhcnNlcgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBQYXJzZShvYmplY3Qgb2JqKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob2JqIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pb2JqKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIG9iaiA9IChyID09IG51bGwgPyBudWxsIDogci5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChvYmogaXMgYm9vbCkgcmV0dXJuIChib29sKW9iajsKKyAgICAgICAgICAgIGlmIChvYmouSXNOdW1lcmljKCkpIHJldHVybiBDb252ZXJ0LlRvQm9vbGVhbihvYmopOworICAgICAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgICAgICBpZiAoYm9vbC5UcnlQYXJzZShvYmouVG9TdHJpbmcoKSwgb3V0IHJlc3VsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0J1aWx0SW5GdW5jdGlvbnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0J1aWx0SW5GdW5jdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzOWUxNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQnVpbHRJbkZ1bmN0aW9ucy5jcwpAQCAtMCwwICsxLDE5OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTnVtZXJpYzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQnVpbHRJbkZ1bmN0aW9ucyA6IEZ1bmN0aW9uc01vZHVsZQorICAgIHsKKyAgICAgICAgcHVibGljIEJ1aWx0SW5GdW5jdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUZXh0CisgICAgICAgICAgICBGdW5jdGlvbnNbImxlbiJdID0gbmV3IExlbigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJsb3dlciJdID0gbmV3IExvd2VyKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInVwcGVyIl0gPSBuZXcgVXBwZXIoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibGVmdCJdID0gbmV3IExlZnQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicmlnaHQiXSA9IG5ldyBSaWdodCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJtaWQiXSA9IG5ldyBNaWQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicmVwbGFjZSJdID0gbmV3IFJlcGxhY2UoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicmVwdCJdID0gbmV3IFJlcHQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sic3Vic3RpdHV0ZSJdID0gbmV3IFN1YnN0aXR1dGUoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siY29uY2F0ZW5hdGUiXSA9IG5ldyBDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjaGFyIl0gPSBuZXcgQ2hhckZ1bmN0aW9uKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImV4YWN0Il0gPSBuZXcgRXhhY3QoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZmluZCJdID0gbmV3IEZpbmQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZml4ZWQiXSA9IG5ldyBGaXhlZCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJwcm9wZXIiXSA9IG5ldyBQcm9wZXIoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sidGV4dCJdID0gbmV3IFRleHQuVGV4dCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ0Il0gPSBuZXcgVCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJoeXBlcmxpbmsiXSA9IG5ldyBIeXBlcmxpbmsoKTsKKyAgICAgICAgICAgIC8vIE51bWJlcnMKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siaW50Il0gPSBuZXcgQ0ludCgpOworICAgICAgICAgICAgLy8gTWF0aAorICAgICAgICAgICAgRnVuY3Rpb25zWyJhYnMiXSA9IG5ldyBBYnMoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siYXNpbiJdID0gbmV3IEFzaW4oKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siYXNpbmgiXSA9IG5ldyBBc2luaCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3MiXSA9IG5ldyBDb3MoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siY29zaCJdID0gbmV3IENvc2goKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicG93ZXIiXSA9IG5ldyBQb3dlcigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzaWduIl0gPSBuZXcgU2lnbigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzcXJ0Il0gPSBuZXcgU3FydCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzcXJ0cGkiXSA9IG5ldyBTcXJ0UGkoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicGkiXSA9IG5ldyBQaSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJwcm9kdWN0Il0gPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjZWlsaW5nIl0gPSBuZXcgQ2VpbGluZygpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudCJdID0gbmV3IENvdW50KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImNvdW50YSJdID0gbmV3IENvdW50QSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudGJsYW5rIl0gPSBuZXcgQ291bnRCbGFuaygpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudGlmIl0gPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudGlmcyJdID0gbmV3IENvdW50SWZzKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImZhY3QiXSA9IG5ldyBGYWN0KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImZsb29yIl0gPSBuZXcgRmxvb3IoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sic2luIl0gPSBuZXcgU2luKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInNpbmgiXSA9IG5ldyBTaW5oKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInN1bSJdID0gbmV3IFN1bSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzdW1pZiJdID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInN1bWlmcyJdID0gbmV3IFN1bUlmcygpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzdW1wcm9kdWN0Il0gPSBuZXcgU3VtUHJvZHVjdCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzdW1zcSJdID0gbmV3IFN1bXNxKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInN0ZGV2Il0gPSBuZXcgU3RkZXYoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sic3RkZXZwIl0gPSBuZXcgU3RkZXZQKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInN0ZGV2LnMiXSA9IG5ldyBTdGRldigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzdGRldi5wIl0gPSBuZXcgU3RkZXZQKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInN1YnRvdGFsIl0gPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZXhwIl0gPSBuZXcgRXhwKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImxvZyJdID0gbmV3IExvZygpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJsb2cxMCJdID0gbmV3IExvZzEwKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImxuIl0gPSBuZXcgTG4oKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibWF4Il0gPSBuZXcgTWF4KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbIm1heGEiXSA9IG5ldyBNYXhhKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbIm1lZGlhbiJdID0gbmV3IE1lZGlhbigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJtaW4iXSA9IG5ldyBNaW4oKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibWluYSJdID0gbmV3IE1pbmEoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibW9kIl0gPSBuZXcgTW9kKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImF2ZXJhZ2UiXSA9IG5ldyBBdmVyYWdlKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImF2ZXJhZ2VhIl0gPSBuZXcgQXZlcmFnZUEoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siYXZlcmFnZWlmIl0gPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImF2ZXJhZ2VpZnMiXSA9IG5ldyBBdmVyYWdlSWZzKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInJvdW5kIl0gPSBuZXcgUm91bmQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicm91bmRkb3duIl0gPSBuZXcgUm91bmRkb3duKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInJvdW5kdXAiXSA9IG5ldyBSb3VuZHVwKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInJhbmQiXSA9IG5ldyBSYW5kKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInJhbmRiZXR3ZWVuIl0gPSBuZXcgUmFuZEJldHdlZW4oKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicXVvdGllbnQiXSA9IG5ldyBRdW90aWVudCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ0cnVuYyJdID0gbmV3IFRydW5jKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInRhbiJdID0gbmV3IFRhbigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ0YW5oIl0gPSBuZXcgVGFuaCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJhdGFuIl0gPSBuZXcgQXRhbigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJhdGFuMiJdID0gbmV3IEF0YW4yKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImF0YW5oIl0gPSBuZXcgQXRhbmgoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siYWNvcyJdID0gbmV3IEFjb3MoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siYWNvc2giXSA9IG5ldyBBY29zaCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ2YXIiXSA9IG5ldyBWYXIoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sidmFycCJdID0gbmV3IFZhclAoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibGFyZ2UiXSA9IG5ldyBMYXJnZSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJzbWFsbCJdID0gbmV3IFNtYWxsKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRlZ3JlZXMiXSA9IG5ldyBEZWdyZWVzKCk7CisgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbgorICAgICAgICAgICAgRnVuY3Rpb25zWyJpc2JsYW5rIl0gPSBuZXcgSXNCbGFuaygpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJpc251bWJlciJdID0gbmV3IElzTnVtYmVyKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImlzdGV4dCJdID0gbmV3IElzVGV4dCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJpc25vbnRleHQiXSA9IG5ldyBJc05vblRleHQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siaXNlcnJvciJdID0gbmV3IElzRXJyb3IoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siaXNlcnIiXSA9IG5ldyBJc0VycigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJlcnJvci50eXBlIl0gPSBuZXcgRXJyb3JUeXBlKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImlzZXZlbiJdID0gbmV3IElzRXZlbigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJpc29kZCJdID0gbmV3IElzT2RkKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImlzbG9naWNhbCJdID0gbmV3IElzTG9naWNhbCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJpc25hIl0gPSBuZXcgSXNOYSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJuYSJdID0gbmV3IE5hKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbIm4iXSA9IG5ldyBOKCk7CisgICAgICAgICAgICAvLyBMb2dpY2FsCisgICAgICAgICAgICBGdW5jdGlvbnNbImlmIl0gPSBuZXcgSWYoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siaWZlcnJvciJdID0gbmV3IElmRXJyb3IoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siaWZuYSJdID0gbmV3IElmTmEoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibm90Il0gPSBuZXcgTm90KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImFuZCJdID0gbmV3IEFuZCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJvciJdID0gbmV3IE9yKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInRydWUiXSA9IG5ldyBUcnVlKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImZhbHNlIl0gPSBuZXcgRmFsc2UoKTsKKyAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBhbmQgbG9va3VwCisgICAgICAgICAgICBGdW5jdGlvbnNbImFkZHJlc3MiXSA9IG5ldyBBZGRyZXNzKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImhsb29rdXAiXSA9IG5ldyBITG9va3VwKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInZsb29rdXAiXSA9IG5ldyBWTG9va3VwKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImxvb2t1cCJdID0gbmV3IExvb2t1cCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJtYXRjaCJdID0gbmV3IE1hdGNoKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInJvdyJdID0gbmV3IFJvdygpe1NraXBBcmd1bWVudEV2YWx1YXRpb24gPSB0cnVlfTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sicm93cyJdID0gbmV3IFJvd3MoKXtTa2lwQXJndW1lbnRFdmFsdWF0aW9uID0gdHJ1ZX07CisgICAgICAgICAgICBGdW5jdGlvbnNbImNvbHVtbiJdID0gbmV3IENvbHVtbigpe1NraXBBcmd1bWVudEV2YWx1YXRpb24gPSB0cnVlfTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siY29sdW1ucyJdID0gbmV3IENvbHVtbnMoKXtTa2lwQXJndW1lbnRFdmFsdWF0aW9uID0gdHJ1ZX07CisgICAgICAgICAgICBGdW5jdGlvbnNbImNob29zZSJdID0gbmV3IENob29zZSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJpbmRleCJdID0gbmV3IEluZGV4KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImluZGlyZWN0Il0gPSBuZXcgSW5kaXJlY3QoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sib2Zmc2V0Il0gPSBuZXcgT2Zmc2V0KCl7U2tpcEFyZ3VtZW50RXZhbHVhdGlvbiA9IHRydWV9OworICAgICAgICAgICAgLy8gRGF0ZQorICAgICAgICAgICAgRnVuY3Rpb25zWyJkYXRlIl0gPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ0b2RheSJdID0gbmV3IFRvZGF5KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbIm5vdyJdID0gbmV3IE5vdygpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJkYXkiXSA9IG5ldyBEYXkoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sibW9udGgiXSA9IG5ldyBNb250aCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ5ZWFyIl0gPSBuZXcgWWVhcigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ0aW1lIl0gPSBuZXcgVGltZSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJob3VyIl0gPSBuZXcgSG91cigpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJtaW51dGUiXSA9IG5ldyBNaW51dGUoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1sic2Vjb25kIl0gPSBuZXcgU2Vjb25kKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbIndlZWtudW0iXSA9IG5ldyBXZWVrbnVtKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbIndlZWtkYXkiXSA9IG5ldyBXZWVrZGF5KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRheXMzNjAiXSA9IG5ldyBEYXlzMzYwKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbInllYXJmcmFjIl0gPSBuZXcgWWVhcmZyYWMoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZWRhdGUiXSA9IG5ldyBFZGF0ZSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJlb21vbnRoIl0gPSBuZXcgRW9tb250aCgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJpc293ZWVrbnVtIl0gPSBuZXcgSXNvV2Vla051bSgpOworICAgICAgICAgICAgRnVuY3Rpb25zWyJ3b3JrZGF5Il0gPSBuZXcgV29ya2RheSgpOworICAgICAgICAgICAgLy8gRGF0YWJhc2UKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZGdldCJdID0gbmV3IERnZXQoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZGNvdW50Il0gPSBuZXcgRGNvdW50KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRjb3VudGEiXSA9IG5ldyBEY291bnRBKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRtYXgiXSA9IG5ldyBEbWF4KCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRtaW4iXSA9IG5ldyBEbWluKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRzdW0iXSA9IG5ldyBEc3VtKCk7CisgICAgICAgICAgICBGdW5jdGlvbnNbImRhdmVyYWdlIl0gPSBuZXcgRGF2ZXJhZ2UoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZHZhciJdID0gbmV3IER2YXIoKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uc1siZHZhcnAiXSA9IG5ldyBEdmFycCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9DZWxsU3RhdGVIZWxwZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NlbGxTdGF0ZUhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWYyMGNhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9DZWxsU3RhdGVIZWxwZXIuY3MKQEAgLTAsMCArMSw1MiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIENlbGxTdGF0ZUhlbHBlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc1N1YlRvdGFsKEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gYy5Ub2tlbnM7CisgICAgICAgICAgICBpZiAodG9rZW5zID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBjLlRva2Vucy5BbnkodG9rZW4gPT4gCisgICAgICAgICAgICAgICAgdG9rZW4uVG9rZW5UeXBlID09IExleGljYWxBbmFseXNpcy5Ub2tlblR5cGUuRnVuY3Rpb24gCisgICAgICAgICAgICAgICAgJiYgdG9rZW4uVmFsdWUuRXF1YWxzKCJTVUJUT1RBTCIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIFNob3VsZElnbm9yZShib29sIGlnbm9yZUhpZGRlblZhbHVlcywgRXhjZWxEYXRhUHJvdmlkZXIuSUNlbGxJbmZvIGMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaWdub3JlSGlkZGVuVmFsdWVzICYmIGMuSXNIaWRkZW5Sb3cpIHx8IChjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwgJiYgSXNTdWJUb3RhbChjKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBTaG91bGRJZ25vcmUoYm9vbCBpZ25vcmVIaWRkZW5WYWx1ZXMsIEZ1bmN0aW9uQXJndW1lbnQgYXJnLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGlnbm9yZUhpZGRlblZhbHVlcyAmJiBhcmcuRXhjZWxTdGF0ZUZsYWdJc1NldChFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbGxlY3Rpb25GbGF0dGVuZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbGxlY3Rpb25GbGF0dGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzZDc1OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ29sbGVjdGlvbkZsYXR0ZW5lci5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25GbGF0dGVuZXI8VD4KKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPFQ+IEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIEFjdGlvbjxGdW5jdGlvbkFyZ3VtZW50LCBJTGlzdDxUPj4gY29udmVydEZ1bmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdMaXN0ID0gbmV3IExpc3Q8VD4oKTsKKyAgICAgICAgICAgIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShhcmd1bWVudHMsIGFyZ0xpc3QsIGNvbnZlcnRGdW5jKTsKKyAgICAgICAgICAgIHJldHVybiBhcmdMaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIExpc3Q8VD4gYXJnTGlzdCwgQWN0aW9uPEZ1bmN0aW9uQXJndW1lbnQsIElMaXN0PFQ+PiBjb252ZXJ0RnVuYykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZSgoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlLCBhcmdMaXN0LCBjb252ZXJ0RnVuYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRGdW5jKGFyZywgYXJnTGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db21waWxlUmVzdWx0VmFsaWRhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db21waWxlUmVzdWx0VmFsaWRhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODJmODAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbXBpbGVSZXN1bHRWYWxpZGF0b3IuY3MKQEAgLTAsMCArMSw0NiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0yNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21waWxlUmVzdWx0VmFsaWRhdG9yCisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBWYWxpZGF0ZShvYmplY3Qgb2JqKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBDb21waWxlUmVzdWx0VmFsaWRhdG9yIF9lbXB0eTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb21waWxlUmVzdWx0VmFsaWRhdG9yIEVtcHR5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfZW1wdHkgPz8gKF9lbXB0eSA9IG5ldyBFbXB0eUNvbXBpbGVSZXN1bHRWYWxpZGF0b3IoKSk7IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVybmFsIGNsYXNzIEVtcHR5Q29tcGlsZVJlc3VsdFZhbGlkYXRvciA6IENvbXBpbGVSZXN1bHRWYWxpZGF0b3IKKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZhbGlkYXRlKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGVtcHR5IHZhbGlkYXRvciAtIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ29tcGlsZVJlc3VsdFZhbGlkYXRvcnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbXBpbGVSZXN1bHRWYWxpZGF0b3JzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGNjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbXBpbGVSZXN1bHRWYWxpZGF0b3JzLmNzCkBAIC0wLDAgKzEsNTUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMjYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBDb21waWxlUmVzdWx0VmFsaWRhdG9ycworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PERhdGFUeXBlLCBDb21waWxlUmVzdWx0VmFsaWRhdG9yPiBfdmFsaWRhdG9ycyA9IG5ldyBEaWN0aW9uYXJ5PERhdGFUeXBlLCBDb21waWxlUmVzdWx0VmFsaWRhdG9yPigpOyAKKworICAgICAgICBwcml2YXRlIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IgQ3JlYXRlT3JHZXQoRGF0YVR5cGUgZGF0YVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfdmFsaWRhdG9ycy5Db250YWluc0tleShkYXRhVHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF92YWxpZGF0b3JzW2RhdGFUeXBlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PSBEYXRhVHlwZS5EZWNpbWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdmFsaWRhdG9yc1tEYXRhVHlwZS5EZWNpbWFsXSA9IG5ldyBEZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IuRW1wdHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGlsZVJlc3VsdFZhbGlkYXRvciBHZXRWYWxpZGF0b3IoRGF0YVR5cGUgZGF0YVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVPckdldChkYXRhVHlwZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RTdW0uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RTdW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwNDI1MwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRFN1bS5jcwpAQCAtMCwwICsxLDU0IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTE5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgRHN1bSA6IERhdGFiYXNlRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBEc3VtKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgUm93TWF0Y2hlcigpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEc3VtKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKKyAgICAgICAgICAgIDogYmFzZShyb3dNYXRjaGVyKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBHZXRNYXRjaGluZ1ZhbHVlcyhhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICAgICAgaWYgKCF2YWx1ZXMuQW55KCkpIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWx1ZXMuU3VtKCksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EYXRhYmFzZUZ1bmN0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EYXRhYmFzZUZ1bmN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzQ2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RhdGFiYXNlRnVuY3Rpb24uY3MKQEAgLTAsMCArMSw3MyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhYmFzZUZ1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIFJvd01hdGNoZXIgUm93TWF0Y2hlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgRGF0YWJhc2VGdW5jdGlvbigpCisgICAgICAgICAgICA6IHRoaXMobmV3IFJvd01hdGNoZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGF0YWJhc2VGdW5jdGlvbihSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvd01hdGNoZXIgPSByb3dNYXRjaGVyOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIElFbnVtZXJhYmxlPGRvdWJsZT4gR2V0TWF0Y2hpbmdWYWx1ZXMoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGJBZGRyZXNzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgIC8vdmFyIGZpZWxkID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgdmFyIGZpZWxkID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKworICAgICAgICAgICAgdmFyIGRiID0gbmV3IEV4Y2VsRGF0YWJhc2UoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgZGJBZGRyZXNzKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgY3JpdGVyaWFSYW5nZSk7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gbmV3IExpc3Q8ZG91YmxlPigpOworCisgICAgICAgICAgICB3aGlsZSAoZGIuSGFzTW9yZVJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGFSb3cgPSBkYi5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFSb3dNYXRjaGVyLklzTWF0Y2goZGF0YVJvdywgY3JpdGVyaWEpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gQ29udmVydFV0aWwuSXNOdW1lcmljKGZpZWxkKSA/IGRhdGFSb3dbKGludClDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShmaWVsZCldIDogZGF0YVJvd1tmaWVsZC5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSldOworICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2FuZGlkYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5BZGQoQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2FuZGlkYXRlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGF2ZXJhZ2UuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RhdmVyYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmRlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RhdmVyYWdlLmNzCkBAIC0wLDAgKzEsNTQgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBjbGFzcyBEYXZlcmFnZSA6IERhdGFiYXNlRnVuY3Rpb24KKyAgICB7CisgICAgICAgICBwdWJsaWMgRGF2ZXJhZ2UoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgIHB1YmxpYyBEYXZlcmFnZShSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICAgICAgICA6IGJhc2Uocm93TWF0Y2hlcikKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLkF2ZXJhZ2UoKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGNvdW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTRhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudC5jcwpAQCAtMCwwICsxLDk0IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgRGNvdW50IDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSb3dNYXRjaGVyIF9yb3dNYXRjaGVyOworCisgICAgICAgIHB1YmxpYyBEY291bnQoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERjb3VudChSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yb3dNYXRjaGVyID0gcm93TWF0Y2hlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIGRiQWRkcmVzcyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgICAgICAgICAgICBzdHJpbmcgZmllbGQgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIGNyaXRlcmlhUmFuZ2UgPSBudWxsOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgdmFyIGRiID0gbmV3IEV4Y2VsRGF0YWJhc2UoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgZGJBZGRyZXNzKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgY3JpdGVyaWFSYW5nZSk7CisKKyAgICAgICAgICAgIHZhciBuSGl0cyA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZGIuSGFzTW9yZVJvd3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGFSb3cgPSBkYi5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKF9yb3dNYXRjaGVyLklzTWF0Y2goZGF0YVJvdywgY3JpdGVyaWEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBmaWVsZG5hbWUgaXMgc3VwcGxpZWQsIGNvdW50IG9ubHkgdGhpcyByb3cgaWYgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXBwbGllZCBmaWVsZCBpcyBudW1lcmljLgorICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGZpZWxkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGRhdGFSb3dbZmllbGRdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhjYW5kaWRhdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5IaXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBmaWVsZG5hbWUgd2FzIHN1cHBsaWVkLCBhbHdheXMgY291bnQgbWF0Y2hpbmcgcm93LgorICAgICAgICAgICAgICAgICAgICAgICAgbkhpdHMrKzsgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5IaXRzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGNvdW50QS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGNvdW50QS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTBhNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EY291bnRBLmNzCkBAIC0wLDAgKzEsMTAwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgRGNvdW50QSA6IERhdGFiYXNlRnVuY3Rpb24KKyAgICB7CisKKyAgICAgICAgcHVibGljIERjb3VudEEoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERjb3VudEEoUm93TWF0Y2hlciByb3dNYXRjaGVyKQorICAgICAgICAgICAgOiBiYXNlKHJvd01hdGNoZXIpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgZGJBZGRyZXNzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgIHN0cmluZyBmaWVsZCA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgY3JpdGVyaWFSYW5nZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBkYiA9IG5ldyBFeGNlbERhdGFiYXNlKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGRiQWRkcmVzcyk7CisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGNyaXRlcmlhUmFuZ2UpOworCisgICAgICAgICAgICB2YXIgbkhpdHMgPSAwOworICAgICAgICAgICAgd2hpbGUgKGRiLkhhc01vcmVSb3dzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhUm93ID0gZGIuUmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChSb3dNYXRjaGVyLklzTWF0Y2goZGF0YVJvdywgY3JpdGVyaWEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBmaWVsZG5hbWUgaXMgc3VwcGxpZWQsIGNvdW50IG9ubHkgdGhpcyByb3cgaWYgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXBwbGllZCBmaWVsZCBpcyBub3QgYmxhbmsuCisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZmllbGQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gZGF0YVJvd1tmaWVsZF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2hvdWxkQ291bnQoY2FuZGlkYXRlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSGl0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZmllbGRuYW1lIHdhcyBzdXBwbGllZCwgYWx3YXlzIGNvdW50IG1hdGNoaW5nIHJvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5IaXRzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5IaXRzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBTaG91bGRDb3VudChvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZS5Ub1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RnZXQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RnZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1MTM3NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGdldC5jcwpAQCAtMCwwICsxLDcxIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBjbGFzcyBEZ2V0IDogRGF0YWJhc2VGdW5jdGlvbgorICAgIHsKKworICAgICAgICBwdWJsaWMgRGdldCgpCisgICAgICAgICAgICA6IHRoaXMobmV3IFJvd01hdGNoZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGdldChSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICAgICAgICA6IGJhc2Uocm93TWF0Y2hlcikKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICAgICAgICAgIHZhciBkYkFkZHJlc3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlQXNSYW5nZUluZm8uQWRkcmVzcy5BZGRyZXNzOworICAgICAgICAgICAgdmFyIGZpZWxkID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgdmFyIGNyaXRlcmlhUmFuZ2UgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlQXNSYW5nZUluZm8uQWRkcmVzcy5BZGRyZXNzOworCisgICAgICAgICAgICB2YXIgZGIgPSBuZXcgRXhjZWxEYXRhYmFzZShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLCBkYkFkZHJlc3MpOworICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLCBjcml0ZXJpYVJhbmdlKTsKKworICAgICAgICAgICAgdmFyIG5IaXRzID0gMDsKKyAgICAgICAgICAgIG9iamVjdCByZXRWYWwgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKGRiLkhhc01vcmVSb3dzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhUm93ID0gZGIuUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghUm93TWF0Y2hlci5Jc01hdGNoKGRhdGFSb3csIGNyaXRlcmlhKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYoKytuSGl0cyA+IDEpIHJldHVybiBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5OdW0sIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgICAgIHJldFZhbCA9IGRhdGFSb3dbZmllbGRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpLkNyZWF0ZShyZXRWYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EbWF4LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EbWF4LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTdiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RtYXguY3MKQEAgLTAsMCArMSw1NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCit7CisgICAgcHVibGljIGNsYXNzIERtYXggOiBEYXRhYmFzZUZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgRG1heCgpCisgICAgICAgICAgICA6IHRoaXMobmV3IFJvd01hdGNoZXIoKSkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRG1heChSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICAgICAgICA6IGJhc2Uocm93TWF0Y2hlcikKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1heCgpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRG1pbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRG1pbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I5ODNiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EbWluLmNzCkBAIC0wLDAgKzEsNTQgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBjbGFzcyBEbWluIDogRGF0YWJhc2VGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIERtaW4oKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERtaW4oUm93TWF0Y2hlciByb3dNYXRjaGVyKQorICAgICAgICAgICAgOiBiYXNlKHJvd01hdGNoZXIpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEdldE1hdGNoaW5nVmFsdWVzKGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIXZhbHVlcy5BbnkoKSkgcmV0dXJuIENyZWF0ZVJlc3VsdCgwZCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NaW4oKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0R2YXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0R2YXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YjA5YwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRHZhci5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTE5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCit7CisgICAgcHVibGljIGNsYXNzIER2YXIgOiBEYXRhYmFzZUZ1bmN0aW9uCisgICAgeworICAgICAgICAgcHVibGljIER2YXIoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgIHB1YmxpYyBEdmFyKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKKyAgICAgICAgICAgIDogYmFzZShyb3dNYXRjaGVyKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEdldE1hdGNoaW5nVmFsdWVzKGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIXZhbHVlcy5BbnkoKSkgcmV0dXJuIENyZWF0ZVJlc3VsdCgwZCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFZhck1ldGhvZHMuVmFyKHZhbHVlcyksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EdmFycC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRHZhcnAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwN2Y2ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRHZhcnAuY3MKQEAgLTAsMCArMSw1NiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBjbGFzcyBEdmFycCA6IERhdGFiYXNlRnVuY3Rpb24KKyAgICB7CisgICAgICAgICBwdWJsaWMgRHZhcnAoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgIHB1YmxpYyBEdmFycChSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICAgICAgICA6IGJhc2Uocm93TWF0Y2hlcikKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBHZXRNYXRjaGluZ1ZhbHVlcyhhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICAgICAgaWYgKCF2YWx1ZXMuQW55KCkpIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChWYXJNZXRob2RzLlZhclAodmFsdWVzKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2UuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxZDg3MAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZS5jcwpAQCAtMCwwICsxLDk2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhYmFzZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZGF0YVByb3ZpZGVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZnJvbUNvbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3RvQ29sOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZmllbGRSb3c7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9lbmRSb3c7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF93b3Jrc2hlZXQ7CisgICAgICAgIHByaXZhdGUgaW50IF9yb3dJbmRleDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PEV4Y2VsRGF0YWJhc2VGaWVsZD4gX2ZpZWxkcyA9IG5ldyBMaXN0PEV4Y2VsRGF0YWJhc2VGaWVsZD4oKTsKKworICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8RXhjZWxEYXRhYmFzZUZpZWxkPiBGaWVsZHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9maWVsZHM7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbERhdGFiYXNlKEV4Y2VsRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlciwgc3RyaW5nIHJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBfZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyOworICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShyYW5nZSk7CisgICAgICAgICAgICBfZnJvbUNvbCA9IGFkZHJlc3MuX2Zyb21Db2w7CisgICAgICAgICAgICBfdG9Db2wgPSBhZGRyZXNzLl90b0NvbDsKKyAgICAgICAgICAgIF9maWVsZFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgICAgICBfZW5kUm93ID0gYWRkcmVzcy5fdG9Sb3c7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0gYWRkcmVzcy5Xb3JrU2hlZXQ7CisgICAgICAgICAgICBfcm93SW5kZXggPSBfZmllbGRSb3c7CisgICAgICAgICAgICBJbml0aWFsaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmaWVsZEl4ID0gMDsKKyAgICAgICAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gX2Zyb21Db2w7IGNvbEluZGV4IDw9IF90b0NvbDsgY29sSW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZU9iaiA9IEdldENlbGxWYWx1ZShfZmllbGRSb3csIGNvbEluZGV4KTsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVPYmogIT0gbnVsbCA/IG5hbWVPYmouVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpIDogc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgIF9maWVsZHMuQWRkKG5ldyBFeGNlbERhdGFiYXNlRmllbGQobmFtZSwgZmllbGRJeCsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIG9iamVjdCBHZXRDZWxsVmFsdWUoaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9kYXRhUHJvdmlkZXIuR2V0UmFuZ2VWYWx1ZShfd29ya3NoZWV0LCByb3csIGNvbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBIYXNNb3JlUm93cworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3Jvd0luZGV4IDwgX2VuZFJvdzsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VsRGF0YWJhc2VSb3cgUmVhZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOworICAgICAgICAgICAgX3Jvd0luZGV4Kys7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmllbGQgaW4gRmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb2xJbmRleCA9IF9mcm9tQ29sICsgZmllbGQuQ29sSW5kZXg7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IEdldENlbGxWYWx1ZShfcm93SW5kZXgsIGNvbEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXRWYWxbZmllbGQuRmllbGROYW1lXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VDcml0ZXJpYS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZUNyaXRlcmlhLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTA4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VDcml0ZXJpYS5jcwpAQCAtMCwwICsxLDg0IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhYmFzZUNyaXRlcmlhCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9kYXRhUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9mcm9tQ29sOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfdG9Db2w7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF93b3Jrc2hlZXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9maWVsZFJvdzsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLCBvYmplY3Q+IF9jcml0ZXJpYXMgPSBuZXcgRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PigpOyAKKworICAgICAgICBwdWJsaWMgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKEV4Y2VsRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlciwgc3RyaW5nIHJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBfZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyOworICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShyYW5nZSk7CisgICAgICAgICAgICBfZnJvbUNvbCA9IGFkZHJlc3MuX2Zyb21Db2w7CisgICAgICAgICAgICBfdG9Db2wgPSBhZGRyZXNzLl90b0NvbDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBhZGRyZXNzLldvcmtTaGVldDsKKyAgICAgICAgICAgIF9maWVsZFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgICAgICBJbml0aWFsaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmbyA9IDE7CisgICAgICAgICAgICBmb3IgKHZhciB4ID0gX2Zyb21Db2w7IHggPD0gX3RvQ29sOyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqID0gX2RhdGFQcm92aWRlci5HZXRDZWxsVmFsdWUoX3dvcmtzaGVldCwgX2ZpZWxkUm93LCB4KTsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gX2RhdGFQcm92aWRlci5HZXRDZWxsVmFsdWUoX3dvcmtzaGVldCwgX2ZpZWxkUm93ICsgMSwgeCk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqICE9IG51bGwgJiYgdmFsICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihmaWVsZE9iaiBpcyBzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoZmllbGRPYmouVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jcml0ZXJpYXMuQWRkKGZpZWxkLCB2YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhmaWVsZE9iaikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgoaW50KSBmaWVsZE9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICBfY3JpdGVyaWFzLkFkZChmaWVsZCwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSURpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4gSXRlbXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jcml0ZXJpYXM7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjc3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLmNzCkBAIC0wLDAgKzEsNTcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQKKyAgICB7CisgICAgICAgIHB1YmxpYyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZChzdHJpbmcgZmllbGROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoaW50IGZpZWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkSW5kZXggPSBmaWVsZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoRmllbGROYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmllbGROYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhc2UuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGROYW1lIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQ/IEZpZWxkSW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlRmllbGQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg3YjNjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlRmllbGQuY3MKQEAgLTAsMCArMSw0NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0wNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFiYXNlRmllbGQKKyAgICB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3RyaW5nIEZpZWxkTmFtZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludCBDb2xJbmRleCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgRXhjZWxEYXRhYmFzZUZpZWxkKHN0cmluZyBmaWVsZE5hbWUsIGludCBjb2xJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgRmllbGROYW1lID0gZmllbGROYW1lOworICAgICAgICAgICAgQ29sSW5kZXggPSBjb2xJbmRleDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVJvdy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVJvdy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTIxNmRiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlUm93LmNzCkBAIC0wLDAgKzEsNjAgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFiYXNlUm93CisgICAgeworICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8aW50LCBzdHJpbmc+IF9maWVsZEluZGV4ZXMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIHN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiBfaXRlbXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2NvbEluZGV4ID0gMTsKKyAgICAgICAgcHVibGljIG9iamVjdCB0aGlzW3N0cmluZyBmaWVsZF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pdGVtc1tmaWVsZF07IH0KKworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2l0ZW1zW2ZpZWxkXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIF9maWVsZEluZGV4ZXNbX2NvbEluZGV4KytdID0gZmllbGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IHRoaXNbaW50IGluZGV4XQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBfZmllbGRJbmRleGVzW2luZGV4XTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2l0ZW1zW2ZpZWxkXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Sb3dNYXRjaGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Sb3dNYXRjaGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjMyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL1Jvd01hdGNoZXIuY3MKQEAgLTAsMCArMSw5MCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0wNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBwdWJsaWMgY2xhc3MgUm93TWF0Y2hlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBXaWxkQ2FyZFZhbHVlTWF0Y2hlciBfd2lsZENhcmRWYWx1ZU1hdGNoZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOworCisgICAgICAgIHB1YmxpYyBSb3dNYXRjaGVyKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgV2lsZENhcmRWYWx1ZU1hdGNoZXIoKSwgbmV3IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJvd01hdGNoZXIoV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIsIE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIG51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBfd2lsZENhcmRWYWx1ZU1hdGNoZXIgPSB3aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKKyAgICAgICAgICAgIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciA9IG51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNNYXRjaChFeGNlbERhdGFiYXNlUm93IHJvdywgRXhjZWxEYXRhYmFzZUNyaXRlcmlhIGNyaXRlcmlhKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIGNyaXRlcmlhLkl0ZW1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBjLktleS5GaWVsZEluZGV4Lkhhc1ZhbHVlID8gcm93W2MuS2V5LkZpZWxkSW5kZXguVmFsdWVdIDogcm93W2MuS2V5LkZpZWxkTmFtZV07CisgICAgICAgICAgICAgICAgdmFyIGNyaXQgPSBjLlZhbHVlOworICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuSXNOdW1lcmljKCkgJiYgY3JpdC5Jc051bWVyaWMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKFN5c3RlbS5NYXRoLkFicyhDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjYW5kaWRhdGUpIC0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY3JpdCkpID4gZG91YmxlLkVwc2lsb24pIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNyaXRlcmlhU3RyaW5nID0gY3JpdC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoIUV2YWx1YXRlKGNhbmRpZGF0ZSwgY3JpdGVyaWFTdHJpbmcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIEV2YWx1YXRlKG9iamVjdCBvYmosIHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGRvdWJsZT8gY2FuZGlkYXRlID0gZGVmYXVsdChkb3VibGU/KTsKKyAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMob2JqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5IYXNWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZS5WYWx1ZSwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgb2JqLlRvU3RyaW5nKCkpID09IDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1MjMzZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZS5jcwpAQCAtMCwwICsxLDQ4IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgRGF0ZSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgICAgICAgICAgdmFyIHllYXIgPSBBcmdUb0ludChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIG1vbnRoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBkYXkgPSBBcmdUb0ludChhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgU3lzdGVtLkRhdGVUaW1lKHllYXIsIDEsIDEpOworICAgICAgICAgICAgbW9udGggLT0gMTsKKyAgICAgICAgICAgIGRhdGUgPSBkYXRlLkFkZE1vbnRocyhtb250aCk7CisgICAgICAgICAgICBkYXRlID0gZGF0ZS5BZGREYXlzKChkb3VibGUpKGRheSAtIDEpKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZGF0ZS5Ub09BRGF0ZSgpLCBEYXRhVHlwZS5EYXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZVBhcnNpbmdGdW5jdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZVBhcnNpbmdGdW5jdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzU2Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlUGFyc2luZ0Z1bmN0aW9uLmNzCkBAIC0wLDAgKzEsMjYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0ZVBhcnNpbmdGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBTeXN0ZW0uRGF0ZVRpbWUgUGFyc2VEYXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgb2JqZWN0IGRhdGVPYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLk1pblZhbHVlOworICAgICAgICAgICAgaWYgKGRhdGVPYmogaXMgc3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuUGFyc2UoZGF0ZU9iai5Ub1N0cmluZygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZCA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlU3RyaW5nUGFyc2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlU3RyaW5nUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTBkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVTdHJpbmdQYXJzZXIuY3MKQEAgLTAsMCArMSwzNSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQoreworICAgIHB1YmxpYyBjbGFzcyBEYXRlU3RyaW5nUGFyc2VyCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZVZhbHVlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlVmFsdWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0MGM0OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZVZhbHVlLmNzCkBAIC0wLDAgKzEsMzIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIERhdGVWYWx1ZSBmdW5jdGlvbiwganVzdCB1c2luZyAuTkVUIGJ1aWx0LWluCisgICAgLy8vIGZ1bmN0aW9uIFN5c3RlbS5EYXRlVGltZS5UcnlQYXJzZSwgYmFzZWQgb24gY3VycmVudCBjdWx0dXJlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRGF0ZVZhbHVlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgZGF0ZVN0cmluZyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gRXhlY3V0ZShkYXRlU3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShzdHJpbmcgZGF0ZVN0cmluZykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIHJlc3VsdDsKKyAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZS5UcnlQYXJzZShkYXRlU3RyaW5nLCBvdXQgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgIT0gU3lzdGVtLkRhdGVUaW1lLk1pblZhbHVlID8KKyAgICAgICAgICAgICAgICBDcmVhdGVSZXN1bHQocmVzdWx0LlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpIDoKKyAgICAgICAgICAgICAgICBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RheS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YmI0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RheS5jcwpAQCAtMCwwICsxLDQ0IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgRGF5IDogRGF0ZVBhcnNpbmdGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgZGF0ZU9iaiA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHZhciBkYXRlID0gUGFyc2VEYXRlKGFyZ3VtZW50cywgZGF0ZU9iaik7CisKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZGF0ZS5EYXksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXlzMzYwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXlzMzYwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2I5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RheXMzNjAuY3MKQEAgLTAsMCArMSw4MSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIERheXMzNjAgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGVudW0gRGF5czM2MENhbGN0eXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIEV1cm9wZWFuLAorICAgICAgICAgICAgVXMKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBudW1EYXRlMSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIG51bURhdGUyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgZHQxID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUobnVtRGF0ZTEpOworICAgICAgICAgICAgdmFyIGR0MiA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKG51bURhdGUyKTsKKworICAgICAgICAgICAgdmFyIGNhbGNUeXBlID0gRGF5czM2MENhbGN0eXBlLlVzOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZXVyb3BlYW4gPSBBcmdUb0Jvb2woYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgICAgICBpZihldXJvcGVhbikgY2FsY1R5cGUgPSBEYXlzMzYwQ2FsY3R5cGUuRXVyb3BlYW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBzdGFydFllYXIgPSBkdDEuWWVhcjsKKyAgICAgICAgICAgIHZhciBzdGFydE1vbnRoID0gZHQxLk1vbnRoOworICAgICAgICAgICAgdmFyIHN0YXJ0RGF5ID0gZHQxLkRheTsKKyAgICAgICAgICAgIHZhciBlbmRZZWFyID0gZHQyLlllYXI7CisgICAgICAgICAgICB2YXIgZW5kTW9udGggPSBkdDIuTW9udGg7CisgICAgICAgICAgICB2YXIgZW5kRGF5ID0gZHQyLkRheTsKKworICAgICAgICAgICAgaWYgKGNhbGNUeXBlID09IERheXMzNjBDYWxjdHlwZS5FdXJvcGVhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXkgPT0gMzEpIHN0YXJ0RGF5ID0gMzA7CisgICAgICAgICAgICAgICAgaWYgKGVuZERheSA9PSAzMSkgZW5kRGF5ID0gMzA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgdmFyIG5EYXlzSW5GZWIgPSBjYWxlbmRhci5Jc0xlYXBZZWFyKGR0MS5ZZWFyKSA/IDI5IDogMjg7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGludmVzdG1lbnQgaXMgRU9NIGFuZCAoRGF0ZTEgaXMgdGhlIGxhc3QgZGF5IG9mIEZlYnJ1YXJ5KSBhbmQgKERhdGUyIGlzIHRoZSBsYXN0IGRheSBvZiBGZWJydWFyeSksIHRoZW4gY2hhbmdlIEQyIHRvIDMwLgorICAgICAgICAgICAgICAgIGlmIChzdGFydE1vbnRoID09IDIgJiYgc3RhcnREYXkgPT0gbkRheXNJbkZlYiAmJiBlbmRNb250aCA9PSAyICYmIGVuZERheSA9PSBuRGF5c0luRmViKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kRGF5ID0gMzA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW52ZXN0bWVudCBpcyBFT00gYW5kIChEYXRlMSBpcyB0aGUgbGFzdCBkYXkgb2YgRmVicnVhcnkpLCB0aGVuIGNoYW5nZSBEMSB0byAzMC4KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRNb250aCA9PSAyICYmIHN0YXJ0RGF5ID09IG5EYXlzSW5GZWIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IDMwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgLy8gSWYgRDIgaXMgMzEgYW5kIEQxIGlzIDMwIG9yIDMxLCB0aGVuIGNoYW5nZSBEMiB0byAzMC4KKyAgICAgICAgICAgICAgICBpZiAoZW5kRGF5ID09IDMxICYmIChzdGFydERheSA9PSAzMCB8fCBzdGFydERheSA9PSAzMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmREYXkgPSAzMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIC8vIElmIEQxIGlzIDMxLCB0aGVuIGNoYW5nZSBEMSB0byAzMC4KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXkgPT0gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IDMwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoZW5kWWVhcioxMiozMCArIGVuZE1vbnRoKjMwICsgZW5kRGF5KSAtIChzdGFydFllYXIqMTIqMzAgKyBzdGFydE1vbnRoKjMwICsgc3RhcnREYXkpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0TnVtV2hvbGVNb250aHMoU3lzdGVtLkRhdGVUaW1lIGR0MSwgU3lzdGVtLkRhdGVUaW1lIGR0MikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoZHQxLlllYXIsIGR0MS5Nb250aCwgMSkuQWRkTW9udGhzKDEpOworICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBuZXcgU3lzdGVtLkRhdGVUaW1lKGR0Mi5ZZWFyLCBkdDIuTW9udGgsIDEpOworICAgICAgICAgICAgcmV0dXJuICgoZW5kRGF0ZS5ZZWFyIC0gc3RhcnREYXRlLlllYXIpKjEyKSArIChlbmREYXRlLk1vbnRoIC0gc3RhcnREYXRlLk1vbnRoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRWRhdGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VkYXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNmRhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VkYXRlLmNzCkBAIC0wLDAgKzEsMjEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgRWRhdGUgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyLCBlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkYXRlU2VyaWFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpOworICAgICAgICAgICAgdmFyIG5Nb250aHNUb0FkZCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0RGF0ZSA9IGRhdGUuQWRkTW9udGhzKG5Nb250aHNUb0FkZCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdERhdGUuVG9PQURhdGUoKSwgRGF0YVR5cGUuRGF0ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VvbW9udGguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VvbW9udGguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRW9tb250aC5jcwpAQCAtMCwwICsxLDIwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIEVvbW9udGggOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCkpOworICAgICAgICAgICAgdmFyIG1vbnRoc1RvQWRkID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciByZXN1bHREYXRlID0gbmV3IFN5c3RlbS5EYXRlVGltZShkYXRlLlllYXIsIGRhdGUuTW9udGgsIDEpLkFkZE1vbnRocyhtb250aHNUb0FkZCArIDEpLkFkZERheXMoLTEpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHREYXRlLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ib3VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ib3VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTVhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0hvdXIuY3MKQEAgLTAsMCArMSw0NiBAQAor77u/CisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQoreworICAgIHB1YmxpYyBjbGFzcyBIb3VyIDogRGF0ZVBhcnNpbmdGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgZGF0ZU9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7CisgICAgICAgICAgICB2YXIgZGF0ZSA9IFBhcnNlRGF0ZShhcmd1bWVudHMsIGRhdGVPYmopOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLkhvdXIsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0lzb1dlZWtOdW0uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0lzb1dlZWtOdW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyNDgzZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvSXNvV2Vla051bS5jcwpAQCAtMCwwICsxLDUwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIElzb1dlZWtOdW0gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBkYXRlSW50ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZUludCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFdlZWtOdW1iZXIoZGF0ZSksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB3YXMgZm91bmQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjg1MTkxL2dldC13ZWVrLW9mLWRhdGUtZnJvbS1saW5xLXF1ZXJ5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbURhdGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgaW50IFdlZWtOdW1iZXIoU3lzdGVtLkRhdGVUaW1lIGZyb21EYXRlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBHZXQgamFuIDFzdCBvZiB0aGUgeWVhcgorICAgICAgICAgICAgdmFyIHN0YXJ0T2ZZZWFyID0gZnJvbURhdGUuQWRkRGF5cygtZnJvbURhdGUuRGF5ICsgMSkuQWRkTW9udGhzKC1mcm9tRGF0ZS5Nb250aCArIDEpOworICAgICAgICAgICAgLy8gR2V0IGRlYyAzMXN0IG9mIHRoZSB5ZWFyCisgICAgICAgICAgICB2YXIgZW5kT2ZZZWFyID0gc3RhcnRPZlllYXIuQWRkWWVhcnMoMSkuQWRkRGF5cygtMSk7CisgICAgICAgICAgICAvLyBJU08gODYwMSB3ZWVrcyBzdGFydCB3aXRoIE1vbmRheQorICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHdlZWsgb2YgYSB5ZWFyIGluY2x1ZGVzIHRoZSBmaXJzdCBUaHVyc2RheQorICAgICAgICAgICAgLy8gRGF5T2ZXZWVrIHJldHVybnMgMCBmb3Igc3VuZGF5IHVwIHRvIDYgZm9yIHNhdGVyZGF5CisgICAgICAgICAgICBpbnRbXSBpc284NjAxQ29ycmVjdGlvbiA9IHsgNiwgNywgOCwgOSwgMTAsIDQsIDUgfTsKKyAgICAgICAgICAgIGludCBuZHMgPSBmcm9tRGF0ZS5TdWJ0cmFjdChzdGFydE9mWWVhcikuRGF5cyArIGlzbzg2MDFDb3JyZWN0aW9uWyhpbnQpc3RhcnRPZlllYXIuRGF5T2ZXZWVrXTsKKyAgICAgICAgICAgIGludCB3ayA9IG5kcyAvIDc7CisgICAgICAgICAgICBzd2l0Y2ggKHdrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHdlZWtudW1iZXIgb2YgZGVjIDMxc3Qgb2YgdGhlIHByZXZpb3VzIHllYXIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlZWtOdW1iZXIoc3RhcnRPZlllYXIuQWRkRGF5cygtMSkpOworICAgICAgICAgICAgICAgIGNhc2UgNTM6CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGRlYyAzMXN0IGZhbGxzIGJlZm9yZSB0aHVyc2RheSBpdCBpcyB3ZWVrIDAxIG9mIG5leHQgeWVhcgorICAgICAgICAgICAgICAgICAgICBpZiAoZW5kT2ZZZWFyLkRheU9mV2VlayA8IERheU9mV2Vlay5UaHVyc2RheSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2s7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHdrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9NaW51dGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL01pbnV0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EzMzhkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9NaW51dGUuY3MKQEAgLTAsMCArMSw1MiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIE1pbnV0ZSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGRhdGVPYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuTWluVmFsdWU7CisgICAgICAgICAgICBpZiAoZGF0ZU9iaiBpcyBzdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5QYXJzZShkYXRlT2JqLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICAgICAgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLk1pbnV0ZSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL01vbnRoLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Nb250aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTE4YjBhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Nb250aC5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgTW9udGggOiBEYXRlUGFyc2luZ0Z1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBkYXRlT2JqID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKKyAgICAgICAgICAgIHZhciBkYXRlID0gUGFyc2VEYXRlKGFyZ3VtZW50cywgZGF0ZU9iaik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuTW9udGgsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9OZXR3b3JrZGF5cy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyY2FiMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXMuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUuV29ya2RheXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIE5ldHdvcmtkYXlzIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMCkpOworICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMSkpOworICAgICAgICAgICAgdmFyIGNhbGN1bGF0b3IgPSBuZXcgV29ya2RheUNhbGN1bGF0b3IoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdG9yLkNhbGN1bGF0ZU51bWJlck9mV29ya2RheXMoc3RhcnREYXRlLCBlbmREYXRlKTsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGN1bGF0b3IuUmVkdWNlV29ya2RheXNXaXRoSG9saWRheXMocmVzdWx0LCBmdW5jdGlvbkFyZ3VtZW50c1syXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQuTnVtYmVyT2ZXb3JrZGF5cywgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05ldHdvcmtkYXlzSW50bC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXNJbnRsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05ldHdvcmtkYXlzSW50bC5jcwpAQCAtMCwwICsxLDQ2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgTmV0d29ya2RheXNJbnRsIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMCkpOworICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMSkpOworICAgICAgICAgICAgV29ya2RheUNhbGN1bGF0b3IgY2FsY3VsYXRvciA9IG5ldyBXb3JrZGF5Q2FsY3VsYXRvcigpOworICAgICAgICAgICAgdmFyIHdlZWtkYXlGYWN0b3J5ID0gbmV3IEhvbGlkYXlXZWVrZGF5c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBob2xpZGF5QXJnID0gZnVuY3Rpb25Bcmd1bWVudHNbMl0uVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goaG9saWRheUFyZy5Ub1N0cmluZygpLCAiXlswMV17N30iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3IgPSBuZXcgV29ya2RheUNhbGN1bGF0b3Iod2Vla2RheUZhY3RvcnkuQ3JlYXRlKGhvbGlkYXlBcmcuVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChJc051bWVyaWMoaG9saWRheUFyZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgaG9saWRheUNvZGUgPSBDb252ZXJ0LlRvSW50MzIoaG9saWRheUFyZyk7CisgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3IgPSBuZXcgV29ya2RheUNhbGN1bGF0b3Iod2Vla2RheUZhY3RvcnkuQ3JlYXRlKGhvbGlkYXlDb2RlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRvci5DYWxjdWxhdGVOdW1iZXJPZldvcmtkYXlzKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoID4gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWxjdWxhdG9yLlJlZHVjZVdvcmtkYXlzV2l0aEhvbGlkYXlzKHJlc3VsdCwgZnVuY3Rpb25Bcmd1bWVudHNbM10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdC5OdW1iZXJPZldvcmtkYXlzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTm93LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ob3cuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzMDQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTm93LmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQoreworICAgIHB1YmxpYyBjbGFzcyBOb3cgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uRGF0ZVRpbWUuTm93LlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9TZWNvbmQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1NlY29uZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdlYTFkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9TZWNvbmQuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIFNlY29uZCA6IERhdGVQYXJzaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGRhdGVPYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGRhdGUgPSBQYXJzZURhdGUoYXJndW1lbnRzLCBkYXRlT2JqKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZGF0ZS5TZWNvbmQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9UaW1lLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9UaW1lLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODEzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWUuY3MKQEAgLTAsMCArMSw2NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgcHVibGljIGNsYXNzIFRpbWUgOiBUaW1lQmFzZUZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgVGltZSgpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYoYXJndW1lbnRzLkNvdW50KCkgPT0gMSAmJiBUaW1lU3RyaW5nUGFyc2VyLkNhblBhcnNlKGZpcnN0QXJnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVGltZVN0cmluZ1BhcnNlci5QYXJzZShmaXJzdEFyZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgICAgICAgICAgdmFyIGhvdXIgPSBBcmdUb0ludChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIG1pbiA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgc2VjID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKKworICAgICAgICAgICAgVGhyb3dBcmd1bWVudEV4Y2VwdGlvbklmKCgpID0+IHNlYyA8IDAgfHwgc2VjID4gNTksICJJbnZhbGlkIHNlY29uZDogIiArIHNlYyk7CisgICAgICAgICAgICBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoKCkgPT4gbWluIDwgMCB8fCBtaW4gPiA1OSwgIkludmFsaWQgbWludXRlOiAiICsgbWluKTsKKyAgICAgICAgICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PiBtaW4gPCAwIHx8IGhvdXIgPiAyMywgIkludmFsaWQgaG91cjogIiArIGhvdXIpOworCisKKyAgICAgICAgICAgIHZhciBzZWNvbmRzT2ZUaGlzVGltZSA9IChkb3VibGUpKGhvdXIgKiA2MCAqIDYwICsgbWluICogNjAgKyBzZWMpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChHZXRUaW1lU2VyaWFsTnVtYmVyKHNlY29uZHNPZlRoaXNUaW1lKSwgRGF0YVR5cGUuVGltZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVCYXNlRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVCYXNlRnVuY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzODJkMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZUJhc2VGdW5jdGlvbi5jcwpAQCAtMCwwICsxLDkxIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGltZUJhc2VGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBUaW1lQmFzZUZ1bmN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgVGltZVN0cmluZ1BhcnNlciA9IG5ldyBUaW1lU3RyaW5nUGFyc2VyKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVGltZVN0cmluZ1BhcnNlciBUaW1lU3RyaW5nUGFyc2VyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBTZXJpYWxOdW1iZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBWYWxpZGF0ZUFuZEluaXRTZXJpYWxOdW1iZXIoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgU2VyaWFsTnVtYmVyID0gKGRvdWJsZSlBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBkb3VibGUgU2Vjb25kc0luQURheQorICAgICAgICB7CisgICAgICAgICAgICBnZXR7IHJldHVybiAyNCAqIDYwICogNjA7IH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBkb3VibGUgR2V0VGltZVNlcmlhbE51bWJlcihkb3VibGUgc2Vjb25kcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlY29uZHMgLyBTZWNvbmRzSW5BRGF5OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBHZXRTZWNvbmRzKGRvdWJsZSBzZXJpYWxOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJpYWxOdW1iZXIgKiBTZWNvbmRzSW5BRGF5OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBHZXRIb3VyKGRvdWJsZSBzZXJpYWxOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWNvbmRzID0gR2V0U2Vjb25kcyhzZXJpYWxOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpc2Vjb25kcyAvICg2MCAqIDYwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBkb3VibGUgR2V0TWludXRlKGRvdWJsZSBzZXJpYWxOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWNvbmRzID0gR2V0U2Vjb25kcyhzZXJpYWxOdW1iZXIpOworICAgICAgICAgICAgc2Vjb25kcyAtPSBHZXRIb3VyKHNlcmlhbE51bWJlcikgKiA2MCAqIDYwOworICAgICAgICAgICAgcmV0dXJuIChzZWNvbmRzIC0gKHNlY29uZHMgJSA2MCkpIC8gNjA7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIEdldFNlY29uZChkb3VibGUgc2VyaWFsTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0U2Vjb25kcyhzZXJpYWxOdW1iZXIpICUgNjA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVTdHJpbmdQYXJzZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVTdHJpbmdQYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMjEzZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVN0cmluZ1BhcnNlci5jcwpAQCAtMCwwICsxLDEyOCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQoreworICAgIHB1YmxpYyBjbGFzcyBUaW1lU3RyaW5nUGFyc2VyCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBSZWdFeDI0ID0gQCJeWzAtOV17MSwyfShcOlswLTldezEsMn0pezAsMn0kIjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgUmVnRXgxMiA9IEAiXlswLTldezEsMn0oXDpbMC05XXsxLDJ9KXswLDJ9KCBQTXwgQU0pJCI7CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgR2V0U2VyaWFsTnVtYmVyKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2Vjb25kc0luQURheSA9IDI0ZCAqIDYwZCAqIDYwZDsKKyAgICAgICAgICAgIHJldHVybiAoKGRvdWJsZSlob3VyICogNjAgKiA2MCArIChkb3VibGUpbWludXRlICogNjAgKyAoZG91YmxlKXNlY29uZCkgLyBzZWNvbmRzSW5BRGF5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlVmFsdWVzKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2Vjb25kIDwgMCB8fCBzZWNvbmQgPiA1OSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbGxlZ2FsIHZhbHVlIGZvciBzZWNvbmQ6ICIgKyBzZWNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1pbnV0ZSA8IDAgfHwgbWludXRlID4gNTkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSWxsZWdhbCB2YWx1ZSBmb3IgbWludXRlOiAiICsgbWludXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGRvdWJsZSBQYXJzZShzdHJpbmcgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbFBhcnNlKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgQ2FuUGFyc2Uoc3RyaW5nIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgZHQ7CisgICAgICAgICAgICByZXR1cm4gUmVnZXguSXNNYXRjaChpbnB1dCwgUmVnRXgyNCkgfHwgUmVnZXguSXNNYXRjaChpbnB1dCwgUmVnRXgxMikgfHwgU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlKGlucHV0LCBvdXQgZHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgSW50ZXJuYWxQYXJzZShzdHJpbmcgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKGlucHV0LCBSZWdFeDI0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2UyNEhvdXJUaW1lU3RyaW5nKGlucHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKGlucHV0LCBSZWdFeDEyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2UxMkhvdXJUaW1lU3RyaW5nKGlucHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSBkYXRlVGltZTsKKyAgICAgICAgICAgIGlmIChTeXN0ZW0uRGF0ZVRpbWUuVHJ5UGFyc2UoaW5wdXQsIG91dCBkYXRlVGltZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFNlcmlhbE51bWJlcihkYXRlVGltZS5Ib3VyLCBkYXRlVGltZS5NaW51dGUsIGRhdGVUaW1lLlNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBQYXJzZTEySG91clRpbWVTdHJpbmcoc3RyaW5nIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgZGF5UGFydCA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIGRheVBhcnQgPSBpbnB1dC5TdWJzdHJpbmcoaW5wdXQuTGVuZ3RoIC0gMiwgMik7CisgICAgICAgICAgICBpbnQgaG91cjsKKyAgICAgICAgICAgIGludCBtaW51dGU7CisgICAgICAgICAgICBpbnQgc2Vjb25kOworICAgICAgICAgICAgR2V0VmFsdWVzRnJvbVN0cmluZyhpbnB1dCwgb3V0IGhvdXIsIG91dCBtaW51dGUsIG91dCBzZWNvbmQpOworICAgICAgICAgICAgaWYgKGRheVBhcnQgPT0gIlBNIikgaG91ciArPSAxMjsKKyAgICAgICAgICAgIFZhbGlkYXRlVmFsdWVzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTsKKyAgICAgICAgICAgIHJldHVybiBHZXRTZXJpYWxOdW1iZXIoaG91ciwgbWludXRlLCBzZWNvbmQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgUGFyc2UyNEhvdXJUaW1lU3RyaW5nKHN0cmluZyBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGhvdXI7CisgICAgICAgICAgICBpbnQgbWludXRlOworICAgICAgICAgICAgaW50IHNlY29uZDsKKyAgICAgICAgICAgIEdldFZhbHVlc0Zyb21TdHJpbmcoaW5wdXQsIG91dCBob3VyLCBvdXQgbWludXRlLCBvdXQgc2Vjb25kKTsKKyAgICAgICAgICAgIFZhbGlkYXRlVmFsdWVzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTsKKyAgICAgICAgICAgIHJldHVybiBHZXRTZXJpYWxOdW1iZXIoaG91ciwgbWludXRlLCBzZWNvbmQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBHZXRWYWx1ZXNGcm9tU3RyaW5nKHN0cmluZyBpbnB1dCwgb3V0IGludCBob3VyLCBvdXQgaW50IG1pbnV0ZSwgb3V0IGludCBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhvdXIgPSAwOworICAgICAgICAgICAgbWludXRlID0gMDsKKyAgICAgICAgICAgIHNlY29uZCA9IDA7CisKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IGlucHV0LlNwbGl0KCc6Jyk7CisgICAgICAgICAgICBob3VyID0gaW50LlBhcnNlKGl0ZW1zWzBdKTsKKyAgICAgICAgICAgIGlmIChpdGVtcy5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1pbnV0ZSA9IGludC5QYXJzZShpdGVtc1sxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXRlbXMuTGVuZ3RoID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gaXRlbXNbMl07CisgICAgICAgICAgICAgICAgdmFsID0gUmVnZXguUmVwbGFjZSh2YWwsICJbXjAtOV0rJCIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgc2Vjb25kID0gaW50LlBhcnNlKHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVWYWx1ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVZhbHVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTYwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVWYWx1ZS5jcwpAQCAtMCwwICsxLDM2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgVGltZVZhbHVlIGZ1bmN0aW9uLCBqdXN0IHVzaW5nIC5ORVQgYnVpbHQtaW4KKyAgICAvLy8gZnVuY3Rpb24gU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlLCBiYXNlZCBvbiBjdXJyZW50IGN1bHR1cmUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUaW1lVmFsdWUgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBkYXRlU3RyaW5nID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBFeGVjdXRlKGRhdGVTdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKHN0cmluZyBkYXRlU3RyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgcmVzdWx0OworICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSBTeXN0ZW0uRGF0ZVRpbWUuTWluVmFsdWUgPworICAgICAgICAgICAgICAgIENyZWF0ZVJlc3VsdChHZXRUaW1lVmFsdWUocmVzdWx0KSwgRGF0YVR5cGUuRGF0ZSkgOgorICAgICAgICAgICAgICAgIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZG91YmxlIEdldFRpbWVWYWx1ZShTeXN0ZW0uRGF0ZVRpbWUgcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludClyZXN1bHQuVGltZU9mRGF5LlRvdGFsU2Vjb25kcyA9PSAwID8gMGQgOiByZXN1bHQuVGltZU9mRGF5LlRvdGFsU2Vjb25kcy8gKDM2MDAgKiAyNCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RvZGF5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ub2RheS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzI3ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ub2RheS5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgVG9kYXkgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uRGF0ZVRpbWUuVG9kYXkuVG9PQURhdGUoKSwgRGF0YVR5cGUuRGF0ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dlZWtkYXkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dlZWtkYXkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliYTdkNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV2Vla2RheS5jcwpAQCAtMCwwICsxLDY0IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgV2Vla2RheSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHNlcmlhbE51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIHJldHVyblR5cGUgPSBhcmd1bWVudHMuQ291bnQoKSA+IDEgPyBBcmdUb0ludChhcmd1bWVudHMsIDEpIDogMTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoQ2FsY3VsYXRlRGF5T2ZXZWVrKFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKHNlcmlhbE51bWJlciksIHJldHVyblR5cGUpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8aW50PiBfb25lQmFzZWRTdGFydE9uU3VuZGF5ID0gbmV3IExpc3Q8aW50PiB7IDEsIDIsIDMsIDQsIDUsIDYsIDcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxpbnQ+IF9vbmVCYXNlZFN0YXJ0T25Nb25kYXkgPSBuZXcgTGlzdDxpbnQ+IHsgNywgMSwgMiwgMywgNCwgNSwgNiB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PGludD4gX3plcm9CYXNlZFN0YXJ0T25TdW5kYXkgPSBuZXcgTGlzdDxpbnQ+IHsgNiwgMCwgMSwgMiwgMywgNCwgNSB9OworCisgICAgICAgIHByaXZhdGUgaW50IENhbGN1bGF0ZURheU9mV2VlayhTeXN0ZW0uRGF0ZVRpbWUgZGF0ZVRpbWUsIGludCByZXR1cm5UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGF5SXggPSAoaW50KWRhdGVUaW1lLkRheU9mV2VlazsKKyAgICAgICAgICAgIHN3aXRjaCAocmV0dXJuVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb25lQmFzZWRTdGFydE9uU3VuZGF5W2RheUl4XTsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb25lQmFzZWRTdGFydE9uTW9uZGF5W2RheUl4XTsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfemVyb0Jhc2VkU3RhcnRPblN1bmRheVtkYXlJeF07CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk51bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dlZWtudW0uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dlZWtudW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiNjYyOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV2Vla251bS5jcwpAQCAtMCwwICsxLDYzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgV2Vla251bSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBFeHByZXNzaW9uR3JhcGguQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxLCBlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgIHZhciBkYXRlU2VyaWFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpOworICAgICAgICAgICAgdmFyIHN0YXJ0RGF5ID0gRGF5T2ZXZWVrLlN1bmRheTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFyZ1N0YXJ0RGF5ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ1N0YXJ0RGF5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuU3VuZGF5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gRGF5T2ZXZWVrLk1vbmRheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuVHVlc2RheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuV2VkbmVzZGF5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5UaHVyc2RheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuRnJpZGF5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5TYXR1cmRheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuTnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChEYXRlVGltZUZvcm1hdEluZm8uQ3VycmVudEluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBleGVjdXRlIFdlZWtudW0gZnVuY3Rpb24gYmVjYXVzZSBEYXRlVGltZUZvcm1hdEluZm8uQ3VycmVudEluZm8gd2FzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB3ZWVrID0gRGF0ZVRpbWVGb3JtYXRJbmZvLkN1cnJlbnRJbmZvLkNhbGVuZGFyLkdldFdlZWtPZlllYXIoZGF0ZSwgQ2FsZW5kYXJXZWVrUnVsZS5GaXJzdERheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh3ZWVrLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTE5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXkuY3MKQEAgLTAsMCArMSw4OCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgV29ya2RheSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKEFyZ1RvSW50KGFyZ3VtZW50cywgMCkpOworICAgICAgICAgICAgdmFyIG5Xb3JrRGF5cyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0RGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZTsKKyAgICAgICAgICAgIHZhciB3b3JrZGF5c0NvdW50ZWQgPSAwOworICAgICAgICAgICAgdmFyIHRtcERhdGUgPSBzdGFydERhdGU7CisgICAgICAgICAgICAvLyBmaXJzdCBtb3ZlIGZvcndhcmQgdG8gdGhlIGZpcnN0IG1vbmRheQorICAgICAgICAgICAgd2hpbGUgKHRtcERhdGUuRGF5T2ZXZWVrICE9IERheU9mV2Vlay5Nb25kYXkgJiYgKG5Xb3JrRGF5cyAtIHdvcmtkYXlzQ291bnRlZCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghSXNIb2xpZGF5KHRtcERhdGUpKSB3b3JrZGF5c0NvdW50ZWQrKzsKKyAgICAgICAgICAgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGhlbiBjYWxjdWxhdGUgd2hvbGUgd2Vla3MKKyAgICAgICAgICAgIHZhciBuV2hvbGVXZWVrcyA9IChuV29ya0RheXMgLSB3b3JrZGF5c0NvdW50ZWQpIC8gNTsKKyAgICAgICAgICAgIHRtcERhdGUgPSB0bXBEYXRlLkFkZERheXMobldob2xlV2Vla3MgKiA3KTsKKyAgICAgICAgICAgIHdvcmtkYXlzQ291bnRlZCArPSBuV2hvbGVXZWVrcyAqIDU7CisKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVzdAorICAgICAgICAgICAgd2hpbGUgKHdvcmtkYXlzQ291bnRlZCA8IG5Xb3JrRGF5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKDEpOworICAgICAgICAgICAgICAgIGlmICghSXNIb2xpZGF5KHRtcERhdGUpKSB3b3JrZGF5c0NvdW50ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdERhdGUgPSBBZGp1c3RSZXN1bHRXaXRoSG9saWRheXModG1wRGF0ZSwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0RGF0ZS5Ub09BRGF0ZSgpLCBEYXRhVHlwZS5EYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3lzdGVtLkRhdGVUaW1lIEFkanVzdFJlc3VsdFdpdGhIb2xpZGF5cyhTeXN0ZW0uRGF0ZVRpbWUgcmVzdWx0RGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID09IDIpIHJldHVybiByZXN1bHREYXRlOworICAgICAgICAgICAgdmFyIGhvbGlkYXlzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICAgICAgICAgIGlmIChob2xpZGF5cyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gaG9saWRheXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZy5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRlU2VyaWFsID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoYXJnLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xpZGF5RGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc0hvbGlkYXkoaG9saWRheURhdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGUgPSByZXN1bHREYXRlLkFkZERheXMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOworICAgICAgICAgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcmFuZ2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2VsbC5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaG9saWRheURhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzSG9saWRheShob2xpZGF5RGF0ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRlID0gcmVzdWx0RGF0ZS5BZGREYXlzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHREYXRlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIElzSG9saWRheShTeXN0ZW0uRGF0ZVRpbWUgZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGUuRGF5T2ZXZWVrID09IERheU9mV2Vlay5TYXR1cmRheSB8fCBkYXRlLkRheU9mV2VlayA9PSBEYXlPZldlZWsuU3VuZGF5OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9BZGRpdGlvbmFsSG9saWRheURheXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL0FkZGl0aW9uYWxIb2xpZGF5RGF5cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg5YjNlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9BZGRpdGlvbmFsSG9saWRheURheXMuY3MKQEAgLTAsMCArMSw0NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lLldvcmtkYXlzCit7CisgICAgcHVibGljIGNsYXNzIEFkZGl0aW9uYWxIb2xpZGF5RGF5cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jdGlvbkFyZ3VtZW50IF9ob2xpZGF5QXJnOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8U3lzdGVtLkRhdGVUaW1lPiBfaG9saWRheURhdGVzID0gbmV3IExpc3Q8U3lzdGVtLkRhdGVUaW1lPigpOyAKKworICAgICAgICBwdWJsaWMgQWRkaXRpb25hbEhvbGlkYXlEYXlzKEZ1bmN0aW9uQXJndW1lbnQgaG9saWRheUFyZykKKyAgICAgICAgeworICAgICAgICAgICAgX2hvbGlkYXlBcmcgPSBob2xpZGF5QXJnOworICAgICAgICAgICAgSW5pdGlhbGl6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFN5c3RlbS5EYXRlVGltZT4gQWRkaXRpb25hbERhdGVzID0+IF9ob2xpZGF5RGF0ZXM7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaG9saWRheXMgPSBfaG9saWRheUFyZy5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICAgICAgICAgIGlmIChob2xpZGF5cyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBob2xpZGF5RGF0ZSBpbiBmcm9tIGFyZyBpbiBob2xpZGF5cyB3aGVyZSBDb252ZXJ0VXRpbC5Jc051bWVyaWMoYXJnLlZhbHVlKSBzZWxlY3QgQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoYXJnLlZhbHVlKSBpbnRvIGRhdGVTZXJpYWwgc2VsZWN0IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2hvbGlkYXlEYXRlcy5BZGQoaG9saWRheURhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByYW5nZSA9IF9ob2xpZGF5QXJnLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgICAgICBpZiAocmFuZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaG9saWRheURhdGUgaW4gZnJvbSBjZWxsIGluIHJhbmdlIHdoZXJlIENvbnZlcnRVdGlsLklzTnVtZXJpYyhjZWxsLlZhbHVlKSBzZWxlY3QgQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2VsbC5WYWx1ZSkgaW50byBkYXRlU2VyaWFsIHNlbGVjdCBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ob2xpZGF5RGF0ZXMuQWRkKGhvbGlkYXlEYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKF9ob2xpZGF5QXJnLlZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaG9saWRheURhdGVzLkFkZChTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShfaG9saWRheUFyZy5WYWx1ZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvSG9saWRheVdlZWtkYXlzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Ib2xpZGF5V2Vla2RheXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxOGNkNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvSG9saWRheVdlZWtkYXlzLmNzCkBAIC0wLDAgKzEsODcgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5cworeworICAgIHB1YmxpYyBjbGFzcyBIb2xpZGF5V2Vla2RheXMKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTGlzdDxEYXlPZldlZWs+IF9ob2xpZGF5RGF5cyA9IG5ldyBMaXN0PERheU9mV2Vlaz4oKTsKKworICAgICAgICBwdWJsaWMgSG9saWRheVdlZWtkYXlzKCkKKyAgICAgICAgICAgIDp0aGlzKERheU9mV2Vlay5TYXR1cmRheSwgRGF5T2ZXZWVrLlN1bmRheSkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IE51bWJlck9mV29ya2RheXNQZXJXZWVrID0+IDcgLSBfaG9saWRheURheXMuQ291bnQ7CisKKyAgICAgICAgcHVibGljIEhvbGlkYXlXZWVrZGF5cyhwYXJhbXMgRGF5T2ZXZWVrW10gaG9saWRheURheXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkYXlPZldlZWsgaW4gaG9saWRheURheXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2hvbGlkYXlEYXlzLkFkZChkYXlPZldlZWspOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNIb2xpZGF5V2Vla2RheShTeXN0ZW0uRGF0ZVRpbWUgZGF0ZVRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaG9saWRheURheXMuQ29udGFpbnMoZGF0ZVRpbWUuRGF5T2ZXZWVrKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgQWRqdXN0UmVzdWx0V2l0aEhvbGlkYXlzKFN5c3RlbS5EYXRlVGltZSByZXN1bHREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikgcmV0dXJuIHJlc3VsdERhdGU7CisgICAgICAgICAgICB2YXIgaG9saWRheXMgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgICAgICAgICAgaWYgKGhvbGlkYXlzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBob2xpZGF5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoYXJnLlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzSG9saWRheVdlZWtkYXkoaG9saWRheURhdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGUgPSByZXN1bHREYXRlLkFkZERheXMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOworICAgICAgICAgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcmFuZ2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2VsbC5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaG9saWRheURhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzSG9saWRheVdlZWtkYXkoaG9saWRheURhdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0ZSA9IHJlc3VsdERhdGUuQWRkRGF5cygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0RGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgR2V0TmV4dFdvcmtkYXkoU3lzdGVtLkRhdGVUaW1lIGRhdGUsIFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbiBkaXJlY3Rpb24gPSBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoYW5nZVBhcmFtID0gKGludClkaXJlY3Rpb247CisgICAgICAgICAgICB2YXIgdG1wRGF0ZSA9IGRhdGUuQWRkRGF5cyhjaGFuZ2VQYXJhbSk7CisgICAgICAgICAgICB3aGlsZSAoSXNIb2xpZGF5V2Vla2RheSh0bXBEYXRlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKGNoYW5nZVBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0bXBEYXRlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Ib2xpZGF5V2Vla2RheXNGYWN0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Ib2xpZGF5V2Vla2RheXNGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTRlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL0hvbGlkYXlXZWVrZGF5c0ZhY3RvcnkuY3MKQEAgLTAsMCArMSw3NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUuV29ya2RheXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSG9saWRheVdlZWtkYXlzRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEYXlPZldlZWtbXSBfZGF5T2ZXZWVrQXJyYXkgPSBuZXcgRGF5T2ZXZWVrW10KKyAgICAgICAgeworICAgICAgICAgICAgRGF5T2ZXZWVrLk1vbmRheSwgCisgICAgICAgICAgICBEYXlPZldlZWsuVHVlc2RheSwgCisgICAgICAgICAgICBEYXlPZldlZWsuV2VkbmVzZGF5LCAKKyAgICAgICAgICAgIERheU9mV2Vlay5UaHVyc2RheSwKKyAgICAgICAgICAgIERheU9mV2Vlay5GcmlkYXksIAorICAgICAgICAgICAgRGF5T2ZXZWVrLlNhdHVyZGF5LAorICAgICAgICAgICAgRGF5T2ZXZWVrLlN1bmRheQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBIb2xpZGF5V2Vla2RheXMgQ3JlYXRlKHN0cmluZyB3ZWVrZGF5cykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkod2Vla2RheXMpIHx8IHdlZWtkYXlzLkxlbmd0aCAhPSA3KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB3ZWVrZGF5IHN0cmluZyIsIG5hbWVvZihXZWVrZGF5KSk7CisKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSBuZXcgTGlzdDxEYXlPZldlZWs+KCk7CisgICAgICAgICAgICB2YXIgYXJyID0gd2Vla2RheXMuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcnIuTGVuZ3RoO2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2ggPSBhcnJbaV07CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICcxJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldFZhbC5BZGQoX2RheU9mV2Vla0FycmF5W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhyZXRWYWwuVG9BcnJheSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBIb2xpZGF5V2Vla2RheXMgQ3JlYXRlKGludCBjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuU2F0dXJkYXksIERheU9mV2Vlay5TdW5kYXkpOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlN1bmRheSwgRGF5T2ZXZWVrLk1vbmRheSk7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuTW9uZGF5LCBEYXlPZldlZWsuVHVlc2RheSk7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuVHVlc2RheSwgRGF5T2ZXZWVrLldlZG5lc2RheSk7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuV2VkbmVzZGF5LCBEYXlPZldlZWsuVGh1cnNkYXkpOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlRodXJzZGF5LCBEYXlPZldlZWsuRnJpZGF5KTsKKyAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5GcmlkYXksIERheU9mV2Vlay5TYXR1cmRheSk7CisgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlN1bmRheSk7CisgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLk1vbmRheSk7CisgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlR1ZXNkYXkpOworICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5XZWRuZXNkYXkpOworICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5UaHVyc2RheSk7CisgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLkZyaWRheSk7CisgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlNhdHVyZGF5KTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY29kZSBzdXBwbGllZCB0byBIb2xpZGF5V2Vla2RheXNGYWN0b3J5OiAiICsgY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL1dvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTBiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL1dvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5jcwpAQCAtMCwwICsxLDE0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUuV29ya2RheXMKK3sKKyAgICBwdWJsaWMgZW51bSBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24KKyAgICB7CisgICAgICAgIEZvcndhcmQgPSAxLAorICAgICAgICBCYWNrd2FyZCA9IC0xCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmZjU1NgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0b3IuY3MKQEAgLTAsMCArMSwxMjggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5OwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5cworeworICAgIHB1YmxpYyBjbGFzcyBXb3JrZGF5Q2FsY3VsYXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIb2xpZGF5V2Vla2RheXMgX2hvbGlkYXlXZWVrZGF5czsKKworICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3IoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBIb2xpZGF5V2Vla2RheXMoKSkKKyAgICAgICAge30KKworICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3IoSG9saWRheVdlZWtkYXlzIGhvbGlkYXlXZWVrZGF5cykKKyAgICAgICAgeworICAgICAgICAgICAgX2hvbGlkYXlXZWVrZGF5cyA9IGhvbGlkYXlXZWVrZGF5czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCBDYWxjdWxhdGVOdW1iZXJPZldvcmtkYXlzKFN5c3RlbS5EYXRlVGltZSBzdGFydERhdGUsIFN5c3RlbS5EYXRlVGltZSBlbmREYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2FsY0RpcmVjdGlvbiA9IHN0YXJ0RGF0ZSA8IGVuZERhdGUKKyAgICAgICAgICAgICAgICA/IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5Gb3J3YXJkCisgICAgICAgICAgICAgICAgOiBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uQmFja3dhcmQ7CisgICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgY2FsY1N0YXJ0RGF0ZTsKKyAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSBjYWxjRW5kRGF0ZTsKKyAgICAgICAgICAgIGlmIChjYWxjRGlyZWN0aW9uID09IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5Gb3J3YXJkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGNTdGFydERhdGUgPSBzdGFydERhdGUuRGF0ZTsKKyAgICAgICAgICAgICAgICBjYWxjRW5kRGF0ZSA9IGVuZERhdGUuRGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxjU3RhcnREYXRlID0gZW5kRGF0ZS5EYXRlOworICAgICAgICAgICAgICAgIGNhbGNFbmREYXRlID0gc3RhcnREYXRlLkRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbldob2xlV2Vla3MgPSAoaW50KWNhbGNFbmREYXRlLlN1YnRyYWN0KGNhbGNTdGFydERhdGUpLlRvdGFsRGF5cy83OworICAgICAgICAgICAgdmFyIHdvcmtkYXlzQ291bnRlZCA9IG5XaG9sZVdlZWtzKl9ob2xpZGF5V2Vla2RheXMuTnVtYmVyT2ZXb3JrZGF5c1BlcldlZWs7CisgICAgICAgICAgICBpZiAoIV9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheShjYWxjU3RhcnREYXRlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JrZGF5c0NvdW50ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB0bXBEYXRlID0gY2FsY1N0YXJ0RGF0ZS5BZGREYXlzKG5XaG9sZVdlZWtzKjcpOworICAgICAgICAgICAgd2hpbGUgKHRtcERhdGUgPCBjYWxjRW5kRGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKDEpOworICAgICAgICAgICAgICAgIGlmICghX2hvbGlkYXlXZWVrZGF5cy5Jc0hvbGlkYXlXZWVrZGF5KHRtcERhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd29ya2RheXNDb3VudGVkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCh3b3JrZGF5c0NvdW50ZWQsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgY2FsY0RpcmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgQ2FsY3VsYXRlV29ya2RheShTeXN0ZW0uRGF0ZVRpbWUgc3RhcnREYXRlLCBpbnQgbldvcmtEYXlzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2FsY0RpcmVjdGlvbiA9IG5Xb3JrRGF5cyA+IDAgPyBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCA6IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5CYWNrd2FyZDsKKyAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSAoaW50KSBjYWxjRGlyZWN0aW9uOworICAgICAgICAgICAgbldvcmtEYXlzICo9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgIHZhciB3b3JrZGF5c0NvdW50ZWQgPSAwOworICAgICAgICAgICAgdmFyIHRtcERhdGUgPSBzdGFydERhdGU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB3aG9sZSB3ZWVrcworICAgICAgICAgICAgdmFyIG5XaG9sZVdlZWtzID0gbldvcmtEYXlzIC8gX2hvbGlkYXlXZWVrZGF5cy5OdW1iZXJPZldvcmtkYXlzUGVyV2VlazsKKyAgICAgICAgICAgIHRtcERhdGUgPSB0bXBEYXRlLkFkZERheXMobldob2xlV2Vla3MgKiA3ICogZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHdvcmtkYXlzQ291bnRlZCArPSBuV2hvbGVXZWVrcyAqIF9ob2xpZGF5V2Vla2RheXMuTnVtYmVyT2ZXb3JrZGF5c1BlcldlZWs7CisKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVzdAorICAgICAgICAgICAgd2hpbGUgKHdvcmtkYXlzQ291bnRlZCA8IG5Xb3JrRGF5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCFfaG9saWRheVdlZWtkYXlzLklzSG9saWRheVdlZWtkYXkodG1wRGF0ZSkpIHdvcmtkYXlzQ291bnRlZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCh3b3JrZGF5c0NvdW50ZWQsIHN0YXJ0RGF0ZSwgdG1wRGF0ZSwgY2FsY0RpcmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgUmVkdWNlV29ya2RheXNXaXRoSG9saWRheXMoV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgY2FsY3VsYXRlZFJlc3VsdCwKKyAgICAgICAgICAgIEZ1bmN0aW9uQXJndW1lbnQgaG9saWRheUFyZ3VtZW50KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gY2FsY3VsYXRlZFJlc3VsdC5TdGFydERhdGU7CisgICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IGNhbGN1bGF0ZWRSZXN1bHQuRW5kRGF0ZTsKKyAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsRGF5cyA9IG5ldyBBZGRpdGlvbmFsSG9saWRheURheXMoaG9saWRheUFyZ3VtZW50KTsKKyAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSBjYWxjU3RhcnREYXRlOworICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGNhbGNFbmREYXRlOworICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZSA8IGVuZERhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsY1N0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKKyAgICAgICAgICAgICAgICBjYWxjRW5kRGF0ZSA9IGVuZERhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsY1N0YXJ0RGF0ZSA9IGVuZERhdGU7CisgICAgICAgICAgICAgICAgY2FsY0VuZERhdGUgPSBzdGFydERhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbkFkZGl0aW9uYWxIb2xpZGF5RGF5cyA9IGFkZGl0aW9uYWxEYXlzLkFkZGl0aW9uYWxEYXRlcy5Db3VudCh4ID0+IHggPj0gY2FsY1N0YXJ0RGF0ZSAmJiB4IDw9IGNhbGNFbmREYXRlICYmICFfaG9saWRheVdlZWtkYXlzLklzSG9saWRheVdlZWtkYXkoeCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdChjYWxjdWxhdGVkUmVzdWx0Lk51bWJlck9mV29ya2RheXMgLSBuQWRkaXRpb25hbEhvbGlkYXlEYXlzLCBzdGFydERhdGUsIGVuZERhdGUsIGNhbGN1bGF0ZWRSZXN1bHQuRGlyZWN0aW9uKTsKKyAgICAgICAgfSAKKworICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgQWRqdXN0UmVzdWx0V2l0aEhvbGlkYXlzKFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0IGNhbGN1bGF0ZWRSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ3VtZW50IGhvbGlkYXlBcmd1bWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IGNhbGN1bGF0ZWRSZXN1bHQuU3RhcnREYXRlOworICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBjYWxjdWxhdGVkUmVzdWx0LkVuZERhdGU7CisgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gY2FsY3VsYXRlZFJlc3VsdC5EaXJlY3Rpb247CisgICAgICAgICAgICB2YXIgd29ya2RheXNDb3VudGVkID0gY2FsY3VsYXRlZFJlc3VsdC5OdW1iZXJPZldvcmtkYXlzOworICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxEYXlzID0gbmV3IEFkZGl0aW9uYWxIb2xpZGF5RGF5cyhob2xpZGF5QXJndW1lbnQpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRhdGUgaW4gYWRkaXRpb25hbERheXMuQWRkaXRpb25hbERhdGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkZvcndhcmQgJiYgKGRhdGUgPCBzdGFydERhdGUgfHwgZGF0ZSA+IGVuZERhdGUpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5CYWNrd2FyZCAmJiAoZGF0ZSA+IHN0YXJ0RGF0ZSB8fCBkYXRlIDwgZW5kRGF0ZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChfaG9saWRheVdlZWtkYXlzLklzSG9saWRheVdlZWtkYXkoZGF0ZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHZhciB0bXBEYXRlID0gX2hvbGlkYXlXZWVrZGF5cy5HZXROZXh0V29ya2RheShlbmREYXRlLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgIHdoaWxlIChhZGRpdGlvbmFsRGF5cy5BZGRpdGlvbmFsRGF0ZXMuQ29udGFpbnModG1wRGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXBEYXRlID0gX2hvbGlkYXlXZWVrZGF5cy5HZXROZXh0V29ya2RheSh0bXBEYXRlLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrZGF5c0NvdW50ZWQrKzsKKyAgICAgICAgICAgICAgICBlbmREYXRlID0gdG1wRGF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCh3b3JrZGF5c0NvdW50ZWQsIGNhbGN1bGF0ZWRSZXN1bHQuU3RhcnREYXRlLCBlbmREYXRlLCBkaXJlY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRvclJlc3VsdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0b3JSZXN1bHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwYzVkOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0b3JSZXN1bHQuY3MKQEAgLTAsMCArMSwyNiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUuV29ya2RheXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQKKyAgICB7CisgICAgICAgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdChpbnQgbnVtYmVyT2ZXb3JrZGF5cywgU3lzdGVtLkRhdGVUaW1lIHN0YXJ0RGF0ZSwgU3lzdGVtLkRhdGVUaW1lIGVuZERhdGUsIFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbiBkaXJlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIE51bWJlck9mV29ya2RheXMgPSBudW1iZXJPZldvcmtkYXlzOworICAgICAgICAgICAgU3RhcnREYXRlID0gc3RhcnREYXRlOworICAgICAgICAgICAgRW5kRGF0ZSA9IGVuZERhdGU7CisgICAgICAgICAgICBEaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IE51bWJlck9mV29ya2RheXMgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgU3lzdGVtLkRhdGVUaW1lIFN0YXJ0RGF0ZSB7IGdldDsgfQorCisgICAgICAgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgRW5kRGF0ZSB7IGdldDsgfQorICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uIERpcmVjdGlvbiB7IGdldDsgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9ZZWFyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9ZZWFyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGI1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1llYXIuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQoreworICAgIHB1YmxpYyBjbGFzcyBZZWFyIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgZGF0ZU9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7CisgICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZTsKKyAgICAgICAgICAgIGlmIChkYXRlT2JqIGlzIHN0cmluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLlBhcnNlKGRhdGVPYmouVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGQgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuWWVhciwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1llYXJmcmFjLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9ZZWFyZnJhYy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2YzOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9ZZWFyZnJhYy5jcwpAQCAtMCwwICsxLDg5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgWWVhcmZyYWMgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIGRhdGUxTnVtID0gQXJnVG9EZWNpbWFsKGZ1bmN0aW9uQXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBkYXRlMk51bSA9IEFyZ1RvRGVjaW1hbChmdW5jdGlvbkFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICBpZiAoZGF0ZTFOdW0gPiBkYXRlMk51bSkgLy9Td2l0Y2ggdG8gbWFrZSBkYXRlMSB0aGUgbG93ZXN0IGRhdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdCA9IGRhdGUxTnVtOworICAgICAgICAgICAgICAgIGRhdGUxTnVtID0gZGF0ZTJOdW07CisgICAgICAgICAgICAgICAgZGF0ZTJOdW0gPSB0OworICAgICAgICAgICAgICAgIHZhciBmYSA9IGZ1bmN0aW9uQXJndW1lbnRzWzFdOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJndW1lbnRzWzFdID0gZnVuY3Rpb25Bcmd1bWVudHNbMF07CisgICAgICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHNbMF0gPSBmYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBkYXRlMSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGUxTnVtKTsKKyAgICAgICAgICAgIHZhciBkYXRlMiA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGUyTnVtKTsKKworICAgICAgICAgICAgdmFyIGJhc2lzID0gMDsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5Db3VudCgpID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNpcyA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGJhc2lzIDwgMCB8fCBiYXNpcyA+IDQsIGVFcnJvclR5cGUuTnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBmdW5jID0gY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5HZXRGdW5jdGlvbigiZGF5czM2MCIpOworICAgICAgICAgICAgdmFyIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICBzd2l0Y2ggKGJhc2lzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIGQzNjBSZXN1bHQgPSBTeXN0ZW0uTWF0aC5BYnMoZnVuYy5FeGVjdXRlKGZ1bmN0aW9uQXJndW1lbnRzLCBjb250ZXh0KS5SZXN1bHROdW1lcmljKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwcm9kdWNpbmcgZXhjZWxzIGJlaGF2aW91cgorICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZTEuTW9udGggPT0gMiAmJiBkYXRlMi5EYXk9PTMxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF5c0luRmViID0gY2FsZW5kYXIuSXNMZWFwWWVhcihkYXRlMS5ZZWFyKSA/IDI5IDogMjg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZTEuRGF5ID09IGRheXNJbkZlYikgZDM2MFJlc3VsdCsrOyAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkMzYwUmVzdWx0IC8gMzYwZCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkFicygoZGF0ZTIgLSBkYXRlMSkuVG90YWxEYXlzIC8gQ2FsY3VsYXRlQWN1dGFsWWVhcihkYXRlMSwgZGF0ZTIpKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkFicygoZGF0ZTIgLSBkYXRlMSkuVG90YWxEYXlzIC8gMzYwZCksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5BYnMoKGRhdGUyIC0gZGF0ZTEpLlRvdGFsRGF5cyAvIDM2NWQpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gZnVuY3Rpb25Bcmd1bWVudHMuVG9MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlPyByZXN1bHQgPSBTeXN0ZW0uTWF0aC5BYnMoZnVuYy5FeGVjdXRlKGFyZ3MsIGNvbnRleHQpLlJlc3VsdE51bWVyaWMgLyAzNjBkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQuVmFsdWUsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlQWN1dGFsWWVhcihTeXN0ZW0uRGF0ZVRpbWUgZHQxLCBTeXN0ZW0uRGF0ZVRpbWUgZHQyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2FsZW5kYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgICAgIHZhciBwZXJZZWFyID0gMGQ7CisgICAgICAgICAgICB2YXIgblllYXJzID0gZHQyLlllYXIgLSBkdDEuWWVhciArIDE7CisgICAgICAgICAgICBmb3IgKHZhciB5ID0gZHQxLlllYXI7IHkgPD0gZHQyLlllYXI7ICsreSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZXJZZWFyICs9IGNhbGVuZGFyLklzTGVhcFllYXIoeSkgPyAzNjYgOiAzNjU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3IFN5c3RlbS5EYXRlVGltZShkdDEuWWVhciArIDEsIGR0MS5Nb250aCwgZHQxLkRheSkgPj0gZHQyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ZZWFycyA9IDE7CisgICAgICAgICAgICAgICAgcGVyWWVhciA9IDM2NTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXIuSXNMZWFwWWVhcihkdDEuWWVhcikgJiYgZHQxLk1vbnRoIDw9IDIpCisgICAgICAgICAgICAgICAgICAgIHBlclllYXIgPSAzNjY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2FsZW5kYXIuSXNMZWFwWWVhcihkdDIuWWVhcikgJiYgZHQyLk1vbnRoID4gMikKKyAgICAgICAgICAgICAgICAgICAgcGVyWWVhciA9IDM2NjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkdDIuTW9udGggPT0gMiAmJiBkdDIuRGF5ID09IDI5KQorICAgICAgICAgICAgICAgICAgICBwZXJZZWFyID0gMzY2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBlclllYXIvKGRvdWJsZSkgblllYXJzOyAgCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWJmODUwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5jcwpAQCAtMCwwICsxLDQ1IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTI2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBEZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvciA6IENvbXBpbGVSZXN1bHRWYWxpZGF0b3IKKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZhbGlkYXRlKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW0gPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05hTihudW0pIHx8IGRvdWJsZS5Jc0luZmluaXR5KG51bSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk51bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RvdWJsZUFyZ3VtZW50UGFyc2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Eb3VibGVBcmd1bWVudFBhcnNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjE0OTA5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Eb3VibGVBcmd1bWVudFBhcnNlci5jcwpAQCAtMCwwICsxLDU5IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyB1dGlsPU9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBEb3VibGVBcmd1bWVudFBhcnNlciA6IEFyZ3VtZW50UGFyc2VyCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFBhcnNlKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChvYmopLk5hbWVkKCJhcmd1bWVudCIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgaWYgKG9iaiBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByPSgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylvYmopLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHIgPT0gbnVsbCA/IDAgOiByLlZhbHVlRG91YmxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iaiBpcyBkb3VibGUpIHJldHVybiBvYmo7CisgICAgICAgICAgICBpZiAob2JqLklzTnVtZXJpYygpKSByZXR1cm4gdXRpbC5Db252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgdmFyIHN0ciA9IG9iaiAhPSBudWxsID8gb2JqLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKHN0cixDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoLy8gKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyMWIwYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlci5jcwpAQCAtMCwwICsxLDg5IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIDogQ29sbGVjdGlvbkZsYXR0ZW5lcjxkb3VibGU+CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IENvbnZlcnRBcmdzKGJvb2wgaWdub3JlSGlkZGVuLCBib29sIGlnbm9yZUVycm9ycywgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5GdW5jQXJnc1RvRmxhdEVudW1lcmFibGUoYXJndW1lbnRzLCAoYXJnLCBhcmdMaXN0KSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpZ25vcmVFcnJvcnMgJiYgY2VsbC5Jc0V4Y2VsRXJyb3IpIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oRXhjZWxFcnJvclZhbHVlLlBhcnNlKGNlbGwuVmFsdWUuVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2VsbFN0YXRlSGVscGVyLlNob3VsZElnbm9yZShpZ25vcmVIaWRkZW4sIGNlbGwsIGNvbnRleHQpICYmIENvbnZlcnRVdGlsLklzTnVtZXJpYyhjZWxsLlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKGNlbGwuVmFsdWVEb3VibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighaWdub3JlRXJyb3JzICYmIGFyZy5WYWx1ZUlzRXhjZWxFcnJvcikgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihhcmcuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZy5WYWx1ZSkgJiYgIUNlbGxTdGF0ZUhlbHBlci5TaG91bGRJZ25vcmUoaWdub3JlSGlkZGVuLCBhcmcsIGNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IENvbnZlcnRBcmdzSW5jbHVkaW5nT3RoZXJUeXBlcyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlLkZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShhcmd1bWVudHMsIChhcmcsIGFyZ0xpc3QpID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy92YXIgY2VsbEluZm8gPSBhcmcuVmFsdWUgYXMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuQ2VsbEluZm87CisgICAgICAgICAgICAgICAgLy92YXIgdmFsdWUgPSBjZWxsSW5mbyAhPSBudWxsID8gY2VsbEluZm8uVmFsdWUgOiBhcmcuVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJnLlZhbHVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0LkFkZChjZWxsLlZhbHVlRG91YmxlTG9naWNhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBkb3VibGUgfHwgYXJnLlZhbHVlIGlzIGludCB8fCBhcmcuVmFsdWUgaXMgYm9vbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJnTGlzdC5BZGQoQ29udmVydC5Ub0RvdWJsZShhcmcuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcuVmFsdWUgaXMgc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0LkFkZCgwZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXJyb3JIYW5kbGluZ0Z1bmN0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9FcnJvckhhbmRsaW5nRnVuY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjNzNlZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXJyb3JIYW5kbGluZ0Z1bmN0aW9uLmNzCkBAIC0wLDAgKzEsNjAgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgZnVuY3Rpb25zIHRoYXQgaGFuZGxlcyBhbiBlcnJvciB0aGF0IG9jY3VycyBkdXJpbmcgdGhlCisgICAgLy8vIG5vcm1hbCBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLgorICAgIC8vLyBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyB0aGUgRXhlY3V0ZS1jYWxsIHRoYXQgZXhjZXB0aW9uIHdpbGwgYmUKKyAgICAvLy8gY2F1Z2h0IGJ5IHRoZSBjb21waWxlciwgdGhlbiB0aGUgSGFuZGxlRXJyb3ItbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEVycm9ySGFuZGxpbmdGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBhbiBFcnJvckhhbmRsaW5nRnVuY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzRXJyb3JIYW5kbGluZ0Z1bmN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSB0aGUgZXJyb3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JDb2RlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ29tcGlsZVJlc3VsdCBIYW5kbGVFcnJvcihzdHJpbmcgZXJyb3JDb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0V4Y2VsRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0V4Y2VsRnVuY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMzU2OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvbi5jcwpAQCAtMCwwICsxLDQ1MyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgRXhjZWwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBFeGNlbEZ1bmN0aW9uKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgQXJndW1lbnRDb2xsZWN0aW9uVXRpbCgpLCBuZXcgQXJndW1lbnRQYXJzZXJzKCksIG5ldyBDb21waWxlUmVzdWx0VmFsaWRhdG9ycygpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbEZ1bmN0aW9uKAorICAgICAgICAgICAgQXJndW1lbnRDb2xsZWN0aW9uVXRpbCBhcmd1bWVudENvbGxlY3Rpb25VdGlsLCAKKyAgICAgICAgICAgIEFyZ3VtZW50UGFyc2VycyBhcmd1bWVudFBhcnNlcnMsCisgICAgICAgICAgICBDb21waWxlUmVzdWx0VmFsaWRhdG9ycyBjb21waWxlUmVzdWx0VmFsaWRhdG9ycykKKyAgICAgICAgeworICAgICAgICAgICAgX2FyZ3VtZW50Q29sbGVjdGlvblV0aWwgPSBhcmd1bWVudENvbGxlY3Rpb25VdGlsOworICAgICAgICAgICAgX2FyZ3VtZW50UGFyc2VycyA9IGFyZ3VtZW50UGFyc2VyczsKKyAgICAgICAgICAgIF9jb21waWxlUmVzdWx0VmFsaWRhdG9ycyA9IGNvbXBpbGVSZXN1bHRWYWxpZGF0b3JzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudENvbGxlY3Rpb25VdGlsIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFyZ3VtZW50UGFyc2VycyBfYXJndW1lbnRQYXJzZXJzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRWYWxpZGF0b3JzIF9jb21waWxlUmVzdWx0VmFsaWRhdG9yczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPkFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24sIGVhY2ggYXJndW1lbnQgY2FuIGNvbnRhaW4gcHJpbWl0aXZlIHR5cGVzLCBsaXN0cyBvciA8c2VlIGNyZWY9IkV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8iPkV4Y2VsIHJhbmdlczwvc2VlPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIDxzZWUgY3JlZj0iUGFyc2luZ0NvbnRleHQiLz4gY29udGFpbnMgdmFyaW91cyBkYXRhIHRoYXQgY2FuIGJlIHVzZWZ1bCBpbiBmdW5jdGlvbnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJDb21waWxlUmVzdWx0Ii8+IGNvbnRhaW5pbmcgdGhlIGNhbGN1bGF0ZWQgdmFsdWU8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiBvdmVycmlkZGVuLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIEV4ZWN1dGUgaXMgY2FsbGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVmb3JlSW52b2tlKFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNMb29rdXBGdWN0aW9uIAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0IAorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IAorICAgICAgICAgICAgfSAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNFcnJvckhhbmRsaW5nRnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIGZvciBzb21lIExvb2t1cGZ1bmN0aW9ucyB0byBpbmRpY2F0ZSB0aGF0IGZ1bmN0aW9uIGFyZ3VtZW50cyBzaG91bGQKKyAgICAgICAgLy8vIG5vdCBiZSBjb21waWxlZCBiZWZvcmUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2tpcEFyZ3VtZW50RXZhbHVhdGlvbiB7IGdldDsgc2V0OyB9CisgICAgICAgIHByb3RlY3RlZCBvYmplY3QgR2V0Rmlyc3RWYWx1ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmcgPSAoKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KXZhbCkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vdmFyIHI9KChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZyk7CisgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmcuVmFsdWVBc1JhbmdlSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gci5HZXRWYWx1ZShyLkFkZHJlc3MuX2Zyb21Sb3csIHIuQWRkcmVzcy5fZnJvbUNvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFyZz09bnVsbD9udWxsOmFyZy5WYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGZ1bmN0aW9ucyB2YWxpZGF0ZXMgdGhhdCB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImFyZ3VtZW50cyIvPiBjb250YWlucyBhdCBsZWFzdAorICAgICAgICAvLy8gKHRoZSB2YWx1ZSBvZikgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBlbGVtZW50cy4gSWYgb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4KKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyI+RXhjZWwgcmFuZ2U8L3NlZT4gdGhlIG51bWJlciBvZiBjZWxscyBpbgorICAgICAgICAvLy8gdGhhdCByYW5nZSB3aWxsIGJlIGNvdW50ZWQgYXMgd2VsbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWluTGVuZ3RoIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yVHlwZVRvVGhyb3ciPlRoZSA8c2VlIGNyZWY9ImVFcnJvclR5cGUiLz4gb2YgdGhlIDxzZWUgY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIi8+IHRoYXQgd2lsbCBiZSB0aHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBpcyBub3QgbWV0LjwvcGFyYW0+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFZhbGlkYXRlQXJndW1lbnRzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IG1pbkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUVycm9yVHlwZSBlcnJvclR5cGVUb1Rocm93KQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzKS5OYW1lZCgiYXJndW1lbnRzIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbkFyZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkFueSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQXJncysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuQXJncyA+PSBtaW5MZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLklzRXhjZWxSYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5BcmdzICs9IGFyZy5WYWx1ZUFzUmFuZ2VJbmZvLkdldE5DZWxscygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobkFyZ3MgPj0gbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0sIGVycm9yVHlwZVRvVGhyb3cpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBmdW5jdGlvbnMgdmFsaWRhdGVzIHRoYXQgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJhcmd1bWVudHMiLz4gY29udGFpbnMgYXQgbGVhc3QKKyAgICAgICAgLy8vICh0aGUgdmFsdWUgb2YpIDxwYXJhbXJlZiBuYW1lPSJtaW5MZW5ndGgiLz4gZWxlbWVudHMuIElmIG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIGFuCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IkV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8iPkV4Y2VsIHJhbmdlPC9zZWU+IHRoZSBudW1iZXIgb2YgY2VsbHMgaW4KKyAgICAgICAgLy8vIHRoYXQgcmFuZ2Ugd2lsbCBiZSBjb3VudGVkIGFzIHdlbGwuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1pbkxlbmd0aCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBWYWxpZGF0ZUFyZ3VtZW50cyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBtaW5MZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMpLk5hbWVkKCJhcmd1bWVudHMiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5BcmdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5BbnkoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkFyZ3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobkFyZ3MgPj0gbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQXJncyArPSBhcmcuVmFsdWVBc1JhbmdlSW5mby5HZXROQ2VsbHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5BcmdzID49IG1pbkxlbmd0aCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9LCAiRXhwZWN0aW5nIGF0IGxlYXN0IHswfSBhcmd1bWVudHMiLCBtaW5MZW5ndGguVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgYXR0IHRoZSBwb3NpdGlvbiBvZiB0aGUgMC1iYXNlZAorICAgICAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImluZGV4Ii8+IGFzIGFuIGludGVnZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGFuIGludGVnZXIuPC9yZXR1cm5zPgorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICAgICAgICBwcm90ZWN0ZWQgaW50IEFyZ1RvSW50KElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsID0gYXJndW1lbnRzLkVsZW1lbnRBdChpbmRleCkuVmFsdWVGaXJzdDsKKyAgICAgICAgICAgIHJldHVybiAoaW50KV9hcmd1bWVudFBhcnNlcnMuR2V0UGFyc2VyKERhdGFUeXBlLkludGVnZXIpLlBhcnNlKHZhbCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgYXR0IHRoZSBwb3NpdGlvbiBvZiB0aGUgMC1iYXNlZAorICAgICAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImluZGV4Ii8+IGFzIGEgc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50cyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlZhbHVlIG9mIHRoZSBhcmd1bWVudCBhcyBhIHN0cmluZy48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgQXJnVG9TdHJpbmcoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBvYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KGluZGV4KS5WYWx1ZUZpcnN0OworICAgICAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsID8gb2JqLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgYXR0IHRoZSBwb3NpdGlvbiBvZiB0aGUgMC1iYXNlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9iaiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlZhbHVlIG9mIHRoZSBhcmd1bWVudCBhcyBhIGRvdWJsZS48L3JldHVybnM+CisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiI+PC9leGNlcHRpb24+CisgICAgICAgIHByb3RlY3RlZCBkb3VibGUgQXJnVG9EZWNpbWFsKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoZG91YmxlKV9hcmd1bWVudFBhcnNlcnMuR2V0UGFyc2VyKERhdGFUeXBlLkRlY2ltYWwpLlBhcnNlKG9iaik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgYXR0IHRoZSBwb3NpdGlvbiBvZiB0aGUgMC1iYXNlZAorICAgICAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImluZGV4Ii8+IGFzIGEgPHNlZSBjcmVmPSJTeXN0ZW0uRG91YmxlIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50cyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlZhbHVlIG9mIHRoZSBhcmd1bWVudCBhcyBhbiBpbnRlZ2VyLjwvcmV0dXJucz4KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KKyAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBBcmdUb0RlY2ltYWwoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLkVsZW1lbnRBdChpbmRleCkuVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBEaXZpZGUoZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5NYXRoLkFicyhyaWdodCAtIDBkKSA8IGRvdWJsZS5FcHNpbG9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5EaXYwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZWZ0L3JpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgSXNOdW1lcmljU3RyaW5nKG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUuVG9TdHJpbmcoKSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBSZWdleC5Jc01hdGNoKHZhbHVlLlRvU3RyaW5nKCksIEAiXltcZF0rKFwsW1xkXSk/Iik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgYXJndW1lbnQgaXMgYSBib29sZWFuIHZhbHVlIGl0cyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICAvLy8gSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGludGVnZXIgdmFsdWUsIHRydWUgd2lsbCBiZSByZXR1cm5lZCBpZiBpdHMKKyAgICAgICAgLy8vIHZhbHVlIGlzIG5vdCAwLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBBcmdUb0Jvb2woSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBvYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KGluZGV4KS5WYWx1ZSA/PyBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICByZXR1cm4gKGJvb2wpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuQm9vbGVhbikuUGFyc2Uob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRocm93cyBhbiA8c2VlIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIi8+IGlmIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4gZXZhbHVhdGVzIHRvIHRydWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgVGhyb3dBcmd1bWVudEV4Y2VwdGlvbklmKEZ1bmM8Ym9vbD4gY29uZGl0aW9uLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbmRpdGlvbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRocm93cyBhbiA8c2VlIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIi8+IGlmIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4gZXZhbHVhdGVzIHRvIHRydWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybWF0cyI+Rm9ybWF0cyB0byB0aGUgbWVzc2FnZSBzdHJpbmcuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgVGhyb3dBcmd1bWVudEV4Y2VwdGlvbklmKEZ1bmM8Ym9vbD4gY29uZGl0aW9uLCBzdHJpbmcgbWVzc2FnZSwgcGFyYW1zIG9iamVjdFtdIGZvcm1hdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzdHJpbmcuRm9ybWF0KG1lc3NhZ2UsIGZvcm1hdHMpOworICAgICAgICAgICAgVGhyb3dBcmd1bWVudEV4Y2VwdGlvbklmKGNvbmRpdGlvbiwgbWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaHJvd3MgYW4gPHNlZSBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iLz4gd2l0aCB0aGUgZ2l2ZW4gPHBhcmFtcmVmIG5hbWU9ImVycm9yVHlwZSIvPiBzZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JUeXBlIj48L3BhcmFtPgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlIGVycm9yVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigiQW4gZXhjZWwgZnVuY3Rpb24gZXJyb3Igb2NjdXJyZWQiLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVycm9yVHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iLz4gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JUeXBlIj48L3BhcmFtPgorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKEZ1bmM8Ym9vbD4gY29uZGl0aW9uLCBlRXJyb3JUeXBlIGVycm9yVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbmRpdGlvbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oIkFuIGV4Y2VsIGZ1bmN0aW9uIGVycm9yIG9jY3VycmVkIiwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlcnJvclR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sIElzTnVtZXJpYyhvYmplY3QgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAodmFsLkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSB8fCB2YWwgaXMgZG91YmxlIHx8IHZhbCBpcyBkZWNpbWFsICB8fCB2YWwgaXMgU3lzdGVtLkRhdGVUaW1lIHx8IHZhbCBpcyBUaW1lU3Bhbik7CisgICAgICAgIH0KKworICAgICAgICAvL3Byb3RlY3RlZCB2aXJ0dWFsIGJvb2wgSXNOdW1iZXIob2JqZWN0IG9iaikKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyAgICByZXR1cm4gKG9iaiBpcyBpbnQgfHwgb2JqIGlzIGRvdWJsZSB8fCBvYmogaXMgc2hvcnQgfHwgb2JqIGlzIGRlY2ltYWwgfHwgb2JqIGlzIGxvbmcpOworICAgICAgICAvL30KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIZWxwZXIgbWV0aG9kIGZvciBjb21wYXJpc29uIG9mIHR3byBkb3VibGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImQxIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImQyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBBcmVFcXVhbChkb3VibGUgZDEsIGRvdWJsZSBkMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5NYXRoLkFicyhkMSAtIGQyKSA8IGRvdWJsZS5FcHNpbG9uOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2lsbCByZXR1cm4gdGhlIGFyZ3VtZW50cyBhcyBhbiBlbnVtZXJhYmxlIG9mIGRvdWJsZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdpbGwgcmV0dXJuIHRoZSBhcmd1bWVudHMgYXMgYW4gZW51bWVyYWJsZSBvZiBkb3VibGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlnbm9yZUhpZGRlbkNlbGxzIj5JZiBhIGNlbGwgaXMgaGlkZGVuIGFuZCB0aGlzIHZhbHVlIGlzIHRydWUgdGhlIHZhbHVlIG9mIHRoYXQgY2VsbCB3aWxsIGJlIGlnbm9yZWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlnbm9yZUVycm9ycyI+SWYgYSBjZWxsIGNvbnRhaW5zIGFuIGVycm9yLCB0aGF0IGVycm9yIHdpbGwgYmUgaWdub3JlZCBpZiB0aGlzIG1ldGhvZCBpcyBzZXQgdG8gdHJ1ZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShib29sIGlnbm9yZUhpZGRlbkNlbGxzLCBib29sIGlnbm9yZUVycm9ycywgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50Q29sbGVjdGlvblV0aWwuQXJnc1RvRG91YmxlRW51bWVyYWJsZShpZ25vcmVIaWRkZW5DZWxscywgaWdub3JlRXJyb3JzLCBhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2lsbCByZXR1cm4gdGhlIGFyZ3VtZW50cyBhcyBhbiBlbnVtZXJhYmxlIG9mIGRvdWJsZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaWdub3JlSGlkZGVuQ2VsbHMiPklmIGEgY2VsbCBpcyBoaWRkZW4gYW5kIHRoaXMgdmFsdWUgaXMgdHJ1ZSB0aGUgdmFsdWUgb2YgdGhhdCBjZWxsIHdpbGwgYmUgaWdub3JlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShib29sIGlnbm9yZUhpZGRlbkNlbGxzLCBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGlnbm9yZUhpZGRlbkNlbGxzLCB0cnVlLCBhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2lsbCByZXR1cm4gdGhlIGFyZ3VtZW50cyBhcyBhbiBlbnVtZXJhYmxlIG9mIG9iamVjdHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaWdub3JlSGlkZGVuQ2VsbHMiPklmIGEgY2VsbCBpcyBoaWRkZW4gYW5kIHRoaXMgdmFsdWUgaXMgdHJ1ZSB0aGUgdmFsdWUgb2YgdGhhdCBjZWxsIHdpbGwgYmUgaWdub3JlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElFbnVtZXJhYmxlPG9iamVjdD4gQXJnc1RvT2JqZWN0RW51bWVyYWJsZShib29sIGlnbm9yZUhpZGRlbkNlbGxzLCBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRDb2xsZWN0aW9uVXRpbC5BcmdzVG9PYmplY3RFbnVtZXJhYmxlKGlnbm9yZUhpZGRlbkNlbGxzLCBhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIHJlc3VsdCB0byByZXR1cm4gZnJvbSBFeGNlbCBmdW5jdGlvbnMuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc3VsdCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhVHlwZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJvdGVjdGVkIENvbXBpbGVSZXN1bHQgQ3JlYXRlUmVzdWx0KG9iamVjdCByZXN1bHQsIERhdGFUeXBlIGRhdGFUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsaWRhdG9yID0gX2NvbXBpbGVSZXN1bHRWYWxpZGF0b3JzLkdldFZhbGlkYXRvcihkYXRhVHlwZSk7CisgICAgICAgICAgICB2YWxpZGF0b3IuVmFsaWRhdGUocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIGRhdGFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSB0aGlzIG1ldGhvZCB0byBhcHBseSBhIGZ1bmN0aW9uIG9uIGEgY29sbGVjdGlvbiBvZiBhcmd1bWVudHMuIFRoZSA8cGFyYW1yZWYgbmFtZT0icmVzdWx0Ii8+CisgICAgICAgIC8vLyBzaG91bGQgYmUgbW9kaWZ5ZWQgaW4gdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJhY3Rpb24iLz4gYW5kIHdpbGwgY29udGFpbiB0aGUgcmVzdWx0CisgICAgICAgIC8vLyBhZnRlciB0aGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZXN1bHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWN0aW9uIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBkb3VibGUgQ2FsY3VsYXRlQ29sbGVjdGlvbihJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBjb2xsZWN0aW9uLCBkb3VibGUgcmVzdWx0LCBGdW5jPEZ1bmN0aW9uQXJndW1lbnQsZG91YmxlLGRvdWJsZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50Q29sbGVjdGlvblV0aWwuQ2FsY3VsYXRlQ29sbGVjdGlvbihjb2xsZWN0aW9uLCByZXN1bHQsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBpZiB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImFyZyI+YXJndW1lbnQ8L3BhcmFtcmVmPiBjb250YWlucyBhbiBFeGNlbCBlcnJvcgorICAgICAgICAvLy8gYW4gPHNlZSBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iLz4gd2l0aCB0aGF0IGVycm9yY29kZSB3aWxsIGJlIHRocm93bgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKEZ1bmN0aW9uQXJndW1lbnQgYXJnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJnLlZhbHVlSXNFeGNlbEVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGFyZy5WYWx1ZUFzRXhjZWxFcnJvclZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImNlbGwiLz4gY29udGFpbnMgYW4gRXhjZWwgZXJyb3IKKyAgICAgICAgLy8vIGFuIDxzZWUgY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIi8+IHdpdGggdGhhdCBlcnJvcmNvZGUgd2lsbCBiZSB0aHJvd24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZWxsIj48L3BhcmFtPgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoRXhjZWxEYXRhUHJvdmlkZXIuSUNlbGxJbmZvIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZWxsLklzRXhjZWxFcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuUGFyc2UoY2VsbC5WYWx1ZS5Ub1N0cmluZygpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIENvbXBpbGVSZXN1bHQgR2V0UmVzdWx0QnlPYmplY3Qob2JqZWN0IHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzTnVtZXJpYyhyZXN1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgaXMgc3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5TdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEV4Y2VsRXJyb3JWYWx1ZS5WYWx1ZXMuSXNFcnJvclZhbHVlKHJlc3VsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkV4Y2VsQWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVSZXN1bHQuRW1wdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRW51bWVyYWJsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uQXJndW1lbnQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uQXJndW1lbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyMjkwNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25Bcmd1bWVudC5jcwpAQCAtMCwwICsxLDk4IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgcHVibGljIGNsYXNzIEZ1bmN0aW9uQXJndW1lbnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBGdW5jdGlvbkFyZ3VtZW50KG9iamVjdCB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBFeGNlbENlbGxTdGF0ZSBfZXhjZWxDZWxsU3RhdGU7CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leGNlbENlbGxTdGF0ZSB8PSBzdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIEV4Y2VsU3RhdGVGbGFnSXNTZXQoRXhjZWxDZWxsU3RhdGUgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoX2V4Y2VsQ2VsbFN0YXRlICYgc3RhdGUpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IFZhbHVlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFZhbHVlICE9IG51bGwgPyBWYWx1ZS5HZXRUeXBlKCkgOiBudWxsOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc0V4Y2VsUmFuZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFZhbHVlICE9IG51bGwgJiYgVmFsdWUgaXMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgVmFsdWVJc0V4Y2VsRXJyb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEV4Y2VsRXJyb3JWYWx1ZS5WYWx1ZXMuSXNFcnJvclZhbHVlKFZhbHVlKTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZSBWYWx1ZUFzRXhjZWxFcnJvclZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBFeGNlbEVycm9yVmFsdWUuUGFyc2UoVmFsdWUuVG9TdHJpbmcoKSk7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvIFZhbHVlQXNSYW5nZUluZm8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFZhbHVlIGFzIEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87IH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb2JqZWN0IFZhbHVlRmlyc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFZhbHVlIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gKChFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pVmFsdWUpLlZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgdiA9IFZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgICAgICAgICAgaWYgKHY9PW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2LkdldFZhbHVlKHYuQWRkcmVzcy5fZnJvbVJvdywgdi5BZGRyZXNzLl9mcm9tQ29sKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25OYW1lUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNGNjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBGdW5jdGlvbk5hbWVQcm92aWRlciA6IElGdW5jdGlvbk5hbWVQcm92aWRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbk5hbWVQcm92aWRlcigpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbk5hbWVQcm92aWRlciBFbXB0eQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IEZ1bmN0aW9uTmFtZVByb3ZpZGVyKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNGdW5jdGlvbk5hbWUoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25SZXBvc2l0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvblJlcG9zaXRvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0YTc2OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25SZXBvc2l0b3J5LmNzCkBAIC0wLDAgKzEsMTIyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGFjY2Vzc2luZy9tb2RpZnlpbmcgVkJBIEZ1bmN0aW9ucy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBGdW5jdGlvblJlcG9zaXRvcnkgOiBJRnVuY3Rpb25OYW1lUHJvdmlkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+IF9mdW5jdGlvbnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmUpOworCisgICAgICAgIHByaXZhdGUgRnVuY3Rpb25SZXBvc2l0b3J5KCkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uUmVwb3NpdG9yeSBDcmVhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVwbyA9IG5ldyBGdW5jdGlvblJlcG9zaXRvcnkoKTsKKyAgICAgICAgICAgIHJlcG8uTG9hZE1vZHVsZShuZXcgQnVpbHRJbkZ1bmN0aW9ucygpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBvOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9hZHMgYSBtb2R1bGUgb2YgPHNlZSBjcmVmPSJFeGNlbEZ1bmN0aW9uIi8+cyB0byB0aGUgZnVuY3Rpb24gcmVwb3NpdG9yeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2R1bGUiPkEgPHNlZSBjcmVmPSJJRnVuY3Rpb25Nb2R1bGUiLz4gdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWRkaW5nIGZ1bmN0aW9uczwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTG9hZE1vZHVsZShJRnVuY3Rpb25Nb2R1bGUgbW9kdWxlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1vZHVsZS5GdW5jdGlvbnMuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbG93ZXJLZXkgPSBrZXkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICBfZnVuY3Rpb25zW2xvd2VyS2V5XSA9IG1vZHVsZS5GdW5jdGlvbnNba2V5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIEV4Y2VsRnVuY3Rpb24gR2V0RnVuY3Rpb24oc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFfZnVuY3Rpb25zLkNvbnRhaW5zS2V5KG5hbWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm9uIHN1cHBvcnRlZCBmdW5jdGlvbjogIiArIG5hbWUpOworICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigiTm9uIHN1cHBvcnRlZCBmdW5jdGlvbjogIiArIG5hbWUsIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2Z1bmN0aW9uc1tuYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSldOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyBhbGwgZnVuY3Rpb25zIGZyb20gdGhlIHJlcG9zaXRvcnkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mdW5jdGlvbnMuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJuYW1lIi8+IGV4aXN0cyBpbiB0aGUgcmVwb3NpdG9yeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBJc0Z1bmN0aW9uTmFtZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9mdW5jdGlvbnMuQ29udGFpbnNLZXkobmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCBpbXBsZW1lbnRlZCBmdW5jdGlvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxzdHJpbmc+IEZ1bmN0aW9uTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9mdW5jdGlvbnMuS2V5czsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBvciByZXBsYWNlcyBhIGZ1bmN0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmN0aW9uTmFtZSI+IENhc2UtaW5zZW5zaXRpdmUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgYWRkZWQgb3IgcmVwbGFjZWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmdW5jdGlvbkltcGwiPkFuIGltcGxlbWVudGF0aW9uIG9mIGFuIDxzZWUgY3JlZj0iRXhjZWxGdW5jdGlvbiIvPi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBBZGRPclJlcGxhY2VGdW5jdGlvbihzdHJpbmcgZnVuY3Rpb25OYW1lLCBFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uSW1wbCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGZ1bmN0aW9uTmFtZSkuTmFtZWQoImZ1bmN0aW9uTmFtZSIpLklzTm90TnVsbE9yRW1wdHkoKTsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChmdW5jdGlvbkltcGwpLk5hbWVkKCJmdW5jdGlvbkltcGwiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIHZhciBmTmFtZSA9IGZ1bmN0aW9uTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgaWYgKF9mdW5jdGlvbnMuQ29udGFpbnNLZXkoZk5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9mdW5jdGlvbnMuUmVtb3ZlKGZOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9mdW5jdGlvbnNbZk5hbWVdID0gZnVuY3Rpb25JbXBsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbnNNb2R1bGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uc01vZHVsZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZkNDJiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbnNNb2R1bGUuY3MKQEAgLTAsMCArMSw0NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFzZSBjbGFzcyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGdW5jdGlvbnNNb2R1bGUgOiBJRnVuY3Rpb25Nb2R1bGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+IF9mdW5jdGlvbnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+KCk7CisKKyAgICAgICAgcHVibGljIElEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4gRnVuY3Rpb25zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfZnVuY3Rpb25zOyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0hpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0hpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5Zjc0NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbi5jcwpAQCAtMCwwICsxLDgwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbnMgdGhhdCBuZWVkcyB0byBoYW5kbGUgY2VsbHMgdGhhdCBpcyBub3QgdmlzaWJsZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0IHRvIHRydWUgb3IgZmFsc2UgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZnVuY3Rpb24gc2hvdWxkIGlnbm9yZSBoaWRkZW4gdmFsdWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBJZ25vcmVIaWRkZW5WYWx1ZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGFyZ3VtZW50cywgY29udGV4dCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgSUVudW1lcmFibGU8ZG91YmxlPiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCwgYm9vbCBpZ25vcmVFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYXJndW1lbnRzLkFueSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlLkVtcHR5PGRvdWJsZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChJZ25vcmVIaWRkZW5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG5vbkhpZGRlbiA9IGFyZ3VtZW50cy5XaGVyZSh4ID0+ICF4LkV4Y2VsU3RhdGVGbGFnSXNTZXQoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCkpOworICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLkFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBub25IaWRkZW4sIGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhc2UuQXJnc1RvRG91YmxlRW51bWVyYWJsZShJZ25vcmVIaWRkZW5WYWx1ZXMsIGlnbm9yZUVycm9ycywgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sIFNob3VsZElnbm9yZShFeGNlbERhdGFQcm92aWRlci5JQ2VsbEluZm8gYywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENlbGxTdGF0ZUhlbHBlci5TaG91bGRJZ25vcmUoSWdub3JlSGlkZGVuVmFsdWVzLCBjLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTaG91bGRJZ25vcmUoRnVuY3Rpb25Bcmd1bWVudCBhcmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJZ25vcmVIaWRkZW5WYWx1ZXMgJiYgYXJnLkV4Y2VsU3RhdGVGbGFnSXNTZXQoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTW9kdWxlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JRnVuY3Rpb25Nb2R1bGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNzYyYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTW9kdWxlLmNzCkBAIC0wLDAgKzEsMzYgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElGdW5jdGlvbk1vZHVsZQorICAgIHsKKyAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBFeGNlbEZ1bmN0aW9uPiBGdW5jdGlvbnMgeyBnZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0lGdW5jdGlvbk5hbWVQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTk5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0lGdW5jdGlvbk5hbWVQcm92aWRlci5jcwpAQCAtMCwwICsxLDM2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgcHVibGljIGludGVyZmFjZSBJRnVuY3Rpb25OYW1lUHJvdmlkZXIKKyAgICB7CisgICAgICAgIGJvb2wgSXNGdW5jdGlvbk5hbWUoc3RyaW5nIG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vRXJyb3JUeXBlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9FcnJvclR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNzQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vRXJyb3JUeXBlLmNzCkBAIC0wLDAgKzEsNjcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbgoreworICAgIHB1YmxpYyBjbGFzcyBFcnJvclR5cGUgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBlcnJvciA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICB2YXIgaXNFcnJvckZ1bmMgPSBjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJpc2Vycm9yIik7CisgICAgICAgICAgICB2YXIgaXNFcnJvclJlc3VsdCA9IGlzRXJyb3JGdW5jLkV4ZWN1dGUoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICghKGJvb2wpIGlzRXJyb3JSZXN1bHQuUmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgZXJyb3JUeXBlID0gZXJyb3IuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZTsKKyAgICAgICAgICAgIGludCByZXRWYWx1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JUeXBlLlR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk51bGw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLkRpdjA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMiwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLlZhbHVlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDMsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5SZWY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk51bToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCg2LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuTkE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNywgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0JsYW5rLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0JsYW5rLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmY2E0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzQmxhbmsuY3MKQEAgLTAsMCArMSw2NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIElzQmxhbmsgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsIHx8IGFyZ3VtZW50cy5Db3VudCgpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB2YXIgcj0oRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylhcmcuVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChyLkdldFZhbHVlKHIuQWRkcmVzcy5fZnJvbVJvdywgci5BZGRyZXNzLl9mcm9tQ29sKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLlZhbHVlICE9IG51bGwgJiYgKGFyZy5WYWx1ZS5Ub1N0cmluZygpICE9IHN0cmluZy5FbXB0eSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzRXJyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vyci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBhNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vyci5jcwpAQCAtMCwwICsxLDQzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIElzRXJyIDogRXJyb3JIYW5kbGluZ0Z1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlzRXJyb3IgPSBuZXcgSXNFcnJvcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGlzRXJyb3IuRXhlY3V0ZShhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICAgICAgaWYgKChib29sKSByZXN1bHQuUmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhcmcgPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgaWYgKGFyZyBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylhcmc7CisgICAgICAgICAgICAgICAgICAgIHZhciBlPXIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpIGFzIEV4Y2VsRXJyb3JWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT1udWxsICYmIGUuVHlwZT09ZUVycm9yVHlwZS5OQSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyBpcyBFeGNlbEVycm9yVmFsdWUgJiYgKChFeGNlbEVycm9yVmFsdWUpYXJnKS5UeXBlPT1lRXJyb3JUeXBlLk5BKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBIYW5kbGVFcnJvcihzdHJpbmcgZXJyb3JDb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vycm9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vycm9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODgzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzRXJyb3IuY3MKQEAgLTAsMCArMSw2OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIElzRXJyb3IgOiBFcnJvckhhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmd1bWVudCBpbiBhcmd1bWVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50LlZhbHVlIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgciA9IChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZ3VtZW50LlZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAoRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5Jc0Vycm9yVmFsdWUoci5HZXRWYWx1ZShyLkFkZHJlc3MuX2Zyb21Sb3csIHIuQWRkcmVzcy5fZnJvbUNvbCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChFeGNlbEVycm9yVmFsdWUuVmFsdWVzLklzRXJyb3JWYWx1ZShhcmd1bWVudC5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBIYW5kbGVFcnJvcihzdHJpbmcgZXJyb3JDb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0V2ZW4uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzRXZlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNlNWFhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0V2ZW4uY3MKQEAgLTAsMCArMSwyNCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KK3sKKyAgICBwdWJsaWMgY2xhc3MgSXNFdmVuIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnMSA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsvL2FyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICBpZiAoIUNvbnZlcnRVdGlsLklzTnVtZXJpYyhhcmcxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBudW1iZXIgPSAoaW50KVN5c3RlbS5NYXRoLkZsb29yKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZzEpKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyICUgMiA9PSAwLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNMb2dpY2FsLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0xvZ2ljYWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2NjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNMb2dpY2FsLmNzCkBAIC0wLDAgKzEsMTkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KK3sKKyAgICBwdWJsaWMgY2xhc3MgSXNMb2dpY2FsIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciB2ID0gR2V0Rmlyc3RWYWx1ZShhcmd1bWVudHMpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2IGlzIGJvb2wsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc05hLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc05hLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODNmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTmEuY3MKQEAgLTAsMCArMSw1MSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIElzTmEgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsIHx8IGFyZ3VtZW50cy5Db3VudCgpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB2ID0gR2V0Rmlyc3RWYWx1ZShhcmd1bWVudHMpOworCisgICAgICAgICAgICBpZiAodiBpcyBFeGNlbEVycm9yVmFsdWUgJiYgKChFeGNlbEVycm9yVmFsdWUpdikuVHlwZT09ZUVycm9yVHlwZS5OQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTm9uVGV4dC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOb25UZXh0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWViOTQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTm9uVGV4dC5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTE1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KK3sKKyAgICBwdWJsaWMgY2xhc3MgSXNOb25UZXh0IDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgICAgICAgICAgaWYgKGZpcnN0QXJnLlZhbHVlID09IG51bGwgfHwgZmlyc3RBcmcuVmFsdWVJc0V4Y2VsRXJyb3IpIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCghKGZpcnN0QXJnLlZhbHVlIGlzIHN0cmluZyksIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc051bWJlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOdW1iZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZjMxYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOdW1iZXIuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/dXNpbmcgU3lzdGVtOworLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIElzTnVtYmVyIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gR2V0Rmlyc3RWYWx1ZShhcmd1bWVudHMpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChJc051bWVyaWMoYXJnKSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzT2RkLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc09kZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM0NWQwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc09kZC5jcwpAQCAtMCwwICsxLDQ4IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTE1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIElzT2RkIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnMSA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsvL2FyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICBpZiAoIUNvbnZlcnRVdGlsLklzTnVtZXJpYyhhcmcxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBudW1iZXIgPSAoaW50KVN5c3RlbS5NYXRoLkZsb29yKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZzEpKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyICUgMiA9PSAxLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNUZXh0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc1RleHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlMmMzYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNUZXh0LmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbgoreworICAgIHB1YmxpYyBjbGFzcyBJc1RleHQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA9PSAxICYmIGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KChHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cykgaXMgc3RyaW5nKSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vTi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vTi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZjN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9OLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCit7CisgICAgcHVibGljIGNsYXNzIE4gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmcgPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChhcmcgaXMgYm9vbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gKGJvb2wpIGFyZyA/IDFkIDogMGQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoSXNOdW1lcmljKGFyZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnIGlzIHN0cmluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyBpcyBFeGNlbEVycm9yVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhcmcsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vTmEuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL05hLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmZjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL05hLmNzCkBAIC0wLDAgKzEsMTYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KK3sKKyAgICBwdWJsaWMgY2xhc3MgTmEgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW50QXJndW1lbnRQYXJzZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0ludEFyZ3VtZW50UGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTNhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0ludEFyZ3VtZW50UGFyc2VyLmNzCkBAIC0wLDAgKzEsNjEgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBJbnRBcmd1bWVudFBhcnNlciA6IEFyZ3VtZW50UGFyc2VyCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFBhcnNlKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChvYmopLk5hbWVkKCJhcmd1bWVudCIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgciA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylvYmopLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHIgPT0gbnVsbCA/IDAgOiBDb252ZXJ0LlRvSW50MzIoci5WYWx1ZURvdWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgb2JqVHlwZSA9IG9iai5HZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAob2JqVHlwZSA9PSB0eXBlb2YoaW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludClvYmo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqVHlwZSA9PSB0eXBlb2YoZG91YmxlKSB8fCBvYmpUeXBlID09IHR5cGVvZihkZWNpbWFsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0ludDMyKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWludC5UcnlQYXJzZShvYmouVG9TdHJpbmcoKSwgb3V0IHJlc3VsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvQW5kLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0FuZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjNiNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0FuZC5jcwpAQCAtMCwwICsxLDQ4IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbAoreworICAgIHB1YmxpYyBjbGFzcyBBbmQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJndW1lbnRzLkNvdW50KCk7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIUFyZ1RvQm9vbChhcmd1bWVudHMsIHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvRmFsc2UuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvRmFsc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2OGYzYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9GYWxzZS5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbAoreworICAgIHB1YmxpYyBjbGFzcyBGYWxzZSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFkZmQzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0lmLmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCit7CisgICAgcHVibGljIGNsYXNzIElmIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgY29uZGl0aW9uID0gQXJnVG9Cb29sKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgZmlyc3RTdGF0ZW1lbnQgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOworICAgICAgICAgICAgdmFyIHNlY29uZFN0YXRlbWVudCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWU7CisgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpOworICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbiA/IGZhY3RvcnkuQ3JlYXRlKGZpcnN0U3RhdGVtZW50KSA6IGZhY3RvcnkuQ3JlYXRlKHNlY29uZFN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZFcnJvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZkVycm9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTU4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZFcnJvci5jcwpAQCAtMCwwICsxLDE4IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgSWZFcnJvciA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzLkZpcnN0KCk7CisgICAgICAgICAgICByZXR1cm4gR2V0UmVzdWx0QnlPYmplY3QoZmlyc3RBcmcuVmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0lmTmEuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZOYS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNkNzEwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0lmTmEuY3MKQEAgLTAsMCArMSwxOCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCit7CisgICAgcHVibGljIGNsYXNzIElmTmEgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50cy5GaXJzdCgpOworICAgICAgICAgICAgcmV0dXJuIEdldFJlc3VsdEJ5T2JqZWN0KGZpcnN0QXJnLlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9Ob3QuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvTm90LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2Q1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvTm90LmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCit7CisgICAgcHVibGljIGNsYXNzIE5vdCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICFBcmdUb0Jvb2woYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL09yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL09yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTA3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvT3IuY3MKQEAgLTAsMCArMSw0OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWwKK3sKKyAgICBwdWJsaWMgY2xhc3MgT3IgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJndW1lbnRzLkNvdW50KCk7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQXJnVG9Cb29sKGFyZ3VtZW50cywgeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9UcnVlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL1RydWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4NWUzZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9UcnVlLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCit7CisgICAgcHVibGljIGNsYXNzIFRydWUgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BYnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQWJzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDEzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQWJzLmNzCkBAIC0wLDAgKzEsNDYgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEFicyA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHZhbCA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgaWYgKHZhbCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsICo9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Fjb3MuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQWNvcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTdkYjExCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Fjb3MuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQWNvcyA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkFyY2NvcyhhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zaC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNkNTMwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Fjb3NoLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEFjb3NoIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KE1hdGhIZWxwZXIuSEFyY2NvcyhhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0FzaW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMGEyZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7CisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTExCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEFzaW4gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQXNpbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luaC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzVkMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0FzaW5oLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEFzaW5oIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KE1hdGhIZWxwZXIuSEFyY3NpbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjNjA5NgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEF0YW4gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQXRhbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuMi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU0NDExCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW4yLmNzCkBAIC0wLDAgKzEsNDQgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEF0YW4yIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgYXJnMSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIGFyZzIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIC8vIEhhZCB0byBzd2l0Y2ggb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyB0byBnZXQgdGhlIHNhbWUgcmVzdWx0IGFzIGluIGV4Y2VsIC9NQQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5BdGFuMihhcmcyLCBhcmcxKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXRhbmguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXRhbmguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3YWI2NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuaC5jcwpAQCAtMCwwICsxLDQyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTExCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBBdGFuaCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkhBcmN0YW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Yzg3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZS5jcwpAQCAtMCwwICsxLDEwOCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXZlcmFnZSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEsIGVFcnJvclR5cGUuRGl2MCk7CisgICAgICAgICAgICBkb3VibGUgblZhbHVlcyA9IDBkLCByZXN1bHQgPSAwZDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENhbGN1bGF0ZShhcmcsIGNvbnRleHQsIHJlZiByZXN1bHQsIHJlZiBuVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRGl2aWRlKHJlc3VsdCwgblZhbHVlcyksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCwgcmVmIGRvdWJsZSByZXRWYWwsIHJlZiBkb3VibGUgblZhbHVlcywgYm9vbCBpc0luQXJyYXkgPSBmYWxzZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShhcmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZShpdGVtLCBjb250ZXh0LCByZWYgcmV0VmFsLCByZWYgblZhbHVlcywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnLklzRXhjZWxSYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBhcmcuVmFsdWVBc1JhbmdlSW5mbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghSXNOdW1lcmljKGMuVmFsdWUpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgblZhbHVlcysrOworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gYy5WYWx1ZURvdWJsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG51bWVyaWNWYWx1ZSA9IEdldE51bWVyaWNWYWx1ZShhcmcuVmFsdWUsIGlzSW5BcnJheSk7CisgICAgICAgICAgICAgICAgaWYgKG51bWVyaWNWYWx1ZS5IYXNWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5WYWx1ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IG51bWVyaWNWYWx1ZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGFyZy5WYWx1ZSBpcyBzdHJpbmcpICYmICFDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcoYXJnLlZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNJbkFycmF5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGU/IEdldE51bWVyaWNWYWx1ZShvYmplY3Qgb2JqLCBib29sIGlzSW5BcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzTnVtZXJpYyhvYmopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKG9iaiBpcyBib29sKSAmJiAhaXNJbkFycmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljU3RyaW5nKG9iaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShvYmouVG9TdHJpbmcoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChkb3VibGU/KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlQS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlQS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ1YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VBLmNzCkBAIC0wLDAgKzEsMTI0IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE0LTAxLTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBBdmVyYWdlQSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEsIGVFcnJvclR5cGUuRGl2MCk7CisgICAgICAgICAgICBkb3VibGUgblZhbHVlcyA9IDBkLCByZXN1bHQgPSAwZDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENhbGN1bGF0ZShhcmcsIGNvbnRleHQsIHJlZiByZXN1bHQsIHJlZiBuVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRGl2aWRlKHJlc3VsdCwgblZhbHVlcyksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCwgcmVmIGRvdWJsZSByZXRWYWwsIHJlZiBkb3VibGUgblZhbHVlcywgYm9vbCBpc0luQXJyYXkgPSBmYWxzZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShhcmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZShpdGVtLCBjb250ZXh0LCByZWYgcmV0VmFsLCByZWYgblZhbHVlcywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnLklzRXhjZWxSYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBhcmcuVmFsdWVBc1JhbmdlSW5mbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChJc051bWVyaWMoYy5WYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuVmFsdWUgaXMgYm9vbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IChib29sKSBjLlZhbHVlID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5WYWx1ZSBpcyBzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbnVtZXJpY1ZhbHVlID0gR2V0TnVtZXJpY1ZhbHVlKGFyZy5WYWx1ZSwgaXNJbkFycmF5KTsKKyAgICAgICAgICAgICAgICBpZiAobnVtZXJpY1ZhbHVlLkhhc1ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgblZhbHVlcysrOworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gbnVtZXJpY1ZhbHVlLlZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKChhcmcuVmFsdWUgaXMgc3RyaW5nKSAmJiAhQ29udmVydFV0aWwuSXNOdW1lcmljU3RyaW5nKGFyZy5WYWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbkFycmF5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGU/IEdldE51bWVyaWNWYWx1ZShvYmplY3Qgb2JqLCBib29sIGlzSW5BcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzTnVtZXJpYyhvYmopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2JqIGlzIGJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzSW5BcnJheSkgcmV0dXJuIGRlZmF1bHQoZG91YmxlPyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcob2JqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKG9iai5Ub1N0cmluZygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KGRvdWJsZT8pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VJZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWYuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlNmI3ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWYuY3MKQEAgLTAsMCArMSwxNjEgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgUmVxdWlyZSA9IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzLlJlcXVpcmU7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEF2ZXJhZ2VJZiA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFdpbGRDYXJkVmFsdWVNYXRjaGVyIF93aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKKworICAgICAgICBwdWJsaWMgQXZlcmFnZUlmKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IoKSwgbmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEF2ZXJhZ2VJZihOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBldmFsdWF0b3IsIFdpbGRDYXJkVmFsdWVNYXRjaGVyIHdpbGRDYXJkVmFsdWVNYXRjaGVyKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgiZXZhbHVhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgid2lsZENhcmRWYWx1ZU1hdGNoZXIiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciA9IGV2YWx1YXRvcjsKKyAgICAgICAgICAgIF93aWxkQ2FyZFZhbHVlTWF0Y2hlciA9IHdpbGRDYXJkVmFsdWVNYXRjaGVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIEV2YWx1YXRlKG9iamVjdCBvYmosIHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGU/IGNhbmRpZGF0ZSA9IGRlZmF1bHQoZG91YmxlPyk7CisgICAgICAgICAgICBpZiAoSXNOdW1lcmljKG9iaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuSGFzVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShjYW5kaWRhdGUuVmFsdWUsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgb2JqLlRvU3RyaW5nKCkpID09IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IGZpcnN0QXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCAmJiBmaXJzdEFyZy5Jc0V4Y2VsUmFuZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCl7IGZpcnN0QXJnIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOworICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBjcml0ZXJpYSA9PSBudWxsIHx8IGNyaXRlcmlhLlRvU3RyaW5nKCkuTGVuZ3RoID4gMjU1LCBlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNlY29uZEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMik7CisgICAgICAgICAgICAgICAgdmFyIGxvb2t1cFJhbmdlID0gc2Vjb25kQXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgICAgICAgICAgICAgIGlmIChsb29rdXBSYW5nZSA9PSBudWxsICYmIHNlY29uZEFyZy5Jc0V4Y2VsUmFuZ2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb29rdXBSYW5nZSA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCkge3NlY29uZEFyZ307CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldFZhbCA9IENhbGN1bGF0ZVdpdGhMb29rdXBSYW5nZShhcmdzLCBjcml0ZXJpYS5Ub1N0cmluZygpLCBsb29rdXBSYW5nZSwgY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoYXJncywgY3JpdGVyaWEuVG9TdHJpbmcoKSwgY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJldFZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVXaXRoTG9va3VwUmFuZ2UoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gcmFuZ2UsIHN0cmluZyBjcml0ZXJpYSwgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gc3VtUmFuZ2UsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICAgICAgICAgIHZhciBuTWF0Y2hlcyA9IDA7CisgICAgICAgICAgICB2YXIgZmxhdHRlbmVkUmFuZ2UgPSBBcmdzVG9PYmplY3RFbnVtZXJhYmxlKGZhbHNlLCByYW5nZSwgY29udGV4dCk7CisgICAgICAgICAgICB2YXIgZmxhdHRlbmVkU3VtUmFuZ2UgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKHN1bVJhbmdlLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmxhdHRlbmVkUmFuZ2UuQ291bnQoKTsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBmbGF0dGVuZWRTdW1SYW5nZS5FbGVtZW50QXQoeCk7CisgICAgICAgICAgICAgICAgaWYgKEV2YWx1YXRlKGZsYXR0ZW5lZFJhbmdlLkVsZW1lbnRBdCh4KSwgY3JpdGVyaWEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbk1hdGNoZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRGl2aWRlKHJldFZhbCwgbk1hdGNoZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJncywgc3RyaW5nIGV4cHJlc3Npb24sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICAgICAgICAgIHZhciBuTWF0Y2hlcyA9IDA7CisgICAgICAgICAgICB2YXIgZmxhdHRlbmRlZFJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmdzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIHZhciBjYW5kaWRhdGVzID0gZmxhdHRlbmRlZFJhbmdlIGFzIGRvdWJsZVtdID8/IGZsYXR0ZW5kZWRSYW5nZS5Ub0FycmF5KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEV2YWx1YXRlKGNhbmRpZGF0ZSwgZXhwcmVzc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gY2FuZGlkYXRlOworICAgICAgICAgICAgICAgICAgICBuTWF0Y2hlcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBEaXZpZGUocmV0VmFsLCBuTWF0Y2hlcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGUoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykgfHwgIV9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShhcmcuVmFsdWUsIGV4cHJlc3Npb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSXNOdW1lcmljKGFyZy5WYWx1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0VmFsICs9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2Vsc2UgaWYgKGFyZy5WYWx1ZSBpcyBTeXN0ZW0uRGF0ZVRpbWUpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldFZhbCArPSBDb252ZXJ0LlRvRGF0ZVRpbWUoYXJnLlZhbHVlKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICBlbHNlIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBDYWxjdWxhdGUoaXRlbSwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VJZnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzM2NlMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZzLmNzCkBAIC0wLDAgKzEsNjYgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDItMDEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEF2ZXJhZ2VJZnMgOiBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgc3VtUmFuZ2UgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKHRydWUsIG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+IHsgZnVuY3Rpb25Bcmd1bWVudHNbMF0gfSwgY29udGV4dCkuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgYXJnUmFuZ2VzID0gbmV3IExpc3Q8RXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbz4oKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYXMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBpeCA9IDE7IGl4IDwgMzE7IGl4ICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uQXJndW1lbnRzLkxlbmd0aCA8PSBpeCkgYnJlYWs7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlSW5mbyA9IGZ1bmN0aW9uQXJndW1lbnRzW2l4XS5WYWx1ZUFzUmFuZ2VJbmZvOworICAgICAgICAgICAgICAgIGFyZ1Jhbmdlcy5BZGQocmFuZ2VJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoaXggPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiByYW5nZUluZm8uR2V0TkNlbGxzKCkgIT0gYXJnUmFuZ2VzWzBdLkdldE5DZWxscygpLCBlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3JpdGVyaWFzLkFkZChmdW5jdGlvbkFyZ3VtZW50c1tpeCArIDFdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElFbnVtZXJhYmxlPGludD4gbWF0Y2hJbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1swXSwgY3JpdGVyaWFzWzBdKTsKKyAgICAgICAgICAgIHZhciBlbnVtZXJhYmxlID0gbWF0Y2hJbmRleGVzIGFzIElMaXN0PGludD4gPz8gbWF0Y2hJbmRleGVzLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IGFyZ1Jhbmdlcy5Db3VudCAmJiBlbnVtZXJhYmxlLkFueSgpOyBpeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1tpeF0sIGNyaXRlcmlhc1tpeF0pOworICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcyA9IGVudW1lcmFibGUuSW50ZXJzZWN0KGluZGV4ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hJbmRleGVzLkF2ZXJhZ2UoaW5kZXggPT4gc3VtUmFuZ2VbaW5kZXhdKTsKKworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NlaWxpbmcuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ2VpbGluZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQxZGIyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NlaWxpbmcuY3MKQEAgLTAsMCArMSw2OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ2VpbGluZyA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgVmFsaWRhdGVOdW1iZXJBbmRTaWduKG51bWJlciwgc2lnbmlmaWNhbmNlKTsKKyAgICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UgPCAxICYmIHNpZ25pZmljYW5jZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZsb29yID0gU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdCA9IG51bWJlciAtIGZsb29yOworICAgICAgICAgICAgICAgIHZhciBuU2lnbiA9IChpbnQpKHJlc3QgLyBzaWduaWZpY2FuY2UpICsgMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZsb29yICsgKG5TaWduICogc2lnbmlmaWNhbmNlKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzaWduaWZpY2FuY2UgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkNlaWxpbmcobnVtYmVyKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciAtIChudW1iZXIgJSBzaWduaWZpY2FuY2UpICsgc2lnbmlmaWNhbmNlOworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZU51bWJlckFuZFNpZ24oZG91YmxlIG51bWJlciwgZG91YmxlIHNpZ24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW1iZXIgPiAwZCAmJiBzaWduIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gc3RyaW5nLkZvcm1hdCgibnVtOiB7MH0sIHNpZ246IHsxfSIsIG51bWJlciwgc2lnbik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNlaWxpbmcgY2Fubm90IGhhbmRsZSBhIG5lZ2F0aXZlIHNpZ25pZmljYW5jZSB3aGVuIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUiICsgdmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3MuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODk2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIENvcyA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5Db3MoYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3NoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTQ0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zaC5jcwpAQCAtMCwwICsxLDQyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBDb3NoIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkNvc2goYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNThjMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudC5jcwpAQCAtMCwwICsxLDExNyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBDb3VudCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgZW51bSBJdGVtQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBJblJhbmdlLAorICAgICAgICAgICAgSW5BcnJheSwKKyAgICAgICAgICAgIFNpbmdsZUFyZworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbkl0ZW1zID0gMGQ7CisgICAgICAgICAgICBDYWxjdWxhdGUoYXJndW1lbnRzLCByZWYgbkl0ZW1zLCBjb250ZXh0LCBJdGVtQ29udGV4dC5TaW5nbGVBcmcpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChuSXRlbXMsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENhbGN1bGF0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBpdGVtcywgcmVmIGRvdWJsZSBuSXRlbXMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIEl0ZW1Db250ZXh0IGl0ZW1Db250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY3MgPSBpdGVtLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBjcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX0NoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkgPT0gZmFsc2UgJiYgU2hvdWxkQ291bnQoYy5WYWx1ZSwgSXRlbUNvbnRleHQuSW5SYW5nZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1zKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaXRlbS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZSh2YWx1ZSwgcmVmIG5JdGVtcywgY29udGV4dCwgSXRlbUNvbnRleHQuSW5BcnJheSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGl0ZW0sIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShpdGVtKSA9PSBmYWxzZSAmJiBTaG91bGRDb3VudChpdGVtLlZhbHVlLCBpdGVtQ29udGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1zKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgX0NoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5Jc1N1YnRvdGFsKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYXJnKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoRXhjZWxEYXRhUHJvdmlkZXIuSUNlbGxJbmZvIGNlbGwsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuSXNTdWJ0b3RhbCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGNlbGwpOworICAgICAgICAgICAgLy99CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgU2hvdWxkQ291bnQob2JqZWN0IHZhbHVlLCBJdGVtQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29udGV4dC5TaW5nbGVBcmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJc051bWVyaWModmFsdWUpIHx8IElzTnVtZXJpY1N0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29udGV4dC5JblJhbmdlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSXNOdW1lcmljKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db250ZXh0LkluQXJyYXk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJc051bWVyaWModmFsdWUpIHx8IElzTnVtZXJpY1N0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIEl0ZW1Db250ZXh0OiIgKyBjb250ZXh0LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50QS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudEEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NGI0NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudEEuY3MKQEAgLTAsMCArMSw5NyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ291bnRBIDogSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbkl0ZW1zID0gMGQ7CisgICAgICAgICAgICBDYWxjdWxhdGUoYXJndW1lbnRzLCBjb250ZXh0LCByZWYgbkl0ZW1zKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobkl0ZW1zLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDYWxjdWxhdGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gaXRlbXMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIHJlZiBkb3VibGUgbkl0ZW1zKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY3MgPSBpdGVtLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBjcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX0NoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghU2hvdWxkSWdub3JlKGMsIGNvbnRleHQpICYmIFNob3VsZENvdW50KGMuVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtcysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGUoKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWl0ZW0uVmFsdWUsIGNvbnRleHQsIHJlZiBuSXRlbXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGl0ZW0sIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIVNob3VsZElnbm9yZShpdGVtKSAmJiBTaG91bGRDb3VudChpdGVtLlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1zKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKEZ1bmN0aW9uQXJndW1lbnQgYXJnLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5Jc1N1YnRvdGFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoRXhjZWxEYXRhUHJvdmlkZXIuSUNlbGxJbmZvIGNlbGwsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGNlbGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIFNob3VsZENvdW50KG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlLlRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudEJsYW5rLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50QmxhbmsuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MzJhYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudEJsYW5rLmNzCkBAIC0wLDAgKzEsMjggQEAKK++7v3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ291bnRCbGFuayA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50cy5GaXJzdCgpOworICAgICAgICAgICAgaWYoIWFyZy5Jc0V4Y2VsUmFuZ2UpdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNvdW50Qmxhbmsgb25seSBzdXBwb3J0IHJhbmdlcyBhcyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcmcuVmFsdWVBc1JhbmdlSW5mby5HZXROQ2VsbHMoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghKGNlbGwuVmFsdWUgPT0gbnVsbCB8fCBjZWxsLlZhbHVlID09IHN0cmluZy5FbXB0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjU3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZi5jcwpAQCAtMCwwICsxLDg0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBSZXF1aXJlID0gT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMuUmVxdWlyZTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ291bnRJZiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFdpbGRDYXJkVmFsdWVNYXRjaGVyIF93aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKKworICAgICAgICBwdWJsaWMgQ291bnRJZigpCisgICAgICAgICAgICA6IHRoaXMobmV3IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCksIG5ldyBXaWxkQ2FyZFZhbHVlTWF0Y2hlcigpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudElmKE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIGV2YWx1YXRvciwgV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChldmFsdWF0b3IpLk5hbWVkKCJldmFsdWF0b3IiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdCh3aWxkQ2FyZFZhbHVlTWF0Y2hlcikuTmFtZWQoIndpbGRDYXJkVmFsdWVNYXRjaGVyIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgPSBldmFsdWF0b3I7CisgICAgICAgICAgICBfd2lsZENhcmRWYWx1ZU1hdGNoZXIgPSB3aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBFdmFsdWF0ZShvYmplY3Qgb2JqLCBzdHJpbmcgZXhwcmVzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlPyBjYW5kaWRhdGUgPSBkZWZhdWx0KGRvdWJsZT8pOworICAgICAgICAgICAgaWYgKElzTnVtZXJpYyhvYmopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLkhhc1ZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuRXZhbHVhdGUoY2FuZGlkYXRlLlZhbHVlLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIF93aWxkQ2FyZFZhbHVlTWF0Y2hlci5Jc01hdGNoKGV4cHJlc3Npb24sIG9iai5Ub1N0cmluZygpKSA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciByYW5nZSA9IGZ1bmN0aW9uQXJndW1lbnRzLkVsZW1lbnRBdCgwKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAwZDsKKyAgICAgICAgICAgIGlmIChyYW5nZS5Jc0V4Y2VsUmFuZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcmFuZ2UuVmFsdWVBc1JhbmdlSW5mbykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChFdmFsdWF0ZShjZWxsLlZhbHVlLCBjcml0ZXJpYSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiAoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pIHJhbmdlLlZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoRXZhbHVhdGUoYXJnLlZhbHVlLCBjcml0ZXJpYSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChFdmFsdWF0ZShyYW5nZS5WYWx1ZSwgY3JpdGVyaWEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50SWZzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50SWZzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTc1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZnMuY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sLlhQYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgUmVxdWlyZSA9IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzLlJlcXVpcmU7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIENvdW50SWZzIDogTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uCisgICAgeworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgYXJnUmFuZ2VzID0gbmV3IExpc3Q8RXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbz4oKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYXMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBpeCA9IDA7IGl4IDwgMzA7IGl4ICs9MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoIDw9IGl4KSBicmVhazsKKyAgICAgICAgICAgICAgICB2YXIgcmFuZ2VJbmZvID0gZnVuY3Rpb25Bcmd1bWVudHNbaXhdLlZhbHVlQXNSYW5nZUluZm87CisgICAgICAgICAgICAgICAgYXJnUmFuZ2VzLkFkZChyYW5nZUluZm8pOworICAgICAgICAgICAgICAgIGlmIChpeCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IHJhbmdlSW5mby5HZXROQ2VsbHMoKSAhPSBhcmdSYW5nZXNbMF0uR2V0TkNlbGxzKCksIGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcml0ZXJpYXMuQWRkKGZ1bmN0aW9uQXJndW1lbnRzW2l4KzFdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElFbnVtZXJhYmxlPGludD4gbWF0Y2hJbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1swXSwgY3JpdGVyaWFzWzBdKTsKKyAgICAgICAgICAgIHZhciBlbnVtZXJhYmxlID0gbWF0Y2hJbmRleGVzIGFzIElMaXN0PGludD4gPz8gbWF0Y2hJbmRleGVzLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IGFyZ1Jhbmdlcy5Db3VudCAmJiBlbnVtZXJhYmxlLkFueSgpOyBpeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1tpeF0sIGNyaXRlcmlhc1tpeF0pOworICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcyA9IGVudW1lcmFibGUuSW50ZXJzZWN0KGluZGV4ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KChkb3VibGUpbWF0Y2hJbmRleGVzLkNvdW50KCksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0RlZ3JlZXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvRGVncmVlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWQyOTc5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0RlZ3JlZXMuY3MKQEAgLTAsMCArMSwxOSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIERlZ3JlZXMgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBhbmdsZSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChhbmdsZSoxODApL1N5c3RlbS5NYXRoLlBJOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0V4cC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9FeHAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzYjE3OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9FeHAuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhwIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkV4cChudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9GYWN0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0ZhY3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1NDMwMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9GYWN0LmNzCkBAIC0wLDAgKzEsMjQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBGYWN0IDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IG51bWJlciA8IDAsIGVFcnJvclR5cGUuTkEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IDFkOworICAgICAgICAgICAgZm9yICh2YXIgeCA9IDE7IHggPCBudW1iZXI7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKj0geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9GbG9vci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9GbG9vci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ1N2M3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Zsb29yLmNzCkBAIC0wLDAgKzEsNzYgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIEZsb29yIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgc2lnbmlmaWNhbmNlID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICBWYWxpZGF0ZU51bWJlckFuZFNpZ24obnVtYmVyLCBzaWduaWZpY2FuY2UpOworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5jZSA8IDEgJiYgc2lnbmlmaWNhbmNlID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmxvb3IgPSBTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIpOworICAgICAgICAgICAgICAgIHZhciByZXN0ID0gbnVtYmVyIC0gZmxvb3I7CisgICAgICAgICAgICAgICAgdmFyIG5TaWduID0gKGludCkocmVzdCAvIHNpZ25pZmljYW5jZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmbG9vciArIChuU2lnbiAqIHNpZ25pZmljYW5jZSksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2lnbmlmaWNhbmNlID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcmVzdWx0OworICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyIC0gKG51bWJlciAlIHNpZ25pZmljYW5jZSkgKyBzaWduaWZpY2FuY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlciAtIChudW1iZXIgJSBzaWduaWZpY2FuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVOdW1iZXJBbmRTaWduKGRvdWJsZSBudW1iZXIsIGRvdWJsZSBzaWduKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVtYmVyID4gMGQgJiYgc2lnbiA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHN0cmluZy5Gb3JtYXQoIm51bTogezB9LCBzaWduOiB7MX0iLCBudW1iZXIsIHNpZ24pOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJGbG9vciBjYW5ub3QgaGFuZGxlIGEgbmVnYXRpdmUgc2lnbmlmaWNhbmNlIHdoZW4gdGhlIG51bWJlciBpcyBwb3NpdGl2ZSIgKyB2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xhcmdlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xhcmdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZjRmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTGFyZ2UuY3MKQEAgLTAsMCArMSwyMiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIExhcmdlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBBcmdUb0ludChhcmd1bWVudHMsIDEpIC0gMTsKKyAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+IHthcmdzfSwgY29udGV4dCk7CisgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGluZGV4IDwgMCB8fCBpbmRleCA+PSB2YWx1ZXMuQ291bnQoKSwgZUVycm9yVHlwZS5OdW0pOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlcy5PcmRlckJ5RGVzY2VuZGluZyh4ID0+IHgpLkVsZW1lbnRBdChpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG4uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2OWVlYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mbi5jcwpAQCAtMCwwICsxLDE4IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgTG4gOiBFeGNlbEZ1bmN0aW9uCit7CisgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguTG9nKGFyZywgU3lzdGVtLk1hdGguRSksIERhdGFUeXBlLkRlY2ltYWwpOworICAgIH0KK30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mb2cuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG9nLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjAwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG9nLmNzCkBAIC0wLDAgKzEsNDcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIExvZyA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5Mb2cobnVtYmVyLCAxMGQpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuZXdCYXNlID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkxvZyhudW1iZXIsIG5ld0Jhc2UpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mb2cxMC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mb2cxMC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM4ZWIzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xvZzEwLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIExvZzEwIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkxvZzEwKG51bWJlciksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01hdGhIZWxwZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWF0aEhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU4MTNhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01hdGhIZWxwZXIuY3MKQEAgLTAsMCArMSwxNjUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWF0aE9iaiA9IFN5c3RlbS5NYXRoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhhbmtzIHRvIHRoZSBndXlzIGluIHRoaXMgdGhyZWFkOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI4NDA3OTgvYy1zaGFycC1tYXRoLWNsYXNzLXF1ZXN0aW9uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGhIZWxwZXIKKyAgICB7CisgICAgICAgIC8vIFNlY2FudCAKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgU2VjKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMSAvIE1hdGhPYmouQ29zKHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29zZWNhbnQKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQ29zZWMoZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAxIC8gTWF0aE9iai5TaW4oeCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3RhbmdlbnQgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIENvdGFuKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMSAvIE1hdGhPYmouVGFuKHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52ZXJzZSBTaW5lIAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNzaW4oZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkF0YW4oeCAvIE1hdGhPYmouU3FydCgteCAqIHggKyAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZlcnNlIENvc2luZSAKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQXJjY29zKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aE9iai5BdGFuKC14IC8gTWF0aE9iai5TcXJ0KC14ICogeCArIDEpKSArIDIgKiBNYXRoT2JqLkF0YW4oMSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIEludmVyc2UgU2VjYW50IAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNzZWMoZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAyICogTWF0aE9iai5BdGFuKDEpIC0gTWF0aE9iai5BdGFuKE1hdGhPYmouU2lnbih4KSAvIE1hdGhPYmouU3FydCh4ICogeCAtIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmVyc2UgQ29zZWNhbnQgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEFyY2Nvc2VjKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aE9iai5BdGFuKE1hdGhPYmouU2lnbih4KSAvIE1hdGhPYmouU3FydCh4ICogeCAtIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmVyc2UgQ290YW5nZW50IAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNjb3Rhbihkb3VibGUgeCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDIgKiBNYXRoT2JqLkF0YW4oMSkgLSBNYXRoT2JqLkF0YW4oeCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIeXBlcmJvbGljIFNpbmUgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhTaW4oZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEh5cGVyYm9saWMgQ29zaW5lIAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQ29zKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE1hdGhPYmouRXhwKHgpICsgTWF0aE9iai5FeHAoLXgpKSAvIDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBIeXBlcmJvbGljIFRhbmdlbnQgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhUYW4oZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpIC8gKE1hdGhPYmouRXhwKHgpICsgTWF0aE9iai5FeHAoLXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEh5cGVyYm9saWMgU2VjYW50IAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIU2VjKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMiAvIChNYXRoT2JqLkV4cCh4KSArIE1hdGhPYmouRXhwKC14KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIeXBlcmJvbGljIENvc2VjYW50IAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQ29zZWMoZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAyIC8gKE1hdGhPYmouRXhwKHgpIC0gTWF0aE9iai5FeHAoLXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEh5cGVyYm9saWMgQ290YW5nZW50IAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQ290YW4oZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTWF0aE9iai5FeHAoeCkgKyBNYXRoT2JqLkV4cCgteCkpIC8gKE1hdGhPYmouRXhwKHgpIC0gTWF0aE9iai5FeHAoLXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmVyc2UgSHlwZXJib2xpYyBTaW5lIAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjc2luKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coeCArIE1hdGhPYmouU3FydCh4ICogeCArIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmVyc2UgSHlwZXJib2xpYyBDb3NpbmUgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhBcmNjb3MoZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkxvZyh4ICsgTWF0aE9iai5TcXJ0KHggKiB4IC0gMSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIFRhbmdlbnQgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhBcmN0YW4oZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIFNlY2FudCAKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgSEFyY3NlYyhkb3VibGUgeCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1hdGhPYmouTG9nKChNYXRoT2JqLlNxcnQoLXggKiB4ICsgMSkgKyAxKSAvIHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIENvc2VjYW50IAorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjY29zZWMoZG91YmxlIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkxvZygoTWF0aE9iai5TaWduKHgpICogTWF0aE9iai5TcXJ0KHggKiB4ICsgMSkgKyAxKSAvIHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIENvdGFuZ2VudCAKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgSEFyY2NvdGFuKGRvdWJsZSB4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coKHggKyAxKSAvICh4IC0gMSkpIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvZ2FyaXRobSB0byBiYXNlIE4gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIExvZ04oZG91YmxlIHgsIGRvdWJsZSBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coeCkgLyBNYXRoT2JqLkxvZyhuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWF4LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWM2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWF4LmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIE1heCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1heCgpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXhhLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01heGEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxOTY2NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXhhLmNzCkBAIC0wLDAgKzEsNTUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgTWF4YSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciBfYXJnQ29udmVydGVyOworCisgICAgICAgIHB1YmxpYyBNYXhhKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcigpKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgTWF4YShEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIGFyZ0NvbnZlcnRlcikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGFyZ0NvbnZlcnRlcikuTmFtZWQoImFyZ0NvbnZlcnRlciIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgX2FyZ0NvbnZlcnRlciA9IGFyZ0NvbnZlcnRlcjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBfYXJnQ29udmVydGVyLkNvbnZlcnRBcmdzSW5jbHVkaW5nT3RoZXJUeXBlcyhhcmd1bWVudHMpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWx1ZXMuTWF4KCksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01lZGlhbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NZWRpYW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjZDUwMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NZWRpYW4uY3MKQEAgLTAsMCArMSw1NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgTWVkaWFuIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1zID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICAgICAgdmFyIGFyciA9IG51bXMuVG9BcnJheSgpOworICAgICAgICAgICAgQXJyYXkuU29ydChhcnIpOworICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBhcnIuTGVuZ3RoID09IDAsIGVFcnJvclR5cGUuTnVtKTsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQ7CisgICAgICAgICAgICBpZiAoYXJyLkxlbmd0aCAlIDIgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBhcnJbYXJyLkxlbmd0aCAvIDJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gYXJyLkxlbmd0aC8yIC0gMTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoYXJyW3N0YXJ0SW5kZXhdICsgYXJyW3N0YXJ0SW5kZXggKyAxXSkvMmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWluLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01pbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ2MjFmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01pbi5jcwpAQCAtMCwwICsxLDQyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBNaW4gOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NaW4oKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWluYS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NaW5hLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZWJjODcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWluYS5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIE1pbmEgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgX2FyZ0NvbnZlcnRlcjsKKworICAgICAgICBwdWJsaWMgTWluYSgpCisgICAgICAgICAgICA6IHRoaXMobmV3IERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIoKSkKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE1pbmEoRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciBhcmdDb252ZXJ0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmdDb252ZXJ0ZXIpLk5hbWVkKCJhcmdDb252ZXJ0ZXIiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIF9hcmdDb252ZXJ0ZXIgPSBhcmdDb252ZXJ0ZXI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gX2FyZ0NvbnZlcnRlci5Db252ZXJ0QXJnc0luY2x1ZGluZ090aGVyVHlwZXMoYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1pbigpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Nb2QuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTW9kLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTW9kLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIE1vZCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIG4xID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgbjIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChuMSAlIG4yLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjk0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uLmNzCkBAIC0wLDAgKzEsOTEgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIFJlcXVpcmUgPSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcy5SZXF1aXJlOworCisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX3dpbGRDYXJkVmFsdWVNYXRjaGVyOworCisgICAgICAgIHByb3RlY3RlZCBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24oKQorICAgICAgICAgICAgOnRoaXMobmV3IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCksIG5ldyBXaWxkQ2FyZFZhbHVlTWF0Y2hlcigpKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24oTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgZXZhbHVhdG9yLCBXaWxkQ2FyZFZhbHVlTWF0Y2hlciB3aWxkQ2FyZFZhbHVlTWF0Y2hlcikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV2YWx1YXRvcikuTmFtZWQoImV2YWx1YXRvciIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHdpbGRDYXJkVmFsdWVNYXRjaGVyKS5OYW1lZCgid2lsZENhcmRWYWx1ZU1hdGNoZXIiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciA9IGV2YWx1YXRvcjsKKyAgICAgICAgICAgIF93aWxkQ2FyZFZhbHVlTWF0Y2hlciA9IHdpbGRDYXJkVmFsdWVNYXRjaGVyOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgRXZhbHVhdGUob2JqZWN0IG9iaiwgb2JqZWN0IGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZT8gY2FuZGlkYXRlID0gZGVmYXVsdChkb3VibGU/KTsKKyAgICAgICAgICAgIGlmIChJc051bWVyaWMob2JqKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5IYXNWYWx1ZSAmJiBleHByZXNzaW9uIGlzIHN0cmluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZS5WYWx1ZSwgZXhwcmVzc2lvbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIF93aWxkQ2FyZFZhbHVlTWF0Y2hlci5Jc01hdGNoKGV4cHJlc3Npb24sIG9iai5Ub1N0cmluZygpKSA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8aW50PiBHZXRNYXRjaEluZGV4ZXMoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyByYW5nZUluZm8sIG9iamVjdCBzZWFyY2hlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgIHZhciBpbnRlcm5hbEluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IHJhbmdlSW5mby5BZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gcmFuZ2VJbmZvLkFkZHJlc3MuX3RvUm93OyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSByYW5nZUluZm8uQWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IHJhbmdlSW5mby5BZGRyZXNzLl90b0NvbDsgY29sKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gcmFuZ2VJbmZvLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEV2YWx1YXRlKGNhbmRpZGF0ZSwgc2VhcmNoZWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuQWRkKGludGVybmFsSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsSW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1BpLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1BpLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGRjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUGkuY3MKQEAgLTAsMCArMSw0MSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgUGkgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFN5c3RlbS5NYXRoLlJvdW5kKChkb3VibGUpU3lzdGVtLk1hdGguUEksIDE0KTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qb3dlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qb3dlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU3ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Bvd2VyLmNzCkBAIC0wLDAgKzEsNDQgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFBvd2VyIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgcG93ZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBTeXN0ZW0uTWF0aC5Qb3cobnVtYmVyLCBwb3dlcik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUHJvZHVjdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qcm9kdWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzhjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUHJvZHVjdC5jcwpAQCAtMCwwICsxLDkxIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9kdWN0IDogSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gMGQ7CisgICAgICAgICAgICB2YXIgaW5kZXggPSAwOworICAgICAgICAgICAgd2hpbGUgKEFyZUVxdWFsKHJlc3VsdCwgMGQpICYmIGluZGV4IDwgYXJndW1lbnRzLkNvdW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQ2FsY3VsYXRlRmlyc3RJdGVtKGFyZ3VtZW50cywgaW5kZXgrKywgY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBDYWxjdWxhdGVDb2xsZWN0aW9uKGFyZ3VtZW50cy5Ta2lwKGluZGV4KSwgcmVzdWx0LCAoYXJnLCBjdXJyZW50KSA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYXJnKSkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZUlzRXhjZWxFcnJvcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGFyZy5WYWx1ZUFzRXhjZWxFcnJvclZhbHVlLlR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnLklzRXhjZWxSYW5nZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihTaG91bGRJZ25vcmUoY2VsbCwgY29udGV4dCkpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCAqPSBjZWxsLlZhbHVlRG91YmxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgb2JqID0gYXJnLlZhbHVlOworICAgICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBJc051bWVyaWMob2JqKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBDb252ZXJ0LlRvRG91YmxlKG9iaik7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKj0gdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlRmlyc3RJdGVtKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IGluZGV4LCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoaW5kZXgpOworICAgICAgICAgICAgdmFyIGFyZ0xpc3QgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IGVsZW1lbnQgfTsKKyAgICAgICAgICAgIHZhciB2YWx1ZUxpc3QgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGZhbHNlLCBmYWxzZSwgYXJnTGlzdCwgY29udGV4dCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gMGQ7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gdmFsdWVMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMGQgJiYgdmFsdWUgPiAwZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKj0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9RdW90aWVudC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9RdW90aWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY3MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1F1b3RpZW50LmNzCkBAIC0wLDAgKzEsMjEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBRdW90aWVudCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIG51bSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIGRlbm9tID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IChpbnQpZGVub20gPT0gMCwgZUVycm9yVHlwZS5EaXYwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoaW50KShudW0vZGVub20pOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JhbmQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRlYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JhbmQuY3MKQEAgLTAsMCArMSwyNCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFJhbmQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgU2VlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VlZCA9IFNlZWQgPiA1MCA/IDAgOiBTZWVkICsgNTsKKyAgICAgICAgICAgIHZhciB2YWwgPSBuZXcgUmFuZG9tKFN5c3RlbS5EYXRlVGltZS5Ob3cuTWlsbGlzZWNvbmQgKyBTZWVkKS5OZXh0RG91YmxlKCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZEJldHdlZW4uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZEJldHdlZW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwMjA4NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5kQmV0d2Vlbi5jcwpAQCAtMCwwICsxLDU5IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBSYW5kQmV0d2VlbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIGxvdyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIGhpZ2ggPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciByYW5kID0gbmV3IFJhbmQoKS5FeGVjdXRlKG5ldyBGdW5jdGlvbkFyZ3VtZW50WzBdLCBjb250ZXh0KS5SZXN1bHQ7CisgICAgICAgICAgICB2YXIgcmFuZFBhcnQgPSAoQ2FsdWxhdGVEaWZmKGhpZ2gsIGxvdykgKiAoZG91YmxlKXJhbmQpICsgMTsKKyAgICAgICAgICAgIHJhbmRQYXJ0ID0gU3lzdGVtLk1hdGguRmxvb3IocmFuZFBhcnQpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChsb3cgKyByYW5kUGFydCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWx1bGF0ZURpZmYoZG91YmxlIGhpZ2gsIGRvdWJsZSBsb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoaWdoID4gMCAmJiBsb3cgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBoaWdoICsgbG93ICogLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaGlnaCA8IDAgJiYgbG93IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGlnaCAqIC0xIC0gbG93ICogLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGlnaCAtIGxvdzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5rLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JhbmsuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4N2I1ZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5rLmNzCkBAIC0wLDAgKzEsNjkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBSYW5rIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgYm9vbCBfaXNBdmc7CisgICAgICAgIHB1YmxpYyBSYW5rKGJvb2wgaXNBdmc9ZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9pc0F2Zz1pc0F2ZzsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciByZWZlciA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSk7CisgICAgICAgICAgICBib29sIGFzYyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc2MgPSBiYXNlLkFyZ1RvQm9vbChhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGwgPSBuZXcgTGlzdDxkb3VibGU+KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIHJlZmVyLlZhbHVlQXNSYW5nZUluZm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHYgPSBVdGlscy5Db252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjLlZhbHVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFkb3VibGUuSXNOYU4odikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsLkFkZCh2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLlNvcnQoKTsKKyAgICAgICAgICAgIGRvdWJsZSBpeDsKKyAgICAgICAgICAgIGlmIChhc2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXggPSBsLkluZGV4T2YobnVtYmVyKSsxOworICAgICAgICAgICAgICAgIGlmKF9pc0F2ZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdCA9IENvbnZlcnQuVG9JbnQzMihpeCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLkNvdW50ID4gc3QgJiYgbFtzdF0gPT0gbnVtYmVyKSBzdCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoc3QgPiBpeCkgaXggPSBpeCArICgoc3QgLSBpeCkgLyAyRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl4ID0gbC5MYXN0SW5kZXhPZihudW1iZXIpOworICAgICAgICAgICAgICAgIGlmIChfaXNBdmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3QgPSBDb252ZXJ0LlRvSW50MzIoaXgpLTE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgwIDw9IHN0ICYmIGxbc3RdID09IG51bWJlcikgc3QtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0KzEgPCBpeCkgaXggPSBpeCAtICgoaXggLSBzdCAtIDEpIC8gMkQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpeCA9IGwuQ291bnQgLSBpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpeCA8PSAwIHx8IGl4PmwuQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoaXgsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDA3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmQuY3MKQEAgLTAsMCArMSw0OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgUm91bmQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBuRGlnaXRzID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGlmIChuRGlnaXRzIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuRGlnaXRzICo9IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyIC0gKG51bWJlciAlIChTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpKSksIERhdGFUeXBlLkludGVnZXIpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguUm91bmQobnVtYmVyLCBuRGlnaXRzKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmRkb3duLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kZG93bi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmU5ZmNkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kZG93bi5jcwpAQCAtMCwwICsxLDY3IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE0LTAxLTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBSb3VuZGRvd24gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBuRGVjaW1hbHMgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworCisgICAgICAgICAgICB2YXIgbkZhY3RvciA9IG51bWJlciA8IDAgPyAtMSA6IDE7CisgICAgICAgICAgICBudW1iZXIgKj0gbkZhY3RvcjsKKworICAgICAgICAgICAgZG91YmxlIHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChuRGVjaW1hbHMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJvdW5kRG93bkRlY2ltYWxOdW1iZXIobnVtYmVyLCBuRGVjaW1hbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChpbnQpU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgLSAocmVzdWx0ICUgU3lzdGVtLk1hdGguUG93KDEwLCAobkRlY2ltYWxzKi0xKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQgKiBuRmFjdG9yLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZSBSb3VuZERvd25EZWNpbWFsTnVtYmVyKGRvdWJsZSBudW1iZXIsIGludCBuRGVjaW1hbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnRlZ2VyUGFydCA9IFN5c3RlbS5NYXRoLkZsb29yKG51bWJlcik7CisgICAgICAgICAgICB2YXIgZGVjaW1hbFBhcnQgPSBudW1iZXIgLSBpbnRlZ2VyUGFydDsKKyAgICAgICAgICAgIGRlY2ltYWxQYXJ0ID0gU3lzdGVtLk1hdGguUG93KDEwZCwgbkRlY2ltYWxzKSpkZWNpbWFsUGFydDsKKyAgICAgICAgICAgIGRlY2ltYWxQYXJ0ID0gU3lzdGVtLk1hdGguVHJ1bmNhdGUoZGVjaW1hbFBhcnQpL1N5c3RlbS5NYXRoLlBvdygxMGQsIG5EZWNpbWFscyk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaW50ZWdlclBhcnQgKyBkZWNpbWFsUGFydDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmR1cC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Sb3VuZHVwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzAwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmR1cC5jcwpAQCAtMCwwICsxLDQ2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE0LTAxLTA2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBSb3VuZHVwIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgbkRpZ2l0cyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gKG51bWJlciA+PSAwKSAKKyAgICAgICAgICAgICAgICA/IFN5c3RlbS5NYXRoLkNlaWxpbmcobnVtYmVyICogU3lzdGVtLk1hdGguUG93KDEwLCBuRGlnaXRzKSkgLyBTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpCisgICAgICAgICAgICAgICAgOiBTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIgKiBTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpKSAvIFN5c3RlbS5NYXRoLlBvdygxMCwgbkRpZ2l0cyk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2lnbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TaWduLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjA2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2lnbi5jcwpAQCAtMCwwICsxLDUxIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTaWduIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gMGQ7CisgICAgICAgICAgICB2YXIgdmFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICBpZiAodmFsIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TaW4uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2luLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2JjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2luLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFNpbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5TaW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2luaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TaW5oLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWI2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2luaC5jcwpAQCAtMCwwICsxLDQyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTaW5oIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlNpbmgoYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU21hbGwuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU21hbGwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlZmIxMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TbWFsbC5jcwpAQCAtMCwwICsxLDIyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgU21hbGwgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKTsKKyAgICAgICAgICAgIHZhciBpbmRleCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSkgLSAxOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUobmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4geyBhcmdzIH0sIGNvbnRleHQpOworICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBpbmRleCA8IDAgfHwgaW5kZXggPj0gdmFsdWVzLkNvdW50KCksIGVFcnJvclR5cGUuTnVtKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZXMuT3JkZXJCeSh4ID0+IHgpLkVsZW1lbnRBdChpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TcXJ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWViZjcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydC5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTcXJ0IDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3lzdGVtLk1hdGguU3FydCgoZG91YmxlKWFyZyk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KChkb3VibGUpcmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TcXJ0UGkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydFBpLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2VkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydFBpLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFNxcnRQaSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5TcXJ0KG51bWJlciAqIFN5c3RlbS5NYXRoLlBJKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXYuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXYuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiZmE0MwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdGRldi5jcwpAQCAtMCwwICsxLDYyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE1hdGhPYmogPSBTeXN0ZW0uTWF0aDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTdGRldiA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoYXJndW1lbnRzLCBjb250ZXh0LCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN0YW5kYXJkRGV2aWF0aW9uKHZhbHVlcyksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgU3RhbmRhcmREZXZpYXRpb24oSUVudW1lcmFibGU8ZG91YmxlPiB2YWx1ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSByZXQgPSAwOworICAgICAgICAgICAgaWYgKHZhbHVlcy5BbnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgblZhbHVlcyA9IHZhbHVlcy5Db3VudCgpOworICAgICAgICAgICAgICAgIGlmKG5WYWx1ZXMgPT0gMSkgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLkRpdjApOworICAgICAgICAgICAgICAgIC8vQ29tcHV0ZSB0aGUgQXZlcmFnZSAgICAgICAKKyAgICAgICAgICAgICAgICBkb3VibGUgYXZnID0gdmFsdWVzLkF2ZXJhZ2UoKTsKKyAgICAgICAgICAgICAgICAvL1BlcmZvcm0gdGhlIFN1bSBvZiAodmFsdWUtYXZnKV8yXzIgICAgICAgCisgICAgICAgICAgICAgICAgZG91YmxlIHN1bSA9IHZhbHVlcy5TdW0oZCA9PiBNYXRoT2JqLlBvdyhkIC0gYXZnLCAyKSk7CisgICAgICAgICAgICAgICAgLy9QdXQgaXQgYWxsIHRvZ2V0aGVyICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IE1hdGhPYmouU3FydChEaXZpZGUoc3VtLCAodmFsdWVzLkNvdW50KCkgLSAxKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSAKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdGRldlAuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXZQLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzA2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXZQLmNzCkBAIC0wLDAgKzEsNDggQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWF0aE9iaiA9IFN5c3RlbS5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFN0ZGV2UCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3RhbmRhcmREZXZpYXRpb24oYXJncyksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIFN0YW5kYXJkRGV2aWF0aW9uKElFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgYXZnID0gdmFsdWVzLkF2ZXJhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLlNxcnQodmFsdWVzLkF2ZXJhZ2UodiA9PiBNYXRoT2JqLlBvdyh2IC0gYXZnLCAyKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1YnRvdGFsLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1YnRvdGFsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjAyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VidG90YWwuY3MKQEAgLTAsMCArMSwxMDcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFN1YnRvdGFsIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PGludCwgSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbj4gX2Z1bmN0aW9ucyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbj4oKTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdWJ0b3RhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXRpYWxpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2Z1bmN0aW9uc1sxXSA9IG5ldyBBdmVyYWdlKCk7CisgICAgICAgICAgICBfZnVuY3Rpb25zWzJdID0gbmV3IENvdW50KCk7CisgICAgICAgICAgICBfZnVuY3Rpb25zWzNdID0gbmV3IENvdW50QSgpOworICAgICAgICAgICAgX2Z1bmN0aW9uc1s0XSA9IG5ldyBNYXgoKTsKKyAgICAgICAgICAgIF9mdW5jdGlvbnNbNV0gPSBuZXcgTWluKCk7CisgICAgICAgICAgICBfZnVuY3Rpb25zWzZdID0gbmV3IFByb2R1Y3QoKTsKKyAgICAgICAgICAgIF9mdW5jdGlvbnNbN10gPSBuZXcgU3RkZXYoKTsKKyAgICAgICAgICAgIF9mdW5jdGlvbnNbOF0gPSBuZXcgU3RkZXZQKCk7CisgICAgICAgICAgICBfZnVuY3Rpb25zWzldID0gbmV3IFN1bSgpOworICAgICAgICAgICAgX2Z1bmN0aW9uc1sxMF0gPSBuZXcgVmFyKCk7CisgICAgICAgICAgICBfZnVuY3Rpb25zWzExXSA9IG5ldyBWYXJQKCk7CisKKyAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgQXZlcmFnZSgpLCAxMDEpOworICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBDb3VudCgpLCAxMDIpOworICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBDb3VudEEoKSwgMTAzKTsKKyAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgTWF4KCksIDEwNCk7CisgICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IE1pbigpLCAxMDUpOworICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBQcm9kdWN0KCksIDEwNik7CisgICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IFN0ZGV2KCksIDEwNyk7CisgICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IFN0ZGV2UCgpLCAxMDgpOworICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBTdW0oKSwgMTA5KTsKKyAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgVmFyKCksIDExMCk7CisgICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IFZhclAoKSwgMTExKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24oSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbiBmdW5jLCBpbnQgZnVuY051bSkKKyAgICAgICAgeworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgX2Z1bmN0aW9uc1tmdW5jTnVtXSA9IGZ1bmM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWZvcmVJbnZva2UoUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgICAgICAgICBjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgZnVuY051bSA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5QYXJlbnQgIT0gbnVsbCAmJiBjb250ZXh0LlNjb3Blcy5DdXJyZW50LlBhcmVudC5Jc1N1YnRvdGFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGFjdHVhbEFyZ3MgPSBhcmd1bWVudHMuU2tpcCgxKTsKKyAgICAgICAgICAgIEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24gPSBudWxsOworICAgICAgICAgICAgZnVuY3Rpb24gPSBHZXRGdW5jdGlvbkJ5Q2FsY1R5cGUoZnVuY051bSk7CisgICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IGZ1bmN0aW9uLkV4ZWN1dGUoYWN0dWFsQXJncywgY29udGV4dCk7CisgICAgICAgICAgICBjb21waWxlUmVzdWx0LklzUmVzdWx0T2ZTdWJ0b3RhbCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZVJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRXhjZWxGdW5jdGlvbiBHZXRGdW5jdGlvbkJ5Q2FsY1R5cGUoaW50IGZ1bmNOdW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2Z1bmN0aW9ucy5Db250YWluc0tleShmdW5jTnVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmdW5jTnVtICIgKyBmdW5jTnVtICsgIiwgdmFsaWQgcmFuZ2VzIGFyZSAxLTExIGFuZCAxMDEtMTExIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2Z1bmN0aW9uc1tmdW5jTnVtXTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW0uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzdkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtLmNzCkBAIC0wLDAgKzEsODQgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTdW0gOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJldFZhbCA9IDBkOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IENhbGN1bGF0ZShhcmcsIGNvbnRleHQpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXRWYWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJldFZhbCA9IDBkOworICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShhcmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJnLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilhcmcuVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGl0ZW0sIGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZy5WYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOworICAgICAgICAgICAgICAgIHJldFZhbCArPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzUwZDNlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmLmNzCkBAIC0wLDAgKzEsMTc2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgVXRpbD1PZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTdW1JZiA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX2V2YWx1YXRvcjsKKworICAgICAgICBwdWJsaWMgU3VtSWYoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcigpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdW1JZihOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBldmFsdWF0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChldmFsdWF0b3IpLk5hbWVkKCJldmFsdWF0b3IiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIF9ldmFsdWF0b3IgPSBldmFsdWF0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOyAvL0lFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZTsKKyAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gY3JpdGVyaWEgPT0gbnVsbCB8fCBjcml0ZXJpYS5Ub1N0cmluZygpLkxlbmd0aCA+IDI1NSwgZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzdW1SYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWUgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsvL0lFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgICAgICAgICAgICAgIHJldFZhbCA9IENhbGN1bGF0ZVdpdGhTdW1SYW5nZShhcmdzLCBjcml0ZXJpYS5Ub1N0cmluZygpLCBzdW1SYW5nZSwgY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IENhbGN1bGF0ZVNpbmdsZVJhbmdlKGFyZ3MsIGNyaXRlcmlhLlRvU3RyaW5nKCksIGNvbnRleHQpOyAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBDYWxjdWxhdGVTaW5nbGVSYW5nZSgoYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhLlRvU3RyaW5nKCksIGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmV0VmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVdpdGhTdW1SYW5nZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiByYW5nZSwgc3RyaW5nIGNyaXRlcmlhLCBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBzdW1SYW5nZSwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJldFZhbCA9IDBkOworICAgICAgICAgICAgdmFyIGZsYXR0ZW5lZFJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShyYW5nZSwgY29udGV4dCk7CisgICAgICAgICAgICB2YXIgZmxhdHRlbmVkU3VtUmFuZ2UgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKHN1bVJhbmdlLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmxhdHRlbmVkUmFuZ2UuQ291bnQoKTsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBmbGF0dGVuZWRTdW1SYW5nZS5FbGVtZW50QXQoeCk7CisgICAgICAgICAgICAgICAgaWYgKF9ldmFsdWF0b3IuRXZhbHVhdGUoZmxhdHRlbmVkUmFuZ2UuRWxlbWVudEF0KHgpLCBjcml0ZXJpYSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gY2FuZGlkYXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVXaXRoU3VtUmFuZ2UoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyByYW5nZSwgc3RyaW5nIGNyaXRlcmlhLCBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvIHN1bVJhbmdlLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgICAgICAgICBmb3JlYWNoKHZhciBjZWxsIGluIHJhbmdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZXZhbHVhdG9yLkV2YWx1YXRlKGNlbGwuVmFsdWUsIGNyaXRlcmlhKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBvciA9IGNlbGwuUm93LXJhbmdlLkFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgICAgICAgICAgICAgIHZhciBvYyA9IGNlbGwuQ29sdW1uIC0gcmFuZ2UuQWRkcmVzcy5fZnJvbUNvbDsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3VtUmFuZ2UuQWRkcmVzcy5fZnJvbVJvdytvciA8PSBzdW1SYW5nZS5BZGRyZXNzLl90b1JvdyAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgc3VtUmFuZ2UuQWRkcmVzcy5fZnJvbUNvbCtvYyA8PSBzdW1SYW5nZS5BZGRyZXNzLl90b0NvbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzdW1SYW5nZS5HZXRPZmZzZXQob3IsIG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2IGlzIEV4Y2VsRXJyb3JWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigoRXhjZWxFcnJvclZhbHVlKXYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBVdGlsLkNvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKHYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVNpbmdsZVJhbmdlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3MsIHN0cmluZyBleHByZXNzaW9uLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgICAgICAgICB2YXIgZmxhdHRlbmRlZFJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmdzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjYW5kaWRhdGUgaW4gZmxhdHRlbmRlZFJhbmdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZSwgZXhwcmVzc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gY2FuZGlkYXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVTaW5nbGVSYW5nZShFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvIHJhbmdlLCBzdHJpbmcgZXhwcmVzc2lvbiwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJldFZhbCA9IDBkOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNhbmRpZGF0ZSBpbiByYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2V2YWx1YXRvci5FdmFsdWF0ZShjYW5kaWRhdGUuVmFsdWUsIGV4cHJlc3Npb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5Jc0V4Y2VsRXJyb3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKChFeGNlbEVycm9yVmFsdWUpY2FuZGlkYXRlLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IGNhbmRpZGF0ZS5WYWx1ZURvdWJsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisKKyAgICAgICAgLy9wcml2YXRlIGRvdWJsZSBDYWxjdWxhdGUoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdmFyIHJldFZhbCA9IDBkOworICAgICAgICAvLyAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykgfHwgIV9ldmFsdWF0b3IuRXZhbHVhdGUoYXJnLlZhbHVlLCBleHByZXNzaW9uKSkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBpZiAoYXJnLlZhbHVlIGlzIGRvdWJsZSB8fCBhcmcuVmFsdWUgaXMgaW50KQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICByZXRWYWwgKz0gQ29udmVydC5Ub0RvdWJsZShhcmcuVmFsdWUpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBTeXN0ZW0uRGF0ZVRpbWUpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHJldFZhbCArPSBDb252ZXJ0LlRvRGF0ZVRpbWUoYXJnLlZhbHVlKS5Ub09BRGF0ZSgpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKKyAgICAgICAgLy8gICAgICAgIHsKKyAgICAgICAgLy8gICAgICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGl0ZW0sIGV4cHJlc3Npb24pOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIC8vfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtSWZzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmFlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtSWZzLmNzCkBAIC0wLDAgKzEsNjYgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFN1bUlmcyA6IE11bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAzKTsKKyAgICAgICAgICAgIHZhciBzdW1SYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUodHJ1ZSwgbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4ge2Z1bmN0aW9uQXJndW1lbnRzWzBdfSwgY29udGV4dCkuVG9MaXN0KCk7CisgICAgICAgICAgICB2YXIgYXJnUmFuZ2VzID0gbmV3IExpc3Q8RXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbz4oKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYXMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBpeCA9IDE7IGl4IDwgMzE7IGl4ICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uQXJndW1lbnRzLkxlbmd0aCA8PSBpeCkgYnJlYWs7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlSW5mbyA9IGZ1bmN0aW9uQXJndW1lbnRzW2l4XS5WYWx1ZUFzUmFuZ2VJbmZvOworICAgICAgICAgICAgICAgIGFyZ1Jhbmdlcy5BZGQocmFuZ2VJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoaXggPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiByYW5nZUluZm8uR2V0TkNlbGxzKCkgIT0gYXJnUmFuZ2VzWzBdLkdldE5DZWxscygpLCBlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3JpdGVyaWFzLkFkZChmdW5jdGlvbkFyZ3VtZW50c1tpeCArIDFdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElFbnVtZXJhYmxlPGludD4gbWF0Y2hJbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1swXSwgY3JpdGVyaWFzWzBdKTsKKyAgICAgICAgICAgIHZhciBlbnVtZXJhYmxlID0gbWF0Y2hJbmRleGVzIGFzIElMaXN0PGludD4gPz8gbWF0Y2hJbmRleGVzLlRvTGlzdCgpOworICAgICAgICAgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IGFyZ1Jhbmdlcy5Db3VudCAmJiBlbnVtZXJhYmxlLkFueSgpOyBpeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1tpeF0sIGNyaXRlcmlhc1tpeF0pOworICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcyA9IGVudW1lcmFibGUuSW50ZXJzZWN0KGluZGV4ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbWF0Y2hJbmRleGVzLlN1bShpbmRleCA9PiBzdW1SYW5nZVtpbmRleF0pOworCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtUHJvZHVjdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1Qcm9kdWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTZkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtUHJvZHVjdC5jcwpAQCAtMCwwICsxLDEwNiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgU3VtUHJvZHVjdCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDBkOworICAgICAgICAgICAgTGlzdDxMaXN0PGRvdWJsZT4+IHJlc3VsdHMgPSBuZXcgTGlzdDxMaXN0PGRvdWJsZT4+KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLkFkZChuZXcgTGlzdDxkb3VibGU+KCkpOworICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UmVzdWx0ID0gcmVzdWx0cy5MYXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWwgaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkVmFsdWUodmFsLlZhbHVlLCBjdXJyZW50UmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcuVmFsdWUgaXMgRnVuY3Rpb25Bcmd1bWVudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFkZFZhbHVlKGFyZy5WYWx1ZSwgY3VycmVudFJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcj1hcmcuVmFsdWVBc1JhbmdlSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gci5BZGRyZXNzLl9mcm9tQ29sOyBjb2wgPD0gci5BZGRyZXNzLl90b0NvbDsgY29sKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IHIuQWRkcmVzcy5fZnJvbVJvdzsgcm93IDw9IHIuQWRkcmVzcy5fdG9Sb3c7IHJvdysrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFZhbHVlKHIuR2V0VmFsdWUocm93LGNvbCksIGN1cnJlbnRSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBhbGwgc3VwcGxpZWQgbGlzdHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGgKKyAgICAgICAgICAgIHZhciBhcnJheUxlbmd0aCA9IHJlc3VsdHMuRmlyc3QoKS5Db3VudDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBsaXN0IGluIHJlc3VsdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3QuQ291bnQgIT0gYXJyYXlMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFeGNlbEZ1bmN0aW9uRXhjZXB0aW9uKCJBbGwgc3VwcGxpZWQgYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiLCBFeGNlbEVycm9yQ29kZXMuVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBhcnJheUxlbmd0aDsgcm93SW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcm93UmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgcmVzdWx0cy5Db3VudDsgY29sSW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvd1Jlc3VsdCAqPSByZXN1bHRzW2NvbEluZGV4XVtyb3dJbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSByb3dSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQWRkVmFsdWUob2JqZWN0IGNvbnZlcnRWYWwsIExpc3Q8ZG91YmxlPiBjdXJyZW50UmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNOdW1lcmljKGNvbnZlcnRWYWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnRSZXN1bHQuQWRkKENvbnZlcnQuVG9Eb3VibGUoY29udmVydFZhbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29udmVydFZhbCBpcyBFeGNlbEVycm9yVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSljb252ZXJ0VmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudFJlc3VsdC5BZGQoMGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bXNxLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bXNxLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGEwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3Vtc3EuY3MKQEAgLTAsMCArMSw2OSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIHB1YmxpYyBjbGFzcyBTdW1zcSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGFyZywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXRWYWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGUoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIGJvb2wgaXNJbkFycmF5ID0gZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYXJnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiAoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IENhbGN1bGF0ZShpdGVtLCBjb250ZXh0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNzID0gYXJnLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBjcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShjLCBjb250ZXh0KSA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFN5c3RlbS5NYXRoLlBvdyhjLlZhbHVlRG91YmxlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpY1N0cmluZyhhcmcuVmFsdWUpICYmICFpc0luQXJyYXkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLk1hdGguUG93KHZhbHVlLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgaWdub3JlQm9vbCA9IGlzSW5BcnJheTsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFN5c3RlbS5NYXRoLlBvdyhDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUsIGlnbm9yZUJvb2wpLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Rhbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UYW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1YmFiNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UYW4uY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGFuIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlRhbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UYW5oLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1RhbmguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMzMzYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UYW5oLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFRhbmggOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguVGFuaChhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UcnVuYy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UcnVuYy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzIxZmVhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1RydW5jLmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTQtMDEtMDYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFRydW5jIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlRydW5jYXRlKG51bWJlciksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG5EaWdpdHMgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJyb3VuZGRvd24iKTsKKyAgICAgICAgICAgIHJldHVybiBmdW5jLkV4ZWN1dGUoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9WYXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGU3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgcHVibGljIGNsYXNzIFZhciA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoVmFyTWV0aG9kcy5WYXIoYXJncyksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Zhck1ldGhvZHMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyTWV0aG9kcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhkY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Zhck1ldGhvZHMuY3MKQEAgLTAsMCArMSw1OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFZhck1ldGhvZHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZSBEaXZpZGUoZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5NYXRoLkFicyhyaWdodCAtIDBkKSA8IGRvdWJsZS5FcHNpbG9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5EaXYwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZWZ0IC8gcmlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBWYXIoSUVudW1lcmFibGU8ZG91YmxlPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgYXZnID0gYXJncy5BdmVyYWdlKCk7CisgICAgICAgICAgICBkb3VibGUgZCA9IGFyZ3MuQWdncmVnYXRlKDAuMCwgKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArPSBTeXN0ZW0uTWF0aC5Qb3cobmV4dCAtIGF2ZywgMikpOworICAgICAgICAgICAgcmV0dXJuIERpdmlkZShkLCAoYXJncy5Db3VudCgpIC0gMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgVmFyUChJRW51bWVyYWJsZTxkb3VibGU+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBhdmcgPSBhcmdzLkF2ZXJhZ2UoKTsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gYXJncy5BZ2dyZWdhdGUoMC4wLCAodG90YWwsIG5leHQpID0+IHRvdGFsICs9IFN5c3RlbS5NYXRoLlBvdyhuZXh0IC0gYXZnLCAyKSk7CisgICAgICAgICAgICByZXR1cm4gRGl2aWRlKGQsIGFyZ3MuQ291bnQoKSk7IAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1ZhclAuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyUC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTlmZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1ZhclAuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgVmFyUCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoVmFyTWV0aG9kcy5WYXJQKGFyZ3MpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtZXJpYy9DSW50LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9OdW1lcmljL0NJbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2ZjZhZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtZXJpYy9DSW50LmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk51bWVyaWMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ0ludCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIG51bSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgoaW50KVN5c3RlbS5NYXRoLkZsb29yKG51bSksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9PYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9PYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZmM3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL09iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MKQEAgLTAsMCArMSw1OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgT2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlciA6IENvbGxlY3Rpb25GbGF0dGVuZXI8b2JqZWN0PgorICAgIHsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUVudW1lcmFibGU8b2JqZWN0PiBDb252ZXJ0QXJncyhib29sIGlnbm9yZUhpZGRlbiwgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5GdW5jQXJnc1RvRmxhdEVudW1lcmFibGUoYXJndW1lbnRzLCAoYXJnLCBhcmdMaXN0KSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiAoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylhcmcuVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDZWxsU3RhdGVIZWxwZXIuU2hvdWxkSWdub3JlKGlnbm9yZUhpZGRlbiwgY2VsbCwgY29udGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0LkFkZChjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKGFyZy5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgOworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9BZGRyZXNzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQWRkcmVzcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODBkNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQWRkcmVzcy5jcwpAQCAtMCwwICsxLDcxIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIHB1YmxpYyBjbGFzcyBBZGRyZXNzIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgcm93ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBjb2wgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiByb3cgPCAwICYmIGNvbCA8IDAsIGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVR5cGUgPSBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dBbmRDb2x1bW47CisgICAgICAgICAgICB2YXIgd29ya3NoZWV0U3BlYyA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFyZzMgPSBBcmdUb0ludChhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gYXJnMyA8IDEgfHwgYXJnMyA+IDQsIGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgIHJlZmVyZW5jZVR5cGUgPSAoRXhjZWxSZWZlcmVuY2VUeXBlKUFyZ1RvSW50KGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmb3VydGhBcmcgPSBhcmd1bWVudHMuRWxlbWVudEF0KDMpLlZhbHVlOworICAgICAgICAgICAgICAgIGlmIChmb3VydGhBcmcgaXMgYm9vbCAmJiAhKGJvb2wpZm91cnRoQXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkV4Y2VsZm9ybXVsYXBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBSMUMxIGZvcm1hdCEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmaWZ0aEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoNCkuVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGZpZnRoQXJnIGlzIHN0cmluZyAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZmlmdGhBcmcuVG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXRTcGVjID0gZmlmdGhBcmcgKyAiISI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHRyYW5zbGF0b3IgPSBuZXcgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIHJlZmVyZW5jZVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh3b3Jrc2hlZXRTcGVjICsgdHJhbnNsYXRvci5Ub0FkZHJlc3MoY29sLCByb3cpLCBEYXRhVHlwZS5FeGNlbEFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQXJyYXlMb29rdXBOYXZpZ2F0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9BcnJheUxvb2t1cE5hdmlnYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDk2NTlkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQXJyYXlMb29rdXBOYXZpZ2F0b3IuY3MKQEAgLTAsMCArMSw3OCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXJyYXlMb29rdXBOYXZpZ2F0b3IgOiBMb29rdXBOYXZpZ2F0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuY3Rpb25Bcmd1bWVudFtdIF9hcnJheURhdGE7CisgICAgICAgIHByaXZhdGUgaW50IF9pbmRleCA9IDA7CisgICAgICAgIHByaXZhdGUgb2JqZWN0IF9jdXJyZW50VmFsdWU7CisgCisgICAgICAgIHB1YmxpYyBBcnJheUxvb2t1cE5hdmlnYXRvcihMb29rdXBEaXJlY3Rpb24gZGlyZWN0aW9uLCBMb29rdXBBcmd1bWVudHMgYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShkaXJlY3Rpb24sIGFyZ3VtZW50cywgcGFyc2luZ0NvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMpLk5hbWVkKCJhcmd1bWVudHMiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMuRGF0YUFycmF5KS5OYW1lZCgiYXJndW1lbnRzLkRhdGFBcnJheSIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgX2FycmF5RGF0YSA9IGFyZ3VtZW50cy5EYXRhQXJyYXkuVG9BcnJheSgpOworICAgICAgICAgICAgSW5pdGlhbGl6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQXJndW1lbnRzLkxvb2t1cEluZGV4ID49IF9hcnJheURhdGEuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5SZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0Q3VycmVudFZhbHVlKCk7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pbmRleDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jdXJyZW50VmFsdWUgPSBfYXJyYXlEYXRhW19pbmRleF07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgSGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChEaXJlY3Rpb24gPT0gTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW5kZXggPCAoX2FycmF5RGF0YS5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBNb3ZlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghSGFzTmV4dCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNldEN1cnJlbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEN1cnJlbnRWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2FycmF5RGF0YVtfaW5kZXhdLlZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldExvb2t1cFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9hcnJheURhdGFbX2luZGV4XS5WYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0Nob29zZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0Nob29zZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTFjNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ2hvb3NlLmNzCkBAIC0wLDAgKzEsNDcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ2hvb3NlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBBcmdUb0ludChhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIGl0ZW1zID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBhcmd1bWVudHMuQ291bnQoKTsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0ZW1zLkFkZChhcmd1bWVudHMuRWxlbWVudEF0KHgpLlZhbHVlRmlyc3QuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGl0ZW1zW2luZGV4XSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0NvbHVtbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0NvbHVtbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU5MzYwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ29sdW1uLmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ29sdW1uIDogTG9va3VwRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Gcm9tQ29sLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgICAgICAgICAgaWYgKCFFeGNlbEFkZHJlc3NVdGlsLklzVmFsaWRBZGRyZXNzKHJhbmdlQWRkcmVzcykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBzdXBwbGllZCIpOworICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gZmFjdG9yeS5DcmVhdGUocmFuZ2VBZGRyZXNzKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYWRkcmVzcy5Gcm9tQ29sLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0NvbHVtbnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Db2x1bW5zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWZmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Db2x1bW5zLmNzCkBAIC0wLDAgKzEsNTkgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ29sdW1ucyA6IExvb2t1cEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciByPWFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mbzsKKyAgICAgICAgICAgIGlmIChyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyLkFkZHJlc3MuX3RvQ29sIC0gci5BZGRyZXNzLl9mcm9tQ29sICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoRXhjZWxBZGRyZXNzVXRpbC5Jc1ZhbGlkQWRkcmVzcyhyYW5nZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKHJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLlRvQ29sIC0gYWRkcmVzcy5Gcm9tQ29sICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmdlIHN1cHBsaWVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9FeGNlbExvb2t1cE5hdmlnYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0V4Y2VsTG9va3VwTmF2aWdhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTVlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9FeGNlbExvb2t1cE5hdmlnYXRvci5jcwpAQCAtMCwwICsxLDEyNSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxMb29rdXBOYXZpZ2F0b3IgOiBMb29rdXBOYXZpZ2F0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgaW50IF9jdXJyZW50Um93OworICAgICAgICBwcml2YXRlIGludCBfY3VycmVudENvbDsKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgX2N1cnJlbnRWYWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBSYW5nZUFkZHJlc3MgX3JhbmdlQWRkcmVzczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2luZGV4OworCisgICAgICAgIHB1YmxpYyBFeGNlbExvb2t1cE5hdmlnYXRvcihMb29rdXBEaXJlY3Rpb24gZGlyZWN0aW9uLCBMb29rdXBBcmd1bWVudHMgYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShkaXJlY3Rpb24sIGFyZ3VtZW50cywgcGFyc2luZ0NvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXRpYWxpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2luZGV4ID0gMDsKKyAgICAgICAgICAgIHZhciBmYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoUGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgICAgICAgaWYgKEFyZ3VtZW50cy5SYW5nZUluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcmFuZ2VBZGRyZXNzID0gZmFjdG9yeS5DcmVhdGUoUGFyc2luZ0NvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Xb3Jrc2hlZXQsIEFyZ3VtZW50cy5SYW5nZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9yYW5nZUFkZHJlc3MgPSBmYWN0b3J5LkNyZWF0ZShBcmd1bWVudHMuUmFuZ2VJbmZvLkFkZHJlc3MuV29ya1NoZWV0LCBBcmd1bWVudHMuUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY3VycmVudENvbCA9IF9yYW5nZUFkZHJlc3MuRnJvbUNvbDsKKyAgICAgICAgICAgIF9jdXJyZW50Um93ID0gX3JhbmdlQWRkcmVzcy5Gcm9tUm93OworICAgICAgICAgICAgU2V0Q3VycmVudFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0Q3VycmVudFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2N1cnJlbnRWYWx1ZSA9IFBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldENlbGxWYWx1ZShfcmFuZ2VBZGRyZXNzLldvcmtzaGVldCwgX2N1cnJlbnRSb3csIF9jdXJyZW50Q29sKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBIYXNOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKERpcmVjdGlvbiA9PSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50Um93IDwgX3JhbmdlQWRkcmVzcy5Ub1JvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRDb2wgPCBfcmFuZ2VBZGRyZXNzLlRvQ29sOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2luZGV4OyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBNb3ZlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghSGFzTmV4dCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY3VycmVudFJvdysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jdXJyZW50Q29sKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaW5kZXgrKzsKKyAgICAgICAgICAgIFNldEN1cnJlbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEN1cnJlbnRWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2N1cnJlbnRWYWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBHZXRMb29rdXBWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByb3cgPSBfY3VycmVudFJvdzsKKyAgICAgICAgICAgIHZhciBjb2wgPSBfY3VycmVudENvbDsKKyAgICAgICAgICAgIGlmIChEaXJlY3Rpb24gPT0gTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbCArPSBBcmd1bWVudHMuTG9va3VwSW5kZXggLSAxOworICAgICAgICAgICAgICAgIHJvdyArPSBBcmd1bWVudHMuTG9va3VwT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvdyArPSBBcmd1bWVudHMuTG9va3VwSW5kZXggLSAxOworICAgICAgICAgICAgICAgIGNvbCArPSBBcmd1bWVudHMuTG9va3VwT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldENlbGxWYWx1ZShfcmFuZ2VBZGRyZXNzLldvcmtzaGVldCwgcm93LCBjb2wpOyAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0hMb29rdXAuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9ITG9va3VwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzM5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9ITG9va3VwLmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgSExvb2t1cCA6IExvb2t1cEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBsb29rdXBBcmdzLkxvb2t1cEluZGV4IDwgMSwgZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLkhvcml6b250YWwsIGxvb2t1cEFyZ3MsIGNvbnRleHQpOworICAgICAgICAgICAgcmV0dXJuIExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kZXguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDk3NjExCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kZXguY3MKQEAgLTAsMCArMSw1NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCit7CisgICAgcHVibGljIGNsYXNzIEluZGV4IDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgYXJnMSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IGFyZzEuVmFsdWUgYXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47CisgICAgICAgICAgICB2YXIgY3JmID0gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gYXJncy5Db3VudCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBhcmdzLkVsZW1lbnRBdChpbmRleCAtIDEpOworICAgICAgICAgICAgICAgIC8vQ29tbWVudGVkIEpLLUNhbiBiZSBhbnkgZGF0YSB0eXBlCisgICAgICAgICAgICAgICAgLy9pZiAoIUlzTnVtYmVyKGNhbmRpZGF0ZS5WYWx1ZSkpCisgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgLy8gICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAvL3JldHVybiBDcmVhdGVSZXN1bHQoQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2FuZGlkYXRlLlZhbHVlKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZi5DcmVhdGUoY2FuZGlkYXRlLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmcxLklzRXhjZWxSYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcm93ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjb2wgPSBhcmd1bWVudHMuQ291bnQoKT4yID8gQXJnVG9JbnQoYXJndW1lbnRzLCAyKSA6IDE7CisgICAgICAgICAgICAgICAgdmFyIHJpPWFyZzEuVmFsdWVBc1JhbmdlSW5mbzsKKyAgICAgICAgICAgICAgICBpZiAocm93ID4gcmkuQWRkcmVzcy5fdG9Sb3cgLSByaS5BZGRyZXNzLl9mcm9tUm93ICsgMSB8fAorICAgICAgICAgICAgICAgICAgICBjb2wgPiByaS5BZGRyZXNzLl90b0NvbCAtIHJpLkFkZHJlc3MuX2Zyb21Db2wgKyAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5SZWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gcmkuR2V0T2Zmc2V0KHJvdy0xLCBjb2wtMSk7CisgICAgICAgICAgICAgICAgLy9Db21tZW50ZWQgSkstQ2FuIGJlIGFueSBkYXRhIHR5cGUKKyAgICAgICAgICAgICAgICAvL2lmICghSXNOdW1iZXIoY2FuZGlkYXRlLlZhbHVlKSkgICAKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIHJldHVybiBjcmYuQ3JlYXRlKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0luZGlyZWN0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kaXJlY3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhOTExNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0luZGlyZWN0LmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTQtMDQtMTMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgSW5kaXJlY3QgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICAgICAgdmFyIHdzID0gYWRyLldvcmtTaGVldDsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh3cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3MgPSBjb250ZXh0LlNjb3Blcy5DdXJyZW50LkFkZHJlc3MuV29ya3NoZWV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIuR2V0UmFuZ2Uod3MsIGFkci5fZnJvbVJvdywgYWRyLl9mcm9tQ29sLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuSXNFbXB0eSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkVudW1lcmFibGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2YzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXAuY3MKQEAgLTAsMCArMSw5OCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIHB1YmxpYyBjbGFzcyBMb29rdXAgOiBMb29rdXBGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICBpZiAoSGF2ZVR3b1Jhbmdlcyhhcmd1bWVudHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBIYW5kbGVUd29SYW5nZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIYW5kbGVTaW5nbGVSYW5nZShhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIEhhdmVUd29SYW5nZXMoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIChFeGNlbEFkZHJlc3NVdGlsLklzVmFsaWRBZGRyZXNzKGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWUuVG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IEhhbmRsZVNpbmdsZVJhbmdlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlYXJjaGVkVmFsdWUgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWUpLk5hbWVkKCJmaXJzdEFkZHJlc3MiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIHZhciBmaXJzdEFkZHJlc3MgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gcmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoZmlyc3RBZGRyZXNzKTsKKyAgICAgICAgICAgIHZhciBuUm93cyA9IGFkZHJlc3MuVG9Sb3cgLSBhZGRyZXNzLkZyb21Sb3c7CisgICAgICAgICAgICB2YXIgbkNvbHMgPSBhZGRyZXNzLlRvQ29sIC0gYWRkcmVzcy5Gcm9tQ29sOworICAgICAgICAgICAgdmFyIGxvb2t1cEluZGV4ID0gbkNvbHMgKyAxOworICAgICAgICAgICAgdmFyIGxvb2t1cERpcmVjdGlvbiA9IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbDsKKyAgICAgICAgICAgIGlmIChuQ29scyA+IG5Sb3dzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvb2t1cEluZGV4ID0gblJvd3MgKyAxOworICAgICAgICAgICAgICAgIGxvb2t1cERpcmVjdGlvbiA9IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGxvb2t1cEFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKHNlYXJjaGVkVmFsdWUsIGZpcnN0QWRkcmVzcywgbG9va3VwSW5kZXgsIDAsIHRydWUpOworICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKGxvb2t1cERpcmVjdGlvbiwgbG9va3VwQXJncywgY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gTG9va3VwKG5hdmlnYXRvciwgbG9va3VwQXJncyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENvbXBpbGVSZXN1bHQgSGFuZGxlVHdvUmFuZ2VzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlYXJjaGVkVmFsdWUgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWUpLk5hbWVkKCJmaXJzdEFkZHJlc3MiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlKS5OYW1lZCgic2Vjb25kQWRkcmVzcyIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgdmFyIGZpcnN0QWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgc2Vjb25kQWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgcmFuZ2VBZGRyZXNzRmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgICAgICAgdmFyIGFkZHJlc3MxID0gcmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoZmlyc3RBZGRyZXNzKTsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzMiA9IHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKHNlY29uZEFkZHJlc3MpOworICAgICAgICAgICAgdmFyIGxvb2t1cEluZGV4ID0gKGFkZHJlc3MyLkZyb21Db2wgLSBhZGRyZXNzMS5Gcm9tQ29sKSArIDE7CisgICAgICAgICAgICB2YXIgbG9va3VwT2Zmc2V0ID0gYWRkcmVzczIuRnJvbVJvdyAtIGFkZHJlc3MxLkZyb21Sb3c7CisgICAgICAgICAgICB2YXIgbG9va3VwRGlyZWN0aW9uID0gR2V0TG9va3VwRGlyZWN0aW9uKGFkZHJlc3MxKTsKKyAgICAgICAgICAgIGlmIChsb29rdXBEaXJlY3Rpb24gPT0gTG9va3VwRGlyZWN0aW9uLkhvcml6b250YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9va3VwSW5kZXggPSAoYWRkcmVzczIuRnJvbVJvdyAtIGFkZHJlc3MxLkZyb21Sb3cpICsgMTsKKyAgICAgICAgICAgICAgICBsb29rdXBPZmZzZXQgPSBhZGRyZXNzMi5Gcm9tQ29sIC0gYWRkcmVzczEuRnJvbUNvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhzZWFyY2hlZFZhbHVlLCBmaXJzdEFkZHJlc3MsIGxvb2t1cEluZGV4LCBsb29rdXBPZmZzZXQsICB0cnVlKTsKKyAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShsb29rdXBEaXJlY3Rpb24sIGxvb2t1cEFyZ3MsIGNvbnRleHQpOworICAgICAgICAgICAgcmV0dXJuIExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwQXJndW1lbnRzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwQXJndW1lbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjA0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBBcmd1bWVudHMuY3MKQEAgLTAsMCArMSwxMTIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgTG9va3VwQXJndW1lbnRzCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBMb29rdXBBcmd1bWVudERhdGFUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsUmFuZ2UsCisgICAgICAgICAgICBEYXRhQXJyYXkKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb29rdXBBcmd1bWVudHMoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQorICAgICAgICAgICAgOiB0aGlzKGFyZ3VtZW50cywgbmV3IEFyZ3VtZW50UGFyc2VycygpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb29rdXBBcmd1bWVudHMoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBBcmd1bWVudFBhcnNlcnMgYXJndW1lbnRQYXJzZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBfYXJndW1lbnRQYXJzZXJzID0gYXJndW1lbnRQYXJzZXJzOworICAgICAgICAgICAgU2VhcmNoZWRWYWx1ZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7CisgICAgICAgICAgICB2YXIgYXJnMSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWU7CisgICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gYXJnMSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICAgICAgICAgIGlmIChkYXRhQXJyYXkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEYXRhQXJyYXkgPSBkYXRhQXJyYXk7CisgICAgICAgICAgICAgICAgQXJndW1lbnREYXRhVHlwZSA9IExvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRGF0YUFycmF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vaWYgKGFyZzEgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKSBhcmcxID0gKChFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pIGFyZzEpLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciByYW5nZUluZm8gPSBhcmcxIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgICAgICAgICAgaWYgKHJhbmdlSW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmFuZ2VBZGRyZXNzID0gc3RyaW5nLklzTnVsbE9yRW1wdHkocmFuZ2VJbmZvLkFkZHJlc3MuV29ya1NoZWV0KSA/IHJhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3MgOiAiJyIgKyByYW5nZUluZm8uQWRkcmVzcy5Xb3JrU2hlZXQgKyAiJyEiICsgcmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgUmFuZ2VJbmZvID0gcmFuZ2VJbmZvOworICAgICAgICAgICAgICAgICAgICBBcmd1bWVudERhdGFUeXBlID0gTG9va3VwQXJndW1lbnREYXRhVHlwZS5FeGNlbFJhbmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSYW5nZUFkZHJlc3MgPSBhcmcxLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50RGF0YVR5cGUgPSBMb29rdXBBcmd1bWVudERhdGFUeXBlLkV4Y2VsUmFuZ2U7CisgICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb29rdXBJbmRleCA9IChpbnQpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcikuUGFyc2UoYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJhbmdlTG9va3VwID0gKGJvb2wpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuQm9vbGVhbikuUGFyc2UoYXJndW1lbnRzLkVsZW1lbnRBdCgzKS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmFuZ2VMb29rdXAgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExvb2t1cEFyZ3VtZW50cyhvYmplY3Qgc2VhcmNoZWRWYWx1ZSwgc3RyaW5nIHJhbmdlQWRkcmVzcywgaW50IGxvb2t1cEluZGV4LCBpbnQgbG9va3VwT2Zmc2V0LCBib29sIHJhbmdlTG9va3VwKQorICAgICAgICB7CisgICAgICAgICAgICBTZWFyY2hlZFZhbHVlID0gc2VhcmNoZWRWYWx1ZTsKKyAgICAgICAgICAgIFJhbmdlQWRkcmVzcyA9IHJhbmdlQWRkcmVzczsKKyAgICAgICAgICAgIExvb2t1cEluZGV4ID0gbG9va3VwSW5kZXg7CisgICAgICAgICAgICBMb29rdXBPZmZzZXQgPSBsb29rdXBPZmZzZXQ7CisgICAgICAgICAgICBSYW5nZUxvb2t1cCA9IHJhbmdlTG9va3VwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudFBhcnNlcnMgX2FyZ3VtZW50UGFyc2VyczsKKworICAgICAgICBwdWJsaWMgb2JqZWN0IFNlYXJjaGVkVmFsdWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBSYW5nZUFkZHJlc3MgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBMb29rdXBJbmRleCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IExvb2t1cE9mZnNldCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSYW5nZUxvb2t1cCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gRGF0YUFycmF5IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvIFJhbmdlSW5mbyB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgTG9va3VwQXJndW1lbnREYXRhVHlwZSBBcmd1bWVudERhdGFUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfSAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBEaXJlY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBEaXJlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1YTdkNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cERpcmVjdGlvbi5jcwpAQCAtMCwwICsxLDM3IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIHB1YmxpYyBlbnVtIExvb2t1cERpcmVjdGlvbgorICAgIHsKKyAgICAgICAgVmVydGljYWwsCisgICAgICAgIEhvcml6b250YWwKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBGdW5jdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cEZ1bmN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGQ1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBGdW5jdGlvbi5jcwpAQCAtMCwwICsxLDExNyBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9va3VwRnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlTWF0Y2hlciBfdmFsdWVNYXRjaGVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRGYWN0b3J5IF9jb21waWxlUmVzdWx0RmFjdG9yeTsKKworICAgICAgICBwdWJsaWMgTG9va3VwRnVuY3Rpb24oKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBMb29rdXBWYWx1ZU1hdGNoZXIoKSwgbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExvb2t1cEZ1bmN0aW9uKFZhbHVlTWF0Y2hlciB2YWx1ZU1hdGNoZXIsIENvbXBpbGVSZXN1bHRGYWN0b3J5IGNvbXBpbGVSZXN1bHRGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBfdmFsdWVNYXRjaGVyID0gdmFsdWVNYXRjaGVyOworICAgICAgICAgICAgX2NvbXBpbGVSZXN1bHRGYWN0b3J5ID0gY29tcGlsZVJlc3VsdEZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0xvb2t1cEZ1Y3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50IElzTWF0Y2gob2JqZWN0IG8xLCBvYmplY3QgbzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdmFsdWVNYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBMb29rdXBEaXJlY3Rpb24gR2V0TG9va3VwRGlyZWN0aW9uKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuUm93cyA9IHJhbmdlQWRkcmVzcy5Ub1JvdyAtIHJhbmdlQWRkcmVzcy5Gcm9tUm93OworICAgICAgICAgICAgdmFyIG5Db2xzID0gcmFuZ2VBZGRyZXNzLlRvQ29sIC0gcmFuZ2VBZGRyZXNzLkZyb21Db2w7CisgICAgICAgICAgICByZXR1cm4gbkNvbHMgPiBuUm93cyA/IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsIDogTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIENvbXBpbGVSZXN1bHQgTG9va3VwKExvb2t1cE5hdmlnYXRvciBuYXZpZ2F0b3IsIExvb2t1cEFyZ3VtZW50cyBsb29rdXBBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgbGFzdFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIG9iamVjdCBsYXN0TG9va3VwVmFsdWUgPSBudWxsOworICAgICAgICAgICAgaW50PyBsYXN0TWF0Y2hSZXN1bHQgPSBudWxsOworICAgICAgICAgICAgaWYgKGxvb2t1cEFyZ3MuU2VhcmNoZWRWYWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1hdGNoUmVzdWx0ID0gSXNNYXRjaChuYXZpZ2F0b3IuQ3VycmVudFZhbHVlLCBsb29rdXBBcmdzLlNlYXJjaGVkVmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChtYXRjaFJlc3VsdCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPSBudWxsICYmIG5hdmlnYXRvci5DdXJyZW50VmFsdWUgPT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobG9va3VwQXJncy5SYW5nZUxvb2t1cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RWYWx1ZSA9PSBudWxsICYmIG1hdGNoUmVzdWx0ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk5BKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VmFsdWUgIT0gbnVsbCAmJiBtYXRjaFJlc3VsdCA+IDAgJiYgbGFzdE1hdGNoUmVzdWx0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVSZXN1bHRGYWN0b3J5LkNyZWF0ZShsYXN0TG9va3VwVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoUmVzdWx0ID0gbWF0Y2hSZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBuYXZpZ2F0b3IuQ3VycmVudFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExvb2t1cFZhbHVlID0gbmF2aWdhdG9yLkdldExvb2t1cFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUobmF2aWdhdG9yLkdldExvb2t1cFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChuYXZpZ2F0b3IuTW92ZU5leHQoKSk7CisKKyAgICAgICAgICAgIGlmIChsb29rdXBBcmdzLlJhbmdlTG9va3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGxhc3RMb29rdXBWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmMjNkNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvci5jcwpAQCAtMCwwICsxLDY2IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rdXBOYXZpZ2F0b3IKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBMb29rdXBEaXJlY3Rpb24gRGlyZWN0aW9uOworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgTG9va3VwQXJndW1lbnRzIEFyZ3VtZW50czsKKyAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IFBhcnNpbmdDb250ZXh0OworCisKKworICAgICAgICBwdWJsaWMgTG9va3VwTmF2aWdhdG9yKExvb2t1cERpcmVjdGlvbiBkaXJlY3Rpb24sIExvb2t1cEFyZ3VtZW50cyBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzKS5OYW1lZCgiYXJndW1lbnRzIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQocGFyc2luZ0NvbnRleHQpLk5hbWVkKCJwYXJzaW5nQ29udGV4dCIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKS5OYW1lZCgicGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgIEFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICAgICAgICAgIFBhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIE1vdmVOZXh0KCk7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBDdXJyZW50VmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRMb29rdXBWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvckZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjg5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9va3VwTmF2aWdhdG9yRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBMb29rdXBOYXZpZ2F0b3IgQ3JlYXRlKExvb2t1cERpcmVjdGlvbiBkaXJlY3Rpb24sIExvb2t1cEFyZ3VtZW50cyBhcmdzLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3MuQXJndW1lbnREYXRhVHlwZSA9PSBMb29rdXBBcmd1bWVudHMuTG9va3VwQXJndW1lbnREYXRhVHlwZS5FeGNlbFJhbmdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxMb29rdXBOYXZpZ2F0b3IoZGlyZWN0aW9uLCBhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzLkFyZ3VtZW50RGF0YVR5cGUgPT0gTG9va3VwQXJndW1lbnRzLkxvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRGF0YUFycmF5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMb29rdXBOYXZpZ2F0b3IoZGlyZWN0aW9uLCBhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJJbnZhbGlkIGFyZ3VtZW50IGRhdGF0eXBlIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9NYXRjaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL01hdGNoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzIxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9NYXRjaC5jcwpAQCAtMCwwICsxLDEwNSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgTWF0Y2ggOiBMb29rdXBGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBlbnVtIE1hdGNoVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBDbG9zZXN0QWJvdmUgPSAtMSwKKyAgICAgICAgICAgIEV4YWN0TWF0Y2ggPSAwLAorICAgICAgICAgICAgQ2xvc2VzdEJlbG93ID0gMQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1hdGNoKCkKKyAgICAgICAgICAgIDogYmFzZShuZXcgV2lsZENhcmRWYWx1ZU1hdGNoZXIoKSwgbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisKKyAgICAgICAgICAgIHZhciBzZWFyY2hlZFZhbHVlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoY29udGV4dC5FeGNlbERhdGFQcm92aWRlcik7CisgICAgICAgICAgICB2YXIgcmFuZ2VBZGRyZXNzID0gcmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoYWRkcmVzcyk7CisgICAgICAgICAgICB2YXIgbWF0Y2hUeXBlID0gR2V0TWF0Y2hUeXBlKGFyZ3VtZW50cyk7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoc2VhcmNoZWRWYWx1ZSwgYWRkcmVzcywgMCwgMCwgZmFsc2UpOworICAgICAgICAgICAgdmFyIGxvb2t1cERpcmVjdGlvbiA9IEdldExvb2t1cERpcmVjdGlvbihyYW5nZUFkZHJlc3MpOworICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKGxvb2t1cERpcmVjdGlvbiwgYXJncywgY29udGV4dCk7CisgICAgICAgICAgICBpbnQ/IGxhc3RNYXRjaFJlc3VsdCA9IGRlZmF1bHQoaW50Pyk7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtYXRjaFJlc3VsdCA9IElzTWF0Y2gobmF2aWdhdG9yLkN1cnJlbnRWYWx1ZSwgc2VhcmNoZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoVHlwZSA9PSBNYXRjaFR5cGUuQ2xvc2VzdEJlbG93ICYmIG1hdGNoUmVzdWx0ID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RNYXRjaFJlc3VsdC5IYXNWYWx1ZSAmJiBtYXRjaFJlc3VsdCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLiBUaGlzIGhhcHBlbnMgb25seSBpZiB0aGUgZmlyc3QgaXRlbSBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgdGhlIHNlYXJjaGVkIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG1hdGNoUmVzdWx0ID09IDAgPyBuYXZpZ2F0b3IuSW5kZXggKyAxIDogbmF2aWdhdG9yLkluZGV4OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGluZGV4LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoVHlwZSA9PSBNYXRjaFR5cGUuQ2xvc2VzdEFib3ZlICYmIG1hdGNoUmVzdWx0IDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RNYXRjaFJlc3VsdC5IYXNWYWx1ZSAmJiBtYXRjaFJlc3VsdCA8IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLiBUaGlzIGhhcHBlbnMgb25seSBpZiB0aGUgZmlyc3QgaXRlbSBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdmUgdGhlIHNlYXJjaGVkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbWF0Y2hSZXN1bHQgPT0gMCA/IG5hdmlnYXRvci5JbmRleCArIDEgOiBuYXZpZ2F0b3IuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoaW5kZXgsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hUeXBlID09IE1hdGNoVHlwZS5FeGFjdE1hdGNoICYmIG1hdGNoUmVzdWx0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5hdmlnYXRvci5JbmRleCArIDEsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0TWF0Y2hSZXN1bHQgPSBtYXRjaFJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChuYXZpZ2F0b3IuTW92ZU5leHQoKSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG51bGwsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNYXRjaFR5cGUgR2V0TWF0Y2hUeXBlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1hdGNoVHlwZSA9IE1hdGNoVHlwZS5DbG9zZXN0QmVsb3c7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hdGNoVHlwZSA9IChNYXRjaFR5cGUpQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXRjaFR5cGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9PZmZzZXQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9PZmZzZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2Zjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL09mZnNldC5jcwpAQCAtMCwwICsxLDgwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTExCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCit7CisgICAgcHVibGljIGNsYXNzIE9mZnNldCA6IExvb2t1cEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDMpOworICAgICAgICAgICAgdmFyIHN0YXJ0UmFuZ2UgPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgcm93T2Zmc2V0ID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGNvbE9mZnNldCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoID4gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBoZWlnaHQgPT0gMCwgZUVycm9yVHlwZS5SZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZ1bmN0aW9uQXJndW1lbnRzLkxlbmd0aCA+IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgNCk7CisgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiB3aWR0aCA9PSAwLCBlRXJyb3JUeXBlLlJlZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzKHN0YXJ0UmFuZ2UpOworICAgICAgICAgICAgdmFyIHdzID0gYWRyLldvcmtTaGVldDsKKworICAgICAgICAgICAgdmFyIGZyb21Sb3cgPSBhZHIuX2Zyb21Sb3cgKyByb3dPZmZzZXQ7CisgICAgICAgICAgICB2YXIgZnJvbUNvbCA9IGFkci5fZnJvbUNvbCArIGNvbE9mZnNldDsKKyAgICAgICAgICAgIHZhciB0b1JvdyA9IChoZWlnaHQgIT0gMCA/IGhlaWdodCA6IGFkci5fdG9Sb3cpICsgcm93T2Zmc2V0OworICAgICAgICAgICAgdmFyIHRvQ29sID0gKHdpZHRoICE9IDAgPyB3aWR0aCA6IGFkci5fdG9Db2wpICsgY29sT2Zmc2V0OworCisgICAgICAgICAgICB2YXIgbmV3UmFuZ2UgPSBjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlKHdzLCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgICAgICAgICAgaWYgKCFuZXdSYW5nZS5Jc011bHRpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuZXdSYW5nZS5Jc0VtcHR5KSByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gbmV3UmFuZ2UuR2V0VmFsdWUoZnJvbVJvdywgZnJvbUNvbCk7CisgICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYyh2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmFsIGlzIEV4Y2VsRXJyb3JWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5ld1JhbmdlLCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1Jvdy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1Jvdy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE4Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvUm93LmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgUm93IDogTG9va3VwRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Gcm9tUm93LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgICAgICAgICAgaWYgKCFFeGNlbEFkZHJlc3NVdGlsLklzVmFsaWRBZGRyZXNzKHJhbmdlQWRkcmVzcykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBzdXBwbGllZCIpOworICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gZmFjdG9yeS5DcmVhdGUocmFuZ2VBZGRyZXNzKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYWRkcmVzcy5Gcm9tUm93LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1Jvd3MuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Sb3dzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2Q1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Sb3dzLmNzCkBAIC0wLDAgKzEsNTkgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKK3sKKyAgICBwdWJsaWMgY2xhc3MgUm93cyA6IExvb2t1cEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciByPWFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mbzsKKyAgICAgICAgICAgIGlmIChyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyLkFkZHJlc3MuX3RvUm93IC0gci5BZGRyZXNzLl9mcm9tUm93ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoRXhjZWxBZGRyZXNzVXRpbC5Jc1ZhbGlkQWRkcmVzcyhyYW5nZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKHJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLlRvUm93IC0gYWRkcmVzcy5Gcm9tUm93ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmdlIHN1cHBsaWVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9WTG9va3VwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvVkxvb2t1cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY4N2I1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvVkxvb2t1cC5jcwpAQCAtMCwwICsxLDU3IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIHB1YmxpYyBjbGFzcyBWTG9va3VwIDogTG9va3VwRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBTdG9wd2F0Y2ggc3cgPSBudWxsOworICAgICAgICAgICAgaWYgKGNvbnRleHQuRGVidWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3cgPSBuZXcgU3RvcHdhdGNoKCk7CisgICAgICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uVmVydGljYWwsIGxvb2t1cEFyZ3MsIGNvbnRleHQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuRGVidWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgICAgIGNvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nRnVuY3Rpb24oIlZMT09LVVAiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvQ1N0ci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9DU3RyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGRhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvQ1N0ci5jcwpAQCAtMCwwICsxLDQxIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAoreworICAgIHB1YmxpYyBjbGFzcyBDU3RyIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvQ2hhckZ1bmN0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NoYXJGdW5jdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzIxZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NoYXJGdW5jdGlvbi5jcwpAQCAtMCwwICsxLDE5IEBACivvu791c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ2hhckZ1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gbnVtYmVyIDwgMSB8fCBudW1iZXIgPiAyNTUsIGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgoKGNoYXIpIG51bWJlcikuVG9TdHJpbmcoKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Db25jYXRlbmF0ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Db25jYXRlbmF0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTAyMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NvbmNhdGVuYXRlLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIENvbmNhdGVuYXRlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHN0cmluZy5FbXB0eSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdiA9IGFyZy5WYWx1ZUZpcnN0OworICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzYi5Ub1N0cmluZygpLCBEYXRhVHlwZS5TdHJpbmcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0V4YWN0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0V4YWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWNmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRXhhY3QuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhhY3QgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciB2YWwxID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUZpcnN0OworICAgICAgICAgICAgdmFyIHZhbDIgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlRmlyc3Q7CisKKyAgICAgICAgICAgIGlmICh2YWwxID09IG51bGwgJiYgdmFsMiA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgodmFsMSA9PSBudWxsICYmIHZhbDIgIT0gbnVsbCkgfHwgKHZhbDEgIT0gbnVsbCAmJiB2YWwyID09IG51bGwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc3RyaW5nLkNvbXBhcmUodmFsMS5Ub1N0cmluZygpLCB2YWwyLlRvU3RyaW5nKCksIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCA9PSAwLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9GaW5kLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0ZpbmQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2MjJkMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9GaW5kLmNzCkBAIC0wLDAgKzEsNTYgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIEZpbmQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIHNlYXJjaCA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBzZWFyY2hJbiA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gMDsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5Db3VudCgpID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlYXJjaEluLkluZGV4T2Yoc2VhcmNoLCBzdGFydEluZGV4LCBTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZGluZyAxIGJlY2F1c2UgRXhjZWwgdXNlcyAxLWJhc2VkIGluZGV4CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCArIDEsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0ZpeGVkLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0ZpeGVkLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTI5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRml4ZWQuY3MKQEAgLTAsMCArMSwzNyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgRml4ZWQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBuRGVjaW1hbHMgPSAyOworICAgICAgICAgICAgdmFyIG5vQ29tbWFzID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5EZWNpbWFscyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vQ29tbWFzID0gQXJnVG9Cb29sKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgZm9ybWF0ID0gKG5vQ29tbWFzID8gIkYiIDogIk4iKSArIG5EZWNpbWFscy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIGlmIChuRGVjaW1hbHMgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bWJlciA9IG51bWJlciAtIChudW1iZXIgJSAoU3lzdGVtLk1hdGguUG93KDEwLCBuRGVjaW1hbHMgKiAtMSkpKTsKKyAgICAgICAgICAgICAgICBudW1iZXIgPSBTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIpOworICAgICAgICAgICAgICAgIGZvcm1hdCA9IG5vQ29tbWFzID8gIkYwIiA6ICJOMCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcmV0VmFsID0gbnVtYmVyLlRvU3RyaW5nKGZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJldFZhbCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9IeXBlcmxpbmsuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvSHlwZXJsaW5rLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDE4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvSHlwZXJsaW5rLmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIEh5cGVybGluayA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTGVmdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9MZWZ0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZGZlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTGVmdC5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAoreworICAgIHB1YmxpYyBjbGFzcyBMZWZ0IDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgc3RyID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICAgICAgICAgIHZhciBsZW5ndGggPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzdHIuU3Vic3RyaW5nKDAsIGxlbmd0aCksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTGVuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTcyNTJiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xlbi5jcwpAQCAtMCwwICsxLDQyIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAoreworICAgIHB1YmxpYyBjbGFzcyBMZW4gOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMuRmlyc3QoKS5WYWx1ZUZpcnN0LlRvU3RyaW5nKCkuTGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChDb252ZXJ0LlRvRG91YmxlKGxlbmd0aCksIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xvd2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xvd2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGQ4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTG93ZXIuY3MKQEAgLTAsMCArMSw0MSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgTG93ZXIgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLlRvTG93ZXIoKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9NaWQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTWlkLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmN2RhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTWlkLmNzCkBAIC0wLDAgKzEsNTcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIE1pZCA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgICAgICAgICAgdmFyIHRleHQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIHN0YXJ0SXggPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICBpZihzdGFydEl4PD0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgc3RhcnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDEiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0FsbG93IG92ZXJmbG93aW5nIHN0YXJ0IGFuZCBsZW5ndGgKKyAgICAgICAgICAgIGlmIChzdGFydEl4ID4gdGV4dC5MZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgiIiwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5TdWJzdHJpbmcoc3RhcnRJeCAtIDEsIHN0YXJ0SXggLSAxICsgbGVuZ3RoIDwgdGV4dC5MZW5ndGggPyBsZW5ndGggOiB0ZXh0Lkxlbmd0aCAtIHN0YXJ0SXggKyAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Qcm9wZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUHJvcGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDQ0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUHJvcGVyLmNzCkBAIC0wLDAgKzEsNTcgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvcGVyIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgdGV4dCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB2YXIgcHJldmlvdXNDaGFyID0gJy4nOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNoIGluIHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGFyLklzTGV0dGVyKHByZXZpb3VzQ2hhcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoY2guVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuVG9VcHBlckludmFyaWFudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXNDaGFyID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHNiLlRvU3RyaW5nKCksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUmVwbGFjZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXBsYWNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODNjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUmVwbGFjZS5jcwpAQCAtMCwwICsxLDYwIEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAoreworICAgIHB1YmxpYyBjbGFzcyBSZXBsYWNlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgNCk7CisgICAgICAgICAgICB2YXIgb2xkVGV4dCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgc3RhcnRQb3MgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIG5DaGFyc1RvUmVwbGFjZSA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMik7CisgICAgICAgICAgICB2YXIgbmV3VGV4dCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgZmlyc3RQYXJ0ID0gR2V0Rmlyc3RQYXJ0KG9sZFRleHQsIHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIHZhciBsYXN0UGFydCA9IEdldExhc3RQYXJ0KG9sZFRleHQsIHN0YXJ0UG9zLCBuQ2hhcnNUb1JlcGxhY2UpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHN0cmluZy5Db25jYXQoZmlyc3RQYXJ0LCBuZXdUZXh0LCBsYXN0UGFydCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEZpcnN0UGFydChzdHJpbmcgdGV4dCwgaW50IHN0YXJ0UG9zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGV4dC5TdWJzdHJpbmcoMCwgc3RhcnRQb3MgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldExhc3RQYXJ0KHN0cmluZyB0ZXh0LCBpbnQgc3RhcnRQb3MsIGludCBuQ2hhcmFjdGVyc1RvUmVwbGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN0YXJ0SXggPSBzdGFydFBvcyAtMTsKKyAgICAgICAgICAgIHN0YXJ0SXggKz0gbkNoYXJhY3RlcnNUb1JlcGxhY2U7CisgICAgICAgICAgICByZXR1cm4gdGV4dC5TdWJzdHJpbmcoc3RhcnRJeCwgdGV4dC5MZW5ndGggLSBzdGFydEl4KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXB0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JlcHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhZmJkNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXB0LmNzCkBAIC0wLDAgKzEsNDggQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIFJlcHQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIG4gPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgbjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzYi5Ub1N0cmluZygpLCBEYXRhVHlwZS5TdHJpbmcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JpZ2h0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JpZ2h0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGU1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUmlnaHQuY3MKQEAgLTAsMCArMSw0NCBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUmlnaHQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgc3RhcnRJeCA9IHN0ci5MZW5ndGggLSBsZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHN0ci5TdWJzdHJpbmcoc3RhcnRJeCwgc3RyLkxlbmd0aCAtIHN0YXJ0SXgpLCBEYXRhVHlwZS5TdHJpbmcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1NlYXJjaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9TZWFyY2guY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1MjhjZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9TZWFyY2guY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNi0wMy0yOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKK3sKKyAgICBwdWJsaWMgY2xhc3MgU2VhcmNoIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciBzZWFyY2ggPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgc2VhcmNoSW4gPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuQ291bnQoKSA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBzZWFyY2hJbi5JbmRleE9mKHNlYXJjaCwgc3RhcnRJbmRleCwgU3lzdGVtLlN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWRkaW5nIDEgYmVjYXVzZSBFeGNlbCB1c2VzIDEtYmFzZWQgaW5kZXgKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvU3Vic3RpdHV0ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9TdWJzdGl0dXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDk3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvU3Vic3RpdHV0ZS5jcwpAQCAtMCwwICsxLDQ1IEBACivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAoreworICAgIHB1YmxpYyBjbGFzcyBTdWJzdGl0dXRlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgICAgICAgICB2YXIgdGV4dCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgICAgICAgICB2YXIgZmluZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICB2YXIgcmVwbGFjZVdpdGggPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRleHQuUmVwbGFjZShmaW5kLCByZXBsYWNlV2l0aCk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9ULmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3OTg5MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9ULmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIFQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIHZhciB2YWwgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlRmlyc3Q7CisgICAgICAgICAgICBpZiAodmFsIGlzIHN0cmluZykgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHN0cmluZy5FbXB0eSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9UZXh0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1RleHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3YmEzNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9UZXh0LmNzCkBAIC0wLDAgKzEsNDggQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuICAgCQkgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTQtMDEtMTcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIFRleHQgOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5GaXJzdCgpLlZhbHVlRmlyc3Q7CisgICAgICAgICAgICB2YXIgZm9ybWF0ID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5SZXBsYWNlKFN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlLk51bWJlckZvcm1hdC5OdW1iZXJEZWNpbWFsU2VwYXJhdG9yLCAiLiIpOworICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LlJlcGxhY2UoU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuTnVtYmVyRm9ybWF0Lk51bWJlckdyb3VwU2VwYXJhdG9yLlJlcGxhY2UoKGNoYXIpMTYwLCcgJyksICIsIik7IC8vU3BlY2lhbCBoYW5kbGluZyBmb3IgTm8tQnJlYWsgU3BhY2UKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIuR2V0Rm9ybWF0KHZhbHVlLCBmb3JtYXQpOworCisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9VcHBlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9VcHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI4YWNkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1VwcGVyLmNzCkBAIC0wLDAgKzEsNDEgQEAKK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIFVwcGVyIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGFyZ3VtZW50cy5GaXJzdCgpLlZhbHVlRmlyc3QuVG9TdHJpbmcoKS5Ub1VwcGVyKCksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvVmFsdWUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvVmFsdWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiM2UyNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9WYWx1ZS5jcwpAQCAtMCwwICsxLDYwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgcHVibGljIGNsYXNzIFZhbHVlIDogRXhjZWxGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX2dyb3VwU2VwYXJhdG9yID0gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuTnVtYmVyRm9ybWF0Lk51bWJlckdyb3VwU2VwYXJhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZGVjaW1hbFNlcGFyYXRvciA9IEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlLk51bWJlckZvcm1hdC5OdW1iZXJEZWNpbWFsU2VwYXJhdG9yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfdGltZVNlcGFyYXRvciA9IEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlLkRhdGVUaW1lRm9ybWF0LlRpbWVTZXBhcmF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9zaG9ydFRpbWVQYXR0ZXJuID0gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuRGF0ZVRpbWVGb3JtYXQuU2hvcnRUaW1lUGF0dGVybjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEYXRlVmFsdWUgX2RhdGVWYWx1ZUZ1bmMgPSBuZXcgRGF0ZVZhbHVlKCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGltZVZhbHVlIF90aW1lVmFsdWVGdW5jID0gbmV3IFRpbWVWYWx1ZSgpOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgICAgICAgICAgdmFyIHZhbCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCkuVHJpbUVuZCgnICcpOworICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDBkOworICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2godmFsLCAkIl5bXFxkXSooe1JlZ2V4LkVzY2FwZShfZ3JvdXBTZXBhcmF0b3IpfT9bXFxkXSopPyh7UmVnZXguRXNjYXBlKF9kZWNpbWFsU2VwYXJhdG9yKX1bXFxkXSopP1sgPyUgP10/JCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWwuRW5kc1dpdGgoIiUiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5UcmltRW5kKCclJyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRvdWJsZS5QYXJzZSh2YWwpIC8gMTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkb3VibGUuUGFyc2UodmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2YWwsIE51bWJlclN0eWxlcy5GbG9hdCwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUsIG91dCByZXN1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB0aW1lU2VwYXJhdG9yID0gUmVnZXguRXNjYXBlKF90aW1lU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKHZhbCwgQCJeW1xkXXsxLDJ9IiArIHRpbWVTZXBhcmF0b3IgKyBAIltcZF17Mn0oIiArIHRpbWVTZXBhcmF0b3IgKyBAIltcZF17Mn0pPyQiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdGltZVJlc3VsdCA9IF90aW1lVmFsdWVGdW5jLkV4ZWN1dGUodmFsKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZVJlc3VsdC5EYXRhVHlwZSA9PSBEYXRhVHlwZS5EYXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVSZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGRhdGVSZXN1bHQgPSBfZGF0ZVZhbHVlRnVuYy5FeGVjdXRlKHZhbCk7CisgICAgICAgICAgICBpZiAoZGF0ZVJlc3VsdC5EYXRhVHlwZSA9PSBEYXRhVHlwZS5EYXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkYXRlUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvSU9wZXJhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9ycy9JT3BlcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNzg1MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvSU9wZXJhdG9yLmNzCkBAIC0wLDAgKzEsNDcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzCit7CisgICAgcHVibGljIGludGVyZmFjZSBJT3BlcmF0b3IKKyAgICB7CisgICAgICAgIE9wZXJhdG9ycyBPcGVyYXRvciB7IGdldDsgfQorCisgICAgICAgIENvbXBpbGVSZXN1bHQgQXBwbHkoQ29tcGlsZVJlc3VsdCBsZWZ0LCBDb21waWxlUmVzdWx0IHJpZ2h0KTsKKworICAgICAgICBpbnQgUHJlY2VkZW5jZSB7IGdldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1M2E0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yLmNzCkBAIC0wLDAgKzEsMzk1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgT3BlcmF0b3IgOiBJT3BlcmF0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFByZWNlZGVuY2VQZXJjZW50ID0gMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUHJlY2VkZW5jZUV4cCA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFByZWNlZGVuY2VNdWx0aXBseURldmlkZSA9IDY7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFByZWNlZGVuY2VJbnRlZ2VyRGl2aXNpb24gPSA4OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBQcmVjZWRlbmNlTW9kdWx1cyA9IDEwOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBQcmVjZWRlbmNlQWRkU3VidHJhY3QgPSAxMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUHJlY2VkZW5jZUNvbmNhdCA9IDE1OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBQcmVjZWRlbmNlQ29tcGFyaXNvbiA9IDI1OworCisgICAgICAgIHByaXZhdGUgT3BlcmF0b3IoKSB7IH0KKworICAgICAgICBwcml2YXRlIE9wZXJhdG9yKE9wZXJhdG9ycyBAb3BlcmF0b3IsIGludCBwcmVjZWRlbmNlLCBGdW5jPENvbXBpbGVSZXN1bHQsIENvbXBpbGVSZXN1bHQsIENvbXBpbGVSZXN1bHQ+IGltcGxlbWVudGF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBfaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjsKKyAgICAgICAgICAgIF9wcmVjZWRlbmNlID0gcHJlY2VkZW5jZTsKKyAgICAgICAgICAgIF9vcGVyYXRvciA9IEBvcGVyYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxDb21waWxlUmVzdWx0LCBDb21waWxlUmVzdWx0LCBDb21waWxlUmVzdWx0PiBfaW1wbGVtZW50YXRpb247CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wcmVjZWRlbmNlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9wZXJhdG9ycyBfb3BlcmF0b3I7CisKKyAgICAgICAgaW50IElPcGVyYXRvci5QcmVjZWRlbmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfcHJlY2VkZW5jZTsgfQorICAgICAgICB9CisKKyAgICAgICAgT3BlcmF0b3JzIElPcGVyYXRvci5PcGVyYXRvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX29wZXJhdG9yOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGlsZVJlc3VsdCBBcHBseShDb21waWxlUmVzdWx0IGxlZnQsIENvbXBpbGVSZXN1bHQgcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZWZ0LlJlc3VsdCBpcyBFeGNlbEVycm9yVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGxlZnQuUmVzdWx0LCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgICAgICAgICAvL3Rocm93KG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSlsZWZ0LlJlc3VsdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocmlnaHQuUmVzdWx0IGlzIEV4Y2VsRXJyb3JWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQocmlnaHQuUmVzdWx0LCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgICAgICAgICAvL3Rocm93KG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSlyaWdodC5SZXN1bHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfaW1wbGVtZW50YXRpb24obGVmdCwgcmlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiT3BlcmF0b3I6ICIgKyBfb3BlcmF0b3I7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX3BsdXM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIFBsdXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9wbHVzID8/IChfcGx1cyA9IG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuUGx1cywgUHJlY2VkZW5jZUFkZFN1YnRyYWN0LCAobCwgcikgPT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGwgPSBsID09IG51bGwgfHwgbC5SZXN1bHQgPT0gbnVsbCA/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpIDogbDsKKyAgICAgICAgICAgICAgICAgICAgciA9IHIgPT0gbnVsbCB8fCByLlJlc3VsdCA9PSBudWxsID8gbmV3IENvbXBpbGVSZXN1bHQoMCwgRGF0YVR5cGUuSW50ZWdlcikgOiByOworICAgICAgICAgICAgICAgICAgICBFeGNlbEVycm9yVmFsdWUgZXJyb3JWYWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChFaXRoZXJJc0Vycm9yKGwsIHIsIG91dCBlcnJvclZhbCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlcnJvclZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGwuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlciAmJiByLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsLlJlc3VsdE51bWVyaWMgKyByLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsLklzTnVtZXJpYyB8fCBsLklzTnVtZXJpY1N0cmluZyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci5Jc051bWVyaWMgfHwgci5Jc051bWVyaWNTdHJpbmcgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsLlJlc3VsdE51bWVyaWMgKyByLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX21pbnVzOworICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBNaW51cworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX21pbnVzID8/IChfbWludXMgPSBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLk1pbnVzLCBQcmVjZWRlbmNlQWRkU3VidHJhY3QsIChsLCByKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbCA9IGwgPT0gbnVsbCB8fCBsLlJlc3VsdCA9PSBudWxsID8gbmV3IENvbXBpbGVSZXN1bHQoMCwgRGF0YVR5cGUuSW50ZWdlcikgOiBsOworICAgICAgICAgICAgICAgICAgICByID0gciA9PSBudWxsIHx8IHIuUmVzdWx0ID09IG51bGwgPyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKSA6IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIgJiYgci5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQobC5SZXN1bHROdW1lcmljIC0gci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobC5Jc051bWVyaWMgfHwgbC5Jc051bWVyaWNTdHJpbmcgfHwgbC5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIuSXNOdW1lcmljIHx8IHIuSXNOdW1lcmljU3RyaW5nIHx8IHIuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQobC5SZXN1bHROdW1lcmljIC0gci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX211bHRpcGx5OworICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBNdWx0aXBseQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX211bHRpcGx5ID8/IChfbXVsdGlwbHkgPSBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLk11bHRpcGx5LCBQcmVjZWRlbmNlTXVsdGlwbHlEZXZpZGUsIChsLCByKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbCA9IGwgPz8gbmV3IENvbXBpbGVSZXN1bHQoMCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgICAgIHIgPSByID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobC5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyICYmIHIuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGwuUmVzdWx0TnVtZXJpYypyLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsLklzTnVtZXJpYyB8fCBsLklzTnVtZXJpY1N0cmluZyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci5Jc051bWVyaWMgfHwgci5Jc051bWVyaWNTdHJpbmcgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsLlJlc3VsdE51bWVyaWMqci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9kaXZpZGU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIERpdmlkZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RpdmlkZSA/PyAoX2RpdmlkZSA9IG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuRGl2aWRlLCBQcmVjZWRlbmNlTXVsdGlwbHlEZXZpZGUsIChsLCByKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEobC5Jc051bWVyaWMgfHwgbC5Jc051bWVyaWNTdHJpbmcgfHwgbC5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICEoci5Jc051bWVyaWMgfHwgci5Jc051bWVyaWNTdHJpbmcgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IGwuUmVzdWx0TnVtZXJpYzsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gci5SZXN1bHROdW1lcmljOworICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5BYnMocmlnaHQgLSAwZCkgPCBkb3VibGUuRXBzaWxvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGVFcnJvclR5cGUuRGl2MCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGwuSXNOdW1lcmljIHx8IGwuSXNOdW1lcmljU3RyaW5nIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyLklzTnVtZXJpYyB8fCByLklzTnVtZXJpY1N0cmluZyB8fCByLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGxlZnQvcmlnaHQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBFeHAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuRXhwb25lbnRpYXRpb24sIFByZWNlZGVuY2VFeHAsIChsLCByKSA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSBudWxsICYmIHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsID0gbCA/PyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsLklzTnVtZXJpYyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJiAoci5Jc051bWVyaWMgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KE1hdGguUG93KGwuUmVzdWx0TnVtZXJpYywgci5SZXN1bHROdW1lcmljKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoMGQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIENvbmNhdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5Db25jYXQsIFByZWNlZGVuY2VDb25jYXQsIChsLCByKSA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsID0gbCA/PyBuZXcgQ29tcGlsZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gciA/PyBuZXcgQ29tcGlsZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFN0ciA9IGwuUmVzdWx0ICE9IG51bGwgPyBsLlJlc3VsdFZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgclN0ciA9IHIuUmVzdWx0ICE9IG51bGwgPyByLlJlc3VsdFZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoc3RyaW5nLkNvbmNhdChsU3RyLCByU3RyKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX2dyZWF0ZXJUaGFuOworICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBHcmVhdGVyVGhhbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkdyZWF0ZXJUaGFuLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwgKGwsIHIpID0+IG5ldyBDb21waWxlUmVzdWx0KENvbXBhcmUobCwgcikgPiAwLCBEYXRhVHlwZS5Cb29sZWFuKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ncmVhdGVyVGhhbiA/PworICAgICAgICAgICAgICAgICAgICAgICAoX2dyZWF0ZXJUaGFuID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCwgcikgPT4gQ29tcGFyZShsLCByLCAoY29tcFJlcykgPT4gY29tcFJlcyA+IDApKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX2VxOworICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBFcQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkVxdWFscywgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpID09IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2VxID8/CisgICAgICAgICAgICAgICAgICAgICAgIChfZXEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsIFByZWNlZGVuY2VDb21wYXJpc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsLCByKSA9PiBDb21wYXJlKGwsIHIsIChjb21wUmVzKSA9PiBjb21wUmVzID09IDApKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX25vdEVxdWFsc1RvOworICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBOb3RFcXVhbHNUbworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLk5vdEVxdWFsVG8sIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gbmV3IENvbXBpbGVSZXN1bHQoQ29tcGFyZShsLCByKSAhPSAwLCBEYXRhVHlwZS5Cb29sZWFuKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ub3RFcXVhbHNUbyA/PworICAgICAgICAgICAgICAgICAgICAgICAoX25vdEVxdWFsc1RvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCwgcikgPT4gQ29tcGFyZShsLCByLCAoY29tcFJlcykgPT4gY29tcFJlcyAhPSAwKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9ncmVhdGVyVGhhbk9yRXF1YWw7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIEdyZWF0ZXJUaGFuT3JFcXVhbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkdyZWF0ZXJUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpID49IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2dyZWF0ZXJUaGFuT3JFcXVhbCA/PworICAgICAgICAgICAgICAgICAgICAgICAoX2dyZWF0ZXJUaGFuT3JFcXVhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGwsIHIpID0+IENvbXBhcmUobCwgciwgKGNvbXBSZXMpID0+IGNvbXBSZXMgPj0gMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIElPcGVyYXRvciBfbGVzc1RoYW47CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIExlc3NUaGFuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTGVzc1RoYW4sIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gbmV3IENvbXBpbGVSZXN1bHQoQ29tcGFyZShsLCByKSA8IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xlc3NUaGFuID8/CisgICAgICAgICAgICAgICAgICAgICAgIChfbGVzc1RoYW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsIFByZWNlZGVuY2VDb21wYXJpc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsLCByKSA9PiBDb21wYXJlKGwsIHIsIChjb21wUmVzKSA9PiBjb21wUmVzIDwgMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIExlc3NUaGFuT3JFcXVhbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpIDw9IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gQ29tcGFyZShsLCByLCAoY29tcFJlcykgPT4gY29tcFJlcyA8PSAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX3BlcmNlbnQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIFBlcmNlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9wZXJjZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGVyY2VudCA9IG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuUGVyY2VudCwgUHJlY2VkZW5jZVBlcmNlbnQsIChsLCByKSA9PgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIgJiYgci5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGwuUmVzdWx0TnVtZXJpYyAqIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsLklzTnVtZXJpYyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJiAoci5Jc051bWVyaWMgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQobC5SZXN1bHROdW1lcmljICogci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfcGVyY2VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBHZXRPYmpGcm9tT3RoZXIoQ29tcGlsZVJlc3VsdCBvYmosIENvbXBpbGVSZXN1bHQgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvYmouUmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLkRhdGFUeXBlID09IERhdGFUeXBlLlN0cmluZykgcmV0dXJuIHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAwZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvYmouUmVzdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBDb21waWxlUmVzdWx0IENvbXBhcmUoQ29tcGlsZVJlc3VsdCBsLCBDb21waWxlUmVzdWx0IHIsIEZ1bmM8aW50LCBib29sPiBjb21wYXJpc29uICkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxFcnJvclZhbHVlIGVycm9yVmFsOworICAgICAgICAgICAgaWYgKEVpdGhlcklzRXJyb3IobCwgciwgb3V0IGVycm9yVmFsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZXJyb3JWYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqZWN0IGxlZnQsIHJpZ2h0OworICAgICAgICAgICAgbGVmdCA9IEdldE9iakZyb21PdGhlcihsLCByKTsKKyAgICAgICAgICAgIHJpZ2h0ID0gR2V0T2JqRnJvbU90aGVyKHIsIGwpOworICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhsZWZ0KSAmJiBDb252ZXJ0VXRpbC5Jc051bWVyaWMocmlnaHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBsbnVtID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUobGVmdCk7CisgICAgICAgICAgICAgICAgdmFyIHJudW0gPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShyaWdodCk7CisgICAgICAgICAgICAgICAgaWYgKE1hdGguQWJzKGxudW0gLSBybnVtKSA8IGRvdWJsZS5FcHNpbG9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGNvbXBhcmlzb24oMCksIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY29tcGFyaXNvblJlc3VsdCA9IGxudW0uQ29tcGFyZVRvKHJudW0pOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChjb21wYXJpc29uKGNvbXBhcmlzb25SZXN1bHQpLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29tcGFyaXNvblJlc3VsdCA9IENvbXBhcmVTdHJpbmcobGVmdCwgcmlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChjb21wYXJpc29uKGNvbXBhcmlzb25SZXN1bHQpLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDb21wYXJlU3RyaW5nKG9iamVjdCBsLCBvYmplY3QgcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNsID0gKGwgPz8gIiIpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB2YXIgc3IgPSAociA/PyAiIikuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uU3RyaW5nLkNvbXBhcmUoc2wsIHNyLCBTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgIEVpdGhlcklzRXJyb3IoQ29tcGlsZVJlc3VsdCBsLCBDb21waWxlUmVzdWx0IHIsIG91dCBFeGNlbEVycm9yVmFsdWUgZXJyb3JWYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkV4Y2VsRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JWYWwgPSAoRXhjZWxFcnJvclZhbHVlKSBsLlJlc3VsdDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyLkRhdGFUeXBlID09IERhdGFUeXBlLkV4Y2VsRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JWYWwgPSAoRXhjZWxFcnJvclZhbHVlKSByLlJlc3VsdDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yVmFsID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9ycy9PcGVyYXRvcnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNDc3NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzLmNzCkBAIC0wLDAgKzEsNTcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9ycworeworICAgIHB1YmxpYyBlbnVtIE9wZXJhdG9ycworICAgIHsKKyAgICAgICAgVW5kZWZpbmVkLAorICAgICAgICBDb25jYXQsCisgICAgICAgIFBsdXMsCisgICAgICAgIE1pbnVzLAorICAgICAgICBNdWx0aXBseSwKKyAgICAgICAgRGl2aWRlLAorICAgICAgICBNb2R1bHVzLAorICAgICAgICBQZXJjZW50LAorICAgICAgICBFcXVhbHMsCisgICAgICAgIEdyZWF0ZXJUaGFuLAorICAgICAgICBHcmVhdGVyVGhhbk9yRXF1YWwsCisgICAgICAgIExlc3NUaGFuLAorICAgICAgICBMZXNzVGhhbk9yRXF1YWwsCisgICAgICAgIE5vdEVxdWFsVG8sCisgICAgICAgIEludGVnZXJEaXZpc2lvbiwKKyAgICAgICAgRXhwb25lbnRpYXRpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yc0RpY3QuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yc0RpY3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhMzRmYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzRGljdC5jcwpAQCAtMCwwICsxLDcwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgT3BlcmF0b3JzRGljdCA6IERpY3Rpb25hcnk8c3RyaW5nLCBJT3BlcmF0b3I+CisgICAgeworICAgICAgICBwdWJsaWMgT3BlcmF0b3JzRGljdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZCgiKyIsIE9wZXJhdG9yLlBsdXMpOworICAgICAgICAgICAgQWRkKCItIiwgT3BlcmF0b3IuTWludXMpOworICAgICAgICAgICAgQWRkKCIqIiwgT3BlcmF0b3IuTXVsdGlwbHkpOworICAgICAgICAgICAgQWRkKCIvIiwgT3BlcmF0b3IuRGl2aWRlKTsKKyAgICAgICAgICAgIEFkZCgiXiIsIE9wZXJhdG9yLkV4cCk7CisgICAgICAgICAgICBBZGQoIj0iLCBPcGVyYXRvci5FcSk7CisgICAgICAgICAgICBBZGQoIj4iLCBPcGVyYXRvci5HcmVhdGVyVGhhbik7CisgICAgICAgICAgICBBZGQoIj49IiwgT3BlcmF0b3IuR3JlYXRlclRoYW5PckVxdWFsKTsKKyAgICAgICAgICAgIEFkZCgiPCIsIE9wZXJhdG9yLkxlc3NUaGFuKTsKKyAgICAgICAgICAgIEFkZCgiPD0iLCBPcGVyYXRvci5MZXNzVGhhbk9yRXF1YWwpOworICAgICAgICAgICAgQWRkKCI8PiIsIE9wZXJhdG9yLk5vdEVxdWFsc1RvKTsKKyAgICAgICAgICAgIEFkZCgiJiIsIE9wZXJhdG9yLkNvbmNhdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJRGljdGlvbmFyeTxzdHJpbmcsIElPcGVyYXRvcj4gX2luc3RhbmNlOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSURpY3Rpb25hcnk8c3RyaW5nLCBJT3BlcmF0b3I+IEluc3RhbmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBuZXcgT3BlcmF0b3JzRGljdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2luc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsQ2FsY3VsYXRpb25PcHRpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxDYWxjdWxhdGlvbk9wdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjQyNzEwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsQ2FsY3VsYXRpb25PcHRpb24uY3MKQEAgLTAsMCArMSwxNiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIHB1YmxpYyBjbGFzcyBFeGNlbENhbGN1bGF0aW9uT3B0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsbG93Q2lyY3VsYXJlUmVmZXJlbmNlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sIEFsbG93Q2lyY3VsYXJlUmVmZXJlbmNlcyB7IGdldDsgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsQ2VsbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbENlbGwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MGIwOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbENlbGwuY3MKQEAgLTAsMCArMSwyNiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIHB1YmxpYyBjbGFzcyBFeGNlbENlbGwKKyAgICB7CisgICAgICAgIHB1YmxpYyBFeGNlbENlbGwob2JqZWN0IHZhbCwgc3RyaW5nIGZvcm11bGEsIGludCBjb2xJbmRleCwgaW50IHJvd0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IHZhbDsKKyAgICAgICAgICAgIEZvcm11bGEgPSBmb3JtdWxhOworICAgICAgICAgICAgQ29sSW5kZXggPSBjb2xJbmRleDsKKyAgICAgICAgICAgIFJvd0luZGV4ID0gcm93SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENvbEluZGV4IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgUm93SW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsRGF0YVByb3ZpZGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsRGF0YVByb3ZpZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjk5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxEYXRhUHJvdmlkZXIuY3MKQEAgLTAsMCArMSwxMzEgQEAKK++7v3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gYmUgYWJsZSB0byBkZWxpdmVyIGV4Y2VsIGRhdGEKKyAgICAvLy8gdG8gdGhlIGZvcm11bGEgcGFyc2VyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEV4Y2VsRGF0YVByb3ZpZGVyIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgcmFuZ2Ugb2YgY2VsbHMgaW4gYSB3b3Jrc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSVJhbmdlSW5mbyA6IElFbnVtZXJhdG9yPElDZWxsSW5mbz4sIElFbnVtZXJhYmxlPElDZWxsSW5mbz4KKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBJc0VtcHR5IHsgZ2V0OyB9CisgICAgICAgICAgICBib29sIElzTXVsdGkgeyBnZXQ7IH0KKyAgICAgICAgICAgIGludCBHZXROQ2VsbHMoKTsKKyAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UgQWRkcmVzcyB7IGdldDsgfQorICAgICAgICAgICAgb2JqZWN0IEdldFZhbHVlKGludCByb3csIGludCBjb2wpOworICAgICAgICAgICAgb2JqZWN0IEdldE9mZnNldChpbnQgcm93T2Zmc2V0LCBpbnQgY29sT2Zmc2V0KTsKKworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0IHsgZ2V0OyB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5mb3JtYXRpb24gYW5kIGhlbHAgbWV0aG9kcyBhYm91dCBhIGNlbGwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBJQ2VsbEluZm8KKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIEFkZHJlc3MgeyBnZXQ7IH0KKyAgICAgICAgICAgIGludCBSb3cgeyBnZXQ7IH0KKyAgICAgICAgICAgIGludCBDb2x1bW4geyBnZXQ7IH0KKyAgICAgICAgICAgIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyAgfQorICAgICAgICAgICAgb2JqZWN0IFZhbHVlIHsgZ2V0OyB9CisgICAgICAgICAgICBkb3VibGUgVmFsdWVEb3VibGUgeyBnZXQ7IH0KKyAgICAgICAgICAgIGRvdWJsZSBWYWx1ZURvdWJsZUxvZ2ljYWwgeyBnZXQ7IH0KKyAgICAgICAgICAgIGJvb2wgSXNIaWRkZW5Sb3cgeyBnZXQ7IH0KKyAgICAgICAgICAgIGJvb2wgSXNFeGNlbEVycm9yIHsgZ2V0OyB9CisgICAgICAgICAgICBJTGlzdDxUb2tlbj4gVG9rZW5zIHsgZ2V0OyB9ICAgCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBJTmFtZUluZm8KKyAgICAgICAgeworICAgICAgICAgICAgdWxvbmcgSWQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgc3RyaW5nIFdvcmtzaGVldCB7Z2V0OyBzZXQ7fQorICAgICAgICAgICAgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgSUxpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgfQorICAgICAgICAgICAgb2JqZWN0IFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgd29ya3NoZWV0IG5hbWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIEdldFdvcmtzaGVldE5hbWVzKHN0cmluZyB3b3Jrc2hlZXQpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIGFsbCBkZWZpbmVkIG5hbWVzIGluIGEgd29ya2Jvb2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGFic3RyYWN0IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdmFsdWVzIGZyb20gdGhlIHJlcXVpcmVkIHJhbmdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldE5hbWUiPlRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Um93PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPkNvbHVtbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJlZmVyZW5jZSBhZGRyZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGFic3RyYWN0IElSYW5nZUluZm8gR2V0UmFuZ2Uoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4sIHN0cmluZyBhZGRyZXNzKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IElOYW1lSW5mbyBHZXROYW1lKHN0cmluZyB3b3Jrc2hlZXQsIHN0cmluZyBuYW1lKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSUVudW1lcmFibGU8b2JqZWN0PiBHZXRSYW5nZVZhbHVlcyhzdHJpbmcgYWRkcmVzcyk7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHN0cmluZyBHZXRSYW5nZUZvcm11bGEoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxUb2tlbj4gR2V0UmFuZ2VGb3JtdWxhVG9rZW5zKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNSb3dIaWRkZW4oc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3cpOworICAgICAgICAvLy8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vLy8gUmV0dXJucyBhIHNpbmdsZSBjZWxsIHZhbHVlCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgLy9wdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IEdldENlbGxWYWx1ZShpbnQgc2hlZXRJRCwgc3RyaW5nIGFkZHJlc3MpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgYSBzaW5nbGUgY2VsbCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0TmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IEdldENlbGxWYWx1ZShzdHJpbmcgc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sKTsKKworICAgICAgICAvLy8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vLy8gU2V0cyB0aGUgdmFsdWUgb24gdGhlIGNlbGwKKyAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvL3B1YmxpYyBhYnN0cmFjdCB2b2lkIFNldENlbGxWYWx1ZShzdHJpbmcgYWRkcmVzcywgb2JqZWN0IHZhbHVlKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlc3QgcmlnaHRtb3N0IGNlbGwgb24gdGhlIHdvcmtzaGVldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBFeGNlbENlbGxBZGRyZXNzIEdldERpbWVuc2lvbkVuZChzdHJpbmcgd29ya3NoZWV0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgdGhpcyBtZXRob2QgdG8gZnJlZSB1bm1hbmFnZWQgcmVzb3VyY2VzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWF4IG51bWJlciBvZiBjb2x1bW5zIGluIGEgd29ya3NoZWV0IHRoYXQgdGhlIEV4Y2VsIGRhdGEgcHJvdmlkZXIgY2FuIGhhbmRsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBFeGNlbE1heENvbHVtbnMgeyBnZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNYXggbnVtYmVyIG9mIHJvd3MgaW4gYSB3b3Jrc2hlZXQgdGhhdCB0aGUgRXhjZWwgZGF0YSBwcm92aWRlciBjYW4gaGFuZGxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgRXhjZWxNYXhSb3dzIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRSYW5nZVZhbHVlKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHN0cmluZyBHZXRGb3JtYXQob2JqZWN0IHZhbHVlLCBzdHJpbmcgZm9ybWF0KTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZXNldCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVJhbmdlSW5mbyBHZXRSYW5nZShzdHJpbmcgd29ya3NoZWV0LCBpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxEYXRhUHJvdmlkZXIuY3Mub3JpZyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbERhdGFQcm92aWRlci5jcy5vcmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Mjg0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxEYXRhUHJvdmlkZXIuY3Mub3JpZwpAQCAtMCwwICsxLDEwMSBAQAor77u/dXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBiZSBhYmxlIHRvIGRlbGl2ZXIgZXhjZWwgZGF0YQorICAgIC8vLyB0byB0aGUgZm9ybXVsYSBwYXJzZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhjZWxEYXRhUHJvdmlkZXIgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHVibGljIGludGVyZmFjZSBJQ2VsbEluZm8gOiBJRW51bWVyYXRvcjxJQ2VsbEluZm8+LCBJRW51bWVyYWJsZTxJQ2VsbEluZm8+CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBBZGRyZXNzIHsgZ2V0OyB9CisgICAgICAgICAgICBpbnQgUm93IHsgZ2V0OyB9CisgICAgICAgICAgICBpbnQgQ29sdW1uIHsgZ2V0OyB9CisgICAgICAgICAgICBzdHJpbmcgRm9ybXVsYSB7IGdldDsgIH0KKyAgICAgICAgICAgIG9iamVjdCBWYWx1ZSB7IGdldDsgfQorICAgICAgICAgICAgZG91YmxlIFZhbHVlRG91YmxlIHsgZ2V0OyB9CisgICAgICAgICAgICBkb3VibGUgVmFsdWVEb3VibGVMb2dpY2FsIHsgZ2V0OyB9CisgICAgICAgICAgICBib29sIElzSGlkZGVuUm93IHsgZ2V0OyB9CisgICAgICAgICAgICBib29sIElzRW1wdHkgeyBnZXQ7IH0KKyAgICAgICAgICAgIGJvb2wgSXNNdWx0aSB7IGdldDsgfQorICAgICAgICAgICAgYm9vbCBOZXh0Q2VsbCgpOworICAgICAgICAgICAgSUxpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgfQorICAgICAgICAgICAgaW50IEdldE5DZWxscygpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSU5hbWVJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIHVsb25nIElkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIElMaXN0PFRva2VuPiBUb2tlbnMgeyBnZXQ7IH0KKyAgICAgICAgICAgIG9iamVjdCBWYWx1ZSB7IGdldDsgc2V0OyB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIHdvcmtzaGVldCBuYW1lcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3Jrc2hlZXROYW1lcygpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIGFsbCBkZWZpbmVkIG5hbWVzIGluIGEgd29ya2Jvb2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGFic3RyYWN0IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdmFsdWVzIGZyb20gdGhlIHJlcXVpcmVkIHJhbmdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPkFuIEV4Y2VsIGFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dmFsdWVzIGZyb20gdGhlIHJlcXVpcmVkIGNlbGxzPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSUNlbGxJbmZvIEdldFJhbmdlKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uLCBzdHJpbmcgYWRkcmVzcyk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJTmFtZUluZm8gR2V0TmFtZShzdHJpbmcgd29ya3NoZWV0LCBzdHJpbmcgbmFtZSk7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IElFbnVtZXJhYmxlPG9iamVjdD4gR2V0UmFuZ2VWYWx1ZXMoc3RyaW5nIGFkZHJlc3MpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzdHJpbmcgR2V0UmFuZ2VGb3JtdWxhKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IExpc3Q8VG9rZW4+IEdldFJhbmdlRm9ybXVsYVRva2VucyhzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzUm93SGlkZGVuKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93KTsKKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIFJldHVybnMgYSBzaW5nbGUgY2VsbCB2YWx1ZQorICAgICAgICAvLy8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAgICAgICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIC8vcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRDZWxsVmFsdWUoaW50IHNoZWV0SUQsIHN0cmluZyBhZGRyZXNzKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIGEgc2luZ2xlIGNlbGwgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IEdldENlbGxWYWx1ZShzdHJpbmcgc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sKTsKKworICAgICAgICAvLy8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vLy8gU2V0cyB0aGUgdmFsdWUgb24gdGhlIGNlbGwKKyAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAgICAgICAvL3B1YmxpYyBhYnN0cmFjdCB2b2lkIFNldENlbGxWYWx1ZShzdHJpbmcgYWRkcmVzcywgb2JqZWN0IHZhbHVlKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgdGhpcyBtZXRob2QgdG8gZnJlZSB1bm1hbmFnZWQgcmVzb3VyY2VzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTWF4IG51bWJlciBvZiBjb2x1bW5zIGluIGEgd29ya3NoZWV0IHRoYXQgdGhlIEV4Y2VsIGRhdGEgcHJvdmlkZXIgY2FuIGhhbmRsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBFeGNlbE1heENvbHVtbnMgeyBnZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNYXggbnVtYmVyIG9mIHJvd3MgaW4gYSB3b3Jrc2hlZXQgdGhhdCB0aGUgRXhjZWwgZGF0YSBwcm92aWRlciBjYW4gaGFuZGxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgRXhjZWxNYXhSb3dzIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRSYW5nZVZhbHVlKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQWRkcmVzc1RyYW5zbGF0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQWRkcmVzc1RyYW5zbGF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxMzM3OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9BZGRyZXNzVHJhbnNsYXRvci5jcwpAQCAtMCwwICsxLDEzMSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSGFuZGxlcyB0cmFuc2xhdGlvbnMgZnJvbSBTcHJlYWRzaGVldCBhZGRyZXNzZXMgdG8gMC1iYXNlZCBudW1lcmljIGluZGV4LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEFkZHJlc3NUcmFuc2xhdG9yCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpcnN0UGFydCwKKyAgICAgICAgICAgIExhc3RQYXJ0CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKKworICAgICAgICBwdWJsaWMgQWRkcmVzc1RyYW5zbGF0b3IoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChleGNlbERhdGFQcm92aWRlcikuTmFtZWQoImV4Y2VsRGF0YVByb3ZpZGVyIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRyYW5zbGF0ZXMgYW4gYWRkcmVzcyBpbiBmb3JtYXQgIkExIiB0byBjb2wtIGFuZCByb3dpbmRleC4KKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gSWYgdGhlIHN1cHBsaWVkIGFkZHJlc3MgaXMgYSByYW5nZSwgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHBhcnQgd2lsbCBiZSBjYWxjdWxhdGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUb0NvbEFuZFJvdyhzdHJpbmcgYWRkcmVzcywgb3V0IGludCBjb2wsIG91dCBpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICBUb0NvbEFuZFJvdyhhZGRyZXNzLCBvdXQgY29sLCBvdXQgcm93LCBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyLkZpcnN0UGFydCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFuc2xhdGVzIGFuIGFkZHJlc3MgaW4gZm9ybWF0ICJBMSIgdG8gY29sLSBhbmQgcm93aW5kZXguCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJlaGF2aW91ciI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUb0NvbEFuZFJvdyhzdHJpbmcgYWRkcmVzcywgb3V0IGludCBjb2wsIG91dCBpbnQgcm93LCBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyIGJlaGF2aW91cikKKyAgICAgICAgeworICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIHZhciBhbHBoYVBhcnQgPSBHZXRBbHBoYVBhcnQoYWRkcmVzcyk7CisgICAgICAgICAgICBjb2wgPSAwOworICAgICAgICAgICAgdmFyIG5MZXR0ZXJzSW5BbHBoYWJldCA9IDI2OworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBhbHBoYVBhcnQuTGVuZ3RoOyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBvcyA9IGFscGhhUGFydC5MZW5ndGggLSB4IC0gMTsKKyAgICAgICAgICAgICAgICB2YXIgY3VycmVudE51bWVyaWNWYWx1ZSA9IEdldE51bWVyaWNBbHBoYVZhbHVlKGFscGhhUGFydFt4XSk7CisgICAgICAgICAgICAgICAgY29sICs9IChuTGV0dGVyc0luQWxwaGFiZXQgKiBwb3MgKiBjdXJyZW50TnVtZXJpY1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2wgKz0gY3VycmVudE51bWVyaWNWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NvbC0tOworICAgICAgICAgICAgLy9yb3cgPSBHZXRJbnRQYXJ0KGFkZHJlc3MpIC0gMSA/PyBHZXRSb3dJbmRleEJ5QmVoYXZpb3VyKGJlaGF2aW91cik7CisgICAgICAgICAgICByb3cgPSBHZXRJbnRQYXJ0KGFkZHJlc3MpID8/IEdldFJvd0luZGV4QnlCZWhhdmlvdXIoYmVoYXZpb3VyKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0Um93SW5kZXhCeUJlaGF2aW91cihSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyIGJlaGF2aW91cikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJlaGF2aW91ciA9PSBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyLkZpcnN0UGFydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfZXhjZWxEYXRhUHJvdmlkZXIuRXhjZWxNYXhSb3dzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0TnVtZXJpY0FscGhhVmFsdWUoY2hhciBjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCljIC0gNjQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRBbHBoYVBhcnQoc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWdleC5NYXRjaChhZGRyZXNzLCAiW0EtWl0rIikuVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludD8gR2V0SW50UGFydChzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goYWRkcmVzcywgIlswLTldKyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQuUGFyc2UoUmVnZXguTWF0Y2goYWRkcmVzcywgIlswLTldKyIpLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0NlbGxSZWZlcmVuY2VQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9DZWxsUmVmZXJlbmNlUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjYTA4MwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9DZWxsUmVmZXJlbmNlUHJvdmlkZXIuY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBDZWxsUmVmZXJlbmNlUHJvdmlkZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPHN0cmluZz4gR2V0UmVmZXJlbmNlZEFkZHJlc3NlcyhzdHJpbmcgY2VsbEZvcm11bGEsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHRDZWxscyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIHZhciByID0gY29udGV4dC5Db25maWd1cmF0aW9uLkxleGVyLlRva2VuaXplKGNlbGxGb3JtdWxhLCBjb250ZXh0LlNjb3Blcy5DdXJyZW50LkFkZHJlc3MuV29ya3NoZWV0KTsKKyAgICAgICAgICAgIHZhciB0b0FkZHJlc3NlcyA9IHIuV2hlcmUoeCA9PiB4LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0b0FkZHJlc3MgaW4gdG9BZGRyZXNzZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzcyA9IGNvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUodG9BZGRyZXNzLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB2YXIgcmFuZ2VDZWxscyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBpZiAocmFuZ2VBZGRyZXNzLkZyb21Sb3cgPCByYW5nZUFkZHJlc3MuVG9Sb3cgfHwgcmFuZ2VBZGRyZXNzLkZyb21Db2wgPCByYW5nZUFkZHJlc3MuVG9Db2wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSByYW5nZUFkZHJlc3MuRnJvbUNvbDsgY29sIDw9IHJhbmdlQWRkcmVzcy5Ub0NvbDsgY29sKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IHJhbmdlQWRkcmVzcy5Gcm9tUm93OyByb3cgPD0gcmFuZ2VBZGRyZXNzLlRvUm93OyByb3crKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDZWxscy5BZGQoY29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShjb2wsIHJvdykuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2VDZWxscy5BZGQodG9BZGRyZXNzLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0Q2VsbHMuQWRkUmFuZ2UocmFuZ2VDZWxscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q2VsbHM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mby5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeGNlbEFkZHJlc3NJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWU5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mby5jcwpAQCAtMCwwICsxLDk0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCit7CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQWRkcmVzc0luZm8KKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxBZGRyZXNzSW5mbyhzdHJpbmcgYWRkcmVzcykgCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIHZhciBhZGRyZXNzT25TaGVldCA9IGFkZHJlc3M7CisgICAgICAgICAgICBXb3Jrc2hlZXQgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoYWRkcmVzcy5Db250YWlucygiISIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXRBcnIgPSBhZGRyZXNzLlNwbGl0KCchJyk7CisgICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gd29ya3NoZWV0QXJyWzBdOworICAgICAgICAgICAgICAgIGFkZHJlc3NPblNoZWV0ID0gd29ya3NoZWV0QXJyWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3NPblNoZWV0LkNvbnRhaW5zKCI6IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlQXJyID0gYWRkcmVzc09uU2hlZXQuU3BsaXQoJzonKTsKKyAgICAgICAgICAgICAgICBTdGFydENlbGwgPSByYW5nZUFyclswXTsKKyAgICAgICAgICAgICAgICBFbmRDZWxsID0gcmFuZ2VBcnJbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhcnRDZWxsID0gYWRkcmVzc09uU2hlZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBZGRyZXNzT25TaGVldCA9IGFkZHJlc3NPblNoZWV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbEFkZHJlc3NJbmZvIFBhcnNlKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoYWRkcmVzcykuTmFtZWQoImFkZHJlc3MiKS5Jc05vdE51bGxPckVtcHR5KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0luZm8oYWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgYm9vbCBXb3Jrc2hlZXRJc1NwZWNpZmllZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIXN0cmluZy5Jc051bGxPckVtcHR5KFdvcmtzaGVldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc011bHRpcGxlQ2VsbHMgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIHJldHVybiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoRW5kQ2VsbCk7IAorICAgICAgICAgICAgfSAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgU3RhcnRDZWxsIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgRW5kQ2VsbCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEFkZHJlc3NPblNoZWV0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeGNlbEFkZHJlc3NVdGlsLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsQWRkcmVzc1V0aWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhMzAxZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeGNlbEFkZHJlc3NVdGlsLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlbEFkZHJlc3NVdGlsCisgICAgeworICAgICAgICBzdGF0aWMgY2hhcltdIFNoZWV0TmFtZUludmFsaWRDaGFycyA9IG5ldyBjaGFyW10geyAnPycsICc6JywgJyonLCAnLycsICdcXCcgfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzVmFsaWRBZGRyZXNzKHN0cmluZyB0b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGl4OworICAgICAgICAgICAgaWYgKHRva2VuWzBdID09ICdcJycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXggPSB0b2tlbi5MYXN0SW5kZXhPZignXCcnKTsKKyAgICAgICAgICAgICAgICBpZiAoaXggPiAwICYmIGl4IDwgdG9rZW4uTGVuZ3RoIC0gMSAmJiB0b2tlbltpeCArIDFdID09ICchJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi5JbmRleE9mQW55KFNoZWV0TmFtZUludmFsaWRDaGFycywgMSwgaXggLSAxKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLlN1YnN0cmluZyhpeCArIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGl4ID0gdG9rZW4uSW5kZXhPZignIScpKSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLkluZGV4T2ZBbnkoU2hlZXROYW1lSW52YWxpZENoYXJzLCAwLCB0b2tlbi5JbmRleE9mKCchJykpID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5TdWJzdHJpbmcodG9rZW4uSW5kZXhPZignIScpICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT2ZmaWNlT3BlblhtbC5FeGNlbEFkZHJlc3MuSXNWYWxpZEFkZHJlc3ModG9rZW4pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsUmVmZXJlbmNlVHlwZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeGNlbFJlZmVyZW5jZVR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4NzIzNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeGNlbFJlZmVyZW5jZVR5cGUuY3MKQEAgLTAsMCArMSw0NSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBwdWJsaWMgZW51bSBFeGNlbFJlZmVyZW5jZVR5cGUKKyAgICB7CisgICAgICAgIEFic29sdXRlUm93QW5kQ29sdW1uID0gMSwKKyAgICAgICAgQWJzb2x1dGVSb3dSZWxhdGl2ZUNvbHVtbiA9IDIsCisgICAgICAgIFJlbGF0aXZlUm93QWJzb2x1dENvbHVtbiA9IDMsCisgICAgICAgIFJlbGF0aXZlUm93QW5kQ29sdW1uID0gNAorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeHByZXNzaW9uRXZhbHVhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkMmU2MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeHByZXNzaW9uRXZhbHVhdG9yLmNzCkBAIC0wLDAgKzEsMTQ1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCit7CisgICAgcHVibGljIGNsYXNzIEV4cHJlc3Npb25FdmFsdWF0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX3dpbGRDYXJkVmFsdWVNYXRjaGVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRGYWN0b3J5IF9jb21waWxlUmVzdWx0RmFjdG9yeTsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbkV2YWx1YXRvcigpCisgICAgICAgICAgICA6IHRoaXMobmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCksIG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uRXZhbHVhdG9yKFdpbGRDYXJkVmFsdWVNYXRjaGVyIHdpbGRDYXJkVmFsdWVNYXRjaGVyLCBDb21waWxlUmVzdWx0RmFjdG9yeSBjb21waWxlUmVzdWx0RmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX3dpbGRDYXJkVmFsdWVNYXRjaGVyID0gd2lsZENhcmRWYWx1ZU1hdGNoZXI7CisgICAgICAgICAgICBfY29tcGlsZVJlc3VsdEZhY3RvcnkgPSBjb21waWxlUmVzdWx0RmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldE5vbkFscGhhbnVtZXJpY1N0YXJ0Q2hhcnMoc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhwcmVzc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goZXhwcmVzc2lvbiwgQCJeKFteYS16QS1aMC05XXsyfSkiKSkgcmV0dXJuIGV4cHJlc3Npb24uU3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKGV4cHJlc3Npb24sIEAiXihbXmEtekEtWjAtOV17MX0pIikpIHJldHVybiBleHByZXNzaW9uLlN1YnN0cmluZygwLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIEV2YWx1YXRlT3BlcmF0b3Iob2JqZWN0IGxlZnQsIG9iamVjdCByaWdodCwgSU9wZXJhdG9yIG9wKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGVmdFJlc3VsdCA9IF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUobGVmdCk7CisgICAgICAgICAgICB2YXIgcmlnaHRSZXN1bHQgPSBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKHJpZ2h0KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcC5BcHBseShsZWZ0UmVzdWx0LCByaWdodFJlc3VsdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LkRhdGFUeXBlICE9IERhdGFUeXBlLkJvb2xlYW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG9wZXJhdG9yIGluIGV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoYm9vbClyZXN1bHQuUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgVHJ5Q29udmVydFRvRG91YmxlKG9iamVjdCBvcCwgb3V0IGRvdWJsZSBkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3AgaXMgZG91YmxlIHx8IG9wIGlzIGludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gQ29udmVydC5Ub0RvdWJsZShvcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvcCBpcyBEYXRlVGltZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gKChEYXRlVGltZSkgb3ApLlRvT0FEYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2Uob3AuVG9TdHJpbmcoKSwgb3V0IGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBFdmFsdWF0ZShvYmplY3QgbGVmdCwgc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uID09IHN0cmluZy5FbXB0eSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCA9PSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG9wZXJhdG9yQ2FuZGlkYXRlID0gR2V0Tm9uQWxwaGFudW1lcmljU3RhcnRDaGFycyhleHByZXNzaW9uKTsKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkob3BlcmF0b3JDYW5kaWRhdGUpICYmIG9wZXJhdG9yQ2FuZGlkYXRlICE9ICItIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJT3BlcmF0b3Igb3A7CisgICAgICAgICAgICAgICAgaWYgKE9wZXJhdG9yc0RpY3QuSW5zdGFuY2UuVHJ5R2V0VmFsdWUob3BlcmF0b3JDYW5kaWRhdGUsIG91dCBvcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSBleHByZXNzaW9uLlJlcGxhY2Uob3BlcmF0b3JDYW5kaWRhdGUsIHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gc3RyaW5nLkVtcHR5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AuT3BlcmF0b3IgPT0gT3BlcmF0b3JzLkVxdWFsczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCA9PSBudWxsIF4gcmlnaHQgPT0gc3RyaW5nLkVtcHR5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AuT3BlcmF0b3IgPT0gT3BlcmF0b3JzLk5vdEVxdWFsVG87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnROdW0sIHJpZ2h0TnVtOworICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBkYXRlOworICAgICAgICAgICAgICAgICAgICBib29sIGxlZnRJc051bWVyaWMgPSBUcnlDb252ZXJ0VG9Eb3VibGUobGVmdCwgb3V0IGxlZnROdW0pOworICAgICAgICAgICAgICAgICAgICBib29sIHJpZ2h0SXNOdW1lcmljID0gZG91YmxlLlRyeVBhcnNlKHJpZ2h0LCBvdXQgcmlnaHROdW0pOworICAgICAgICAgICAgICAgICAgICBib29sIHJpZ2h0SXNEYXRlID0gRGF0ZVRpbWUuVHJ5UGFyc2UocmlnaHQsIG91dCBkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRJc051bWVyaWMgJiYgcmlnaHRJc051bWVyaWMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXZhbHVhdGVPcGVyYXRvcihsZWZ0TnVtLCByaWdodE51bSwgb3ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0SXNOdW1lcmljICYmIHJpZ2h0SXNEYXRlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXZhbHVhdGVPcGVyYXRvcihsZWZ0TnVtLCBkYXRlLlRvT0FEYXRlKCksIG9wKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVmdElzTnVtZXJpYyAhPSByaWdodElzTnVtZXJpYykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wLk9wZXJhdG9yID09IE9wZXJhdG9ycy5Ob3RFcXVhbFRvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdmFsdWF0ZU9wZXJhdG9yKGxlZnQsIHJpZ2h0LCBvcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF93aWxkQ2FyZFZhbHVlTWF0Y2hlci5Jc01hdGNoKGV4cHJlc3Npb24sIGxlZnQpID09IDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY2llcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Gb3JtdWxhRGVwZW5kZW5jaWVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjVhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY2llcy5jcwpAQCAtMCwwICsxLDgyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBGb3JtdWxhRGVwZW5kZW5jaWVzCisgICAgeworICAgICAgICBwdWJsaWMgRm9ybXVsYURlcGVuZGVuY2llcygpCisgICAgICAgICAgICA6IHRoaXMobmV3IEZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSgpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGb3JtdWxhRGVwZW5kZW5jaWVzKEZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSBmb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkgPSBmb3JtdWxhRGVwZW5kZW5jeUZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSBfZm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBGb3JtdWxhRGVwZW5kZW5jeT4gX2RlcGVuZGVuY2llcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRm9ybXVsYURlcGVuZGVuY3k+KCk7CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPEtleVZhbHVlUGFpcjxzdHJpbmcsIEZvcm11bGFEZXBlbmRlbmN5Pj4gRGVwZW5kZW5jaWVzIHsgZ2V0IHsgcmV0dXJuIF9kZXBlbmRlbmNpZXM7IH0gfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZEZvcm11bGFTY29wZShQYXJzaW5nU2NvcGUgcGFyc2luZ1Njb3BlKQorICAgICAgICB7CisgICAgICAgICAgICAvL3ZhciBkZXBlbmRlbmN5ID0gX2Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeS5DcmVhdGUocGFyc2luZ1Njb3BlKTsKKyAgICAgICAgICAgIC8vdmFyIGFkZHJlc3MgPSBwYXJzaW5nU2NvcGUuQWRkcmVzcy5Ub1N0cmluZygpOworICAgICAgICAgICAgLy9pZiAoIV9kZXBlbmRlbmNpZXMuQ29udGFpbnNLZXkoYWRkcmVzcykpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIF9kZXBlbmRlbmNpZXMuQWRkKGFkZHJlc3MsIGRlcGVuZGVuY3kpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL2lmIChwYXJzaW5nU2NvcGUuUGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHZhciBwYXJlbnRBZGRyZXNzID0gcGFyc2luZ1Njb3BlLlBhcmVudC5BZGRyZXNzLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAvLyAgICBpZiAoX2RlcGVuZGVuY2llcy5Db250YWluc0tleShwYXJlbnRBZGRyZXNzKSkKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICB2YXIgcGFyZW50ID0gX2RlcGVuZGVuY2llc1twYXJlbnRBZGRyZXNzXTsKKyAgICAgICAgICAgIC8vICAgICAgICBwYXJlbnQuQWRkUmVmZXJlbmNlVG8ocGFyc2luZ1Njb3BlLkFkZHJlc3MpOworICAgICAgICAgICAgLy8gICAgICAgIGRlcGVuZGVuY3kuQWRkUmVmZXJlbmNlRnJvbShwYXJlbnQuQWRkcmVzcyk7CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2RlcGVuZGVuY2llcy5DbGVhcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmN5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmN5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNmZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY3kuY3MKQEAgLTAsMCArMSw3MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgRm9ybXVsYURlcGVuZGVuY3kKKyAgICB7CisgICAgICAgIHB1YmxpYyBGb3JtdWxhRGVwZW5kZW5jeShQYXJzaW5nU2NvcGUgc2NvcGUpCisJICAgIHsgICAKKyAgICAgICAgICAgIFNjb3BlSWQgPSBzY29wZS5TY29wZUlkOworICAgICAgICAgICAgQWRkcmVzcyA9IHNjb3BlLkFkZHJlc3M7CisJICAgIH0KKyAgICAgICAgcHVibGljIEd1aWQgU2NvcGVJZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIEFkZHJlc3MgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFJhbmdlQWRkcmVzcz4gX3JlZmVyZW5jZWRCeSA9IG5ldyBMaXN0PFJhbmdlQWRkcmVzcz4oKTsKKworICAgICAgICBwcml2YXRlIExpc3Q8UmFuZ2VBZGRyZXNzPiBfcmVmZXJlbmNlcyA9IG5ldyBMaXN0PFJhbmdlQWRkcmVzcz4oKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZFJlZmVyZW5jZUZyb20oUmFuZ2VBZGRyZXNzIHJhbmdlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEFkZHJlc3MuQ29sbGlkZXNXaXRoKHJhbmdlQWRkcmVzcykgfHwgX3JlZmVyZW5jZXMuRXhpc3RzKHggPT4geC5Db2xsaWRlc1dpdGgocmFuZ2VBZGRyZXNzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgYXQgIiArIHJhbmdlQWRkcmVzcy5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9yZWZlcmVuY2VkQnkuQWRkKHJhbmdlQWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZFJlZmVyZW5jZVRvKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChBZGRyZXNzLkNvbGxpZGVzV2l0aChyYW5nZUFkZHJlc3MpIHx8IF9yZWZlcmVuY2VkQnkuRXhpc3RzKHggPT4geC5Db2xsaWRlc1dpdGgocmFuZ2VBZGRyZXNzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgYXQgIiArIHJhbmdlQWRkcmVzcy5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9yZWZlcmVuY2VzLkFkZChyYW5nZUFkZHJlc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Gb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlNjIwNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Gb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkuY3MKQEAgLTAsMCArMSw0NSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgRm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBGb3JtdWxhRGVwZW5kZW5jeSBDcmVhdGUoUGFyc2luZ1Njb3BlIHNjb3BlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm11bGFEZXBlbmRlbmN5KHNjb3BlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9JbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGU3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLmNzCkBAIC0wLDAgKzEsMTAyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IKKyAgICB7CisgICAgICAgIHB1YmxpYyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICAgICAgICA6IHRoaXMoZXhjZWxEYXRhUHJvdmlkZXIsIEV4Y2VsUmVmZXJlbmNlVHlwZS5BYnNvbHV0ZVJvd0FuZENvbHVtbikKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBFeGNlbFJlZmVyZW5jZVR5cGUgcmVmZXJlbmNlVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV4Y2VsRGF0YVByb3ZpZGVyKS5OYW1lZCgiZXhjZWxEYXRhUHJvdmlkZXIiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgICAgICAgICAgX2V4Y2VsUmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbFJlZmVyZW5jZVR5cGUgX2V4Y2VsUmVmZXJlbmNlVHlwZTsKKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRDb2x1bW5MZXR0ZXIoaW50IGlDb2x1bW5OdW1iZXIsIGJvb2wgZml4ZWRDb2wpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKGlDb2x1bW5OdW1iZXIgPCAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ29sdW1uIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nIHNDb2wgPSAiIjsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc0NvbCA9ICgoY2hhcikoJ0EnICsgKChpQ29sdW1uTnVtYmVyIC0gMSkgJSAyNikpKSArIHNDb2w7CisgICAgICAgICAgICAgICAgaUNvbHVtbk51bWJlciA9IChpQ29sdW1uTnVtYmVyIC0gKChpQ29sdW1uTnVtYmVyIC0gMSkgJSAyNikpIC8gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoaUNvbHVtbk51bWJlciA+IDApOworICAgICAgICAgICAgcmV0dXJuIGZpeGVkQ29sID8gIiQiICsgc0NvbCA6IHNDb2w7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFRvQWRkcmVzcyhpbnQgY29sLCBpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZml4ZWRDb2wgPSBfZXhjZWxSZWZlcmVuY2VUeXBlID09IEV4Y2VsUmVmZXJlbmNlVHlwZS5BYnNvbHV0ZVJvd0FuZENvbHVtbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V4Y2VsUmVmZXJlbmNlVHlwZSA9PSBFeGNlbFJlZmVyZW5jZVR5cGUuUmVsYXRpdmVSb3dBYnNvbHV0Q29sdW1uOworICAgICAgICAgICAgdmFyIGNvbFN0cmluZyA9IEdldENvbHVtbkxldHRlcihjb2wsIGZpeGVkQ29sKTsKKyAgICAgICAgICAgIHJldHVybiBjb2xTdHJpbmcgKyBHZXRSb3dOdW1iZXIocm93KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFJvd051bWJlcihpbnQgcm93Tm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXRWYWwgPSByb3dObyA8IChfZXhjZWxEYXRhUHJvdmlkZXIuRXhjZWxNYXhSb3dzKSA/IHJvd05vLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHJldFZhbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfZXhjZWxSZWZlcmVuY2VUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dBbmRDb2x1bW46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRXhjZWxSZWZlcmVuY2VUeXBlLkFic29sdXRlUm93UmVsYXRpdmVDb2x1bW46CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiQiICsgcmV0VmFsOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0xvb2t1cFZhbHVlTWF0Y2hlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Mb29rdXBWYWx1ZU1hdGNoZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMDBjYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Mb29rdXBWYWx1ZU1hdGNoZXIuY3MKQEAgLTAsMCArMSwxNSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBMb29rdXBWYWx1ZU1hdGNoZXIgOiBWYWx1ZU1hdGNoZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBpbnQgQ29tcGFyZU9iamVjdFRvU3RyaW5nKG9iamVjdCBvMSwgc3RyaW5nIG8yKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5jb21wYXRpYmxlT3BlcmFuZHM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhMTA5NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9OdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5jcwpAQCAtMCwwICsxLDExMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZU1hdGNoZXIgX3ZhbHVlTWF0Y2hlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21waWxlUmVzdWx0RmFjdG9yeSBfY29tcGlsZVJlc3VsdEZhY3Rvcnk7CisKKyAgICAgICAgcHVibGljIE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVmFsdWVNYXRjaGVyKCksIG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcihWYWx1ZU1hdGNoZXIgdmFsdWVNYXRjaGVyLCBDb21waWxlUmVzdWx0RmFjdG9yeSBjb21waWxlUmVzdWx0RmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX3ZhbHVlTWF0Y2hlciA9IHZhbHVlTWF0Y2hlcjsKKyAgICAgICAgICAgIF9jb21waWxlUmVzdWx0RmFjdG9yeSA9IGNvbXBpbGVSZXN1bHRGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0Tm9uTnVtZXJpY1N0YXJ0Q2hhcnMoc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhwcmVzc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goZXhwcmVzc2lvbiwgQCJeKFteXGRdezJ9KSIpKSByZXR1cm4gZXhwcmVzc2lvbi5TdWJzdHJpbmcoMCwgMik7CisgICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goZXhwcmVzc2lvbiwgQCJeKFteXGRdezF9KSIpKSByZXR1cm4gZXhwcmVzc2lvbi5TdWJzdHJpbmcoMCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBkb3VibGU/IE9wZXJhbmRBc0RvdWJsZShvYmplY3Qgb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvcCBpcyBkb3VibGUgfHwgb3AgaXMgaW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvRG91YmxlKG9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBvdXRwdXQ7CisgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZShvcC5Ub1N0cmluZygpLCBvdXQgb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBFdmFsdWF0ZShvYmplY3QgbGVmdCwgc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBvcGVyYXRvckNhbmRpZGF0ZSA9IEdldE5vbk51bWVyaWNTdGFydENoYXJzKGV4cHJlc3Npb24pOworICAgICAgICAgICAgdmFyIGxlZnROdW0gPSBPcGVyYW5kQXNEb3VibGUobGVmdCk7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG9wZXJhdG9yQ2FuZGlkYXRlKSAmJiBsZWZ0TnVtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSU9wZXJhdG9yIG9wOworICAgICAgICAgICAgICAgIGlmIChPcGVyYXRvcnNEaWN0Lkluc3RhbmNlLlRyeUdldFZhbHVlKG9wZXJhdG9yQ2FuZGlkYXRlLCBvdXQgb3ApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG51bWVyaWNDYW5kaWRhdGUgPSBleHByZXNzaW9uLlJlcGxhY2Uob3BlcmF0b3JDYW5kaWRhdGUsIHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKG51bWVyaWNDYW5kaWRhdGUsIG91dCBkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnRSZXN1bHQgPSBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGxlZnROdW0pOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0UmVzdWx0ID0gX2NvbXBpbGVSZXN1bHRGYWN0b3J5LkNyZWF0ZShkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcC5BcHBseShsZWZ0UmVzdWx0LCByaWdodFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LkRhdGFUeXBlICE9IERhdGFUeXBlLkJvb2xlYW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG9wZXJhdG9yIGluIGV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYm9vbClyZXN1bHQuUmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF92YWx1ZU1hdGNoZXIuSXNNYXRjaChsZWZ0LCBleHByZXNzaW9uKSA9PSAwOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3MuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0ZTgwYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3MuY3MKQEAgLTAsMCArMSw4OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3MKKyAgICB7CisgICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICBBZGRyZXNzID0gc3RyaW5nLkVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEFkZHJlc3MgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgV29ya3NoZWV0IHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IEZyb21Db2wgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVG9Db2wgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBpbnQgRnJvbVJvdyB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBUb1JvdyB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmFuZ2VBZGRyZXNzIF9lbXB0eSA9IG5ldyBSYW5nZUFkZHJlc3MoKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBSYW5nZUFkZHJlc3MgRW1wdHkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9lbXB0eTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgcmFuZ2UgY29sbGlkZXMgKGZ1bGwgb3IgcGFydGx5KSB3aXRoIHRoZSBzdXBwbGllZCByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im90aGVyIj5UaGUgcmFuZ2UgdG8gY2hlY2s8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBDb2xsaWRlc1dpdGgoUmFuZ2VBZGRyZXNzIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3RoZXIuV29ya3NoZWV0ICE9IFdvcmtzaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3RoZXIuRnJvbVJvdyA+IFRvUm93IHx8IG90aGVyLkZyb21Db2wgPiBUb0NvbAorICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgRnJvbVJvdyA+IG90aGVyLlRvUm93IHx8IEZyb21Db2wgPiBvdGhlci5Ub0NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NGYWN0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzc0ZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YjcxMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMTYzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcworeworICAgIHB1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3NGYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBZGRyZXNzVHJhbnNsYXRvciBfYWRkcmVzc1RyYW5zbGF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3I7CisKKyAgICAgICAgcHVibGljIFJhbmdlQWRkcmVzc0ZhY3RvcnkoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICAgICAgICA6IHRoaXMoZXhjZWxEYXRhUHJvdmlkZXIsIG5ldyBBZGRyZXNzVHJhbnNsYXRvcihleGNlbERhdGFQcm92aWRlciksIG5ldyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IoZXhjZWxEYXRhUHJvdmlkZXIsIEV4Y2VsUmVmZXJlbmNlVHlwZS5SZWxhdGl2ZVJvd0FuZENvbHVtbikpCisgICAgICAgIHsKKyAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3NGYWN0b3J5KEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBBZGRyZXNzVHJhbnNsYXRvciBhZGRyZXNzVHJhbnNsYXRvciwgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIGluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV4Y2VsRGF0YVByb3ZpZGVyKS5OYW1lZCgiZXhjZWxEYXRhUHJvdmlkZXIiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhZGRyZXNzVHJhbnNsYXRvcikuTmFtZWQoImFkZHJlc3NUcmFuc2xhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKS5OYW1lZCgiaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKKyAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvciA9IGFkZHJlc3NUcmFuc2xhdG9yOworICAgICAgICAgICAgX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvciA9IGluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3MgQ3JlYXRlKGludCBjb2wsIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGUoc3RyaW5nLkVtcHR5LCBjb2wsIHJvdyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIENyZWF0ZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IGNvbCwgaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZUFkZHJlc3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZHJlc3MgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcyhjb2wsIHJvdyksCisgICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gd29ya3NoZWV0TmFtZSwKKyAgICAgICAgICAgICAgICBGcm9tQ29sID0gY29sLAorICAgICAgICAgICAgICAgIFRvQ29sID0gY29sLAorICAgICAgICAgICAgICAgIEZyb21Sb3cgPSByb3csCisgICAgICAgICAgICAgICAgVG9Sb3cgPSByb3cKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXROYW1lIj53aWxsIGJlIHVzZWQgaWYgbm8gd29ya3NoZWV0IG5hbWUgaXMgc3BlY2lmaWVkIGluIDxwYXJhbXJlZiBuYW1lPSJhZGRyZXNzIi8+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5hZGRyZXNzIG9mIGEgcmFuZ2U8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIENyZWF0ZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgc3RyaW5nIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhZGRyZXNzKS5OYW1lZCgicmFuZ2UiKS5Jc05vdE51bGxPckVtcHR5KCk7CisgICAgICAgICAgICAvL3ZhciBhZGRyZXNzSW5mbyA9IEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UoYWRkcmVzcyk7CisgICAgICAgICAgICB2YXIgYWRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoYWRkcmVzcyk7ICAKKyAgICAgICAgICAgIHZhciBzaGVldCA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFkci5Xb3JrU2hlZXQpID8gd29ya3NoZWV0TmFtZSA6IGFkci5Xb3JrU2hlZXQ7CisgICAgICAgICAgICB2YXIgZGltID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldERpbWVuc2lvbkVuZChhZHIuV29ya1NoZWV0KTsKKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSBuZXcgUmFuZ2VBZGRyZXNzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRyZXNzID0gYWRyLkFkZHJlc3MsCisgICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gc2hlZXQsCisgICAgICAgICAgICAgICAgRnJvbVJvdyA9IGFkci5fZnJvbVJvdywKKyAgICAgICAgICAgICAgICBGcm9tQ29sID0gYWRyLl9mcm9tQ29sLAorICAgICAgICAgICAgICAgIFRvUm93ID0gKGRpbSAhPSBudWxsICYmIGFkci5fdG9Sb3cgPiBkaW0uUm93KSA/IGRpbS5Sb3cgOiBhZHIuX3RvUm93LAorICAgICAgICAgICAgICAgIFRvQ29sID0gYWRyLl90b0NvbAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy9pZiAoYWRkcmVzc0luZm8uSXNNdWx0aXBsZUNlbGxzKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBIYW5kbGVNdWx0aXBsZUNlbGxBZGRyZXNzKHJhbmdlQWRkcmVzcywgYWRkcmVzc0luZm8pOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgSGFuZGxlU2luZ2xlQ2VsbEFkZHJlc3MocmFuZ2VBZGRyZXNzLCBhZGRyZXNzSW5mbyk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIHJldHVybiByYW5nZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIENyZWF0ZShzdHJpbmcgcmFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChyYW5nZSkuTmFtZWQoInJhbmdlIikuSXNOb3ROdWxsT3JFbXB0eSgpOworICAgICAgICAgICAgLy92YXIgYWRkcmVzc0luZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKHJhbmdlKTsKKyAgICAgICAgICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShyYW5nZSk7CisgICAgICAgICAgICB2YXIgcmFuZ2VBZGRyZXNzID0gbmV3IFJhbmdlQWRkcmVzcygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkcmVzcyA9IGFkci5BZGRyZXNzLAorICAgICAgICAgICAgICAgIFdvcmtzaGVldCA9IGFkci5Xb3JrU2hlZXQgPz8gIiIsCisgICAgICAgICAgICAgICAgRnJvbVJvdyA9IGFkci5fZnJvbVJvdywKKyAgICAgICAgICAgICAgICBGcm9tQ29sID0gYWRyLl9mcm9tQ29sLAorICAgICAgICAgICAgICAgIFRvUm93ID0gYWRyLl90b1JvdywKKyAgICAgICAgICAgICAgICBUb0NvbCA9IGFkci5fdG9Db2wKKyAgICAgICAgICAgIH07CisgICAgICAgICAgIAorICAgICAgICAgICAgLy9pZiAoYWRkcmVzc0luZm8uSXNNdWx0aXBsZUNlbGxzKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBIYW5kbGVNdWx0aXBsZUNlbGxBZGRyZXNzKHJhbmdlQWRkcmVzcywgYWRkcmVzc0luZm8pOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgSGFuZGxlU2luZ2xlQ2VsbEFkZHJlc3MocmFuZ2VBZGRyZXNzLCBhZGRyZXNzSW5mbyk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIHJldHVybiByYW5nZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSGFuZGxlU2luZ2xlQ2VsbEFkZHJlc3MoUmFuZ2VBZGRyZXNzIHJhbmdlQWRkcmVzcywgRXhjZWxBZGRyZXNzSW5mbyBhZGRyZXNzSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbCwgcm93OworICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KGFkZHJlc3NJbmZvLlN0YXJ0Q2VsbCwgb3V0IGNvbCwgb3V0IHJvdyk7CisgICAgICAgICAgICByYW5nZUFkZHJlc3MuRnJvbUNvbCA9IGNvbDsKKyAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Ub0NvbCA9IGNvbDsKKyAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Gcm9tUm93ID0gcm93OworICAgICAgICAgICAgcmFuZ2VBZGRyZXNzLlRvUm93ID0gcm93OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEhhbmRsZU11bHRpcGxlQ2VsbEFkZHJlc3MoUmFuZ2VBZGRyZXNzIHJhbmdlQWRkcmVzcywgRXhjZWxBZGRyZXNzSW5mbyBhZGRyZXNzSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGZyb21Db2wsIGZyb21Sb3c7CisgICAgICAgICAgICBfYWRkcmVzc1RyYW5zbGF0b3IuVG9Db2xBbmRSb3coYWRkcmVzc0luZm8uU3RhcnRDZWxsLCBvdXQgZnJvbUNvbCwgb3V0IGZyb21Sb3cpOworICAgICAgICAgICAgaW50IHRvQ29sLCB0b1JvdzsKKyAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdyhhZGRyZXNzSW5mby5FbmRDZWxsLCBvdXQgdG9Db2wsIG91dCB0b1JvdywgQWRkcmVzc1RyYW5zbGF0b3IuUmFuZ2VDYWxjdWxhdGlvbkJlaGF2aW91ci5MYXN0UGFydCk7CisgICAgICAgICAgICByYW5nZUFkZHJlc3MuRnJvbUNvbCA9IGZyb21Db2w7CisgICAgICAgICAgICByYW5nZUFkZHJlc3MuVG9Db2wgPSB0b0NvbDsKKyAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Gcm9tUm93ID0gZnJvbVJvdzsKKyAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Ub1JvdyA9IHRvUm93OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1ZhbHVlTWF0Y2hlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9WYWx1ZU1hdGNoZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4ZmQyYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9WYWx1ZU1hdGNoZXIuY3MKQEAgLTAsMCArMSwxMTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCit7CisgICAgcHVibGljIGNsYXNzIFZhbHVlTWF0Y2hlcgorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJbmNvbXBhdGlibGVPcGVyYW5kcyA9IC0yOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBJc01hdGNoKG9iamVjdCBvMSwgb2JqZWN0IG8yKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobzEgIT0gbnVsbCAmJiBvMiA9PSBudWxsKSByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmIChvMSA9PSBudWxsICYmIG8yICE9IG51bGwpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChvMSA9PSBudWxsICYmIG8yID09IG51bGwpIHJldHVybiAwOworICAgICAgICAgICAgLy9IYW5kbGUgcmFuZ2VzIGFuZCBkZWZpbmVkIG5hbWVzCisgICAgICAgICAgICBvMSA9IENoZWNrR2V0UmFuZ2UobzEpOworICAgICAgICAgICAgbzIgPSBDaGVja0dldFJhbmdlKG8yKTsKKworICAgICAgICAgICAgaWYgKG8xIGlzIHN0cmluZyAmJiBvMiBpcyBzdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBhcmVTdHJpbmdUb1N0cmluZyhvMS5Ub1N0cmluZygpLlRvTG93ZXIoKSwgbzIuVG9TdHJpbmcoKS5Ub0xvd2VyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbzEuR2V0VHlwZSgpID09IHR5cGVvZihzdHJpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb21wYXJlU3RyaW5nVG9PYmplY3QobzEuVG9TdHJpbmcoKSwgbzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobzIuR2V0VHlwZSgpID09IHR5cGVvZihzdHJpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb21wYXJlT2JqZWN0VG9TdHJpbmcobzEsIG8yLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbnZlcnQuVG9Eb3VibGUobzEpLkNvbXBhcmVUbyhDb252ZXJ0LlRvRG91YmxlKG8yKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ2hlY2tHZXRSYW5nZShvYmplY3QgdikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHYgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgciA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyl2KTsKKyAgICAgICAgICAgICAgICBpZiAoci5HZXROQ2VsbHMoKSA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdiA9IHIuR2V0T2Zmc2V0KDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodiBpcyBFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG4gPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbyl2KTsKKyAgICAgICAgICAgICAgICB2ID0gQ2hlY2tHZXRSYW5nZShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgaW50IENvbXBhcmVTdHJpbmdUb1N0cmluZyhzdHJpbmcgczEsIHN0cmluZyBzMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHMxLkNvbXBhcmVUbyhzMik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgQ29tcGFyZVN0cmluZ1RvT2JqZWN0KHN0cmluZyBvMSwgb2JqZWN0IG8yKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZDE7CisgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKG8xLCBvdXQgZDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkMS5Db21wYXJlVG8oQ29udmVydC5Ub0RvdWJsZShvMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEluY29tcGF0aWJsZU9wZXJhbmRzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgaW50IENvbXBhcmVPYmplY3RUb1N0cmluZyhvYmplY3QgbzEsIHN0cmluZyBvMikKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGQyOworICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZShvMiwgb3V0IGQyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0RvdWJsZShvMSkuQ29tcGFyZVRvKGQyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBJbmNvbXBhdGlibGVPcGVyYW5kczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRiYjUxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1dpbGRDYXJkVmFsdWVNYXRjaGVyLmNzCkBAIC0wLDAgKzEsNTcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCit7CisgICAgcHVibGljIGNsYXNzIFdpbGRDYXJkVmFsdWVNYXRjaGVyIDogVmFsdWVNYXRjaGVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaW50IENvbXBhcmVTdHJpbmdUb1N0cmluZyhzdHJpbmcgczEsIHN0cmluZyBzMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMxLkNvbnRhaW5zKCIqIikgfHwgczEuQ29udGFpbnMoIj8iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVnZXhQYXR0ZXJuID0gUmVnZXguRXNjYXBlKHMxKTsKKyAgICAgICAgICAgICAgICByZWdleFBhdHRlcm4gPSBzdHJpbmcuRm9ybWF0KCJeezB9JCIsIHJlZ2V4UGF0dGVybik7CisgICAgICAgICAgICAgICAgcmVnZXhQYXR0ZXJuID0gcmVnZXhQYXR0ZXJuLlJlcGxhY2UoQCJcKiIsICIuKiIpOworICAgICAgICAgICAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5SZXBsYWNlKEAiXD8iLCAiLiIpOworICAgICAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKHMyLCByZWdleFBhdHRlcm4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ29tcGFyZVN0cmluZ1RvU3RyaW5nKHMxLCBzMik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxWYWx1ZXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxWYWx1ZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFZhbHVlcy5jcwpAQCAtMCwwICsxLDE4NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXByZXNlbnRzIHRoZSBlcnJvcnR5cGVzIGluIGV4Y2VsCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlRXJyb3JUeXBlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEaXZpc2lvbiBieSB6ZXJvCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIERpdjAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vdCBhcHBsaWNhYmxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5BLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lIGVycm9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5hbWUsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE51bGwgZXJyb3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTnVsbCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtIGVycm9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE51bSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVmZXJlbmNlIGVycm9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFJlZiwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsdWUgZXJyb3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVmFsdWUKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJlcHJlc2VudHMgYW4gRXhjZWwgZXJyb3IuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iZUVycm9yVHlwZSIvPgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEVycm9yVmFsdWUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhhbmRsZXMgdGhlIGNvbnZlcnRpb24gYmV0d2VlbiA8c2VlIGNyZWY9ImVFcnJvclR5cGUiLz4gYW5kIHRoZSBzdHJpbmcgdmFsdWVzCisgICAgICAgIC8vLyB1c2VkIGJ5IEV4Y2VsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbHVlcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIERpdjAgPSAiI0RJVi8wISI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5BID0gIiNOL0EiOworICAgICAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOYW1lID0gIiNOQU1FPyI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE51bGwgPSAiI05VTEwhIjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTnVtID0gIiNOVU0hIjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgUmVmID0gIiNSRUYhIjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgVmFsdWUgPSAiI1ZBTFVFISI7CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBlRXJyb3JUeXBlPiBfdmFsdWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBlRXJyb3JUeXBlPigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7RGl2MCwgZUVycm9yVHlwZS5EaXYwfSwKKyAgICAgICAgICAgICAgICAgICAge05BLCBlRXJyb3JUeXBlLk5BfSwKKyAgICAgICAgICAgICAgICAgICAge05hbWUsIGVFcnJvclR5cGUuTmFtZX0sCisgICAgICAgICAgICAgICAgICAgIHtOdWxsLCBlRXJyb3JUeXBlLk51bGx9LAorICAgICAgICAgICAgICAgICAgICB7TnVtLCBlRXJyb3JUeXBlLk51bX0sCisgICAgICAgICAgICAgICAgICAgIHtSZWYsIGVFcnJvclR5cGUuUmVmfSwKKyAgICAgICAgICAgICAgICAgICAge1ZhbHVlLCBlRXJyb3JUeXBlLlZhbHVlfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJjYW5kaWRhdGUiLz4gaXMgYW4gZXhjZWwgZXJyb3IuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjYW5kaWRhdGUiPjwvcGFyYW0+CisgICAgICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzRXJyb3JWYWx1ZShvYmplY3QgY2FuZGlkYXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGNhbmRpZGF0ZSA9PSBudWxsIHx8ICEoY2FuZGlkYXRlIGlzIEV4Y2VsRXJyb3JWYWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlU3RyaW5nID0gY2FuZGlkYXRlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICghc3RyaW5nLklzTnVsbE9yRW1wdHkoY2FuZGlkYXRlU3RyaW5nKSAmJiBfdmFsdWVzLkNvbnRhaW5zS2V5KGNhbmRpZGF0ZVN0cmluZykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iY2FuZGlkYXRlIi8+IGlzIGFuIGV4Y2VsIGVycm9yLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2FuZGlkYXRlIj48L3BhcmFtPgorICAgICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBTdHJpbmdJc0Vycm9yVmFsdWUoc3RyaW5nIGNhbmRpZGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShjYW5kaWRhdGUpICYmIF92YWx1ZXMuQ29udGFpbnNLZXkoY2FuZGlkYXRlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBDb252ZXJ0cyBhIHN0cmluZyB0byBhbiA8c2VlIGNyZWY9ImVFcnJvclR5cGUiLz4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbCI+PC9wYXJhbT4KKyAgICAgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhyb3duIGlmIHRoZSBzdXBwbGllZCB2YWx1ZSBpcyBub3QgYW4gRXhjZWwgZXJyb3I8L2V4Y2VwdGlvbj4KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZUVycm9yVHlwZSBUb0Vycm9yVHlwZShzdHJpbmcgdmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWwpIHx8ICFfdmFsdWVzLkNvbnRhaW5zS2V5KHZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZXJyb3IgY29kZSAiICsgKHZhbCA/PyAiPGVtcHR5PiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXNbdmFsXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBFeGNlbEVycm9yVmFsdWUgQ3JlYXRlKGVFcnJvclR5cGUgZXJyb3JUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlcnJvclR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsRXJyb3JWYWx1ZSBQYXJzZShzdHJpbmcgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVmFsdWVzLlN0cmluZ0lzRXJyb3JWYWx1ZSh2YWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlKFZhbHVlcy5Ub0Vycm9yVHlwZSh2YWwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInZhbCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSB2YWxpZCBlcnJvciB2YWx1ZTogIiArIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGU9dHlwZTsgCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZXJyb3IgdHlwZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZUVycm9yVHlwZSBUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgdHlwZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLkRpdjA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuRGl2MDsKKyAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuTkE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuTkE7CisgICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuTnVsbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlcy5OdWxsOworICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5OdW06CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuTnVtOworICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5SZWY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuUmVmOworICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5WYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlcy5WYWx1ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZXJyb3J0eXBlIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxFcnJvclZhbHVlIG9wZXJhdG9yICsob2JqZWN0IHYxLCBFeGNlbEVycm9yVmFsdWUgdjIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2MjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JWYWx1ZSBvcGVyYXRvciArKEV4Y2VsRXJyb3JWYWx1ZSB2MSwgRXhjZWxFcnJvclZhbHVlIHYyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdjE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0SGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShvYmogaXMgRXhjZWxFcnJvclZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxFcnJvclZhbHVlKSBvYmopLlRvU3RyaW5nKCkgPT0gdGhpcy5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9DaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZjNWVkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw0NiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9ucworeworICAgIHB1YmxpYyBjbGFzcyBDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvRXhjZWxFcnJvckNvZGVzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvRXhjZWxFcnJvckNvZGVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzMzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9FeGNlbEVycm9yQ29kZXMuY3MKQEAgLTAsMCArMSwxMDYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxFcnJvckNvZGVzCisgICAgeworICAgICAgICBwcml2YXRlIEV4Y2VsRXJyb3JDb2RlcyhzdHJpbmcgY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29kZSA9IGNvZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIENvZGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENvZGUuR2V0SGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sICBFcXVhbHMob2JqZWN0IG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9iaiBpcyBFeGNlbEVycm9yQ29kZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxFcnJvckNvZGVzKW9iaikuQ29kZS5FcXVhbHMoQ29kZSk7CisgICAgICAgICAgICB9CisgCSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yID09IChFeGNlbEVycm9yQ29kZXMgYzEsIEV4Y2VsRXJyb3JDb2RlcyBjMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGMxLkNvZGUuRXF1YWxzKGMyLkNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIG9wZXJhdG9yICE9KEV4Y2VsRXJyb3JDb2RlcyBjMSwgRXhjZWxFcnJvckNvZGVzIGMyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIWMxLkNvZGUuRXF1YWxzKGMyLkNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSUVudW1lcmFibGU8c3RyaW5nPiBDb2RlcyA9IG5ldyBMaXN0PHN0cmluZz4geyBWYWx1ZS5Db2RlLCBOYW1lLkNvZGUsIE5vVmFsdWVBdmFsaWFibGUuQ29kZSB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc0Vycm9yQ29kZShvYmplY3QgdmFsdWVUb1Rlc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZVRvVGVzdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZVRvVGVzdC5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYgKENvZGVzLkZpcnN0T3JEZWZhdWx0KHggPT4geCA9PSBjYW5kaWRhdGUpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JDb2RlcyBWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IEV4Y2VsRXJyb3JDb2RlcygiI1ZBTFVFISIpOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JDb2RlcyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuZXcgRXhjZWxFcnJvckNvZGVzKCIjTkFNRT8iKTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbEVycm9yQ29kZXMgTm9WYWx1ZUF2YWxpYWJsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IEV4Y2VsRXJyb3JDb2RlcygiI04vQSIpOyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9FeGNlbEVycm9yVmFsdWVFeGNlcHRpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9FeGNlbEVycm9yVmFsdWVFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMjIzOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDQwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgRXhjZXB0aW9uIHJlcHJlc2VudHMgYW4gRXhjZWwgZXJyb3IuIFdoZW4gdGhpcyBleGNlcHRpb24gaXMgdGhyb3duCisgICAgLy8vIGZyb20gYW4gRXhjZWwgZnVuY3Rpb24sIHRoZSBFcnJvclZhbHVlIGNvZGUgd2lsbCBiZSBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZQorICAgIC8vLyBwYXJzZWQgY2VsbC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbEVycm9yVmFsdWUiLz4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICAKKyAgICAgICAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUgZXJyb3IpCisgICAgICAgICAgICA6IHRoaXMoZXJyb3IuVG9TdHJpbmcoKSwgZXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZWxFcnJvclZhbHVlIGVycm9yKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVycm9yVmFsdWUgPSBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZSBlcnJvclR5cGUpCisgICAgICAgICAgICA6IHRoaXMoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlcnJvclR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBlcnJvciB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxFcnJvclZhbHVlIEVycm9yVmFsdWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9VbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzI2YmE4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24uY3MKQEAgLTAsMCArMSw0NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zCit7CisgICAgcHVibGljIGNsYXNzIFVucmVjb2duaXplZFRva2VuRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24oVG9rZW4gdG9rZW4pCisgICAgICAgICAgICA6IGJhc2UoICJVbnJlY29nbml6ZWQgdG9rZW46ICIgKyB0b2tlbi5WYWx1ZSkKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0F0b21pY0V4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0F0b21pY0V4cHJlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2NzEzNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQXRvbWljRXhwcmVzc2lvbi5jcwpAQCAtMCwwICsxLDUxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXRvbWljRXhwcmVzc2lvbiA6IEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBBdG9taWNFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQm9vbGVhbkV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Jvb2xlYW5FeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjI0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Jvb2xlYW5FeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsNjAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbD8gX3ByZWNvbXBpbGVkVmFsdWU7CisKKyAgICAgICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uKGJvb2wgdmFsdWUpCisgICAgICAgICAgICA6IGJhc2UodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKQorICAgICAgICB7CisgICAgICAgICAgICBfcHJlY29tcGlsZWRWYWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcHJlY29tcGlsZWRWYWx1ZSA/PyBib29sLlBhcnNlKEV4cHJlc3Npb25TdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVSZXN1bHQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVSZXN1bHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3NGFmMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdC5jcwpAQCAtMCwwICsxLDE1MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIENvbXBpbGVSZXN1bHQKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGVSZXN1bHQgX2VtcHR5ID0gbmV3IENvbXBpbGVSZXN1bHQobnVsbCwgRGF0YVR5cGUuRW1wdHkpOworICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBpbGVSZXN1bHQgRW1wdHkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9lbXB0eTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBpbGVSZXN1bHQob2JqZWN0IHJlc3VsdCwgRGF0YVR5cGUgZGF0YVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIERhdGFUeXBlID0gZGF0YVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlIGVycm9yVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVzdWx0ID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlcnJvclR5cGUpOworICAgICAgICAgICAgRGF0YVR5cGUgPSBEYXRhVHlwZS5FeGNlbEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBpbGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlIGVycm9yVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoZXJyb3JWYWx1ZSkuSXNOb3ROdWxsKCJlcnJvclZhbHVlIik7CisgICAgICAgICAgICBSZXN1bHQgPSBlcnJvclZhbHVlOworICAgICAgICAgICAgRGF0YVR5cGUgPSBEYXRhVHlwZS5FeGNlbEVycm9yOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvYmplY3QgUmVzdWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvYmplY3QgUmVzdWx0VmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHIgPSBSZXN1bHQgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKKyAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgZG91YmxlIFJlc3VsdE51bWVyaWMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgPT0gbnVsbCA/IDAgOiAgQ29udmVydC5Ub0RvdWJsZShSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKFJlc3VsdCBpcyBEYXRlVGltZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKERhdGVUaW1lKVJlc3VsdCkuVG9PQURhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihSZXN1bHQgaXMgVGltZVNwYW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lKCgoVGltZVNwYW4pUmVzdWx0KS5UaWNrcykuVG9PQURhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoSXNOdW1lcmljU3RyaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShSZXN1bHQuVG9TdHJpbmcoKSwgTnVtYmVyU3R5bGVzLkZsb2F0LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylSZXN1bHQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuVmFsdWVEb3VibGVMb2dpY2FsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEYXRhVHlwZSBEYXRhVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2wgSXNOdW1lcmljCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGF0YVR5cGUgPT0gRGF0YVR5cGUuRGVjaW1hbCB8fCBEYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyIHx8IERhdGFUeXBlID09IERhdGFUeXBlLkVtcHR5IHx8IERhdGFUeXBlID09IERhdGFUeXBlLkJvb2xlYW4gfHwgRGF0YVR5cGUgPT0gRGF0YVR5cGUuRGF0ZTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc051bWVyaWNTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlID09IERhdGFUeXBlLlN0cmluZyAmJiBDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcoUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzUmVzdWx0T2ZTdWJ0b3RhbCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNIaWRkZW5DZWxsIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVSZXN1bHRGYWN0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMxM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeS5jcwpAQCAtMCwwICsxLDc4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ29tcGlsZVJlc3VsdEZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIENvbXBpbGVSZXN1bHQgQ3JlYXRlKG9iamVjdCBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgob2JqIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqID0gKChFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pb2JqKS5WYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmogPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pb2JqKS5HZXRPZmZzZXQoMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChudWxsLCBEYXRhVHlwZS5FbXB0eSk7CisgICAgICAgICAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKHN0cmluZykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChvYmosIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKGRvdWJsZSkpIHx8IG9iaiBpcyBkZWNpbWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChvYmosIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iai5HZXRUeXBlKCkuRXF1YWxzKHR5cGVvZihpbnQpKSB8fCBvYmogaXMgbG9uZyB8fCBvYmogaXMgc2hvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG9iaiwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKGJvb2wpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQob2JqLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmouR2V0VHlwZSgpLkVxdWFscyh0eXBlb2YgKEV4Y2VsRXJyb3JWYWx1ZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChvYmosIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iai5HZXRUeXBlKCkuRXF1YWxzKHR5cGVvZihTeXN0ZW0uRGF0ZVRpbWUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoKChTeXN0ZW0uRGF0ZVRpbWUpb2JqKS5Ub09BRGF0ZSgpLCBEYXRhVHlwZS5EYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm9uIHN1cHBvcnRlZCB0eXBlICIgKyBvYmouR2V0VHlwZSgpLkZ1bGxOYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0NvbXBpbGVTdHJhdGVneS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0NvbXBpbGVTdHJhdGVneS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTEzOGMwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvQ29tcGlsZVN0cmF0ZWd5LmNzCkBAIC0wLDAgKzEsNDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5Db21waWxlU3RyYXRlZ3kKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcGlsZVN0cmF0ZWd5CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgRXhwcmVzc2lvbiBfZXhwcmVzc2lvbjsKKworICAgICAgICBwdWJsaWMgQ29tcGlsZVN0cmF0ZWd5KEV4cHJlc3Npb24gZXhwcmVzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEV4cHJlc3Npb24gQ29tcGlsZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0NvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9Db21waWxlU3RyYXRlZ3lGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2ZiMWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9Db21waWxlU3RyYXRlZ3lGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkNvbXBpbGVTdHJhdGVneQoreworICAgIHB1YmxpYyBjbGFzcyBDb21waWxlU3RyYXRlZ3lGYWN0b3J5IDogSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyBDb21waWxlU3RyYXRlZ3kgQ3JlYXRlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uT3BlcmF0b3IuT3BlcmF0b3IgPT0gT3BlcmF0b3JzLkNvbmNhdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0NvbmNhdFN0cmF0ZWd5KGV4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdENvbXBpbGVTdHJhdGVneShleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0RlZmF1bHRDb21waWxlU3RyYXRlZ3kuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9EZWZhdWx0Q29tcGlsZVN0cmF0ZWd5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDgxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9EZWZhdWx0Q29tcGlsZVN0cmF0ZWd5LmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5Db21waWxlU3RyYXRlZ3kKK3sKKyAgICBwdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBpbGVTdHJhdGVneSA6IENvbXBpbGVTdHJhdGVneQorICAgIHsKKyAgICAgICAgcHVibGljIERlZmF1bHRDb21waWxlU3RyYXRlZ3koRXhwcmVzc2lvbiBleHByZXNzaW9uKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBFeHByZXNzaW9uIENvbXBpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2V4cHJlc3Npb24uTWVyZ2VXaXRoTmV4dCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9JQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE1MjYzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkNvbXBpbGVTdHJhdGVneQoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkKKyAgICB7CisgICAgICAgIENvbXBpbGVTdHJhdGVneSBDcmVhdGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9TdHJpbmdDb25jYXRTdHJhdGVneS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L1N0cmluZ0NvbmNhdFN0cmF0ZWd5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzExMzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9TdHJpbmdDb25jYXRTdHJhdGVneS5jcwpAQCAtMCwwICsxLDYyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5Cit7CisgICAgcHVibGljIGNsYXNzIFN0cmluZ0NvbmNhdFN0cmF0ZWd5IDogQ29tcGlsZVN0cmF0ZWd5CisgICAgeworICAgICAgICBwdWJsaWMgU3RyaW5nQ29uY2F0U3RyYXRlZ3koRXhwcmVzc2lvbiBleHByZXNzaW9uKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBDb21waWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG5ld0V4cCA9IF9leHByZXNzaW9uIGlzIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24gPyBfZXhwcmVzc2lvbiA6IEV4cHJlc3Npb25Db252ZXJ0ZXIuSW5zdGFuY2UuVG9TdHJpbmdFeHByZXNzaW9uKF9leHByZXNzaW9uKTsKKyAgICAgICAgICAgIG5ld0V4cC5QcmV2ID0gX2V4cHJlc3Npb24uUHJldjsKKyAgICAgICAgICAgIG5ld0V4cC5OZXh0ID0gX2V4cHJlc3Npb24uTmV4dDsKKyAgICAgICAgICAgIGlmIChfZXhwcmVzc2lvbi5QcmV2ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4cHJlc3Npb24uUHJldi5OZXh0ID0gbmV3RXhwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9leHByZXNzaW9uLk5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZXhwcmVzc2lvbi5OZXh0LlByZXYgPSBuZXdFeHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3RXhwLk1lcmdlV2l0aE5leHQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29uc3RhbnRFeHByZXNzaW9ucy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29uc3RhbnRFeHByZXNzaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E5ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db25zdGFudEV4cHJlc3Npb25zLmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdGFudEV4cHJlc3Npb25zCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIEV4cHJlc3Npb24gUGVyY2VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbigiUGVyY2VudCIsICgpID0+IG5ldyBDb21waWxlUmVzdWx0KDAuMDEsIERhdGFUeXBlLkRlY2ltYWwpKTsgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxDb21waWxlUmVzdWx0PiBfZmFjdG9yeU1ldGhvZDsKKworICAgICAgICBwdWJsaWMgQ29uc3RhbnRFeHByZXNzaW9uKHN0cmluZyB0aXRsZSwgRnVuYzxDb21waWxlUmVzdWx0PiBmYWN0b3J5TWV0aG9kKQorICAgICAgICAgICAgOiBiYXNlKHRpdGxlKQorICAgICAgICB7CisgICAgICAgICAgICBfZmFjdG9yeU1ldGhvZCA9IGZhY3RvcnlNZXRob2Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3J5TWV0aG9kKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RhdGFUeXBlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EYXRhVHlwZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTE1YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EYXRhVHlwZS5jcwpAQCAtMCwwICsxLDUyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgZW51bSBEYXRhVHlwZQorICAgIHsKKyAgICAgICAgSW50ZWdlciwKKyAgICAgICAgRGVjaW1hbCwKKyAgICAgICAgU3RyaW5nLAorICAgICAgICBCb29sZWFuLAorICAgICAgICBEYXRlLAorICAgICAgICBUaW1lLAorICAgICAgICBFbnVtZXJhYmxlLAorICAgICAgICBMb29rdXBBcnJheSwKKyAgICAgICAgRXhjZWxBZGRyZXNzLAorICAgICAgICBFeGNlbEVycm9yLAorICAgICAgICBFbXB0eQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGF0ZUV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RhdGVFeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NmVmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RhdGVFeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIERhdGVFeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgcHVibGljIERhdGVFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRlID0gZG91YmxlLlBhcnNlKEV4cHJlc3Npb25TdHJpbmcsQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlKSwgRGF0YVR5cGUuRGF0ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RlY2ltYWxFeHByZXNzaW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EZWNpbWFsRXhwcmVzc2lvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTgyZDJkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EZWNpbWFsRXhwcmVzc2lvbi5jcwpAQCAtMCwwICsxLDY5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBjbGFzcyBEZWNpbWFsRXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZG91YmxlPyBfY29tcGlsZWRWYWx1ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9uZWdhdGU7CisKKyAgICAgICAgcHVibGljIERlY2ltYWxFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICAgICAgOiB0aGlzKGV4cHJlc3Npb24sIGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWNpbWFsRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbiwgYm9vbCBuZWdhdGUpCisgICAgICAgICAgICA6IGJhc2UoZXhwcmVzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgX25lZ2F0ZSA9IG5lZ2F0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWNpbWFsRXhwcmVzc2lvbihkb3VibGUgY29tcGlsZWRWYWx1ZSkKKyAgICAgICAgICAgIDogYmFzZShjb21waWxlZFZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICBfY29tcGlsZWRWYWx1ZSA9IGNvbXBpbGVkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IF9jb21waWxlZFZhbHVlLkhhc1ZhbHVlID8gX2NvbXBpbGVkVmFsdWUuVmFsdWUgOiBkb3VibGUuUGFyc2UoRXhwcmVzc2lvblN0cmluZywgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICByZXN1bHQgPSBfbmVnYXRlID8gcmVzdWx0ICogLTEgOiByZXN1bHQ7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRW51bWVyYWJsZUV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0VudW1lcmFibGVFeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWM5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0VudW1lcmFibGVFeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsNzMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBjbGFzcyBFbnVtZXJhYmxlRXhwcmVzc2lvbiA6IEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBFbnVtZXJhYmxlRXhwcmVzc2lvbigpCisgICAgICAgICAgICA6IHRoaXMobmV3IEV4cHJlc3Npb25Db21waWxlcigpKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbnVtZXJhYmxlRXhwcmVzc2lvbihJRXhwcmVzc2lvbkNvbXBpbGVyIGV4cHJlc3Npb25Db21waWxlcikKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb25Db21waWxlciA9IGV4cHJlc3Npb25Db21waWxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUV4cHJlc3Npb25Db21waWxlciBfZXhwcmVzc2lvbkNvbXBpbGVyOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzR3JvdXBlZEV4cHJlc3Npb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBQcmVwYXJlRm9yTmV4dENoaWxkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGlsZEV4cHJlc3Npb24gaW4gQ2hpbGRyZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LkFkZChfZXhwcmVzc2lvbkNvbXBpbGVyLkNvbXBpbGUobmV3IExpc3Q8RXhwcmVzc2lvbj57IGNoaWxkRXhwcmVzc2lvbiB9KS5SZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRW51bWVyYWJsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsQWRkcmVzc0V4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsQWRkcmVzc0V4cHJlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzNDExNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxBZGRyZXNzRXhwcmVzc2lvbi5jcwpAQCAtMCwwICsxLDEyMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmFuZ2VBZGRyZXNzRmFjdG9yeSBfcmFuZ2VBZGRyZXNzRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9uZWdhdGU7CisKKyAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgICAgIDogdGhpcyhleHByZXNzaW9uLCBleGNlbERhdGFQcm92aWRlciwgcGFyc2luZ0NvbnRleHQsIG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGV4Y2VsRGF0YVByb3ZpZGVyKSwgZmFsc2UpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlciwgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQsIGJvb2wgbmVnYXRlKQorICAgICAgICAgICAgOiB0aGlzKGV4cHJlc3Npb24sIGV4Y2VsRGF0YVByb3ZpZGVyLCBwYXJzaW5nQ29udGV4dCwgbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoZXhjZWxEYXRhUHJvdmlkZXIpLCBuZWdhdGUpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCwgUmFuZ2VBZGRyZXNzRmFjdG9yeSByYW5nZUFkZHJlc3NGYWN0b3J5LCBib29sIG5lZ2F0ZSkKKyAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoZXhjZWxEYXRhUHJvdmlkZXIpLk5hbWVkKCJleGNlbERhdGFQcm92aWRlciIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHBhcnNpbmdDb250ZXh0KS5OYW1lZCgicGFyc2luZ0NvbnRleHQiKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIFJlcXVpcmUuVGhhdChyYW5nZUFkZHJlc3NGYWN0b3J5KS5OYW1lZCgicmFuZ2VBZGRyZXNzRmFjdG9yeSIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBwYXJzaW5nQ29udGV4dDsKKyAgICAgICAgICAgIF9yYW5nZUFkZHJlc3NGYWN0b3J5ID0gcmFuZ2VBZGRyZXNzRmFjdG9yeTsKKyAgICAgICAgICAgIF9uZWdhdGUgPSBuZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChQYXJlbnRJc0xvb2t1cEZ1bmN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChFeHByZXNzaW9uU3RyaW5nLCBEYXRhVHlwZS5FeGNlbEFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb21waWxlUmFuZ2VWYWx1ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ29tcGlsZVJlc3VsdCBDb21waWxlUmFuZ2VWYWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYyA9IHRoaXMuX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5DdXJyZW50OworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9leGNlbERhdGFQcm92aWRlci5HZXRSYW5nZShjLkFkZHJlc3MuV29ya3NoZWV0LCBjLkFkZHJlc3MuRnJvbVJvdywgYy5BZGRyZXNzLkZyb21Db2wsIEV4cHJlc3Npb25TdHJpbmcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LklzRW1wdHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVSZXN1bHQuRW1wdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0LkFkZHJlc3MuUm93cyA+IDEgfHwgcmVzdWx0LkFkZHJlc3MuQ29sdW1ucyA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRW51bWVyYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVTaW5nbGVDZWxsKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZVNpbmdsZUNlbGwoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyByZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjZWxsID0gcmVzdWx0LkZpcnN0KCk7CisgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpOworICAgICAgICAgICAgdmFyIGNvbXBpbGVSZXN1bHQgPSBmYWN0b3J5LkNyZWF0ZShjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgIGlmIChfbmVnYXRlICYmIGNvbXBpbGVSZXN1bHQuSXNOdW1lcmljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXBpbGVSZXN1bHQgPSBuZXcgQ29tcGlsZVJlc3VsdChjb21waWxlUmVzdWx0LlJlc3VsdE51bWVyaWMgKiAtMSwgY29tcGlsZVJlc3VsdC5EYXRhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21waWxlUmVzdWx0LklzSGlkZGVuQ2VsbCA9IGNlbGwuSXNIaWRkZW5Sb3c7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZVJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxFcnJvckV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsRXJyb3JFeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWU0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsRXJyb3JFeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsNzQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxFcnJvckV4cHJlc3Npb24gOiBFeHByZXNzaW9uCisgICAgeworICAgICAgICBFeGNlbEVycm9yVmFsdWUgX2Vycm9yOworICAgICAgICBwdWJsaWMgRXhjZWxFcnJvckV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIEV4Y2VsRXJyb3JWYWx1ZSBlcnJvcikKKyAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBfZXJyb3IgPSBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlbEVycm9yRXhwcmVzc2lvbihFeGNlbEVycm9yVmFsdWUgZXJyb3IpCisgICAgICAgICAgICA6IHRoaXMoZXJyb3IuVG9TdHJpbmcoKSwgZXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoX2Vycm9yLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgICAgIC8vaWYgKFBhcmVudElzTG9va3VwRnVuY3Rpb24pCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChFeHByZXNzaW9uU3RyaW5nLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiBDb21waWxlUmFuZ2VWYWx1ZXMoKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWI2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb24uY3MKQEAgLTAsMCArMSwxMjggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgRXhwcmVzc2lvblN0cmluZyB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PEV4cHJlc3Npb24+IF9jaGlsZHJlbiA9IG5ldyBMaXN0PEV4cHJlc3Npb24+KCk7CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBDaGlsZHJlbiB7IGdldCB7IHJldHVybiBfY2hpbGRyZW47IH0gfQorICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbiBOZXh0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIEV4cHJlc3Npb24gUHJldiB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBJT3BlcmF0b3IgT3BlcmF0b3IgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb24oKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBFeHByZXNzaW9uU3RyaW5nID0gZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIE9wZXJhdG9yID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgUGFyZW50SXNMb29rdXBGdW5jdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEhhc0NoaWxkcmVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfY2hpbGRyZW4uQW55KCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gIFByZXBhcmVGb3JOZXh0Q2hpbGQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gQWRkQ2hpbGQoRXhwcmVzc2lvbiBjaGlsZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jaGlsZHJlbi5BbnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IF9jaGlsZHJlbi5MYXN0KCk7CisgICAgICAgICAgICAgICAgY2hpbGQuUHJldiA9IGxhc3Q7CisgICAgICAgICAgICAgICAgbGFzdC5OZXh0ID0gY2hpbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY2hpbGRyZW4uQWRkKGNoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gTWVyZ2VXaXRoTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gdGhpczsKKyAgICAgICAgICAgIGlmIChOZXh0ICE9IG51bGwgJiYgT3BlcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuQXBwbHkoQ29tcGlsZSgpLCBOZXh0LkNvbXBpbGUoKSk7CisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuSW5zdGFuY2UuRnJvbUNvbXBpbGVSZXN1bHQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpcyBFeGNlbEVycm9yRXhwcmVzc2lvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uTmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uUHJldiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTmV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5PcGVyYXRvciA9IE5leHQuT3BlcmF0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uT3BlcmF0b3IgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleHByZXNzaW9uLk5leHQgPSBOZXh0Lk5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uTmV4dCAhPSBudWxsKSBleHByZXNzaW9uLk5leHQuUHJldiA9IGV4cHJlc3Npb247CisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5QcmV2ID0gUHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEZvcm1hdEV4Y2VwdGlvbigiSW52YWxpZCBmb3JtdWxhIHN5bnRheC4gT3BlcmF0b3IgbWlzc2luZyBleHByZXNzaW9uLiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQcmV2ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJldi5OZXh0ID0gZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db21waWxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJhYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29tcGlsZXIuY3MKQEAgLTAsMCArMSwxNTcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkNvbXBpbGVTdHJhdGVneTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIEV4cHJlc3Npb25Db21waWxlciA6IElFeHByZXNzaW9uQ29tcGlsZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gX2V4cHJlc3Npb25zOworICAgICAgICBwcml2YXRlIElFeHByZXNzaW9uQ29udmVydGVyIF9leHByZXNzaW9uQ29udmVydGVyOworICAgICAgICBwcml2YXRlIElDb21waWxlU3RyYXRlZ3lGYWN0b3J5IF9jb21waWxlU3RyYXRlZ3lGYWN0b3J5OworCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uQ29tcGlsZXIoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBFeHByZXNzaW9uQ29udmVydGVyKCksIG5ldyBDb21waWxlU3RyYXRlZ3lGYWN0b3J5KCkpCisgICAgICAgIHsKKyAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uQ29tcGlsZXIoSUV4cHJlc3Npb25Db252ZXJ0ZXIgZXhwcmVzc2lvbkNvbnZlcnRlciwgSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkgY29tcGlsZVN0cmF0ZWd5RmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb25Db252ZXJ0ZXIgPSBleHByZXNzaW9uQ29udmVydGVyOworICAgICAgICAgICAgX2NvbXBpbGVTdHJhdGVneUZhY3RvcnkgPSBjb21waWxlU3RyYXRlZ3lGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBpbGVSZXN1bHQgQ29tcGlsZShJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBleHByZXNzaW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7CisgICAgICAgICAgICByZXR1cm4gUGVyZm9ybUNvbXBpbGF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIENvbXBpbGVSZXN1bHQgQ29tcGlsZShzdHJpbmcgd29ya3NoZWV0LCBpbnQgcm93LCBpbnQgY29sdW1uLCBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBleHByZXNzaW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7CisgICAgICAgICAgICByZXR1cm4gUGVyZm9ybUNvbXBpbGF0aW9uKHdvcmtzaGVldCwgcm93LCBjb2x1bW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IFBlcmZvcm1Db21waWxhdGlvbihzdHJpbmcgd29ya3NoZWV0PSIiLCBpbnQgcm93PS0xLCBpbnQgY29sdW1uPS0xKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29tcGlsZWRFeHByZXNzaW9ucyA9IEhhbmRsZUdyb3VwZWRFeHByZXNzaW9ucygpOworICAgICAgICAgICAgd2hpbGUoY29tcGlsZWRFeHByZXNzaW9ucy5BbnkoeCA9PiB4Lk9wZXJhdG9yICE9IG51bGwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcmVjID0gRmluZExvd2VzdFByZWNlZGVuY2UoKTsKKyAgICAgICAgICAgICAgICBjb21waWxlZEV4cHJlc3Npb25zID0gSGFuZGxlUHJlY2VkZW5jZUxldmVsKHByZWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9leHByZXNzaW9ucy5BbnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZWRFeHByZXNzaW9ucy5GaXJzdCgpLkNvbXBpbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDb21waWxlUmVzdWx0LkVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBIYW5kbGVHcm91cGVkRXhwcmVzc2lvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9leHByZXNzaW9ucy5BbnkoKSkgcmV0dXJuIEVudW1lcmFibGUuRW1wdHk8RXhwcmVzc2lvbj4oKTsKKyAgICAgICAgICAgIHZhciBmaXJzdCA9IF9leHByZXNzaW9ucy5GaXJzdCgpOworICAgICAgICAgICAgdmFyIGdyb3VwZWRFeHByZXNzaW9ucyA9IF9leHByZXNzaW9ucy5XaGVyZSh4ID0+IHguSXNHcm91cGVkRXhwcmVzc2lvbik7CisgICAgICAgICAgICBmb3JlYWNoKHZhciBncm91cGVkRXhwcmVzc2lvbiBpbiBncm91cGVkRXhwcmVzc2lvbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdyb3VwZWRFeHByZXNzaW9uLkNvbXBpbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IENvbXBpbGVSZXN1bHQuRW1wdHkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHZhciBuZXdFeHAgPSBfZXhwcmVzc2lvbkNvbnZlcnRlci5Gcm9tQ29tcGlsZVJlc3VsdChyZXN1bHQpOworICAgICAgICAgICAgICAgIG5ld0V4cC5PcGVyYXRvciA9IGdyb3VwZWRFeHByZXNzaW9uLk9wZXJhdG9yOworICAgICAgICAgICAgICAgIG5ld0V4cC5QcmV2ID0gZ3JvdXBlZEV4cHJlc3Npb24uUHJldjsKKyAgICAgICAgICAgICAgICBuZXdFeHAuTmV4dCA9IGdyb3VwZWRFeHByZXNzaW9uLk5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uLlByZXYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRFeHByZXNzaW9uLlByZXYuTmV4dCA9IG5ld0V4cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uLk5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRFeHByZXNzaW9uLk5leHQuUHJldiA9IG5ld0V4cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uID09IGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBuZXdFeHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFJlZnJlc2hMaXN0KGZpcnN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gSGFuZGxlUHJlY2VkZW5jZUxldmVsKGludCBwcmVjZWRlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmlyc3QgPSBfZXhwcmVzc2lvbnMuRmlyc3QoKTsKKyAgICAgICAgICAgIHZhciBleHByZXNzaW9uc1RvSGFuZGxlID0gX2V4cHJlc3Npb25zLldoZXJlKHggPT4geC5PcGVyYXRvciAhPSBudWxsICYmIHguT3BlcmF0b3IuUHJlY2VkZW5jZSA9PSBwcmVjZWRlbmNlKTsKKyAgICAgICAgICAgIHZhciBsYXN0ID0gZXhwcmVzc2lvbnNUb0hhbmRsZS5MYXN0KCk7CisgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zVG9IYW5kbGUuRmlyc3QoKTsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN0cmF0ZWd5ID0gX2NvbXBpbGVTdHJhdGVneUZhY3RvcnkuQ3JlYXRlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIHZhciBjb21waWxlZEV4cHJlc3Npb24gPSBzdHJhdGVneS5Db21waWxlKCk7CisgICAgICAgICAgICAgICAgaWYoY29tcGlsZWRFeHByZXNzaW9uIGlzIEV4Y2VsRXJyb3JFeHByZXNzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZnJlc2hMaXN0KGNvbXBpbGVkRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uID09IGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBjb21waWxlZEV4cHJlc3Npb247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGNvbXBpbGVkRXhwcmVzc2lvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbi5PcGVyYXRvciAhPSBudWxsICYmIGV4cHJlc3Npb24uT3BlcmF0b3IuUHJlY2VkZW5jZSA9PSBwcmVjZWRlbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBSZWZyZXNoTGlzdChmaXJzdCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBGaW5kTG93ZXN0UHJlY2VkZW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfZXhwcmVzc2lvbnMuV2hlcmUoeCA9PiB4Lk9wZXJhdG9yICE9IG51bGwpLk1pbih4ID0+IHguT3BlcmF0b3IuUHJlY2VkZW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IFJlZnJlc2hMaXN0KEV4cHJlc3Npb24gZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHRMaXN0ID0gbmV3IExpc3Q8RXhwcmVzc2lvbj4oKTsKKyAgICAgICAgICAgIHZhciBleHAgPSBmaXJzdDsKKyAgICAgICAgICAgIHJlc3VsdExpc3QuQWRkKGV4cCk7CisgICAgICAgICAgICB3aGlsZSAoZXhwLk5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRMaXN0LkFkZChleHAuTmV4dCk7CisgICAgICAgICAgICAgICAgZXhwID0gZXhwLk5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZXhwcmVzc2lvbnMgPSByZXN1bHRMaXN0OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3Q7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db252ZXJ0ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db252ZXJ0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhNDI0OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbnZlcnRlci5jcwpAQCAtMCwwICsxLDk1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29udmVydGVyIDogSUV4cHJlc3Npb25Db252ZXJ0ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBTdHJpbmdFeHByZXNzaW9uIFRvU3RyaW5nRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBleHByZXNzaW9uLkNvbXBpbGUoKTsKKyAgICAgICAgICAgIHZhciBuZXdFeHAgPSBuZXcgU3RyaW5nRXhwcmVzc2lvbihyZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgbmV3RXhwLk9wZXJhdG9yID0gZXhwcmVzc2lvbi5PcGVyYXRvcjsKKyAgICAgICAgICAgIHJldHVybiBuZXdFeHA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbiBGcm9tQ29tcGlsZVJlc3VsdChDb21waWxlUmVzdWx0IGNvbXBpbGVSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29tcGlsZVJlc3VsdC5EYXRhVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkludGVnZXI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCBpcyBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEludGVnZXJFeHByZXNzaW9uKGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbihDb252ZXJ0LlRvRG91YmxlKGNvbXBpbGVSZXN1bHQuUmVzdWx0KSk7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbihjb21waWxlUmVzdWx0LlJlc3VsdC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRlY2ltYWw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCBpcyBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBEZWNpbWFsRXhwcmVzc2lvbihjb21waWxlUmVzdWx0LlJlc3VsdC5Ub1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IERlY2ltYWxFeHByZXNzaW9uKCgoZG91YmxlKSBjb21waWxlUmVzdWx0LlJlc3VsdCkpOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuUmVzdWx0IGlzIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEJvb2xlYW5FeHByZXNzaW9uKGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgQm9vbGVhbkV4cHJlc3Npb24oKGJvb2wpIGNvbXBpbGVSZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAvL2Nhc2UgRGF0YVR5cGUuRW51bWVyYWJsZToKKyAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gCisgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5FeGNlbEVycm9yOgorICAgICAgICAgICAgICAgICAgICAvL3Rocm93IChuZXcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zLkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigoRXhjZWxFcnJvclZhbHVlKWNvbXBpbGVSZXN1bHQuUmVzdWx0KSk7IC8vQWRkZWQgSksKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuUmVzdWx0IGlzIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRXhjZWxFcnJvckV4cHJlc3Npb24oY29tcGlsZVJlc3VsdC5SZXN1bHQuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEVycm9yVmFsdWUuUGFyc2UoY29tcGlsZVJlc3VsdC5SZXN1bHQuVG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbigoRXhjZWxFcnJvclZhbHVlKSBjb21waWxlUmVzdWx0LlJlc3VsdCk7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5FbXB0eToKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXJFeHByZXNzaW9uKDApOyAvL0FkZGVkIEpLCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUV4cHJlc3Npb25Db252ZXJ0ZXIgX2luc3RhbmNlOworICAgICAgICBwdWJsaWMgc3RhdGljIElFeHByZXNzaW9uQ29udmVydGVyIEluc3RhbmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBFeHByZXNzaW9uQ29udmVydGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25GYWN0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3MzUyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uRmFjdG9yeS5jcwpAQCAtMCwwICsxLDgxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkZhY3RvcnkgOiBJRXhwcmVzc2lvbkZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbkZhY3RvcnkoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb24gQ3JlYXRlKFRva2VuIHRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLlRva2VuVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JbnRlZ2VyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXJFeHByZXNzaW9uKHRva2VuLlZhbHVlLCB0b2tlbi5Jc05lZ2F0ZWQpOworICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdFeHByZXNzaW9uKHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5EZWNpbWFsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlY2ltYWxFeHByZXNzaW9uKHRva2VuLlZhbHVlLCB0b2tlbi5Jc05lZ2F0ZWQpOworICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkJvb2xlYW46CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbkV4cHJlc3Npb24odG9rZW4uVmFsdWUpOworICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkV4Y2VsQWRkcmVzczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKHRva2VuLlZhbHVlLCBfZXhjZWxEYXRhUHJvdmlkZXIsIF9wYXJzaW5nQ29udGV4dCwgdG9rZW4uSXNOZWdhdGVkKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JbnZhbGlkUmVmZXJlbmNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JFeHByZXNzaW9uKHRva2VuLlZhbHVlLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuUmVmKSk7CisgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuTnVtZXJpY0Vycm9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JFeHByZXNzaW9uKHRva2VuLlZhbHVlLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVtKSk7CisgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuVmFsdWVEYXRhVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JFeHByZXNzaW9uKHRva2VuLlZhbHVlLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5OdWxsOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JFeHByZXNzaW9uKHRva2VuLlZhbHVlLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVsbCkpOworICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLk5hbWVWYWx1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lZFZhbHVlRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0V4cHJlc3Npb24odG9rZW4uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uR3JhcGguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25HcmFwaC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM2NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uR3JhcGguY3MKQEAgLTAsMCArMSw3MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIEV4cHJlc3Npb25HcmFwaAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IF9leHByZXNzaW9ucyA9IG5ldyBMaXN0PEV4cHJlc3Npb24+KCk7CisgICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBFeHByZXNzaW9ucyB7IGdldCB7IHJldHVybiBfZXhwcmVzc2lvbnM7IH0gfQorICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbiBDdXJyZW50IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uIEFkZChFeHByZXNzaW9uIGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leHByZXNzaW9ucy5BZGQoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBpZiAoQ3VycmVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN1cnJlbnQuTmV4dCA9IGV4cHJlc3Npb247CisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5QcmV2ID0gQ3VycmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEN1cnJlbnQgPSBleHByZXNzaW9uOworICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leHByZXNzaW9ucy5DbGVhcigpOworICAgICAgICAgICAgQ3VycmVudCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhwcmVzc2lvbiBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBDdXJyZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBpdGVtLlByZXYgPz8gaXRlbS5OZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2V4cHJlc3Npb25zLlJlbW92ZShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc3MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uR3JhcGhCdWlsZGVyLmNzCkBAIC0wLDAgKzEsMjUyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkdyYXBoQnVpbGRlciA6SUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbkdyYXBoIF9ncmFwaCA9IG5ldyBFeHByZXNzaW9uR3JhcGgoKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRXhwcmVzc2lvbkZhY3RvcnkgX2V4cHJlc3Npb25GYWN0b3J5OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX3Rva2VuSW5kZXggPSAwOworICAgICAgICBwcml2YXRlIGJvb2wgX25lZ2F0ZU5leHRFeHByZXNzaW9uOworCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uR3JhcGhCdWlsZGVyKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgRXhwcmVzc2lvbkZhY3RvcnkoZXhjZWxEYXRhUHJvdmlkZXIsIHBhcnNpbmdDb250ZXh0KSwgcGFyc2luZ0NvbnRleHQpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4cHJlc3Npb25HcmFwaEJ1aWxkZXIoSUV4cHJlc3Npb25GYWN0b3J5IGV4cHJlc3Npb25GYWN0b3J5LCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb25GYWN0b3J5ID0gZXhwcmVzc2lvbkZhY3Rvcnk7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBwYXJzaW5nQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uR3JhcGggQnVpbGQoSUVudW1lcmFibGU8VG9rZW4+IHRva2VucykKKyAgICAgICAgeworICAgICAgICAgICAgX3Rva2VuSW5kZXggPSAwOworICAgICAgICAgICAgX2dyYXBoLlJlc2V0KCk7CisgICAgICAgICAgICB2YXIgdG9rZW5zQXJyID0gdG9rZW5zICE9IG51bGwgPyB0b2tlbnMuVG9BcnJheSgpIDogbmV3IFRva2VuWzBdOworICAgICAgICAgICAgQnVpbGRVcCh0b2tlbnNBcnIsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIF9ncmFwaDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBCdWlsZFVwKFRva2VuW10gdG9rZW5zLCBFeHByZXNzaW9uIHBhcmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKF90b2tlbkluZGV4IDwgdG9rZW5zLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbX3Rva2VuSW5kZXhdOworICAgICAgICAgICAgICAgIElPcGVyYXRvciBvcCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IgJiYgT3BlcmF0b3JzRGljdC5JbnN0YW5jZS5UcnlHZXRWYWx1ZSh0b2tlbi5WYWx1ZSwgb3V0IG9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldE9wZXJhdG9yT25FeHByZXNzaW9uKHBhcmVudCwgb3ApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkZ1bmN0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnVpbGRGdW5jdGlvbkV4cHJlc3Npb24odG9rZW5zLCBwYXJlbnQsIHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90b2tlbkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkRW51bWVyYWJsZUV4cHJlc3Npb24odG9rZW5zLCBwYXJlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90b2tlbkluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkR3JvdXBFeHByZXNzaW9uKHRva2VucywgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAocGFyZW50IGlzIEZ1bmN0aW9uRXhwcmVzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzIHx8IHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuQ2xvc2luZ0VudW1lcmFibGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5OZWdhdG9yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZih0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlBlcmNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRPcGVyYXRvck9uRXhwcmVzc2lvbihwYXJlbnQsIE9wZXJhdG9yLlBlcmNlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ncmFwaC5BZGQoQ29uc3RhbnRFeHByZXNzaW9ucy5QZXJjZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5BZGRDaGlsZChDb25zdGFudEV4cHJlc3Npb25zLlBlcmNlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENyZWF0ZUFuZEFwcGVuZEV4cHJlc3Npb24ocmVmIHBhcmVudCwgdG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfdG9rZW5JbmRleCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEJ1aWxkRW51bWVyYWJsZUV4cHJlc3Npb24oVG9rZW5bXSB0b2tlbnMsIEV4cHJlc3Npb24gcGFyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2dyYXBoLkFkZChuZXcgRW51bWVyYWJsZUV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgQnVpbGRVcCh0b2tlbnMsIF9ncmFwaC5DdXJyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZW51bWVyYWJsZUV4cHJlc3Npb24gPSBuZXcgRW51bWVyYWJsZUV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICBwYXJlbnQuQWRkQ2hpbGQoZW51bWVyYWJsZUV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIEJ1aWxkVXAodG9rZW5zLCBlbnVtZXJhYmxlRXhwcmVzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlQW5kQXBwZW5kRXhwcmVzc2lvbihyZWYgRXhwcmVzc2lvbiBwYXJlbnQsIFRva2VuIHRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNXYXN0ZSh0b2tlbikpIHJldHVybjsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAKKyAgICAgICAgICAgICAgICAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5Db21tYSB8fCB0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlNlbWlDb2xvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LlByZXBhcmVGb3JOZXh0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX25lZ2F0ZU5leHRFeHByZXNzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRva2VuLk5lZ2F0ZSgpOworICAgICAgICAgICAgICAgIF9uZWdhdGVOZXh0RXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZXhwcmVzc2lvbkZhY3RvcnkuQ3JlYXRlKHRva2VuKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZ3JhcGguQWRkKGV4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmVudC5BZGRDaGlsZChleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBJc1dhc3RlKFRva2VuIHRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQnVpbGRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW5bXSB0b2tlbnMsIEV4cHJlc3Npb24gcGFyZW50LCBzdHJpbmcgZnVuY05hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZ3JhcGguQWRkKG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oZnVuY05hbWUsIF9wYXJzaW5nQ29udGV4dCwgX25lZ2F0ZU5leHRFeHByZXNzaW9uKSk7CisgICAgICAgICAgICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgSGFuZGxlRnVuY3Rpb25Bcmd1bWVudHModG9rZW5zLCBfZ3JhcGguQ3VycmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKGZ1bmNOYW1lLCBfcGFyc2luZ0NvbnRleHQsIF9uZWdhdGVOZXh0RXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcGFyZW50LkFkZENoaWxkKGZ1bmMpOworICAgICAgICAgICAgICAgIEhhbmRsZUZ1bmN0aW9uQXJndW1lbnRzKHRva2VucywgZnVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSGFuZGxlRnVuY3Rpb25Bcmd1bWVudHMoVG9rZW5bXSB0b2tlbnMsIEV4cHJlc3Npb24gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b2tlbkluZGV4Kys7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMuRWxlbWVudEF0KF90b2tlbkluZGV4KTsKKyAgICAgICAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgIT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3Rva2VuSW5kZXgrKzsKKyAgICAgICAgICAgIEJ1aWxkVXAodG9rZW5zLCBmdW5jdGlvbi5DaGlsZHJlbi5GaXJzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBCdWlsZEdyb3VwRXhwcmVzc2lvbihUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBwYXJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZ3JhcGguQWRkKG5ldyBHcm91cEV4cHJlc3Npb24oX25lZ2F0ZU5leHRFeHByZXNzaW9uKSk7CisgICAgICAgICAgICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgQnVpbGRVcCh0b2tlbnMsIF9ncmFwaC5DdXJyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50LklzR3JvdXBlZEV4cHJlc3Npb24gfHwgcGFyZW50IGlzIEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0dyb3VwRXhwcmVzc2lvbiA9IG5ldyBHcm91cEV4cHJlc3Npb24oX25lZ2F0ZU5leHRFeHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5BZGRDaGlsZChuZXdHcm91cEV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBCdWlsZFVwKHRva2VucywgbmV3R3JvdXBFeHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIEJ1aWxkVXAodG9rZW5zLCBwYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldE9wZXJhdG9yT25FeHByZXNzaW9uKEV4cHJlc3Npb24gcGFyZW50LCBJT3BlcmF0b3Igb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZ3JhcGguQ3VycmVudC5PcGVyYXRvciA9IG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gY2FuZGlkYXRlOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaXMgRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBwYXJlbnQuQ2hpbGRyZW4uTGFzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBwYXJlbnQuQ2hpbGRyZW4uTGFzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlIGlzIEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUuQ2hpbGRyZW4uTGFzdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhbmRpZGF0ZS5PcGVyYXRvciA9IG9wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1YWVlMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24uY3MKQEAgLTAsMCArMSw3NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uIDogR3JvdXBFeHByZXNzaW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gX2Z1bmN0aW9uOworCisgICAgICAgIHB1YmxpYyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbihFeHByZXNzaW9uIGZ1bmN0aW9uKQorICAgICAgICAgICAgOiBiYXNlKGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBfZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFBhcmVudElzTG9va3VwRnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuUGFyZW50SXNMb29rdXBGdW5jdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2UuUGFyZW50SXNMb29rdXBGdW5jdGlvbiA9IHZhbHVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGlsZCBpbiBDaGlsZHJlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLlBhcmVudElzTG9va3VwRnVuY3Rpb24gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4cHJlc3Npb24gUHJlcGFyZUZvck5leHRDaGlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfZnVuY3Rpb24uUHJlcGFyZUZvck5leHRDaGlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0RlZmF1bHRDb21waWxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE4NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXIuY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzCit7CisgICAgcHVibGljIGNsYXNzIERlZmF1bHRDb21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBEZWZhdWx0Q29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgICAgIDogYmFzZShmdW5jdGlvbikKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbXBpbGVSZXN1bHQgPSBjaGlsZC5Db21waWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVSZXN1bHQuSXNSZXN1bHRPZlN1YnRvdGFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IG5ldyBGdW5jdGlvbkFyZ3VtZW50KGNvbXBpbGVSZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYXJnLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLklzUmVzdWx0T2ZTdWJ0b3RhbCk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKGFyZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkRnVuY3Rpb25Bcmd1bWVudHMoY29tcGlsZVJlc3VsdC5SZXN1bHQsIGFyZ3MpOyAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLkV4ZWN1dGUoYXJncywgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0Vycm9ySGFuZGxpbmdGdW5jdGlvbkNvbXBpbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9FcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmE0Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9FcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlci5jcwpAQCAtMCwwICsxLDcxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVycworeworICAgIHB1YmxpYyBjbGFzcyBFcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBFcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgICAgICAgOiBiYXNlKGZ1bmN0aW9uKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYXJnID0gY2hpbGQuQ29tcGlsZSgpOworICAgICAgICAgICAgICAgICAgICBCdWlsZEZ1bmN0aW9uQXJndW1lbnRzKGFyZyAhPSBudWxsID8gYXJnLlJlc3VsdCA6IG51bGwsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIGVmZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEVycm9ySGFuZGxpbmdGdW5jdGlvbilGdW5jdGlvbikuSGFuZGxlRXJyb3IoZWZlLkVycm9yVmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoLy8gKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRXJyb3JIYW5kbGluZ0Z1bmN0aW9uKUZ1bmN0aW9uKS5IYW5kbGVFcnJvcihFeGNlbEVycm9yVmFsdWUuVmFsdWVzLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRnVuY3Rpb25Db21waWxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRnVuY3Rpb25Db21waWxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E4YjIyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyLmNzCkBAIC0wLDAgKzEsNzUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25Db21waWxlcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VsRnVuY3Rpb24gRnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQoZnVuY3Rpb24pLk5hbWVkKCJmdW5jdGlvbiIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgRnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIEJ1aWxkRnVuY3Rpb25Bcmd1bWVudHMob2JqZWN0IHJlc3VsdCwgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVzdWx0IGlzIElFbnVtZXJhYmxlPG9iamVjdD4gJiYgIShyZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFyZ0xpc3QgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PigpOworICAgICAgICAgICAgICAgIHZhciBvYmplY3RzID0gcmVzdWx0IGFzIElFbnVtZXJhYmxlPG9iamVjdD47CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBvYmplY3RzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnVpbGRGdW5jdGlvbkFyZ3VtZW50cyhhcmcsIGFyZ0xpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChhcmdMaXN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQocmVzdWx0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0Z1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY3NjkzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5jcwpAQCAtMCwwICsxLDY3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Db21waWxlckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxUeXBlLCBGdW5jdGlvbkNvbXBpbGVyPiBfc3BlY2lhbENvbXBpbGVycyA9IG5ldyBEaWN0aW9uYXJ5PFR5cGUsIEZ1bmN0aW9uQ29tcGlsZXI+KCk7CisKKyAgICAgICAgcHVibGljIEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KEZ1bmN0aW9uUmVwb3NpdG9yeSByZXBvc2l0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQodHlwZW9mKElmKSwgbmV3IElmRnVuY3Rpb25Db21waWxlcihyZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJpZiIpKSk7CisgICAgICAgICAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQodHlwZW9mKElmRXJyb3IpLCBuZXcgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIocmVwb3NpdG9yeS5HZXRGdW5jdGlvbigiaWZlcnJvciIpKSk7CisgICAgICAgICAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQodHlwZW9mKElmTmEpLCBuZXcgSWZOYUZ1bmN0aW9uQ29tcGlsZXIocmVwb3NpdG9yeS5HZXRGdW5jdGlvbigiaWZuYSIpKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZ1bmN0aW9uQ29tcGlsZXIgR2V0Q29tcGlsZXJCeVR5cGUoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmNUeXBlID0gZnVuY3Rpb24uR2V0VHlwZSgpOworICAgICAgICAgICAgaWYgKF9zcGVjaWFsQ29tcGlsZXJzLkNvbnRhaW5zS2V5KGZ1bmNUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NwZWNpYWxDb21waWxlcnNbZnVuY1R5cGVdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Q29tcGlsZXIoZnVuY3Rpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIEZ1bmN0aW9uQ29tcGlsZXIgQ3JlYXRlKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbi5Jc0xvb2t1cEZ1Y3Rpb24pIHJldHVybiBuZXcgTG9va3VwRnVuY3Rpb25Db21waWxlcihmdW5jdGlvbik7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb24uSXNFcnJvckhhbmRsaW5nRnVuY3Rpb24pIHJldHVybiBuZXcgRXJyb3JIYW5kbGluZ0Z1bmN0aW9uQ29tcGlsZXIoZnVuY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuIEdldENvbXBpbGVyQnlUeXBlKGZ1bmN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRXJyb3JGdW5jdGlvbkNvbXBpbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2M4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRXJyb3JGdW5jdGlvbkNvbXBpbGVyLmNzCkBAIC0wLDAgKzEsNDggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIgOiBGdW5jdGlvbkNvbXBpbGVyCisgICAgeworICAgICAgICBwdWJsaWMgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgICAgIDogYmFzZShmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGZ1bmN0aW9uKS5OYW1lZCgiZnVuY3Rpb24iKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5Db3VudCgpICE9IDIpIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuLkZpcnN0KCk7CisgICAgICAgICAgICB2YXIgbGFzdENoaWxkID0gY2hpbGRyZW4uRWxlbWVudEF0KDEpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZpcnN0Q2hpbGQuQ29tcGlsZSgpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuRGF0YVR5cGUgPT0gRGF0YVR5cGUuRXhjZWxFcnJvcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KGxhc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHJlc3VsdC5SZXN1bHQpKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChsYXN0Q2hpbGQuQ29tcGlsZSgpLlJlc3VsdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLkV4ZWN1dGUoYXJncywgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRnVuY3Rpb25Db21waWxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvSWZGdW5jdGlvbkNvbXBpbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTcwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRnVuY3Rpb25Db21waWxlci5jcwpAQCAtMCwwICsxLDExNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxNC0wMS0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaHkgZG8gdGhlIElmIGZ1bmN0aW9uIHJlcXVpcmUgYSBjb21waWxlciBvZiBpdHMgb3duIHlvdSBtaWdodCBhc2s7KQorICAgIC8vLyAKKyAgICAvLy8gSXQgaXMgYmVjYXVzZSBpdCBvbmx5IG5lZWRzIHRvIGV2YWx1YXRlIG9uZSBvZiB0aGUgdHdvIGxhc3QgZXhwcmVzc2lvbnMuIFRoaXMKKyAgICAvLy8gY29tcGlsZXIgaGFuZGxlcyB0aGlzIC0gaXQgaWdub3JlcyB0aGUgaXJyZWxldmFudCBleHByZXNzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIElmRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBJZkZ1bmN0aW9uQ29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgICAgIDogYmFzZShmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGZ1bmN0aW9uKS5OYW1lZCgiZnVuY3Rpb24iKS5Jc05vdE51bGwoKTsKKyAgICAgICAgICAgIGlmICghKGZ1bmN0aW9uIGlzIElmKSkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJmdW5jdGlvbiBtdXN0IGJlIG9mIHR5cGUgSWYiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGNoaWxkcmVuLkNvdW50KCkgPCAzKSB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PigpOworICAgICAgICAgICAgRnVuY3Rpb24uQmVmb3JlSW52b2tlKGNvbnRleHQpOworICAgICAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBjaGlsZHJlbi5FbGVtZW50QXQoMCk7CisgICAgICAgICAgICB2YXIgdiA9IGZpcnN0Q2hpbGQuQ29tcGlsZSgpLlJlc3VsdDsKKworICAgICAgICAgICAgLyoqKiogIEhhbmRsZSBuYW1lcyBhbmQgcmFuZ2VzICoqKiovCisgICAgICAgICAgICBpZiAodiBpcyBFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdiA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKXYpLlZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodiBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByPSgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyl2KTsKKyAgICAgICAgICAgICAgICBpZihyLkdldE5DZWxscygpPjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIkxvZ2ljYWwgY2FuJ3QgYmUgbW9yZSB0aGFuIG9uZSBjZWxsIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ID0gci5HZXRPZmZzZXQoMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIGJvb2xWYWw7CisgICAgICAgICAgICBpZih2IGlzIGJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbFZhbCA9IChib29sKXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoT2ZmaWNlT3BlblhtbC5VdGlscy5Db252ZXJ0VXRpbC5Jc051bWVyaWModikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sVmFsID0gT2ZmaWNlT3BlblhtbC5VdGlscy5Db252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZSh2KSE9MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBsb2dpY2FsIHRlc3QiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqKiogIEVuZCBIYW5kbGUgbmFtZXMgYW5kIHJhbmdlcyAqKioqLworICAgICAgICAgICAgCisgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChib29sVmFsKSk7CisgICAgICAgICAgICBpZiAoYm9vbFZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gY2hpbGRyZW4uRWxlbWVudEF0KDEpLkNvbXBpbGUoKS5SZXN1bHQ7CisgICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsKSk7CisgICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQobnVsbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2YWwgPSBjaGlsZHJlbi5FbGVtZW50QXQoMikuQ29tcGlsZSgpLlJlc3VsdDsKKyAgICAgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChudWxsKSk7CisgICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvSWZOYUZ1bmN0aW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmTmFGdW5jdGlvbkNvbXBpbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTZhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmTmFGdW5jdGlvbkNvbXBpbGVyLmNzCkBAIC0wLDAgKzEsNDYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSWZOYUZ1bmN0aW9uQ29tcGlsZXIgOiBGdW5jdGlvbkNvbXBpbGVyCisgICAgeworICAgICAgICBwdWJsaWMgSWZOYUZ1bmN0aW9uQ29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgICAgIDpiYXNlKGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5Db3VudCgpICE9IDIpIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuLkZpcnN0KCk7CisgICAgICAgICAgICB2YXIgbGFzdENoaWxkID0gY2hpbGRyZW4uRWxlbWVudEF0KDEpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZpcnN0Q2hpbGQuQ29tcGlsZSgpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuRGF0YVR5cGUgPT0gRGF0YVR5cGUuRXhjZWxFcnJvciAmJiAoRXF1YWxzKHJlc3VsdC5SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KGxhc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHJlc3VsdC5SZXN1bHQpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQobGFzdENoaWxkLkNvbXBpbGUoKS5SZXN1bHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5FeGVjdXRlKGFyZ3MsIGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9Mb29rdXBGdW5jdGlvbkNvbXBpbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9Mb29rdXBGdW5jdGlvbkNvbXBpbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDA1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0xvb2t1cEZ1bmN0aW9uQ29tcGlsZXIuY3MKQEAgLTAsMCArMSw2OCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgTG9va3VwRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBMb29rdXBGdW5jdGlvbkNvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgICAgICAgICA6IGJhc2UoZnVuY3Rpb24pCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZShJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBjaGlsZHJlbiwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PigpOworICAgICAgICAgICAgRnVuY3Rpb24uQmVmb3JlSW52b2tlKGNvbnRleHQpOworICAgICAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNoaWxkIGluIGNoaWxkcmVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3RDaGlsZCB8fCBGdW5jdGlvbi5Ta2lwQXJndW1lbnRFdmFsdWF0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuUGFyZW50SXNMb29rdXBGdW5jdGlvbiA9IEZ1bmN0aW9uLklzTG9va3VwRnVjdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGlsZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgYXJnID0gY2hpbGQuQ29tcGlsZSgpOworICAgICAgICAgICAgICAgIEJ1aWxkRnVuY3Rpb25Bcmd1bWVudHMoYXJnICE9IG51bGwgPyBhcmcuUmVzdWx0IDogbnVsbCwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25FeHByZXNzaW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkV4cHJlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxOTNjYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25FeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsMTM0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRXhwcmVzc2lvbiB0aGF0IGhhbmRsZXMgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25FeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5zaG91bGQgYmUgdGhlIG9mIHRoZSBmdW5jdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFyc2luZ0NvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNOZWdhdGVkIj5UcnVlIGlmIHRoZSBudW1lcmljIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIG5lZ2F0ZWQuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEZ1bmN0aW9uRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbiwgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQsIGJvb2wgaXNOZWdhdGVkKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IHBhcnNpbmdDb250ZXh0OworICAgICAgICAgICAgX2Z1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KHBhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIF9pc05lZ2F0ZWQgPSBpc05lZ2F0ZWQ7CisgICAgICAgICAgICBiYXNlLkFkZENoaWxkKG5ldyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbih0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeSBfZnVuY3Rpb25Db21waWxlckZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNOZWdhdGVkOworCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5HZXRGdW5jdGlvbihFeHByZXNzaW9uU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2coX3BhcnNpbmdDb250ZXh0LCBzdHJpbmcuRm9ybWF0KCInezB9JyBpcyBub3QgYSBzdXBwb3J0ZWQgZnVuY3Rpb24iLCBFeHByZXNzaW9uU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OYW1lKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nRnVuY3Rpb24oRXhwcmVzc2lvblN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciBjb21waWxlciA9IF9mdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5DcmVhdGUoZnVuY3Rpb24pOworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb21waWxlci5Db21waWxlKEhhc0NoaWxkcmVuID8gQ2hpbGRyZW4gOiBFbnVtZXJhYmxlLkVtcHR5PEV4cHJlc3Npb24+KCksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKF9pc05lZ2F0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5Jc051bWVyaWMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0cmluZy5Gb3JtYXQoIlRyeWluZyB0byBuZWdhdGUgYSBub24tbnVtZXJpYyB2YWx1ZSAoezB9KSBpbiBmdW5jdGlvbiAnezF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5SZXN1bHQsIEV4cHJlc3Npb25TdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2coX3BhcnNpbmdDb250ZXh0LCBtc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQuUmVzdWx0TnVtZXJpYyAqIC0xLCByZXN1bHQuRGF0YVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nKF9wYXJzaW5nQ29udGV4dCwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlLkVycm9yVmFsdWUsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBQcmVwYXJlRm9yTmV4dENoaWxkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJhc2UuQWRkQ2hpbGQobmV3IEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKHRoaXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhc0NoaWxkcmVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoQ2hpbGRyZW4uQW55KCkgJiYgQ2hpbGRyZW4uRmlyc3QoKS5DaGlsZHJlbi5BbnkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBBZGRDaGlsZChFeHByZXNzaW9uIGNoaWxkKQorICAgICAgICB7CisgICAgICAgICAgICBDaGlsZHJlbi5MYXN0KCkuQWRkQ2hpbGQoY2hpbGQpOworICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Hcm91cEV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0dyb3VwRXhwcmVzc2lvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQxMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Hcm91cEV4cHJlc3Npb24uY3MKQEAgLTAsMCArMSw3MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIEdyb3VwRXhwcmVzc2lvbiA6IEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBHcm91cEV4cHJlc3Npb24oYm9vbCBpc05lZ2F0ZWQpCisgICAgICAgICAgICA6IHRoaXMoaXNOZWdhdGVkLCBuZXcgRXhwcmVzc2lvbkNvbXBpbGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEdyb3VwRXhwcmVzc2lvbihib29sIGlzTmVnYXRlZCwgSUV4cHJlc3Npb25Db21waWxlciBleHByZXNzaW9uQ29tcGlsZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leHByZXNzaW9uQ29tcGlsZXIgPSBleHByZXNzaW9uQ29tcGlsZXI7CisgICAgICAgICAgICBfaXNOZWdhdGVkID0gaXNOZWdhdGVkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRXhwcmVzc2lvbkNvbXBpbGVyIF9leHByZXNzaW9uQ29tcGlsZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNOZWdhdGVkOworCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAgX2V4cHJlc3Npb25Db21waWxlci5Db21waWxlKENoaWxkcmVuKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuSXNOdW1lcmljICYmIF9pc05lZ2F0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdC5SZXN1bHROdW1lcmljICogLTEsIHJlc3VsdC5EYXRhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkNvbXBpbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkNvbXBpbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjM5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uQ29tcGlsZXIuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkNvbXBpbGVyCisgICAgeworICAgICAgICBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25Db252ZXJ0ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uQ29udmVydGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MGRmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uQ29udmVydGVyLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb25Db252ZXJ0ZXIKKyAgICB7CisgICAgICAgIFN0cmluZ0V4cHJlc3Npb24gVG9TdHJpbmdFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisgICAgICAgIEV4cHJlc3Npb24gRnJvbUNvbXBpbGVSZXN1bHQoQ29tcGlsZVJlc3VsdCBjb21waWxlUmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25GYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NGIxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uRmFjdG9yeS5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb25GYWN0b3J5CisgICAgeworICAgICAgICBFeHByZXNzaW9uIENyZWF0ZShUb2tlbiB0b2tlbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5ZTEyMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElFeHByZXNzaW9uR3JhcGhCdWlsZGVyCisgICAgeworICAgICAgICBFeHByZXNzaW9uR3JhcGggQnVpbGQoSUVudW1lcmFibGU8VG9rZW4+IHRva2Vucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JbnRlZ2VyRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSW50ZWdlckV4cHJlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3ODY2MAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSW50ZWdlckV4cHJlc3Npb24uY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBwdWJsaWMgY2xhc3MgSW50ZWdlckV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvdWJsZT8gX2NvbXBpbGVkVmFsdWU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfbmVnYXRlOworCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbikKKyAgICAgICAgICAgIDogdGhpcyhleHByZXNzaW9uLCBmYWxzZSkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlckV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIGJvb2wgbmVnYXRlKQorICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9uZWdhdGUgPSBuZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlckV4cHJlc3Npb24oZG91YmxlIHZhbCkKKyAgICAgICAgICAgIDogYmFzZSh2YWwuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb21waWxlZFZhbHVlID0gTWF0aC5GbG9vcih2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSBfY29tcGlsZWRWYWx1ZS5IYXNWYWx1ZSA/IF9jb21waWxlZFZhbHVlLlZhbHVlIDogZG91YmxlLlBhcnNlKEV4cHJlc3Npb25TdHJpbmcsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgcmVzdWx0ID0gX25lZ2F0ZSA/IHJlc3VsdCotMSA6IHJlc3VsdDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9OYW1lZFZhbHVlRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvTmFtZWRWYWx1ZUV4cHJlc3Npb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NGJjOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvTmFtZWRWYWx1ZUV4cHJlc3Npb24uY3MKQEAgLTAsMCArMSw5MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgcHVibGljIGNsYXNzIE5hbWVkVmFsdWVFeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgcHVibGljIE5hbWVkVmFsdWVFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBwYXJzaW5nQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYyA9IHRoaXMuX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5DdXJyZW50OworICAgICAgICAgICAgdmFyIG5hbWUgPSBfcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIuR2V0TmFtZShjLkFkZHJlc3MuV29ya3NoZWV0LCBFeHByZXNzaW9uU3RyaW5nKTsKKyAgICAgICAgICAgIC8vdmFyIHJlc3VsdCA9IF9wYXJzaW5nQ29udGV4dC5QYXJzZXIuUGFyc2UodmFsdWUuVG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb25zLkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmFtZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lLlZhbHVlPT1udWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5hbWUuVmFsdWUgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSAoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyluYW1lLlZhbHVlOworICAgICAgICAgICAgICAgIGlmIChyYW5nZS5Jc011bHRpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG5hbWUuVmFsdWUsIERhdGFUeXBlLkVudW1lcmFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuSXNFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuQ3JlYXRlKHJhbmdlLkZpcnN0KCkuVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5DcmVhdGUobmFtZS5WYWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvL3JldHVybiBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKS5DcmVhdGUocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvU3RyaW5nRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvU3RyaW5nRXhwcmVzc2lvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg5NWNiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9TdHJpbmdFeHByZXNzaW9uLmNzCkBAIC0wLDAgKzEsNTEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIHB1YmxpYyBjbGFzcyBTdHJpbmdFeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgcHVibGljIFN0cmluZ0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICAgICAgICA6IGJhc2UoZXhwcmVzc2lvbikKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4cHJlc3Npb25TdHJpbmcsIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZGQ2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlci5jcwpAQCAtMCwwICsxLDIzNCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5Mb2dnaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCit7CisgICAgcHVibGljIGNsYXNzIEZvcm11bGFQYXJzZXIgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworCisgICAgICAgIHB1YmxpYyBGb3JtdWxhUGFyc2VyKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyKQorICAgICAgICAgICAgOiB0aGlzKGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGb3JtdWxhUGFyc2VyKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuUGFyc2VyID0gdGhpczsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5OYW1lVmFsdWVQcm92aWRlciA9IG5ldyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlcihleGNlbERhdGFQcm92aWRlcik7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoZXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKKyAgICAgICAgICAgIENvbmZpZ3VyZShjb25maWd1cmF0aW9uID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAuU2V0TGV4ZXIobmV3IExleGVyKF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgX3BhcnNpbmdDb250ZXh0Lk5hbWVWYWx1ZVByb3ZpZGVyKSkKKyAgICAgICAgICAgICAgICAgICAgLlNldEdyYXBoQnVpbGRlcihuZXcgRXhwcmVzc2lvbkdyYXBoQnVpbGRlcihleGNlbERhdGFQcm92aWRlciwgX3BhcnNpbmdDb250ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgLlNldEV4cHJlc2lvbkNvbXBpbGVyKG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgLkZ1bmN0aW9uUmVwb3NpdG9yeS5Mb2FkTW9kdWxlKG5ldyBCdWlsdEluRnVuY3Rpb25zKCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDb25maWd1cmUoQWN0aW9uPFBhcnNpbmdDb25maWd1cmF0aW9uPiBjb25maWdNZXRob2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbmZpZ01ldGhvZC5JbnZva2UoX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgX2xleGVyID0gX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTGV4ZXIgPz8gX2xleGVyOworICAgICAgICAgICAgX2dyYXBoQnVpbGRlciA9IF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkdyYXBoQnVpbGRlciA/PyBfZ3JhcGhCdWlsZGVyOworICAgICAgICAgICAgX2NvbXBpbGVyID0gX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uRXhwcmVzc2lvbkNvbXBpbGVyID8/IF9jb21waWxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSUxleGVyIF9sZXhlcjsKKyAgICAgICAgcHJpdmF0ZSBJRXhwcmVzc2lvbkdyYXBoQnVpbGRlciBfZ3JhcGhCdWlsZGVyOworICAgICAgICBwcml2YXRlIElFeHByZXNzaW9uQ29tcGlsZXIgX2NvbXBpbGVyOworCisgICAgICAgIHB1YmxpYyBJTGV4ZXIgTGV4ZXIgeyBnZXQgeyByZXR1cm4gX2xleGVyOyB9IH0KKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPHN0cmluZz4gRnVuY3Rpb25OYW1lcyB7IGdldCB7IHJldHVybiBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnkuRnVuY3Rpb25OYW1lczsgfSB9IAorCisgICAgICAgIGludGVybmFsIHZpcnR1YWwgb2JqZWN0IFBhcnNlKHN0cmluZyBmb3JtdWxhLCBSYW5nZUFkZHJlc3MgcmFuZ2VBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShyYW5nZUFkZHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfbGV4ZXIuVG9rZW5pemUoZm9ybXVsYSk7CisgICAgICAgICAgICAgICAgdmFyIGdyYXBoID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworICAgICAgICAgICAgICAgIGlmIChncmFwaC5FeHByZXNzaW9ucy5Db3VudCgpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlci5Db21waWxlKGdyYXBoLkV4cHJlc3Npb25zKS5SZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIG9iamVjdCBQYXJzZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zLCBzdHJpbmcgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzcyA9IF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc2NvcGUgPSBfcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKHJhbmdlQWRkcmVzcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGdyYXBoID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworICAgICAgICAgICAgICAgIGlmIChncmFwaC5FeHByZXNzaW9ucy5Db3VudCgpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlci5Db21waWxlKGdyYXBoLkV4cHJlc3Npb25zKS5SZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdmlydHVhbCBvYmplY3QgUGFyc2VDZWxsKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB3b3Jrc2hlZXQsIGludCByb3csIGludCBjb2x1bW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUod29ya3NoZWV0LCBjb2x1bW4sIHJvdyk7CisgICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShyYW5nZUFkZHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIF9wYXJzaW5nQ29udGV4dC5EZXBlbmRlbmNpZXMuQWRkRm9ybXVsYVNjb3BlKHNjb3BlKTsKKyAgICAgICAgICAgICAgICB2YXIgZ3JhcGggPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisgICAgICAgICAgICAgICAgaWYgKGdyYXBoLkV4cHJlc3Npb25zLkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IF9jb21waWxlci5Db21waWxlKGdyYXBoLkV4cHJlc3Npb25zKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcXVpY2sgc29sdXRpb24gZm9yIHRoZSBmYWN0IHRoYXQgYW4gZXhjZWxyYW5nZSBjYW4gYmUgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgICAgIHZhciByYW5nZUluZm8gPSBjb21waWxlUmVzdWx0LlJlc3VsdCBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOworICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VJbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCA/PyAwZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUluZm8uSXNFbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMGQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlSW5mby5Jc011bHRpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZUluZm8uRmlyc3QoKS5WYWx1ZSA/PyAwZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rIHRvIHJldHVybiBtdWx0aWNlbGwgaWYgaXQgaXMgYSB3b3JrYm9vayBzY29wZWQgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh3b3Jrc2hlZXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhcnNpbmdDb250ZXh0LkRlYnVnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtc2cgPSBzdHJpbmcuRm9ybWF0KCJBIHJhbmdlIHdpdGggbXVsdGlwbGUgY2VsbCB3YXMgcmV0dXJuZWQgYXQgcm93IHswfSwgY29sdW1uIHsxfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nKF9wYXJzaW5nQ29udGV4dCwgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2coX3BhcnNpbmdDb250ZXh0LCBleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4LkVycm9yVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFBhcnNlKHN0cmluZyBmb3JtdWxhLCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhcnNlKGZvcm11bGEsIF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZShzdHJpbmcgZm9ybXVsYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhcnNlKGZvcm11bGEsIFJhbmdlQWRkcmVzcy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2VBdChzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGFkZHJlc3MpLk5hbWVkKCJhZGRyZXNzIikuSXNOb3ROdWxsT3JFbXB0eSgpOworICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzcyA9IF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKTsKKyAgICAgICAgICAgIHJldHVybiBQYXJzZUF0KHJhbmdlQWRkcmVzcy5Xb3Jrc2hlZXQsIHJhbmdlQWRkcmVzcy5Gcm9tUm93LCByYW5nZUFkZHJlc3MuRnJvbUNvbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2VBdChzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGYgPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0UmFuZ2VGb3JtdWxhKHdvcmtzaGVldE5hbWUsIHJvdywgY29sKTsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShmKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlVmFsdWUod29ya3NoZWV0TmFtZSwgcm93LCBjb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZShmLCBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUod29ya3NoZWV0TmFtZSxjb2wscm93KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3ZhciBkYXRhSXRlbSA9IF9leGNlbERhdGFQcm92aWRlci5HZXRSYW5nZVZhbHVlcyhhZGRyZXNzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgLy9pZiAoZGF0YUl0ZW0gPT0gbnVsbCAvKnx8IChkYXRhSXRlbS5WYWx1ZSA9PSBudWxsICYmIGRhdGFJdGVtLkZvcm11bGEgPT0gbnVsbCkqLykgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAvL2lmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0YUl0ZW0uRm9ybXVsYSkpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiBQYXJzZShkYXRhSXRlbS5Gb3JtdWxhLCBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoYWRkcmVzcykpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL3JldHVybiBQYXJzZShkYXRhSXRlbS5WYWx1ZS5Ub1N0cmluZygpLCBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoYWRkcmVzcykpOworICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCB2b2lkIEluaXROZXdDYWxjKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoX2V4Y2VsRGF0YVByb3ZpZGVyIT1udWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5SZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElGb3JtdWxhUGFyc2VyTG9nZ2VyIExvZ2dlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wYXJzaW5nQ29udGV4dC5EZWJ1ZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJNYW5hZ2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJNYW5hZ2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzdiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlck1hbmFnZXIuY3MKQEAgLTAsMCArMSwxMjYgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTG9nZ2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB2YXJpb3VzIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIAorICAgIC8vLyBleGNlbCBmb3JtdWxhIGV2YWx1YXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRm9ybXVsYVBhcnNlck1hbmFnZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRm9ybXVsYVBhcnNlciBfcGFyc2VyOworCisgICAgICAgIGludGVybmFsIEZvcm11bGFQYXJzZXJNYW5hZ2VyKEZvcm11bGFQYXJzZXIgcGFyc2VyKQorICAgICAgICB7CisgICAgICAgICAgICBSZXF1aXJlLlRoYXQocGFyc2VyKS5OYW1lZCgicGFyc2VyIikuSXNOb3ROdWxsKCk7CisgICAgICAgICAgICBfcGFyc2VyID0gcGFyc2VyOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9hZHMgYSBtb2R1bGUgY29udGFpbmluZyBjdXN0b20gZnVuY3Rpb25zIHRvIHRoZSBmb3JtdWxhIHBhcnNlci4gQnkgdXNpbmcKKyAgICAgICAgLy8vIHRoaXMgbWV0aG9kIHlvdSBjYW4gYWRkIHlvdXIgb3duIGltcGxlbWVudGF0aW9ucyBvZiBFeGNlbCBmdW5jdGlvbnMsIGJ5CisgICAgICAgIC8vLyBpbXBsZW1lbnRpbmcgYSA8c2VlIGNyZWY9IklGdW5jdGlvbk1vZHVsZSIvPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2R1bGUiPkEgPHNlZSBjcmVmPSJJRnVuY3Rpb25Nb2R1bGUiLz4gY29udGFpbmluZyA8c2VlIGNyZWY9IkV4Y2VsRnVuY3Rpb24iLz5zLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRGdW5jdGlvbk1vZHVsZShJRnVuY3Rpb25Nb2R1bGUgbW9kdWxlKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZSh4ID0+IHguRnVuY3Rpb25SZXBvc2l0b3J5LkxvYWRNb2R1bGUobW9kdWxlKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImZ1bmN0aW9uTmFtZSIvPiBkb2VzIG5vdCBleGlzdCwgdGhlIHN1cHBsaWVkCisgICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZnVuY3Rpb25JbXBsIi8+IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZvcm11bGEgcGFyc2VyLgorICAgICAgICAvLy8gSWYgaXQgZXhpc3RzLCB0aGUgZXhpc3RpbmcgZnVuY3Rpb24gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImZ1bmN0aW9uSW1wbCI+ZnVuY3Rpb24gaW1wbGVtZW50YXRpb248L3BhcmFtcmVmPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmN0aW9uTmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmdW5jdGlvbkltcGwiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZE9yUmVwbGFjZUZ1bmN0aW9uKHN0cmluZyBmdW5jdGlvbk5hbWUsIEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb25JbXBsKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZSh4ID0+IHguRnVuY3Rpb25SZXBvc2l0b3J5LkFkZE9yUmVwbGFjZUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb25JbXBsKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQsIGJvdGggdGhlIGJ1aWx0IGluIGZ1bmN0aW9ucworICAgICAgICAvLy8gYW5kIGZ1bmN0aW9ucyBhZGRlZCB1c2luZyB0aGUgTG9hZEZ1bmN0aW9uTW9kdWxlIG1ldGhvZCBvZiB0aGlzIGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+RnVuY3Rpb24gbmFtZXMgaW4gbG93ZXIgY2FzZTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPHN0cmluZz4gR2V0SW1wbGVtZW50ZWRGdW5jdGlvbk5hbWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZuTGlzdCA9IF9wYXJzZXIuRnVuY3Rpb25OYW1lcy5Ub0xpc3QoKTsKKyAgICAgICAgICAgIGZuTGlzdC5Tb3J0KCh4LCB5KSA9PiBTdHJpbmcuQ29tcGFyZSh4LCB5LCBTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKSk7CisgICAgICAgICAgICByZXR1cm4gZm5MaXN0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGFyc2VzIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iZm9ybXVsYSIvPiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvYmplY3QgUGFyc2Uoc3RyaW5nIGZvcm11bGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfcGFyc2VyLlBhcnNlKGZvcm11bGEpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQXR0YWNoZXMgYSBsb2dnZXIgdG8gdGhlIDxzZWUgY3JlZj0iRm9ybXVsYVBhcnNlciIvPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2dnZXIiPkFuIGluc3RhbmNlIG9mIDxzZWUgY3JlZj0iSUZvcm11bGFQYXJzZXJMb2dnZXIiLz48L3BhcmFtPgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxvZ2dpbmcuTG9nZ2VyRmFjdG9yeSIvPgorICAgICAgICBwdWJsaWMgdm9pZCBBdHRhY2hMb2dnZXIoSUZvcm11bGFQYXJzZXJMb2dnZXIgbG9nZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZShjID0+IGMuQXR0YWNoTG9nZ2VyKGxvZ2dlcikpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQXR0YWNoZXMgYSBsb2dnZXIgdG8gdGhlIGZvcm11bGEgcGFyc2VyIHRoYXQgcHJvZHVjZXMgb3V0cHV0IHRvIHRoZSBzdXBwbGllZCBsb2dmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvZ2ZpbGUiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEF0dGFjaExvZ2dlcihGaWxlSW5mbyBsb2dmaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZShjID0+IGMuQXR0YWNoTG9nZ2VyKExvZ2dlckZhY3RvcnkuQ3JlYXRlVGV4dEZpbGVMb2dnZXIobG9nZmlsZSkpKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZXRhY2hlcyBhbnkgYXR0YWNoZWQgbG9nZ2VyIGZyb20gdGhlIGZvcm11bGEgcGFyc2VyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBEZXRhY2hMb2dnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZShjID0+IGMuRGV0YWNoTG9nZ2VyKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0lOYW1lVmFsdWVQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JTmFtZVZhbHVlUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzYmYwZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JTmFtZVZhbHVlUHJvdmlkZXIuY3MKQEAgLTAsMCArMSwxNiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIHB1YmxpYyBpbnRlcmZhY2UgSU5hbWVWYWx1ZVByb3ZpZGVyCisgICAgeworICAgICAgICBib29sIElzTmFtZWRWYWx1ZShzdHJpbmcga2V5LCBzdHJpbmcgd29ya3NoZWV0KTsKKworICAgICAgICBvYmplY3QgR2V0TmFtZWRWYWx1ZShzdHJpbmcga2V5KTsKKworICAgICAgICB2b2lkIFJlbG9hZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0lQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2ZDMxYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMTIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIHZvaWQgUGFyc2luZ0NvbXBsZXRlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSUxleGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JTGV4ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzZmFiNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSUxleGVyLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUxleGVyCisgICAgeworICAgICAgICBJRW51bWVyYWJsZTxUb2tlbj4gVG9rZW5pemUoc3RyaW5nIGlucHV0KTsKKyAgICAgICAgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCwgc3RyaW5nIHdvcmtzaGVldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JU291cmNlQ29kZVRva2VuaXplci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVNvdXJjZUNvZGVUb2tlbml6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2YWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVNvdXJjZUNvZGVUb2tlbml6ZXIuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgcHVibGljIGludGVyZmFjZSBJU291cmNlQ29kZVRva2VuaXplcgorICAgIHsKKyAgICAgICAgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCwgc3RyaW5nIHdvcmtzaGVldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JU3ludGFjdGljQW5hbHl6ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lTeW50YWN0aWNBbmFseXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWUxYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JU3ludGFjdGljQW5hbHl6ZXIuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgcHVibGljIGludGVyZmFjZSBJU3ludGFjdGljQW5hbHl6ZXIKKyAgICB7CisgICAgICAgIHZvaWQgQW5hbHl6ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlbkZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlbkZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzMGZmZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuRmFjdG9yeS5jcwpAQCAtMCwwICsxLDQ0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUb2tlbkZhY3RvcnkKKyAgICB7CisgICAgICAgIFRva2VuIENyZWF0ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zLCBzdHJpbmcgdG9rZW4pOworICAgICAgICBUb2tlbiBDcmVhdGUoSUVudW1lcmFibGU8VG9rZW4+IHRva2Vucywgc3RyaW5nIHRva2VuLCBzdHJpbmcgd29ya3NoZWV0KTsKKyAgICAgICAgVG9rZW4gQ3JlYXRlKHN0cmluZyB0b2tlbiwgVG9rZW5UeXBlIGV4cGxpY2l0VG9rZW5UeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlbkluZGV4UHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlbkluZGV4UHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3ZjZjNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuSW5kZXhQcm92aWRlci5jcwpAQCAtMCwwICsxLDE0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRva2VuSW5kZXhQcm92aWRlcgorICAgIHsKKyAgICAgICAgaW50IEluZGV4IHsgZ2V0OyAgfQorCisgICAgICAgIHZvaWQgTW92ZUluZGV4UG9pbnRlckZvcndhcmQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlblNlcGFyYXRvclByb3ZpZGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM2MTBiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcwpAQCAtMCwwICsxLDQ3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUb2tlblNlcGFyYXRvclByb3ZpZGVyCisgICAgeworICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIFRva2VuPiBUb2tlbnMgeyBnZXQ7IH0KKworICAgICAgICBib29sIElzT3BlcmF0b3Ioc3RyaW5nIGl0ZW0pOworCisgICAgICAgIGJvb2wgSXNQb3NzaWJsZUxhc3RQYXJ0T2ZNdWx0aXBsZUNoYXJPcGVyYXRvcihzdHJpbmcgcGFydCk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0xleGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9MZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzVlYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9MZXhlci5jcwpAQCAtMCwwICsxLDY4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CisvL3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgTGV4ZXIgOiBJTGV4ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBMZXhlcihGdW5jdGlvblJlcG9zaXRvcnkgZnVuY3Rpb25SZXBvc2l0b3J5LCBJTmFtZVZhbHVlUHJvdmlkZXIgbmFtZVZhbHVlUHJvdmlkZXIpCisgICAgICAgICAgICA6dGhpcyhuZXcgU291cmNlQ29kZVRva2VuaXplcihmdW5jdGlvblJlcG9zaXRvcnksIG5hbWVWYWx1ZVByb3ZpZGVyKSwgbmV3IFN5bnRhY3RpY0FuYWx5emVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExleGVyKElTb3VyY2VDb2RlVG9rZW5pemVyIHRva2VuaXplciwgSVN5bnRhY3RpY0FuYWx5emVyIGFuYWx5emVyKQorICAgICAgICB7CisgICAgICAgICAgICBfdG9rZW5pemVyID0gdG9rZW5pemVyOworICAgICAgICAgICAgX2FuYWx5emVyID0gYW5hbHl6ZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElTb3VyY2VDb2RlVG9rZW5pemVyIF90b2tlbml6ZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVN5bnRhY3RpY0FuYWx5emVyIF9hbmFseXplcjsKKworICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRva2VuaXplKGlucHV0LCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCwgc3RyaW5nIHdvcmtzaGVldCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQsIHdvcmtzaGVldCk7CisgICAgICAgICAgICBfYW5hbHl6ZXIuQW5hbHl6ZSh0b2tlbnMpOworICAgICAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU291cmNlQ29kZVRva2VuaXplci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU291cmNlQ29kZVRva2VuaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI5ZTljCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Tb3VyY2VDb2RlVG9rZW5pemVyLmNzCkBAIC0wLDAgKzEsMzI1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIHB1YmxpYyBjbGFzcyBTb3VyY2VDb2RlVG9rZW5pemVyIDogSVNvdXJjZUNvZGVUb2tlbml6ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSVNvdXJjZUNvZGVUb2tlbml6ZXIgRGVmYXVsdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoRnVuY3Rpb25OYW1lUHJvdmlkZXIuRW1wdHksIE5hbWVWYWx1ZVByb3ZpZGVyLkVtcHR5KTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNvdXJjZUNvZGVUb2tlbml6ZXIoSUZ1bmN0aW9uTmFtZVByb3ZpZGVyIGZ1bmN0aW9uUmVwb3NpdG9yeSwgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUb2tlbkZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5LCBuYW1lVmFsdWVQcm92aWRlciksIG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTb3VyY2VDb2RlVG9rZW5pemVyKElUb2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5LCBJVG9rZW5TZXBhcmF0b3JQcm92aWRlciB0b2tlblByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBfdG9rZW5GYWN0b3J5ID0gdG9rZW5GYWN0b3J5OworICAgICAgICAgICAgX3Rva2VuUHJvdmlkZXIgPSB0b2tlblByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJVG9rZW5TZXBhcmF0b3JQcm92aWRlciBfdG9rZW5Qcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJVG9rZW5GYWN0b3J5IF90b2tlbkZhY3Rvcnk7CisKKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbml6ZShzdHJpbmcgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUb2tlbml6ZShpbnB1dCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbml6ZShzdHJpbmcgaW5wdXQsIHN0cmluZyB3b3Jrc2hlZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShpbnB1dCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNQSAxNDAxOiBJZ25vcmUgbGVhZGluZyBwbHVzIGluIGZvcm11bGEuCisgICAgICAgICAgICBpbnB1dCA9IGlucHV0LlRyaW1TdGFydCgnKycpOworICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgVG9rZW5pemVyQ29udGV4dChpbnB1dCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTxjb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGg7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjID0gY29udGV4dC5Gb3JtdWxhQ2hhcnNbaV07CisgICAgICAgICAgICAgICAgVG9rZW4gdG9rZW5TZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgaWYgKENoYXJJc1Rva2VuU2VwYXJhdG9yKGMsIG91dCB0b2tlblNlcGFyYXRvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5Jc0luU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNEb3VibGVRdW90ZSh0b2tlblNlcGFyYXRvciwgaSwgY29udGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlICE9IFRva2VuVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nQnJhY2tldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQnJhY2tldENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nQnJhY2tldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQnJhY2tldENvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5CcmFja2V0Q291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gdHdvIG9wZXJhdG9ycyBpbiBzZXF1ZW5jZSBjb3VsZCBiZSAiPD0iIG9yICI+PSIKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzUGFydE9mTXVsdGlwbGVDaGFyU2VwYXJhdG9yKGNvbnRleHQsIGMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc09wID0gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgKyBjLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wID0gX3Rva2VuUHJvdmlkZXIuVG9rZW5zW3NPcF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LlJlcGxhY2VMYXN0VG9rZW4ob3ApOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5MYXN0VG9rZW4gIT0gbnVsbCAmJiBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdFbnVtZXJhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5MYXN0VG9rZW4gIT0gbnVsbCAmJiBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKCFjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFRva2VuKHN0cmluZy5FbXB0eSwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFRva2VuKGNvbnRleHQuQ3VycmVudFRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BZGRUb2tlbihuZXcgVG9rZW4oIlwiIiwgVG9rZW5UeXBlLlN0cmluZykpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lk5ld1Rva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goY29udGV4dC5DdXJyZW50VG9rZW4sICJeXCIqJCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4oX3Rva2VuRmFjdG9yeS5DcmVhdGUoY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BZGRUb2tlbihDcmVhdGVUb2tlbihjb250ZXh0LCB3b3Jrc2hlZXQpKTsgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIGEgbmV4dCB0b2tlbiBpcyBhbiBvcGVuaW5nIHBhcmFudGhlc2VzIGFuZCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgaW50ZXJwZXRlZCBhcyBhbiBhZGRyZXNzIG9yIG5hbWUsIHRoZW4gdGhlIGN1cnJlbmN0IHRva2VuIGlzIGEgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZT09VG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyAmJiAoY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlPT1Ub2tlblR5cGUuRXhjZWxBZGRyZXNzIHx8IGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZT09VG9rZW5UeXBlLk5hbWVWYWx1ZSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZT1Ub2tlblR5cGUuRnVuY3Rpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlZhbHVlID09ICItIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRva2VuSXNOZWdhdG9yKGNvbnRleHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKHRva2VuU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4oQ3JlYXRlVG9rZW4oY29udGV4dCwgd29ya3NoZWV0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsZWFudXBUb2tlbnMoY29udGV4dCwgX3Rva2VuUHJvdmlkZXIuVG9rZW5zKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0RvdWJsZVF1b3RlKFRva2VuIHRva2VuU2VwYXJhdG9yLCBpbnQgZm9ybXVsYUNoYXJJbmRleCwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcgJiYgZm9ybXVsYUNoYXJJbmRleCArIDEgPCBjb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGggJiYgY29udGV4dC5Gb3JtdWxhQ2hhcnNbZm9ybXVsYUNoYXJJbmRleCArIDFdID09ICdcIic7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2xlYW51cFRva2VucyhUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElEaWN0aW9uYXJ5PHN0cmluZywgVG9rZW4+ICB0b2tlbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dC5SZXN1bHQuQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW49Y29udGV4dC5SZXN1bHRbaV07CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuVW5yZWNvZ25pemVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBjb250ZXh0LlJlc3VsdC5Db3VudCAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LlJlc3VsdFtpKzFdLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLlRva2VuVHlwZSA9IFRva2VuVHlwZS5GdW5jdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuTmFtZVZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uVG9rZW5UeXBlID0gVG9rZW5UeXBlLk5hbWVWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvciB8fCB0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk5lZ2F0b3IpICYmIGkgPCBjb250ZXh0LlJlc3VsdC5Db3VudCAtIDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAodG9rZW4uVmFsdWU9PSIrIiB8fCB0b2tlbi5WYWx1ZT09Ii0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiB0b2tlbi5WYWx1ZSA9PSAiKyIpICAgIC8vUmVtb3ZlIGFueSArIHdpdGggYW4gb3BlbmluZyBwYXJlbnRoZXNpcyBiZWZvcmUuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LlJlc3VsdFtpIC0gMV0uVG9rZW5UeXBlICA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0LlJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE5lZ2F0b3JPcGVyYXRvcihjb250ZXh0LCBpLCB0b2tlbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VG9rZW4gPSBjb250ZXh0LlJlc3VsdFtpICsgMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvciB8fCBuZXh0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5OZWdhdG9yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uVmFsdWUgPT0gIisiICYmIChuZXh0VG9rZW4uVmFsdWU9PSIrIiB8fCBuZXh0VG9rZW4uVmFsdWUgPT0gIi0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0LlJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE5lZ2F0b3JPcGVyYXRvcihjb250ZXh0LCBpLCB0b2tlbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLlZhbHVlID09ICItIiAmJiBuZXh0VG9rZW4uVmFsdWUgPT0gIisiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0LlJlbW92ZUF0KGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4uVmFsdWUgPT0gIi0iICYmIG5leHRUb2tlbi5WYWx1ZSA9PSAiLSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgZmlyc3QgYW5kIHNldCBvcGVyYXRvciB0byArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0LlJlbW92ZUF0KGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0LlJlc3VsdFtpXS5Ub2tlblR5cGUgPSBUb2tlblR5cGUuT3BlcmF0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29udGV4dC5SZXN1bHRbaV0uVmFsdWUgPSAiKyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0W2ldID0gdG9rZW5zWyIrIl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE5lZ2F0b3JPcGVyYXRvcihjb250ZXh0LCBpLCB0b2tlbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTZXROZWdhdG9yT3BlcmF0b3IoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBpbnQgaSwgSURpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4gIHRva2VucykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbnRleHQuUmVzdWx0W2ldLlZhbHVlID09ICItIiAmJiBpID4gMCAmJiAoY29udGV4dC5SZXN1bHRbaV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvciB8fCBjb250ZXh0LlJlc3VsdFtpXS5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk5lZ2F0b3IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUb2tlbklzTmVnYXRvcihjb250ZXh0LlJlc3VsdFtpIC0gMV0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHRbaV0gPSBuZXcgVG9rZW4oIi0iLCBUb2tlblR5cGUuTmVnYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0W2ldID0gdG9rZW5zWyItIl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBUb2tlbklzTmVnYXRvcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUb2tlbklzTmVnYXRvcihjb250ZXh0Lkxhc3RUb2tlbik7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBUb2tlbklzTmVnYXRvcihUb2tlbiB0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcworICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5Db21tYQorICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TZW1pQ29sb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0VudW1lcmFibGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgSXNQYXJ0T2ZNdWx0aXBsZUNoYXJTZXBhcmF0b3IoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBjaGFyIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsYXN0VG9rZW4gPSBjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsID8gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICByZXR1cm4gX3Rva2VuUHJvdmlkZXIuSXNPcGVyYXRvcihsYXN0VG9rZW4pIAorICAgICAgICAgICAgICAgICYmIF90b2tlblByb3ZpZGVyLklzUG9zc2libGVMYXN0UGFydE9mTXVsdGlwbGVDaGFyT3BlcmF0b3IoYy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkgCisgICAgICAgICAgICAgICAgJiYgIWNvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRva2VuIENyZWF0ZVRva2VuKFRva2VuaXplckNvbnRleHQgY29udGV4dCwgc3RyaW5nIHdvcmtzaGVldCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbnRleHQuQ3VycmVudFRva2VuID09ICItIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5MYXN0VG9rZW4gPT0gbnVsbCAmJiBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5OZWdhdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3Rva2VuRmFjdG9yeS5DcmVhdGUoY29udGV4dC5SZXN1bHQsIGNvbnRleHQuQ3VycmVudFRva2VuLCB3b3Jrc2hlZXQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIENoYXJJc1Rva2VuU2VwYXJhdG9yKGNoYXIgYywgb3V0IFRva2VuIHRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3Rva2VuUHJvdmlkZXIuVG9rZW5zLkNvbnRhaW5zS2V5KGMuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB0b2tlbiA9IHJlc3VsdCA/IHRva2VuID0gX3Rva2VuUHJvdmlkZXIuVG9rZW5zW2MuVG9TdHJpbmcoKV0gOiBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU3ludGFjdGljQW5hbHl6ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1N5bnRhY3RpY0FuYWx5emVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1N5bnRhY3RpY0FuYWx5emVyLmNzCkBAIC0wLDAgKzEsMTAyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgU3ludGFjdGljQW5hbHl6ZXIgOiBJU3ludGFjdGljQW5hbHl6ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgY2xhc3MgQW5hbHl6aW5nQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IE51bWJlck9mT3BlbmVkUGFyZW50aGVzZXMgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGludCBOdW1iZXJPZkNsb3NlZFBhcmVudGhlc2VzIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgT3BlbmVkU3RyaW5ncyB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IENsb3NlZFN0cmluZ3MgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgSXNJblN0cmluZyB7IGdldDsgc2V0OyB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgQW5hbHl6ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBBbmFseXppbmdDb250ZXh0KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdG9rZW4gaW4gdG9rZW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlVucmVjb2duaXplZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbih0b2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVuc3VyZVBhcmVudGhlc2VzQXJlV2VsbEZvcm1lZCh0b2tlbiwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgRW5zdXJlU3RyaW5nc0FyZVdlbGxGb3JtZWQodG9rZW4sIGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmFsaWRhdGUoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFZhbGlkYXRlKEFuYWx5emluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbnRleHQuTnVtYmVyT2ZPcGVuZWRQYXJlbnRoZXNlcyAhPSBjb250ZXh0Lk51bWJlck9mQ2xvc2VkUGFyZW50aGVzZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiTnVtYmVyIG9mIG9wZW5lZCBhbmQgY2xvc2VkIHBhcmVudGhlc2VzIGRvZXMgbm90IG1hdGNoIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udGV4dC5PcGVuZWRTdHJpbmdzICE9IGNvbnRleHQuQ2xvc2VkU3RyaW5ncykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRW5zdXJlUGFyZW50aGVzZXNBcmVXZWxsRm9ybWVkKFRva2VuIHRva2VuLCBBbmFseXppbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0Lk51bWJlck9mT3BlbmVkUGFyZW50aGVzZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuTnVtYmVyT2ZDbG9zZWRQYXJlbnRoZXNlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVN0cmluZ3NBcmVXZWxsRm9ybWVkKFRva2VuIHRva2VuLCBBbmFseXppbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY29udGV4dC5Jc0luU3RyaW5nICYmIHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuSXNJblN0cmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGV4dC5PcGVuZWRTdHJpbmdzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb250ZXh0LklzSW5TdHJpbmcgJiYgdG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5Jc0luU3RyaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGV4dC5DbG9zZWRTdHJpbmdzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGU5Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbi5jcwpAQCAtMCwwICsxLDc1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgVG9rZW4KKyAgICB7CisgICAgICAgIHB1YmxpYyBUb2tlbihzdHJpbmcgdG9rZW4sIFRva2VuVHlwZSB0b2tlblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gdG9rZW47CisgICAgICAgICAgICBUb2tlblR5cGUgPSB0b2tlblR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFZhbHVlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVG9rZW5UeXBlIFRva2VuVHlwZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQXBwZW5kKHN0cmluZyBzdHJpbmdUb0FwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgKz0gc3RyaW5nVG9BcHBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc05lZ2F0ZWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBOZWdhdGUoKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBUb2tlblR5cGUgPT0gVG9rZW5UeXBlLkRlY2ltYWwgCisgICAgICAgICAgICAgICAgfHwgCisgICAgICAgICAgICAgICAgVG9rZW5UeXBlID09IFRva2VuVHlwZS5JbnRlZ2VyCisgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICBUb2tlblR5cGUgPT0gVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJc05lZ2F0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLlRvU3RyaW5nKCkgKyAiLCAiICsgVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5GYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTdkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeS5jcwpAQCAtMCwwICsxLDE2NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKiBKYW4gS8OkbGxtYW4gICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZWQgQWRyZXNzIHZhbGlkYXRlICAgIDIwMTMtMDMtMDEKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIHB1YmxpYyBjbGFzcyBUb2tlbkZhY3RvcnkgOiBJVG9rZW5GYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgVG9rZW5GYWN0b3J5KElGdW5jdGlvbk5hbWVQcm92aWRlciBmdW5jdGlvblJlcG9zaXRvcnksIElOYW1lVmFsdWVQcm92aWRlciBuYW1lVmFsdWVQcm92aWRlcikKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVG9rZW5TZXBhcmF0b3JQcm92aWRlcigpLCBuYW1lVmFsdWVQcm92aWRlciwgZnVuY3Rpb25SZXBvc2l0b3J5KQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUb2tlbkZhY3RvcnkoSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgdG9rZW5TZXBhcmF0b3JQcm92aWRlciwgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyLCBJRnVuY3Rpb25OYW1lUHJvdmlkZXIgZnVuY3Rpb25OYW1lUHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b2tlblNlcGFyYXRvclByb3ZpZGVyID0gdG9rZW5TZXBhcmF0b3JQcm92aWRlcjsKKyAgICAgICAgICAgIF9mdW5jdGlvbk5hbWVQcm92aWRlciA9IGZ1bmN0aW9uTmFtZVByb3ZpZGVyOworICAgICAgICAgICAgX25hbWVWYWx1ZVByb3ZpZGVyID0gbmFtZVZhbHVlUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElUb2tlblNlcGFyYXRvclByb3ZpZGVyIF90b2tlblNlcGFyYXRvclByb3ZpZGVyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElGdW5jdGlvbk5hbWVQcm92aWRlciBfZnVuY3Rpb25OYW1lUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSU5hbWVWYWx1ZVByb3ZpZGVyIF9uYW1lVmFsdWVQcm92aWRlcjsKKyAgICAgICAgcHVibGljIFRva2VuIENyZWF0ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zLCBzdHJpbmcgdG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGUodG9rZW5zLCB0b2tlbiwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFRva2VuIENyZWF0ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zLCBzdHJpbmcgdG9rZW4sIHN0cmluZyB3b3Jrc2hlZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChfdG9rZW5TZXBhcmF0b3JQcm92aWRlci5Ub2tlbnMuVHJ5R2V0VmFsdWUodG9rZW4sIG91dCB0b2tlblNlcGFyYXRvcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuU2VwYXJhdG9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHRva2VuTGlzdCA9IChJTGlzdDxUb2tlbj4pdG9rZW5zOworICAgICAgICAgICAgLy9BZGRyZXNzIHdpdGggd29ya3NoZWV0LXN0cmluZyBiZWZvcmUgIC9KSworICAgICAgICAgICAgaWYgKHRva2VuLlN0YXJ0c1dpdGgoIiEiKSAmJiB0b2tlbkxpc3RbdG9rZW5MaXN0LkNvdW50LTFdLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBhZGRyID0gIiI7CisgICAgICAgICAgICAgICAgdmFyIGkgPSB0b2tlbkxpc3QuQ291bnQgLSAyOworICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbkxpc3RbaV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyID0gIiciICsgdG9rZW5MaXN0W2ldLlZhbHVlLlJlcGxhY2UoIiciLCAiJyciKSArICInIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJJbnZhbGlkIGZvcm11bGEgdG9rZW4gc2VxdWVuY2UgbmVhciB7MH0iLHRva2VuKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBzdHJpbmcgdG9rZW5zIGFuZCBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIHRva2VuTGlzdC5SZW1vdmVBdCh0b2tlbkxpc3QuQ291bnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5MaXN0LlJlbW92ZUF0KHRva2VuTGlzdC5Db3VudCAtIDEpOworICAgICAgICAgICAgICAgICAgICB0b2tlbkxpc3QuUmVtb3ZlQXQodG9rZW5MaXN0LkNvdW50IC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihhZGRyICsgdG9rZW4sIFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBmb3JtdWxhIHRva2VuIHNlcXVlbmNlIG5lYXIgezB9Iix0b2tlbikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0b2tlbnMuQW55KCkgJiYgdG9rZW5zLkxhc3QoKS5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHRva2VuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLlRyaW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKHRva2VuLCBSZWdleENvbnN0YW50cy5EZWNpbWFsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihSZWdleC5Jc01hdGNoKHRva2VuLCBSZWdleENvbnN0YW50cy5JbnRlZ2VyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaCh0b2tlbiwgUmVnZXhDb25zdGFudHMuQm9vbGVhbiwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIFRva2VuVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLkNvbnRhaW5zKCIjUkVGISIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIFRva2VuVHlwZS5JbnZhbGlkUmVmZXJlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlbi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpID09ICIjTlVNISIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLk51bWVyaWNFcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSA9PSAiI1ZBTFVFISIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlZhbHVlRGF0YVR5cGVFcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSA9PSAiI05VTEwhIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuTnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX25hbWVWYWx1ZVByb3ZpZGVyICE9IG51bGwgJiYgX25hbWVWYWx1ZVByb3ZpZGVyLklzTmFtZWRWYWx1ZSh0b2tlbiwgd29ya3NoZWV0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuTmFtZVZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfZnVuY3Rpb25OYW1lUHJvdmlkZXIuSXNGdW5jdGlvbk5hbWUodG9rZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIFRva2VuVHlwZS5GdW5jdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9rZW5MaXN0LkNvdW50ID4gMCAmJiB0b2tlbkxpc3RbdG9rZW5MaXN0LkNvdW50IC0gMV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuRW51bWVyYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgYXQgPSBPZmZpY2VPcGVuWG1sLkV4Y2VsQWRkcmVzc0Jhc2UuSXNWYWxpZCh0b2tlbik7CisgICAgICAgICAgICBpZiAoYXQ9PUV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuSW50ZXJuYWxBZGRyZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwgVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcyk7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlVucmVjb2duaXplZCk7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUb2tlbiBDcmVhdGUoc3RyaW5nIHRva2VuLCBUb2tlblR5cGUgZXhwbGljaXRUb2tlblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIGV4cGxpY2l0VG9rZW5UeXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NjE2OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyLmNzCkBAIC0wLDAgKzEsMTU4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnM7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIHB1YmxpYyBjbGFzcyBUb2tlbkhhbmRsZXIgOiBJVG9rZW5JbmRleFByb3ZpZGVyCisgICAgeworICAgICAgICBwdWJsaWMgVG9rZW5IYW5kbGVyKFRva2VuaXplckNvbnRleHQgY29udGV4dCwgSVRva2VuRmFjdG9yeSB0b2tlbkZhY3RvcnksIElUb2tlblNlcGFyYXRvclByb3ZpZGVyIHRva2VuUHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIF90b2tlbkZhY3RvcnkgPSB0b2tlbkZhY3Rvcnk7CisgICAgICAgICAgICBfdG9rZW5Qcm92aWRlciA9IHRva2VuUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRva2VuaXplckNvbnRleHQgX2NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgX3Rva2VuUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRva2VuRmFjdG9yeSBfdG9rZW5GYWN0b3J5OworICAgICAgICBwcml2YXRlIGludCBfdG9rZW5JbmRleCA9IC0xOworCisgICAgICAgIHB1YmxpYyBzdHJpbmcgV29ya3NoZWV0IHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgYm9vbCBIYXNNb3JlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF90b2tlbkluZGV4IDwgKF9jb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGggLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIE5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBfdG9rZW5JbmRleCsrOworICAgICAgICAgICAgSGFuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSGFuZGxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGMgPSBfY29udGV4dC5Gb3JtdWxhQ2hhcnNbX3Rva2VuSW5kZXhdOworICAgICAgICAgICAgVG9rZW4gdG9rZW5TZXBhcmF0b3I7CisgICAgICAgICAgICBpZiAoQ2hhcklzVG9rZW5TZXBhcmF0b3IoYywgb3V0IHRva2VuU2VwYXJhdG9yKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVG9rZW5TZXBhcmF0b3JIYW5kbGVyLkhhbmRsZShjLCB0b2tlblNlcGFyYXRvciwgX2NvbnRleHQsIHRoaXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoX2NvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChfY29udGV4dC5DdXJyZW50VG9rZW4sICJeXCIqJCIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5BZGRUb2tlbihfdG9rZW5GYWN0b3J5LkNyZWF0ZShfY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5BZGRUb2tlbihDcmVhdGVUb2tlbihfY29udGV4dCwgV29ya3NoZWV0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIGEgbmV4dCB0b2tlbiBpcyBhbiBvcGVuaW5nIHBhcmFudGhlc2VzIGFuZCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgaW50ZXJwZXRlZCBhcyBhbiBhZGRyZXNzIG9yIG5hbWUsIHRoZW4gdGhlIGN1cnJlbmN0IHRva2VuIGlzIGEgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzICYmIChfY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5FeGNlbEFkZHJlc3MgfHwgX2NvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmFtZVZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9IFRva2VuVHlwZS5GdW5jdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVmFsdWUgPT0gIi0iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRva2VuSXNOZWdhdG9yKF9jb250ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfY29udGV4dC5BZGRUb2tlbih0b2tlblNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgX2NvbnRleHQuTmV3VG9rZW4oKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBDaGFySXNUb2tlblNlcGFyYXRvcihjaGFyIGMsIG91dCBUb2tlbiB0b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF90b2tlblByb3ZpZGVyLlRva2Vucy5Db250YWluc0tleShjLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgdG9rZW4gPSByZXN1bHQgPyB0b2tlbiA9IF90b2tlblByb3ZpZGVyLlRva2Vuc1tjLlRvU3RyaW5nKCldIDogbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFRva2VuSXNOZWdhdG9yKFRva2VuaXplckNvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRva2VuSXNOZWdhdG9yKGNvbnRleHQuTGFzdFRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFRva2VuSXNOZWdhdG9yKFRva2VuIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0ID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzCisgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkNvbW1hCisgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlNlbWlDb2xvbgorICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVG9rZW4gQ3JlYXRlVG9rZW4oVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBzdHJpbmcgd29ya3NoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5DdXJyZW50VG9rZW4gPT0gIi0iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiA9PSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5GYWN0b3J5LkNyZWF0ZShjb250ZXh0LlJlc3VsdCwgY29udGV4dC5DdXJyZW50VG9rZW4sIHdvcmtzaGVldCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgSVRva2VuSW5kZXhQcm92aWRlci5JbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3Rva2VuSW5kZXg7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgdm9pZCBJVG9rZW5JbmRleFByb3ZpZGVyLk1vdmVJbmRleFBvaW50ZXJGb3J3YXJkKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3Rva2VuSW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9CcmFja2V0SGFuZGxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9CcmFja2V0SGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFjZWIxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL0JyYWNrZXRIYW5kbGVyLmNzCkBAIC0wLDAgKzEsNjIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTUtMTItMjgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycworeworICAgIHB1YmxpYyBjbGFzcyBCcmFja2V0SGFuZGxlciA6IFNlcGFyYXRvckhhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZShjaGFyIGMsIFRva2VuIHRva2VuU2VwYXJhdG9yLCBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nQnJhY2tldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgICAgICAgIGNvbnRleHQuQnJhY2tldENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nQnJhY2tldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgICAgICAgIGNvbnRleHQuQnJhY2tldENvdW50LS07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udGV4dC5CcmFja2V0Q291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvTXVsdGlwbGVDaGFyU2VwYXJhdG9ySGFuZGxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9NdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWUwODEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvTXVsdGlwbGVDaGFyU2VwYXJhdG9ySGFuZGxlci5jcwpAQCAtMCwwICsxLDc0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycworeworICAgIHB1YmxpYyBjbGFzcyBNdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyIDogU2VwYXJhdG9ySGFuZGxlcgorICAgIHsKKyAgICAgICAgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXI7CisKKyAgICAgICAgcHVibGljIE11bHRpcGxlQ2hhclNlcGFyYXRvckhhbmRsZXIoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCkpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBNdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyKElUb2tlblNlcGFyYXRvclByb3ZpZGVyIHRva2VuU2VwYXJhdG9yUHJvdmlkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b2tlblNlcGFyYXRvclByb3ZpZGVyID0gdG9rZW5TZXBhcmF0b3JQcm92aWRlcjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYW5kbGUoY2hhciBjLCBUb2tlbiB0b2tlblNlcGFyYXRvciwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdHdvIG9wZXJhdG9ycyBpbiBzZXF1ZW5jZSBjb3VsZCBiZSAiPD0iIG9yICI+PSIKKyAgICAgICAgICAgIGlmIChJc1BhcnRPZk11bHRpcGxlQ2hhclNlcGFyYXRvcihjb250ZXh0LCBjKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc09wID0gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgKyBjLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgIHZhciBvcCA9IF90b2tlblNlcGFyYXRvclByb3ZpZGVyLlRva2Vuc1tzT3BdOworICAgICAgICAgICAgICAgIGNvbnRleHQuUmVwbGFjZUxhc3RUb2tlbihvcCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIElzUGFydE9mTXVsdGlwbGVDaGFyU2VwYXJhdG9yKFRva2VuaXplckNvbnRleHQgY29udGV4dCwgY2hhciBjKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGFzdFRva2VuID0gY29udGV4dC5MYXN0VG9rZW4gIT0gbnVsbCA/IGNvbnRleHQuTGFzdFRva2VuLlZhbHVlIDogc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgcmV0dXJuIF90b2tlblNlcGFyYXRvclByb3ZpZGVyLklzT3BlcmF0b3IobGFzdFRva2VuKQorICAgICAgICAgICAgICAgICYmIF90b2tlblNlcGFyYXRvclByb3ZpZGVyLklzUG9zc2libGVMYXN0UGFydE9mTXVsdGlwbGVDaGFyT3BlcmF0b3IoYy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkKKyAgICAgICAgICAgICAgICAmJiAhY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9TZXBhcmF0b3JIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1NlcGFyYXRvckhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3NWIyYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9TZXBhcmF0b3JIYW5kbGVyLmNzCkBAIC0wLDAgKzEsNDggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTUtMTItMjgKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycworeworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXBhcmF0b3JIYW5kbGVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc0RvdWJsZVF1b3RlKFRva2VuIHRva2VuU2VwYXJhdG9yLCBpbnQgZm9ybXVsYUNoYXJJbmRleCwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcgJiYgZm9ybXVsYUNoYXJJbmRleCArIDEgPCBjb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGggJiYgY29udGV4dC5Gb3JtdWxhQ2hhcnNbZm9ybXVsYUNoYXJJbmRleCArIDFdID09ICdcIic7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBIYW5kbGUoY2hhciBjLCBUb2tlbiB0b2tlblNlcGFyYXRvciwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcik7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvU2hlZXRuYW1lSGFuZGxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9TaGVldG5hbWVIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDdmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvU2hlZXRuYW1lSGFuZGxlci5jcwpAQCAtMCwwICsxLDczIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgU2hlZXRuYW1lSGFuZGxlciA6IFNlcGFyYXRvckhhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZShjaGFyIGMsIFRva2VuIHRva2VuU2VwYXJhdG9yLCBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5Jc0luU2hlZXROYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJc0RvdWJsZVF1b3RlKHRva2VuU2VwYXJhdG9yLCB0b2tlbkluZGV4UHJvdmlkZXIuSW5kZXgsIGNvbnRleHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5JbmRleFByb3ZpZGVyLk1vdmVJbmRleFBvaW50ZXJGb3J3YXJkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlICE9IFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuV29ya3NoZWV0TmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4oIWNvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFRva2VuKHN0cmluZy5FbXB0eSwgVG9rZW5UeXBlLldvcmtzaGVldE5hbWVDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVG9rZW4oY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lQ29udGVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lKSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU2hlZXROYW1lKCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1N0cmluZ0hhbmRsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvU3RyaW5nSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRhMjRiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1N0cmluZ0hhbmRsZXIuY3MKQEAgLTAsMCArMSw3OSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxNS0xMi0yOAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcy5Ub2tlblNlcGFyYXRvckhhbmRsZXJzCit7CisgICAgcHVibGljIGNsYXNzIFN0cmluZ0hhbmRsZXIgOiBTZXBhcmF0b3JIYW5kbGVyCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYW5kbGUoY2hhciBjLCBUb2tlbiB0b2tlblNlcGFyYXRvciwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY29udGV4dC5Jc0luU3RyaW5nKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBpZiAoSXNEb3VibGVRdW90ZSh0b2tlblNlcGFyYXRvciwgdG9rZW5JbmRleFByb3ZpZGVyLkluZGV4LCBjb250ZXh0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuSW5kZXhQcm92aWRlci5Nb3ZlSW5kZXhQb2ludGVyRm9yd2FyZCgpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSAhPSBUb2tlblR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuVG9nZ2xlSXNJblN0cmluZygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKCFjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBUb2tlbihzdHJpbmcuRW1wdHksIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVG9rZW4oY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCJcIiIsIFRva2VuVHlwZS5TdHJpbmcpKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlRvZ2dsZUlzSW5TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0Lk5ld1Rva2VuKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvVG9rZW5TZXBhcmF0b3JIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1Rva2VuU2VwYXJhdG9ySGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc4Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1Rva2VuU2VwYXJhdG9ySGFuZGxlci5jcwpAQCAtMCwwICsxLDcyIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIDxzZWUgY3JlZj0iU2VwYXJhdG9ySGFuZGxlciIvPnMgLSBjbGFzc2VzIHRoYXQgZXhwb3NlcyBmdW5jdGlvbmF0bGl0eQorICAgIC8vLyBuZWVkZWQgd2hlbiBwYXJzaW5nIHN0cmluZ3MgdG8gdG9rZW5zLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb2tlblNlcGFyYXRvckhhbmRsZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFNlcGFyYXRvckhhbmRsZXJbXSBfaGFuZGxlcnMgPSBuZXcgU2VwYXJhdG9ySGFuZGxlcltdCisgICAgICAgIHsgCisgICAgICAgICAgICBuZXcgU3RyaW5nSGFuZGxlcigpLAorICAgICAgICAgICAgbmV3IEJyYWNrZXRIYW5kbGVyKCksCisgICAgICAgICAgICBuZXcgU2hlZXRuYW1lSGFuZGxlcigpLAorICAgICAgICAgICAgbmV3IE11bHRpcGxlQ2hhclNlcGFyYXRvckhhbmRsZXIoKQorICAgICAgICB9OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhhbmRsZXMgYSB0b2tlbnNlcGFyYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRva2VuU2VwYXJhdG9yIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9rZW5JbmRleFByb3ZpZGVyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+UmV0dXJucyB0cnVlIGlmIHRoZSB0b2tlbnNlcGFyYXRvciB3YXMgaGFuZGxlZC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBIYW5kbGUoY2hhciBjLCBUb2tlbiB0b2tlblNlcGFyYXRvciwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCh2YXIgaGFuZGxlciBpbiBfaGFuZGxlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoaGFuZGxlci5IYW5kbGUoYywgdG9rZW5TZXBhcmF0b3IsIGNvbnRleHQsIHRva2VuSW5kZXhQcm92aWRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkZjA5YQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcwpAQCAtMCwwICsxLDk0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgcHVibGljIGNsYXNzIFRva2VuU2VwYXJhdG9yUHJvdmlkZXIgOiBJVG9rZW5TZXBhcmF0b3JQcm92aWRlcgorICAgIHsKKyAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgVG9rZW4+IF90b2tlbnM7CisKKyAgICAgICAgc3RhdGljIFRva2VuU2VwYXJhdG9yUHJvdmlkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfdG9rZW5zID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4oKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCIrIiwgbmV3IFRva2VuKCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgICAgICAgICBfdG9rZW5zLkFkZCgiLSIsIG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIioiLCBuZXcgVG9rZW4oIioiLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCIvIiwgbmV3IFRva2VuKCIvIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgICAgICAgICBfdG9rZW5zLkFkZCgiXiIsIG5ldyBUb2tlbigiXiIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIiYiLCBuZXcgVG9rZW4oIiYiLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCI+IiwgbmV3IFRva2VuKCI+IiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgICAgICAgICBfdG9rZW5zLkFkZCgiPCIsIG5ldyBUb2tlbigiPCIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIj0iLCBuZXcgVG9rZW4oIj0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCI8PSIsIG5ldyBUb2tlbigiPD0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCI+PSIsIG5ldyBUb2tlbigiPj0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCI8PiIsIG5ldyBUb2tlbigiPD4iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCIoIiwgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIikiLCBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSk7CisgICAgICAgICAgICBfdG9rZW5zLkFkZCgieyIsIG5ldyBUb2tlbigieyIsIFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIn0iLCBuZXcgVG9rZW4oIn0iLCBUb2tlblR5cGUuQ2xvc2luZ0VudW1lcmFibGUpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCInIiwgbmV3IFRva2VuKCInIiwgVG9rZW5UeXBlLlN0cmluZykpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIlwiIiwgbmV3IFRva2VuKCJcIiIsIFRva2VuVHlwZS5TdHJpbmcpKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCIsIiwgbmV3IFRva2VuKCIsIiwgVG9rZW5UeXBlLkNvbW1hKSk7CisgICAgICAgICAgICBfdG9rZW5zLkFkZCgiOyIsIG5ldyBUb2tlbigiOyIsIFRva2VuVHlwZS5TZW1pQ29sb24pKTsKKyAgICAgICAgICAgIF90b2tlbnMuQWRkKCJbIiwgbmV3IFRva2VuKCJbIiwgVG9rZW5UeXBlLk9wZW5pbmdCcmFja2V0KSk7CisgICAgICAgICAgICBfdG9rZW5zLkFkZCgiXSIsIG5ldyBUb2tlbigiXSIsIFRva2VuVHlwZS5DbG9zaW5nQnJhY2tldCkpOworICAgICAgICAgICAgX3Rva2Vucy5BZGQoIiUiLCBuZXcgVG9rZW4oIiUiLCBUb2tlblR5cGUuUGVyY2VudCkpOworICAgICAgICB9CisKKyAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4gSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIuVG9rZW5zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfdG9rZW5zOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc09wZXJhdG9yKHN0cmluZyBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBUb2tlbiB0b2tlbjsKKyAgICAgICAgICAgIGlmIChfdG9rZW5zLlRyeUdldFZhbHVlKGl0ZW0sIG91dCB0b2tlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1Bvc3NpYmxlTGFzdFBhcnRPZk11bHRpcGxlQ2hhck9wZXJhdG9yKHN0cmluZyBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFydCA9PSAiPSIgfHwgcGFydCA9PSAiPiI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuVHlwZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5UeXBlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2RhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuVHlwZS5jcwpAQCAtMCwwICsxLDY2IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBwdWJsaWMgZW51bSBUb2tlblR5cGUKKyAgICB7CisgICAgICAgIE9wZXJhdG9yLAorICAgICAgICBOZWdhdG9yLAorICAgICAgICBPcGVuaW5nUGFyZW50aGVzaXMsCisgICAgICAgIENsb3NpbmdQYXJlbnRoZXNpcywKKyAgICAgICAgT3BlbmluZ0VudW1lcmFibGUsCisgICAgICAgIENsb3NpbmdFbnVtZXJhYmxlLAorICAgICAgICBPcGVuaW5nQnJhY2tldCwKKyAgICAgICAgQ2xvc2luZ0JyYWNrZXQsICAgICAgICAKKyAgICAgICAgRW51bWVyYWJsZSwKKyAgICAgICAgQ29tbWEsCisgICAgICAgIFNlbWlDb2xvbiwKKyAgICAgICAgU3RyaW5nLAorICAgICAgICBTdHJpbmdDb250ZW50LAorICAgICAgICBJbnRlZ2VyLAorICAgICAgICBCb29sZWFuLAorICAgICAgICBEZWNpbWFsLAorICAgICAgICBQZXJjZW50LAorICAgICAgICBGdW5jdGlvbiwKKyAgICAgICAgRXhjZWxBZGRyZXNzLAorICAgICAgICBOYW1lVmFsdWUsCisgICAgICAgIEludmFsaWRSZWZlcmVuY2UsCisgICAgICAgIE51bWVyaWNFcnJvciwKKyAgICAgICAgVmFsdWVEYXRhVHlwZUVycm9yLAorICAgICAgICBOdWxsLAorICAgICAgICBVbnJlY29nbml6ZWQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuaXplckNvbnRleHQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuaXplckNvbnRleHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxOGE1YwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5pemVyQ29udGV4dC5jcwpAQCAtMCwwICsxLDEzMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgcHVibGljIGNsYXNzIFRva2VuaXplckNvbnRleHQKKyAgICB7CisgICAgICAgIHB1YmxpYyBUb2tlbml6ZXJDb250ZXh0KHN0cmluZyBmb3JtdWxhKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGZvcm11bGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jaGFycyA9IGZvcm11bGEuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3Jlc3VsdCA9IG5ldyBMaXN0PFRva2VuPigpOworICAgICAgICAgICAgX2N1cnJlbnRUb2tlbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNoYXJbXSBfY2hhcnM7CisgICAgICAgIHByaXZhdGUgTGlzdDxUb2tlbj4gX3Jlc3VsdDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIF9jdXJyZW50VG9rZW47CisKKyAgICAgICAgcHVibGljIGNoYXJbXSBGb3JtdWxhQ2hhcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jaGFyczsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElMaXN0PFRva2VuPiBSZXN1bHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9yZXN1bHQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzSW5TdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBUb2dnbGVJc0luU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgSXNJblN0cmluZyA9ICFJc0luU3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgaW50IEJyYWNrZXRDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEN1cnJlbnRUb2tlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2N1cnJlbnRUb2tlbi5Ub1N0cmluZygpOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDdXJyZW50VG9rZW5IYXNWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gIXN0cmluZy5Jc051bGxPckVtcHR5KEN1cnJlbnRUb2tlbi5UcmltKCkpOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBOZXdUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jdXJyZW50VG9rZW4gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQWRkVG9rZW4oVG9rZW4gdG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZXN1bHQuQWRkKHRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEFwcGVuZFRvQ3VycmVudFRva2VuKGNoYXIgYykKKyAgICAgICAgeworICAgICAgICAgICAgX2N1cnJlbnRUb2tlbi5BcHBlbmQoYy5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEFwcGVuZFRvTGFzdFRva2VuKHN0cmluZyBzdHJpbmdUb0FwcGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgX3Jlc3VsdC5MYXN0KCkuQXBwZW5kKHN0cmluZ1RvQXBwZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNldExhc3RUb2tlblR5cGUoVG9rZW5UeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZXN1bHQuTGFzdCgpLlRva2VuVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXBsYWNlTGFzdFRva2VuKFRva2VuIG5ld1Rva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY291bnQgPSBfcmVzdWx0LkNvdW50OworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcmVzdWx0LlJlbW92ZUF0KGNvdW50IC0gMSk7ICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcmVzdWx0LkFkZChuZXdUb2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVG9rZW4gTGFzdFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfcmVzdWx0LkNvdW50ID4gMCA/IF9yZXN1bHQuTGFzdCgpIDogbnVsbDsgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9JRm9ybXVsYVBhcnNlckxvZ2dlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Mb2dnaW5nL0lGb3JtdWxhUGFyc2VyTG9nZ2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTkxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9JRm9ybXVsYVBhcnNlckxvZ2dlci5jcwpAQCAtMCwwICsxLDQ0IEBACivvu791c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxvZ2dpbmcKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFVzZWQgZm9yIGxvZ2dpbmcgZHVyaW5nIEZvcm11bGFQYXJzaW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElGb3JtdWxhUGFyc2VyTG9nZ2VyIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBlYWNoIHRpbWUgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgZm9ybXVsYSBwYXJzaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXgiPjwvcGFyYW0+CisgICAgICAgIHZvaWQgTG9nKFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIEV4Y2VwdGlvbiBleCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBlYWNoIHRpbWUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGxvZ2dlZCBkdXJpbmcgZm9ybXVsYSBwYXJzaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KKyAgICAgICAgdm9pZCBMb2coUGFyc2luZ0NvbnRleHQgY29udGV4dCwgc3RyaW5nIG1lc3NhZ2UpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgdG8gbG9nIGEgbWVzc2FnZSBvdXRzaWRlIHRoZSBwYXJzaW5nIGNvbnRleHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KKyAgICAgICAgdm9pZCBMb2coc3RyaW5nIG1lc3NhZ2UpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgZWFjaCB0aW1lIGEgY2VsbCB3aXRoaW4gdGhlIGNhbGMgY2hhaW4gaXMgYWNjZXNzZWQgZHVyaW5nIGZvcm11bGEgcGFyc2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBMb2dDZWxsQ291bnRlZCgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBlYWNoIHRpbWUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGZvcm11bGEgcGFyc2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmdW5jIj48L3BhcmFtPgorICAgICAgICB2b2lkIExvZ0Z1bmN0aW9uKHN0cmluZyBmdW5jKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU29tZSBmdW5jdGlvbnMgbWVhc3VyZSBwZXJmb3JtYW5jZSwgaWYgc28gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmdW5jIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1pbGxpc2Vjb25kcyI+PC9wYXJhbT4KKyAgICAgICAgdm9pZCBMb2dGdW5jdGlvbihzdHJpbmcgZnVuYywgbG9uZyBtaWxsaXNlY29uZHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Mb2dnaW5nL0xvZ2dlckZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzBlODEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTG9nZ2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ3JlYXRlIGxvZ2dlcnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZyB0aGUgZm9ybXVsYSBwYXJzZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvZ2dlckZhY3RvcnkKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBsb2dnZXIgdGhhdCBsb2dzIHRvIGEgc2ltcGxlIHRleHRmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUZvcm11bGFQYXJzZXJMb2dnZXIgQ3JlYXRlVGV4dEZpbGVMb2dnZXIoRmlsZUluZm8gZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0RmlsZUxvZ2dlcihmaWxlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Mb2dnaW5nL1RleHRGaWxlTG9nZ2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xvZ2dpbmcvVGV4dEZpbGVMb2dnZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjOWYxNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Mb2dnaW5nL1RleHRGaWxlTG9nZ2VyLmNzCkBAIC0wLDAgKzEsMTEyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTG9nZ2luZworeworICAgIGludGVybmFsIGNsYXNzIFRleHRGaWxlTG9nZ2VyIDogSUZvcm11bGFQYXJzZXJMb2dnZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgU3RyZWFtV3JpdGVyIF9zdzsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgU2VwYXJhdG9yID0gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSI7CisgICAgICAgIHByaXZhdGUgaW50IF9jb3VudDsKKyAgICAgICAgcHJpdmF0ZSBEYXRlVGltZSBfc3RhcnRUaW1lID0gRGF0ZVRpbWUuTm93OworICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IF9mdW5jcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpOworICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBsb25nPiBfZnVuY1BlcmZvcm1hbmNlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBsb25nPigpOworICAgICAgICBpbnRlcm5hbCBUZXh0RmlsZUxvZ2dlcihGaWxlSW5mbyBmaWxlSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgX3N3ID0gbmV3IFN0cmVhbVdyaXRlcihmaWxlSW5mby5GdWxsTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVTZXBhcmF0b3JBbmRUaW1lU3RhbXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfc3cuV3JpdGVMaW5lKFNlcGFyYXRvcik7CisgICAgICAgICAgICBfc3cuV3JpdGVMaW5lKCJUaW1lc3RhbXA6IHswfSIsIERhdGVUaW1lLk5vdyk7CisgICAgICAgICAgICBfc3cuV3JpdGVMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVBZGRyZXNzSW5mbyhQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudCAhPSBudWxsICYmIGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdy5Xcml0ZUxpbmUoIldvcmtzaGVldDogezB9IiwgY29udGV4dC5TY29wZXMuQ3VycmVudC5BZGRyZXNzLldvcmtzaGVldCA/PyAiPG5vdCBzcGVjaWZpZWQ+Iik7CisgICAgICAgICAgICAgICAgX3N3LldyaXRlTGluZSgiQWRkcmVzczogezB9IiwgY29udGV4dC5TY29wZXMuQ3VycmVudC5BZGRyZXNzLkFkZHJlc3MgPz8gIjxub3QgYXZhaWxhYmxlPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgTG9nKFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIEV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVTZXBhcmF0b3JBbmRUaW1lU3RhbXAoKTsKKyAgICAgICAgICAgIFdyaXRlQWRkcmVzc0luZm8oY29udGV4dCk7CisgICAgICAgICAgICBfc3cuV3JpdGVMaW5lKGV4KTsKKyAgICAgICAgICAgIF9zdy5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIExvZyhQYXJzaW5nQ29udGV4dCBjb250ZXh0LCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVTZXBhcmF0b3JBbmRUaW1lU3RhbXAoKTsKKyAgICAgICAgICAgIFdyaXRlQWRkcmVzc0luZm8oY29udGV4dCk7CisgICAgICAgICAgICBfc3cuV3JpdGVMaW5lKG1lc3NhZ2UpOworICAgICAgICAgICAgX3N3LldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgTG9nKHN0cmluZyBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVNlcGFyYXRvckFuZFRpbWVTdGFtcCgpOworICAgICAgICAgICAgX3N3LldyaXRlTGluZShtZXNzYWdlKTsKKyAgICAgICAgICAgIF9zdy5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIExvZ0NlbGxDb3VudGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NvdW50Kys7CisgICAgICAgICAgICBpZiAoX2NvdW50JTUwMCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdy5Xcml0ZUxpbmUoU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICB2YXIgdGltZUVsbGFwc2VkID0gRGF0ZVRpbWUuTm93LlN1YnRyYWN0KF9zdGFydFRpbWUpOworICAgICAgICAgICAgICAgIF9zdy5Xcml0ZUxpbmUoInswfSBjZWxscyBwYXJzZWQsIHRpbWUgezF9IHNlY29uZHMiLCBfY291bnQsIHRpbWVFbGxhcHNlZC5Ub3RhbFNlY29uZHMpOworCisgICAgICAgICAgICAgICAgdmFyIGZ1bmNzID0gX2Z1bmNzLktleXMuT3JkZXJCeURlc2NlbmRpbmcoeCA9PiBfZnVuY3NbeF0pLlRvTGlzdCgpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmdW5jIGluIGZ1bmNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3N3LldyaXRlKGZ1bmMgKyAiICAtICIgKyBfZnVuY3NbZnVuY10pOworICAgICAgICAgICAgICAgICAgICBpZiAoX2Z1bmNQZXJmb3JtYW5jZS5Db250YWluc0tleShmdW5jKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3N3LldyaXRlKCIgLSBhdmc6ICIgKyBfZnVuY1BlcmZvcm1hbmNlW2Z1bmNdL19mdW5jc1tmdW5jXSArICIgbWlsbGlzZWNvbmRzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX3N3LldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfc3cuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgX2Z1bmNzLkNsZWFyKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIExvZ0Z1bmN0aW9uKHN0cmluZyBmdW5jKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9mdW5jcy5Db250YWluc0tleShmdW5jKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZnVuY3MuQWRkKGZ1bmMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2Z1bmNzW2Z1bmNdKys7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBMb2dGdW5jdGlvbihzdHJpbmcgZnVuYywgbG9uZyBtaWxsaXNlY29uZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2Z1bmNQZXJmb3JtYW5jZS5Db250YWluc0tleShmdW5jKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZnVuY1BlcmZvcm1hbmNlW2Z1bmNdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9mdW5jUGVyZm9ybWFuY2VbZnVuY10gKz0gbWlsbGlzZWNvbmRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdy5DbG9zZSgpOyAKKyAgICAgICAgICAgIF9zdy5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTmFtZVZhbHVlUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTmFtZVZhbHVlUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxMGEzMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9OYW1lVmFsdWVQcm92aWRlci5jcwpAQCAtMCwwICsxLDM1IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCit7CisgICAgcHVibGljIGNsYXNzIE5hbWVWYWx1ZVByb3ZpZGVyIDogSU5hbWVWYWx1ZVByb3ZpZGVyCisgICAgeworICAgICAgICBwcml2YXRlIE5hbWVWYWx1ZVByb3ZpZGVyKCkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIElOYW1lVmFsdWVQcm92aWRlciBFbXB0eQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IE5hbWVWYWx1ZVByb3ZpZGVyKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzTmFtZWRWYWx1ZShzdHJpbmcga2V5LCBzdHJpbmcgd29ya3NoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IEdldE5hbWVkVmFsdWUoc3RyaW5nIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZWxvYWQoKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzZWRWYWx1ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzZWRWYWx1ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ3ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNlZFZhbHVlLmNzCkBAIC0wLDAgKzEsMzUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBwdWJsaWMgY2xhc3MgUGFyc2VkVmFsdWUKKyAgICB7CisgICAgICAgIHB1YmxpYyBQYXJzZWRWYWx1ZShvYmplY3QgdmFsLCBpbnQgcm93SW5kZXgsIGludCBjb2xJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSB2YWw7CisgICAgICAgICAgICBSb3dJbmRleCA9IHJvd0luZGV4OworICAgICAgICAgICAgQ29sSW5kZXggPSBjb2xJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFJvd0luZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDb2xJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29uZmlndXJhdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29uZmlndXJhdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRmMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdDb25maWd1cmF0aW9uLmNzCkBAIC0wLDAgKzEsNzYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxvZ2dpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBwdWJsaWMgY2xhc3MgUGFyc2luZ0NvbmZpZ3VyYXRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMZXhlciBMZXhlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgSUZvcm11bGFQYXJzZXJMb2dnZXIgTG9nZ2VyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBJRXhwcmVzc2lvbkdyYXBoQnVpbGRlciBHcmFwaEJ1aWxkZXIgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHVibGljIElFeHByZXNzaW9uQ29tcGlsZXIgRXhwcmVzc2lvbkNvbXBpbGVyeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgcHVibGljIEZ1bmN0aW9uUmVwb3NpdG9yeSBGdW5jdGlvblJlcG9zaXRvcnl7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb25maWd1cmF0aW9uKCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uUmVwb3NpdG9yeSA9IEZ1bmN0aW9uUmVwb3NpdG9yeS5DcmVhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBDcmVhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNpbmdDb25maWd1cmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gU2V0TGV4ZXIoSUxleGVyIGxleGVyKQorICAgICAgICB7CisgICAgICAgICAgICBMZXhlciA9IGxleGVyOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gU2V0R3JhcGhCdWlsZGVyKElFeHByZXNzaW9uR3JhcGhCdWlsZGVyIGdyYXBoQnVpbGRlcikKKyAgICAgICAgeworICAgICAgICAgICAgR3JhcGhCdWlsZGVyID0gZ3JhcGhCdWlsZGVyOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gU2V0RXhwcmVzaW9uQ29tcGlsZXIoSUV4cHJlc3Npb25Db21waWxlciBleHByZXNzaW9uQ29tcGlsZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb25Db21waWxlciA9IGV4cHJlc3Npb25Db21waWxlcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQXR0YWNoZXMgYSBsb2dnZXIsIGVycm9ycyBhbmQgbG9nIGVudHJpZXMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2dnZXIgZHVyaW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9nZ2VyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gQXR0YWNoTG9nZ2VyKElGb3JtdWxhUGFyc2VyTG9nZ2VyIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGxvZ2dlcikuTmFtZWQoImxvZ2dlciIpLklzTm90TnVsbCgpOworICAgICAgICAgICAgTG9nZ2VyID0gbG9nZ2VyOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBpZiBhIGxvZ2dlciBpcyBhdHRhY2hlZCBpdCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBEZXRhY2hMb2dnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbnRleHQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbnRleHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxZDFkNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29udGV4dC5jcwpAQCAtMCwwICsxLDc2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxvZ2dpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQYXJzaW5nIGNvbnRleHQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nQ29udGV4dCA6IElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQoKSB7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgPHNlZSBjcmVmPSJGb3JtdWxhUGFyc2VyIi8+IG9mIHRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBGb3JtdWxhUGFyc2VyIFBhcnNlciB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIiLz4gaXMgYW4gYWJzdHJhY3Rpb24gb24gdG9wIG9mCisgICAgICAgIC8vLyBFeGNlbCwgaW4gdGhpcyBjYXNlIEVQUGx1cy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRGF0YVByb3ZpZGVyIEV4Y2VsRGF0YVByb3ZpZGVyIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVdGlsaXR5IGZvciBoYW5kbGluZyBhZGRyZXNzZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFJhbmdlQWRkcmVzc0ZhY3RvcnkgUmFuZ2VBZGRyZXNzRmFjdG9yeSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTmFtZVZhbHVlUHJvdmlkZXIiLz4gb2YgdGhlIGN1cnJlbnQgY29udGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgSU5hbWVWYWx1ZVByb3ZpZGVyIE5hbWVWYWx1ZVByb3ZpZGVyIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25maWd1cmF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTY29wZXMsIGEgc2NvcGUgcmVwcmVzZW50cyB0aGUgcGFyc2luZyBvZiBhIGNlbGwgb3IgYSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFBhcnNpbmdTY29wZXMgU2NvcGVzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIDxzZWUgY3JlZj0iSUZvcm11bGFQYXJzZXJMb2dnZXIiLz4gaXMgYXR0YWNoZWQgdG8gdGhlIHBhcnNlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgRGVidWcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIENvbmZpZ3VyYXRpb24uTG9nZ2VyICE9IG51bGw7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZhY3RvcnkgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIFBhcnNpbmdDb250ZXh0IENyZWF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbmV3IFBhcnNpbmdDb250ZXh0KCk7CisgICAgICAgICAgICBjb250ZXh0LkNvbmZpZ3VyYXRpb24gPSBQYXJzaW5nQ29uZmlndXJhdGlvbi5DcmVhdGUoKTsKKyAgICAgICAgICAgIGNvbnRleHQuU2NvcGVzID0gbmV3IFBhcnNpbmdTY29wZXMoY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgSVBhcnNpbmdMaWZldGltZUV2ZW50SGFuZGxlci5QYXJzaW5nQ29tcGxldGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3BlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFlNjkzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZS5jcwpAQCAtMCwwICsxLDU0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwcmVzZW50cyBhIHBhcnNpbmcgb2YgYSBzaW5nbGUgaW5wdXQgb3Igd29ya2Jvb2sgYWRkcnNlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nU2NvcGUgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nU2NvcGVzIF9wYXJzaW5nU2NvcGVzOworCisgICAgICAgIHB1YmxpYyBQYXJzaW5nU2NvcGUoUGFyc2luZ1Njb3BlcyBwYXJzaW5nU2NvcGVzLCBSYW5nZUFkZHJlc3MgYWRkcmVzcykKKyAgICAgICAgICAgIDogdGhpcyhwYXJzaW5nU2NvcGVzLCBudWxsLCBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2luZ1Njb3BlKFBhcnNpbmdTY29wZXMgcGFyc2luZ1Njb3BlcywgUGFyc2luZ1Njb3BlIHBhcmVudCwgUmFuZ2VBZGRyZXNzIGFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYXJzaW5nU2NvcGVzID0gcGFyc2luZ1Njb3BlczsKKyAgICAgICAgICAgIFBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgIEFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICAgICAgU2NvcGVJZCA9IEd1aWQuTmV3R3VpZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWQgb2YgdGhlIHNjb3BlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgR3VpZCBTY29wZUlkIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjYWxsaW5nIHNjb3BlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgUGFyc2luZ1Njb3BlIFBhcmVudCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgYWRkcmVzcyBvZiB0aGUgY2VsbCBjdXJyZW50bHkgYmVlaW5nIHBhcnNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFJhbmdlQWRkcmVzcyBBZGRyZXNzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRydWUgaWYgdGhlIGN1cnJlbnQgc2NvcGUgaXMgYSBTdWJ0b3RhbCBmdW5jdGlvbiBiZWVpbmcgZXhlY3V0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIElzU3VidG90YWwgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2luZ1Njb3Blcy5LaWxsU2NvcGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3Blcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nU2NvcGVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OGRmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3Blcy5jcwpAQCAtMCwwICsxLDY1IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc3RhY2sgb24gd2hpY2ggaW5zdGFuY2VzIG9mIDxzZWUgY3JlZj0iUGFyc2luZ1Njb3BlIi8+CisgICAgLy8vIGFyZSBwdXQuIEVhY2ggUGFyc2luZ1Njb3BlIHJlcHJlc2VudHMgdGhlIHBhcnNpbmcgb2YgYW4gYWRkcmVzcyBpbiB0aGUgd29ya2Jvb2suCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgUGFyc2luZ1Njb3BlcworICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyIF9saWZldGltZUV2ZW50SGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgUGFyc2luZ1Njb3BlcyhJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyIGxpZmV0aW1lRXZlbnRIYW5kbGVyKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlmZXRpbWVFdmVudEhhbmRsZXIgPSBsaWZldGltZUV2ZW50SGFuZGxlcjsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFN0YWNrPFBhcnNpbmdTY29wZT4gX3Njb3BlcyA9IG5ldyBTdGFjazxQYXJzaW5nU2NvcGU+KCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IlBhcnNpbmdTY29wZSIvPiBhbmQgcHV0cyBpdCBvbiB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFBhcnNpbmdTY29wZSBOZXdTY29wZShSYW5nZUFkZHJlc3MgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgUGFyc2luZ1Njb3BlIHNjb3BlOworICAgICAgICAgICAgaWYgKF9zY29wZXMuQ291bnQoKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2NvcGUgPSBuZXcgUGFyc2luZ1Njb3BlKHRoaXMsIF9zY29wZXMuUGVlaygpLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY29wZSA9IG5ldyBQYXJzaW5nU2NvcGUodGhpcywgYWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc2NvcGVzLlB1c2goc2NvcGUpOworICAgICAgICAgICAgcmV0dXJuIHNjb3BlOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY3VycmVudCBwYXJzaW5nIHNjb3BlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdmlydHVhbCBQYXJzaW5nU2NvcGUgQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3Njb3Blcy5Db3VudCgpID4gMCA/IF9zY29wZXMuUGVlaygpIDogbnVsbDsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgY3VycmVudCBzY29wZSwgc2V0dGluZyB0aGUgY2FsbGluZyBzY29wZSB0byBjdXJyZW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhcnNpbmdTY29wZSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBLaWxsU2NvcGUoUGFyc2luZ1Njb3BlIHBhcnNpbmdTY29wZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3Njb3Blcy5Qb3AoKTsKKyAgICAgICAgICAgIGlmIChfc2NvcGVzLkNvdW50KCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbGlmZXRpbWVFdmVudEhhbmRsZXIuUGFyc2luZ0NvbXBsZXRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9Bcmd1bWVudEluZm8uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0FyZ3VtZW50SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2YwODkzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9Bcmd1bWVudEluZm8uY3MKQEAgLTAsMCArMSwyNSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXJndW1lbnRJbmZvPFQ+CisgICAgeworICAgICAgICBwdWJsaWMgQXJndW1lbnRJbmZvKFQgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIFZhbHVlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgQXJndW1lbnRJbmZvPFQ+IE5hbWVkKHN0cmluZyBhcmdOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gYXJnTmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9FeHRlbnNpb25NZXRob2RzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9FeHRlbnNpb25NZXRob2RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NWY3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0V4dGVuc2lvbk1ldGhvZHMuY3MKQEAgLTAsMCArMSwzMyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4dGVuc2lvbk1ldGhvZHMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc05vdE51bGxPckVtcHR5KHRoaXMgQXJndW1lbnRJbmZvPHN0cmluZz4gdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsLlZhbHVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24odmFsLk5hbWUgKyAiIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgSXNOb3ROdWxsPFQ+KHRoaXMgQXJndW1lbnRJbmZvPFQ+IHZhbCkKKyAgICAgICAgICAgIHdoZXJlIFQgOiBjbGFzcworICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsLlZhbHVlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbih2YWwuTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNOdW1lcmljKHRoaXMgb2JqZWN0IG9iaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKG9iai5HZXRUeXBlKCkuSXNQcmltaXRpdmUgfHwgb2JqIGlzIGRvdWJsZSB8fCBvYmogaXMgZGVjaW1hbCB8fCBvYmogaXMgU3lzdGVtLkRhdGVUaW1lIHx8IG9iaiBpcyBUaW1lU3Bhbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0lkUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0lkUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmYzZhZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSWRQcm92aWRlci5jcwpAQCAtMCwwICsxLDEyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcworeworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJZFByb3ZpZGVyCisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IE5ld0lkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9JbnRlZ2VySWRQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSW50ZWdlcklkUHJvdmlkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxYjBiMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSW50ZWdlcklkUHJvdmlkZXIuY3MKQEAgLTAsMCArMSwyMSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSW50ZWdlcklkUHJvdmlkZXIgOiBJZFByb3ZpZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGludCBfbGFzdElkID0gaW50Lk1pblZhbHVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgTmV3SWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2xhc3RJZCA+PSBpbnQuTWF4VmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIklkUHJvdmlkZXIgcnVuIG91dCBvZiBpZDpzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2xhc3RJZCsrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9SZWdleENvbnN0YW50cy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVnZXhDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwMDlhYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVnZXhDb25zdGFudHMuY3MKQEAgLTAsMCArMSw0OCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWdleENvbnN0YW50cworICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBTaW5nbGVDZWxsQWRkcmVzcyA9IEAiXigoJ1teL1xcPypcW1xdXXsxLDMxfSd8W0EtWmEtel9dezEsMzF9KSEpP1tBLVpdezEsM31bMS05XXsxfVswLTldezAsN30kIjsKKyAgICAgICAgLy9DaGFuZ2VkIEpLIDI2LzItMjAxMworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEV4Y2VsQWRkcmVzcyA9IEAiXigoJ1teL1xcPypcW1xdXXsxLDMxfSd8W0EtWmEtel9dezEsMzF9KSEpP1tcJF17MCwxfShbQS1aXXxbQS1aXXsxLDN9W1wkXXswLDF9WzEtOV17MX1bMC05XXswLDd9KShcOih7MCwxfVtBLVpdfFtBLVpdezEsM31bXCRdezAsMX1bMS05XXsxfVswLTldezAsN30pKXswLDF9JCI7CisgICAgICAgIC8vcHVibGljIGNvbnN0IHN0cmluZyBFeGNlbEFkZHJlc3MgPSBAIl4oW1wkXXswLDF9KFtBLVpdezEsM31bXCRdezAsMX1bMC05XXsxLDd9KShcOihbXCRdezAsMX1bQS1aXXsxLDN9W1wkXXswLDF9WzAtOV17MSw3fSl7MCwxfSl8KFtcJF17MCwxfVtBLVpdezEsM31cOltcJF17MCwxfVtBLVpdezEsM30pfChbXCRdezAsMX1bMC05XXsxLDd9XDpbXCRdezAsMX1bMC05XXsxLDd9KSkkIjsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBCb29sZWFuID0gQCJeKHRydWV8ZmFsc2UpJCI7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgRGVjaW1hbCA9IEAiXlswLTldK1wuWzAtOV0rJCI7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgSW50ZWdlciA9IEAiXlswLTldKyQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVxdWlyZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVxdWlyZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDNlZTUwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9SZXF1aXJlLmNzCkBAIC0wLDAgKzEsMTUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1aXJlCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIEFyZ3VtZW50SW5mbzxUPiBUaGF0PFQ+KFQgYXJnKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50SW5mbzxUPihhcmcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0lSYW5nZUlELmNzIGIvRVBQbHVzL0lSYW5nZUlELmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTY1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvSVJhbmdlSUQuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEwLTAyLTA0CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSWQgZnJvbSBhIGNlbGwsIGNvbHVtbiBvciByb3cuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcmZhY2UgSVJhbmdlSUQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGlkIGZvciBhIGNlbGwsIHJvdyBvciBjb2x1bW4uCisgICAgICAgIC8vLyBUaGUgaWQgaXMgYSBjb21wb3NpdCBvZiB0aGUgU2hlZXRJRCwgdGhlIHJvdyBudW1iZXIgYW5kIHRoZSBjb2x1bW4gbnVtYmVyLgorICAgICAgICAvLy8gQml0IDEtMTQgU2hlZXRJRCwgQml0IDE1LTI4IENvbHVtbiBudW1iZXIgKDAgaWYgZW50aXJlIGNvbHVtbiksIEJpdCAyOS0gUm93IG51bWJlciAoMCBpZiBlbnRpcmUgcm93KS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdWxvbmcgUmFuZ2VJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvT2ZmaWNlUHJvcGVydGllcy5jcyBiL0VQUGx1cy9PZmZpY2VQcm9wZXJ0aWVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjlkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvT2ZmaWNlUHJvcGVydGllcy5jcwpAQCAtMCwwICsxLDU1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS+RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS+RsbG1hbiAgICAgICAgICAgICAgICAgICAgICBUb3RhbCByZXdyaXRlICAgICAgICAgICAgICAgMjAxMC0wMy0wMQorICogSmFuIEvkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICogUmF6aXEgWW9yayAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQ3JlYXRlZCAmIE1vZGlmaWVkICAgIDIwMTQtMDgtMjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcHJvcGVydGllcyBiYWcgb2YgdGhlIHBhY2thZ2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgT2ZmaWNlUHJvcGVydGllcyA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKyAgICAgICAgcHJpdmF0ZSBYbWxEb2N1bWVudCBfeG1sUHJvcGVydGllc0NvcmU7CisgICAgICAgIHByaXZhdGUgWG1sRG9jdW1lbnQgX3htbFByb3BlcnRpZXNFeHRlbmRlZDsKKyAgICAgICAgcHJpdmF0ZSBYbWxEb2N1bWVudCBfeG1sUHJvcGVydGllc0N1c3RvbTsKKworICAgICAgICBwcml2YXRlIFVyaSBfdXJpUHJvcGVydGllc0NvcmUgPSBuZXcgVXJpKCIvZG9jUHJvcHMvY29yZS54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgcHJpdmF0ZSBVcmkgX3VyaVByb3BlcnRpZXNFeHRlbmRlZCA9IG5ldyBVcmkoIi9kb2NQcm9wcy9hcHAueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgIHByaXZhdGUgVXJpIF91cmlQcm9wZXJ0aWVzQ3VzdG9tID0gbmV3IFVyaSgiL2RvY1Byb3BzL2N1c3RvbS54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKworICAgICAgICBYbWxIZWxwZXIgX2NvcmVIZWxwZXI7CisgICAgICAgIFhtbEhlbHBlciBfZXh0ZW5kZWRIZWxwZXI7CisgICAgICAgIFhtbEhlbHBlciBfY3VzdG9tSGVscGVyOworICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gRXhjZWxQcm9wZXJ0aWVzIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIG9mZmljZSBkb2N1bWVudCBwcm9wZXJ0aWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhY2thZ2UiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIE9mZmljZVByb3BlcnRpZXMoRXhjZWxQYWNrYWdlIHBhY2thZ2UsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMpIDoKKyAgICAgICAgICAgIGJhc2UobnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYWNrYWdlID0gcGFja2FnZTsKKworICAgICAgICAgICAgX2NvcmVIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgQ29yZVByb3BlcnRpZXNYbWwuU2VsZWN0U2luZ2xlTm9kZSgiY3A6Y29yZVByb3BlcnRpZXMiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICBfZXh0ZW5kZWRIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgRXh0ZW5kZWRQcm9wZXJ0aWVzWG1sKTsKKyAgICAgICAgICAgIF9jdXN0b21IZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgQ3VzdG9tUHJvcGVydGllc1htbCk7CisKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gQ29yZVByb3BlcnRpZXNYbWwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZG9jdW1lbnQgdGhhdCBob2xkcyBhbGwgdGhlIGNvZGUgCisgICAgICAgIC8vLyBkb2N1bWVudCBwcm9wZXJ0aWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgQ29yZVByb3BlcnRpZXNYbWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF94bWxQcm9wZXJ0aWVzQ29yZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN0cmluZy5Gb3JtYXQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PGNwOmNvcmVQcm9wZXJ0aWVzIHhtbG5zOmNwPVwiezB9XCIgeG1sbnM6ZGM9XCJ7MX1cIiB4bWxuczpkY3Rlcm1zPVwiezJ9XCIgeG1sbnM6ZGNtaXR5cGU9XCJ7M31cIiB4bWxuczp4c2k9XCJ7NH1cIj48L2NwOmNvcmVQcm9wZXJ0aWVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2Uuc2NoZW1hQ29yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFEYywKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFEY1Rlcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYURjbWlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYVhzaSk7CisKKyAgICAgICAgICAgICAgICAgICAgX3htbFByb3BlcnRpZXNDb3JlID0gR2V0WG1sRG9jdW1lbnQoeG1sLCBfdXJpUHJvcGVydGllc0NvcmUsIEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbCIsIEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzL21ldGFkYXRhL2NvcmUtcHJvcGVydGllcyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gKF94bWxQcm9wZXJ0aWVzQ29yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhtbERvY3VtZW50IEdldFhtbERvY3VtZW50KHN0cmluZyBzdGFydFhtbCwgVXJpIHVyaSwgc3RyaW5nIGNvbnRlbnRUeXBlLCBzdHJpbmcgcmVsYXRpb25zaGlwKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxEb2N1bWVudCB4bWxEb2M7CisgICAgICAgICAgICBpZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKHVyaSkpCisgICAgICAgICAgICAgICAgeG1sRG9jID0gX3BhY2thZ2UuR2V0WG1sRnJvbVVyaSh1cmkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHhtbERvYy5Mb2FkWG1sKHN0YXJ0WG1sKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRoZSBwYXJ0IGFuZCBhZGQgdG8gdGhlIHBhY2thZ2UKKyAgICAgICAgICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmksIGNvbnRlbnRUeXBlKTsKKworICAgICAgICAgICAgICAgIC8vIFNhdmUgaXQgdG8gdGhlIHBhY2thZ2UKKyAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgICAgICAgICAgICB4bWxEb2MuU2F2ZShzdHJlYW0pOworICAgICAgICAgICAgICAgIC8vc3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5GbHVzaCgpOworCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgd29ya2Jvb2sgYW5kIHRoZSBuZXcgc2hhcmVkIHN0cmluZ3MgcGFydAorICAgICAgICAgICAgICAgIF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShuZXcgVXJpKCIveGwiLCBVcmlLaW5kLlJlbGF0aXZlKSwgdXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIHJlbGF0aW9uc2hpcCk7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5GbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHhtbERvYzsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gQ29yZSBQcm9wZXJ0aWVzCisgICAgICAgIGNvbnN0IHN0cmluZyBUaXRsZVBhdGggPSAiZGM6dGl0bGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIHRpdGxlIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBUaXRsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhUaXRsZVBhdGgpOyB9CisgICAgICAgICAgICBzZXQgeyBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKFRpdGxlUGF0aCwgdmFsdWUpOyB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgU3ViamVjdFBhdGggPSAiZGM6c3ViamVjdCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgc3ViamVjdCBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU3ViamVjdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhTdWJqZWN0UGF0aCk7IH0KKyAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoU3ViamVjdFBhdGgsIHZhbHVlKTsgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIEF1dGhvclBhdGggPSAiZGM6Y3JlYXRvciI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgYXV0aG9yIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBBdXRob3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQXV0aG9yUGF0aCk7IH0KKyAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQXV0aG9yUGF0aCwgdmFsdWUpOyB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgQ29tbWVudHNQYXRoID0gImRjOmRlc2NyaXB0aW9uIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBjb21tZW50cyBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29tbWVudHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQ29tbWVudHNQYXRoKTsgfQorICAgICAgICAgICAgc2V0IHsgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhDb21tZW50c1BhdGgsIHZhbHVlKTsgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIEtleXdvcmRzUGF0aCA9ICJjcDprZXl3b3JkcyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUga2V5d29yZHMgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEtleXdvcmRzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKEtleXdvcmRzUGF0aCk7IH0KKyAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoS2V5d29yZHNQYXRoLCB2YWx1ZSk7IH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cmluZyBMYXN0TW9kaWZpZWRCeVBhdGggPSAiY3A6bGFzdE1vZGlmaWVkQnkiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGxhc3RNb2RpZmllZEJ5IHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBMYXN0TW9kaWZpZWRCeQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhMYXN0TW9kaWZpZWRCeVBhdGgpOyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKExhc3RNb2RpZmllZEJ5UGF0aCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIExhc3RQcmludGVkUGF0aCA9ICJjcDpsYXN0UHJpbnRlZCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgbGFzdFByaW50ZWQgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIExhc3RQcmludGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKExhc3RQcmludGVkUGF0aCk7IH0KKyAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoTGFzdFByaW50ZWRQYXRoLCB2YWx1ZSk7IH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cmluZyBDcmVhdGVkUGF0aCA9ICJkY3Rlcm1zOmNyZWF0ZWQiOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKwkgICAgLy8vIEdldHMvc2V0cyB0aGUgY3JlYXRlZCBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCisJICAgIC8vLyA8L3N1bW1hcnk+CisJICAgIHB1YmxpYyBEYXRlVGltZSBDcmVhdGVkCisJICAgIHsKKwkgICAgICAgIGdldAorCSAgICAgICAgeworCSAgICAgICAgICAgIERhdGVUaW1lIGRhdGU7CisJICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLlRyeVBhcnNlKF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQ3JlYXRlZFBhdGgpLCBvdXQgZGF0ZSkgPyBkYXRlIDogRGF0ZVRpbWUuTWluVmFsdWU7CisJICAgICAgICB9CisJICAgICAgICBzZXQKKwkgICAgICAgIHsKKwkgICAgICAgICAgICB2YXIgZGF0ZVN0cmluZyA9IHZhbHVlLlRvVW5pdmVyc2FsVGltZSgpLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyAiWiI7CisJICAgICAgICAgICAgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhDcmVhdGVkUGF0aCwgZGF0ZVN0cmluZyk7CisgICAgICAgICAgICAgICAgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhDcmVhdGVkUGF0aCArICIvQHhzaTp0eXBlIiwgImRjdGVybXM6VzNDRFRGIik7CisJICAgICAgICB9CisJICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgQ2F0ZWdvcnlQYXRoID0gImNwOmNhdGVnb3J5IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBjYXRlZ29yeSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ2F0ZWdvcnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQ2F0ZWdvcnlQYXRoKTsgfQorICAgICAgICAgICAgc2V0IHsgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhDYXRlZ29yeVBhdGgsIHZhbHVlKTsgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIENvbnRlbnRTdGF0dXNQYXRoID0gImNwOmNvbnRlbnRTdGF0dXMiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIHN0YXR1cyBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU3RhdHVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKENvbnRlbnRTdGF0dXNQYXRoKTsgfQorICAgICAgICAgICAgc2V0IHsgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhDb250ZW50U3RhdHVzUGF0aCwgdmFsdWUpOyB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gRXh0ZW5kZWQgUHJvcGVydGllcworICAgICAgICAjcmVnaW9uIEV4dGVuZGVkUHJvcGVydGllc1htbAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkb2N1bWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbmRlZCBwcm9wZXJ0aWVzIG9mIHRoZSBkb2N1bWVudCAoYXBwLnhtbCkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFhtbERvY3VtZW50IEV4dGVuZGVkUHJvcGVydGllc1htbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3htbFByb3BlcnRpZXNFeHRlbmRlZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3htbFByb3BlcnRpZXNFeHRlbmRlZCA9IEdldFhtbERvY3VtZW50KHN0cmluZy5Gb3JtYXQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PFByb3BlcnRpZXMgeG1sbnM6dnQ9XCJ7MH1cIiB4bWxucz1cInsxfVwiPjwvUHJvcGVydGllcz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFWdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2Uuc2NoZW1hRXh0ZW5kZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgX3VyaVByb3BlcnRpZXNFeHRlbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmV4dGVuZGVkLXByb3BlcnRpZXMreG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9leHRlbmRlZC1wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAoX3htbFByb3BlcnRpZXNFeHRlbmRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIGNvbnN0IHN0cmluZyBBcHBsaWNhdGlvblBhdGggPSAieHA6UHJvcGVydGllcy94cDpBcHBsaWNhdGlvbiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvU2V0IHRoZSBBcHBsaWNhdGlvbiBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGV4dGVuZGVkIHByb3BlcnR5KQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEFwcGxpY2F0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfZXh0ZW5kZWRIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhBcHBsaWNhdGlvblBhdGgpOyB9CisgICAgICAgICAgICBzZXQgeyBfZXh0ZW5kZWRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhBcHBsaWNhdGlvblBhdGgsIHZhbHVlKTsgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIEh5cGVybGlua0Jhc2VQYXRoID0gInhwOlByb3BlcnRpZXMveHA6SHlwZXJsaW5rQmFzZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgSHlwZXJsaW5rQmFzZSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGV4dGVuZGVkIHByb3BlcnR5KQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVXJpIEh5cGVybGlua0Jhc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5ldyBVcmkoX2V4dGVuZGVkSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoSHlwZXJsaW5rQmFzZVBhdGgpLCBVcmlLaW5kLkFic29sdXRlKTsgfQorICAgICAgICAgICAgc2V0IHsgX2V4dGVuZGVkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoSHlwZXJsaW5rQmFzZVBhdGgsIHZhbHVlLkFic29sdXRlVXJpKTsgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nIEFwcFZlcnNpb25QYXRoID0gInhwOlByb3BlcnRpZXMveHA6QXBwVmVyc2lvbiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMvU2V0IHRoZSBBcHBWZXJzaW9uIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoZXh0ZW5kZWQgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQXBwVmVyc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2V4dGVuZGVkSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQXBwVmVyc2lvblBhdGgpOyB9CisgICAgICAgICAgICBzZXQgeyBfZXh0ZW5kZWRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhBcHBWZXJzaW9uUGF0aCwgdmFsdWUpOyB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIENvbXBhbnlQYXRoID0gInhwOlByb3BlcnRpZXMveHA6Q29tcGFueSI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBDb21wYW55IHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoZXh0ZW5kZWQgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29tcGFueQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2V4dGVuZGVkSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQ29tcGFueVBhdGgpOyB9CisgICAgICAgICAgICBzZXQgeyBfZXh0ZW5kZWRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhDb21wYW55UGF0aCwgdmFsdWUpOyB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgTWFuYWdlclBhdGggPSAieHA6UHJvcGVydGllcy94cDpNYW5hZ2VyIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBNYW5hZ2VyIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoZXh0ZW5kZWQgcHJvcGVydHkpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTWFuYWdlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2V4dGVuZGVkSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoTWFuYWdlclBhdGgpOyB9CisgICAgICAgICAgICBzZXQgeyBfZXh0ZW5kZWRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhNYW5hZ2VyUGF0aCwgdmFsdWUpOyB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgTW9kaWZpZWRQYXRoID0gImRjdGVybXM6bW9kaWZpZWQiOworCSAgICAvLy8gPHN1bW1hcnk+CisJICAgIC8vLyBHZXRzL3NldHMgdGhlIG1vZGlmaWVkIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKwkgICAgLy8vIDwvc3VtbWFyeT4KKwkgICAgcHVibGljIERhdGVUaW1lIE1vZGlmaWVkCisJICAgIHsKKwkgICAgICAgIGdldAorCSAgICAgICAgeworCSAgICAgICAgICAgIERhdGVUaW1lIGRhdGU7CisJICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLlRyeVBhcnNlKF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoTW9kaWZpZWRQYXRoKSwgb3V0IGRhdGUpID8gZGF0ZSA6IERhdGVUaW1lLk1pblZhbHVlOworCSAgICAgICAgfQorCSAgICAgICAgc2V0CisJICAgICAgICB7CisJICAgICAgICAgICAgdmFyIGRhdGVTdHJpbmcgPSB2YWx1ZS5Ub1VuaXZlcnNhbFRpbWUoKS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgIloiOworCSAgICAgICAgICAgIF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoTW9kaWZpZWRQYXRoLCBkYXRlU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKE1vZGlmaWVkUGF0aCArICIvQHhzaTp0eXBlIiwgImRjdGVybXM6VzNDRFRGIik7CisJICAgICAgICB9CisJICAgIH0KKworICAgICAgICAjcmVnaW9uIEdldCBhbmQgU2V0IEV4dGVuZGVkIFByb3BlcnRpZXMKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0RXh0ZW5kZWRQcm9wZXJ0eVZhbHVlKHN0cmluZyBwcm9wZXJ0eU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXRWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBzdHJpbmcgc2VhcmNoU3RyaW5nID0gc3RyaW5nLkZvcm1hdCgieHA6UHJvcGVydGllcy94cDp7MH0iLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgWG1sTm9kZSBub2RlID0gRXh0ZW5kZWRQcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoc2VhcmNoU3RyaW5nLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSBub2RlLklubmVyVGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIEN1c3RvbSBQcm9wZXJ0aWVzCisKKyAgICAgICAgI3JlZ2lvbiBDdXN0b21Qcm9wZXJ0aWVzWG1sCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIGRvY3VtZW50IHdoaWNoIGhvbGRzIHRoZSBkb2N1bWVudCdzIGN1c3RvbSBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBYbWxEb2N1bWVudCBDdXN0b21Qcm9wZXJ0aWVzWG1sCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfeG1sUHJvcGVydGllc0N1c3RvbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3htbFByb3BlcnRpZXNDdXN0b20gPSBHZXRYbWxEb2N1bWVudChzdHJpbmcuRm9ybWF0KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIiA/PjxQcm9wZXJ0aWVzIHhtbG5zOnZ0PVwiezB9XCIgeG1sbnM9XCJ7MX1cIj48L1Byb3BlcnRpZXM+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2Uuc2NoZW1hVnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYUN1c3RvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX3VyaVByb3BlcnRpZXNDdXN0b20sIAorICAgICAgICAgICAgICAgICAgICAgICAgIEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmN1c3RvbS1wcm9wZXJ0aWVzK3htbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2N1c3RvbS1wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAoX3htbFByb3BlcnRpZXNDdXN0b20pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIEdldCBhbmQgU2V0IEN1c3RvbSBQcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgY3VzdG9tIHByb3BlcnR5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb2JqZWN0IEdldEN1c3RvbVByb3BlcnR5VmFsdWUoc3RyaW5nIHByb3BlcnR5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHNlYXJjaFN0cmluZyA9IHN0cmluZy5Gb3JtYXQoImN0cDpQcm9wZXJ0aWVzL2N0cDpwcm9wZXJ0eVtAbmFtZT0nezB9J10iLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgWG1sRWxlbWVudCBub2RlID0gQ3VzdG9tUHJvcGVydGllc1htbC5TZWxlY3RTaW5nbGVOb2RlKHNlYXJjaFN0cmluZywgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gbm9kZS5MYXN0Q2hpbGQuSW5uZXJUZXh0OworICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5MYXN0Q2hpbGQuTG9jYWxOYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiZmlsZXRpbWUiOgorICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgZHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZVRpbWUuVHJ5UGFyc2UodmFsdWUsIG91dCBkdCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlICJpNCI6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UodmFsdWUsIG91dCBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAicjgiOgorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgZCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImJvb2wiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJ0cnVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJmYWxzZSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbG93cyB5b3UgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IG9yIGNyZWF0ZSB5b3VyIG93biBjdXN0b20gcHJvcGVydHkuICAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9wZXJ0eU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKHN0cmluZyBwcm9wZXJ0eU5hbWUsIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sTm9kZSBhbGxQcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNYbWwuU2VsZWN0U2luZ2xlTm9kZShAImN0cDpQcm9wZXJ0aWVzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgIHZhciBwcm9wID0gc3RyaW5nLkZvcm1hdCgiY3RwOlByb3BlcnRpZXMvY3RwOnByb3BlcnR5W0BuYW1lPSd7MH0nXSIsIHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBYbWxFbGVtZW50IG5vZGUgPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUocHJvcCwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBpZDsKKyAgICAgICAgICAgICAgICB2YXIgTWF4Tm9kZSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuU2VsZWN0U2luZ2xlTm9kZSgiY3RwOlByb3BlcnRpZXMvY3RwOnByb3BlcnR5W25vdChAcGlkIDw9IHByZWNlZGluZy1zaWJsaW5nOjpjdHA6cHJvcGVydHkvQHBpZCkgYW5kIG5vdChAcGlkIDw9IGZvbGxvd2luZy1zaWJsaW5nOjpjdHA6cHJvcGVydHkvQHBpZCldIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKE1heE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpZCA9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW50LlRyeVBhcnNlKE1heE5vZGUuQXR0cmlidXRlc1sicGlkIl0uVmFsdWUsIG91dCBwaWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWQgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBpZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJwcm9wZXJ0eSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDdXN0b20pOworICAgICAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJmbXRpZCIsICJ7RDVDREQ1MDUtMkU5Qy0xMDFCLTkzOTctMDgwMDJCMkNGOUFFfSIpOworICAgICAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJwaWQiLCBwaWQuVG9TdHJpbmcoKSk7ICAvLyBjdXN0b20gcHJvcGVydHkgcGlkCisgICAgICAgICAgICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBwcm9wZXJ0eU5hbWUpOworCisgICAgICAgICAgICAgICAgYWxsUHJvcHMuQXBwZW5kQ2hpbGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUuQ2hpbGROb2Rlcy5Db3VudCA+IDApIG5vZGUuUmVtb3ZlQ2hpbGQobm9kZS5DaGlsZE5vZGVzWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhtbEVsZW1lbnQgdmFsdWVFbGVtOworICAgICAgICAgICAgaWYgKHZhbHVlIGlzIGJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJib29sIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVZ0KTsKKyAgICAgICAgICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgRGF0ZVRpbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJmaWxldGltZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFWdCk7CisgICAgICAgICAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9ICgoRGF0ZVRpbWUpdmFsdWUpLkFkZEhvdXJzKC0xKS5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzc1oiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIHNob3J0IHx8IHZhbHVlIGlzIGludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZUVsZW0gPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLkNyZWF0ZUVsZW1lbnQoInZ0IiwgImk0IiwgRXhjZWxQYWNrYWdlLnNjaGVtYVZ0KTsKKyAgICAgICAgICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIGRvdWJsZSB8fCB2YWx1ZSBpcyBkZWNpbWFsIHx8IHZhbHVlIGlzIGZsb2F0IHx8IHZhbHVlIGlzIGxvbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJyOCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFWdCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGlzIGRvdWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSAoKGRvdWJsZSl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIGZsb2F0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9ICgoZmxvYXQpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBkZWNpbWFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9ICgoZGVjaW1hbCl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZUVsZW0gPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLkNyZWF0ZUVsZW1lbnQoInZ0IiwgImxwd3N0ciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFWdCk7CisgICAgICAgICAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlLkFwcGVuZENoaWxkKHZhbHVlRWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBTYXZlCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhdmVzIHRoZSBkb2N1bWVudCBwcm9wZXJ0aWVzIGJhY2sgdG8gdGhlIHBhY2thZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHZvaWQgU2F2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfeG1sUHJvcGVydGllc0NvcmUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFja2FnZS5TYXZlUGFydChfdXJpUHJvcGVydGllc0NvcmUsIF94bWxQcm9wZXJ0aWVzQ29yZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX3htbFByb3BlcnRpZXNFeHRlbmRlZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYWNrYWdlLlNhdmVQYXJ0KF91cmlQcm9wZXJ0aWVzRXh0ZW5kZWQsIF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF94bWxQcm9wZXJ0aWVzQ3VzdG9tICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZVBhcnQoX3VyaVByb3BlcnRpZXNDdXN0b20sIF94bWxQcm9wZXJ0aWVzQ3VzdG9tKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9PcGVuT2ZmaWNlWG1sLnNuayBiL0VQUGx1cy9PcGVuT2ZmaWNlWG1sLnNuawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA2N2JlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL09wZW5PZmZpY2VYbWwuc25rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0NSQzMyLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvQ1JDMzIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5NTc0ZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0NSQzMyLmNzCkBAIC0wLDAgKzEsODE0IEBACisvLyBDUkMzMi5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDExIERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBMYXN0IFNhdmVkOiA8MjAxMS1BdWd1c3QtMDIgMTg6MjU6NTQ+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgQ1JDMzIgY2xhc3MsIHdoaWNoIGNhbiBkbyB0aGUgQ1JDMzIgYWxnb3JpdGhtLCB1c2luZworLy8gYXJiaXRyYXJ5IHN0YXJ0aW5nIHBvbHlub21pYWxzLCBhbmQgYml0IHJldmVyc2FsLiBUaGUgYml0IHJldmVyc2FsIGlzIHdoYXQKKy8vIGRpc3Rpbmd1aXNoZXMgdGhpcyBDUkMtMzIgdXNlZCBpbiBCWmlwMiBmcm9tIHRoZSBDUkMtMzIgdGhhdCBpcyB1c2VkIGluIFBLWklQCisvLyBmaWxlcywgb3IgR1pJUCBmaWxlcy4gVGhpcyBjbGFzcyBkb2VzIGJvdGguCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgSW50ZXJvcCA9IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLkNyYworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBDb21wdXRlcyBhIENSQy0zMi4gVGhlIENSQy0zMiBhbGdvcml0aG0gaXMgcGFyYW1ldGVyaXplZCAtIHlvdQorICAgIC8vLyAgIGNhbiBzZXQgdGhlIHBvbHlub21pYWwgYW5kIGVuYWJsZSBvciBkaXNhYmxlIGJpdAorICAgIC8vLyAgIHJldmVyc2FsLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBHWklQLCBCWmlwMiwgb3IgWklQLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgRG90TmV0WmlwOyBpdCBpcyBnZW5lcmFsbHkgbm90IHVzZWQKKyAgICAvLy8gICBkaXJlY3RseSBieSBhcHBsaWNhdGlvbnMgd2lzaGluZyB0byBjcmVhdGUsIHJlYWQsIG9yIG1hbmlwdWxhdGUgemlwCisgICAgLy8vICAgYXJjaGl2ZSBmaWxlcy4KKyAgICAvLy8gPC9yZW1hcmtzPgorCisgICAgW0ludGVyb3AuR3VpZEF0dHJpYnV0ZSgiZWJjMjVjZjYtOTEyMC00MjgzLWI5NzItMGU1NTIwZDAwMDBDIildCisgICAgW0ludGVyb3AuQ29tVmlzaWJsZSh0cnVlKV0KKyNpZiAhTkVUQ0YKKyAgICBbSW50ZXJvcC5DbGFzc0ludGVyZmFjZShJbnRlcm9wLkNsYXNzSW50ZXJmYWNlVHlwZS5BdXRvRGlzcGF0Y2gpXQorI2VuZGlmCisgICAgaW50ZXJuYWwgY2xhc3MgQ1JDMzIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgSW5kaWNhdGVzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYXBwbGllZCB0byB0aGUgQ1JDLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgSW50NjQgVG90YWxCeXRlc1JlYWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9Ub3RhbEJ5dGVzUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGUgY3VycmVudCBDUkMgZm9yIGFsbCBibG9ja3Mgc2x1cnBlZCBpbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEludDMyIENyYzMyUmVzdWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB1bmNoZWNrZWQoKEludDMyKSh+X3JlZ2lzdGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBDUkMzMiBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBzdHJlYW0gb3ZlciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIENSQzMyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBDUkMzMiBjYWxjdWxhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEludDMyIEdldENyYzMyKFN5c3RlbS5JTy5TdHJlYW0gaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRDcmMzMkFuZENvcHkoaW5wdXQsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgQ1JDMzIgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLCBhbmQgd3JpdGVzIHRoZSBpbnB1dCBpbnRvIHRoZQorICAgICAgICAvLy8gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmVhbSBvdmVyIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgQ1JDMzI8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dCI+VGhlIHN0cmVhbSBpbnRvIHdoaWNoIHRvIGRlZmxhdGUgdGhlIGlucHV0PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBDUkMzMiBjYWxjdWxhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEludDMyIEdldENyYzMyQW5kQ29weShTeXN0ZW0uSU8uU3RyZWFtIGlucHV0LCBTeXN0ZW0uSU8uU3RyZWFtIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIGlucHV0IHN0cmVhbSBtdXN0IG5vdCBiZSBudWxsLiIpOworCisgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgICAgIGludCByZWFkU2l6ZSA9IEJVRkZFUl9TSVpFOworCisgICAgICAgICAgICAgICAgX1RvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgcmVhZFNpemUpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgb3V0cHV0LldyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgIF9Ub3RhbEJ5dGVzUmVhZCArPSBjb3VudDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2x1cnBCbG9jayhidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgcmVhZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIG91dHB1dC5Xcml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgX1RvdGFsQnl0ZXNSZWFkICs9IGNvdW50OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAoSW50MzIpKH5fcmVnaXN0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEdldCB0aGUgQ1JDMzIgZm9yIHRoZSBnaXZlbiAod29yZCxieXRlKSBjb21iby4gIFRoaXMgaXMgYQorICAgICAgICAvLy8gICBjb21wdXRhdGlvbiBkZWZpbmVkIGJ5IFBLemlwIGZvciBQS1pJUCAyLjAgKHdlYWspIGVuY3J5cHRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVyI+VGhlIHdvcmQgdG8gc3RhcnQgd2l0aC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkIiPlRoZSBieXRlIHRvIGNvbWJpbmUgaXQgd2l0aC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIENSQy1pemVkIHJlc3VsdC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJbnQzMiBDb21wdXRlQ3JjMzIoSW50MzIgVywgYnl0ZSBCKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX0ludGVybmFsQ29tcHV0ZUNyYzMyKChVSW50MzIpVywgQik7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBJbnQzMiBfSW50ZXJuYWxDb21wdXRlQ3JjMzIoVUludDMyIFcsIGJ5dGUgQikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChJbnQzMikoY3JjMzJUYWJsZVsoVyBeIEIpICYgMHhGRl0gXiAoVyA+PiA4KSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVwZGF0ZSB0aGUgdmFsdWUgZm9yIHRoZSBydW5uaW5nIENSQzMyIHVzaW5nIHRoZSBnaXZlbiBibG9jayBvZiBieXRlcy4KKyAgICAgICAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgdGhlIENSQzMyKCkgY2xhc3MgaW4gYSBTdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYmxvY2siPmJsb2NrIG9mIGJ5dGVzIHRvIHNsdXJwPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnN0YXJ0aW5nIHBvaW50IGluIHRoZSBibG9jazwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPmhvdyBtYW55IGJ5dGVzIHdpdGhpbiB0aGUgYmxvY2sgdG8gc2x1cnA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTbHVycEJsb2NrKGJ5dGVbXSBibG9jaywgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmxvY2sgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgZGF0YSBidWZmZXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKKworICAgICAgICAgICAgLy8gYnppcCBhbGdvcml0aG0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IG9mZnNldCArIGk7CisgICAgICAgICAgICAgICAgYnl0ZSBiID0gYmxvY2tbeF07CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucmV2ZXJzZUJpdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVSW50MzIgdGVtcCA9IChfcmVnaXN0ZXIgPj4gMjQpIF4gYjsKKyAgICAgICAgICAgICAgICAgICAgX3JlZ2lzdGVyID0gKF9yZWdpc3RlciA8PCA4KSBeIGNyYzMyVGFibGVbdGVtcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiB0ZW1wID0gKF9yZWdpc3RlciAmIDB4MDAwMDAwRkYpIF4gYjsKKyAgICAgICAgICAgICAgICAgICAgX3JlZ2lzdGVyID0gKF9yZWdpc3RlciA+PiA4KSBeIGNyYzMyVGFibGVbdGVtcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX1RvdGFsQnl0ZXNSZWFkICs9IGNvdW50OworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFByb2Nlc3Mgb25lIGJ5dGUgaW4gdGhlIENSQy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lID0gImIiPnRoZSBieXRlIHRvIGluY2x1ZGUgaW50byB0aGUgQ1JDIC4gIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUNSQyhieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnJldmVyc2VCaXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVJbnQzMiB0ZW1wID0gKF9yZWdpc3RlciA+PiAyNCkgXiBiOworICAgICAgICAgICAgICAgIF9yZWdpc3RlciA9IChfcmVnaXN0ZXIgPDwgOCkgXiBjcmMzMlRhYmxlW3RlbXBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVJbnQzMiB0ZW1wID0gKF9yZWdpc3RlciAmIDB4MDAwMDAwRkYpIF4gYjsKKyAgICAgICAgICAgICAgICBfcmVnaXN0ZXIgPSAoX3JlZ2lzdGVyID4+IDgpIF4gY3JjMzJUYWJsZVt0ZW1wXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUHJvY2VzcyBhIHJ1biBvZiBOIGlkZW50aWNhbCBieXRlcyBpbnRvIHRoZSBDUkMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBtZXRob2Qgc2VydmVzIGFzIGFuIG9wdGltaXphdGlvbiBmb3IgdXBkYXRpbmcgdGhlIENSQyB3aGVuIGEKKyAgICAgICAgLy8vICAgICBydW4gb2YgaWRlbnRpY2FsIGJ5dGVzIGlzIGZvdW5kLiBSYXRoZXIgdGhhbiBwYXNzaW5nIGluIGEgYnVmZmVyIG9mCisgICAgICAgIC8vLyAgICAgbGVuZ3RoIG4sIGNvbnRhaW5pbmcgYWxsIGlkZW50aWNhbCBieXRlcyBiLCB0aGlzIG1ldGhvZCBhY2NlcHRzIHRoZQorICAgICAgICAvLy8gICAgIGJ5dGUgdmFsdWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlICh2aXJ0dWFsKSBidWZmZXIgLSB0aGUgbGVuZ3RoIG9mCisgICAgICAgIC8vLyAgICAgdGhlIHJ1bi4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWUgPSAiYiI+dGhlIGJ5dGUgdG8gaW5jbHVkZSBpbnRvIHRoZSBDUkMuICA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWUgPSAibiI+dGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGJ5dGUgc2hvdWxkIGJlIHJlcGVhdGVkLiA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVDUkMoYnl0ZSBiLCBpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKG4tLSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucmV2ZXJzZUJpdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50IHRlbXAgPSAoX3JlZ2lzdGVyID4+IDI0KSBeIGI7CisgICAgICAgICAgICAgICAgICAgIF9yZWdpc3RlciA9IChfcmVnaXN0ZXIgPDwgOCkgXiBjcmMzMlRhYmxlWyh0ZW1wID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGVtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh0ZW1wICsgMjU2KV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiB0ZW1wID0gKF9yZWdpc3RlciAmIDB4MDAwMDAwRkYpIF4gYjsKKyAgICAgICAgICAgICAgICAgICAgX3JlZ2lzdGVyID0gKF9yZWdpc3RlciA+PiA4KSBeIGNyYzMyVGFibGVbKHRlbXAgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0ZW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRlbXAgKyAyNTYpXTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB1aW50IFJldmVyc2VCaXRzKHVpbnQgZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludCByZXQgPSBkYXRhOworICAgICAgICAgICAgICAgIHJldCA9IChyZXQgJiAweDU1NTU1NTU1KSA8PCAxIHwgKHJldCA+PiAxKSAmIDB4NTU1NTU1NTU7CisgICAgICAgICAgICAgICAgcmV0ID0gKHJldCAmIDB4MzMzMzMzMzMpIDw8IDIgfCAocmV0ID4+IDIpICYgMHgzMzMzMzMzMzsKKyAgICAgICAgICAgICAgICByZXQgPSAocmV0ICYgMHgwRjBGMEYwRikgPDwgNCB8IChyZXQgPj4gNCkgJiAweDBGMEYwRjBGOworICAgICAgICAgICAgICAgIHJldCA9IChyZXQgPDwgMjQpIHwgKChyZXQgJiAweEZGMDApIDw8IDgpIHwgKChyZXQgPj4gOCkgJiAweEZGMDApIHwgKHJldCA+PiAyNCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgUmV2ZXJzZUJpdHMoYnl0ZSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50IHUgPSAodWludClkYXRhICogMHgwMDAyMDIwMjsKKyAgICAgICAgICAgICAgICB1aW50IG0gPSAweDAxMDQ0MDEwOworICAgICAgICAgICAgICAgIHVpbnQgcyA9IHUgJiBtOworICAgICAgICAgICAgICAgIHVpbnQgdCA9ICh1IDw8IDIpICYgKG0gPDwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoMHgwMTAwMTAwMSAqIChzICsgdCkpID4+IDI0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHZvaWQgR2VuZXJhdGVMb29rdXBUYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyYzMyVGFibGUgPSBuZXcgVUludDMyWzI1Nl07CisgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVSW50MzIgZHdDcmM7CisgICAgICAgICAgICAgICAgYnl0ZSBpID0gMDsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHdDcmMgPSBpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGJ5dGUgaiA9IDg7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZHdDcmMgJiAxKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q3JjID0gKGR3Q3JjID4+IDEpIF4gZHdQb2x5bm9taWFsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q3JjID4+PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlQml0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JjMzJUYWJsZVtSZXZlcnNlQml0cyhpKV0gPSBSZXZlcnNlQml0cyhkd0NyYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmMzMlRhYmxlW2ldID0gZHdDcmM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkhPTApOworICAgICAgICAgICAgfQorCisjaWYgVkVSQk9TRQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwcml2YXRlIHN0YXRpYyByZWFkb25seSBVSW50MzJbXSBjcmMzMlRhYmxlID0geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcmMzMlRhYmxlLkxlbmd0aDsgaSs9NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgICAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCA0OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgMHh7MDpYOH1VLCIsIGNyYzMyVGFibGVbaStqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifTsiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisjZW5kaWYKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB1aW50IGdmMl9tYXRyaXhfdGltZXModWludFtdIG1hdHJpeCwgdWludCB2ZWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGludCBpPTA7CisgICAgICAgICAgICB3aGlsZSAodmVjICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh2ZWMgJiAweDAxKT09IDB4MDEpCisgICAgICAgICAgICAgICAgICAgIHN1bSBePSBtYXRyaXhbaV07CisgICAgICAgICAgICAgICAgdmVjID4+PSAxOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdW07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUodWludFtdIHNxdWFyZSwgdWludFtdIG1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgICAgIHNxdWFyZVtpXSA9IGdmMl9tYXRyaXhfdGltZXMobWF0LCBtYXRbaV0pOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ29tYmluZXMgdGhlIGdpdmVuIENSQzMyIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgcnVubmluZyB0b3RhbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGEgZGl2aWRlLWFuZC1jb25xdWVyIGFwcHJvYWNoIHRvCisgICAgICAgIC8vLyAgIGNhbGN1bGF0aW5nIGEgQ1JDLiAgTXVsdGlwbGUgdGhyZWFkcyBjYW4gZWFjaCBjYWxjdWxhdGUgYQorICAgICAgICAvLy8gICBDUkMzMiBvbiBhIHNlZ21lbnQgb2YgdGhlIGRhdGEsIGFuZCB0aGVuIGNvbWJpbmUgdGhlCisgICAgICAgIC8vLyAgIGluZGl2aWR1YWwgQ1JDMzIgdmFsdWVzIGF0IHRoZSBlbmQuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY3JjIj50aGUgY3JjIHZhbHVlIHRvIGJlIGNvbWJpbmVkIHdpdGggdGhpcyBvbmU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imxlbmd0aCI+dGhlIGxlbmd0aCBvZiBkYXRhIHRoZSBDUkMgdmFsdWUgd2FzIGNhbGN1bGF0ZWQgb248L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBDb21iaW5lKGludCBjcmMsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnRbXSBldmVuID0gbmV3IHVpbnRbMzJdOyAgICAgLy8gZXZlbi1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IKKyAgICAgICAgICAgIHVpbnRbXSBvZGQgPSBuZXcgdWludFszMl07ICAgICAgLy8gb2RkLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvcgorCisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB1aW50IGNyYzE9IH5fcmVnaXN0ZXI7CisgICAgICAgICAgICB1aW50IGNyYzI9ICh1aW50KSBjcmM7CisKKyAgICAgICAgICAgIC8vIHB1dCBvcGVyYXRvciBmb3Igb25lIHplcm8gYml0IGluIG9kZAorICAgICAgICAgICAgb2RkWzBdID0gdGhpcy5kd1BvbHlub21pYWw7ICAvLyB0aGUgQ1JDLTMyIHBvbHlub21pYWwKKyAgICAgICAgICAgIHVpbnQgcm93ID0gMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMzI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZGRbaV0gPSByb3c7CisgICAgICAgICAgICAgICAgcm93IDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwdXQgb3BlcmF0b3IgZm9yIHR3byB6ZXJvIGJpdHMgaW4gZXZlbgorICAgICAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKKworICAgICAgICAgICAgLy8gcHV0IG9wZXJhdG9yIGZvciBmb3VyIHplcm8gYml0cyBpbiBvZGQKKyAgICAgICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisKKyAgICAgICAgICAgIHVpbnQgbGVuMiA9ICh1aW50KSBsZW5ndGg7CisKKyAgICAgICAgICAgIC8vIGFwcGx5IGxlbjIgemVyb3MgdG8gY3JjMSAoZmlyc3Qgc3F1YXJlIHdpbGwgcHV0IHRoZSBvcGVyYXRvciBmb3Igb25lCisgICAgICAgICAgICAvLyB6ZXJvIGJ5dGUsIGVpZ2h0IHplcm8gYml0cywgaW4gZXZlbikKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAvLyBhcHBseSB6ZXJvcyBvcGVyYXRvciBmb3IgdGhpcyBiaXQgb2YgbGVuMgorICAgICAgICAgICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKGV2ZW4sIG9kZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGxlbjIgJiAxKT09IDEpCisgICAgICAgICAgICAgICAgICAgIGNyYzEgPSBnZjJfbWF0cml4X3RpbWVzKGV2ZW4sIGNyYzEpOworICAgICAgICAgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHdpdGggb2RkIGFuZCBldmVuIHN3YXBwZWQKKyAgICAgICAgICAgICAgICBnZjJfbWF0cml4X3NxdWFyZShvZGQsIGV2ZW4pOworICAgICAgICAgICAgICAgIGlmICgobGVuMiAmIDEpPT0xKQorICAgICAgICAgICAgICAgICAgICBjcmMxID0gZ2YyX21hdHJpeF90aW1lcyhvZGQsIGNyYzEpOworICAgICAgICAgICAgICAgIGxlbjIgPj49IDE7CisKKworICAgICAgICAgICAgfSB3aGlsZSAobGVuMiAhPSAwKTsKKworICAgICAgICAgICAgY3JjMSBePSBjcmMyOworCisgICAgICAgICAgICBfcmVnaXN0ZXI9IH5jcmMxOworCisgICAgICAgICAgICAvL3JldHVybiAoaW50KSBjcmMxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQ1JDMzIgY2xhc3MgdXNpbmcgdGhlIGRlZmF1bHQgc2V0dGluZ3M6IG5vCisgICAgICAgIC8vLyAgIGJpdCByZXZlcnNhbCwgYW5kIGEgcG9seW5vbWlhbCBvZiAweEVEQjg4MzIwLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQ1JDMzIoKSA6IHRoaXMoZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDUkMzMiBjbGFzcywgc3BlY2lmeWluZyB3aGV0aGVyIHRvIHJldmVyc2UKKyAgICAgICAgLy8vICAgZGF0YSBiaXRzIG9yIG5vdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSdyZXZlcnNlQml0cyc+CisgICAgICAgIC8vLyAgIHNwZWNpZnkgdHJ1ZSBpZiB0aGUgaW5zdGFuY2Ugc2hvdWxkIHJldmVyc2UgZGF0YSBiaXRzLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBJbiB0aGUgQ1JDLTMyIHVzZWQgYnkgQlppcDIsIHRoZSBiaXRzIGFyZSByZXZlcnNlZC4gVGhlcmVmb3JlIGlmIHlvdQorICAgICAgICAvLy8gICAgIHdhbnQgYSBDUkMzMiB3aXRoIGNvbXBhdGliaWxpdHkgd2l0aCBCWmlwMiwgeW91IHNob3VsZCBwYXNzIHRydWUKKyAgICAgICAgLy8vICAgICBoZXJlLiBJbiB0aGUgQ1JDLTMyIHVzZWQgYnkgR1pJUCBhbmQgUEtaSVAsIHRoZSBiaXRzIGFyZSBub3QKKyAgICAgICAgLy8vICAgICByZXZlcnNlZDsgVGhlcmVmb3JlIGlmIHlvdSB3YW50IGEgQ1JDMzIgd2l0aCBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgLy8vICAgICB0aG9zZSwgeW91IHNob3VsZCBwYXNzIGZhbHNlLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBDUkMzMihib29sIHJldmVyc2VCaXRzKSA6CisgICAgICAgICAgICB0aGlzKCB1bmNoZWNrZWQoKGludCkweEVEQjg4MzIwKSwgcmV2ZXJzZUJpdHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENSQzMyIGNsYXNzLCBzcGVjaWZ5aW5nIHRoZSBwb2x5bm9taWFsIGFuZAorICAgICAgICAvLy8gICB3aGV0aGVyIHRvIHJldmVyc2UgZGF0YSBiaXRzIG9yIG5vdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSdwb2x5bm9taWFsJz4KKyAgICAgICAgLy8vICAgVGhlIHBvbHlub21pYWwgdG8gdXNlIGZvciB0aGUgQ1JDLCBleHByZXNzZWQgaW4gdGhlIHJldmVyc2VkIChMU0IpCisgICAgICAgIC8vLyAgIGZvcm1hdDogdGhlIGhpZ2hlc3Qgb3JkZXJlZCBiaXQgaW4gdGhlIHBvbHlub21pYWwgdmFsdWUgaXMgdGhlCisgICAgICAgIC8vLyAgIGNvZWZmaWNpZW50IG9mIHRoZSAwdGggcG93ZXI7IHRoZSBzZWNvbmQtaGlnaGVzdCBvcmRlciBiaXQgaXMgdGhlCisgICAgICAgIC8vLyAgIGNvZWZmaWNpZW50IG9mIHRoZSAxIHBvd2VyLCBhbmQgc28gb24uIEV4cHJlc3NlZCB0aGlzIHdheSwgdGhlCisgICAgICAgIC8vLyAgIHBvbHlub21pYWwgZm9yIHRoZSBDUkMtMzJDIHVzZWQgaW4gSUVFRSA4MDIuMywgaXMgMHhFREI4ODMyMC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ncmV2ZXJzZUJpdHMnPgorICAgICAgICAvLy8gICBzcGVjaWZ5IHRydWUgaWYgdGhlIGluc3RhbmNlIHNob3VsZCByZXZlcnNlIGRhdGEgYml0cy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIEluIHRoZSBDUkMtMzIgdXNlZCBieSBCWmlwMiwgdGhlIGJpdHMgYXJlIHJldmVyc2VkLiBUaGVyZWZvcmUgaWYgeW91CisgICAgICAgIC8vLyAgICAgd2FudCBhIENSQzMyIHdpdGggY29tcGF0aWJpbGl0eSB3aXRoIEJaaXAyLCB5b3Ugc2hvdWxkIHBhc3MgdHJ1ZQorICAgICAgICAvLy8gICAgIGhlcmUgZm9yIHRoZSA8Yz5yZXZlcnNlQml0czwvYz4gcGFyYW1ldGVyLiBJbiB0aGUgQ1JDLTMyIHVzZWQgYnkKKyAgICAgICAgLy8vICAgICBHWklQIGFuZCBQS1pJUCwgdGhlIGJpdHMgYXJlIG5vdCByZXZlcnNlZDsgVGhlcmVmb3JlIGlmIHlvdSB3YW50IGEKKyAgICAgICAgLy8vICAgICBDUkMzMiB3aXRoIGNvbXBhdGliaWxpdHkgd2l0aCB0aG9zZSwgeW91IHNob3VsZCBwYXNzIGZhbHNlIGZvciB0aGUKKyAgICAgICAgLy8vICAgICA8Yz5yZXZlcnNlQml0czwvYz4gcGFyYW1ldGVyLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBDUkMzMihpbnQgcG9seW5vbWlhbCwgYm9vbCByZXZlcnNlQml0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yZXZlcnNlQml0cyA9IHJldmVyc2VCaXRzOworICAgICAgICAgICAgdGhpcy5kd1BvbHlub21pYWwgPSAodWludCkgcG9seW5vbWlhbDsKKyAgICAgICAgICAgIHRoaXMuR2VuZXJhdGVMb29rdXBUYWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZXNldCB0aGUgQ1JDLTMyIGNsYXNzIC0gY2xlYXIgdGhlIENSQyAicmVtYWluZGVyIHJlZ2lzdGVyLiIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBVc2UgdGhpcyB3aGVuIGVtcGxveWluZyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIGNvbXB1dGUKKyAgICAgICAgLy8vICAgICBtdWx0aXBsZSwgZGlzdGluY3QgQ1JDcyBvbiBtdWx0aXBsZSwgZGlzdGluY3QgZGF0YSBibG9ja3MuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBfcmVnaXN0ZXIgPSAweEZGRkZGRkZGVTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaXZhdGUgbWVtYmVyIHZhcnMKKyAgICAgICAgcHJpdmF0ZSBVSW50MzIgZHdQb2x5bm9taWFsOworICAgICAgICBwcml2YXRlIEludDY0IF9Ub3RhbEJ5dGVzUmVhZDsKKyAgICAgICAgcHJpdmF0ZSBib29sIHJldmVyc2VCaXRzOworICAgICAgICBwcml2YXRlIFVJbnQzMltdIGNyYzMyVGFibGU7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKyAgICAgICAgcHJpdmF0ZSBVSW50MzIgX3JlZ2lzdGVyID0gMHhGRkZGRkZGRlU7CisgICAgfQorCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgU3RyZWFtIHRoYXQgY2FsY3VsYXRlcyBhIENSQzMyIChhIGNoZWNrc3VtKSBvbiBhbGwgYnl0ZXMgcmVhZCwKKyAgICAvLy8gb3Igb24gYWxsIGJ5dGVzIHdyaXR0ZW4uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIDxwYXJhPgorICAgIC8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgQ1JDIG9mIGEgWmlwRW50cnkgd2hlbgorICAgIC8vLyByZWFkaW5nIGZyb20gYSBzdHJlYW0sIG9yIHRvIGNhbGN1bGF0ZSBhIENSQyB3aGVuIHdyaXRpbmcgdG8gYQorICAgIC8vLyBzdHJlYW0uICBUaGUgc3RyZWFtIHNob3VsZCBiZSB1c2VkIHRvIGVpdGhlciByZWFkLCBvciB3cml0ZSwgYnV0CisgICAgLy8vIG5vdCBib3RoLiAgSWYgeW91IGludGVybWl4IHJlYWRzIGFuZCB3cml0ZXMsIHRoZSByZXN1bHRzIGFyZSBub3QKKyAgICAvLy8gZGVmaW5lZC4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIHVzZSBpbnRlcm5hbGx5IGJ5IHRoZQorICAgIC8vLyBEb3ROZXRaaXAgbGlicmFyeS4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgaW50ZXJuYWwgY2xhc3MgQ3JjQ2FsY3VsYXRvclN0cmVhbSA6IFN5c3RlbS5JTy5TdHJlYW0sIFN5c3RlbS5JRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSW50NjQgVW5zZXRMZW5ndGhMaW1pdCA9IC05OTsKKworICAgICAgICBpbnRlcm5hbCBTeXN0ZW0uSU8uU3RyZWFtIF9pbm5lclN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBDUkMzMiBfQ3JjMzI7CisgICAgICAgIHByaXZhdGUgSW50NjQgX2xlbmd0aExpbWl0ID0gLTk5OworICAgICAgICBwcml2YXRlIGJvb2wgX2xlYXZlT3BlbjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBJbnN0YW5jZXMgcmV0dXJuZWQgZnJvbSB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgbGVhdmUgdGhlIHVuZGVybHlpbmcKKyAgICAgICAgLy8vICAgICBzdHJlYW0gb3BlbiB1cG9uIENsb3NlKCkuICBUaGUgc3RyZWFtIHVzZXMgdGhlIGRlZmF1bHQgQ1JDMzIKKyAgICAgICAgLy8vICAgICBhbGdvcml0aG0sIHdoaWNoIGltcGxpZXMgYSBwb2x5bm9taWFsIG9mIDB4RURCODgzMjAuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSB1bmRlcmx5aW5nIHN0cmVhbTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBDcmNDYWxjdWxhdG9yU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtKQorICAgICAgICAgICAgOiB0aGlzKHRydWUsIENyY0NhbGN1bGF0b3JTdHJlYW0uVW5zZXRMZW5ndGhMaW1pdCwgc3RyZWFtLCBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBjb25zdHJ1Y3RvciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGhvdyB0byBoYW5kbGUgdGhlCisgICAgICAgIC8vLyAgIHVuZGVybHlpbmcgc3RyZWFtIGF0IGNsb3NlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoZSBzdHJlYW0gdXNlcyB0aGUgZGVmYXVsdCBDUkMzMiBhbGdvcml0aG0sIHdoaWNoIGltcGxpZXMgYQorICAgICAgICAvLy8gICAgIHBvbHlub21pYWwgb2YgMHhFREI4ODMyMC4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHVuZGVybHlpbmcgc3RyZWFtPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZWF2ZU9wZW4iPnRydWUgdG8gbGVhdmUgdGhlIHVuZGVybHlpbmcgc3RyZWFtCisgICAgICAgIC8vLyBvcGVuIHVwb24gY2xvc2Ugb2YgdGhlIDxjPkNyY0NhbGN1bGF0b3JTdHJlYW08L2M+OyBmYWxzZSBvdGhlcndpc2UuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIENyY0NhbGN1bGF0b3JTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIGJvb2wgbGVhdmVPcGVuKQorICAgICAgICAgICAgOiB0aGlzKGxlYXZlT3BlbiwgQ3JjQ2FsY3VsYXRvclN0cmVhbS5VbnNldExlbmd0aExpbWl0LCBzdHJlYW0sIG51bGwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQSBjb25zdHJ1Y3RvciBhbGxvd2luZyB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0KKyAgICAgICAgLy8vICAgdG8gcmVhZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGUgc3RyZWFtIHVzZXMgdGhlIGRlZmF1bHQgQ1JDMzIgYWxnb3JpdGhtLCB3aGljaCBpbXBsaWVzIGEKKyAgICAgICAgLy8vICAgICBwb2x5bm9taWFsIG9mIDB4RURCODgzMjAuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgSW5zdGFuY2VzIHJldHVybmVkIGZyb20gdGhpcyBjb25zdHJ1Y3RvciB3aWxsIGxlYXZlIHRoZSB1bmRlcmx5aW5nCisgICAgICAgIC8vLyAgICAgc3RyZWFtIG9wZW4gdXBvbiBDbG9zZSgpLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgdW5kZXJseWluZyBzdHJlYW08L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imxlbmd0aCI+VGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtIHRvIHNsdXJwPC9wYXJhbT4KKyAgICAgICAgcHVibGljIENyY0NhbGN1bGF0b3JTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIEludDY0IGxlbmd0aCkKKyAgICAgICAgICAgIDogdGhpcyh0cnVlLCBsZW5ndGgsIHN0cmVhbSwgbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGgiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQSBjb25zdHJ1Y3RvciBhbGxvd2luZyB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0KKyAgICAgICAgLy8vICAgdG8gcmVhZCwgYXMgd2VsbCBhcyB3aGV0aGVyIHRvIGtlZXAgdGhlIHVuZGVybHlpbmcgc3RyZWFtIG9wZW4gdXBvbgorICAgICAgICAvLy8gICBDbG9zZSgpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoZSBzdHJlYW0gdXNlcyB0aGUgZGVmYXVsdCBDUkMzMiBhbGdvcml0aG0sIHdoaWNoIGltcGxpZXMgYQorICAgICAgICAvLy8gICAgIHBvbHlub21pYWwgb2YgMHhFREI4ODMyMC4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHVuZGVybHlpbmcgc3RyZWFtPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW5ndGgiPlRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbSB0byBzbHVycDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj50cnVlIHRvIGxlYXZlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQorICAgICAgICAvLy8gb3BlbiB1cG9uIGNsb3NlIG9mIHRoZSA8Yz5DcmNDYWxjdWxhdG9yU3RyZWFtPC9jPjsgZmFsc2Ugb3RoZXJ3aXNlLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBDcmNDYWxjdWxhdG9yU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBJbnQ2NCBsZW5ndGgsIGJvb2wgbGVhdmVPcGVuKQorICAgICAgICAgICAgOiB0aGlzKGxlYXZlT3BlbiwgbGVuZ3RoLCBzdHJlYW0sIG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEEgY29uc3RydWN0b3IgYWxsb3dpbmcgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtCisgICAgICAgIC8vLyAgIHRvIHJlYWQsIGFzIHdlbGwgYXMgd2hldGhlciB0byBrZWVwIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBvcGVuIHVwb24KKyAgICAgICAgLy8vICAgQ2xvc2UoKSwgYW5kIHRoZSBDUkMzMiBpbnN0YW5jZSB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhlIHN0cmVhbSB1c2VzIHRoZSBzcGVjaWZpZWQgQ1JDMzIgaW5zdGFuY2UsIHdoaWNoIGFsbG93cyB0aGUKKyAgICAgICAgLy8vICAgICBhcHBsaWNhdGlvbiB0byBzcGVjaWZ5IGhvdyB0aGUgQ1JDIGdldHMgY2FsY3VsYXRlZC4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHVuZGVybHlpbmcgc3RyZWFtPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW5ndGgiPlRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbSB0byBzbHVycDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj50cnVlIHRvIGxlYXZlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQorICAgICAgICAvLy8gb3BlbiB1cG9uIGNsb3NlIG9mIHRoZSA8Yz5DcmNDYWxjdWxhdG9yU3RyZWFtPC9jPjsgZmFsc2Ugb3RoZXJ3aXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY3JjMzIiPnRoZSBDUkMzMiBpbnN0YW5jZSB0byB1c2UgdG8gY2FsY3VsYXRlIHRoZSBDUkMzMjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBDcmNDYWxjdWxhdG9yU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBJbnQ2NCBsZW5ndGgsIGJvb2wgbGVhdmVPcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkMzMiBjcmMzMikKKyAgICAgICAgICAgIDogdGhpcyhsZWF2ZU9wZW4sIGxlbmd0aCwgc3RyZWFtLCBjcmMzMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGgiKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gVGhpcyBjdG9yIGlzIHByaXZhdGUgLSBubyB2YWxpZGF0aW9uIGlzIGRvbmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgdGhlIHVzZQorICAgICAgICAvLyBvZiBhIChzcGVjaWZpYykgbmVnYXRpdmUgdmFsdWUgZm9yIHRoZSBfbGVuZ3RoTGltaXQsIHRvIGluZGljYXRlIHRoYXQgdGhlcmUKKyAgICAgICAgLy8gaXMgbm8gbGVuZ3RoIHNldC4gIFNvIHdlIHZhbGlkYXRlIHRoZSBsZW5ndGggbGltaXQgaW4gdGhvc2UgY3RvcnMgdGhhdCB1c2UgYW4KKyAgICAgICAgLy8gZXhwbGljaXQgcGFyYW0sIG90aGVyd2lzZSB3ZSBkb24ndCB2YWxpZGF0ZSwgYmVjYXVzZSBpdCBjb3VsZCBiZSBvdXIgc3BlY2lhbAorICAgICAgICAvLyB2YWx1ZS4KKyAgICAgICAgcHJpdmF0ZSBDcmNDYWxjdWxhdG9yU3RyZWFtCisgICAgICAgICAgICAoYm9vbCBsZWF2ZU9wZW4sIEludDY0IGxlbmd0aCwgU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIENSQzMyIGNyYzMyKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lubmVyU3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgX0NyYzMyID0gY3JjMzIgPz8gbmV3IENSQzMyKCk7CisgICAgICAgICAgICBfbGVuZ3RoTGltaXQgPSBsZW5ndGg7CisgICAgICAgICAgICBfbGVhdmVPcGVuID0gbGVhdmVPcGVuOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBydW4gdGhyb3VnaCB0aGUgQ1JDMzIgY2FsY3VsYXRvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhpcyBpcyBlaXRoZXIgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLCBvciB0aGUgdG90YWwgbnVtYmVyIG9mCisgICAgICAgIC8vLyAgIGJ5dGVzIHdyaXR0ZW4sIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIG9mIHRoaXMgc3RyZWFtLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgSW50NjQgVG90YWxCeXRlc1NsdXJwZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9DcmMzMi5Ub3RhbEJ5dGVzUmVhZDsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBQcm92aWRlcyB0aGUgY3VycmVudCBDUkMgZm9yIGFsbCBibG9ja3Mgc2x1cnBlZCBpbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGUgcnVubmluZyB0b3RhbCBvZiB0aGUgQ1JDIGlzIGtlcHQgYXMgZGF0YSBpcyB3cml0dGVuIG9yIHJlYWQKKyAgICAgICAgLy8vICAgICB0aHJvdWdoIHRoZSBzdHJlYW0uICByZWFkIHRoaXMgcHJvcGVydHkgYWZ0ZXIgYWxsIHJlYWRzIG9yIHdyaXRlcyB0bworICAgICAgICAvLy8gICAgIGdldCBhbiBhY2N1cmF0ZSBDUkMgZm9yIHRoZSBlbnRpcmUgc3RyZWFtLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBJbnQzMiBDcmMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9DcmMzMi5DcmMzMlJlc3VsdDsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdW5kZXJseWluZyBzdHJlYW0gd2lsbCBiZSBsZWZ0IG9wZW4gd2hlbiB0aGUKKyAgICAgICAgLy8vICAgPGM+Q3JjQ2FsY3VsYXRvclN0cmVhbTwvYz4gaXMgQ2xvc2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFNldCB0aGlzIGF0IGFueSBwb2ludCBiZWZvcmUgY2FsbGluZyA8c2VlIGNyZWY9IkNsb3NlKCkiLz4uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGJvb2wgTGVhdmVPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfbGVhdmVPcGVuOyB9CisgICAgICAgICAgICBzZXQgeyBfbGVhdmVPcGVuID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgZnJvbSB0aGUgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj50aGUgYnVmZmVyIHRvIHJlYWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCBhdCB3aGljaCB0byBzdGFydDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBieXRlc1RvUmVhZCA9IGNvdW50OworCisgICAgICAgICAgICAvLyBOZWVkIHRvIGxpbWl0IHRoZSAjIG9mIGJ5dGVzIHJldHVybmVkLCBpZiB0aGUgc3RyZWFtIGlzIGludGVuZGVkIHRvIGhhdmUKKyAgICAgICAgICAgIC8vIGEgZGVmaW5pdGUgbGVuZ3RoLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHJldHVybmluZyBhIHN0cmVhbSBmb3IKKyAgICAgICAgICAgIC8vIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBkaXJlY3RseSB0byB0aGUgYXBwbGljYXRpb24uICBUaGUgYXBwIHdvbid0CisgICAgICAgICAgICAvLyBuZWNlc3NhcmlseSByZWFkIG9ubHkgdGhlIFVuY29tcHJlc3NlZFNpemUgbnVtYmVyIG9mIGJ5dGVzLiAgRm9yIGV4YW1wbGUKKyAgICAgICAgICAgIC8vIHdyYXBwaW5nIHRoZSBzdHJlYW0gcmV0dXJuZWQgZnJvbSBPcGVuUmVhZGVyKCkgaW50byBhIFN0cmVhZFJlYWRlcigpIGFuZAorICAgICAgICAgICAgLy8gY2FsbGluZyBSZWFkVG9FbmQoKSBvbiBpdCwgV2UgY2FuICJvdmVyLXJlYWQiIHRoZSB6aXAgZGF0YSBhbmQgZ2V0IGEKKyAgICAgICAgICAgIC8vIGNvcnJ1cHQgc3RyaW5nLiAgVGhlIGxlbmd0aCBsaW1pdHMgdGhhdCwgcHJldmVudHMgdGhhdCBwcm9ibGVtLgorCisgICAgICAgICAgICBpZiAoX2xlbmd0aExpbWl0ICE9IENyY0NhbGN1bGF0b3JTdHJlYW0uVW5zZXRMZW5ndGhMaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX0NyYzMyLlRvdGFsQnl0ZXNSZWFkID49IF9sZW5ndGhMaW1pdCkgcmV0dXJuIDA7IC8vIEVPRgorICAgICAgICAgICAgICAgIEludDY0IGJ5dGVzUmVtYWluaW5nID0gX2xlbmd0aExpbWl0IC0gX0NyYzMyLlRvdGFsQnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIGlmIChieXRlc1JlbWFpbmluZyA8IGNvdW50KSBieXRlc1RvUmVhZCA9IChpbnQpYnl0ZXNSZW1haW5pbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbiA9IF9pbm5lclN0cmVhbS5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICBpZiAobiA+IDApIF9DcmMzMi5TbHVycEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBuKTsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgdG8gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPnRoZSBidWZmZXIgZnJvbSB3aGljaCB0byB3cml0ZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij50aGUgb2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmc8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij50aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSBfQ3JjMzIuU2x1cnBCbG9jayhidWZmZXIsIG9mZnNldCwgY291bnQpOworICAgICAgICAgICAgX2lubmVyU3RyZWFtLldyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIHN1cHBvcnRzIHJlYWRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pbm5lclN0cmVhbS5DYW5SZWFkOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gc3VwcG9ydHMgc2Vla2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5TZWVrCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzdXBwb3J0cyB3cml0aW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lubmVyU3RyZWFtLkNhbldyaXRlOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGbHVzaCB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9pbm5lclN0cmVhbS5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9sZW5ndGhMaW1pdCA9PSBDcmNDYWxjdWxhdG9yU3RyZWFtLlVuc2V0TGVuZ3RoTGltaXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfaW5uZXJTdHJlYW0uTGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIF9sZW5ndGhMaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGdldHRlciBmb3IgdGhpcyBwcm9wZXJ0eSByZXR1cm5zIHRoZSB0b3RhbCBieXRlcyByZWFkLgorICAgICAgICAvLy8gICBJZiB5b3UgdXNlIHRoZSBzZXR0ZXIsIGl0IHdpbGwgdGhyb3cKKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0NyYzMyLlRvdGFsQnl0ZXNSZWFkOyB9CisgICAgICAgICAgICBzZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlZWtpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN0cmVhbS4gVGhpcyBtZXRob2QgYWx3YXlzIHRocm93cworICAgICAgICAvLy8gPHNlZSBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iLz4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPk4vQTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj5OL0E8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Ti9BPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTeXN0ZW0uSU8uU2Vla09yaWdpbiBvcmlnaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MKKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIi8+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPk4vQTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHZvaWQgSURpc3Bvc2FibGUuRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDbG9zZXMgdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoIV9sZWF2ZU9wZW4pCisgICAgICAgICAgICAgICAgX2lubmVyU3RyZWFtLkNsb3NlKCk7CisgICAgICAgIH0KKworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0NvbUhlbHBlci5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0NvbUhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTJkZmRiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvQ29tSGVscGVyLmNzCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb21IZWxwZXIuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOSBEaW5vIENoaWVzYS4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtSnVuZS0xMyAxNzowNDowNj4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgQ09NIEhlbHBlciBjbGFzcy4KKy8vCisvLyBDcmVhdGVkOiBUdWUsIDA4IFNlcCAyMDA5ICAyMjowMworLy8KKwordXNpbmcgSW50ZXJvcD1TeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgY2xhc3MgZXhwb3NlcyBhIHNldCBvZiBDT00tYWNjZXNzaWJsZSB3cmFwcGVycyBmb3Igc3RhdGljCisgICAgLy8vIG1ldGhvZHMgYXZhaWxhYmxlIG9uIHRoZSBaaXBGaWxlIGNsYXNzLiAgWW91IGRvbid0IG5lZWQgdGhpcworICAgIC8vLyBjbGFzcyB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3ROZXRaaXAgZnJvbSBhIENPTSBlbnZpcm9ubWVudC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuR3VpZEF0dHJpYnV0ZSgiZWJjMjVjZjYtOTEyMC00MjgzLWI5NzItMGU1NTIwZDAwMDBGIildCisgICAgW1N5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21WaXNpYmxlKHRydWUpXQorI2lmICFORVRDRgorICAgIFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ2xhc3NJbnRlcmZhY2UoU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNsYXNzSW50ZXJmYWNlVHlwZS5BdXRvRGlzcGF0Y2gpXQorI2VuZGlmCisKKyAgICBpbnRlcm5hbCBjbGFzcyBDb21IZWxwZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBBIHdyYXBwZXIgZm9yIDxzZWUgY3JlZj0iWmlwRmlsZS5Jc1ppcEZpbGUoc3RyaW5nKSI+WmlwRmlsZS5Jc1ppcEZpbGUoc3RyaW5nKTwvc2VlPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVuYW1lIj5UaGUgZmlsZW5hbWUgdG8gb2YgdGhlIHppcCBmaWxlIHRvIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGEgdmFsaWQgemlwIGZpbGUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBJc1ppcEZpbGUoc3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWmlwRmlsZS5Jc1ppcEZpbGUoZmlsZW5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIEEgd3JhcHBlciBmb3IgPHNlZSBjcmVmPSJaaXBGaWxlLklzWmlwRmlsZShzdHJpbmcsIGJvb2wpIj5aaXBGaWxlLklzWmlwRmlsZShzdHJpbmcsIGJvb2wpPC9zZWU+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFdlIGNhbm5vdCB1c2UgIm92ZXJsb2FkZWQiIE1ldGhvZCBuYW1lcyBpbiBDT00gaW50ZXJvcC4KKyAgICAgICAgLy8vIFNvLCBoZXJlLCB3ZSB1c2UgYSB1bmlxdWUgbmFtZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSI+VGhlIGZpbGVuYW1lIHRvIG9mIHRoZSB6aXAgZmlsZSB0byBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgZmlsZSBjb250YWlucyBhIHZhbGlkIHppcCBmaWxlLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgSXNaaXBGaWxlV2l0aEV4dHJhY3Qoc3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWmlwRmlsZS5Jc1ppcEZpbGUoZmlsZW5hbWUsIHRydWUpOworICAgICAgICB9CisKKyNpZiAhTkVUQ0YKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIEEgd3JhcHBlciBmb3IgPHNlZSBjcmVmPSJaaXBGaWxlLkNoZWNrWmlwKHN0cmluZykiPlppcEZpbGUuQ2hlY2taaXAoc3RyaW5nKTwvc2VlPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVuYW1lIj5UaGUgZmlsZW5hbWUgdG8gb2YgdGhlIHppcCBmaWxlIHRvIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgbmFtZWQgemlwIGZpbGUgY2hlY2tzIE9LLiBPdGhlcndpc2UsIGZhbHNlLiA8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIENoZWNrWmlwKHN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFppcEZpbGUuQ2hlY2taaXAoZmlsZW5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIEEgQ09NLWZyaWVuZGx5IHdyYXBwZXIgZm9yIHRoZSBzdGF0aWMgbWV0aG9kIDxzZWUgY3JlZj0iWmlwRmlsZS5DaGVja1ppcFBhc3N3b3JkKHN0cmluZyxzdHJpbmcpIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSI+VGhlIGZpbGVuYW1lIHRvIG9mIHRoZSB6aXAgZmlsZSB0byBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIHBhc3N3b3JkIHRvIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgbmFtZWQgemlwIGZpbGUgY2hlY2tzIE9LLiBPdGhlcndpc2UsIGZhbHNlLiA8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBib29sIENoZWNrWmlwUGFzc3dvcmQoc3RyaW5nIGZpbGVuYW1lLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBaaXBGaWxlLkNoZWNrWmlwUGFzc3dvcmQoZmlsZW5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBBIHdyYXBwZXIgZm9yIDxzZWUgY3JlZj0iWmlwRmlsZS5GaXhaaXBEaXJlY3Rvcnkoc3RyaW5nKSI+WmlwRmlsZS5GaXhaaXBEaXJlY3Rvcnkoc3RyaW5nKTwvc2VlPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVuYW1lIj5UaGUgZmlsZW5hbWUgdG8gb2YgdGhlIHppcCBmaWxlIHRvIGZpeC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBGaXhaaXBEaXJlY3Rvcnkoc3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBaaXBGaWxlLkZpeFppcERpcmVjdG9yeShmaWxlbmFtZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBBIHdyYXBwZXIgZm9yIDxzZWUgY3JlZj0iWmlwRmlsZS5MaWJyYXJ5VmVyc2lvbiI+WmlwRmlsZS5MaWJyYXJ5VmVyc2lvbjwvc2VlPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyAgdGhlIHZlcnNpb24gbnVtYmVyIG9uIHRoZSBEb3ROZXRaaXAgYXNzZW1ibHksIGZvcm1hdHRlZCBhcyBhIHN0cmluZy4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0cmluZyBHZXRaaXBMaWJyYXJ5VmVyc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBaaXBGaWxlLkxpYnJhcnlWZXJzaW9uLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9FbmNyeXB0aW9uQWxnb3JpdGhtLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvRW5jcnlwdGlvbkFsZ29yaXRobS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQ3NDMyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvRW5jcnlwdGlvbkFsZ29yaXRobS5jcwpAQCAtMCwwICsxLDEzNSBAQAorLy8gRW5jcnlwdGlvbkFsZ29yaXRobS5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAgMjAwOSBEaW5vIENoaWVzYQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4gCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOiAKKy8vIFRpbWUtc3RhbXA6IDwyMDA5LU9jdG9iZXItMjEgMTc6MjQ6NDU+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgRW5jcnlwdGlvbkFnb3JpdGhtIGVudW0KKy8vCisvLyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGVudW0gdGhhdCBwcm92aWRlcyB0aGUgdmFyaW91cyBlbmNyeXB0aW9uIGFsZ29yaXRobXMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAvLy8gbGlicmFyeS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgPGM+UGt6aXBXZWFrPC9jPiBpbXBsaWVzIHRoZSB1c2Ugb2YgWmlwIDIuMCBlbmNyeXB0aW9uLCB3aGljaCBpcyBrbm93biB0byBiZQorICAgIC8vLyAgIHdlYWsgYW5kIHN1YnZlcnRpYmxlLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIEEgbm90ZSBvbiBpbnRlcm9wZXJhYmlsaXR5OiBWYWx1ZXMgb2YgPGM+UGt6aXBXZWFrPC9jPiBhbmQgPGM+Tm9uZTwvYz4gYXJlCisgICAgLy8vICAgc3BlY2lmaWVkIGluIDxzZWUKKyAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5QS1dBUkUncyB6aXAKKyAgICAvLy8gICBzcGVjaWZpY2F0aW9uPC9zZWU+LCBhbmQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgInN0YW5kYXJkIi4gIFppcCBhcmNoaXZlcworICAgIC8vLyAgIHByb2R1Y2VkIHVzaW5nIHRoZXNlIG9wdGlvbnMgd2lsbCBiZSBpbnRlcm9wZXJhYmxlIHdpdGggbWFueSBvdGhlciB6aXAgdG9vbHMKKyAgICAvLy8gICBhbmQgbGlicmFyaWVzLCBpbmNsdWRpbmcgV2luZG93cyBFeHBsb3Jlci4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBWYWx1ZXMgb2YgPGM+V2luWmlwQWVzMTI4PC9jPiBhbmQgPGM+V2luWmlwQWVzMjU2PC9jPiBhcmUgbm90IHBhcnQgb2YgdGhlIFppcAorICAgIC8vLyAgIHNwZWNpZmljYXRpb24sIGJ1dCByYXRoZXIgaW1wbHkgdGhlIHVzZSBvZiBhIHZlbmRvci1zcGVjaWZpYyBleHRlbnNpb24gZnJvbQorICAgIC8vLyAgIFdpblppcC4gSWYgeW91IHdhbnQgdG8gcHJvZHVjZSBpbnRlcm9wZXJhYmxlIFppcCBhcmNoaXZlcywgZG8gbm90IHVzZSB0aGVzZQorICAgIC8vLyAgIHZhbHVlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UgcHJvZHVjZSBhIHppcCBhcmNoaXZlIHVzaW5nIFdpblppcEFlczI1NiwgeW91CisgICAgLy8vICAgd2lsbCBiZSBhYmxlIHRvIG9wZW4gaXQgaW4gV2luZG93cyBFeHBsb3JlciBvbiBXaW5kb3dzIFhQIGFuZCBWaXN0YSwgYnV0IHlvdQorICAgIC8vLyAgIHdpbGwgbm90IGJlIGFibGUgdG8gZXh0cmFjdCBlbnRyaWVzOyB0cnlpbmcgdGhpcyB3aWxsIGxlYWQgdG8gYW4gInVuc3BlY2lmaWVkCisgICAgLy8vICAgZXJyb3IiLiBGb3IgdGhpcyByZWFzb24sIHNvbWUgcGVvcGxlIGhhdmUgc2FpZCB0aGF0IGEgemlwIGFyY2hpdmUgdGhhdCB1c2VzCisgICAgLy8vICAgV2luWmlwJ3MgQUVTIGVuY3J5cHRpb24gaXMgbm90IGFjdHVhbGx5IGEgemlwIGFyY2hpdmUgYXQgYWxsLiAgQSB6aXAgYXJjaGl2ZQorICAgIC8vLyAgIHByb2R1Y2VkIHRoaXMgd2F5IHdpbGwgYmUgcmVhZGFibGUgd2l0aCB0aGUgV2luWmlwIHRvb2wgKFZlcnNpb24gMTEgYW5kCisgICAgLy8vICAgYmV5b25kKS4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBUaGVyZSBhcmUgb3RoZXIgdGhpcmQtcGFydHkgdG9vbHMgYW5kIGxpYnJhcmllcywgYm90aCBjb21tZXJjaWFsIGFuZAorICAgIC8vLyAgIG90aGVyd2lzZSwgdGhhdCBzdXBwb3J0IFdpblppcCdzIEFFUyBlbmNyeXB0aW9uLiBUaGVzZSB3aWxsIGJlIGFibGUgdG8gcmVhZAorICAgIC8vLyAgIEFFUy1lbmNyeXB0ZWQgemlwIGFyY2hpdmVzIHByb2R1Y2VkIGJ5IERvdE5ldFppcCwgYW5kIGNvbnZlcnNlbHkgYXBwbGljYXRpb25zCisgICAgLy8vICAgdGhhdCB1c2UgRG90TmV0WmlwIHRvIHJlYWQgemlwIGFyY2hpdmVzIHdpbGwgYmUgYWJsZSB0byByZWFkIEFFUy1lbmNyeXB0ZWQKKyAgICAvLy8gICBhcmNoaXZlcyBwcm9kdWNlZCBieSB0aG9zZSB0b29scyBvciBsaWJyYXJpZXMuICBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICAgIC8vLyAgIHRob3NlIG90aGVyIHRvb2xzIGFuZCBsaWJyYXJpZXMgdG8gZmluZCBvdXQgaWYgV2luWmlwJ3MgQUVTIGVuY3J5cHRpb24gaXMKKyAgICAvLy8gICBzdXBwb3J0ZWQuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgSW4gY2FzZSB5b3UgY2FyZTogQWNjb3JkaW5nIHRvIDxzZWUKKyAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LndpbnppcC5jb20vYWVzX2luZm8uaHRtIj50aGUgV2luWmlwIHNwZWNpZmljYXRpb248L3NlZT4sIHRoZQorICAgIC8vLyAgIGFjdHVhbCBBRVMga2V5IHVzZWQgaXMgZGVyaXZlZCBmcm9tIHRoZSA8c2VlIGNyZWY9IlppcEVudHJ5LlBhc3N3b3JkIi8+IHZpYSBhbgorICAgIC8vLyAgIGFsZ29yaXRobSB0aGF0IGNvbXBsaWVzIHdpdGggPHNlZQorICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI4OTgudHh0Ij5SRkMgMjg5ODwvc2VlPiwgdXNpbmcgYW4gaXRlcmF0aW9uCisgICAgLy8vICAgY291bnQgb2YgMTAwMC4gIFRoZSBhbGdvcml0aG0gaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFBCS0RGMiwgd2hpY2ggc3RhbmRzCisgICAgLy8vICAgZm9yICJQYXNzd29yZCBCYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAjMiIuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgQSB3b3JkIGFib3V0IHBhc3N3b3JkIHN0cmVuZ3RoIGFuZCBsZW5ndGg6IFRoZSBBRVMgZW5jcnlwdGlvbiB0ZWNobm9sb2d5IGlzCisgICAgLy8vICAgdmVyeSBnb29kLCBidXQgYW55IHN5c3RlbSBpcyBvbmx5IGFzIHNlY3VyZSBhcyB0aGUgd2Vha2VzdCBsaW5rLiAgSWYgeW91IHdhbnQKKyAgICAvLy8gICB0byBzZWN1cmUgeW91ciBkYXRhLCBiZSBzdXJlIHRvIHVzZSBhIHBhc3N3b3JkIHRoYXQgaXMgaGFyZCB0byBndWVzcy4gIFRvIG1ha2UKKyAgICAvLy8gICBpdCBoYXJkZXIgdG8gZ3Vlc3MgKGluY3JlYXNlIGl0cyAiZW50cm9weSIpLCB5b3Ugc2hvdWxkIG1ha2UgaXQgbG9uZ2VyLiAgSWYKKyAgICAvLy8gICB5b3UgdXNlIG5vcm1hbCBjaGFyYWN0ZXJzIGZyb20gYW4gQVNDSUkga2V5Ym9hcmQsIGEgcGFzc3dvcmQgb2YgbGVuZ3RoIDIwIHdpbGwKKyAgICAvLy8gICBiZSBzdHJvbmcgZW5vdWdoIHRoYXQgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIGd1ZXNzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAvLy8gICB0aGF0LCBJJ2QgZW5jb3VyYWdlIHlvdSB0byByZWFkIDxzZWUKKyAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnJlZGtlc3RyZWwuY28udWsvQXJ0aWNsZXMvUmFuZG9tUGFzc3dvcmRTdHJlbmd0aC5odG1sIj50aGlzCisgICAgLy8vICAgYXJ0aWNsZS48L3NlZT4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBUaGUgV2luWmlwIEFFUyBhbGdvcml0aG1zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIHZlcnNpb24gb2YgRG90TmV0WmlwIHRoYXQKKyAgICAvLy8gICBydW5zIG9uIHRoZSAuTkVUIENvbXBhY3QgRnJhbWV3b3JrLiAgVGhpcyBpcyBiZWNhdXNlIC5ORVQgQ0YgbGFja3MgdGhlCisgICAgLy8vICAgSE1BQ1NIQTEgY2xhc3MgdGhhdCBpcyByZXF1aXJlZCBmb3IgcHJvZHVjaW5nIHRoZSBhcmNoaXZlLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBpbnRlcm5hbCBlbnVtIEVuY3J5cHRpb25BbGdvcml0aG0KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vIGVuY3J5cHRpb24gYXQgYWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBOb25lID0gMCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcmFkaXRpb25hbCBvciBDbGFzc2ljIHBremlwIGVuY3J5cHRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBremlwV2VhaywKKworI2lmIEFFU0NSWVBUTworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaW5aaXAgQUVTIGVuY3J5cHRpb24gKDEyOCBrZXkgYml0cykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFdpblppcEFlczEyOCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaW5aaXAgQUVTIGVuY3J5cHRpb24gKDI1NiBrZXkgYml0cykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFdpblppcEFlczI1NiwKKyNlbmRpZgorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSBEb3ROZXRaaXAuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFVuc3VwcG9ydGVkID0gNCwKKworCisgICAgICAgIC8vIG90aGVycy4uLiBub3QgaW1wbGVtZW50ZWQgKHlldD8pCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9FdmVudHMuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9FdmVudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMjk2YwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0V2ZW50cy5jcwpAQCAtMCwwICsxLDY4NCBAQAorLy8gRXZlbnRzLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRGlubyBDaGllc2EgYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtQXVndXN0LTA2IDEyOjI2OjI0PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgZXZlbnRzIHVzZWQgYnkgdGhlIFppcEZpbGUgY2xhc3MuCisvLworLy8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBEZWxlZ2F0ZSBpbiB3aGljaCB0aGUgYXBwbGljYXRpb24gd3JpdGVzIHRoZSA8Yz5aaXBFbnRyeTwvYz4gY29udGVudCBmb3IgdGhlIG5hbWVkIGVudHJ5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxwYXJhbSBuYW1lPSJlbnRyeU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGF0IG11c3QgYmUgd3JpdHRlbi48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBlbnRyeSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLjwvcGFyYW0+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIFdoZW4geW91IGFkZCBhbiBlbnRyeSBhbmQgc3BlY2lmeSBhIDxjPldyaXRlRGVsZWdhdGU8L2M+LCB2aWEgPHNlZQorICAgIC8vLyAgIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZEVudHJ5KHN0cmluZywgV3JpdGVEZWxlZ2F0ZSkiLz4sIHRoZSBhcHBsaWNhdGlvbgorICAgIC8vLyAgIGNvZGUgcHJvdmlkZXMgdGhlIGxvZ2ljIHRoYXQgd3JpdGVzIHRoZSBlbnRyeSBkYXRhIGRpcmVjdGx5IGludG8gdGhlIHppcCBmaWxlLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vCisgICAgLy8vIDxleGFtcGxlPgorICAgIC8vLworICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGRlZmluZSBhIFdyaXRlRGVsZWdhdGUgdGhhdCBvYnRhaW5zIGEgRGF0YVNldCwgYW5kIHRoZW4KKyAgICAvLy8gd3JpdGVzIHRoZSBYTUwgZm9yIHRoZSBEYXRhU2V0IGludG8gdGhlIHppcCBhcmNoaXZlLiAgVGhlcmUncyBubyBuZWVkIHRvCisgICAgLy8vIHNhdmUgdGhlIFhNTCB0byBhIGRpc2sgZmlsZSBmaXJzdC4KKyAgICAvLy8KKyAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgIC8vLyBwcml2YXRlIHZvaWQgV3JpdGVFbnRyeSAoU3RyaW5nIGZpbGVuYW1lLCBTdHJlYW0gb3V0cHV0KQorICAgIC8vLyB7CisgICAgLy8vICAgICBEYXRhU2V0IGRzMSA9IE9idGFpbkRhdGFTZXQoKTsKKyAgICAvLy8gICAgIGRzMS5Xcml0ZVhtbChvdXRwdXQpOworICAgIC8vLyB9CisgICAgLy8vCisgICAgLy8vIHByaXZhdGUgdm9pZCBSdW4oKQorICAgIC8vLyB7CisgICAgLy8vICAgICB1c2luZyAodmFyIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgLy8vICAgICB7CisgICAgLy8vICAgICAgICAgemlwLkFkZEVudHJ5KHppcEVudHJ5TmFtZSwgV3JpdGVFbnRyeSk7CisgICAgLy8vICAgICAgICAgemlwLlNhdmUoemlwRmlsZU5hbWUpOworICAgIC8vLyAgICAgfQorICAgIC8vLyB9CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8KKyAgICAvLy8gPGNvZGUgbGFuZz0idmIiPgorICAgIC8vLyBQcml2YXRlIFN1YiBXcml0ZUVudHJ5IChCeVZhbCBmaWxlbmFtZSBBcyBTdHJpbmcsIEJ5VmFsIG91dHB1dCBBcyBTdHJlYW0pCisgICAgLy8vICAgICBEYXRhU2V0IGRzMSA9IE9idGFpbkRhdGFTZXQoKQorICAgIC8vLyAgICAgZHMxLldyaXRlWG1sKHN0cmVhbSkKKyAgICAvLy8gRW5kIFN1YgorICAgIC8vLworICAgIC8vLyBQdWJsaWMgU3ViIFJ1bigpCisgICAgLy8vICAgICBVc2luZyB6aXAgPSBOZXcgWmlwRmlsZQorICAgIC8vLyAgICAgICAgIHppcC5BZGRFbnRyeSh6aXBFbnRyeU5hbWUsIE5ldyBXcml0ZURlbGVnYXRlKEFkZHJlc3NPZiBXcml0ZUVudHJ5KSkKKyAgICAvLy8gICAgICAgICB6aXAuU2F2ZSh6aXBGaWxlTmFtZSkKKyAgICAvLy8gICAgIEVuZCBVc2luZworICAgIC8vLyBFbmQgU3ViCisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9leGFtcGxlPgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsIFdyaXRlRGVsZWdhdGUpIi8+CisgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgV3JpdGVEZWxlZ2F0ZShzdHJpbmcgZW50cnlOYW1lLCBTeXN0ZW0uSU8uU3RyZWFtIHN0cmVhbSk7CisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBEZWxlZ2F0ZSBpbiB3aGljaCB0aGUgYXBwbGljYXRpb24gb3BlbnMgdGhlIHN0cmVhbSwganVzdC1pbi10aW1lLCBmb3IgdGhlIG5hbWVkIGVudHJ5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxwYXJhbSBuYW1lPSJlbnRyeU5hbWUiPgorICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgWmlwRW50cnkgdGhhdCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG9wZW4gdGhlIHN0cmVhbSBmb3IuCisgICAgLy8vIDwvcGFyYW0+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIFdoZW4geW91IGFkZCBhbiBlbnRyeSB2aWEgPHNlZSBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsCisgICAgLy8vICAgT3BlbkRlbGVnYXRlLCBDbG9zZURlbGVnYXRlKSIvPiwgdGhlIGFwcGxpY2F0aW9uIGNvZGUgcHJvdmlkZXMgdGhlIGxvZ2ljIHRoYXQKKyAgICAvLy8gICBvcGVucyBhbmQgY2xvc2VzIHRoZSBzdHJlYW0gZm9yIHRoZSBnaXZlbiBaaXBFbnRyeS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLworICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsIE9wZW5EZWxlZ2F0ZSwgQ2xvc2VEZWxlZ2F0ZSkiLz4KKyAgICBwdWJsaWMgZGVsZWdhdGUgU3lzdGVtLklPLlN0cmVhbSBPcGVuRGVsZWdhdGUoc3RyaW5nIGVudHJ5TmFtZSk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgRGVsZWdhdGUgaW4gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGNsb3NlcyB0aGUgc3RyZWFtLCBqdXN0LWluLXRpbWUsIGZvciB0aGUgbmFtZWQgZW50cnkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+CisgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBaaXBFbnRyeSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2xvc2UgdGhlIHN0cmVhbSBmb3IuCisgICAgLy8vIDwvcGFyYW0+CisgICAgLy8vCisgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gdG8gYmUgY2xvc2VkLjwvcGFyYW0+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIFdoZW4geW91IGFkZCBhbiBlbnRyeSB2aWEgPHNlZSBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsCisgICAgLy8vICAgT3BlbkRlbGVnYXRlLCBDbG9zZURlbGVnYXRlKSIvPiwgdGhlIGFwcGxpY2F0aW9uIGNvZGUgcHJvdmlkZXMgdGhlIGxvZ2ljIHRoYXQKKyAgICAvLy8gICBvcGVucyBhbmQgY2xvc2VzIHRoZSBzdHJlYW0gZm9yIHRoZSBnaXZlbiBaaXBFbnRyeS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLworICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsIE9wZW5EZWxlZ2F0ZSwgQ2xvc2VEZWxlZ2F0ZSkiLz4KKyAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBDbG9zZURlbGVnYXRlKHN0cmluZyBlbnRyeU5hbWUsIFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBEZWxlZ2F0ZSBmb3IgdGhlIGNhbGxiYWNrIGJ5IHdoaWNoIHRoZSBhcHBsaWNhdGlvbiB0ZWxscyB0aGUKKyAgICAvLy8gICBsaWJyYXJ5IHRoZSBDb21wcmVzc2lvbkxldmVsIHRvIHVzZSBmb3IgYSBmaWxlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBVc2luZyB0aGlzIGNhbGxiYWNrLCB0aGUgYXBwbGljYXRpb24gY2FuLCBmb3IgZXhhbXBsZSwgc3BlY2lmeSB0aGF0CisgICAgLy8vICAgcHJldmlvdXNseS1jb21wcmVzc2VkIGZpbGVzICgubXAzLCAucG5nLCAuZG9jeCwgZXRjKSBzaG91bGQgdXNlIGEKKyAgICAvLy8gICA8Yz5Db21wcmVzc2lvbkxldmVsPC9jPiBvZiA8Yz5Ob25lPC9jPiwgb3IgY2FuIHNldCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYmFzZWQKKyAgICAvLy8gICBvbiBhbnkgb3RoZXIgZmFjdG9yLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuU2V0Q29tcHJlc3Npb24iLz4KKyAgICBwdWJsaWMgZGVsZWdhdGUgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsIFNldENvbXByZXNzaW9uQ2FsbGJhY2soc3RyaW5nIGxvY2FsRmlsZU5hbWUsIHN0cmluZyBmaWxlTmFtZUluQXJjaGl2ZSk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgSW4gYW4gRXZlbnRBcmdzIHR5cGUsIGluZGljYXRlcyB3aGljaCBzb3J0IG9mIHByb2dyZXNzIGV2ZW50IGlzIGJlaW5nCisgICAgLy8vICAgcmVwb3J0ZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vICAgVGhlcmUgYXJlIGV2ZW50cyBmb3IgcmVhZGluZywgZXZlbnRzIGZvciBzYXZpbmcsIGFuZCBldmVudHMgZm9yCisgICAgLy8vICAgZXh0cmFjdGluZy4gVGhpcyBlbnVtZXJhdGlvbiBhbGxvd3MgYSBzaW5nbGUgRXZlbnRBcmdzIHR5cGUgdG8gYmUgc3VlZCB0bworICAgIC8vLyAgIGRlc2NyaWJlIG9uZSBvZiBtdWx0aXBsZSBzdWJldmVudHMuIEZvciBleGFtcGxlLCBhIFNhdmVQcm9ncmVzcyBldmVudCBpcworICAgIC8vLyAgIGludm9rZWQgYmVmb3JlLCBhZnRlciwgYW5kIGR1cmluZyB0aGUgc2F2aW5nIG9mIGEgc2luZ2xlIGVudHJ5LiAgVGhlIHZhbHVlCisgICAgLy8vICAgb2YgYW4gZW51bSB3aXRoIHRoaXMgdHlwZSwgc3BlY2lmaWVzIHdoaWNoIGV2ZW50IGlzIGJlaW5nIHRyaWdnZXJlZC4gIFRoZQorICAgIC8vLyAgIHNhbWUgYXBwbGllcyB0byBFeHRyYWN0aW9uLCBSZWFkaW5nIGFuZCBBZGRpbmcgZXZlbnRzLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgaW50ZXJuYWwgZW51bSBaaXBQcm9ncmVzc0V2ZW50VHlwZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYSBBZGQoKSBvcGVyYXRpb24gaGFzIHN0YXJ0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEFkZGluZ19TdGFydGVkLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGFuIGluZGl2aWR1YWwgZW50cnkgaW4gdGhlIGFyY2hpdmUgaGFzIGJlZW4gYWRkZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEFkZGluZ19BZnRlckFkZEVudHJ5LAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGEgQWRkKCkgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEFkZGluZ19Db21wbGV0ZWQsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYSBSZWFkKCkgb3BlcmF0aW9uIGhhcyBzdGFydGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSZWFkaW5nX1N0YXJ0ZWQsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYW4gaW5kaXZpZHVhbCBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBpcyBhYm91dCB0byBiZSByZWFkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSZWFkaW5nX0JlZm9yZVJlYWRFbnRyeSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBpbmRpdmlkdWFsIGVudHJ5IGluIHRoZSBhcmNoaXZlIGhhcyBqdXN0IGJlZW4gcmVhZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUmVhZGluZ19BZnRlclJlYWRFbnRyeSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhIFJlYWQoKSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUmVhZGluZ19Db21wbGV0ZWQsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGdpdmVuIGV2ZW50IHJlcG9ydHMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIHNvIGZhcgorICAgICAgICAvLy8gZHVyaW5nIGEgUmVhZCgpIG9wZXJhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUmVhZGluZ19BcmNoaXZlQnl0ZXNSZWFkLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGEgU2F2ZSgpIG9wZXJhdGlvbiBoYXMgc3RhcnRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU2F2aW5nX1N0YXJ0ZWQsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYW4gaW5kaXZpZHVhbCBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBpcyBhYm91dCB0byBiZSB3cml0dGVuLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTYXZpbmdfQmVmb3JlV3JpdGVFbnRyeSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBpbmRpdmlkdWFsIGVudHJ5IGluIHRoZSBhcmNoaXZlIGhhcyBqdXN0IGJlZW4gc2F2ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNhdmluZ19BZnRlcldyaXRlRW50cnksCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYSBTYXZlKCkgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNhdmluZ19Db21wbGV0ZWQsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHppcCBhcmNoaXZlIGhhcyBiZWVuIGNyZWF0ZWQgaW4gYQorICAgICAgICAvLy8gdGVtcG9yYXJ5IGxvY2F0aW9uIGR1cmluZyBhIFNhdmUoKSBvcGVyYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNhdmluZ19BZnRlclNhdmVUZW1wQXJjaGl2ZSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgdGVtcG9yYXJ5IGZpbGUgaXMgYWJvdXQgdG8gYmUgcmVuYW1lZCB0byB0aGUgZmluYWwgYXJjaGl2ZQorICAgICAgICAvLy8gbmFtZSBkdXJpbmcgYSBTYXZlKCkgb3BlcmF0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTYXZpbmdfQmVmb3JlUmVuYW1lVGVtcEFyY2hpdmUsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHRlbXBvcmFyeSBmaWxlIGlzIGhhcyBqdXN0IGJlZW4gcmVuYW1lZCB0byB0aGUgZmluYWwgYXJjaGl2ZQorICAgICAgICAvLy8gbmFtZSBkdXJpbmcgYSBTYXZlKCkgb3BlcmF0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTYXZpbmdfQWZ0ZXJSZW5hbWVUZW1wQXJjaGl2ZSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUgaGFzIGJlZW4gY29tcGlsZWQKKyAgICAgICAgLy8vIGR1cmluZyBhIFNhdmUoKSBvcGVyYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNhdmluZ19BZnRlckNvbXBpbGVTZWxmRXh0cmFjdG9yLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBnaXZlbiBldmVudCBpcyByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzb3VyY2UgYnl0ZXMgdGhhdCBoYXZlIHJ1biB0aHJvdWdoIHRoZSBjb21wcmVzc29yIHNvIGZhcgorICAgICAgICAvLy8gZHVyaW5nIGEgU2F2ZSgpIG9wZXJhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgU2F2aW5nX0VudHJ5Qnl0ZXNSZWFkLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGFuIGVudHJ5IGlzIGFib3V0IHRvIGJlIGV4dHJhY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXh0cmFjdGluZ19CZWZvcmVFeHRyYWN0RW50cnksCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYW4gZW50cnkgaGFzIGp1c3QgYmVlbiBleHRyYWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEV4dHJhY3RpbmdfQWZ0ZXJFeHRyYWN0RW50cnksCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgdGhhdCBleHRyYWN0aW9uIG9mIGFuIGVudHJ5IHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZworICAgICAgICAvLy8gICBmaWxlc3lzdGVtIGZpbGUuIFlvdSBtdXN0IHVzZQorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uSW52b2tlRXh0cmFjdFByb2dyZXNzRXZlbnQiPgorICAgICAgICAvLy8gICBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLkludm9rZUV4dHJhY3RQcm9ncmVzc0V2ZW50PC9zZWU+IGluIHRoZSBjYWxsCisgICAgICAgIC8vLyAgIHRvIDxjPlppcEVudHJ5LkV4dHJhY3QoKTwvYz4gaW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGlzIGV2ZW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFeHRyYWN0aW5nX0V4dHJhY3RFbnRyeVdvdWxkT3ZlcndyaXRlLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGdpdmVuIGV2ZW50IGlzIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc28gZmFyIGZvcgorICAgICAgICAvLy8gICB0aGUgY3VycmVudCBlbnRyeSBkdXJpbmcgYW4gRXh0cmFjdCgpIG9wZXJhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXh0cmFjdGluZ19FbnRyeUJ5dGVzV3JpdHRlbiwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBFeHRyYWN0QWxsIG9wZXJhdGlvbiBpcyBhYm91dCB0byBiZWdpbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXh0cmFjdGluZ19CZWZvcmVFeHRyYWN0QWxsLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGFuIEV4dHJhY3RBbGwgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEV4dHJhY3RpbmdfQWZ0ZXJFeHRyYWN0QWxsLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgYSB6aXAgZmlsZS4KKyAgICAgICAgLy8vIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIGJlY2F1c2UgaXQgaGFzIGJlZW4KKyAgICAgICAgLy8vIHJlbW92ZWQsIG9yIGJlY2F1c2UgaXQgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy4gIEl0IGNhbiBhbHNvCisgICAgICAgIC8vLyBtZWFuIHRoYXQgdGhlIGZpbGUgY2Fubm90IGJlIFJlYWQsIGJlY2F1c2Ugb2YgYSByYW5nZSBsb2NrIGNvbmZsaWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFcnJvcl9TYXZpbmcsCisgICAgfQorCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBhIHNhdmUsIHJlYWQsIG9yIGV4dHJhY3Qgb3BlcmF0aW9uLgorICAgIC8vLyBUaGlzIGlzIGEgYmFzZSBjbGFzczsgeW91IHdpbGwgcHJvYmFibHkgdXNlIG9uZSBvZiB0aGUgY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhpcyBvbmUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBjbGFzcyBaaXBQcm9ncmVzc0V2ZW50QXJncyA6IEV2ZW50QXJncworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2VudHJpZXNUb3RhbDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9jYW5jZWw7CisgICAgICAgIHByaXZhdGUgWmlwRW50cnkgX2xhdGVzdEVudHJ5OworICAgICAgICBwcml2YXRlIFppcFByb2dyZXNzRXZlbnRUeXBlIF9mbGF2b3I7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9hcmNoaXZlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfYnl0ZXNUcmFuc2ZlcnJlZDsKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfdG90YWxCeXRlc1RvVHJhbnNmZXI7CisKKworICAgICAgICBpbnRlcm5hbCBaaXBQcm9ncmVzc0V2ZW50QXJncygpIHsgfQorCisgICAgICAgIGludGVybmFsIFppcFByb2dyZXNzRXZlbnRBcmdzKHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUgZmxhdm9yKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9hcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lOworICAgICAgICAgICAgdGhpcy5fZmxhdm9yID0gZmxhdm9yOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHNhdmVkIG9yIGV4dHJhY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBFbnRyaWVzVG90YWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9lbnRyaWVzVG90YWw7IH0KKyAgICAgICAgICAgIHNldCB7IF9lbnRyaWVzVG90YWwgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIGxhc3QgZW50cnkgc2F2ZWQgb3IgZXh0cmFjdGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWmlwRW50cnkgQ3VycmVudEVudHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfbGF0ZXN0RW50cnk7IH0KKyAgICAgICAgICAgIHNldCB7IF9sYXRlc3RFbnRyeSA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbiBhbiBldmVudCBoYW5kbGVyLCBzZXQgdGhpcyB0byBjYW5jZWwgdGhlIHNhdmUgb3IgZXh0cmFjdAorICAgICAgICAvLy8gb3BlcmF0aW9uIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIENhbmNlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NhbmNlbDsgfQorICAgICAgICAgICAgc2V0IHsgX2NhbmNlbCA9IF9jYW5jZWwgfHwgdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0eXBlIG9mIGV2ZW50IGJlaW5nIHJlcG9ydGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWmlwUHJvZ3Jlc3NFdmVudFR5cGUgRXZlbnRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfZmxhdm9yOyB9CisgICAgICAgICAgICBzZXQgeyBfZmxhdm9yID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGFyY2hpdmUgbmFtZSBhc3NvY2lhdGVkIHRvIHRoaXMgZXZlbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBTdHJpbmcgQXJjaGl2ZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9hcmNoaXZlTmFtZTsgfQorICAgICAgICAgICAgc2V0IHsgX2FyY2hpdmVOYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIHdyaXR0ZW4gc28gZmFyIGZvciB0aGlzIGVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgSW50NjQgQnl0ZXNUcmFuc2ZlcnJlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2J5dGVzVHJhbnNmZXJyZWQ7IH0KKyAgICAgICAgICAgIHNldCB7IF9ieXRlc1RyYW5zZmVycmVkID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGJlIHJlYWQgb3Igd3JpdHRlbiBmb3IgdGhpcyBlbnRyeS4KKyAgICAgICAgLy8vIFRoaXMgbnVtYmVyIHdpbGwgYmUgLTEgaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgSW50NjQgVG90YWxCeXRlc1RvVHJhbnNmZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF90b3RhbEJ5dGVzVG9UcmFuc2ZlcjsgfQorICAgICAgICAgICAgc2V0IHsgX3RvdGFsQnl0ZXNUb1RyYW5zZmVyID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBhIFJlYWQgb3BlcmF0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgUmVhZFByb2dyZXNzRXZlbnRBcmdzIDogWmlwUHJvZ3Jlc3NFdmVudEFyZ3MKKyAgICB7CisKKyAgICAgICAgaW50ZXJuYWwgUmVhZFByb2dyZXNzRXZlbnRBcmdzKCkgeyB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWFkUHJvZ3Jlc3NFdmVudEFyZ3Moc3RyaW5nIGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZSBmbGF2b3IpCisgICAgICAgICAgICA6IGJhc2UoYXJjaGl2ZU5hbWUsIGZsYXZvcikKKyAgICAgICAgeyB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFJlYWRQcm9ncmVzc0V2ZW50QXJncyBCZWZvcmUoc3RyaW5nIGFyY2hpdmVOYW1lLCBpbnQgZW50cmllc1RvdGFsKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBSZWFkUHJvZ3Jlc3NFdmVudEFyZ3MoYXJjaGl2ZU5hbWUsIFppcFByb2dyZXNzRXZlbnRUeXBlLlJlYWRpbmdfQmVmb3JlUmVhZEVudHJ5KTsKKyAgICAgICAgICAgIHguRW50cmllc1RvdGFsID0gZW50cmllc1RvdGFsOworICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgUmVhZFByb2dyZXNzRXZlbnRBcmdzIEFmdGVyKHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwRW50cnkgZW50cnksIGludCBlbnRyaWVzVG90YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFJlYWRQcm9ncmVzc0V2ZW50QXJncyhhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuUmVhZGluZ19BZnRlclJlYWRFbnRyeSk7CisgICAgICAgICAgICB4LkVudHJpZXNUb3RhbCA9IGVudHJpZXNUb3RhbDsKKyAgICAgICAgICAgIHguQ3VycmVudEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBSZWFkUHJvZ3Jlc3NFdmVudEFyZ3MgU3RhcnRlZChzdHJpbmcgYXJjaGl2ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFJlYWRQcm9ncmVzc0V2ZW50QXJncyhhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuUmVhZGluZ19TdGFydGVkKTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFJlYWRQcm9ncmVzc0V2ZW50QXJncyBCeXRlVXBkYXRlKHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwRW50cnkgZW50cnksIEludDY0IGJ5dGVzWGZlcnJlZCwgSW50NjQgdG90YWxCeXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgUmVhZFByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5SZWFkaW5nX0FyY2hpdmVCeXRlc1JlYWQpOworICAgICAgICAgICAgeC5DdXJyZW50RW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIHguQnl0ZXNUcmFuc2ZlcnJlZCA9IGJ5dGVzWGZlcnJlZDsKKyAgICAgICAgICAgIHguVG90YWxCeXRlc1RvVHJhbnNmZXIgPSB0b3RhbEJ5dGVzOworICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgUmVhZFByb2dyZXNzRXZlbnRBcmdzIENvbXBsZXRlZChzdHJpbmcgYXJjaGl2ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFJlYWRQcm9ncmVzc0V2ZW50QXJncyhhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuUmVhZGluZ19Db21wbGV0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgYSBBZGQgb3BlcmF0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgQWRkUHJvZ3Jlc3NFdmVudEFyZ3MgOiBaaXBQcm9ncmVzc0V2ZW50QXJncworICAgIHsKKyAgICAgICAgaW50ZXJuYWwgQWRkUHJvZ3Jlc3NFdmVudEFyZ3MoKSB7IH0KKworICAgICAgICBwcml2YXRlIEFkZFByb2dyZXNzRXZlbnRBcmdzKHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUgZmxhdm9yKQorICAgICAgICAgICAgOiBiYXNlKGFyY2hpdmVOYW1lLCBmbGF2b3IpCisgICAgICAgIHsgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBBZGRQcm9ncmVzc0V2ZW50QXJncyBBZnRlckVudHJ5KHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwRW50cnkgZW50cnksIGludCBlbnRyaWVzVG90YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IEFkZFByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5BZGRpbmdfQWZ0ZXJBZGRFbnRyeSk7CisgICAgICAgICAgICB4LkVudHJpZXNUb3RhbCA9IGVudHJpZXNUb3RhbDsKKyAgICAgICAgICAgIHguQ3VycmVudEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBBZGRQcm9ncmVzc0V2ZW50QXJncyBTdGFydGVkKHN0cmluZyBhcmNoaXZlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgQWRkUHJvZ3Jlc3NFdmVudEFyZ3MoYXJjaGl2ZU5hbWUsIFppcFByb2dyZXNzRXZlbnRUeXBlLkFkZGluZ19TdGFydGVkKTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEFkZFByb2dyZXNzRXZlbnRBcmdzIENvbXBsZXRlZChzdHJpbmcgYXJjaGl2ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IEFkZFByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5BZGRpbmdfQ29tcGxldGVkKTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBhIHNhdmUgb3BlcmF0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgU2F2ZVByb2dyZXNzRXZlbnRBcmdzIDogWmlwUHJvZ3Jlc3NFdmVudEFyZ3MKKyAgICB7CisgICAgICAgIHByaXZhdGUgaW50IF9lbnRyaWVzU2F2ZWQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJjaGl2ZU5hbWUiPnRoZSBuYW1lIG9mIHRoZSB6aXAgYXJjaGl2ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJlZm9yZSI+d2hldGhlciB0aGlzIGlzIGJlZm9yZSBzYXZpbmcgdGhlIGVudHJ5LCBvciBhZnRlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cmllc1RvdGFsIj5UaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHppcCBhcmNoaXZlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cmllc1NhdmVkIj5OdW1iZXIgb2YgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5Ij5UaGUgZW50cnkgaW52b2x2ZWQgaW4gdGhlIGV2ZW50LjwvcGFyYW0+CisgICAgICAgIGludGVybmFsIFNhdmVQcm9ncmVzc0V2ZW50QXJncyhzdHJpbmcgYXJjaGl2ZU5hbWUsIGJvb2wgYmVmb3JlLCBpbnQgZW50cmllc1RvdGFsLCBpbnQgZW50cmllc1NhdmVkLCBaaXBFbnRyeSBlbnRyeSkKKyAgICAgICAgICAgIDogYmFzZShhcmNoaXZlTmFtZSwgKGJlZm9yZSkgPyBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQmVmb3JlV3JpdGVFbnRyeSA6IFppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlcldyaXRlRW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuRW50cmllc1RvdGFsID0gZW50cmllc1RvdGFsOworICAgICAgICAgICAgdGhpcy5DdXJyZW50RW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIHRoaXMuX2VudHJpZXNTYXZlZCA9IGVudHJpZXNTYXZlZDsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIFNhdmVQcm9ncmVzc0V2ZW50QXJncygpIHsgfQorCisgICAgICAgIGludGVybmFsIFNhdmVQcm9ncmVzc0V2ZW50QXJncyhzdHJpbmcgYXJjaGl2ZU5hbWUsIFppcFByb2dyZXNzRXZlbnRUeXBlIGZsYXZvcikKKyAgICAgICAgICAgIDogYmFzZShhcmNoaXZlTmFtZSwgZmxhdm9yKQorICAgICAgICB7IH0KKworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MgQnl0ZVVwZGF0ZShzdHJpbmcgYXJjaGl2ZU5hbWUsIFppcEVudHJ5IGVudHJ5LCBJbnQ2NCBieXRlc1hmZXJyZWQsIEludDY0IHRvdGFsQnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IFNhdmVQcm9ncmVzc0V2ZW50QXJncyhhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0VudHJ5Qnl0ZXNSZWFkKTsKKyAgICAgICAgICAgIHguQXJjaGl2ZU5hbWUgPSBhcmNoaXZlTmFtZTsKKyAgICAgICAgICAgIHguQ3VycmVudEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICB4LkJ5dGVzVHJhbnNmZXJyZWQgPSBieXRlc1hmZXJyZWQ7CisgICAgICAgICAgICB4LlRvdGFsQnl0ZXNUb1RyYW5zZmVyID0gdG90YWxCeXRlczsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFNhdmVQcm9ncmVzc0V2ZW50QXJncyBTdGFydGVkKHN0cmluZyBhcmNoaXZlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgU2F2ZVByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfU3RhcnRlZCk7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MgQ29tcGxldGVkKHN0cmluZyBhcmNoaXZlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgU2F2ZVByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQ29tcGxldGVkKTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtYmVyIG9mIGVudHJpZXMgc2F2ZWQgc28gZmFyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IEVudHJpZXNTYXZlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2VudHJpZXNTYXZlZDsgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0aGUgZXh0cmFjdCBvcGVyYXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBjbGFzcyBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MgOiBaaXBQcm9ncmVzc0V2ZW50QXJncworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2VudHJpZXNFeHRyYWN0ZWQ7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF90YXJnZXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uc3RydWN0b3IgZm9yIHRoZSBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJjaGl2ZU5hbWUiPnRoZSBuYW1lIG9mIHRoZSB6aXAgYXJjaGl2ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJlZm9yZSI+d2hldGhlciB0aGlzIGlzIGJlZm9yZSBzYXZpbmcgdGhlIGVudHJ5LCBvciBhZnRlcjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cmllc1RvdGFsIj5UaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHppcCBhcmNoaXZlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cmllc0V4dHJhY3RlZCI+TnVtYmVyIG9mIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gZXh0cmFjdGVkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnkiPlRoZSBlbnRyeSBpbnZvbHZlZCBpbiB0aGUgZXZlbnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJleHRyYWN0TG9jYXRpb24iPlRoZSBsb2NhdGlvbiB0byB3aGljaCBlbnRyaWVzIGFyZSBleHRyYWN0ZWQuPC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzKHN0cmluZyBhcmNoaXZlTmFtZSwgYm9vbCBiZWZvcmUsIGludCBlbnRyaWVzVG90YWwsIGludCBlbnRyaWVzRXh0cmFjdGVkLCBaaXBFbnRyeSBlbnRyeSwgc3RyaW5nIGV4dHJhY3RMb2NhdGlvbikKKyAgICAgICAgICAgIDogYmFzZShhcmNoaXZlTmFtZSwgKGJlZm9yZSkgPyBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0JlZm9yZUV4dHJhY3RFbnRyeSA6IFppcFByb2dyZXNzRXZlbnRUeXBlLkV4dHJhY3RpbmdfQWZ0ZXJFeHRyYWN0RW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuRW50cmllc1RvdGFsID0gZW50cmllc1RvdGFsOworICAgICAgICAgICAgdGhpcy5DdXJyZW50RW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIHRoaXMuX2VudHJpZXNFeHRyYWN0ZWQgPSBlbnRyaWVzRXh0cmFjdGVkOworICAgICAgICAgICAgdGhpcy5fdGFyZ2V0ID0gZXh0cmFjdExvY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzKHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUgZmxhdm9yKQorICAgICAgICAgICAgOiBiYXNlKGFyY2hpdmVOYW1lLCBmbGF2b3IpCisgICAgICAgIHsgfQorCisgICAgICAgIGludGVybmFsIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncygpCisgICAgICAgIHsgfQorCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyBCZWZvcmVFeHRyYWN0RW50cnkoc3RyaW5nIGFyY2hpdmVOYW1lLCBaaXBFbnRyeSBlbnRyeSwgc3RyaW5nIGV4dHJhY3RMb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lLAorICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGUgPSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0JlZm9yZUV4dHJhY3RFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudEVudHJ5ID0gZW50cnksCisgICAgICAgICAgICAgICAgICAgIF90YXJnZXQgPSBleHRyYWN0TG9jYXRpb24sCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyBFeHRyYWN0RXhpc3Rpbmcoc3RyaW5nIGFyY2hpdmVOYW1lLCBaaXBFbnRyeSBlbnRyeSwgc3RyaW5nIGV4dHJhY3RMb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lLAorICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGUgPSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0V4dHJhY3RFbnRyeVdvdWxkT3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICBDdXJyZW50RW50cnkgPSBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgX3RhcmdldCA9IGV4dHJhY3RMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzIEFmdGVyRXh0cmFjdEVudHJ5KHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwRW50cnkgZW50cnksIHN0cmluZyBleHRyYWN0TG9jYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXJjaGl2ZU5hbWUgPSBhcmNoaXZlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlID0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19BZnRlckV4dHJhY3RFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudEVudHJ5ID0gZW50cnksCisgICAgICAgICAgICAgICAgICAgIF90YXJnZXQgPSBleHRyYWN0TG9jYXRpb24sCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyBFeHRyYWN0QWxsU3RhcnRlZChzdHJpbmcgYXJjaGl2ZU5hbWUsIHN0cmluZyBleHRyYWN0TG9jYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4ID0gbmV3IEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyhhcmNoaXZlTmFtZSwgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19CZWZvcmVFeHRyYWN0QWxsKTsKKyAgICAgICAgICAgIHguX3RhcmdldCA9IGV4dHJhY3RMb2NhdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyBFeHRyYWN0QWxsQ29tcGxldGVkKHN0cmluZyBhcmNoaXZlTmFtZSwgc3RyaW5nIGV4dHJhY3RMb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0FmdGVyRXh0cmFjdEFsbCk7CisgICAgICAgICAgICB4Ll90YXJnZXQgPSBleHRyYWN0TG9jYXRpb247CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyBCeXRlVXBkYXRlKHN0cmluZyBhcmNoaXZlTmFtZSwgWmlwRW50cnkgZW50cnksIEludDY0IGJ5dGVzV3JpdHRlbiwgSW50NjQgdG90YWxCeXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzKGFyY2hpdmVOYW1lLCBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0VudHJ5Qnl0ZXNXcml0dGVuKTsKKyAgICAgICAgICAgIHguQXJjaGl2ZU5hbWUgPSBhcmNoaXZlTmFtZTsKKyAgICAgICAgICAgIHguQ3VycmVudEVudHJ5ID0gZW50cnk7CisgICAgICAgICAgICB4LkJ5dGVzVHJhbnNmZXJyZWQgPSBieXRlc1dyaXR0ZW47CisgICAgICAgICAgICB4LlRvdGFsQnl0ZXNUb1RyYW5zZmVyID0gdG90YWxCeXRlczsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE51bWJlciBvZiBlbnRyaWVzIGV4dHJhY3RlZCBzbyBmYXIuICBUaGlzIGlzIHNldCBvbmx5IGlmIHRoZQorICAgICAgICAvLy8gRXZlbnRUeXBlIGlzIEV4dHJhY3RpbmdfQmVmb3JlRXh0cmFjdEVudHJ5IG9yIEV4dHJhY3RpbmdfQWZ0ZXJFeHRyYWN0RW50cnksIGFuZAorICAgICAgICAvLy8gdGhlIEV4dHJhY3QoKSBpcyBvY2N1cnJpbmcgd2l0aW4gdGhlIHNjb3BlIG9mIGEgY2FsbCB0byBFeHRyYWN0QWxsKCkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgRW50cmllc0V4dHJhY3RlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2VudHJpZXNFeHRyYWN0ZWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGV4dHJhY3Rpb24gdGFyZ2V0IGxvY2F0aW9uLCBhIGZpbGVzeXN0ZW0gcGF0aC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFN0cmluZyBFeHRyYWN0TG9jYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF90YXJnZXQ7IH0KKyAgICAgICAgfQorCisgICAgfQorCisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFuIGVycm9yIHRoYXQgb2NjdXJyZWQgd2hpbGUgemlwcGluZy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGNsYXNzIFppcEVycm9yRXZlbnRBcmdzIDogWmlwUHJvZ3Jlc3NFdmVudEFyZ3MKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZXB0aW9uIF9leGM7CisgICAgICAgIHByaXZhdGUgWmlwRXJyb3JFdmVudEFyZ3MoKSB7IH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFppcEVycm9yRXZlbnRBcmdzIFNhdmluZyhzdHJpbmcgYXJjaGl2ZU5hbWUsIFppcEVudHJ5IGVudHJ5LCBFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeCA9IG5ldyBaaXBFcnJvckV2ZW50QXJncworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlID0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXJyb3JfU2F2aW5nLAorICAgICAgICAgICAgICAgICAgICBBcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lLAorICAgICAgICAgICAgICAgICAgICBDdXJyZW50RW50cnkgPSBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgX2V4YyA9IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLCBpZiBhbnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb24gQEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2V4YzsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBTdHJpbmcgRmlsZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEN1cnJlbnRFbnRyeS5Mb2NhbEZpbGVOYW1lOyB9CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvRXhjZXB0aW9ucy5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0V4Y2VwdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMmM4MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0V4Y2VwdGlvbnMuY3MKQEAgLTAsMCArMSwzMDAgQEAKKy8vIEV4Y2VwdGlvbnMuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBEaW5vIENoaWVzYSBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTEyIDEyOjE5OjEwPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgZXhjZXB0aW9ucyB1c2VkIGluIHRoZSBjbGFzcyBsaWJyYXJ5LgorLy8KKworCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7CisjaWYgIU5FVENGCit1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uOworI2VuZGlmCisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICAvLy8vLyA8c3VtbWFyeT4KKyAgICAvLy8vLyBCYXNlIGV4Y2VwdGlvbiB0eXBlIGZvciBhbGwgY3VzdG9tIGV4Y2VwdGlvbnMgaW4gdGhlIFppcCBsaWJyYXJ5LiBJdCBhY3RzIGFzIGEgbWFya2VyIGNsYXNzLgorICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAvL1tBdHRyaWJ1dGVVc2FnZShBdHRyaWJ1dGVUYXJnZXRzLkNsYXNzKV0KKyAgICAvL3B1YmxpYyBjbGFzcyBaaXBFeGNlcHRpb25BdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgeyB9CisKKworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJc3N1ZWQgd2hlbiBhbiA8Yz5aaXBFbnRyeS5FeHRyYWN0V2l0aFBhc3N3b3JkKCk8L2M+IG1ldGhvZCBpcyBpbnZva2VkCisgICAgLy8vIHdpdGggYW4gaW5jb3JyZWN0IHBhc3N3b3JkLgorICAgIC8vLyA8L3N1bW1hcnk+CisjaWYgIVNJTFZFUkxJR0hUCisgICAgW1NlcmlhbGl6YWJsZV0KKyNlbmRpZgorICAgIFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuR3VpZEF0dHJpYnV0ZSgiZWJjMjVjZjYtOTEyMC00MjgzLWI5NzItMGU1NTIwZDAwMDBCIildCisgICAgcHVibGljIGNsYXNzIEJhZFBhc3N3b3JkRXhjZXB0aW9uIDogWmlwRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBCYWRQYXNzd29yZEV4Y2VwdGlvbigpIHsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIGluIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEJhZFBhc3N3b3JkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIGluIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbm5lckV4Y2VwdGlvbiI+VGhlIGlubmVyRXhjZXB0aW9uIGZvciB0aGlzIGV4Y2VwdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQmFkUGFzc3dvcmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKworI2lmICEgKE5FVENGIHx8IFNJTFZFUkxJR0hUKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmZvIj5UaGUgc2VyaWFsaXphdGlvbiBpbmZvIGZvciB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIHN0cmVhbWluZyBjb250ZXh0IGZyb20gd2hpY2ggdG8gZGVzZXJpYWxpemUuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIEJhZFBhc3N3b3JkRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICAgIHsgIH0KKyNlbmRpZgorCisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhIHJlYWQgd2FzIGF0dGVtcHRlZCBvbiBhIHN0cmVhbSwgYW5kIGJhZCBvciBpbmNvbXBsZXRlIGRhdGEgd2FzCisgICAgLy8vIHJlY2VpdmVkLgorICAgIC8vLyA8L3N1bW1hcnk+CisjaWYgIVNJTFZFUkxJR0hUCisgICAgW1NlcmlhbGl6YWJsZV0KKyNlbmRpZgorICAgIFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuR3VpZEF0dHJpYnV0ZSgiZWJjMjVjZjYtOTEyMC00MjgzLWI5NzItMGU1NTIwZDAwMDBBIildCisgICAgcHVibGljIGNsYXNzIEJhZFJlYWRFeGNlcHRpb24gOiBaaXBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmF1bHQgY3Rvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEJhZFJlYWRFeGNlcHRpb24oKSB7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSBpbiB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBCYWRSZWFkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIGluIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbm5lckV4Y2VwdGlvbiI+VGhlIGlubmVyRXhjZXB0aW9uIGZvciB0aGlzIGV4Y2VwdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworI2lmICEgKE5FVENGIHx8IFNJTFZFUkxJR0hUKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmZvIj5UaGUgc2VyaWFsaXphdGlvbiBpbmZvIGZvciB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIHN0cmVhbWluZyBjb250ZXh0IGZyb20gd2hpY2ggdG8gZGVzZXJpYWxpemUuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIEJhZFJlYWRFeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpCisgICAgICAgICAgeyAgfQorI2VuZGlmCisKKyAgICB9CisKKworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJc3N1ZWQgd2hlbiBhbiBDUkMgY2hlY2sgZmFpbHMgdXBvbiBleHRyYWN0aW5nIGFuIGVudHJ5IGZyb20gYSB6aXAgYXJjaGl2ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorI2lmICFTSUxWRVJMSUdIVAorICAgIFtTZXJpYWxpemFibGVdCisjZW5kaWYKKyAgICBbU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkd1aWRBdHRyaWJ1dGUoImViYzI1Y2Y2LTkxMjAtNDI4My1iOTcyLTBlNTUyMGQwMDAwOSIpXQorICAgIHB1YmxpYyBjbGFzcyBCYWRDcmNFeGNlcHRpb24gOiBaaXBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmF1bHQgY3Rvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEJhZENyY0V4Y2VwdGlvbigpIHsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIGluIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEJhZENyY0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7IH0KKworCisjaWYgISAoTkVUQ0YgfHwgU0lMVkVSTElHSFQpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZm8iPlRoZSBzZXJpYWxpemF0aW9uIGluZm8gZm9yIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij5UaGUgc3RyZWFtaW5nIGNvbnRleHQgZnJvbSB3aGljaCB0byBkZXNlcmlhbGl6ZS48L3BhcmFtPgorICAgICAgICBwcm90ZWN0ZWQgQmFkQ3JjRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICAgIHsgIH0KKyNlbmRpZgorCisgICAgfQorCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIElzc3VlZCB3aGVuIGVycm9ycyBvY2N1ciBzYXZpbmcgYSBzZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorI2lmICFTSUxWRVJMSUdIVAorICAgIFtTZXJpYWxpemFibGVdCisjZW5kaWYKKyAgICBbU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkd1aWRBdHRyaWJ1dGUoImViYzI1Y2Y2LTkxMjAtNDI4My1iOTcyLTBlNTUyMGQwMDAwOCIpXQorICAgIHB1YmxpYyBjbGFzcyBTZnhHZW5lcmF0aW9uRXhjZXB0aW9uIDogWmlwRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBTZnhHZW5lcmF0aW9uRXhjZXB0aW9uKCkgeyB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29tZSBvbiwgeW91IGtub3cgaG93IGV4Y2VwdGlvbnMgd29yay4gV2h5IGFyZSB5b3UgbG9va2luZyBhdCB0aGlzIGRvY3VtZW50YXRpb24/CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgaW4gdGhlIGV4Y2VwdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgU2Z4R2VuZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7IH0KKworI2lmICEgKE5FVENGIHx8IFNJTFZFUkxJR0hUKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmZvIj5UaGUgc2VyaWFsaXphdGlvbiBpbmZvIGZvciB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIHN0cmVhbWluZyBjb250ZXh0IGZyb20gd2hpY2ggdG8gZGVzZXJpYWxpemUuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIFNmeEdlbmVyYXRpb25FeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpCisgICAgICAgICAgeyAgfQorI2VuZGlmCisKKyAgICB9CisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBaaXBGaWxlIHdoaWNoIHdhcyBub3QgcG9zc2libGUKKyAgICAvLy8gZ2l2ZW4gdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBjYWxsIDxjPlNhdmUoKTwvYz4gb24gYSBaaXBGaWxlCisgICAgLy8vIHdoaWNoIGhhcyBubyBmaWxlbmFtZSBzZXQsIHlvdSBjYW4gZ2V0IHRoaXMgZXhjZXB0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisjaWYgIVNJTFZFUkxJR0hUCisgICAgW1NlcmlhbGl6YWJsZV0KKyNlbmRpZgorICAgIFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuR3VpZEF0dHJpYnV0ZSgiZWJjMjVjZjYtOTEyMC00MjgzLWI5NzItMGU1NTIwZDAwMDA3IildCisgICAgcHVibGljIGNsYXNzIEJhZFN0YXRlRXhjZXB0aW9uIDogWmlwRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBCYWRTdGF0ZUV4Y2VwdGlvbigpIHsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIGluIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEJhZFN0YXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbWUgb24sIHlvdSBrbm93IGhvdyBleGNlcHRpb25zIHdvcmsuIFdoeSBhcmUgeW91IGxvb2tpbmcgYXQgdGhpcyBkb2N1bWVudGF0aW9uPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIGluIHRoZSBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbm5lckV4Y2VwdGlvbiI+VGhlIGlubmVyRXhjZXB0aW9uIGZvciB0aGlzIGV4Y2VwdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgQmFkU3RhdGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAge30KKworI2lmICEgKE5FVENGIHx8IFNJTFZFUkxJR0hUKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmZvIj5UaGUgc2VyaWFsaXphdGlvbiBpbmZvIGZvciB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIHN0cmVhbWluZyBjb250ZXh0IGZyb20gd2hpY2ggdG8gZGVzZXJpYWxpemUuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIEJhZFN0YXRlRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICAgIHsgIH0KKyNlbmRpZgorCisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyBkZWZpbmVkIGJ5IGFuZCB0aHJvdyBieSB0aGUgWmlwIGxpYnJhcnkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyNpZiAhU0lMVkVSTElHSFQKKyAgICBbU2VyaWFsaXphYmxlXQorI2VuZGlmCisgICAgW1N5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5HdWlkQXR0cmlidXRlKCJlYmMyNWNmNi05MTIwLTQyODMtYjk3Mi0wZTU1MjBkMDAwMDYiKV0KKyAgICBwdWJsaWMgY2xhc3MgWmlwRXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBaaXBFeGNlcHRpb24oKSB7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSBpbiB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBaaXBFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIDogYmFzZShtZXNzYWdlKSB7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSBpbiB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5uZXJFeGNlcHRpb24iPlRoZSBpbm5lckV4Y2VwdGlvbiBmb3IgdGhpcyBleGNlcHRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFppcEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7IH0KKworI2lmICEgKE5FVENGIHx8IFNJTFZFUkxJR0hUKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21lIG9uLCB5b3Uga25vdyBob3cgZXhjZXB0aW9ucyB3b3JrLiBXaHkgYXJlIHlvdSBsb29raW5nIGF0IHRoaXMgZG9jdW1lbnRhdGlvbj8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmZvIj5UaGUgc2VyaWFsaXphdGlvbiBpbmZvIGZvciB0aGUgZXhjZXB0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIHN0cmVhbWluZyBjb250ZXh0IGZyb20gd2hpY2ggdG8gZGVzZXJpYWxpemUuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIFppcEV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkKKyAgICAgICAgeyB9CisjZW5kaWYKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0V4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0YWYxYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0V4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uY3MKQEAgLTAsMCArMSw4NSBAQAorLy8gRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAgMjAwOSBEaW5vIENoaWVzYQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4gCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOiAKKy8vIFRpbWUtc3RhbXA6IDwyMDA5LUF1Z3VzdC0yNSAwODo0NDozNz4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uIGVudW0KKy8vCisvLyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gZW51bSBmb3IgdGhlIG9wdGlvbnMgd2hlbiBleHRyYWN0aW5nIGFuIGVudHJ5IHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLiAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vICAgPHBhcmE+CisgICAgLy8vICAgICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSBhY3Rpb25zIHRoYXQgdGhlIGxpYnJhcnkgY2FuIHRha2Ugd2hlbiBhbgorICAgIC8vLyAgICAgPGM+RXh0cmFjdCgpPC9jPiBvciA8Yz5FeHRyYWN0V2l0aFBhc3N3b3JkKCk8L2M+IG1ldGhvZCBpcyBjYWxsZWQgdG8gZXh0cmFjdCBhbgorICAgIC8vLyAgICAgZW50cnkgdG8gYSBmaWxlc3lzdGVtLCBhbmQgdGhlIGV4dHJhY3Rpb24gd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGVzeXN0ZW0KKyAgICAvLy8gICAgIGZpbGUuCisgICAgLy8vICAgPC9wYXJhPgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vCisgICAgaW50ZXJuYWwgZW51bSBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaHJvdyBhbiBleGNlcHRpb24gd2hlbiBleHRyYWN0aW9uIHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLiAoRm9yCisgICAgICAgIC8vLyBDT00gY2xpZW50cywgdGhpcyBpcyBhIDAgKHplcm8pLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGhyb3csCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hlbiBleHRyYWN0aW9uIHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLCBvdmVyd3JpdGUgdGhlIGZpbGUgc2lsZW50bHkuCisgICAgICAgIC8vLyBUaGUgb3ZlcndyaXRlIHdpbGwgaGFwcGVuIGV2ZW4gaWYgdGhlIHRhcmdldCBmaWxlIGlzIG1hcmtlZCBhcyByZWFkLW9ubHkuCisgICAgICAgIC8vLyAoRm9yIENPTSBjbGllbnRzLCB0aGlzIGlzIGEgMS4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE92ZXJ3cml0ZVNpbGVudGx5LAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZW4gZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZSwgZG9uJ3Qgb3ZlcndyaXRlIHRoZSBmaWxlLCBzaWxlbnRseS4gCisgICAgICAgIC8vLyAoRm9yIENPTSBjbGllbnRzLCB0aGlzIGlzIGEgMi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIERvTm90T3ZlcndyaXRlLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZW4gZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZSwgaW52b2tlIHRoZSBFeHRyYWN0UHJvZ3Jlc3MKKyAgICAgICAgLy8vIGV2ZW50LCB1c2luZyBhbiBldmVudCB0eXBlIG9mIDxzZWUKKyAgICAgICAgLy8vIGNyZWY9IlppcFByb2dyZXNzRXZlbnRUeXBlLkV4dHJhY3RpbmdfRXh0cmFjdEVudHJ5V291bGRPdmVyd3JpdGUiLz4uICBJbgorICAgICAgICAvLy8gdGhpcyB3YXksIHRoZSBhcHBsaWNhdGlvbiBjYW4gZGVjaWRlLCBqdXN0LWluLXRpbWUsIHdoZXRoZXIgdG8gb3ZlcndyaXRlIHRoZQorICAgICAgICAvLy8gZmlsZS4gRm9yIGV4YW1wbGUsIGEgR1VJIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvIHBvcCB1cCBhIGRpYWxvZyB0byBhbGxvdworICAgICAgICAvLy8gdGhlIHVzZXIgdG8gY2hvb3NlLiBZb3UgbWF5IHdhbnQgdG8gZXhhbWluZSB0aGUgPHNlZQorICAgICAgICAvLy8gY3JlZj0iRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzLkV4dHJhY3RMb2NhdGlvbiIvPiBwcm9wZXJ0eSBiZWZvcmUgbWFraW5nCisgICAgICAgIC8vLyB0aGUgZGVjaXNpb24uIElmLCBhZnRlciB5b3VyIHByb2Nlc3NpbmcgaW4gdGhlIEV4dHJhY3QgcHJvZ3Jlc3MgZXZlbnQsIHlvdQorICAgICAgICAvLy8gd2FudCB0byBOT1QgZXh0cmFjdCB0aGUgZmlsZSwgc2V0IDxzZWUgY3JlZj0iWmlwRW50cnkuRXh0cmFjdEV4aXN0aW5nRmlsZSIvPgorICAgICAgICAvLy8gb24gdGhlIDxjPlppcFByb2dyZXNzRXZlbnRBcmdzLkN1cnJlbnRFbnRyeTwvYz4gdG8gPGM+RG9Ob3RPdmVyd3JpdGU8L2M+LgorICAgICAgICAvLy8gSWYgeW91IGRvIHdhbnQgdG8gZXh0cmFjdCB0aGUgZmlsZSwgc2V0IDxjPlppcEVudHJ5LkV4dHJhY3RFeGlzdGluZ0ZpbGU8L2M+CisgICAgICAgIC8vLyB0byA8Yz5PdmVyd3JpdGVTaWxlbnRseTwvYz4uICBJZiB5b3Ugd2FudCB0byBjYW5jZWwgdGhlIEV4dHJhY3Rpb24sIHNldAorICAgICAgICAvLy8gPGM+WmlwUHJvZ3Jlc3NFdmVudEFyZ3MuQ2FuY2VsPC9jPiB0byB0cnVlLiAgQ2FuY2VsbGluZyBkaWZmZXJzIGZyb20gdXNpbmcKKyAgICAgICAgLy8vIERvTm90T3ZlcndyaXRlIGluIHRoYXQgYSBjYW5jZWwgd2lsbCBub3QgZXh0cmFjdCBhbnkgZnVydGhlciBlbnRyaWVzLCBpZgorICAgICAgICAvLy8gdGhlcmUgYXJlIGFueS4gIChGb3IgQ09NIGNsaWVudHMsIHRoZSB2YWx1ZSBvZiB0aGlzIGVudW0gaXMgYSAzLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSW52b2tlRXh0cmFjdFByb2dyZXNzRXZlbnQsCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9GaWxlU2VsZWN0b3IuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9GaWxlU2VsZWN0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkNWZjYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL0ZpbGVTZWxlY3Rvci5jcwpAQCAtMCwwICsxLDE2MDkgQEAKKy8vI2RlZmluZSBTZWxlY3RvclRyYWNlCisKKy8vIEZpbGVTZWxlY3Rvci5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgRGlubyBDaGllc2EuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQ6IDwyMDExLUF1Z3VzdC0wNSAxMTowMzoxMT4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgImZpbGUgc2VsZWN0b3IiIHRoYXQgZmluZHMgZmlsZXMgYmFzZWQgb24gYQorLy8gc2V0IG9mIGluY2x1c2lvbiBjcml0ZXJpYSwgaW5jbHVkaW5nIGZpbGVuYW1lLCBzaXplLCBmaWxlIHRpbWUsIGFuZAorLy8gcG90ZW50aWFsbHkgZmlsZSBhdHRyaWJ1dGVzLiAgVGhlIGNyaXRlcmlhIGFyZSBnaXZlbiBpbiBhIHN0cmluZyB3aXRoCisvLyBhIHNpbXBsZSBleHByZXNzaW9uIGxhbmd1YWdlLiBFeGFtcGxlczoKKy8vCisvLyBmaW5kIGFsbCAudHh0IGZpbGVzOgorLy8gICAgIG5hbWUgPSAqLnR4dAorLy8KKy8vIHNob3J0aGFuZCBmb3IgdGhlIGFib3ZlCisvLyAgICAgKi50eHQKKy8vCisvLyBhbGwgZmlsZXMgbW9kaWZpZWQgYWZ0ZXIgSmFudWFyeSAxc3QsIDIwMDkKKy8vICAgICBtdGltZSA+IDIwMDktMDEtMDEKKy8vCisvLyBBbGwgLnR4dCBmaWxlcyBtb2RpZmllZCBhZnRlciB0aGUgZmlyc3Qgb2YgdGhlIHllYXIKKy8vICAgICBuYW1lID0gKi50eHQgIEFORCAgbXRpbWUgPiAyMDA5LTAxLTAxCisvLworLy8gQWxsIC50eHQgZmlsZXMgbW9kaWZpZWQgYWZ0ZXIgdGhlIGZpcnN0IG9mIHRoZSB5ZWFyLCBvciBhbnkgZmlsZSB3aXRoIHRoZSBhcmNoaXZlIGJpdCBzZXQKKy8vICAgICAobmFtZSA9ICoudHh0ICBBTkQgIG10aW1lID4gMjAwOS0wMS0wMSkgb3IgKGF0dHJpYnR1ZXMgPSBBKQorLy8KKy8vIEFsbCAudHh0IGZpbGVzIG9yIGFueSBmaWxlIGdyZWF0ZXIgdGhhbiAxbWIgaW4gc2l6ZQorLy8gICAgIChuYW1lID0gKi50eHQgIG9yICBzaXplID4gMW1iKQorLy8KKy8vIGFuZCBzbyBvbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworI2lmIFNJTFZFUkxJR0hUCit1c2luZyBTeXN0ZW0uTGlucTsKKyNlbmRpZgorCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRW51bWVyYXRlcyB0aGUgb3B0aW9ucyBmb3IgYSBsb2dpY2FsIGNvbmp1bmN0aW9uLiBUaGlzIGVudW0gaXMgaW50ZW5kZWQgZm9yIHVzZQorICAgIC8vLyBpbnRlcm5hbGx5IGJ5IHRoZSBGaWxlU2VsZWN0b3IgY2xhc3MuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBlbnVtIExvZ2ljYWxDb25qdW5jdGlvbgorICAgIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQU5ELAorICAgICAgICBPUiwKKyAgICAgICAgWE9SLAorICAgIH0KKworICAgIGludGVybmFsIGVudW0gV2hpY2hUaW1lCisgICAgeworICAgICAgICBhdGltZSwKKyAgICAgICAgbXRpbWUsCisgICAgICAgIGN0aW1lLAorICAgIH0KKworCisgICAgaW50ZXJuYWwgZW51bSBDb21wYXJpc29uT3BlcmF0b3IKKyAgICB7CisgICAgICAgIFtEZXNjcmlwdGlvbigiPiIpXQorICAgICAgICBHcmVhdGVyVGhhbiwKKyAgICAgICAgW0Rlc2NyaXB0aW9uKCI+PSIpXQorICAgICAgICBHcmVhdGVyVGhhbk9yRXF1YWxUbywKKyAgICAgICAgW0Rlc2NyaXB0aW9uKCI8IildCisgICAgICAgIExlc3NlclRoYW4sCisgICAgICAgIFtEZXNjcmlwdGlvbigiPD0iKV0KKyAgICAgICAgTGVzc2VyVGhhbk9yRXF1YWxUbywKKyAgICAgICAgW0Rlc2NyaXB0aW9uKCI9IildCisgICAgICAgIEVxdWFsVG8sCisgICAgICAgIFtEZXNjcmlwdGlvbigiIT0iKV0KKyAgICAgICAgTm90RXF1YWxUbworICAgIH0KKworCisgICAgaW50ZXJuYWwgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyBTZWxlY3Rpb25Dcml0ZXJpb24KKyAgICB7CisgICAgICAgIGludGVybmFsIHZpcnR1YWwgYm9vbCBWZXJib3NlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDtzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYWJzdHJhY3QgYm9vbCBFdmFsdWF0ZShzdHJpbmcgZmlsZW5hbWUpOworCisgICAgICAgIFtTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWwoIlNlbGVjdG9yVHJhY2UiKV0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIENyaXRlcmlvblRyYWNlKHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiICAiICsgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBTaXplQ3JpdGVyaW9uIDogU2VsZWN0aW9uQ3JpdGVyaW9uCisgICAgeworICAgICAgICBpbnRlcm5hbCBDb21wYXJpc29uT3BlcmF0b3IgT3BlcmF0b3I7CisgICAgICAgIGludGVybmFsIEludDY0IFNpemU7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kKCJzaXplICIpLkFwcGVuZChFbnVtVXRpbC5HZXREZXNjcmlwdGlvbihPcGVyYXRvcikpLkFwcGVuZCgiICIpLkFwcGVuZChTaXplLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBib29sIEV2YWx1YXRlKHN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLklPLkZpbGVJbmZvIGZpID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhmaWxlbmFtZSk7CisgICAgICAgICAgICBDcml0ZXJpb25UcmFjZSgiU2l6ZUNyaXRlcmlvbjo6RXZhbHVhdGUoJ3swfScgW3sxfV0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCB0aGlzLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIF9FdmFsdWF0ZShmaS5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9FdmFsdWF0ZShJbnQ2NCBMZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICBzd2l0Y2ggKE9wZXJhdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyaXNvbk9wZXJhdG9yLkdyZWF0ZXJUaGFuT3JFcXVhbFRvOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBMZW5ndGggPj0gU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJpc29uT3BlcmF0b3IuR3JlYXRlclRoYW46CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IExlbmd0aCA+IFNpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyaXNvbk9wZXJhdG9yLkxlc3NlclRoYW5PckVxdWFsVG86CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IExlbmd0aCA8PSBTaXplOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmlzb25PcGVyYXRvci5MZXNzZXJUaGFuOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBMZW5ndGggPCBTaXplOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmlzb25PcGVyYXRvci5FcXVhbFRvOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBMZW5ndGggPT0gU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJpc29uT3BlcmF0b3IuTm90RXF1YWxUbzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTGVuZ3RoICE9IFNpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0b3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgIH0KKworCisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFRpbWVDcml0ZXJpb24gOiBTZWxlY3Rpb25Dcml0ZXJpb24KKyAgICB7CisgICAgICAgIGludGVybmFsIENvbXBhcmlzb25PcGVyYXRvciBPcGVyYXRvcjsKKyAgICAgICAgaW50ZXJuYWwgV2hpY2hUaW1lIFdoaWNoOworICAgICAgICBpbnRlcm5hbCBEYXRlVGltZSBUaW1lOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZChXaGljaC5Ub1N0cmluZygpKS5BcHBlbmQoIiAiKS5BcHBlbmQoRW51bVV0aWwuR2V0RGVzY3JpcHRpb24oT3BlcmF0b3IpKS5BcHBlbmQoIiAiKS5BcHBlbmQoVGltZS5Ub1N0cmluZygieXl5eS1NTS1kZC1ISDptbTpzcyIpKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBFdmFsdWF0ZShzdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGVUaW1lIHg7CisgICAgICAgICAgICBzd2l0Y2ggKFdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV2hpY2hUaW1lLmF0aW1lOgorICAgICAgICAgICAgICAgICAgICB4ID0gU3lzdGVtLklPLkZpbGUuR2V0TGFzdEFjY2Vzc1RpbWUoZmlsZW5hbWUpLlRvVW5pdmVyc2FsVGltZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdoaWNoVGltZS5tdGltZToKKyAgICAgICAgICAgICAgICAgICAgeCA9IFN5c3RlbS5JTy5GaWxlLkdldExhc3RXcml0ZVRpbWUoZmlsZW5hbWUpLlRvVW5pdmVyc2FsVGltZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdoaWNoVGltZS5jdGltZToKKyAgICAgICAgICAgICAgICAgICAgeCA9IFN5c3RlbS5JTy5GaWxlLkdldENyZWF0aW9uVGltZShmaWxlbmFtZSkuVG9Vbml2ZXJzYWxUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0b3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENyaXRlcmlvblRyYWNlKCJUaW1lQ3JpdGVyaW9uKHswfSx7MX0pPSB7Mn0iLCBmaWxlbmFtZSwgV2hpY2guVG9TdHJpbmcoKSwgeCk7CisgICAgICAgICAgICByZXR1cm4gX0V2YWx1YXRlKHgpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGJvb2wgX0V2YWx1YXRlKERhdGVUaW1lIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICBzd2l0Y2ggKE9wZXJhdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyaXNvbk9wZXJhdG9yLkdyZWF0ZXJUaGFuT3JFcXVhbFRvOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeCA+PSBUaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJpc29uT3BlcmF0b3IuR3JlYXRlclRoYW46CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh4ID4gVGltZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ29tcGFyaXNvbk9wZXJhdG9yLkxlc3NlclRoYW5PckVxdWFsVG86CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh4IDw9IFRpbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmlzb25PcGVyYXRvci5MZXNzZXJUaGFuOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeCA8IFRpbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENvbXBhcmlzb25PcGVyYXRvci5FcXVhbFRvOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoeCA9PSBUaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDb21wYXJpc29uT3BlcmF0b3IuTm90RXF1YWxUbzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHggIT0gVGltZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0b3IiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ3JpdGVyaW9uVHJhY2UoIlRpbWVDcml0ZXJpb246IHswfSIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisKKworICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgTmFtZUNyaXRlcmlvbiA6IFNlbGVjdGlvbkNyaXRlcmlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBSZWdleCBfcmU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9yZWdleFN0cmluZzsKKyAgICAgICAgaW50ZXJuYWwgQ29tcGFyaXNvbk9wZXJhdG9yIE9wZXJhdG9yOworICAgICAgICBwcml2YXRlIHN0cmluZyBfTWF0Y2hpbmdGaWxlU3BlYzsKKyAgICAgICAgaW50ZXJuYWwgdmlydHVhbCBzdHJpbmcgTWF0Y2hpbmdGaWxlU3BlYworICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MjQ1CisgICAgICAgICAgICAgICAgaWYgKERpcmVjdG9yeS5FeGlzdHModmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX01hdGNoaW5nRmlsZVNwZWMgPSAiLlxcIiArIHZhbHVlICsgIlxcKi4qIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX01hdGNoaW5nRmlsZVNwZWMgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfcmVnZXhTdHJpbmcgPSAiXiIgKworICAgICAgICAgICAgICAgIFJlZ2V4LkVzY2FwZShfTWF0Y2hpbmdGaWxlU3BlYykKKyAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoQCJcXFwqXC5cKiIsIEAiXFwoW15cLl0rfC4qXC5bXlxcXC5dKikiKQorICAgICAgICAgICAgICAgICAgICAuUmVwbGFjZShAIlwuXCoiLCBAIlwuW15cXFwuXSoiKQorICAgICAgICAgICAgICAgICAgICAuUmVwbGFjZShAIlwqIiwgQCIuKiIpCisgICAgICAgICAgICAgICAgICAgIC8vLlJlcGxhY2UoQCJcKiIsIEAiW15cXFwuXSoiKSAvLyBpbGwtY29uY2VpdmVkCisgICAgICAgICAgICAgICAgICAgIC5SZXBsYWNlKEAiXD8iLCBAIlteXFxcLl0iKQorICAgICAgICAgICAgICAgICAgICArICIkIjsKKworICAgICAgICAgICAgICAgIENyaXRlcmlvblRyYWNlKCJOYW1lQ3JpdGVyaW9uIHJlZ2V4U3RyaW5nKHswfSkiLCBfcmVnZXhTdHJpbmcpOworCisgICAgICAgICAgICAgICAgX3JlID0gbmV3IFJlZ2V4KF9yZWdleFN0cmluZywgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5BcHBlbmQoIm5hbWUgIikuQXBwZW5kKEVudW1VdGlsLkdldERlc2NyaXB0aW9uKE9wZXJhdG9yKSkKKyAgICAgICAgICAgICAgICAuQXBwZW5kKCIgJyIpCisgICAgICAgICAgICAgICAgLkFwcGVuZChfTWF0Y2hpbmdGaWxlU3BlYykKKyAgICAgICAgICAgICAgICAuQXBwZW5kKCInIik7CisgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBFdmFsdWF0ZShzdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENyaXRlcmlvblRyYWNlKCJOYW1lQ3JpdGVyaW9uOjpFdmFsdWF0ZSgnezB9JyBwYXR0ZXJuW3sxfV0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBfTWF0Y2hpbmdGaWxlU3BlYyk7CisgICAgICAgICAgICByZXR1cm4gX0V2YWx1YXRlKGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBfRXZhbHVhdGUoc3RyaW5nIGZ1bGxwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBDcml0ZXJpb25UcmFjZSgiTmFtZUNyaXRlcmlvbjo6RXZhbHVhdGUoezB9KSIsIGZ1bGxwYXRoKTsKKyAgICAgICAgICAgIC8vIE5vIHNsYXNoIGluIHRoZSBwYXR0ZXJuIGltcGxpY2l0bHkgbWVhbnMgcmVjdXJzZSwgd2hpY2ggbWVhbnMgY29tcGFyZSB0bworICAgICAgICAgICAgLy8gZmlsZW5hbWUgb25seSwgbm90IGZ1bGwgcGF0aC4KKyAgICAgICAgICAgIFN0cmluZyBmID0gKF9NYXRjaGluZ0ZpbGVTcGVjLkluZGV4T2YoJ1xcJykgPT0gLTEpCisgICAgICAgICAgICAgICAgPyBTeXN0ZW0uSU8uUGF0aC5HZXRGaWxlTmFtZShmdWxscGF0aCkKKyAgICAgICAgICAgICAgICA6IGZ1bGxwYXRoOyAvLyBjb21wYXJlIHRvIGZ1bGxwYXRoCisKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gX3JlLklzTWF0Y2goZik7CisKKyAgICAgICAgICAgIGlmIChPcGVyYXRvciAhPSBDb21wYXJpc29uT3BlcmF0b3IuRXF1YWxUbykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAhcmVzdWx0OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBUeXBlQ3JpdGVyaW9uIDogU2VsZWN0aW9uQ3JpdGVyaW9uCisgICAgeworICAgICAgICBwcml2YXRlIGNoYXIgT2JqZWN0VHlwZTsgIC8vICdEJyA9IERpcmVjdG9yeSwgJ0YnID0gRmlsZQorICAgICAgICBpbnRlcm5hbCBDb21wYXJpc29uT3BlcmF0b3IgT3BlcmF0b3I7CisgICAgICAgIGludGVybmFsIHN0cmluZyBBdHRyaWJ1dGVTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdFR5cGUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5MZW5ndGggIT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAodmFsdWVbMF0hPSdEJyAmJiB2YWx1ZVswXSE9J0YnKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJTcGVjaWZ5IGEgc2luZ2xlIGNoYXJhY3RlcjogZWl0aGVyIEQgb3IgRiIpOworICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPSB2YWx1ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgidHlwZSAiKS5BcHBlbmQoRW51bVV0aWwuR2V0RGVzY3JpcHRpb24oT3BlcmF0b3IpKS5BcHBlbmQoIiAiKS5BcHBlbmQoQXR0cmlidXRlU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBFdmFsdWF0ZShzdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENyaXRlcmlvblRyYWNlKCJUeXBlQ3JpdGVyaW9uOjpFdmFsdWF0ZSh7MH0pIiwgZmlsZW5hbWUpOworCisgICAgICAgICAgICBib29sIHJlc3VsdCA9IChPYmplY3RUeXBlID09ICdEJykKKyAgICAgICAgICAgICAgICA/IERpcmVjdG9yeS5FeGlzdHMoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgOiBGaWxlLkV4aXN0cyhmaWxlbmFtZSk7CisKKyAgICAgICAgICAgIGlmIChPcGVyYXRvciAhPSBDb21wYXJpc29uT3BlcmF0b3IuRXF1YWxUbykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAhcmVzdWx0OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworCisjaWYgIVNJTFZFUkxJR0hUCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBBdHRyaWJ1dGVzQ3JpdGVyaW9uIDogU2VsZWN0aW9uQ3JpdGVyaW9uCisgICAgeworICAgICAgICBwcml2YXRlIEZpbGVBdHRyaWJ1dGVzIF9BdHRyaWJ1dGVzOworICAgICAgICBpbnRlcm5hbCBDb21wYXJpc29uT3BlcmF0b3IgT3BlcmF0b3I7CisgICAgICAgIGludGVybmFsIHN0cmluZyBBdHRyaWJ1dGVTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICAgICAgICAgIGlmICgoX0F0dHJpYnV0ZXMgJiBGaWxlQXR0cmlidXRlcy5IaWRkZW4pICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiSCI7CisgICAgICAgICAgICAgICAgaWYgKChfQXR0cmlidXRlcyAmIEZpbGVBdHRyaWJ1dGVzLlN5c3RlbSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJTIjsKKyAgICAgICAgICAgICAgICBpZiAoKF9BdHRyaWJ1dGVzICYgRmlsZUF0dHJpYnV0ZXMuUmVhZE9ubHkpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiUiI7CisgICAgICAgICAgICAgICAgaWYgKChfQXR0cmlidXRlcyAmIEZpbGVBdHRyaWJ1dGVzLkFyY2hpdmUpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiQSI7CisgICAgICAgICAgICAgICAgaWYgKChfQXR0cmlidXRlcyAmIEZpbGVBdHRyaWJ1dGVzLlJlcGFyc2VQb2ludCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJMIjsKKyAgICAgICAgICAgICAgICBpZiAoKF9BdHRyaWJ1dGVzICYgRmlsZUF0dHJpYnV0ZXMuTm90Q29udGVudEluZGV4ZWQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiSSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0F0dHJpYnV0ZXMgPSBGaWxlQXR0cmlidXRlcy5Ob3JtYWw7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoY2hhciBjIGluIHZhbHVlLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX0F0dHJpYnV0ZXMgJiBGaWxlQXR0cmlidXRlcy5IaWRkZW4pICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJSZXBlYXRlZCBmbGFnLiAoezB9KSIsIGMpLCAidmFsdWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQXR0cmlidXRlcyB8PSBGaWxlQXR0cmlidXRlcy5IaWRkZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX0F0dHJpYnV0ZXMgJiBGaWxlQXR0cmlidXRlcy5SZWFkT25seSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlJlcGVhdGVkIGZsYWcuICh7MH0pIiwgYyksICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BdHRyaWJ1dGVzIHw9IEZpbGVBdHRyaWJ1dGVzLlJlYWRPbmx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKF9BdHRyaWJ1dGVzICYgRmlsZUF0dHJpYnV0ZXMuU3lzdGVtKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiUmVwZWF0ZWQgZmxhZy4gKHswfSkiLCBjKSwgInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0F0dHJpYnV0ZXMgfD0gRmlsZUF0dHJpYnV0ZXMuU3lzdGVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKF9BdHRyaWJ1dGVzICYgRmlsZUF0dHJpYnV0ZXMuQXJjaGl2ZSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlJlcGVhdGVkIGZsYWcuICh7MH0pIiwgYyksICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BdHRyaWJ1dGVzIHw9IEZpbGVBdHRyaWJ1dGVzLkFyY2hpdmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX0F0dHJpYnV0ZXMgJiBGaWxlQXR0cmlidXRlcy5Ob3RDb250ZW50SW5kZXhlZCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlJlcGVhdGVkIGZsYWcuICh7MH0pIiwgYyksICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BdHRyaWJ1dGVzIHw9IEZpbGVBdHRyaWJ1dGVzLk5vdENvbnRlbnRJbmRleGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKF9BdHRyaWJ1dGVzICYgRmlsZUF0dHJpYnV0ZXMuUmVwYXJzZVBvaW50KSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiUmVwZWF0ZWQgZmxhZy4gKHswfSkiLCBjKSwgInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0F0dHJpYnV0ZXMgfD0gRmlsZUF0dHJpYnV0ZXMuUmVwYXJzZVBvaW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiYXR0cmlidXRlcyAiKS5BcHBlbmQoRW51bVV0aWwuR2V0RGVzY3JpcHRpb24oT3BlcmF0b3IpKS5BcHBlbmQoIiAiKS5BcHBlbmQoQXR0cmlidXRlU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9FdmFsdWF0ZU9uZShGaWxlQXR0cmlidXRlcyBmaWxlQXR0cnMsIEZpbGVBdHRyaWJ1dGVzIGNyaXRlcmlvbkF0dHJzKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKChfQXR0cmlidXRlcyAmIGNyaXRlcmlvbkF0dHJzKSA9PSBjcml0ZXJpb25BdHRycykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoKGZpbGVBdHRycyAmIGNyaXRlcmlvbkF0dHJzKSA9PSBjcml0ZXJpb25BdHRycyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBFdmFsdWF0ZShzdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTkxCisgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhmaWxlbmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGlyZWN0b3JpZXMgZG9uJ3QgaGF2ZSBmaWxlIGF0dHJpYnV0ZXMsIHNvIHRoZSByZXN1bHQKKyAgICAgICAgICAgICAgICAvLyBvZiBhbiBldmFsdWF0aW9uIGlzIGFsd2F5cyBOTy4gVGhpcyBnZXRzIG5lZ2F0ZWQgaWYKKyAgICAgICAgICAgICAgICAvLyB0aGUgb3BlcmF0b3IgaXMgTm90RXF1YWxUby4KKyAgICAgICAgICAgICAgICByZXR1cm4gKE9wZXJhdG9yICE9IENvbXBhcmlzb25PcGVyYXRvci5FcXVhbFRvKTsKKyAgICAgICAgICAgIH0KKyNpZiBORVRDRgorICAgICAgICAgICAgRmlsZUF0dHJpYnV0ZXMgZmlsZUF0dHJzID0gTmV0Q2ZGaWxlLkdldEF0dHJpYnV0ZXMoZmlsZW5hbWUpOworI2Vsc2UKKyAgICAgICAgICAgIEZpbGVBdHRyaWJ1dGVzIGZpbGVBdHRycyA9IFN5c3RlbS5JTy5GaWxlLkdldEF0dHJpYnV0ZXMoZmlsZW5hbWUpOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBfRXZhbHVhdGUoZmlsZUF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBfRXZhbHVhdGUoRmlsZUF0dHJpYnV0ZXMgZmlsZUF0dHJzKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IF9FdmFsdWF0ZU9uZShmaWxlQXR0cnMsIEZpbGVBdHRyaWJ1dGVzLkhpZGRlbik7CisgICAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9FdmFsdWF0ZU9uZShmaWxlQXR0cnMsIEZpbGVBdHRyaWJ1dGVzLlN5c3RlbSk7CisgICAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9FdmFsdWF0ZU9uZShmaWxlQXR0cnMsIEZpbGVBdHRyaWJ1dGVzLlJlYWRPbmx5KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gX0V2YWx1YXRlT25lKGZpbGVBdHRycywgRmlsZUF0dHJpYnV0ZXMuQXJjaGl2ZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9FdmFsdWF0ZU9uZShmaWxlQXR0cnMsIEZpbGVBdHRyaWJ1dGVzLk5vdENvbnRlbnRJbmRleGVkKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gX0V2YWx1YXRlT25lKGZpbGVBdHRycywgRmlsZUF0dHJpYnV0ZXMuUmVwYXJzZVBvaW50KTsKKworICAgICAgICAgICAgaWYgKE9wZXJhdG9yICE9IENvbXBhcmlzb25PcGVyYXRvci5FcXVhbFRvKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICFyZXN1bHQ7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBDb21wb3VuZENyaXRlcmlvbiA6IFNlbGVjdGlvbkNyaXRlcmlvbgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgTG9naWNhbENvbmp1bmN0aW9uIENvbmp1bmN0aW9uOworICAgICAgICBpbnRlcm5hbCBTZWxlY3Rpb25Dcml0ZXJpb24gTGVmdDsKKworICAgICAgICBwcml2YXRlIFNlbGVjdGlvbkNyaXRlcmlvbiBfUmlnaHQ7CisgICAgICAgIGludGVybmFsIFNlbGVjdGlvbkNyaXRlcmlvbiBSaWdodAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX1JpZ2h0OyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfUmlnaHQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgQ29uanVuY3Rpb24gPSBMb2dpY2FsQ29uanVuY3Rpb24uTk9ORTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDb25qdW5jdGlvbiA9PSBMb2dpY2FsQ29uanVuY3Rpb24uTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgQ29uanVuY3Rpb24gPSBMb2dpY2FsQ29uanVuY3Rpb24uQU5EOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBib29sIEV2YWx1YXRlKHN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBMZWZ0LkV2YWx1YXRlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHN3aXRjaCAoQ29uanVuY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMb2dpY2FsQ29uanVuY3Rpb24uQU5EOgorICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmlnaHQuRXZhbHVhdGUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExvZ2ljYWxDb25qdW5jdGlvbi5PUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodC5FdmFsdWF0ZShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTG9naWNhbENvbmp1bmN0aW9uLlhPUjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IF49IFJpZ2h0LkV2YWx1YXRlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDb25qdW5jdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kKCIoIikKKyAgICAgICAgICAgIC5BcHBlbmQoKExlZnQgIT0gbnVsbCkgPyBMZWZ0LlRvU3RyaW5nKCkgOiAibnVsbCIpCisgICAgICAgICAgICAuQXBwZW5kKCIgIikKKyAgICAgICAgICAgIC5BcHBlbmQoQ29uanVuY3Rpb24uVG9TdHJpbmcoKSkKKyAgICAgICAgICAgIC5BcHBlbmQoIiAiKQorICAgICAgICAgICAgLkFwcGVuZCgoUmlnaHQgIT0gbnVsbCkgPyBSaWdodC5Ub1N0cmluZygpIDogIm51bGwiKQorICAgICAgICAgICAgLkFwcGVuZCgiKSIpOworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIEZpbGVTZWxlY3RvciBlbmNhcHN1bGF0ZXMgbG9naWMgdGhhdCBzZWxlY3RzIGZpbGVzIGZyb20gYSBzb3VyY2UgLSBhIHppcCBmaWxlCisgICAgLy8vICAgb3IgdGhlIGZpbGVzeXN0ZW0gLSBiYXNlZCBvbiBhIHNldCBvZiBjcml0ZXJpYS4gIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5CisgICAgLy8vICAgYnkgdGhlIERvdE5ldFppcCBsaWJyYXJ5LCBpbiBwYXJ0aWN1bGFyIGZvciB0aGUgQWRkU2VsZWN0ZWRGaWxlcygpIG1ldGhvZHMuCisgICAgLy8vICAgVGhpcyBjbGFzcyBjYW4gYWxzbyBiZSB1c2VkIGluZGVwZW5kZW50bHkgb2YgdGhlIHppcCBjYXBhYmlsaXR5IGluIERvdE5ldFppcC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhlIEZpbGVTZWxlY3RvciBjbGFzcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFppcEZpbGUgY2xhc3MgZm9yIHNlbGVjdGluZworICAgIC8vLyAgIGZpbGVzIGZvciBpbmNsdXNpb24gaW50byB0aGUgWmlwRmlsZSwgd2hlbiB0aGUgPHNlZQorICAgIC8vLyAgIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nLFN0cmluZykiLz4gbWV0aG9kLCBvciBvbmUgb2YKKyAgICAvLy8gICBpdHMgb3ZlcmxvYWRzLCBpcyBjYWxsZWQuICBJdCdzIGFsc28gdXNlZCBmb3IgdGhlIDxzZWUKKyAgICAvLy8gICBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5FeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKFN0cmluZykiLz4gbWV0aG9kcy4gIFR5cGljYWxseSwgYW4KKyAgICAvLy8gICBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgb3IgbWFuaXB1bGF0ZXMgWmlwIGFyY2hpdmVzIHdpbGwgbm90IGRpcmVjdGx5CisgICAgLy8vICAgaW50ZXJhY3Qgd2l0aCB0aGUgRmlsZVNlbGVjdG9yIGNsYXNzLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIHVzZSB0aGUgRmlsZVNlbGVjdG9yIGNsYXNzIGRpcmVjdGx5LCB0bworICAgIC8vLyAgIHNlbGVjdCBmaWxlcyBmcm9tIGRpc2sgdm9sdW1lcyBiYXNlZCBvbiBhIHNldCBvZiBjcml0ZXJpYSwgd2l0aG91dCBjcmVhdGluZyBvcgorICAgIC8vLyAgIHF1ZXJ5aW5nIFppcCBhcmNoaXZlcy4gIFRoZSBmaWxlIHNlbGVjdGlvbiBjcml0ZXJpYSBpbmNsdWRlOiBhIHBhdHRlcm4gdG8KKyAgICAvLy8gICBtYXRjaCB0aGUgZmlsZW5hbWU7IHRoZSBsYXN0IG1vZGlmaWVkLCBjcmVhdGVkLCBvciBsYXN0IGFjY2Vzc2VkIHRpbWUgb2YgdGhlCisgICAgLy8vICAgZmlsZTsgdGhlIHNpemUgb2YgdGhlIGZpbGU7IGFuZCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZmlsZS4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciA8c2VlIGNyZWY9IlNlbGVjdGlvbkNyaXRlcmlhIi8+CisgICAgLy8vICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIEZpbGVTZWxlY3RvcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgU2VsZWN0aW9uQ3JpdGVyaW9uIF9Dcml0ZXJpb247CisKKyNpZiBOT1RVU0VECisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVHlwaWNhbGx5LCBhcHBsaWNhdGlvbnMgd29uJ3QgdXNlIHRoaXMgY29uc3RydWN0b3IuICBJbnN0ZWFkIHRoZXknbGwKKyAgICAgICAgLy8vICAgY2FsbCB0aGUgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGEgc2VsZWN0aW9uQ3JpdGVyaWEgc3RyaW5nLiAgSWYgeW91CisgICAgICAgIC8vLyAgIHVzZSB0aGlzIGNvbnN0cnVjdG9yLCB5b3UnbGwgd2FudCB0byBzZXQgdGhlIFNlbGVjdGlvbkNyaXRlcmlhCisgICAgICAgIC8vLyAgIHByb3BlcnR5IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgY2FsbGluZyBTZWxlY3RGaWxlcygpLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwcm90ZWN0ZWQgRmlsZVNlbGVjdG9yKCkgeyB9CisjZW5kaWYKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDb25zdHJ1Y3RvciB0aGF0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgZmlsZSBzZWxlY3Rpb24gY3JpdGVyaWEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgc2V0IG9mIGNyaXRlcmlhIGZvcgorICAgICAgICAvLy8gICBzZWxlY3Rpb24gb2YgZmlsZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSA8c2VlIGNyZWY9IkZpbGVTZWxlY3Rvci5TZWxlY3Rpb25Dcml0ZXJpYSIvPiBmb3IgYSBkZXNjcmlwdGlvbiBvZgorICAgICAgICAvLy8gICB0aGUgc3ludGF4IG9mIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEJ5IGRlZmF1bHQgdGhlIEZpbGVTZWxlY3RvciB3aWxsIHRyYXZlcnNlIE5URlMgUmVwYXJzZSBQb2ludHMuICBUbworICAgICAgICAvLy8gICBjaGFuZ2UgdGhpcywgdXNlIDxzZWUgY3JlZj0iRmlsZVNlbGVjdG9yKFN0cmluZywKKyAgICAgICAgLy8vICAgYm9vbCkiPkZpbGVTZWxlY3RvcihTdHJpbmcsIGJvb2wpPC9zZWU+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZWxlY3Rpb25Dcml0ZXJpYSI+VGhlIGNyaXRlcmlhIGZvciBmaWxlIHNlbGVjdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgRmlsZVNlbGVjdG9yKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSkKKyAgICAgICAgOiB0aGlzKHNlbGVjdGlvbkNyaXRlcmlhLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBmaWxlIHNlbGVjdGlvbiBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSBzZXQgb2YgY3JpdGVyaWEgZm9yCisgICAgICAgIC8vLyAgIHNlbGVjdGlvbiBvZiBmaWxlcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2VlIDxzZWUgY3JlZj0iRmlsZVNlbGVjdG9yLlNlbGVjdGlvbkNyaXRlcmlhIi8+IGZvciBhIGRlc2NyaXB0aW9uIG9mCisgICAgICAgIC8vLyAgIHRoZSBzeW50YXggb2YgdGhlIHNlbGVjdGlvbkNyaXRlcmlhIHN0cmluZy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VsZWN0aW9uQ3JpdGVyaWEiPlRoZSBjcml0ZXJpYSBmb3IgZmlsZSBzZWxlY3Rpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0cmF2ZXJzZURpcmVjdG9yeVJlcGFyc2VQb2ludHMiPgorICAgICAgICAvLy8gd2hldGhlciB0byB0cmF2ZXJzZSBOVEZTIHJlcGFyc2UgcG9pbnRzIChqdW5jdGlvbnMpLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEZpbGVTZWxlY3RvcihTdHJpbmcgc2VsZWN0aW9uQ3JpdGVyaWEsIGJvb2wgdHJhdmVyc2VEaXJlY3RvcnlSZXBhcnNlUG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KHNlbGVjdGlvbkNyaXRlcmlhKSkKKyAgICAgICAgICAgICAgICBfQ3JpdGVyaW9uID0gX1BhcnNlQ3JpdGVyaW9uKHNlbGVjdGlvbkNyaXRlcmlhKTsKKyAgICAgICAgICAgIFRyYXZlcnNlUmVwYXJzZVBvaW50cyA9IHRyYXZlcnNlRGlyZWN0b3J5UmVwYXJzZVBvaW50czsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBzdHJpbmcgc3BlY2lmeWluZyB3aGljaCBmaWxlcyB0byBpbmNsdWRlIHdoZW4gcmV0cmlldmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTcGVjaWZ5IHRoZSBjcml0ZXJpYSBpbiBzdGF0ZW1lbnRzIG9mIDMgZWxlbWVudHM6IGEgbm91biwgYW4gb3BlcmF0b3IsCisgICAgICAgIC8vLyAgIGFuZCBhIHZhbHVlLiAgQ29uc2lkZXIgdGhlIHN0cmluZyAibmFtZSAhPSAqLmRvYyIgLiAgVGhlIG5vdW4gaXMKKyAgICAgICAgLy8vICAgIm5hbWUiLiAgVGhlIG9wZXJhdG9yIGlzICIhPSIsIGltcGx5aW5nICJOb3QgRXF1YWwiLiAgVGhlIHZhbHVlIGlzCisgICAgICAgIC8vLyAgICIqLmRvYyIuICBUaGF0IGNyaXRlcmlvbiwgaW4gRW5nbGlzaCwgc2F5cyAiYWxsIGZpbGVzIHdpdGggYSBuYW1lIHRoYXQKKyAgICAgICAgLy8vICAgZG9lcyBub3QgZW5kIGluIHRoZSAuZG9jIGV4dGVuc2lvbi4iCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFN1cHBvcnRlZCBub3VucyBpbmNsdWRlICJuYW1lIiAob3IgImZpbGVuYW1lIikgZm9yIHRoZSBmaWxlbmFtZTsKKyAgICAgICAgLy8vICAgImF0aW1lIiwgIm10aW1lIiwgYW5kICJjdGltZSIgZm9yIGxhc3QgYWNjZXNzIHRpbWUsIGxhc3QgbW9kZmllZCB0aW1lLAorICAgICAgICAvLy8gICBhbmQgY3JlYXRlZCB0aW1lIG9mIHRoZSBmaWxlLCByZXNwZWN0aXZlbHk7ICJhdHRyaWJ1dGVzIiAob3IgImF0dHJzIikKKyAgICAgICAgLy8vICAgZm9yIHRoZSBmaWxlIGF0dHJpYnV0ZXM7ICJzaXplIiAob3IgImxlbmd0aCIpIGZvciB0aGUgZmlsZSBsZW5ndGgKKyAgICAgICAgLy8vICAgKHVuY29tcHJlc3NlZCk7IGFuZCAidHlwZSIgZm9yIHRoZSB0eXBlIG9mIG9iamVjdCwgZWl0aGVyIGEgZmlsZSBvciBhCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeS4gIFRoZSAiYXR0cmlidXRlcyIsICJ0eXBlIiwgYW5kICJuYW1lIiBub3VucyBhbGwgc3VwcG9ydCA9CisgICAgICAgIC8vLyAgIGFuZCAhPSBhcyBvcGVyYXRvcnMuICBUaGUgInNpemUiLCAiYXRpbWUiLCAibXRpbWUiLCBhbmQgImN0aW1lIiBub3VucworICAgICAgICAvLy8gICBzdXBwb3J0ID0gYW5kICE9LCBhbmQgJmd0OywgJmd0Oz0sICZsdDssICZsdDs9IGFzIHdlbGwuICBUaGUgdGltZXMgYXJlCisgICAgICAgIC8vLyAgIHRha2VuIHRvIGJlIGV4cHJlc3NlZCBpbiBsb2NhbCB0aW1lLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTcGVjaWZ5IHZhbHVlcyBmb3IgdGhlIGZpbGUgYXR0cmlidXRlcyBhcyBhIHN0cmluZyB3aXRoIG9uZSBvciBtb3JlIG9mCisgICAgICAgIC8vLyAgIHRoZSBjaGFyYWN0ZXJzIEgsUixTLEEsSSxMIGluIGFueSBvcmRlciwgaW1wbHlpbmcgZmlsZSBhdHRyaWJ1dGVzIG9mCisgICAgICAgIC8vLyAgIEhpZGRlbiwgUmVhZE9ubHksIFN5c3RlbSwgQXJjaGl2ZSwgTm90Q29udGV4dEluZGV4ZWQsIGFuZCBSZXBhcnNlUG9pbnQKKyAgICAgICAgLy8vICAgKHN5bWJvbGljIGxpbmspIHJlc3BlY3RpdmVseS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG8gc3BlY2lmeSBhIHRpbWUsIHVzZSBZWVlZLU1NLURELUhIOm1tOnNzIG9yIFlZWVkvTU0vREQtSEg6bW06c3MgYXMKKyAgICAgICAgLy8vICAgdGhlIGZvcm1hdC4gIElmIHlvdSBvbWl0IHRoZSBISDptbTpzcyBwb3J0aW9uLCBpdCBpcyBhc3N1bWVkIHRvIGJlCisgICAgICAgIC8vLyAgIDAwOjAwOjAwIChtaWRuaWdodCkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSB2YWx1ZSBmb3IgYSBzaXplIGNyaXRlcmlvbiBpcyBleHByZXNzZWQgaW4gaW50ZWdlciBxdWFudGl0aWVzIG9mCisgICAgICAgIC8vLyAgIGJ5dGVzLCBraWxvYnl0ZXMgKHVzZSBrIG9yIGtiIGFmdGVyIHRoZSBudW1iZXIpLCBtZWdhYnl0ZXMgKG0gb3IgbWIpLAorICAgICAgICAvLy8gICBvciBnaWdhYnl0ZXMgKGcgb3IgZ2IpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgdmFsdWUgZm9yIGEgbmFtZSBpcyBhIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdCB0aGUgZmlsZW5hbWUsCisgICAgICAgIC8vLyAgIHBvdGVudGlhbGx5IGluY2x1ZGluZyB3aWxkY2FyZHMuICBUaGUgcGF0dGVybiBmb2xsb3dzIENNRC5leGUgZ2xvYgorICAgICAgICAvLy8gICBydWxlczogKiBpbXBsaWVzIG9uZSBvciBtb3JlIG9mIGFueSBjaGFyYWN0ZXIsIHdoaWxlID8gIGltcGxpZXMgb25lCisgICAgICAgIC8vLyAgIGNoYXJhY3Rlci4gIElmIHRoZSBuYW1lIHBhdHRlcm4gY29udGFpbnMgYW55IHNsYXNoZXMsIGl0IGlzIG1hdGNoZWQgdG8KKyAgICAgICAgLy8vICAgdGhlIGVudGlyZSBmaWxlbmFtZSwgaW5jbHVkaW5nIHRoZSBwYXRoOyBvdGhlcndpc2UsIGl0IGlzIG1hdGNoZWQKKyAgICAgICAgLy8vICAgYWdhaW5zdCBvbmx5IHRoZSBmaWxlbmFtZSB3aXRob3V0IHRoZSBwYXRoLiAgVGhpcyBtZWFucyBhIHBhdHRlcm4gb2YKKyAgICAgICAgLy8vICAgIipcKi4qIiBtYXRjaGVzIGFsbCBmaWxlcyBvbmUgZGlyZWN0b3J5IGxldmVsIGRlZXAsIHdoaWxlIGEgcGF0dGVybiBvZgorICAgICAgICAvLy8gICAiKi4qIiBtYXRjaGVzIGFsbCBmaWxlcyBpbiBhbGwgZGlyZWN0b3JpZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRvIHNwZWNpZnkgYSBuYW1lIHBhdHRlcm4gdGhhdCBpbmNsdWRlcyBzcGFjZXMsIHVzZSBzaW5nbGUgcXVvdGVzCisgICAgICAgIC8vLyAgIGFyb3VuZCB0aGUgcGF0dGVybi4gIEEgcGF0dGVybiBvZiAiJyogKi4qJyIgd2lsbCBtYXRjaCBhbGwgZmlsZXMgdGhhdAorICAgICAgICAvLy8gICBoYXZlIHNwYWNlcyBpbiB0aGUgZmlsZW5hbWUuICBUaGUgZnVsbCBjcml0ZXJpYSBzdHJpbmcgZm9yIHRoYXQgd291bGQKKyAgICAgICAgLy8vICAgYmUgIm5hbWUgPSAnKiAqLionIiAuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSB2YWx1ZSBmb3IgYSB0eXBlIGNyaXRlcmlvbiBpcyBlaXRoZXIgRiAoaW1wbHlpbmcgYSBmaWxlKSBvciBECisgICAgICAgIC8vLyAgIChpbXBseWluZyBhIGRpcmVjdG9yeSkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNvbWUgZXhhbXBsZXM6CisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgorICAgICAgICAvLy8gICA8bGlzdGhlYWRlcj4KKyAgICAgICAgLy8vICAgICA8dGVybT5jcml0ZXJpYTwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+RmlsZXMgcmV0cmlldmVkPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgPC9saXN0aGVhZGVyPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPGl0ZW0+CisgICAgICAgIC8vLyAgICAgPHRlcm0+bmFtZSAhPSAqLnhscyA8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPmFueSBmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIHRoYXQgaXMgbm90IC54bHMKKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT5uYW1lID0gKi5tcDMgPC90ZXJtPgorICAgICAgICAvLy8gICAgIDxkZXNjcmlwdGlvbj5hbnkgZmlsZSB3aXRoIGEgLm1wMyBleHRlbnNpb24uCisgICAgICAgIC8vLyAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPGl0ZW0+CisgICAgICAgIC8vLyAgICAgPHRlcm0+Ki5tcDM8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPihzYW1lIGFzIGFib3ZlKSBhbnkgZmlsZSB3aXRoIGEgLm1wMyBleHRlbnNpb24uCisgICAgICAgIC8vLyAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPGl0ZW0+CisgICAgICAgIC8vLyAgICAgPHRlcm0+YXR0cmlidXRlcyA9IEEgPC90ZXJtPgorICAgICAgICAvLy8gICAgIDxkZXNjcmlwdGlvbj5hbGwgZmlsZXMgd2hvc2UgYXR0cmlidXRlcyBpbmNsdWRlIHRoZSBBcmNoaXZlIGJpdC4KKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT5hdHRyaWJ1dGVzICE9IEggPC90ZXJtPgorICAgICAgICAvLy8gICAgIDxkZXNjcmlwdGlvbj5hbGwgZmlsZXMgd2hvc2UgYXR0cmlidXRlcyBkbyBub3QgaW5jbHVkZSB0aGUgSGlkZGVuIGJpdC4KKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT5tdGltZSA+IDIwMDktMDEtMDE8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPmFsbCBmaWxlcyB3aXRoIGEgbGFzdCBtb2RpZmllZCB0aW1lIGFmdGVyIEphbnVhcnkgMXN0LCAyMDA5LgorICAgICAgICAvLy8gICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxpdGVtPgorICAgICAgICAvLy8gICAgIDx0ZXJtPmN0aW1lID4gMjAwOS8wMS8wMS0wMzowMDowMDwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+YWxsIGZpbGVzIHdpdGggYSBjcmVhdGVkIHRpbWUgYWZ0ZXIgM2FtIChsb2NhbCB0aW1lKSwKKyAgICAgICAgLy8vICAgICBvbiBKYW51YXJ5IDFzdCwgMjAwOS4KKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT5zaXplID4gMmdiPC90ZXJtPgorICAgICAgICAvLy8gICAgIDxkZXNjcmlwdGlvbj5hbGwgZmlsZXMgd2hvc2UgdW5jb21wcmVzc2VkIHNpemUgaXMgZ3JlYXRlciB0aGFuIDJnYi4KKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT50eXBlID0gRDwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+YWxsIGRpcmVjdG9yaWVzIGluIHRoZSBmaWxlc3lzdGVtLiA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9saXN0PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBZb3UgY2FuIGNvbWJpbmUgY3JpdGVyaWEgd2l0aCB0aGUgY29uanVuY3Rpb25zIEFORCwgT1IsIGFuZCBYT1IuIFVzaW5nCisgICAgICAgIC8vLyAgIGEgc3RyaW5nIGxpa2UgIm5hbWUgPSAqLnR4dCBBTkQgc2l6ZSAmZ3Q7PSAxMDBrIiBmb3IgdGhlCisgICAgICAgIC8vLyAgIHNlbGVjdGlvbkNyaXRlcmlhIHJldHJpZXZlcyBlbnRyaWVzIHdob3NlIG5hbWVzIGVuZCBpbiAudHh0LCBhbmQgd2hvc2UKKyAgICAgICAgLy8vICAgdW5jb21wcmVzc2VkIHNpemUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwMCBraWxvYnl0ZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciBtb3JlIGNvbXBsZXggY29tYmluYXRpb25zIG9mIGNyaXRlcmlhLCB5b3UgY2FuIHVzZSBwYXJlbnRoZXNpcyB0bworICAgICAgICAvLy8gICBncm91cCBjbGF1c2VzIGluIHRoZSBib29sZWFuIGxvZ2ljLiAgQWJzZW50IHBhcmVudGhlc2lzLCB0aGUKKyAgICAgICAgLy8vICAgcHJlY2VkZW5jZSBvZiB0aGUgY3JpdGVyaW9uIGF0b21zIGlzIGRldGVybWluZWQgYnkgb3JkZXIgb2YKKyAgICAgICAgLy8vICAgYXBwZWFyYW5jZS4gIFVubGlrZSB0aGUgQyMgbGFuZ3VhZ2UsIHRoZSBBTkQgY29uanVuY3Rpb24gZG9lcyBub3QgdGFrZQorICAgICAgICAvLy8gICBwcmVjZW5kZW5jZSBvdmVyIHRoZSBsb2dpY2FsIE9SLiAgVGhpcyBpcyBpbXBvcnRhbnQgb25seSBpbiBzdHJpbmdzCisgICAgICAgIC8vLyAgIHRoYXQgY29udGFpbiAzIG9yIG1vcmUgY3JpdGVyaW9uIGF0b21zLiAgSW4gb3RoZXIgd29yZHMsICJuYW1lID0gKi50eHQKKyAgICAgICAgLy8vICAgYW5kIHNpemUgJmd0OyAxMDAwIG9yIGF0dHJpYnV0ZXMgPSBIIiBpbXBsaWVzICIoKG5hbWUgPSAqLnR4dCBBTkQgc2l6ZQorICAgICAgICAvLy8gICAmZ3Q7IDEwMDApIE9SIGF0dHJpYnV0ZXMgPSBIKSIgd2hpbGUgImF0dHJpYnV0ZXMgPSBIIE9SIG5hbWUgPSAqLnR4dAorICAgICAgICAvLy8gICBhbmQgc2l6ZSAmZ3Q7IDEwMDAiIGV2YWx1YXRlcyB0byAiKChhdHRyaWJ1dGVzID0gSCBPUiBuYW1lID0gKi50eHQpCisgICAgICAgIC8vLyAgIEFORCBzaXplICZndDsgMTAwMCkiLiAgV2hlbiBpbiBkb3VidCwgdXNlIHBhcmVudGhlc2lzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBVc2luZyB0aW1lIHByb3BlcnRpZXMgcmVxdWlyZXMgc29tZSBleHRyYSBjYXJlLiBJZiB5b3Ugd2FudCB0bworICAgICAgICAvLy8gICByZXRyaWV2ZSBhbGwgZW50cmllcyB0aGF0IHdlcmUgbGFzdCB1cGRhdGVkIG9uIDIwMDkgRmVicnVhcnkgMTQsCisgICAgICAgIC8vLyAgIHNwZWNpZnkgIm10aW1lICZndDs9IDIwMDktMDItMTQgQU5EIG10aW1lICZsdDsgMjAwOS0wMi0xNSIuICBSZWFkIHRoaXMKKyAgICAgICAgLy8vICAgdG8gc2F5OiBhbGwgZmlsZXMgdXBkYXRlZCBhZnRlciAxMjowMGFtIG9uIEZlYnJ1YXJ5IDE0dGgsIHVudGlsCisgICAgICAgIC8vLyAgIDEyOjAwYW0gb24gRmVicnVhcnkgMTV0aC4gIFlvdSBjYW4gdXNlIHRoZSBzYW1lIGJyYWNrZXRpbmcgYXBwcm9hY2ggdG8KKyAgICAgICAgLy8vICAgc3BlY2lmeSBhbnkgdGltZSBwZXJpb2QgLSBhIHllYXIsIGEgbW9udGgsIGEgd2VlaywgYW5kIHNvIG9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgc3ludGF4IGFsbG93cyBvbmUgc3BlY2lhbCBjYXNlOiBpZiB5b3UgcHJvdmlkZSBhIHN0cmluZyB3aXRoIG5vCisgICAgICAgIC8vLyAgIHNwYWNlcywgaXQgaXMgdHJlYXRlZCBhcyBhIHBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBmaWxlbmFtZS4KKyAgICAgICAgLy8vICAgVGhlcmVmb3JlIGEgc3RyaW5nIGxpa2UgIioueGxzIiB3aWxsIGJlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyAibmFtZQorICAgICAgICAvLy8gICA9ICoueGxzIi4gIFRoaXMgInNob3J0aGFuZCIgbm90YXRpb24gZG9lcyBub3Qgd29yayB3aXRoIGNvbXBvdW5kCisgICAgICAgIC8vLyAgIGNyaXRlcmlhLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGVyZSBpcyBubyBsb2dpYyBpbiB0aGlzIGNsYXNzIHRoYXQgaW5zdXJlcyB0aGF0IHRoZSBpbmNsdXNpb24KKyAgICAgICAgLy8vICAgY3JpdGVyaWEgYXJlIGludGVybmFsbHkgY29uc2lzdGVudC4gIEZvciBleGFtcGxlLCBpdCdzIHBvc3NpYmxlIHRvCisgICAgICAgIC8vLyAgIHNwZWNpZnkgY3JpdGVyaWEgdGhhdCBzYXlzIHRoZSBmaWxlIG11c3QgaGF2ZSBhIHNpemUgb2YgbGVzcyB0aGFuIDEwMAorICAgICAgICAvLy8gICBieXRlcywgYXMgd2VsbCBhcyBhIHNpemUgdGhhdCBpcyBncmVhdGVyIHRoYW4gMTAwMCBieXRlcy4gIE9idmlvdXNseQorICAgICAgICAvLy8gICBubyBmaWxlIHdpbGwgZXZlciBzYXRpc2Z5IHN1Y2ggY3JpdGVyaWEsIGJ1dCB0aGlzIGNsYXNzIGRvZXMgbm90IGNoZWNrCisgICAgICAgIC8vLyAgIGZvciBvciBkZXRlY3Qgc3VjaCBpbmNvbnNpc3RlbmNpZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkV4Y2VwdGlvbiI+CisgICAgICAgIC8vLyAgIFRocm93biBpbiB0aGUgc2V0dGVyIGlmIHRoZSB2YWx1ZSBoYXMgYW4gaW52YWxpZCBzeW50YXguCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KKyAgICAgICAgcHVibGljIFN0cmluZyBTZWxlY3Rpb25Dcml0ZXJpYQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX0NyaXRlcmlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX0NyaXRlcmlvbi5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIF9Dcml0ZXJpb24gPSBudWxsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLlRyaW0oKSA9PSAiIikgX0NyaXRlcmlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfQ3JpdGVyaW9uID0gX1BhcnNlQ3JpdGVyaW9uKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICBJbmRpY2F0ZXMgd2hldGhlciBzZWFyY2hlcyB3aWxsIHRyYXZlcnNlIE5URlMgcmVwYXJzZSBwb2ludHMsIGxpa2UgSnVuY3Rpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBUcmF2ZXJzZVJlcGFyc2VQb2ludHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OyBzZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgZW51bSBQYXJzZVN0YXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YXJ0LAorICAgICAgICAgICAgT3BlblBhcmVuLAorICAgICAgICAgICAgQ3JpdGVyaW9uRG9uZSwKKyAgICAgICAgICAgIENvbmp1bmN0aW9uUGVuZGluZywKKyAgICAgICAgICAgIFdoaXRlc3BhY2UsCisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZ2V4QXNzZXJ0aW9ucworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFN0cmluZyBQcmVjZWRlZEJ5T2RkTnVtYmVyT2ZTaW5nbGVRdW90ZXMgPSAiKD88PSg/OlteJ10qJ1teJ10qJykqJ1teJ10qKSI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFN0cmluZyBGb2xsb3dlZEJ5T2RkTnVtYmVyT2ZTaW5nbGVRdW90ZXNBbmRMaW5lRW5kID0gIig/PVteJ10qJyg/OlteJ10qJ1teJ10qJykqW14nXSokKSI7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU3RyaW5nIFByZWNlZGVkQnlFdmVuTnVtYmVyT2ZTaW5nbGVRdW90ZXMgPSAiKD88PSg/OlteJ10qJ1teJ10qJykqW14nXSopIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU3RyaW5nIEZvbGxvd2VkQnlFdmVuTnVtYmVyT2ZTaW5nbGVRdW90ZXNBbmRMaW5lRW5kID0gIig/PSg/OlteJ10qJ1teJ10qJykqW14nXSokKSI7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBOb3JtYWxpemVDcml0ZXJpYUV4cHJlc3Npb24oc3RyaW5nIHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyB0byBub3JtYWxpemUgdGhlIGNyaXRlcmlvbiBleHByZXNzaW9uLiBBdCBvdXRwdXQsIGluCisgICAgICAgICAgICAvLyB0aGUgdHJhbnNmb3JtZWQgY3JpdGVyaW9uIHN0cmluZywgZXZlcnkgc2lnbmlmaWNhbnQgc3ludGFjdGljIGVsZW1lbnQKKyAgICAgICAgICAgIC8vIC0gYSBwcm9wZXJ0eSBlbGVtZW50LCBncm91cGluZyBwYXJlbiBmb3IgdGhlIGJvb2xlYW4gbG9naWMsIG9wZXJhdG9yCisgICAgICAgICAgICAvLyAoID0gPCA+ICE9ICksIGNvbmp1bmN0aW9uLCBvciBwcm9wZXJ0eSB2YWx1ZSAtIHdpbGwgYmUgc2VwYXJhdGVkIGZyb20KKyAgICAgICAgICAgIC8vIGl0cyBuZWlnaGJvcnMgYnkgYXQgbGVhc3Qgb25lIHNwYWNlLiBUaHVzLAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGJlZm9yZSAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcgorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgLy8gbmFtZT0qLnR4dCAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAqLnR4dAorICAgICAgICAgICAgLy8gKHNpemU+MTAwKUFORChuYW1lPSoudHh0KSAgICAgICggc2l6ZSA+IDEwMCApIEFORCAoIG5hbWUgPSAqLnR4dCApCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhpcyBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgICAgIC8vIHJlcGxhY2VtZW50LiBUaGlzIG1ldGhvZCBhcHBsaWVzIGEgZGlzdGluY3QgcmVnZXggcGF0dGVybiBhbmQKKyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgcmVwbGFjZW1lbnQgc3RyaW5nIGZvciBlYWNoIG9uZSBvZiBhIG51bWJlciBvZiBjYXNlczoKKyAgICAgICAgICAgIC8vIGFuIG9wZW4gcGFyZW4gZm9sbG93ZWQgYnkgYSB3b3JkOyBhIHdvcmQgZm9sbG93ZWQgYnkgYSBjbG9zZS1wYXJlbjsgYQorICAgICAgICAgICAgLy8gcGFpciBvZiBvcGVuIHBhcmVuczsgYSBjbG9zZSBwYXJlbiBmb2xsb3dlZCBieSBhIHdvcmQgKHdoaWNoIHNob3VsZAorICAgICAgICAgICAgLy8gdGhlbiBiZSBmb2xsb3dlZCBieSBhbiBvcGVuIHBhcmVuKS4gQW5kIHNvIG9uLiBUaGVzZSBwYXR0ZXJucyBhbmQKKyAgICAgICAgICAgIC8vIHJlcGxhY2VtZW50cyBhcmUgYWxsIHN0b3JlZCBpbiBwclBhaXJzLiBCeSBhcHBseWluZyBlYWNoIG9mIHRoZXNlCisgICAgICAgICAgICAvLyByZWdleCByZXBsYWNlbWVudHMgaW4gdHVybiwgd2UgZ2V0IHRoZSB0cmFuc2Zvcm1lZCBzdHJpbmcuIEVhc3kuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIHJlc3VsdGluZyAibm9ybWFsaXplZCIgY3JpdGVyaW9uIHN0cmluZywgaXMgdGhlbiB1c2VkIGFzIHRoZQorICAgICAgICAgICAgLy8gc3ViamVjdCB0aGF0IGdldHMgcGFyc2VkLCBieSBzcGxpdHRpbmcgdGhlIHN0cmluZyBpbnRvIHRva2VucyB0aGF0CisgICAgICAgICAgICAvLyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gIEhlcmUsIHRoZXJlJ3MgYSB0d2lzdC4gVGhlIHNwYWNlcyB3aXRoaW4KKyAgICAgICAgICAgIC8vIHNpbmdsZS1xdW90ZSBkZWxpbWl0ZXJzIGRvIG5vdCBkZWxpbWl0IGRpc3RpbmN0IHRva2Vucy4gIFNvLCB0aGlzCisgICAgICAgICAgICAvLyBub3JtYWxpemF0aW9uIG1ldGhvZCB0ZW1wb3JhcmlseSByZXBsYWNlcyB0aG9zZSBzcGFjZXMgd2l0aAorICAgICAgICAgICAgLy8gQVNDSUkgNiAoMHgwNiksIGEgY29udHJvbCBjaGFyYWN0ZXIgd2hpY2ggaXMgbm90IGEgbGVnYWwKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlciBpbiBhIGZpbGVuYW1lLiBUaGUgcGFyc2luZyBsb2dpYyB0aGF0IGhhcHBlbnMgbGF0ZXIgd2lsbAorICAgICAgICAgICAgLy8gcmV2ZXJ0IHRoYXQgY2hhbmdlLCByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBmaWxlbmFtZQorICAgICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUbyBpbGx1c3RyYXRlLCBmb3IgYSAiYmVmb3JlIiBzdHJpbmcgb2YgWyhzaXplPjEwMClBTkQobmFtZT0nTmFtZQorICAgICAgICAgICAgLy8gKHdpdGggUGFyZW5zKS50eHQnKV0gLCB0aGUgImFmdGVyIiBzdHJpbmcgaXMgWyggc2l6ZSA+IDEwMCApIEFORAorICAgICAgICAgICAgLy8gKCBuYW1lID0gJ05hbWVcdTAwMDYod2l0aFx1MDAwNlBhcmVucykudHh0JyApXS4KKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIHN0cmluZ1tdW10gcHJQYWlycyA9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBBLiBvcGVuaW5nIGRvdWJsZSBwYXJlbnMgLSBpbnNlcnQgYSBzcGFjZSBiZXR3ZWVuIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgQCIoW14nXSopXChcKChbXiddKykiLCAiJDEoICgkMiIgfSwKKworICAgICAgICAgICAgICAgICAgICAvLyBCLiBjbG9zaW5nIGRvdWJsZSBwYXJlbnMgLSBpbnNlcnQgYSBzcGFjZSBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IEAiKC4pXClcKSIsICIkMSkgKSIgfSwKKworICAgICAgICAgICAgICAgICAgICAvLyBDLiBzaW5nbGUgb3BlbiBwYXJlbiB3aXRoIGEgZm9sbG93aW5nIHdvcmQgLSBpbnNlcnQgYSBzcGFjZSBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IEAiXCgoXFMpIiwgIiggJDEiIH0sCisKKyAgICAgICAgICAgICAgICAgICAgLy8gRC4gc2luZ2xlIGNsb3NlIHBhcmVuIHdpdGggYSBwcmVjZWRpbmcgd29yZCAtIGluc2VydCBhIHNwYWNlIGJldHdlZW4gdGhlIHR3bworICAgICAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyBAIihcUylcKSIsICIkMSApIiB9LAorCisgICAgICAgICAgICAgICAgICAgIC8vIEUuIGNsb3NlIHBhcmVuIGF0IGxpbmUgc3RhcnQ/LCBpbnNlcnQgYSBzcGFjZSBiZWZvcmUgdGhlIGNsb3NlIHBhcmVuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2VlbXMgbGlrZSBhIGRlZ2VuZXJhdGUgY2FzZS4gIEkgZG9uJ3QgcmVjYWxsIHdoeSBpdCdzIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IEAiXlwpIiwgIiApIiB9LAorCisgICAgICAgICAgICAgICAgICAgIC8vIEYuIGEgd29yZCAobGlrZWx5IGEgY29uanVuY3Rpb24pIGZvbGxvd2VkIGJ5IGFuIG9wZW4gcGFyZW4gLSBpbnNlcnQgYSBzcGFjZSBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IEAiKFxTKVwoIiwgIiQxICgiIH0sCisKKyAgICAgICAgICAgICAgICAgICAgLy8gRy4gc2luZ2xlIGNsb3NlIHBhcmVuIGZvbGxvd2VkIGJ5IHdvcmQgLSBpbnNlcnQgYSBwYXJlbiBhZnRlciBjbG9zZSBwYXJlbgorICAgICAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyBAIlwpKFxTKSIsICIpICQxIiB9LAorCisgICAgICAgICAgICAgICAgICAgIC8vIEguIGluc2VydCBzcGFjZSBiZXR3ZWVuID0gYW5kIGEgZm9sbG93aW5nIHNpbmdsZSBxdW90ZQorICAgICAgICAgICAgICAgICAgICAvL25ldyBzdHJpbmdbXSB7IEAiKD18IT0pKCdbXiddKicpIiwgIiQxICQyIiB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyBAIig9KSgnW14nXSonKSIsICIkMSAkMiIgfSwKKworICAgICAgICAgICAgICAgICAgICAvLyBJLiBpbnNlcnQgc3BhY2UgYmV0d2VlbiBwcm9wZXJ0eSBuYW1lcyBhbmQgdGhlIGZvbGxvd2luZyBvcGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAvL25ldyBzdHJpbmdbXSB7IEAiKFteIF0pKFs+PCg/OiE9KT1dKSIsICIkMSAkMiIgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHN0cmluZ1tdIHsgQCIoW14gIT48XSkoPnw8fCE9fD0pIiwgIiQxICQyIiB9LAorCisgICAgICAgICAgICAgICAgICAgIC8vIEouIGluc2VydCBzcGFjZXMgYmV0d2VlbiBvcGVyYXRvcnMgYW5kIHRoZSBmb2xsb3dpbmcgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIC8vbmV3IHN0cmluZ1tdIHsgQCIoWz48KD86IT0pPV0pKFteIF0pIiwgIiQxICQyIiB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgc3RyaW5nW10geyBAIig+fDx8IT18PSkoW14gPV0pIiwgIiQxICQyIiB9LAorCisgICAgICAgICAgICAgICAgICAgIC8vIEsuIHJlcGxhY2UgZndkIHNsYXNoIHdpdGggYmFja3NsYXNoCisgICAgICAgICAgICAgICAgICAgIG5ldyBzdHJpbmdbXSB7IEAiLyIsICJcXCIgfSwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJpbmcgaW50ZXJpbSA9IHNvdXJjZTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcHJQYWlycy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2NoYXIgY2FzZUlkeCA9IChjaGFyKSgnQScgKyBpKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGF0dGVybiA9IFJlZ2V4QXNzZXJ0aW9ucy5QcmVjZWRlZEJ5RXZlbk51bWJlck9mU2luZ2xlUXVvdGVzICsKKyAgICAgICAgICAgICAgICAgICAgcHJQYWlyc1tpXVswXSArCisgICAgICAgICAgICAgICAgICAgIFJlZ2V4QXNzZXJ0aW9ucy5Gb2xsb3dlZEJ5RXZlbk51bWJlck9mU2luZ2xlUXVvdGVzQW5kTGluZUVuZDsKKworICAgICAgICAgICAgICAgIGludGVyaW0gPSBSZWdleC5SZXBsYWNlKGludGVyaW0sIHBhdHRlcm4sIHByUGFpcnNbaV1bMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYXRjaCBhIGZ3ZCBzbGFzaCwgZm9sbG93ZWQgYnkgYW4gb2RkIG51bWJlciBvZiBzaW5nbGUgcXVvdGVzLgorICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIGZ3ZCBzbGFzaGVzIG9ubHkgaW5zaWRlIGEgcGFpciBvZiBzaW5nbGUgcXVvdGUgZGVsaW1pdGVycywKKyAgICAgICAgICAgIC8vIGVnLCBhIGZpbGVuYW1lLiAgVGhpcyBtdXN0IGJlIGRvbmUgYXMgd2VsbCBhcyB0aGUgY2FzZSBhYm92ZSwgdG8gaGFuZGxlCisgICAgICAgICAgICAvLyBmaWxlbmFtZXMgc3BlY2lmaWVkIGluc2lkZSBxdW90ZXMgYXMgd2VsbCBhcyBmaWxlbmFtZXMgd2l0aG91dCBxdW90ZXMuCisgICAgICAgICAgICB2YXIgcmVnZXhQYXR0ZXJuID0gQCIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4QXNzZXJ0aW9ucy5Gb2xsb3dlZEJ5T2RkTnVtYmVyT2ZTaW5nbGVRdW90ZXNBbmRMaW5lRW5kOworICAgICAgICAgICAgLy8gcmVwbGFjZSB3aXRoIGJhY2tzbGFzaAorICAgICAgICAgICAgaW50ZXJpbSA9IFJlZ2V4LlJlcGxhY2UoaW50ZXJpbSwgcmVnZXhQYXR0ZXJuLCAiXFwiKTsKKworICAgICAgICAgICAgLy8gbWF0Y2ggYSBzcGFjZSwgZm9sbG93ZWQgYnkgYW4gb2RkIG51bWJlciBvZiBzaW5nbGUgcXVvdGVzLgorICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHNwYWNlcyBvbmx5IGluc2lkZSBhIHBhaXIgb2Ygc2luZ2xlIHF1b3RlIGRlbGltaXRlcnMuCisgICAgICAgICAgICByZWdleFBhdHRlcm4gPSAiICIgKworICAgICAgICAgICAgICAgIFJlZ2V4QXNzZXJ0aW9ucy5Gb2xsb3dlZEJ5T2RkTnVtYmVyT2ZTaW5nbGVRdW90ZXNBbmRMaW5lRW5kOworCisgICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCBzcGFjZXMgdGhhdCBhcHBlYXIgaW5zaWRlIHNpbmdsZSBxdW90ZXMsIHdpdGgKKyAgICAgICAgICAgIC8vIGFzY2lpIDYuICBUaGlzIGFsbG93cyBhIHNwbGl0IG9uIHNwYWNlcyB0byBnZXQgdG9rZW5zIGluCisgICAgICAgICAgICAvLyB0aGUgZXhwcmVzc2lvbi4gVGhlIHNwbGl0IHdpbGwgbm90IHNwbGl0IGFueSBmaWxlbmFtZSBvcgorICAgICAgICAgICAgLy8gd2lsZGNhcmQgdGhhdCBhcHBlYXJzIHdpdGhpbiBzaW5nbGUgcXVvdGVzLiBBZnRlciB0b2tlbml6aW5nLCB3ZQorICAgICAgICAgICAgLy8gbmVlZCB0byByZXBsYWNlIGFzY2lpIDYgd2l0aCBhc2NpaSAzMiB0byByZXZlcnQgdGhlCisgICAgICAgICAgICAvLyBzcGFjZXMgd2l0aGluIHF1b3Rlcy4KKyAgICAgICAgICAgIHJldHVybiBSZWdleC5SZXBsYWNlKGludGVyaW0sIHJlZ2V4UGF0dGVybiwgIlx1MDAwNiIpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTZWxlY3Rpb25Dcml0ZXJpb24gX1BhcnNlQ3JpdGVyaW9uKFN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgLy8gaW5qZWN0IHNwYWNlcyBhZnRlciBvcGVuIHBhcmVuIGFuZCBiZWZvcmUgY2xvc2UgcGFyZW4sIGV0YworICAgICAgICAgICAgcyA9IE5vcm1hbGl6ZUNyaXRlcmlhRXhwcmVzc2lvbihzKTsKKworICAgICAgICAgICAgLy8gbm8gc3BhY2VzIGluIHRoZSBjcml0ZXJpYSBpcyBzaG9ydGhhbmQgZm9yIGZpbGVuYW1lIGdsb2IKKyAgICAgICAgICAgIGlmIChzLkluZGV4T2YoIiAiKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBzID0gIm5hbWUgPSAiICsgczsKKworICAgICAgICAgICAgLy8gc3BsaXQgdGhlIGV4cHJlc3Npb24gaW50byB0b2tlbnMKKyAgICAgICAgICAgIHN0cmluZ1tdIHRva2VucyA9IHMuVHJpbSgpLlNwbGl0KCcgJywgJ1x0Jyk7CisKKyAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoIDwgMykgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKHMpOworCisgICAgICAgICAgICBTZWxlY3Rpb25Dcml0ZXJpb24gY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgICAgIExvZ2ljYWxDb25qdW5jdGlvbiBwZW5kaW5nQ29uanVuY3Rpb24gPSBMb2dpY2FsQ29uanVuY3Rpb24uTk9ORTsKKworICAgICAgICAgICAgUGFyc2VTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHZhciBzdGF0ZVN0YWNrID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlN0YWNrPFBhcnNlU3RhdGU+KCk7CisgICAgICAgICAgICB2YXIgY3JpdFN0YWNrID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlN0YWNrPFNlbGVjdGlvbkNyaXRlcmlvbj4oKTsKKyAgICAgICAgICAgIHN0YXRlU3RhY2suUHVzaChQYXJzZVN0YXRlLlN0YXJ0KTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRvazEgPSB0b2tlbnNbaV0uVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRvazEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJhbmQiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJ4b3IiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJvciI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlU3RhY2suUGVlaygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IFBhcnNlU3RhdGUuQ3JpdGVyaW9uRG9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkpvaW4oIiAiLCB0b2tlbnMsIGksIHRva2Vucy5MZW5ndGggLSBpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoIDw9IGkgKyAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuSm9pbigiICIsIHRva2VucywgaSwgdG9rZW5zLkxlbmd0aCAtIGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0Nvbmp1bmN0aW9uID0gKExvZ2ljYWxDb25qdW5jdGlvbilFbnVtLlBhcnNlKHR5cGVvZihMb2dpY2FsQ29uanVuY3Rpb24pLCB0b2tlbnNbaV0uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IENvbXBvdW5kQ3JpdGVyaW9uIHsgTGVmdCA9IGN1cnJlbnQsIFJpZ2h0ID0gbnVsbCwgQ29uanVuY3Rpb24gPSBwZW5kaW5nQ29uanVuY3Rpb24gfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2suUHVzaChzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0YWNrLlB1c2goUGFyc2VTdGF0ZS5Db25qdW5jdGlvblBlbmRpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JpdFN0YWNrLlB1c2goY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICIoIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5QZWVrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gUGFyc2VTdGF0ZS5TdGFydCAmJiBzdGF0ZSAhPSBQYXJzZVN0YXRlLkNvbmp1bmN0aW9uUGVuZGluZyAmJiBzdGF0ZSAhPSBQYXJzZVN0YXRlLk9wZW5QYXJlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkpvaW4oIiAiLCB0b2tlbnMsIGksIHRva2Vucy5MZW5ndGggLSBpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoIDw9IGkgKyA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuSm9pbigiICIsIHRva2VucywgaSwgdG9rZW5zLkxlbmd0aCAtIGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdGFjay5QdXNoKFBhcnNlU3RhdGUuT3BlblBhcmVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIikiOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVN0YWNrLlBvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlU3RhY2suUGVlaygpICE9IFBhcnNlU3RhdGUuT3BlblBhcmVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuSm9pbigiICIsIHRva2VucywgaSwgdG9rZW5zLkxlbmd0aCAtIGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdGFjay5Qb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2suUHVzaChQYXJzZVN0YXRlLkNyaXRlcmlvbkRvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXRpbWUiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJjdGltZSI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIm10aW1lIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoIDw9IGkgKyAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuSm9pbigiICIsIHRva2VucywgaSwgdG9rZW5zLkxlbmd0aCAtIGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBEYXRlVGltZS5QYXJzZUV4YWN0KHRva2Vuc1tpICsgMl0sICJ5eXl5LU1NLWRkLUhIOm1tOnNzIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IERhdGVUaW1lLlBhcnNlRXhhY3QodG9rZW5zW2kgKyAyXSwgInl5eXkvTU0vZGQtSEg6bW06c3MiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gRGF0ZVRpbWUuUGFyc2VFeGFjdCh0b2tlbnNbaSArIDJdLCAieXl5eS9NTS9kZCIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBEYXRlVGltZS5QYXJzZUV4YWN0KHRva2Vuc1tpICsgMl0sICJNTS9kZC95eXl5IiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBEYXRlVGltZS5QYXJzZUV4YWN0KHRva2Vuc1tpICsgMl0sICJ5eXl5LU1NLWRkIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0PSBEYXRlVGltZS5TcGVjaWZ5S2luZCh0LCBEYXRlVGltZUtpbmQuTG9jYWwpLlRvVW5pdmVyc2FsVGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBUaW1lQ3JpdGVyaW9uCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpY2ggPSAoV2hpY2hUaW1lKUVudW0uUGFyc2UodHlwZW9mKFdoaWNoVGltZSksIHRva2Vuc1tpXSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgPSAoQ29tcGFyaXNvbk9wZXJhdG9yKUVudW1VdGlsLlBhcnNlKHR5cGVvZihDb21wYXJpc29uT3BlcmF0b3IpLCB0b2tlbnNbaSArIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0gdAorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2suUHVzaChQYXJzZVN0YXRlLkNyaXRlcmlvbkRvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAgICAgICBjYXNlICJsZW5ndGgiOgorICAgICAgICAgICAgICAgICAgICBjYXNlICJzaXplIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoIDw9IGkgKyAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuSm9pbigiICIsIHRva2VucywgaSwgdG9rZW5zLkxlbmd0aCAtIGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgSW50NjQgc3ogPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHYgPSB0b2tlbnNbaSArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuRW5kc1dpdGgoIksiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeiA9IEludDY0LlBhcnNlKHYuU3Vic3RyaW5nKDAsIHYuTGVuZ3RoIC0gMSkpICogMTAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYuRW5kc1dpdGgoIktCIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ogPSBJbnQ2NC5QYXJzZSh2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDIpKSAqIDEwMjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2LkVuZHNXaXRoKCJNIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ogPSBJbnQ2NC5QYXJzZSh2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDEpKSAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodi5FbmRzV2l0aCgiTUIiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeiA9IEludDY0LlBhcnNlKHYuU3Vic3RyaW5nKDAsIHYuTGVuZ3RoIC0gMikpICogMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2LkVuZHNXaXRoKCJHIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ogPSBJbnQ2NC5QYXJzZSh2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDEpKSAqIDEwMjQgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYuRW5kc1dpdGgoIkdCIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ogPSBJbnQ2NC5QYXJzZSh2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDIpKSAqIDEwMjQgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugc3ogPSBJbnQ2NC5QYXJzZSh0b2tlbnNbaSArIDJdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBTaXplQ3JpdGVyaW9uCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IHN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yID0gKENvbXBhcmlzb25PcGVyYXRvcilFbnVtVXRpbC5QYXJzZSh0eXBlb2YoQ29tcGFyaXNvbk9wZXJhdG9yKSwgdG9rZW5zW2kgKyAxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0YWNrLlB1c2goUGFyc2VTdGF0ZS5Dcml0ZXJpb25Eb25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgImZpbGVuYW1lIjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibmFtZSI6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5MZW5ndGggPD0gaSArIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuSm9pbigiICIsIHRva2VucywgaSwgdG9rZW5zLkxlbmd0aCAtIGkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmlzb25PcGVyYXRvciBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbXBhcmlzb25PcGVyYXRvcilFbnVtVXRpbC5QYXJzZSh0eXBlb2YoQ29tcGFyaXNvbk9wZXJhdG9yKSwgdG9rZW5zW2kgKyAxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBDb21wYXJpc29uT3BlcmF0b3IuTm90RXF1YWxUbyAmJiBjICE9IENvbXBhcmlzb25PcGVyYXRvci5FcXVhbFRvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkpvaW4oIiAiLCB0b2tlbnMsIGksIHRva2Vucy5MZW5ndGggLSBpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbSA9IHRva2Vuc1tpICsgMl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc2luZ2xlLXF1b3RlZCBmaWxlc3BlY3MgKHVzZWQgdG8gaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlcyBpbiBmaWxlbmFtZSBwYXR0ZXJucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS5TdGFydHNXaXRoKCInIikgJiYgbS5FbmRzV2l0aCgiJyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpbSBvZmYgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2luZ2xlIHF1b3RlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJ0IHRoZSBjb250cm9sIGNoYXJhY3RlcnMgdG8gc3BhY2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gbS5TdWJzdHJpbmcoMSwgbS5MZW5ndGggLSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJlcGxhY2UoIlx1MDAwNiIsICIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG0uU3RhcnRzV2l0aCgiJyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBtID0gbS5SZXBsYWNlKCJcdTAwMDYiLCAiICIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBOYW1lQ3JpdGVyaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGluZ0ZpbGVTcGVjID0gbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgPSBjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdGFjay5QdXNoKFBhcnNlU3RhdGUuQ3JpdGVyaW9uRG9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgICAgICAgICBjYXNlICJhdHRycyI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImF0dHJpYnV0ZXMiOgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNhc2UgInR5cGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoIDw9IGkgKyAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkpvaW4oIiAiLCB0b2tlbnMsIGksIHRva2Vucy5MZW5ndGggLSBpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IgYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21wYXJpc29uT3BlcmF0b3IpRW51bVV0aWwuUGFyc2UodHlwZW9mKENvbXBhcmlzb25PcGVyYXRvciksIHRva2Vuc1tpICsgMV0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gQ29tcGFyaXNvbk9wZXJhdG9yLk5vdEVxdWFsVG8gJiYgYyAhPSBDb21wYXJpc29uT3BlcmF0b3IuRXF1YWxUbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5Kb2luKCIgIiwgdG9rZW5zLCBpLCB0b2tlbnMuTGVuZ3RoIC0gaSkpOworCisjaWYgU0lMVkVSTElHSFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gKFNlbGVjdGlvbkNyaXRlcmlvbikgbmV3IFR5cGVDcml0ZXJpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVTdHJpbmcgPSB0b2tlbnNbaSArIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yID0gYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9ICh0b2sxID09ICJ0eXBlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoU2VsZWN0aW9uQ3JpdGVyaW9uKSBuZXcgVHlwZUNyaXRlcmlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVN0cmluZyA9IHRva2Vuc1tpICsgMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgPSBjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFNlbGVjdGlvbkNyaXRlcmlvbikgbmV3IEF0dHJpYnV0ZXNDcml0ZXJpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVTdHJpbmcgPSB0b2tlbnNbaSArIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yID0gYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0YWNrLlB1c2goUGFyc2VTdGF0ZS5Dcml0ZXJpb25Eb25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1AKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2suUHVzaChQYXJzZVN0YXRlLldoaXRlc3BhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiJyIgKyB0b2tlbnNbaV0gKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5QZWVrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFBhcnNlU3RhdGUuQ3JpdGVyaW9uRG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RhY2suUG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZVN0YWNrLlBlZWsoKSA9PSBQYXJzZVN0YXRlLkNvbmp1bmN0aW9uUGVuZGluZykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YXRlU3RhY2suUGVlaygpID09IFBhcnNlU3RhdGUuQ29uanVuY3Rpb25QZW5kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYyA9IGNyaXRTdGFjay5Qb3AoKSBhcyBDb21wb3VuZENyaXRlcmlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5SaWdodCA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGNjOyAvLyBtYXJrIHRoZSBwYXJlbnQgYXMgY3VycmVudCAod2FsayB1cCB0aGUgdHJlZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0YWNrLlBvcCgpOyAgIC8vIHRoZSBjb25qdW5jdGlvbiBpcyBubyBsb25nZXIgcGVuZGluZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZVN0YWNrLlBvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBQYXJzZVN0YXRlLkNyaXRlcmlvbkRvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiPz8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHN0YXRlU3RhY2suUHVzaChQYXJzZVN0YXRlLkNyaXRlcmlvbkRvbmUpOyAgLy8gbm90IHN1cmU/CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFBhcnNlU3RhdGUuV2hpdGVzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVTdGFjay5Qb3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEZpbGVTZWxlY3RvciBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib29sZWFuIGxvZ2ljIHN0YXRlbWVudCBvZiB0aGUgZmlsZQorICAgICAgICAvLy8gc2VsZWN0aW9uIGNyaXRlcmlhIGZvciB0aGlzIGluc3RhbmNlLiA8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIkZpbGVTZWxlY3RvcigiK19Dcml0ZXJpb24uVG9TdHJpbmcoKSsiKSI7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgYm9vbCBFdmFsdWF0ZShzdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRpbm9jaCAtIFRodSwgMTEgRmViIDIwMTAgIDE4OjM0CisgICAgICAgICAgICBTZWxlY3RvclRyYWNlKCJFdmFsdWF0ZSh7MH0pIiwgZmlsZW5hbWUpOworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBfQ3JpdGVyaW9uLkV2YWx1YXRlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBbU3lzdGVtLkRpYWdub3N0aWNzLkNvbmRpdGlvbmFsKCJTZWxlY3RvclRyYWNlIildCisgICAgICAgIHByaXZhdGUgdm9pZCBTZWxlY3RvclRyYWNlKHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0NyaXRlcmlvbiAhPSBudWxsICYmIF9Dcml0ZXJpb24uVmVyYm9zZSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5CisgICAgICAgIC8vLyAgIHRoYXQgZml0IHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgc3BlY2lmaWVkIGluIHRoZSBGaWxlU2VsZWN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDxzZWUgY3JlZj0iU2VsZWN0RmlsZXMoU3RyaW5nLCBib29sKSIvPgorICAgICAgICAvLy8gICB3aXRoIHJlY3Vyc2VEaXJlY3RvcmllcyA9IGZhbHNlLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IG92ZXIgd2hpY2ggdG8gYXBwbHkgdGhlIEZpbGVTZWxlY3RvcgorICAgICAgICAvLy8gICBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyAgIEEgY29sbGVjdGlvbiBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgZnVsbHktcXVhbGlmaWVkIHBhdGhuYW1lcyBvZiBmaWxlcworICAgICAgICAvLy8gICB0aGF0IG1hdGNoIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgaW4gdGhlIEZpbGVTZWxlY3RvciBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9uPFN0cmluZz4gU2VsZWN0RmlsZXMoU3RyaW5nIGRpcmVjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFNlbGVjdEZpbGVzKGRpcmVjdG9yeSwgZmFsc2UpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB0aGF0IGZpdCB0aGUKKyAgICAgICAgLy8vICAgc2VsZWN0aW9uIGNyaXRlcmlhIHNwZWNpZmllZCBpbiB0aGUgRmlsZVNlbGVjdG9yLCBvcHRpb25hbGx5IHJlY3Vyc2luZworICAgICAgICAvLy8gICB0aHJvdWdoIHN1YmRpcmVjdG9yaWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCBhcHBsaWVzIHRoZSBmaWxlIHNlbGVjdGlvbiBjcml0ZXJpYSBjb250YWluZWQgaW4gdGhlCisgICAgICAgIC8vLyAgIEZpbGVTZWxlY3RvciB0byB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBkaXJlY3RvcnksIGFuZAorICAgICAgICAvLy8gICByZXR1cm5zIHRoZSBuYW1lcyBvZiBmaWxlcyB0aGF0IGNvbmZvcm0gdG8gdGhlIGNyaXRlcmlhLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IG92ZXIgd2hpY2ggdG8gYXBwbHkgdGhlIEZpbGVTZWxlY3RvcgorICAgICAgICAvLy8gICBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlY3Vyc2VEaXJlY3RvcmllcyI+CisgICAgICAgIC8vLyAgIFdoZXRoZXIgdG8gcmVjdXJzZSB0aHJvdWdoIHN1YmRpcmVjdG9yaWVzIHdoZW4gYXBwbHlpbmcgdGhlIGZpbGUKKyAgICAgICAgLy8vICAgc2VsZWN0aW9uIGNyaXRlcmlhLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgQSBjb2xsZWN0aW9uIG9mIHN0cmluZ3MgY29udGFpbmluZyBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWVzIG9mIGZpbGVzCisgICAgICAgIC8vLyAgIHRoYXQgbWF0Y2ggdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBpbiB0aGUgRmlsZVNlbGVjdG9yIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLlJlYWRPbmx5Q29sbGVjdGlvbjxTdHJpbmc+CisgICAgICAgICAgICBTZWxlY3RGaWxlcyhTdHJpbmcgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWN1cnNlRGlyZWN0b3JpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfQ3JpdGVyaW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJTZWxlY3Rpb25Dcml0ZXJpYSBoYXMgbm90IGJlZW4gc2V0Iik7CisKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IExpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKERpcmVjdG9yeS5FeGlzdHMoZGlyZWN0b3J5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhkaXJlY3RvcnkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFN0cmluZyBmaWxlbmFtZSBpbiBmaWxlbmFtZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFdmFsdWF0ZShmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2VEaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBzdWJkaXJlY3RvcmllczoKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRpcm5hbWVzID0gRGlyZWN0b3J5LkdldERpcmVjdG9yaWVzKGRpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChTdHJpbmcgZGlyIGluIGRpcm5hbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlRyYXZlcnNlUmVwYXJzZVBvaW50cworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKEZpbGUuR2V0QXR0cmlidXRlcyhkaXIpICYgRmlsZUF0dHJpYnV0ZXMuUmVwYXJzZVBvaW50KSA9PSAwKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTkxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFdmFsdWF0ZShkaXIpKSBsaXN0LkFkZChkaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LkFkZFJhbmdlKHRoaXMuU2VsZWN0RmlsZXMoZGlyLCByZWN1cnNlRGlyZWN0b3JpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjYW4gZ2V0IFN5c3RlbS5VbmF1dGhvcml6ZWRBY2Nlc3NFeGNlcHRpb24gaGVyZQorICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5VbmF1dGhvcml6ZWRBY2Nlc3NFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLklPLklPRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbGlzdC5Bc1JlYWRPbmx5KCk7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTdW1tYXJ5IGRlc2NyaXB0aW9uIGZvciBFbnVtVXRpbC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBFbnVtVXRpbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFbnVtVXRpbCgpIHsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBEZXNjcmlwdGlvbkF0dHJpYnV0ZSBpZiB0aGUgc3BlY2lmaWVkIEVudW0KKyAgICAgICAgLy8vICAgdmFsdWUgaGFzIG9uZS4gIElmIG5vdCwgcmV0dXJucyB0aGUgVG9TdHJpbmcoKSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgICAgLy8vICAgRW51bSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIEVudW0gdG8gZ2V0IHRoZSBkZXNjcmlwdGlvbiBmb3I8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldERlc2NyaXB0aW9uKFN5c3RlbS5FbnVtIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBGaWVsZEluZm8gZmkgPSB2YWx1ZS5HZXRUeXBlKCkuR2V0RmllbGQodmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB2YXIgYXR0cmlidXRlcyA9IChEZXNjcmlwdGlvbkF0dHJpYnV0ZVtdKWZpLkdldEN1c3RvbUF0dHJpYnV0ZXModHlwZW9mKERlc2NyaXB0aW9uQXR0cmlidXRlKSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlc1swXS5EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ29udmVydHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmFtZSBvciBudW1lcmljIHZhbHVlIG9mIG9uZQorICAgICAgICAvLy8gICBvciBtb3JlIGVudW1lcmF0ZWQgY29uc3RhbnRzIHRvIGFuIGVxdWl2YWxlbnQgZW51bWVyYXRlZCBvYmplY3QuCisgICAgICAgIC8vLyAgIE5vdGU6IHVzZSB0aGUgRGVzY3JpcHRpb25BdHRyaWJ1dGUgb24gZW51bSB2YWx1ZXMgdG8gZW5hYmxlIHRoaXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW51bVR5cGUiPlRoZSBTeXN0ZW0uVHlwZSBvZiB0aGUgZW51bWVyYXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJpbmdSZXByZXNlbnRhdGlvbiI+CisgICAgICAgIC8vLyAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb3IgdmFsdWUgdG8gY29udmVydC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBvYmplY3QgUGFyc2UoVHlwZSBlbnVtVHlwZSwgc3RyaW5nIHN0cmluZ1JlcHJlc2VudGF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUGFyc2UoZW51bVR5cGUsIHN0cmluZ1JlcHJlc2VudGF0aW9uLCBmYWxzZSk7CisgICAgICAgIH0KKworCisjaWYgU0lMVkVSTElHSFQKKyAgICAgICBwdWJsaWMgc3RhdGljIFN5c3RlbS5FbnVtW10gR2V0RW51bVZhbHVlcyhUeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdHlwZS5Jc0VudW0pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJub3QgYW4gZW51bSIpOworCisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICBmcm9tIGZpZWxkIGluIHR5cGUuR2V0RmllbGRzKEJpbmRpbmdGbGFncy5QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuU3RhdGljKQorICAgICAgICAgICAgICB3aGVyZSBmaWVsZC5Jc0xpdGVyYWwKKyAgICAgICAgICAgICAgc2VsZWN0IChTeXN0ZW0uRW51bSlmaWVsZC5HZXRWYWx1ZShudWxsKQorICAgICAgICAgICAgKS5Ub0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZ1tdIEdldEVudW1TdHJpbmdzPFQ+KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YoVCk7CisgICAgICAgICAgICBpZiAoIXR5cGUuSXNFbnVtKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigibm90IGFuIGVudW0iKTsKKworICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgZnJvbSBmaWVsZCBpbiB0eXBlLkdldEZpZWxkcyhCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLlN0YXRpYykKKyAgICAgICAgICAgICAgd2hlcmUgZmllbGQuSXNMaXRlcmFsCisgICAgICAgICAgICAgIHNlbGVjdCBmaWVsZC5OYW1lCisgICAgICAgICAgICApLlRvQXJyYXkoKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDb252ZXJ0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuYW1lIG9yIG51bWVyaWMgdmFsdWUgb2Ygb25lCisgICAgICAgIC8vLyAgIG9yIG1vcmUgZW51bWVyYXRlZCBjb25zdGFudHMgdG8gYW4gZXF1aXZhbGVudCBlbnVtZXJhdGVkIG9iamVjdC4gIEEKKyAgICAgICAgLy8vICAgcGFyYW1ldGVyIHNwZWNpZmllZCB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgY2FzZS1zZW5zaXRpdmUuICBOb3RlOgorICAgICAgICAvLy8gICB1c2UgdGhlIERlc2NyaXB0aW9uQXR0cmlidXRlIG9uIGVudW0gdmFsdWVzIHRvIGVuYWJsZSB0aGlzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudW1UeXBlIj5UaGUgU3lzdGVtLlR5cGUgb2YgdGhlIGVudW1lcmF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyaW5nUmVwcmVzZW50YXRpb24iPgorICAgICAgICAvLy8gICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9yIHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlnbm9yZUNhc2UiPgorICAgICAgICAvLy8gICBXaGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgY2FzZS1zZW5zaXRpdmUgb3Igbm90LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBvYmplY3QgUGFyc2UoVHlwZSBlbnVtVHlwZSwgc3RyaW5nIHN0cmluZ1JlcHJlc2VudGF0aW9uLCBib29sIGlnbm9yZUNhc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpZ25vcmVDYXNlKQorICAgICAgICAgICAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uID0gc3RyaW5nUmVwcmVzZW50YXRpb24uVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworI2lmIFNJTFZFUkxJR0hUCisgICAgICAgICAgICBmb3JlYWNoIChTeXN0ZW0uRW51bSBlbnVtVmFsIGluIEdldEVudW1WYWx1ZXMoZW51bVR5cGUpKQorI2Vsc2UKKyAgICAgICAgICAgIGZvcmVhY2ggKFN5c3RlbS5FbnVtIGVudW1WYWwgaW4gU3lzdGVtLkVudW0uR2V0VmFsdWVzKGVudW1UeXBlKSkKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBkZXNjcmlwdGlvbiA9IEdldERlc2NyaXB0aW9uKGVudW1WYWwpOworICAgICAgICAgICAgICAgIGlmIChpZ25vcmVDYXNlKQorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IHN0cmluZ1JlcHJlc2VudGF0aW9uKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW51bVZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5FbnVtLlBhcnNlKGVudW1UeXBlLCBzdHJpbmdSZXByZXNlbnRhdGlvbiwgaWdub3JlQ2FzZSk7CisgICAgICAgIH0KKyAgICB9CisKKworI2lmIERFTU8KKyAgICBpbnRlcm5hbCBjbGFzcyBEZW1vbnN0cmF0ZUZpbGVTZWxlY3RvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2RpcmVjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9yZWN1cnNlOworICAgICAgICBwcml2YXRlIGJvb2wgX3RyYXZlcnNlOworICAgICAgICBwcml2YXRlIGJvb2wgX3ZlcmJvc2U7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9zZWxlY3Rpb25Dcml0ZXJpYTsKKyAgICAgICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3IgZjsKKworICAgICAgICBwdWJsaWMgRGVtb25zdHJhdGVGaWxlU2VsZWN0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9kaXJlY3RvcnkgPSAiLiI7CisgICAgICAgICAgICB0aGlzLl9yZWN1cnNlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZW1vbnN0cmF0ZUZpbGVTZWxlY3RvcihzdHJpbmdbXSBhcmdzKSA6IHRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKGFyZ3NbaV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UiLT8iOgorICAgICAgICAgICAgICAgICAgICBVc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5FeGl0KDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICItZCI6CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoIDw9IGkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIi1kaXJlY3RvcnkiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0b3J5ID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiLW5vcmVjdXJzZSI6CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlY3Vyc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICItai0iOgorICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmF2ZXJzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIi1qKyI6CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYXZlcnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICItdiI6CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Dcml0ZXJpYSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Dcml0ZXJpYSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Dcml0ZXJpYSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aGlzLmYgPSBuZXcgRmlsZVNlbGVjdG9yKHRoaXMuX3NlbGVjdGlvbkNyaXRlcmlhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICBuZXcgRGVtb25zdHJhdGVGaWxlU2VsZWN0b3IoYXJncykuUnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4YzEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4Y2VwdGlvbjogezB9IiwgZXhjMS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBVc2FnZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBSdW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5mID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhpcy5mID0gbmV3IEZpbGVTZWxlY3RvcigibmFtZSA9ICouanBnIEFORCAoc2l6ZSA+IDEwMDAgT1IgYXRpbWUgPCAyMDA5LTAyLTE0LTAxOjAwOjAwKSIpOworCisgICAgICAgICAgICB0aGlzLmYuVHJhdmVyc2VSZXBhcnNlUG9pbnRzID0gX3RyYXZlcnNlOworICAgICAgICAgICAgdGhpcy5mLlZlcmJvc2UgPSB0aGlzLl92ZXJib3NlOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG5ldyBTdHJpbmcoJzonLCA4OCkpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNlbGVjdGluZyBmaWxlczpcbiIgKyB0aGlzLmYuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB2YXIgZmlsZXMgPSB0aGlzLmYuU2VsZWN0RmlsZXModGhpcy5fZGlyZWN0b3J5LCB0aGlzLl9yZWN1cnNlKTsKKyAgICAgICAgICAgIGlmIChmaWxlcy5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJubyBmaWxlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZmlsZXM6IHswfSIsIGZpbGVzLkNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZmlsZSBpbiBmaWxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgICIgKyBmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVXNhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRmlsZVNlbGVjdG9yOiBzZWxlY3QgZmlsZXMgYmFzZWQgb24gc2VsZWN0aW9uIGNyaXRlcmlhLlxuIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNhZ2U6XG4gIEZpbGVTZWxlY3RvciA8c2VsZWN0aW9uQ3JpdGVyaWE+ICBbb3B0aW9uc11cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtZCA8ZGlyPiAgIGRpcmVjdG9yeSB0byBzZWxlY3QgZnJvbSAoRGVmYXVsdCAuKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC1ub3JlY3Vyc2UgIGRvbid0IHJlY3Vyc2UgaW50byBzdWJkaXJzXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLWotICAgICAgICAgZG9uJ3QgdHJhdmVyc2UganVuY3Rpb25zXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXYgICAgICAgICAgdmVyYm9zZSBvdXRwdXRcbiIpOworICAgICAgICB9CisgICAgfQorCisjZW5kaWYKKworCisKK30KKworCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9PZmZzZXRTdHJlYW0uY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9PZmZzZXRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNTZkMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL09mZnNldFN0cmVhbS5jcwpAQCAtMCwwICsxLDExNCBAQAorLy8gT2Zmc2V0U3RyZWFtLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpICAyMDA5IERpbm8gQ2hpZXNhCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLiAKKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6IAorLy8gVGltZS1zdGFtcDogPDIwMDktQXVndXN0LTI3IDEyOjUwOjM1PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgbG9naWMgZm9yIGhhbmRsaW5nIHJlYWRpbmcgb2YgemlwIGFyY2hpdmVzIGVtYmVkZGVkIAorLy8gaW50byBsYXJnZXIgc3RyZWFtcy4gIFRoZSBpbml0aWFsIHBvc2l0aW9uIG9mIHRoZSBzdHJlYW0gc2VydmVzIGFzCisvLyB0aGUgYmFzZSBvZmZzZXQgZm9yIGFsbCBmdXR1cmUgU2VlaygpIG9wZXJhdGlvbnMuCisvLyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworICAgIGludGVybmFsIGNsYXNzIE9mZnNldFN0cmVhbSA6IFN5c3RlbS5JTy5TdHJlYW0sIFN5c3RlbS5JRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfb3JpZ2luYWxQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gX2lubmVyU3RyZWFtOworCisgICAgICAgIHB1YmxpYyBPZmZzZXRTdHJlYW0oU3RyZWFtIHMpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBfb3JpZ2luYWxQb3NpdGlvbiA9IHMuUG9zaXRpb247CisgICAgICAgICAgICBfaW5uZXJTdHJlYW0gPSBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9pbm5lclN0cmVhbS5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lubmVyU3RyZWFtLkNhblJlYWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pbm5lclN0cmVhbS5DYW5TZWVrOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lubmVyU3RyZWFtLkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pbm5lclN0cmVhbS5MZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lubmVyU3RyZWFtLlBvc2l0aW9uIC0gX29yaWdpbmFsUG9zaXRpb247IH0KKyAgICAgICAgICAgIHNldCB7IF9pbm5lclN0cmVhbS5Qb3NpdGlvbiA9IF9vcmlnaW5hbFBvc2l0aW9uICsgdmFsdWU7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU3lzdGVtLklPLlNlZWtPcmlnaW4gb3JpZ2luKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2lubmVyU3RyZWFtLlNlZWsoX29yaWdpbmFsUG9zaXRpb24gKyBvZmZzZXQsIG9yaWdpbikgLSBfb3JpZ2luYWxQb3NpdGlvbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJRGlzcG9zYWJsZS5EaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworICAgICAgICB9CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9TaGFyZWQuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9TaGFyZWQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzZDI3YgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1NoYXJlZC5jcwpAQCAtMCwwICsxLDkwMSBAQAorLy8gU2hhcmVkLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMSBEaW5vIENoaWVzYS4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTGFzdCBTYXZlZDogPDIwMTEtQXVndXN0LTAyIDE5OjQxOjAxPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgc29tZSBzaGFyZWQgdXRpbGl0eSBjbGFzc2VzIGFuZCBtZXRob2RzLgorLy8KKy8vIENyZWF0ZWQ6IFR1ZSwgMjcgTWFyIDIwMDcgIDE1OjMwCisvLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuUGVybWlzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbGxlY3RzIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IG1ldGhvZHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgU2hhcmVkVXRpbGl0aWVzCisgICAgeworICAgICAgICAvLy8gcHJpdmF0ZSBudWxsIGNvbnN0cnVjdG9yCisgICAgICAgIC8vcHJpdmF0ZSBTaGFyZWRVdGlsaXRpZXMoKSB7IH0KKworICAgICAgICAvLyB3b3JraXRlbSA4NDIzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSW50NjQgR2V0RmlsZUxlbmd0aChzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghRmlsZS5FeGlzdHMoZmlsZU5hbWUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSU8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGZpbGVOYW1lKTsKKworICAgICAgICAgICAgbG9uZyBmaWxlTGVuZ3RoID0gMEw7CisgICAgICAgICAgICBGaWxlU2hhcmUgZnMgPSBGaWxlU2hhcmUuUmVhZFdyaXRlOworI2lmICFORVRDRgorICAgICAgICAgICAgLy8gRmlsZVNoYXJlLkRlbGV0ZSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIENvbXBhY3QgRnJhbWV3b3JrCisgICAgICAgICAgICBmcyB8PSBGaWxlU2hhcmUuRGVsZXRlOworI2VuZGlmCisgICAgICAgICAgICB1c2luZyAodmFyIHMgPSBGaWxlLk9wZW4oZmlsZU5hbWUsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCwgZnMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVMZW5ndGggPSBzLkxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmaWxlTGVuZ3RoOworICAgICAgICB9CisKKworICAgICAgICBbU3lzdGVtLkRpYWdub3N0aWNzLkNvbmRpdGlvbmFsKCJORVRDRiIpXQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KFN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhpcyBpc3N1ZToKKyAgICAgICAgICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9kZXRhaWxzLzMxODkxOAorICAgICAgICAgICAgLy8gSXQncyByZXF1aXJlZCBvbmx5IG9uIE5FVENGLgorICAgICAgICAgICAgcy5GbHVzaCgpOworICAgICAgICB9CisKKworI2lmIExFR0FDWQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSb3VuZCB0aGUgZ2l2ZW4gRGF0ZVRpbWUgdmFsdWUgdG8gYW4gZXZlbiBzZWNvbmQgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFJvdW5kIHVwIGluIHRoZSBjYXNlIG9mIGFuIG9kZCBzZWNvbmQgdmFsdWUuICBUaGUgcm91bmRpbmcgZG9lcyBub3QgY29uc2lkZXIKKyAgICAgICAgLy8vIGZyYWN0aW9uYWwgc2Vjb25kcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSB0aGUgWmlwIHNwZWMgYWxsb3dzIHN0b3JhZ2Ugb2YgdGltZSBvbmx5IHRvIHRoZSBuZWFyZXN0CisgICAgICAgIC8vLyBldmVuIHNlY29uZC4gIFNvIGlmIHlvdSB3YW50IHRvIGNvbXBhcmUgdGhlIHRpbWUgb2YgYW4gZW50cnkgaW4gdGhlIGFyY2hpdmUgd2l0aAorICAgICAgICAvLy8gaXQncyBhY3R1YWwgdGltZSBpbiB0aGUgZmlsZXN5c3RlbSwgeW91IG5lZWQgdG8gcm91bmQgdGhlIGFjdHVhbCBmaWxlc3lzdGVtCisgICAgICAgIC8vLyB0aW1lLCBvciB1c2UgYSAyLXNlY29uZCB0aHJlc2hvbGQgZm9yIHRoZSBjb21wYXJpc29uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGlzIGlzIG1vc3QgbmF1dHJhbGx5IGFuIGV4dGVuc2lvbiBtZXRob2QgZm9yIHRoZSBEYXRlVGltZSBjbGFzcyBidXQgdGhpcworICAgICAgICAvLy8gbGlicmFyeSBpcyBidWlsdCBmb3IgLk5FVCAyLjAsIG5vdCBmb3IgLk5FVCAzLjU7IFRoaXMgbWVhbnMgZXh0ZW5zaW9uIG1ldGhvZHMKKyAgICAgICAgLy8vIGFyZSBhIG5vLW5vLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZSI+VGhlIERhdGVUaW1lIHZhbHVlIHRvIHJvdW5kPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBydW9uZGVkIERhdGVUaW1lIHZhbHVlPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIFJvdW5kVG9FdmVuU2Vjb25kKERhdGVUaW1lIHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcm91bmQgdG8gbmVhcmVzdCBzZWNvbmQ6CisgICAgICAgICAgICBpZiAoKHNvdXJjZS5TZWNvbmQgJSAyKSA9PSAxKQorICAgICAgICAgICAgICAgIHNvdXJjZSArPSBuZXcgVGltZVNwYW4oMCwgMCwgMSk7CisKKyAgICAgICAgICAgIERhdGVUaW1lIGR0Um91bmRlZCA9IG5ldyBEYXRlVGltZShzb3VyY2UuWWVhciwgc291cmNlLk1vbnRoLCBzb3VyY2UuRGF5LCBzb3VyY2UuSG91ciwgc291cmNlLk1pbnV0ZSwgc291cmNlLlNlY29uZCk7CisgICAgICAgICAgICAvL2lmIChzb3VyY2UuTWlsbGlzZWNvbmQgPj0gNTAwKSBkdFJvdW5kZWQgPSBkdFJvdW5kZWQuQWRkU2Vjb25kcygxKTsKKyAgICAgICAgICAgIHJldHVybiBkdFJvdW5kZWQ7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgWU9VX0xJS0VfUkVEVU5EQU5UX0NPREUKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBOb3JtYWxpemVQYXRoKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBzaW5nbGUgZG90IHNsYXNoCisgICAgICAgICAgICBpZiAocGF0aC5TdGFydHNXaXRoKCIuXFwiKSkgcGF0aCA9IHBhdGguU3Vic3RyaW5nKDIpOworCisgICAgICAgICAgICAvLyByZW1vdmUgaW50ZXJ2ZW5pbmcgZG90LXNsYXNoCisgICAgICAgICAgICBwYXRoID0gcGF0aC5SZXBsYWNlKCJcXC5cXCIsICJcXCIpOworCisgICAgICAgICAgICAvLyByZW1vdmUgZG91YmxlIGRvdCB3aGVuIHByZWNlZGVkIGJ5IGEgZGlyZWN0b3J5IG5hbWUKKyAgICAgICAgICAgIHZhciByZSA9IG5ldyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXgoQCJeKC4qXFwpPyhbXlxcXC5dK1xcXC5cLlxcKSguKykkIik7CisgICAgICAgICAgICBwYXRoID0gcmUuUmVwbGFjZShwYXRoLCAiJDEkMyIpOworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleCBkb3VibGVEb3RSZWdleDEgPQorICAgICAgICAgICAgbmV3IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleChAIl4oLiovKT8oW14vXFwuXSsvXFwuXFwuLykoLispJCIpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBTaW1wbGlmeUZ3ZFNsYXNoUGF0aChzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhdGguU3RhcnRzV2l0aCgiLi8iKSkgcGF0aCA9IHBhdGguU3Vic3RyaW5nKDIpOworICAgICAgICAgICAgcGF0aCA9IHBhdGguUmVwbGFjZSgiLy4vIiwgIi8iKTsKKworICAgICAgICAgICAgLy8gUmVwbGFjZSBmb28vYW55dGhpbmcvLi4vYmFyIHdpdGggZm9vL2JhcgorICAgICAgICAgICAgcGF0aCA9IGRvdWJsZURvdFJlZ2V4MS5SZXBsYWNlKHBhdGgsICIkMSQzIik7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXRpbGl0eSByb3V0aW5lIGZvciB0cmFuc2Zvcm1pbmcgcGF0aCBuYW1lcyBmcm9tIGZpbGVzeXN0ZW0gZm9ybWF0IChvbiBXaW5kb3dzIHRoYXQgbWVhbnMgYmFja3NsYXNoZXMpIHRvCisgICAgICAgIC8vLyBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgdXNlIHdpdGhpbiB6aXBmaWxlcy4gVGhpcyBtZWFucyB0cmltbWluZyB0aGUgdm9sdW1lIGxldHRlciBhbmQgY29sb24gKGlmIGFueSkgQW5kCisgICAgICAgIC8vLyBzd2FwcGluZyBiYWNrc2xhc2hlcyBmb3IgZm9yd2FyZCBzbGFzaGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhdGhOYW1lIj5zb3VyY2UgcGF0aC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJhbnNmb3JtZWQgcGF0aDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgTm9ybWFsaXplUGF0aEZvclVzZUluWmlwRmlsZShzdHJpbmcgcGF0aE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGJvdW5kYXJ5IGNhc2UKKyAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShwYXRoTmFtZSkpIHJldHVybiBwYXRoTmFtZTsKKworICAgICAgICAgICAgLy8gdHJpbSB2b2x1bWUgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoKHBhdGhOYW1lLkxlbmd0aCA+PSAyKSAgJiYgKChwYXRoTmFtZVsxXSA9PSAnOicpICYmIChwYXRoTmFtZVsyXSA9PSAnXFwnKSkpCisgICAgICAgICAgICAgICAgcGF0aE5hbWUgPSAgcGF0aE5hbWUuU3Vic3RyaW5nKDMpOworCisgICAgICAgICAgICAvLyBzd2FwIHNsYXNoZXMKKyAgICAgICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuUmVwbGFjZSgnXFwnLCAnLycpOworCisgICAgICAgICAgICAvLyB0cmltIGFsbCBsZWFkaW5nIHNsYXNoZXMKKyAgICAgICAgICAgIHdoaWxlIChwYXRoTmFtZS5TdGFydHNXaXRoKCIvIikpIHBhdGhOYW1lID0gcGF0aE5hbWUuU3Vic3RyaW5nKDEpOworCisgICAgICAgICAgICByZXR1cm4gU2ltcGxpZnlGd2RTbGFzaFBhdGgocGF0aE5hbWUpOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgaWJtNDM3ID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoIklCTTQzNyIpOworICAgICAgICBzdGF0aWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgdXRmOCA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJVVEYtOCIpOworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBieXRlW10gU3RyaW5nVG9CeXRlQXJyYXkoc3RyaW5nIHZhbHVlLCBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZykKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGEgPSBlbmNvZGluZy5HZXRCeXRlcyh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIFN0cmluZ1RvQnl0ZUFycmF5KHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1RvQnl0ZUFycmF5KHZhbHVlLCBpYm00MzcpOworICAgICAgICB9CisKKyAgICAgICAgLy9pbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIFV0ZjhTdHJpbmdUb0J5dGVBcnJheShzdHJpbmcgdmFsdWUpCisgICAgICAgIC8veworICAgICAgICAvLyAgICByZXR1cm4gU3RyaW5nVG9CeXRlQXJyYXkodmFsdWUsIHV0ZjgpOworICAgICAgICAvL30KKworICAgICAgICAvL2ludGVybmFsIHN0YXRpYyBzdHJpbmcgU3RyaW5nRnJvbUJ1ZmZlcihieXRlW10gYnVmLCBpbnQgbWF4bGVuZ3RoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgcmV0dXJuIFN0cmluZ0Zyb21CdWZmZXIoYnVmLCBtYXhsZW5ndGgsIGlibTQzNyk7CisgICAgICAgIC8vfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgVXRmOFN0cmluZ0Zyb21CdWZmZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0Zyb21CdWZmZXIoYnVmLCB1dGY4KTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgU3RyaW5nRnJvbUJ1ZmZlcihieXRlW10gYnVmLCBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBmb3JtIG9mIHRoZSBHZXRTdHJpbmcoKSBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIC5ORVQgQ0YgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgc3RyaW5nIHMgPSBlbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgaW50IFJlYWRTaWduYXR1cmUoU3lzdGVtLklPLlN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeCA9IDA7CisgICAgICAgICAgICB0cnkgeyB4ID0gX1JlYWRGb3VyQnl0ZXMocywgIm4vYSIpOyB9CisgICAgICAgICAgICBjYXRjaCAoQmFkUmVhZEV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBSZWFkRW50cnlTaWduYXR1cmUoU3lzdGVtLklPLlN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugb2YgaWxsLWZvcm1hdHRlZCB6aXAgYXJjaGl2ZXMgLSBpbmNsdWRlcyBhIGRhdGEgZGVzY3JpcHRvcgorICAgICAgICAgICAgLy8gd2hlbiBub25lIGlzIGV4cGVjdGVkLgorICAgICAgICAgICAgaW50IHggPSAwOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeCA9IF9SZWFkRm91ckJ5dGVzKHMsICJuL2EiKTsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSBaaXBDb25zdGFudHMuWmlwRW50cnlEYXRhRGVzY3JpcHRvclNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcGFzdCBkYXRhIGRlc2NyaXB0b3IgLSAxMiBieXRlcyBpZiBub3QgemlwNjQKKyAgICAgICAgICAgICAgICAgICAgcy5TZWVrKDEyLCBTZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgICAgICBXb3JrYXJvdW5kX0xhZHlidWczMTg5MTgocyk7CisgICAgICAgICAgICAgICAgICAgIHggPSBfUmVhZEZvdXJCeXRlcyhzLCAibi9hIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ICE9IFppcENvbnN0YW50cy5aaXBFbnRyeVNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF5YmUgemlwNjQgd2FzIGluIHVzZSBmb3IgdGhlIHByaW9yIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCBza2lwIGFub3RoZXIgOCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHMuU2Vlayg4LCBTZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBfUmVhZEZvdXJCeXRlcyhzLCAibi9hIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAhPSBaaXBDb25zdGFudHMuWmlwRW50cnlTaWduYXR1cmUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlayBiYWNrIHRvIHRoZSBmaXJzdCBzcG90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5TZWVrKC0yNCwgU2Vla09yaWdpbi5DdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gX1JlYWRGb3VyQnl0ZXMocywgIm4vYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEJhZFJlYWRFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBpbnQgUmVhZEludChTeXN0ZW0uSU8uU3RyZWFtIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfUmVhZEZvdXJCeXRlcyhzLCAiQ291bGQgbm90IHJlYWQgYmxvY2sgLSBubyBkYXRhISAgKHBvc2l0aW9uIDB4ezA6WDh9KSIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9SZWFkRm91ckJ5dGVzKFN5c3RlbS5JTy5TdHJlYW0gcywgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG5ldyBieXRlWzRdOworI2lmIE5FVENGCisgICAgICAgICAgICAvLyB3b3JraXRlbSA5MTgxCisgICAgICAgICAgICAvLyBSZWFkaW5nIGhlcmUgaW4gTkVUQ0Ygc29tZXRpbWVzIHJlYWRzICJiYWNrd2FyZHMiLiBTZWVtcyB0byBoYXBwZW4gZm9yCisgICAgICAgICAgICAvLyBsYXJnZXIgZmlsZXMuICBOb3Qgc3VyZSB3aHkuIE1heWJlIGFuIGVycm9yIGluIGNhY2hpbmcuICBJZiB0aGUgZGF0YSBpczoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAwMDEwMDIxMDogOWVmYSAwZjAwIDcwNzIgNmY2YSA2NTYzIDc0MmUgNjk2MyA3NzUwICAuLi4ucHJvamVjdC5pY3dQCisgICAgICAgICAgICAvLyAwMDEwMDIyMDogNGIwNSAwNjAwIDAwMDAgMDAwNiAwMDA2IDAwOTEgMDEwMCAwMDhlICBLLi4uLi4uLi4uLi4uLi4uCisgICAgICAgICAgICAvLyAwMDEwMDIzMDogMDAxMCAwMDAwIDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIC4uLmFuZCB0aGUgc3RyZWFtIFBvc2l0aW9uIGlzIDEwMDIxRiwgdGhlbiBhIFJlYWQgb2YgNCBieXRlcyBpcyByZXR1cm5pbmcKKyAgICAgICAgICAgIC8vIDUwNzc2MzY5LCBpbnN0ZWFkIG9mIDA2MDU0YjUwLiBUaGlzIHNlZW1zIHRvIGhhcHBlbiB0aGUgMm5kIHRpbWUgUmVhZCgpCisgICAgICAgICAgICAvLyBpcyBjYWxsZWQgZnJvbSB0aGF0IFBvc2l0aW9uLi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gY29ubmVjdC5taWNyb3NvZnQuY29tCisgICAgICAgICAgICAvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svVmlld0ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0zMTg5MTgjdGFicworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2suTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbis9IHMuUmVhZChibG9jaywgaSwgMSk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgbiA9IHMuUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKG4gIT0gYmxvY2suTGVuZ3RoKSB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KG1lc3NhZ2UsIHMuUG9zaXRpb24pKTsKKyAgICAgICAgICAgIGludCBkYXRhID0gdW5jaGVja2VkKCgoKGJsb2NrWzNdICogMjU2ICsgYmxvY2tbMl0pICogMjU2KSArIGJsb2NrWzFdKSAqIDI1NiArIGJsb2NrWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRmluZHMgYSBzaWduYXR1cmUgaW4gdGhlIHppcCBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsIGZvciBmaW5kaW5nCisgICAgICAgIC8vLyAgIHRoZSBlbmQgb2YgYSB6aXAgZW50cnksIGZvciBleGFtcGxlLCBvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IFppcEVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBTY2FucyB0aHJvdWdoIDY0ayBhdCBhIHRpbWUuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIElmIHRoZSBtZXRob2QgZmFpbHMgdG8gZmluZCB0aGUgcmVxdWVzdGVkIHNpZ25hdHVyZSwgdGhlIHN0cmVhbSBQb3NpdGlvbgorICAgICAgICAvLy8gICAgIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhpcyBtZXRob2QgaXMgdW5jaGFuZ2VkLiBJZiB0aGUgbWV0aG9kIHN1Y2NlZWRzIGluCisgICAgICAgIC8vLyAgICAgZmluZGluZyB0aGUgcmVxdWVzdGVkIHNpZ25hdHVyZSwgdGhlIHN0cmVhbSBwb3NpdGlvbiBhZnRlciBjb21wbGV0aW9uIGlzCisgICAgICAgIC8vLyAgICAgZGlyZWN0IEFGVEVSIHRoZSBzaWduYXR1cmUgZm91bmQgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gdG8gc2VhcmNoPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTaWduYXR1cmVUb0ZpbmQiPlRoZSA0LWJ5dGUgc2lnbmF0dXJlIHRvIGZpbmQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG51bWJlciBvZiBieXRlcyByZWFkPC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgbG9uZyBGaW5kU2lnbmF0dXJlKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBpbnQgU2lnbmF0dXJlVG9GaW5kKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHN0YXJ0aW5nUG9zaXRpb24gPSBzdHJlYW0uUG9zaXRpb247CisKKyAgICAgICAgICAgIGludCBCQVRDSF9TSVpFID0gNjU1MzY7IC8vICA4MTkyOworICAgICAgICAgICAgYnl0ZVtdIHRhcmdldEJ5dGVzID0gbmV3IGJ5dGVbNF07CisgICAgICAgICAgICB0YXJnZXRCeXRlc1swXSA9IChieXRlKShTaWduYXR1cmVUb0ZpbmQgPj4gMjQpOworICAgICAgICAgICAgdGFyZ2V0Qnl0ZXNbMV0gPSAoYnl0ZSkoKFNpZ25hdHVyZVRvRmluZCAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgICAgICAgIHRhcmdldEJ5dGVzWzJdID0gKGJ5dGUpKChTaWduYXR1cmVUb0ZpbmQgJiAweDAwMDBGRjAwKSA+PiA4KTsKKyAgICAgICAgICAgIHRhcmdldEJ5dGVzWzNdID0gKGJ5dGUpKFNpZ25hdHVyZVRvRmluZCAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgYnl0ZVtdIGJhdGNoID0gbmV3IGJ5dGVbQkFUQ0hfU0laRV07CisgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbiA9IHN0cmVhbS5SZWFkKGJhdGNoLCAwLCBiYXRjaC5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhdGNoW2ldID09IHRhcmdldEJ5dGVzWzNdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY3VyUG9zaXRpb24gPSBzdHJlYW0uUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoaSAtIG4sIFN5c3RlbS5JTy5TZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KHN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3NzExCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpZyA9IFJlYWRTaWduYXR1cmUoc3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAoc2lnID09IFNpZ25hdHVyZVRvRmluZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoY3VyUG9zaXRpb24sIFN5c3RlbS5JTy5TZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG91dCBvZiBmb3IgbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIGJyZWFrOworCisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKHN0YXJ0aW5nUG9zaXRpb24sIFN5c3RlbS5JTy5TZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgIFdvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChzdHJlYW0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIG9yIHRocm93PworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdWJ0cmFjdCA0IGZvciB0aGUgc2lnbmF0dXJlLgorICAgICAgICAgICAgbG9uZyBieXRlc1JlYWQgPSAoc3RyZWFtLlBvc2l0aW9uIC0gc3RhcnRpbmdQb3NpdGlvbikgLSA0OworCisgICAgICAgICAgICByZXR1cm4gYnl0ZXNSZWFkOworICAgICAgICB9CisKKworICAgICAgICAvLyBJZiBJIGhhdmUgYSB0aW1lIGluIHRoZSAuTkVUIGVudmlyb25tZW50LCBhbmQgSSB3YW50IHRvIHVzZSBpdCBmb3IKKyAgICAgICAgLy8gU2V0V2FzdFdyaXRlVGltZSgpIGV0YywgdGhlbiBJIG5lZWQgdG8gYWRqdXN0IGl0IGZvciBXaW4zMi4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIERhdGVUaW1lIEFkanVzdFRpbWVfUmV2ZXJzZShEYXRlVGltZSB0aW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGltZS5LaW5kID09IERhdGVUaW1lS2luZC5VdGMpIHJldHVybiB0aW1lOworICAgICAgICAgICAgRGF0ZVRpbWUgYWRqdXN0ZWQgPSB0aW1lOworICAgICAgICAgICAgaWYgKERhdGVUaW1lLk5vdy5Jc0RheWxpZ2h0U2F2aW5nVGltZSgpICYmICF0aW1lLklzRGF5bGlnaHRTYXZpbmdUaW1lKCkpCisgICAgICAgICAgICAgICAgYWRqdXN0ZWQgPSB0aW1lIC0gbmV3IFN5c3RlbS5UaW1lU3BhbigxLCAwLCAwKTsKKworICAgICAgICAgICAgZWxzZSBpZiAoIURhdGVUaW1lLk5vdy5Jc0RheWxpZ2h0U2F2aW5nVGltZSgpICYmIHRpbWUuSXNEYXlsaWdodFNhdmluZ1RpbWUoKSkKKyAgICAgICAgICAgICAgICBhZGp1c3RlZCA9IHRpbWUgKyBuZXcgU3lzdGVtLlRpbWVTcGFuKDEsIDAsIDApOworCisgICAgICAgICAgICByZXR1cm4gYWRqdXN0ZWQ7CisgICAgICAgIH0KKworI2lmIE5FQ0VTU0FSWQorICAgICAgICAvLyBJZiBJIHJlYWQgYSB0aW1lIGZyb20gYSBmaWxlIHdpdGggR2V0TGFzdFdyaXRlVGltZSgpIChldGMpLCBJIG5lZWQKKyAgICAgICAgLy8gdG8gYWRqdXN0IGl0IGZvciBkaXNwbGF5IGluIHRoZSAuTkVUIGVudmlyb25tZW50LgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRGF0ZVRpbWUgQWRqdXN0VGltZV9Gb3J3YXJkKERhdGVUaW1lIHRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aW1lLktpbmQgPT0gRGF0ZVRpbWVLaW5kLlV0YykgcmV0dXJuIHRpbWU7CisgICAgICAgICAgICBEYXRlVGltZSBhZGp1c3RlZCA9IHRpbWU7CisgICAgICAgICAgICBpZiAoRGF0ZVRpbWUuTm93LklzRGF5bGlnaHRTYXZpbmdUaW1lKCkgJiYgIXRpbWUuSXNEYXlsaWdodFNhdmluZ1RpbWUoKSkKKyAgICAgICAgICAgICAgICBhZGp1c3RlZCA9IHRpbWUgKyBuZXcgU3lzdGVtLlRpbWVTcGFuKDEsIDAsIDApOworCisgICAgICAgICAgICBlbHNlIGlmICghRGF0ZVRpbWUuTm93LklzRGF5bGlnaHRTYXZpbmdUaW1lKCkgJiYgdGltZS5Jc0RheWxpZ2h0U2F2aW5nVGltZSgpKQorICAgICAgICAgICAgICAgIGFkanVzdGVkID0gdGltZSAtIG5ldyBTeXN0ZW0uVGltZVNwYW4oMSwgMCwgMCk7CisKKyAgICAgICAgICAgIHJldHVybiBhZGp1c3RlZDsKKyAgICAgICAgfQorI2VuZGlmCisKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRGF0ZVRpbWUgUGFja2VkVG9EYXRlVGltZShJbnQzMiBwYWNrZWREYXRlVGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzA3NCAmIHdvcmtpdGVtIDcxNzAKKyAgICAgICAgICAgIGlmIChwYWNrZWREYXRlVGltZSA9PSAweEZGRkYgfHwgcGFja2VkRGF0ZVRpbWUgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5c3RlbS5EYXRlVGltZSgxOTk1LCAxLCAxLCAwLCAwLCAwLCAwKTsgIC8vIHJldHVybiBhIGZpeGVkIGRhdGUgd2hlbiBub25lIGlzIHN1cHBsaWVkLgorCisgICAgICAgICAgICBJbnQxNiBwYWNrZWRUaW1lID0gdW5jaGVja2VkKChJbnQxNikocGFja2VkRGF0ZVRpbWUgJiAweDAwMDBmZmZmKSk7CisgICAgICAgICAgICBJbnQxNiBwYWNrZWREYXRlID0gdW5jaGVja2VkKChJbnQxNikoKHBhY2tlZERhdGVUaW1lICYgMHhmZmZmMDAwMCkgPj4gMTYpKTsKKworICAgICAgICAgICAgaW50IHllYXIgPSAxOTgwICsgKChwYWNrZWREYXRlICYgMHhGRTAwKSA+PiA5KTsKKyAgICAgICAgICAgIGludCBtb250aCA9IChwYWNrZWREYXRlICYgMHgwMUUwKSA+PiA1OworICAgICAgICAgICAgaW50IGRheSA9IHBhY2tlZERhdGUgJiAweDAwMUY7CisKKyAgICAgICAgICAgIGludCBob3VyID0gKHBhY2tlZFRpbWUgJiAweEY4MDApID4+IDExOworICAgICAgICAgICAgaW50IG1pbnV0ZSA9IChwYWNrZWRUaW1lICYgMHgwN0UwKSA+PiA1OworICAgICAgICAgICAgLy9pbnQgc2Vjb25kID0gcGFja2VkVGltZSAmIDB4MDAxRjsKKyAgICAgICAgICAgIGludCBzZWNvbmQgPSAocGFja2VkVGltZSAmIDB4MDAxRikgKiAyOworCisgICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGFuZCBlcnJvciBjaGVja2luZy4KKyAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGZvb2xwcm9vZiBidXQgd2lsbCBjYXRjaCBtb3N0IGVycm9ycy4KKyAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gNjApIHsgbWludXRlKys7IHNlY29uZCA9IDA7IH0KKyAgICAgICAgICAgIGlmIChtaW51dGUgPj0gNjApIHsgaG91cisrOyBtaW51dGUgPSAwOyB9CisgICAgICAgICAgICBpZiAoaG91ciA+PSAyNCkgeyBkYXkrKzsgaG91ciA9IDA7IH0KKworICAgICAgICAgICAgRGF0ZVRpbWUgZCA9IFN5c3RlbS5EYXRlVGltZS5Ob3c7CisgICAgICAgICAgICBib29sIHN1Y2Nlc3M9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIDApOworICAgICAgICAgICAgICAgIHN1Y2Nlc3M9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeWVhciA9PSAxOTgwICYmIChtb250aCA9PSAwIHx8IGRheSA9PSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gbmV3IFN5c3RlbS5EYXRlVGltZSgxOTgwLCAxLCAxLCBob3VyLCBtaW51dGUsIHNlY29uZCwgMCk7CisgICAgICAgICAgICAgICAgc3VjY2Vzcz0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoMTk4MCwgMSwgMSwgMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgc3VjY2Vzcz0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSB7IH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDg4MTQKKyAgICAgICAgICAgICAgICAvLyBteSBnb2QsIEkgY2FuJ3QgYmVsaWV2ZSBob3cgbWFueSBkaWZmZXJlbnQgd2F5cyBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBjYW4gbWVzcyB1cCBhIHNpbXBsZSBkYXRlIGZvcm1hdC4KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHllYXIgPCAxOTgwKSB5ZWFyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeWVhciA+IDIwMzApIHllYXItLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtb250aCA8IDEpIG1vbnRoKys7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobW9udGggPiAxMikgbW9udGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkYXkgPCAxKSBkYXkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkYXkgPiAyOCkgZGF5LS07CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWludXRlIDwgMCkgbWludXRlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobWludXRlID4gNTkpIG1pbnV0ZS0tOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlY29uZCA8IDApIHNlY29uZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlY29uZCA+IDU5KSBzZWNvbmQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBuZXcgU3lzdGVtLkRhdGVUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5Bcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbXNnID0gU3RyaW5nLkZvcm1hdCgieSh7MH0pIG0oezF9KSBkKHsyfSkgaCh7M30pIG0oezR9KSBzKHs1fSkiLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJCYWQgZGF0ZS90aW1lIGZvcm1hdCBpbiB0aGUgemlwIGZpbGUuICh7MH0pIiwgbXNnKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDYxOTEKKyAgICAgICAgICAgIC8vZCA9IEFkanVzdFRpbWVfUmV2ZXJzZShkKTsKKyAgICAgICAgICAgIGQgPSBEYXRlVGltZS5TcGVjaWZ5S2luZChkLCBEYXRlVGltZUtpbmQuTG9jYWwpOworICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsCisgICAgICAgICBzdGF0aWMgSW50MzIgRGF0ZVRpbWVUb1BhY2tlZChEYXRlVGltZSB0aW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgdGltZSBpcyBwYXNzZWQgaW4gaGVyZSBvbmx5IGZvciBwdXJwb3NlcyBvZiB3cml0aW5nIExhc3RNb2RpZmllZCB0byB0aGUKKyAgICAgICAgICAgIC8vIHppcCBhcmNoaXZlLiBJdCBzaG91bGQgYWx3YXlzIGJlIExvY2FsVGltZSwgYnV0IHdlIGNvbnZlcnQgYW55d2F5LiAgQW5kLAorICAgICAgICAgICAgLy8gc2luY2UgdGhlIHRpbWUgaXMgYmVpbmcgd3JpdHRlbiBvdXQsIGl0IG5lZWRzIHRvIGJlIGFkanVzdGVkLgorCisgICAgICAgICAgICB0aW1lID0gdGltZS5Ub0xvY2FsVGltZSgpOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzk2NgorICAgICAgICAgICAgLy90aW1lID0gQWRqdXN0VGltZV9Gb3J3YXJkKHRpbWUpOworCisgICAgICAgICAgICAvLyBzZWUgaHR0cDovL3d3dy52c2Z0LmNvbS9oYWwvZG9zdGltZS5odG0gZm9yIHRoZSBmb3JtYXQKKyAgICAgICAgICAgIFVJbnQxNiBwYWNrZWREYXRlID0gKFVJbnQxNikoKHRpbWUuRGF5ICYgMHgwMDAwMDAxRikgfCAoKHRpbWUuTW9udGggPDwgNSkgJiAweDAwMDAwMUUwKSB8ICgoKHRpbWUuWWVhciAtIDE5ODApIDw8IDkpICYgMHgwMDAwRkUwMCkpOworICAgICAgICAgICAgVUludDE2IHBhY2tlZFRpbWUgPSAoVUludDE2KSgodGltZS5TZWNvbmQgLyAyICYgMHgwMDAwMDAxRikgfCAoKHRpbWUuTWludXRlIDw8IDUpICYgMHgwMDAwMDdFMCkgfCAoKHRpbWUuSG91ciA8PCAxMSkgJiAweDAwMDBGODAwKSk7CisKKyAgICAgICAgICAgIEludDMyIHJlc3VsdCA9IChJbnQzMikoKChVSW50MzIpKHBhY2tlZERhdGUgPDwgMTYpKSB8IHBhY2tlZFRpbWUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDcmVhdGUgYSBwc2V1ZG8tcmFuZG9tIGZpbGVuYW1lLCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgdGVtcG9yYXJ5CisgICAgICAgIC8vLyAgIGZpbGUsIGFuZCBvcGVuIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIFN5c3RlbS5JTy5QYXRoLkdldFJhbmRvbUZpbGVOYW1lKCkgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUgb24KKyAgICAgICAgLy8vICAgdGhlIENvbXBhY3QgRnJhbWV3b3JrLCBzbyB0aGlzIGxpYnJhcnkgcHJvdmlkZXMgaXRzIG93biBzdWJzdGl0dXRlCisgICAgICAgIC8vLyAgIG9uIE5FVENGLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgZmlsZW5hbWUgb2YgdGhlIGZvcm0KKyAgICAgICAgLy8vICAgRG90TmV0WmlwLXh4eHh4eHh4LnRtcCwgd2hlcmUgeHh4eHh4eHggaXMgcmVwbGFjZWQgYnkgcmFuZG9tbHkKKyAgICAgICAgLy8vICAgY2hvc2VuIGNoYXJhY3RlcnMsIGFuZCBjcmVhdGVzIHRoYXQgZmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENyZWF0ZUFuZE9wZW5VbmlxdWVUZW1wRmlsZShzdHJpbmcgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBTdHJlYW0gZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IHN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd29ya2l0ZW0gOTc2MworICAgICAgICAgICAgLy8gaHR0cDovL2RvdG5ldC5vcmcuemEvbWFya24vYXJjaGl2ZS8yMDA2LzA0LzE1LzUxNTk0LmFzcHgKKyAgICAgICAgICAgIC8vIHRyeSAzIHRpbWVzOgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IFBhdGguQ29tYmluZShkaXIsIEludGVybmFsR2V0VGVtcEZpbGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBmcyA9IG5ldyBGaWxlU3RyZWFtKGZpbGVuYW1lLCBGaWxlTW9kZS5DcmVhdGVOZXcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDIpIHRocm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyNpZiBORVRDRiB8fCBTSUxWRVJMSUdIVAorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBJbnRlcm5hbEdldFRlbXBGaWxlTmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiRG90TmV0WmlwLSIgKyBHZW5lcmF0ZVJhbmRvbVN0cmluZ0ltcGwoOCwwKSArICIudG1wIjsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2VuZXJhdGVSYW5kb21TdHJpbmdJbXBsKGludCBsZW5ndGgsIGludCBkZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBXYW50TWl4ZWRDYXNlID0gKGRlbHRhID09IDApOworICAgICAgICAgICAgU3lzdGVtLlJhbmRvbSBybmQgPSBuZXcgU3lzdGVtLlJhbmRvbSgpOworCisgICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgICAgICAgICBjaGFyW10gYSA9IG5ldyBjaGFyW2xlbmd0aF07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvLyBkZWx0YSA9PSA2NSBtZWFucyB1cHBlcmNhc2UKKyAgICAgICAgICAgICAgIC8vIGRlbHRhID09IDk3IG1lYW5zIGxvd2VyY2FzZQorICAgICAgICAgICAgICAgIGlmIChXYW50TWl4ZWRDYXNlKQorICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChybmQuTmV4dCgyKSA9PSAwKSA/IDY1IDogOTc7CisgICAgICAgICAgICAgICAgYVtpXSA9IChjaGFyKShybmQuTmV4dCgyNikgKyBkZWx0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTeXN0ZW0uU3RyaW5nKGEpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgSW50ZXJuYWxHZXRUZW1wRmlsZU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIkRvdE5ldFppcC0iICsgUGF0aC5HZXRSYW5kb21GaWxlTmFtZSgpLlN1YnN0cmluZygwLCA4KSArICIudG1wIjsKKyAgICAgICAgfQorCisjZW5kaWYKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdvcmtpdGVtIDc4ODk6IGhhbmRsZSBFUlJPUl9MT0NLX1ZJT0xBVElPTiBkdXJpbmcgcmVhZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGlzIGNvdWxkIGJlIGdyYWNlZnVsbHkgaGFuZGxlZCB3aXRoIGFuIGV4dGVuc2lvbiBhdHRyaWJ1dGUsIGJ1dAorICAgICAgICAvLy8gVGhpcyBhc3NlbWJseSBpcyBidWlsdCBmb3IgLk5FVCAyLjAsIHNvIEkgY2Fubm90IHVzZSB0aGVtLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgaW50IFJlYWRXaXRoUmV0cnkoU3lzdGVtLklPLlN0cmVhbSBzLCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIHN0cmluZyBGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgYm9vbCBkb25lID0gZmFsc2U7CisjaWYgIU5FVENGICYmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgaW50IHJldHJpZXMgPSAwOworI2VuZGlmCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IHMuUmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisjaWYgTkVUQ0YgfHwgU0lMVkVSTElHSFQKKyAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLklPLklPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLklPLklPRXhjZXB0aW9uIGlvZXhjMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBjYWxsIEdldEhSRm9yRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtYWtlcyB1bm1hbmFnZWQgY29kZSBjYWxscy4KKyAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5UGVybWlzc2lvbkZsYWcuVW5tYW5hZ2VkQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLklzVW5yZXN0cmljdGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgaHJlc3VsdCA9IF9IUkZvckV4Y2VwdGlvbihpb2V4YzEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyZXN1bHQgIT0gMHg4MDA3MDAyMSkgIC8vIEVSUk9SX0xPQ0tfVklPTEFUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJDYW5ub3QgcmVhZCBmaWxlIHswfSIsIEZpbGVOYW1lKSwgaW9leGMxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzID4gMTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJDYW5ub3QgcmVhZCBmaWxlIHswfSwgYXQgb2Zmc2V0IDB4ezE6WDh9IGFmdGVyIDEwIHJldHJpZXMiLCBGaWxlTmFtZSwgb2Zmc2V0KSwgaW9leGMxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4IHRpbWUgd2FpdGVkIG9uIGxhc3QgcmV0cnkgPSAyNTAgKyAxMCo1NTAgPSA1Ljc1cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWdncmVnYXRlIHRpbWUgd2FpdGVkIGFmdGVyIDEwIHJldHJpZXM6IDI1MCArIDU1KjU1MCA9IDMwLjVzCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCgyNTAgKyByZXRyaWVzICogNTUwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwZXJtaXNzaW9uLkRlbWFuZCgpIGZhaWxlZC4gVGhlcmVmb3JlLCB3ZSBjYW5ub3QgY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0SFJGb3JFeGNlcHRpb24sIGFuZCBjYW5ub3QgZG8gdGhlIHN1YnRsZSBoYW5kbGluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVJST1JfTE9DS19WSU9MQVRJT04uICBKdXN0IGJhaWwuCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKCFkb25lKTsKKworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworCisjaWYgIU5FVENGCisgICAgICAgIC8vIHdvcmtpdGVtIDgwMDkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBtZXRob2QgbXVzdCByZW1haW4gc2VwYXJhdGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIE1hcnNoYWwuR2V0SFJGb3JFeGNlcHRpb24oKSBpcyBuZWVkZWQgdG8gZG8gc3BlY2lhbCBleGNlcHRpb24gaGFuZGxpbmcgZm9yCisgICAgICAgIC8vIHRoZSByZWFkLiAgQnV0LCB0aGF0IG1ldGhvZCByZXF1aXJlcyBVbm1hbmFnZWRDb2RlIHBlcm1pc3Npb25zLCBhbmQgaXMgbWFya2VkCisgICAgICAgIC8vIHdpdGggTGlua0RlbWFuZCBmb3IgVW5tYW5hZ2VkQ29kZS4gIEluIGFuIEFTUC5ORVQgbWVkaXVtIHRydXN0IGVudmlyb25tZW50LAorICAgICAgICAvLyB3aGVyZSBVbm1hbmFnZWRDb2RlIGlzIHJlc3RyaWN0ZWQsIHdpbGwgZ2VuZXJhdGUgYSBTZWN1cml0eUV4Y2VwdGlvbiBhdCB0aGUKKyAgICAgICAgLy8gdGltZSBvZiBKSVQgb2YgdGhlIG1ldGhvZCB0aGF0IGNhbGxzIGEgbWV0aG9kIHRoYXQgaXMgbWFya2VkIHdpdGggTGlua0RlbWFuZAorICAgICAgICAvLyBmb3IgVW5tYW5hZ2VkQ29kZS4gVGhlIFNlY3VyaXR5RXhjZXB0aW9uLCBpZiBpdCBpcyByZXN0cmljdGVkLCB3aWxsIG9jY3VyCisgICAgICAgIC8vIHdoZW4gdGhpcyBtZXRob2QgaXMgSklUZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBNYXJzaGFsLkdldEhSRm9yRXhjZXB0aW9uKCkgaXMgZmFjdG9yZWQgb3V0IG9mIFJlYWRXaXRoUmV0cnkgaW4gb3JkZXIgdG8KKyAgICAgICAgLy8gYXZvaWQgdGhlIFNlY3VyaXR5RXhjZXB0aW9uIGF0IEpJVCBjb21waWxlIHRpbWUuIEJlY2F1c2UgX0hSRm9yRXhjZXB0aW9uIGlzCisgICAgICAgIC8vIGNhbGxlZCBvbmx5IHdoZW4gdGhlIFVubWFuYWdlZENvZGUgaXMgYWxsb3dlZC4gIFRoaXMgbWVhbnMgLk5FVCBuZXZlcgorICAgICAgICAvLyBKSVQtY29tcGlsZXMgdGhpcyBtZXRob2Qgd2hlbiBVbm1hbmFnZWRDb2RlIGlzIGRpc2FsbG93ZWQsIGFuZCB0aHVzIG5ldmVyCisgICAgICAgIC8vIGdlbmVyYXRlcyB0aGUgSklULWNvbXBpbGUgdGltZSBleGNlcHRpb24uCisgICAgICAgIC8vCisjZW5kaWYKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdWludCBfSFJGb3JFeGNlcHRpb24oU3lzdGVtLkV4Y2VwdGlvbiBleDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB1bmNoZWNrZWQoKHVpbnQpU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLk1hcnNoYWwuR2V0SFJGb3JFeGNlcHRpb24oZXgxKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgQSBkZWNvcmF0b3Igc3RyZWFtLiBJdCB3cmFwcyBhbm90aGVyIHN0cmVhbSwgYW5kIHBlcmZvcm1zIGJvb2trZWVwaW5nCisgICAgLy8vICAgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3RyZWFtIFBvc2l0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIDxwYXJhPgorICAgIC8vLyAgICAgSW4gc29tZSBjYXNlcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdldCB0aGUgUG9zaXRpb24gb2YgYSBzdHJlYW0sIGxldCdzCisgICAgLy8vICAgICBzYXksIG9uIGEgd3JpdGUtb25seSBvdXRwdXQgc3RyZWFtIGxpa2UgQVNQLk5FVCdzCisgICAgLy8vICAgICA8Yz5SZXNwb25zZS5PdXRwdXRTdHJlYW08L2M+LCBvciBvbiBhIGRpZmZlcmVudCB3cml0ZS1vbmx5IHN0cmVhbQorICAgIC8vLyAgICAgcHJvdmlkZWQgYXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgemlwIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMKKyAgICAvLy8gICAgIGNhc2UsIHByb2dyYW1tZXJzIGNhbiB1c2UgdGhpcyBjb3VudGluZyBzdHJlYW0gdG8gY291bnQgdGhlIGJ5dGVzIHJlYWQKKyAgICAvLy8gICAgIG9yIHdyaXR0ZW4uCisgICAgLy8vICAgPC9wYXJhPgorICAgIC8vLyAgIDxwYXJhPgorICAgIC8vLyAgICAgQ29uc2lkZXIgdGhlIHNjZW5hcmlvIG9mIGFuIGFwcGxpY2F0aW9uIHRoYXQgc2F2ZXMgYSBzZWxmLWV4dHJhY3RpbmcKKyAgICAvLy8gICAgIGFyY2hpdmUgKFNGWCksIHRoYXQgdXNlcyBhIGN1c3RvbSBTRlggc3R1Yi4KKyAgICAvLy8gICA8L3BhcmE+CisgICAgLy8vICAgPHBhcmE+CisgICAgLy8vICAgICBTYXZpbmcgdG8gYSBmaWxlc3lzdGVtIGZpbGUsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBvcGVuIHRoZQorICAgIC8vLyAgICAgZmlsZXN5c3RlbSBmaWxlIChnZXR0aW5nIGEgPGM+RmlsZVN0cmVhbTwvYz4pLCBzYXZlIHRoZSBjdXN0b20gc2Z4IHN0dWIKKyAgICAvLy8gICAgIGludG8gaXQsIGFuZCB0aGVuIGNhbGwgPGM+WmlwRmlsZS5TYXZlKCk8L2M+LCBzcGVjaWZ5aW5nIHRoZSBzYW1lCisgICAgLy8vICAgICBGaWxlU3RyZWFtLiA8Yz5aaXBGaWxlLlNhdmUoKTwvYz4gZG9lcyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoZSB6aXBlbnRyeQorICAgIC8vLyAgICAgb2Zmc2V0cywgYnkgaW5xdWlyaW5nIHRoZSBQb3NpdGlvbiBvZiB0aGUgPGM+RmlsZVN0cmVhbTwvYz4gYmVmb3JlIHdyaXRpbmcKKyAgICAvLy8gICAgIGFueSBkYXRhLCBhbmQgdGhlbiBhZGRpbmcgdGhhdCBpbml0aWFsIG9mZnNldCBpbnRvIGFueSBaaXBFbnRyeQorICAgIC8vLyAgICAgb2Zmc2V0cyBpbiB0aGUgemlwIGRpcmVjdG9yeS4gRXZlcnl0aGluZyB3b3JrcyBmaW5lLgorICAgIC8vLyAgIDwvcGFyYT4KKyAgICAvLy8gICA8cGFyYT4KKyAgICAvLy8gICAgIE5vdyBzdXBwb3NlIHRoZSBhcHBsaWNhdGlvbiBpcyBhbiBBU1BORVQgYXBwbGljYXRpb24gYW5kIGl0IHNhdmVzCisgICAgLy8vICAgICBkaXJlY3RseSB0byA8Yz5SZXNwb25zZS5PdXRwdXRTdHJlYW08L2M+LiBJdCdzIG5vdCBwb3NzaWJsZSBmb3IgRG90TmV0WmlwIHRvCisgICAgLy8vICAgICBpbnF1aXJlIHRoZSA8Yz5Qb3NpdGlvbjwvYz4sIHNvIHRoZSBvZmZzZXRzIGZvciB0aGUgU0ZYIHdpbGwgYmUgd3JvbmcuCisgICAgLy8vICAgPC9wYXJhPgorICAgIC8vLyAgIDxwYXJhPgorICAgIC8vLyAgICAgVGhlIHdvcmthcm91bmQgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byB1c2UgdGhpcyBjbGFzcyB0byB3cmFwCisgICAgLy8vICAgICA8Yz5IdHRwUmVzcG9uc2UuT3V0cHV0U3RyZWFtPC9jPiwgdGhlbiB3cml0ZSB0aGUgU0ZYIHN0dWIgYW5kIHRoZSBaaXBGaWxlCisgICAgLy8vICAgICBpbnRvIHRoYXQgd3JhcHBlciBzdHJlYW0uIEJlY2F1c2UgPGM+WmlwRmlsZS5TYXZlKCk8L2M+IGNhbiBpbnF1aXJlIHRoZQorICAgIC8vLyAgICAgPGM+UG9zaXRpb248L2M+LCBpdCB3aWxsIHRoZW4gZG8gdGhlIHJpZ2h0IHRoaW5nIHdpdGggdGhlIG9mZnNldHMuCisgICAgLy8vICAgPC9wYXJhPgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgaW50ZXJuYWwgY2xhc3MgQ291bnRpbmdTdHJlYW0gOiBTeXN0ZW0uSU8uU3RyZWFtCisgICAgeworICAgICAgICAvLyB3b3JraXRlbSAxMjM3NDogdGhpcyBjbGFzcyBpcyBub3cgcHVibGljCisgICAgICAgIHByaXZhdGUgU3lzdGVtLklPLlN0cmVhbSBfczsKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfYnl0ZXNXcml0dGVuOworICAgICAgICBwcml2YXRlIEludDY0IF9ieXRlc1JlYWQ7CisgICAgICAgIHByaXZhdGUgSW50NjQgX2luaXRpYWxPZmZzZXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHVuZGVybHlpbmcgc3RyZWFtPC9wYXJhbT4KKyAgICAgICAgcHVibGljIENvdW50aW5nU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3MgPSBzdHJlYW07CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5pdGlhbE9mZnNldCA9IF9zLlBvc2l0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5pdGlhbE9mZnNldCA9IDBMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBHZXRzIHRoZSB3cmFwcGVkIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFN0cmVhbSBXcmFwcGVkU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gb3V0IHRvIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBJbnQ2NCBCeXRlc1dyaXR0ZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9ieXRlc1dyaXR0ZW47IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgdGhlIGNvdW50IG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgZnJvbSB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgSW50NjQgQnl0ZXNSZWFkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfYnl0ZXNSZWFkOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICBBZGp1c3QgdGhlIGJ5dGUgY291bnQgb24gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0nZGVsdGEnPgorICAgICAgICAvLy8gICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHN1YnRyYWN0IGZyb20gdGhlIGNvdW50LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgU3VidHJhY3QgZGVsdGEgZnJvbSB0aGUgY291bnQgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gICAgIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gc2Vla2luZyBiYWNrLCBhbmQgd3JpdGluZyBhZGRpdGlvbmFsIGRhdGEsCisgICAgICAgIC8vLyAgICAgYXMgaGFwcGVucyBpbiBzb21lIGNhc2VzIHdoZW4gc2F2aW5nIFppcCBmaWxlcy4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgdm9pZCBBZGp1c3QoSW50NjQgZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ieXRlc1dyaXR0ZW4gLT0gZGVsdGE7CisgICAgICAgICAgICBpZiAoX2J5dGVzV3JpdHRlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChfcyBhcyBDb3VudGluZ1N0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICgoQ291bnRpbmdTdHJlYW0pX3MpLkFkanVzdChkZWx0YSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSByZWFkIG1ldGhvZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSByZWFkIGZyb20gdGhlIHN0cmVhbS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBmaXJzdCBieXRlIHJlYWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+dGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIGFmdGVyIGRlY3J5cHRpb24gYW5kIGRlY29tcHJlc3Npb24uPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IF9zLlJlYWQoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgICAgIF9ieXRlc1JlYWQgKz0gbjsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBXcml0ZSBkYXRhIGludG8gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgaG9sZGluZyBkYXRhIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZGF0YSBhcnJheSB0byBmaW5kIHRoZSBmaXJzdCBieXRlIHRvIHdyaXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgX3MuV3JpdGUoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgICAgIF9ieXRlc1dyaXR0ZW4gKz0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFdoZXRoZXIgdGhlIHN0cmVhbSBjYW4gYmUgcmVhZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3MuQ2FuUmVhZDsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBXaGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgU2VlaygpIG9uIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zLkNhblNlZWs7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgV2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBjYWxsIFdyaXRlKCkgb24gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuV3JpdGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zLkNhbldyaXRlOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zLkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zLkxlbmd0aDsgfSAgIC8vIGJ5dGVzV3JpdHRlbj8/CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJldHVybnMgdGhlIHN1bSBvZiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgcGx1cyB0aGUgaW5pdGlhbAorICAgICAgICAvLy8gICBvZmZzZXQgYmVmb3JlIHdyaXRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBsb25nIENvbXB1dGVkUG9zaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pbml0aWFsT2Zmc2V0ICsgX2J5dGVzV3JpdHRlbjsgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBQb3NpdGlvbiBvZiB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3MuUG9zaXRpb247IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zLlNlZWsodmFsdWUsIFN5c3RlbS5JTy5TZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgIElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KF9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgU2VlayBpbiB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCBwb2ludCB0byBzZWVrIHRvPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcmlnaW4iPnRoZSByZWZlcmVuY2UgcG9pbnQgZnJvbSB3aGljaCB0byBzZWVrPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBuZXcgcG9zaXRpb248L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFNlZWsobG9uZyBvZmZzZXQsIFN5c3RlbS5JTy5TZWVrT3JpZ2luIG9yaWdpbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zLlNlZWsob2Zmc2V0LCBvcmlnaW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTZXQgdGhlIGxlbmd0aCBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBCZSBjYXJlZnVsIHdpdGggdGhpcyEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ndmFsdWUnPnRoZSBsZW5ndGggdG8gc2V0IG9uIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3MuU2V0TGVuZ3RoKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9XaW5aaXBBZXMuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9XaW5aaXBBZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1ZWVhNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1dpblppcEFlcy5jcwpAQCAtMCwwICsxLDk0MSBAQAorLy8jZGVmaW5lIFRyYWNlCisKKy8vIFdpblppcEFlcy5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgRGlubyBDaGllc2EuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKToKKy8vIFRpbWUtc3RhbXA6IDwyMDExLUp1bHktMTIgMTM6NDI6MDY+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgY2xhc3NlcyBmb3IgZGVhbGluZyB3aXRoIFdpblppcCdzIEFFUyBlbmNyeXB0aW9uLAorLy8gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGZvcm1hdCBhdmFpbGFibGUgb24gV2luWmlwJ3Mgd2Vic2l0ZS4KKy8vCisvLyBDcmVhdGVkOiBKYW51YXJ5IDIwMDkKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5OworCisjaWYgQUVTQ1JZUFRPCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3Mgc3VwcG9ydGluZyBXaW5aaXAgQUVTIGVuY3J5cHRpb24uCisgICAgLy8vICAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgdGhlIERvdE5ldFppcCBsaWJyYXJ5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIE1vc3QgdXNlcyBvZiB0aGUgRG90TmV0WmlwIGxpYnJhcnkgd2lsbCBub3QgaW52b2x2ZSBkaXJlY3QgY2FsbHMgaW50bworICAgIC8vLyAgIHRoZSBXaW5aaXBBZXNDcnlwdG8gY2xhc3MuICBJbnN0ZWFkLCB0aGUgV2luWmlwQWVzQ3J5cHRvIGNsYXNzIGlzCisgICAgLy8vICAgaW5zdGFudGlhdGVkIGFuZCB1c2VkIGJ5IHRoZSBaaXBFbnRyeSgpIGNsYXNzIHdoZW4gV2luWmlwIEFFUworICAgIC8vLyAgIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBvbiBhbiBlbnRyeSBpcyBlbXBsb3llZC4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGludGVybmFsIGNsYXNzIFdpblppcEFlc0NyeXB0bworICAgIHsKKyAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIF9TYWx0OworICAgICAgICBpbnRlcm5hbCBieXRlW10gX3Byb3ZpZGVkUHY7CisgICAgICAgIGludGVybmFsIGJ5dGVbXSBfZ2VuZXJhdGVkUHY7CisgICAgICAgIGludGVybmFsIGludCBfS2V5U3RyZW5ndGhJbkJpdHM7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9NYWNJbml0aWFsaXphdGlvblZlY3RvcjsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX1N0b3JlZE1hYzsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX2tleUJ5dGVzOworICAgICAgICBwcml2YXRlIEludDE2IFBhc3N3b3JkVmVyaWZpY2F0aW9uU3RvcmVkOworICAgICAgICBwcml2YXRlIEludDE2IFBhc3N3b3JkVmVyaWZpY2F0aW9uR2VuZXJhdGVkOworICAgICAgICBwcml2YXRlIGludCBSZmMyODk4S2V5Z2VuSXRlcmF0aW9ucyA9IDEwMDA7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9QYXNzd29yZDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9jcnlwdG9HZW5lcmF0ZWQgOworCisgICAgICAgIHByaXZhdGUgV2luWmlwQWVzQ3J5cHRvKHN0cmluZyBwYXNzd29yZCwgaW50IEtleVN0cmVuZ3RoSW5CaXRzKQorICAgICAgICB7CisgICAgICAgICAgICBfUGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgICAgIF9LZXlTdHJlbmd0aEluQml0cyA9IEtleVN0cmVuZ3RoSW5CaXRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBXaW5aaXBBZXNDcnlwdG8gR2VuZXJhdGUoc3RyaW5nIHBhc3N3b3JkLCBpbnQgS2V5U3RyZW5ndGhJbkJpdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdpblppcEFlc0NyeXB0byBjID0gbmV3IFdpblppcEFlc0NyeXB0byhwYXNzd29yZCwgS2V5U3RyZW5ndGhJbkJpdHMpOworCisgICAgICAgICAgICBpbnQgc2FsdFNpemVJbkJ5dGVzID0gYy5fS2V5U3RyZW5ndGhJbkJ5dGVzIC8gMjsKKyAgICAgICAgICAgIGMuX1NhbHQgPSBuZXcgYnl0ZVtzYWx0U2l6ZUluQnl0ZXNdOworICAgICAgICAgICAgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIHJuZC5OZXh0Qnl0ZXMoYy5fU2FsdCk7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorCisKKworICAgICAgICBwdWJsaWMgc3RhdGljIFdpblppcEFlc0NyeXB0byBSZWFkRnJvbVN0cmVhbShzdHJpbmcgcGFzc3dvcmQsIGludCBLZXlTdHJlbmd0aEluQml0cywgU3RyZWFtIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZyb20gaHR0cDovL3d3dy53aW56aXAuY29tL2Flc19pbmZvLmh0bQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpemUoYnl0ZXMpICAgQ29udGVudAorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIC8vIFZhcmlhYmxlICAgICAgU2FsdCB2YWx1ZQorICAgICAgICAgICAgLy8gMiAgICAgICAgICAgICBQYXNzd29yZCB2ZXJpZmljYXRpb24gdmFsdWUKKyAgICAgICAgICAgIC8vIFZhcmlhYmxlICAgICAgRW5jcnlwdGVkIGZpbGUgZGF0YQorICAgICAgICAgICAgLy8gMTAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiBjb2RlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gWmlwRW50cnkuQ29tcHJlc3NlZFNpemUgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiBhbGwgb2YgdGhvc2UgZWxlbWVudHMuCisKKyAgICAgICAgICAgIC8vIHNhbHQgc2l6ZSB2YXJpZXMgd2l0aCBrZXkgbGVuZ3RoOgorICAgICAgICAgICAgLy8gICAgMTI4IGJpdCBrZXkgPT4gOCBieXRlcyBzYWx0CisgICAgICAgICAgICAvLyAgICAxOTIgYml0cyA9PiAxMiBieXRlcyBzYWx0CisgICAgICAgICAgICAvLyAgICAyNTYgYml0cyA9PiAxNiBieXRlcyBzYWx0CisKKyAgICAgICAgICAgIFdpblppcEFlc0NyeXB0byBjID0gbmV3IFdpblppcEFlc0NyeXB0byhwYXNzd29yZCwgS2V5U3RyZW5ndGhJbkJpdHMpOworCisgICAgICAgICAgICBpbnQgc2FsdFNpemVJbkJ5dGVzID0gYy5fS2V5U3RyZW5ndGhJbkJ5dGVzIC8gMjsKKyAgICAgICAgICAgIGMuX1NhbHQgPSBuZXcgYnl0ZVtzYWx0U2l6ZUluQnl0ZXNdOworICAgICAgICAgICAgYy5fcHJvdmlkZWRQdiA9IG5ldyBieXRlWzJdOworCisgICAgICAgICAgICBzLlJlYWQoYy5fU2FsdCwgMCwgYy5fU2FsdC5MZW5ndGgpOworICAgICAgICAgICAgcy5SZWFkKGMuX3Byb3ZpZGVkUHYsIDAsIGMuX3Byb3ZpZGVkUHYuTGVuZ3RoKTsKKworICAgICAgICAgICAgYy5QYXNzd29yZFZlcmlmaWNhdGlvblN0b3JlZCA9IChJbnQxNikoYy5fcHJvdmlkZWRQdlswXSArIGMuX3Byb3ZpZGVkUHZbMV0gKiAyNTYpOworICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYy5QYXNzd29yZFZlcmlmaWNhdGlvbkdlbmVyYXRlZCA9IChJbnQxNikoYy5HZW5lcmF0ZWRQVlswXSArIGMuR2VuZXJhdGVkUFZbMV0gKiAyNTYpOworICAgICAgICAgICAgICAgIGlmIChjLlBhc3N3b3JkVmVyaWZpY2F0aW9uR2VuZXJhdGVkICE9IGMuUGFzc3dvcmRWZXJpZmljYXRpb25TdG9yZWQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRQYXNzd29yZEV4Y2VwdGlvbigiYmFkIHBhc3N3b3JkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZW5lcmF0ZWRQVgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9jcnlwdG9HZW5lcmF0ZWQpIF9HZW5lcmF0ZUNyeXB0b0J5dGVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9nZW5lcmF0ZWRQdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBTYWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfU2FsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBpbnQgX0tleVN0cmVuZ3RoSW5CeXRlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX0tleVN0cmVuZ3RoSW5CaXRzIC8gODsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBTaXplT2ZFbmNyeXB0aW9uTWV0YWRhdGEKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gMTAgYnl0ZXMgYWZ0ZXIsIChuLTEwKSBiZWZvcmUgdGhlIGNvbXByZXNzZWQgZGF0YQorICAgICAgICAgICAgICAgIHJldHVybiBfS2V5U3RyZW5ndGhJbkJ5dGVzIC8gMiArIDEwICsgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgUGFzc3dvcmQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX1Bhc3N3b3JkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKF9QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUGFzc3dvcmRWZXJpZmljYXRpb25HZW5lcmF0ZWQgPSAoSW50MTYpKEdlbmVyYXRlZFBWWzBdICsgR2VuZXJhdGVkUFZbMV0gKiAyNTYpOworICAgICAgICAgICAgICAgICAgICBpZiAoUGFzc3dvcmRWZXJpZmljYXRpb25HZW5lcmF0ZWQgIT0gUGFzc3dvcmRWZXJpZmljYXRpb25TdG9yZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW9uaWMuWmlwLkJhZFBhc3N3b3JkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpdmF0ZSBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX1Bhc3N3b3JkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgX0dlbmVyYXRlQ3J5cHRvQnl0ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCIgcHJvdmlkZWQgcGFzc3dvcmQ6ICd7MH0nIiwgX1Bhc3N3b3JkKTsKKworICAgICAgICAgICAgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5SZmMyODk4RGVyaXZlQnl0ZXMgcmZjMjg5OCA9CisgICAgICAgICAgICAgICAgbmV3IFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuUmZjMjg5OERlcml2ZUJ5dGVzKF9QYXNzd29yZCwgU2FsdCwgUmZjMjg5OEtleWdlbkl0ZXJhdGlvbnMpOworCisgICAgICAgICAgICBfa2V5Qnl0ZXMgPSByZmMyODk4LkdldEJ5dGVzKF9LZXlTdHJlbmd0aEluQnl0ZXMpOyAvLyAxNiBvciAyNCBvciAzMiA/Pz8KKyAgICAgICAgICAgIF9NYWNJbml0aWFsaXphdGlvblZlY3RvciA9IHJmYzI4OTguR2V0Qnl0ZXMoX0tleVN0cmVuZ3RoSW5CeXRlcyk7CisgICAgICAgICAgICBfZ2VuZXJhdGVkUHYgPSByZmMyODk4LkdldEJ5dGVzKDIpOworCisgICAgICAgICAgICBfY3J5cHRvR2VuZXJhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBLZXlCeXRlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9jcnlwdG9HZW5lcmF0ZWQpIF9HZW5lcmF0ZUNyeXB0b0J5dGVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9rZXlCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBNYWNJdgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9jcnlwdG9HZW5lcmF0ZWQpIF9HZW5lcmF0ZUNyeXB0b0J5dGVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9NYWNJbml0aWFsaXphdGlvblZlY3RvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gQ2FsY3VsYXRlZE1hYzsKKworCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRBbmRWZXJpZnlNYWMoU3lzdGVtLklPLlN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGludmFsaWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gcmVhZCBpbnRlZ3JpdHlDaGVja1ZlY3Rvci4KKyAgICAgICAgICAgIC8vIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBmaWxlIHBvaW50ZXIgaXMgaW4gdGhlIHJpZ2h0IHNwb3QhCisgICAgICAgICAgICBfU3RvcmVkTWFjID0gbmV3IGJ5dGVbMTBdOyAgLy8gYWthICJhdXRoZW50aWNhdGlvbiBjb2RlIgorICAgICAgICAgICAgcy5SZWFkKF9TdG9yZWRNYWMsIDAsIF9TdG9yZWRNYWMuTGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKF9TdG9yZWRNYWMuTGVuZ3RoICE9IENhbGN1bGF0ZWRNYWMuTGVuZ3RoKQorICAgICAgICAgICAgICAgIGludmFsaWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoIWludmFsaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfU3RvcmVkTWFjLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9TdG9yZWRNYWNbaV0gIT0gQ2FsY3VsYXRlZE1hY1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGludmFsaWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElvbmljLlppcC5CYWRTdGF0ZUV4Y2VwdGlvbigiVGhlIE1BQyBkb2VzIG5vdCBtYXRjaC4iKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAjcmVnaW9uIERPTlRfQ09NUElMRV9CVVRfS0VFUF9GT1JfUE9URU5USUFMX0ZVVFVSRV9VU0UKKyNpZiBOTworICAgIGludGVybmFsIGNsYXNzIFV0aWwKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgX0Zvcm1hdChTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyIHNiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpCisgICAgICAgIHsKKworICAgICAgICAgICAgU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlciBzYjIgPSBuZXcgU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IxLkFwcGVuZCgiMDAwMCAgICAiKTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4ID0gb2Zmc2V0K2k7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCAmJiBpICUgMTYgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiMS5BcHBlbmQoIiAgICAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChzYjIpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKCJcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKFN0cmluZy5Gb3JtYXQoInswOlg0fSAgICAiLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIHNiMi5SZW1vdmUoMCxzYjIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IxLkFwcGVuZChTeXN0ZW0uU3RyaW5nLkZvcm1hdCgiezA6WDJ9ICIsIGJbeF0pKTsKKyAgICAgICAgICAgICAgICBpZiAoYlt4XSA+PTMyICYmIGJbeF0gPD0gMTI2KQorICAgICAgICAgICAgICAgICAgICBzYjIuQXBwZW5kKChjaGFyKWJbeF0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2IyLkFwcGVuZCgiLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNiMi5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiMS5BcHBlbmQobmV3IFN0cmluZygnICcsICgoMTYgLSBpJTE2KSAqIDMpICsgNCkpCisgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc2IyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEZvcm1hdEJ5dGVBcnJheShieXRlW10gYiwgaW50IGxpbWl0KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyIHNiMSA9IG5ldyBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGlmICgobGltaXQgKiAyID4gYi5MZW5ndGgpIHx8IGxpbWl0ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0Zvcm1hdChzYjEsIGIsIDAsIGIuTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCBOIGJ5dGVzIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBfRm9ybWF0KHNiMSwgYiwgMCwgbGltaXQpOworCisgICAgICAgICAgICAgICAgaWYgKGIuTGVuZ3RoID4gbGltaXQgKiAyKQorICAgICAgICAgICAgICAgICAgICBzYjEuQXBwZW5kKFN0cmluZy5Gb3JtYXQoIlxuICAgLi4uKHswfSBvdGhlciBieXRlcyBoZXJlKS4uLi5cbiIsIGIuTGVuZ3RoIC0gbGltaXQgKiAyKSk7CisKKyAgICAgICAgICAgICAgICAvLyBsYXN0IE4gYnl0ZXMgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIF9Gb3JtYXQoc2IxLCBiLCBiLkxlbmd0aCAtIGxpbWl0LCBsaW1pdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzYjEuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBGb3JtYXRCeXRlQXJyYXkoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGb3JtYXRCeXRlQXJyYXkoYiwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorICAgICNlbmRyZWdpb24KKworCisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBBIHN0cmVhbSB0aGF0IGVuY3J5cHRzIGFzIGl0IHdyaXRlcywgb3IgZGVjcnlwdHMgYXMgaXQgcmVhZHMuICBUaGUKKyAgICAvLy8gICBDcnlwdG8gaXMgQUVTIGluIENUUiAoY291bnRlcikgbW9kZSwgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBBRVMKKyAgICAvLy8gICBlbmNyeXB0aW9uIGVtcGxveWVkIGJ5IFdpblppcCAxMi4wLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgIDxwYXJhPgorICAgIC8vLyAgICAgVGhlIEFFUy9DVFIgZW5jcnlwdGlvbiBwcm90b2NvbCB1c2VkIGJ5IFdpblppcCB3b3JrcyBsaWtlIHRoaXM6CisgICAgLy8vCisgICAgLy8vICAgICAgIC0gc3RhcnQgd2l0aCBhIGNvdW50ZXIsIGluaXRpYWxpemVkIHRvIHplcm8uCisgICAgLy8vCisgICAgLy8vICAgICAgIC0gdG8gZW5jcnlwdCwgdGFrZSB0aGUgZGF0YSBieSAxNi1ieXRlIGJsb2Nrcy4gRm9yIGVhY2ggYmxvY2s6CisgICAgLy8vICAgICAgICAgLSBhcHBseSB0aGUgdHJhbnNmb3JtIHRvIHRoZSBjb3VudGVyCisgICAgLy8vICAgICAgICAgLSBpbmNyZWVtZW50IHRoZSBjb3VudGVyCisgICAgLy8vICAgICAgICAgLSBYT1IgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNmb3JtIHdpdGggdGhlIHBsYWludGV4dCB0bworICAgIC8vLyAgICAgICAgICAgZ2V0IHRoZSBjaXBoZXJ0ZXh0LgorICAgIC8vLyAgICAgICAgIC0gY29tcHV0ZSB0aGUgbWFjIG9uIHRoZSBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAvLy8gICAgICAgLSB3aGVuIGZpbmlzaGVkIHdpdGggYWxsIGJsb2Nrcywgc3RvcmUgdGhlIGNvbXB1dGVkIE1BQy4KKyAgICAvLy8KKyAgICAvLy8gICAgICAgLSB0byBkZWNyeXB0LCB0YWtlIHRoZSBkYXRhIGJ5IDE2LWJ5dGUgYmxvY2tzLiBGb3IgZWFjaCBibG9jazoKKyAgICAvLy8gICAgICAgICAtIGNvbXB1dGUgdGhlIG1hYyBvbiB0aGUgZW5jcnlwdGVkIGJ5dGVzLAorICAgIC8vLyAgICAgICAgIC0gYXBwbHkgdGhlIHRyYW5zZm9ybSB0byB0aGUgY291bnRlcgorICAgIC8vLyAgICAgICAgIC0gaW5jcmVlbWVudCB0aGUgY291bnRlcgorICAgIC8vLyAgICAgICAgIC0gWE9SIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybSB3aXRoIHRoZSBjaXBoZXJ0ZXh0IHRvCisgICAgLy8vICAgICAgICAgICBnZXQgdGhlIHBsYWludGV4dC4KKyAgICAvLy8gICAgICAgLSB3aGVuIGZpbmlzaGVkIHdpdGggYWxsIGJsb2NrcywgY29tcGFyZSB0aGUgY29tcHV0ZWQgTUFDIGFnYWluc3QKKyAgICAvLy8gICAgICAgICB0aGUgc3RvcmVkIE1BQworICAgIC8vLworICAgIC8vLyAgIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vCisgICAgaW50ZXJuYWwgY2xhc3MgV2luWmlwQWVzQ2lwaGVyU3RyZWFtIDogU3RyZWFtCisgICAgeworICAgICAgICBwcml2YXRlIFdpblppcEFlc0NyeXB0byBfcGFyYW1zOworICAgICAgICBwcml2YXRlIFN5c3RlbS5JTy5TdHJlYW0gX3M7CisgICAgICAgIHByaXZhdGUgQ3J5cHRvTW9kZSBfbW9kZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX25vbmNlOworICAgICAgICBwcml2YXRlIGJvb2wgX2ZpbmFsQmxvY2s7CisKKyAgICAgICAgaW50ZXJuYWwgSE1BQ1NIQTEgX21hYzsKKworICAgICAgICAvLyBVc2UgUmlqbmRhZWxNYW5hZ2VkIGZyb20gLk5FVCAyLjAuCisgICAgICAgIC8vIEFlc01hbmFnZWQgY2FtZSBpbiAuTkVUIDMuNSwgYnV0IHdlIHdhbnQgdG8gbGltaXQKKyAgICAgICAgLy8gZGVwZW5kZW5jeSB0byAuTkVUIDIuMC4gIEFFUyBpcyBqdXN0IGEgcmVzdHJpY3RlZCBmb3JtCisgICAgICAgIC8vIG9mIFJpam5kYWVsIChmaXhlZCBibG9jayBzaXplIG9mIDEyOCwgc29tZSBjcnlwdG8gbW9kZXMgbm90IHN1cHBvcnRlZCkuCisKKyAgICAgICAgaW50ZXJuYWwgUmlqbmRhZWxNYW5hZ2VkIF9hZXNDaXBoZXI7CisgICAgICAgIGludGVybmFsIElDcnlwdG9UcmFuc2Zvcm0gX3hmb3JtOworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEJMT0NLX1NJWkVfSU5fQllURVMgPSAxNjsKKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBjb3VudGVyID0gbmV3IGJ5dGVbQkxPQ0tfU0laRV9JTl9CWVRFU107CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGNvdW50ZXJPdXQgPSBuZXcgYnl0ZVtCTE9DS19TSVpFX0lOX0JZVEVTXTsKKworICAgICAgICAvLyBJJ3ZlIGhhZCBhIHByb2JsZW0gd2hlbiB3cmFwcGluZyBhIFdpblppcEFlc0NpcGhlclN0cmVhbSBpbnNpZGUKKyAgICAgICAgLy8gYSBEZWZsYXRlU3RyZWFtLiBDYWxsaW5nIFJlYWQoKSBvbiB0aGUgRGVmbGF0ZVN0cmVhbSByZXN1bHRzIGluCisgICAgICAgIC8vIGEgUmVhZCgpIG9uIHRoZSBXaW5aaXBBZXNDaXBoZXJTdHJlYW0sIGJ1dCB0aGUgYnVmZmVyIGlzIGxhcmdlcgorICAgICAgICAvLyB0aGFuIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBlbmNyeXB0ZWQgZGF0YSwgYW5kIGxhcmdlciB0aGFuIHRoZQorICAgICAgICAvLyBpbml0aWFsIFJlYWQoKSBvbiB0aGUgRGVmbGF0ZVN0cmVhbSEgIFdoZW4gdGhlIGVuY3J5cHRlZAorICAgICAgICAvLyBieXRlc3RyZWFtIGlzIGVtYmVkZGVkIHdpdGhpbiBhIGxhcmdlciBzdHJlYW0gKEFzIGluIGEgemlwCisgICAgICAgIC8vIGFyY2hpdmUpLCB0aGUgUmVhZCgpIGRvZXNuJ3QgZmFpbCB3aXRoIEVPRi4gIFRoaXMgY2F1c2VzIGJhZAorICAgICAgICAvLyBkYXRhIHRvIGJlIHJldHVybmVkLCBhbmQgaXQgbWVzc2VzIHVwIHRoZSBNQUMuCisKKyAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBoYXJkLXN0b3AgdG8gdGhlIHNpemUgb2YKKyAgICAgICAgLy8gZGF0YSB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhlIHN0cmVhbS4gIEluIFJlYWQoKSwgaWYgdGhlIGJ1ZmZlciBvcgorICAgICAgICAvLyByZWFkIHJlcXVlc3QgZ29lcyBiZXlvbmQgdGhlIHN0b3AsIHdlIHRydW5jYXRlIGl0LgorCisgICAgICAgIHByaXZhdGUgbG9uZyBfbGVuZ3RoOworICAgICAgICBwcml2YXRlIGxvbmcgX3RvdGFsQnl0ZXNYZmVycmVkOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBfUGVuZGluZ1dyaXRlQmxvY2s7CisgICAgICAgIHByaXZhdGUgaW50IF9wZW5kaW5nQ291bnQ7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9pb2J1ZjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29uc3RydWN0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icyI+VGhlIHVuZGVybHlpbmcgc3RyZWFtPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2RlIj5UbyBlaXRoZXIgZW5jcnlwdCBvciBkZWNyeXB0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY3J5cHRvUGFyYW1zIj5UaGUgcHJlLWluaXRpYWxpemVkIFdpblppcEFlc0NyeXB0byBvYmplY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW5ndGgiPlRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCBXaW5aaXBBZXNDaXBoZXJTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzLCBXaW5aaXBBZXNDcnlwdG8gY3J5cHRvUGFyYW1zLCBsb25nIGxlbmd0aCwgQ3J5cHRvTW9kZSBtb2RlKQorICAgICAgICAgICAgOiB0aGlzKHMsIGNyeXB0b1BhcmFtcywgbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG9uJ3QgcmVhZCBiZXlvbmQgdGhpcyBsaW1pdCEKKyAgICAgICAgICAgIF9sZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAvL0NvbnNvbGUuV3JpdGVMaW5lKCJtYXggbGVuZ3RoIG9mIEFFUyBzdHJlYW06IHswfSIsIF9sZW5ndGgpOworICAgICAgICB9CisKKworI2lmIFdBTlRfVFJBQ0UKKyAgICAgICAgICAgIFN0cmVhbSB1bnRyYW5zZm9ybWVkOworICAgICAgICBTdHJpbmcgdHJhY2VGaWxlVW50cmFuc2Zvcm1lZDsKKyAgICAgICAgU3RyZWFtIHRyYW5zZm9ybWVkOworICAgICAgICBTdHJpbmcgdHJhY2VGaWxlVHJhbnNmb3JtZWQ7CisjZW5kaWYKKworCisgICAgICAgIGludGVybmFsIFdpblppcEFlc0NpcGhlclN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtIHMsIFdpblppcEFlc0NyeXB0byBjcnlwdG9QYXJhbXMsIENyeXB0b01vZGUgbW9kZSkKKyAgICAgICAgICAgIDogYmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWNlT3V0cHV0KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBUcmFjZU91dHB1dCgiQ3JlYXRlIHswOlg4fSIsIHRoaXMuR2V0SGFzaENvZGUoKSk7CisKKyAgICAgICAgICAgIF9wYXJhbXMgPSBjcnlwdG9QYXJhbXM7CisgICAgICAgICAgICBfcyA9IHM7CisgICAgICAgICAgICBfbW9kZSA9IG1vZGU7CisgICAgICAgICAgICBfbm9uY2UgPSAxOworCisgICAgICAgICAgICBpZiAoX3BhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRQYXNzd29yZEV4Y2VwdGlvbigiU3VwcGx5IGEgcGFzc3dvcmQgdG8gdXNlIEFFUyBlbmNyeXB0aW9uLiIpOworCisgICAgICAgICAgICBpbnQga2V5U2l6ZUluQml0cyA9IF9wYXJhbXMuS2V5Qnl0ZXMuTGVuZ3RoICogODsKKyAgICAgICAgICAgIGlmIChrZXlTaXplSW5CaXRzICE9IDI1NiAmJiBrZXlTaXplSW5CaXRzICE9IDEyOCAmJiBrZXlTaXplSW5CaXRzICE9IDE5MikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJrZXlzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIG9mIGtleSBtdXN0IGJlIDEyOCwgMTkyLCBvciAyNTYiKTsKKworICAgICAgICAgICAgX21hYyA9IG5ldyBITUFDU0hBMShfcGFyYW1zLk1hY0l2KTsKKworICAgICAgICAgICAgX2Flc0NpcGhlciA9IG5ldyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlJpam5kYWVsTWFuYWdlZCgpOworICAgICAgICAgICAgX2Flc0NpcGhlci5CbG9ja1NpemUgPSAxMjg7CisgICAgICAgICAgICBfYWVzQ2lwaGVyLktleVNpemUgPSBrZXlTaXplSW5CaXRzOyAgLy8gMTI4LCAxOTIsIDI1NgorICAgICAgICAgICAgX2Flc0NpcGhlci5Nb2RlID0gQ2lwaGVyTW9kZS5FQ0I7CisgICAgICAgICAgICBfYWVzQ2lwaGVyLlBhZGRpbmcgPSBQYWRkaW5nTW9kZS5Ob25lOworCisgICAgICAgICAgICBieXRlW10gaXYgPSBuZXcgYnl0ZVtCTE9DS19TSVpFX0lOX0JZVEVTXTsgLy8gYWxsIHplcm9lcworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRU5DUllQVE9SLCByZWdhcmRsZXNzIHdoZXRoZXIgZG9pbmcgZGVjcnlwdGlvbiBvciBlbmNyeXB0aW9uLgorICAgICAgICAgICAgLy8gSXQgaXMgcmVmbGV4aXZlLgorICAgICAgICAgICAgX3hmb3JtID0gX2Flc0NpcGhlci5DcmVhdGVFbmNyeXB0b3IoX3BhcmFtcy5LZXlCeXRlcywgaXYpOworCisgICAgICAgICAgICBpZiAoX21vZGUgPT0gQ3J5cHRvTW9kZS5FbmNyeXB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pb2J1ZiA9IG5ldyBieXRlWzIwNDhdOworICAgICAgICAgICAgICAgIF9QZW5kaW5nV3JpdGVCbG9jayA9IG5ldyBieXRlW0JMT0NLX1NJWkVfSU5fQllURVNdOworICAgICAgICAgICAgfQorCisKKyNpZiBXQU5UX1RSQUNFCisgICAgICAgICAgICAgICAgdHJhY2VGaWxlVW50cmFuc2Zvcm1lZCA9ICJ1bnBhY2tcXFdpblppcEFlc0NpcGhlclN0cmVhbS50cmFjZS51bnRyYW5zZm9ybWVkLm91dCI7CisgICAgICAgICAgICB0cmFjZUZpbGVUcmFuc2Zvcm1lZCA9ICJ1bnBhY2tcXFdpblppcEFlc0NpcGhlclN0cmVhbS50cmFjZS50cmFuc2Zvcm1lZC5vdXQiOworCisgICAgICAgICAgICB1bnRyYW5zZm9ybWVkID0gU3lzdGVtLklPLkZpbGUuQ3JlYXRlKHRyYWNlRmlsZVVudHJhbnNmb3JtZWQpOworICAgICAgICAgICAgdHJhbnNmb3JtZWQgPSBTeXN0ZW0uSU8uRmlsZS5DcmVhdGUodHJhY2VGaWxlVHJhbnNmb3JtZWQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgWG9ySW5QbGFjZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSAoYnl0ZSkoY291bnRlck91dFtpXSBeIGJ1ZmZlcltvZmZzZXQgKyBpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVUcmFuc2Zvcm1PbmVCbG9jayhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoX25vbmNlKyspLCAwLCBjb3VudGVyLCAwLCA0KTsKKyAgICAgICAgICAgIF94Zm9ybS5UcmFuc2Zvcm1CbG9jayhjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU0laRV9JTl9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgWG9ySW5QbGFjZShidWZmZXIsIG9mZnNldCwgQkxPQ0tfU0laRV9JTl9CWVRFUyk7CisgICAgICAgICAgICBfbWFjLlRyYW5zZm9ybUJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBCTE9DS19TSVpFX0lOX0JZVEVTLCBudWxsLCAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVHJhbnNmb3JtQmxvY2tzKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvc24gPSBvZmZzZXQ7CisgICAgICAgICAgICBpbnQgbGFzdCA9IGNvdW50ICsgb2Zmc2V0OworCisgICAgICAgICAgICB3aGlsZSAocG9zbiA8IGJ1ZmZlci5MZW5ndGggJiYgcG9zbiA8IGxhc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVUcmFuc2Zvcm1PbmVCbG9jayAoYnVmZmVyLCBwb3NuKTsKKyAgICAgICAgICAgICAgICBwb3NuICs9IEJMT0NLX1NJWkVfSU5fQllURVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVRyYW5zZm9ybUZpbmFsQmxvY2soKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3BlbmRpbmdDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJObyBieXRlcyBhdmFpbGFibGUuIik7CisKKyAgICAgICAgICAgIGlmIChfZmluYWxCbG9jaykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGZpbmFsIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNmb3JtZWQuIik7CisKKyAgICAgICAgICAgIFN5c3RlbS5BcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyhfbm9uY2UrKyksIDAsIGNvdW50ZXIsIDAsIDQpOworICAgICAgICAgICAgY291bnRlck91dCA9IF94Zm9ybS5UcmFuc2Zvcm1GaW5hbEJsb2NrKGNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TSVpFX0lOX0JZVEVTKTsKKyAgICAgICAgICAgIFhvckluUGxhY2UoX1BlbmRpbmdXcml0ZUJsb2NrLCAwLCBfcGVuZGluZ0NvdW50KTsKKyAgICAgICAgICAgIF9tYWMuVHJhbnNmb3JtRmluYWxCbG9jayhfUGVuZGluZ1dyaXRlQmxvY2ssIDAsIF9wZW5kaW5nQ291bnQpOworICAgICAgICAgICAgX2ZpbmFsQmxvY2sgPSB0cnVlOworICAgICAgICB9CisKKworCisKKworICAgICAgICBwcml2YXRlIGludCBSZWFkVHJhbnNmb3JtT25lQmxvY2soYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxhc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZmluYWxCbG9jaykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIGludCBieXRlc1JlbWFpbmluZyA9IGxhc3QgLSBvZmZzZXQ7CisgICAgICAgICAgICBpbnQgYnl0ZXNUb1JlYWQgPSAoYnl0ZXNSZW1haW5pbmcgPiBCTE9DS19TSVpFX0lOX0JZVEVTKQorICAgICAgICAgICAgICAgID8gQkxPQ0tfU0laRV9JTl9CWVRFUworICAgICAgICAgICAgICAgIDogYnl0ZXNSZW1haW5pbmc7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY291bnRlcgorICAgICAgICAgICAgU3lzdGVtLkFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKF9ub25jZSsrKSwgMCwgY291bnRlciwgMCwgNCk7CisKKyAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBmaW5hbCBibG9jaworICAgICAgICAgICAgaWYgKChieXRlc1RvUmVhZCA9PSBieXRlc1JlbWFpbmluZykgJiYKKyAgICAgICAgICAgICAgICAoX2xlbmd0aCA+IDApICYmCisgICAgICAgICAgICAgICAgKF90b3RhbEJ5dGVzWGZlcnJlZCArIGxhc3QgPT0gX2xlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX21hYy5UcmFuc2Zvcm1GaW5hbEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICAgICAgY291bnRlck91dCA9IF94Zm9ybS5UcmFuc2Zvcm1GaW5hbEJsb2NrKGNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NJWkVfSU5fQllURVMpOworICAgICAgICAgICAgICAgIF9maW5hbEJsb2NrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWFjLlRyYW5zZm9ybUJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCwgbnVsbCwgMCk7CisgICAgICAgICAgICAgICAgX3hmb3JtLlRyYW5zZm9ybUJsb2NrKGNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TSVpFX0lOX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIG9mZnNldAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBYb3JJblBsYWNlKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNUb1JlYWQ7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRUcmFuc2Zvcm1CbG9ja3MoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zbiA9IG9mZnNldDsKKyAgICAgICAgICAgIGludCBsYXN0ID0gY291bnQgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIHdoaWxlIChwb3NuIDwgYnVmZmVyLkxlbmd0aCAmJiBwb3NuIDwgbGFzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG4gPSBSZWFkVHJhbnNmb3JtT25lQmxvY2sgKGJ1ZmZlciwgcG9zbiwgbGFzdCk7CisgICAgICAgICAgICAgICAgcG9zbiArPSBuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbW9kZSA9PSBDcnlwdG9Nb2RlLkVuY3J5cHQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmZmVyIik7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIm9mZnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBub3QgYmUgbGVzcyB0aGFuIHplcm8uIik7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IG5vdCBiZSBsZXNzIHRoYW4gemVyby4iKTsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlci5MZW5ndGggPCBvZmZzZXQgKyBjb3VudCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRoZSBidWZmZXIgaXMgdG9vIHNtYWxsIik7CisKKyAgICAgICAgICAgIC8vIFdoZW4gSSB3cmFwIGEgV2luWmlwQWVzU3RyZWFtIGluIGEgRGVmbGF0ZVN0cmVhbSwgdGhlCisgICAgICAgICAgICAvLyBEZWZsYXRlU3RyZWFtIGFza3MgaXRzIGNhcHRpdmUgdG8gcmVhZCA0ayBibG9ja3MsIGV2ZW4gaWYgdGhlCisgICAgICAgICAgICAvLyBlbmNyeXB0ZWQgYnl0ZXN0cmVhbSBpcyBzbWFsbGVyIHRoYW4gdGhhdC4gIFRoaXMgaXMgYSB3YXkgdG8KKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKworICAgICAgICAgICAgaW50IGJ5dGVzVG9SZWFkID0gY291bnQ7CisKKyAgICAgICAgICAgIGlmIChfdG90YWxCeXRlc1hmZXJyZWQgPj0gX2xlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gRU9GCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgYnl0ZXNSZW1haW5pbmcgPSBfbGVuZ3RoIC0gX3RvdGFsQnl0ZXNYZmVycmVkOworICAgICAgICAgICAgaWYgKGJ5dGVzUmVtYWluaW5nIDwgY291bnQpIGJ5dGVzVG9SZWFkID0gKGludClieXRlc1JlbWFpbmluZzsKKworICAgICAgICAgICAgaW50IG4gPSBfcy5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCk7CisKKworI2lmIFdBTlRfVFJBQ0UKKyAgICAgICAgICAgICAgICB1bnRyYW5zZm9ybWVkLldyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCk7CisjZW5kaWYKKworICAgICAgICAgICAgUmVhZFRyYW5zZm9ybUJsb2NrcyhidWZmZXIsIG9mZnNldCwgYnl0ZXNUb1JlYWQpOworCisjaWYgV0FOVF9UUkFDRQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkLldyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBieXRlc1RvUmVhZCk7CisjZW5kaWYKKyAgICAgICAgICAgIF90b3RhbEJ5dGVzWGZlcnJlZCArPSBuOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgZmluYWwgSE1BQy1TSEExLTgwIGZvciB0aGUgZGF0YSB0aGF0IHdhcyBlbmNyeXB0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBieXRlW10gRmluYWxBdXRoZW50aWNhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9maW5hbEJsb2NrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbC1jYXNlIHplcm8tYnl0ZSBmaWxlcworICAgICAgICAgICAgICAgICAgICBpZiAoIF90b3RhbEJ5dGVzWGZlcnJlZCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFN0YXRlRXhjZXB0aW9uKCJUaGUgZmluYWwgaGFzaCBoYXMgbm90IGJlZW4gY29tcHV0ZWQuIik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBjYWxsIENvbXB1dGVIYXNoIG9uIGFuIGVtcHR5IGJ5dGUgYXJyYXkgd2hlbiBubyBkYXRhCisgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBydW4gdGhyb3VnaCB0aGUgTUFDLgorCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0geyAgfTsKKyAgICAgICAgICAgICAgICAgICAgX21hYy5Db21wdXRlSGFzaChiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVbXSBtYWNCeXRlczEwID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgICAgIFN5c3RlbS5BcnJheS5Db3B5KF9tYWMuSGFzaCwgMCwgbWFjQnl0ZXMxMCwgMCwgMTApOworICAgICAgICAgICAgICAgIHJldHVybiBtYWNCeXRlczEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZmluYWxCbG9jaykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGZpbmFsIGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNmb3JtZWQuIik7CisKKyAgICAgICAgICAgIGlmIChfbW9kZSA9PSBDcnlwdG9Nb2RlLkRlY3J5cHQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmZmVyIik7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIm9mZnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBub3QgYmUgbGVzcyB0aGFuIHplcm8uIik7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IG5vdCBiZSBsZXNzIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuTGVuZ3RoIDwgb2Zmc2V0ICsgY291bnQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgdG9vIGxhcmdlIik7CisKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgVHJhY2VPdXRwdXQoIldyaXRlIG9mZih7MH0pIGNvdW50KHsxfSkiLCBvZmZzZXQsIGNvdW50KTsKKworI2lmIFdBTlRfVFJBQ0UKKyAgICAgICAgICAgIHVudHJhbnNmb3JtZWQuV3JpdGUoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBGb3IgcHJvcGVyIEFFUyBlbmNyeXB0aW9uLCBhbiBBRVMgZW5jcnlwdG9yIGFwcGxpY2F0aW9uIGNhbGxzCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm1CbG9jayByZXBlYXRlZGx5IGZvciBhbGwgMTYtYnl0ZSBibG9ja3MgZXhjZXB0IHRoZQorICAgICAgICAgICAgLy8gbGFzdC4gRm9yIHRoZSBsYXN0IGJsb2NrLCBpdCB0aGVuIGNhbGxzIFRyYW5zZm9ybUZpbmFsQmxvY2soKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGNsYXNzIGlzIGEgc3RyZWFtIHRoYXQgZW5jcnlwdHMgdmlhIFdyaXRlKCkuICBCdXQsIGl0J3Mgbm90CisgICAgICAgICAgICAvLyBwb3NzaWJsZSB0byByZWNvZ25pemUgd2hpY2ggYXJlIHRoZSAibGFzdCIgYnl0ZXMgZnJvbSB3aXRoaW4gdGhlIGNhbGwKKyAgICAgICAgICAgIC8vIHRvIFdyaXRlKCkuIFRoZSBjYWxsZXIgY2FuIGNhbGwgV3JpdGUoKSBzZXZlcmFsIHRpbWVzIGluIHN1Y2Nlc3Npb24sCisgICAgICAgICAgICAvLyB3aXRoIHZhcnlpbmcgYnVmZmVycy4gVGhpcyBjbGFzcyBvbmx5ICJrbm93cyIgdGhhdCB0aGUgbGFzdCBieXRlcworICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHdyaXR0ZW4gd2hlbiB0aGUgYXBwIGNhbGxzIENsb3NlKCkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0aGlzIGNsYXNzIGJ1ZmZlcnMgd3JpdGVzOiBBZnRlciBjb21wbGV0aW9uIGV2ZXJ5IFdyaXRlKCksCisgICAgICAgICAgICAvLyBhIDE2LWJ5dGUgInBlbmRpbmciIGJsb2NrIChfUGVuZGluZ1dyaXRlQmxvY2spIG11c3QgaG9sZCBiZXR3ZWVuIDEKKyAgICAgICAgICAgIC8vIGFuZCAxNiBieXRlcywgd2hpY2ggd2lsbCBiZSB1c2VkIGluIFRyYW5zZm9ybUZpbmFsQmxvY2sgaWYgdGhlIGFwcAorICAgICAgICAgICAgLy8gY2FsbHMgQ2xvc2UoKSBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLiBBbHNvLCBldmVyeSB3cml0ZSBtdXN0CisgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gYW55IHBlbmRpbmcgYnl0ZXMsIGJlZm9yZSB0cmFuc2Zvcm1pbmcgdGhlIGRhdGEgcGFzc2VkIGluCisgICAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjYWxsLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEluIG9wZXJhdGlvbiwgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gV3JpdGUoKSBhbmQgYmVmb3JlIHRoZSBjYWxsIHRvCisgICAgICAgICAgICAvLyBDbG9zZSgpLCBvbmUgZnVsbCBvciBwYXJ0aWFsIGJsb2NrIG9mIGJ5dGVzIGlzIGFsd2F5cyBhdmFpbGFibGUsCisgICAgICAgICAgICAvLyBwZW5kaW5nLiAgQXQgdGltZSBvZiBDbG9zZSgpLCB0aGlzIGNsYXNzIGNhbGxzCisgICAgICAgICAgICAvLyBXcml0ZVRyYW5zZm9ybUZpbmFsQmxvY2soKSB0byBmbHVzaCB0aGUgcGVuZGluZyBieXRlcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIHdoZXRoZXIgdGhlIGNhbGxlciB3cml0ZXMgaW4gb2RkLXNpemVkIGJhdGNoZXMsCisgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSA1MDAwIGJ5dGVzLCBvciBpbiBiYXRjaGVzIHRoYXQgYXJlIG5lYXQgbXVsdGlwbGVzIG9mIHRoZQorICAgICAgICAgICAgLy8gYmxvY2tzaXplICgxNikuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTG9naWNhbHksIHdoYXQgd2UgZG8gaXMgdGhpczoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgMS4gaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gMTYgYnl0ZXMgKHBlbmRpbmcgKyBjdXJyZW50KSwgdGhlbgorICAgICAgICAgICAgLy8gICAgIGp1c3QgY29weSB0aGVtIGludG8gdGggcGVuZGluZyBidWZmZXIgYW5kIHJldHVybi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgMi4gdGhlcmUgYXJlIG1vcmUgdGhhbiAxNiBieXRlcyB0byB3cml0ZS4gU28sIHRha2UgdGhlIGxlYWRpbmcgc2xpY2UKKyAgICAgICAgICAgIC8vICAgICBvZiBieXRlcyBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciwgZW5vdWdoIHRvIGZpbGwgdGhlIHBlbmRpbmcKKyAgICAgICAgICAgIC8vICAgICBidWZmZXIuIFRyYW5zZm9ybSB0aGUgcGVuZGluZyBibG9jaywgYW5kIHdyaXRlIGl0IG91dC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgMy4gVGFrZSB0aGUgdHJhaWxpbmcgc2xpY2Ugb2YgYnl0ZXMgKGEgZnVsbCBibG9jayBvciBhIHBhcnRpYWwgYmxvY2spLAorICAgICAgICAgICAgLy8gICAgIGFuZCBjb3B5IGl0IHRvIHRoZSBwZW5kaW5nIGJsb2NrIGZvciBuZXh0IHRpbWUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gIDQuIHRyYW5zZm9ybSBhbmQgd3JpdGUgYWxsIHRoZSBvdGhlciBibG9ja3MsIHRoZSBtaWRkbGUgc2xpY2UuCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgMTYgb3IgZmV3ZXIgYnl0ZXMsIHNvIGp1c3QgYnVmZmVyIHRoZSBieXRlcy4KKyAgICAgICAgICAgIGlmIChjb3VudCArIF9wZW5kaW5nQ291bnQgPD0gQkxPQ0tfU0laRV9JTl9CWVRFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QZW5kaW5nV3JpdGVCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wZW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgICAgICAgICAgICAgX3BlbmRpbmdDb3VudCArPSBjb3VudDsKKworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIF9QZW5kaW5nV3JpdGVCbG9jayBjb250YWlucyB1cCB0bworICAgICAgICAgICAgICAgIC8vIEJMT0NLX1NJWkVfSU5fQllURVMgYnl0ZXMsIGFuZCBfcGVuZGluZ0NvdW50IHJhbmdlcyBmcm9tIDAgdG8KKyAgICAgICAgICAgICAgICAvLyBCTE9DS19TSVpFX0lOX0JZVEVTLiBXZSBkb24ndCB3YW50IHRvIHhmb3JtK3dyaXRlIHRoZW0geWV0LAorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcyBtYXkgaGF2ZSBiZWVuIHRoZSBsYXN0IGJsb2NrLiAgVGhlIGxhc3QgYmxvY2sgZ2V0cworICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gYXQgQ2xvc2UoKS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlcmUgYXJlIGF0IGxlYXN0IDE3IGJ5dGVzLCBjb3VudGluZyB0aG9zZSBpbiB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gYnVmZmVyLCBhbG9uZyB3aXRoIHRoZSAocG9zc2libHkgZW1wdHkpIHBlbmRpbmcgYmxvY2suCisKKyAgICAgICAgICAgIGludCBieXRlc1JlbWFpbmluZyA9IGNvdW50OworICAgICAgICAgICAgaW50IGN1ck9mZnNldCA9IG9mZnNldDsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTI4MTUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyB4Zm9ybSBjaHVua3dpc2UgLi4uIENhbm5vdCB0cmFuc2Zvcm0gaW4gcGxhY2UgdXNpbmcgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAvLyBidWZmZXIgYmVjYXVzZSB0aGF0IGlzIHVzZXItbWFpbnRhaW5lZC4KKworICAgICAgICAgICAgaWYgKF9wZW5kaW5nQ291bnQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG1vcmUgdGhhbiBvbmUgYmxvY2sgb2YgZGF0YSB0byB3cml0ZSwgdGhlcmVmb3JlIGl0IGlzIHNhZmUKKyAgICAgICAgICAgICAgICAvLyB0byB4Zm9ybSt3cml0ZS4KKyAgICAgICAgICAgICAgICBpbnQgZmlsbENvdW50ID0gQkxPQ0tfU0laRV9JTl9CWVRFUyAtIF9wZW5kaW5nQ291bnQ7CisKKyAgICAgICAgICAgICAgICAvLyBmaWxsQ291bnQgaXMgcG9zc2libHkgemVybyBoZXJlLiBUaGF0IGhhcHBlbnMgd2hlbiB0aGUgcGVuZGluZworICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBoZWxkIDE2IGJ5dGVzIChvbmUgY29tcGxldGUgYmxvY2spIGJlZm9yZSB0aGlzIGNhbGwgdG8KKyAgICAgICAgICAgICAgICAvLyBXcml0ZS4KKyAgICAgICAgICAgICAgICBpZiAoZmlsbENvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUGVuZGluZ1dyaXRlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BlbmRpbmdDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsQ291bnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCBjb3VudHM6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVtYWluaW5nIC09IGZpbGxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgY3VyT2Zmc2V0ICs9IGZpbGxDb3VudDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB4Zm9ybSBhbmQgd3JpdGU6CisgICAgICAgICAgICAgICAgV3JpdGVUcmFuc2Zvcm1PbmVCbG9jayhfUGVuZGluZ1dyaXRlQmxvY2ssIDApOworICAgICAgICAgICAgICAgIF9zLldyaXRlKF9QZW5kaW5nV3JpdGVCbG9jaywgMCwgQkxPQ0tfU0laRV9JTl9CWVRFUyk7CisgICAgICAgICAgICAgICAgX3RvdGFsQnl0ZXNYZmVycmVkICs9IEJMT0NLX1NJWkVfSU5fQllURVM7CisgICAgICAgICAgICAgICAgX3BlbmRpbmdDb3VudCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgX1BlbmRpbmdXcml0ZUJsb2NrIGlzIGVtcHR5LCBhbmQgYnl0ZXNSZW1haW5pbmcgaXMKKyAgICAgICAgICAgIC8vIGFsd2F5cyBncmVhdGVyIHRoYW4gMC4KKworICAgICAgICAgICAgLy8gTm93LCB4Zm9ybSBOIGJsb2Nrcywgd2hlcmUgTiA9IGZsb29yKChieXRlc1JlbWFpbmluZy0xKS8xNikuICBJZgorICAgICAgICAgICAgLy8gd3JpdGluZyAzMiBieXRlcywgdGhlbiB4Zm9ybSAxIGJsb2NrLCBhbmQgc3RhZ2UgdGhlIHJlbWFpbmluZyAxNi4gIElmCisgICAgICAgICAgICAvLyB3cml0aW5nIDEwMDM3IGJ5dGVzLCB4Zm9ybSA2MjcgYmxvY2tzIG9mIDE2IGJ5dGVzLCB0aGVuIHN0YWdlIHRoZQorICAgICAgICAgICAgLy8gcmVtYWluaW5nIDUgYnl0ZXMuCisKKyAgICAgICAgICAgIGludCBibG9ja3NUb1hmb3JtID0gKGJ5dGVzUmVtYWluaW5nLTEpL0JMT0NLX1NJWkVfSU5fQllURVM7CisgICAgICAgICAgICBfcGVuZGluZ0NvdW50ID0gYnl0ZXNSZW1haW5pbmcgLSAoYmxvY2tzVG9YZm9ybSAqIEJMT0NLX1NJWkVfSU5fQllURVMpOworCisgICAgICAgICAgICAvLyBfcGVuZGluZ0NvdW50IGlzIEFMV0FZUyBiZXR3ZWVuIDEgYW5kIDE2LgorICAgICAgICAgICAgLy8gUHV0IHRoZSBsYXN0IF9wZW5kaW5nQ291bnQgYnl0ZXMgaW50byB0aGUgcGVuZGluZyBibG9jay4KKyAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJPZmZzZXQgKyBieXRlc1JlbWFpbmluZyAtIF9wZW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QZW5kaW5nV3JpdGVCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BlbmRpbmdDb3VudCk7CisgICAgICAgICAgICBieXRlc1JlbWFpbmluZyAtPSBfcGVuZGluZ0NvdW50OworICAgICAgICAgICAgX3RvdGFsQnl0ZXNYZmVycmVkICs9IGJ5dGVzUmVtYWluaW5nOyAvLyB3aWxsIGJlIHRydWUgYWZ0ZXIgdGhlIGxvb3AKKworICAgICAgICAgICAgLy8gbm93LCB0cmFuc2Zvcm0gYWxsIHRoZSBmdWxsIGJsb2NrcyBwcmVjZWRpbmcgdGhhdC4KKyAgICAgICAgICAgIC8vIGJ5dGVzUmVtYWluaW5nIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDE2IC4KKyAgICAgICAgICAgIGlmIChibG9ja3NUb1hmb3JtID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGMgPSBfaW9idWYuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+IGJ5dGVzUmVtYWluaW5nKSBjID0gYnl0ZXNSZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKKworICAgICAgICAgICAgICAgICAgICBXcml0ZVRyYW5zZm9ybUJsb2NrcyhfaW9idWYsIDAsIGMpOworICAgICAgICAgICAgICAgICAgICBfcy5Xcml0ZShfaW9idWYsIDAsIGMpOworICAgICAgICAgICAgICAgICAgICBieXRlc1JlbWFpbmluZyAtPSBjOworICAgICAgICAgICAgICAgICAgICBjdXJPZmZzZXQgKz0gYzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlKGJ5dGVzUmVtYWluaW5nID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDbG9zZSB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWNlT3V0cHV0KCJDbG9zZSB7MDpYOH0iLCB0aGlzLkdldEhhc2hDb2RlKCkpOworCisgICAgICAgICAgICAvLyBJbiB0aGUgZGVnZW5lcmF0ZSBjYXNlLCBubyBieXRlcyBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUKKyAgICAgICAgICAgIC8vIHN0cmVhbSBhdCBhbGwuICBOZWVkIHRvIGNoZWNrIGhlcmUsIGFuZCBOT1QgZW1pdCB0aGUKKyAgICAgICAgICAgIC8vIGZpbmFsIGJsb2NrIGlmIFdyaXRlIGhhcyBub3QgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICBpZiAoX3BlbmRpbmdDb3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVUcmFuc2Zvcm1GaW5hbEJsb2NrKCk7CisgICAgICAgICAgICAgICAgX3MuV3JpdGUoX1BlbmRpbmdXcml0ZUJsb2NrLCAwLCBfcGVuZGluZ0NvdW50KTsKKyAgICAgICAgICAgICAgICBfdG90YWxCeXRlc1hmZXJyZWQgKz0gX3BlbmRpbmdDb3VudDsKKyAgICAgICAgICAgICAgICBfcGVuZGluZ0NvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9zLkNsb3NlKCk7CisKKyNpZiBXQU5UX1RSQUNFCisgICAgICAgICAgICB1bnRyYW5zZm9ybWVkLkNsb3NlKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1lZC5DbG9zZSgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlxudW50cmFuc2Zvcm1lZCBieXRlc3RyZWFtIGlzIGluICB7MH0iLCB0cmFjZUZpbGVVbnRyYW5zZm9ybWVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJcbnRyYW5zZm9ybWVkIGJ5dGVzdHJlYW0gaXMgaW4gIHswfSIsIHRyYWNlRmlsZVRyYW5zZm9ybWVkKTsKKyNlbmRpZgorICAgICAgICAgICAgVHJhY2VPdXRwdXQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY2FuIGJlIHJlYWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9tb2RlICE9IENyeXB0b01vZGUuRGVjcnlwdCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlaworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ3J5cHRvTW9kZSBpcyBFbmNyeXB0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKF9tb2RlID09IENyeXB0b01vZGUuRW5jcnlwdCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZsdXNoIHRoZSBjb250ZW50IGluIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3MuRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHRpbmcgdGhpcyBwcm9wZXJ0eSB0aHJvd3MgYSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXR0aW5nIG9yIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0aHJvd3MgYSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUG9zaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgICAgIHNldCB7IHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCB0aHJvd3MgYSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU3lzdGVtLklPLlNlZWtPcmlnaW4gb3JpZ2luKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIHRocm93cyBhIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgW1N5c3RlbS5EaWFnbm9zdGljcy5Db25kaXRpb25hbEF0dHJpYnV0ZSgiVHJhY2UiKV0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRyYWNlT3V0cHV0KHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSB2YXJQYXJhbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2soX291dHB1dExvY2spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHRpZCA9IFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLkN1cnJlbnRUaHJlYWQuR2V0SGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkZvcmVncm91bmRDb2xvciA9IChDb25zb2xlQ29sb3IpICh0aWQgJSA4ICsgOCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiezA6MDAwfSBXWkFDUyAiLCB0aWQpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZvcm1hdCwgdmFyUGFyYW1zKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlc2V0Q29sb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgb2JqZWN0IF9vdXRwdXRMb2NrID0gbmV3IE9iamVjdCgpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwQ29uc3RhbnRzLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwQ29uc3RhbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTJhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBDb25zdGFudHMuY3MKQEAgLTAsMCArMSw1MSBAQAorLy8gWmlwQ29uc3RhbnRzLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRGlubyBDaGllc2EgYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4gCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOiAKKy8vIFRpbWUtc3RhbXA6IDwyMDA5LUF1Z3VzdC0yNyAyMzoyMjozMj4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgZmV3IGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIGluIHRoZSBwcm9qZWN0LiAKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisgIHN0YXRpYyBjbGFzcyBaaXBDb25zdGFudHMKKyAgeyAgICAgIAorICAgIHB1YmxpYyBjb25zdCBVSW50MzIgUGFja2VkVG9SZW1vdmFibGVNZWRpYSA9IDB4MzAzMDRiNTA7CisgICAgcHVibGljIGNvbnN0IFVJbnQzMiBaaXA2NEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZFNpZ25hdHVyZSA9IDB4MDYwNjRiNTA7CisgICAgcHVibGljIGNvbnN0IFVJbnQzMiBaaXA2NEVuZE9mQ2VudHJhbERpcmVjdG9yeUxvY2F0b3JTaWduYXR1cmUgPSAweDA3MDY0YjUwOworICAgIHB1YmxpYyBjb25zdCBVSW50MzIgRW5kT2ZDZW50cmFsRGlyZWN0b3J5U2lnbmF0dXJlID0gMHgwNjA1NGI1MDsKKyAgICBwdWJsaWMgY29uc3QgaW50IFppcEVudHJ5U2lnbmF0dXJlICAgICAgICAgICAgICAgICA9IDB4MDQwMzRiNTA7CisgICAgcHVibGljIGNvbnN0IGludCBaaXBFbnRyeURhdGFEZXNjcmlwdG9yU2lnbmF0dXJlICAgPSAweDA4MDc0YjUwOworICAgIHB1YmxpYyBjb25zdCBpbnQgU3BsaXRBcmNoaXZlU2lnbmF0dXJlICAgICAgICAgICAgID0gMHgwODA3NGI1MDsKKyAgICBwdWJsaWMgY29uc3QgaW50IFppcERpckVudHJ5U2lnbmF0dXJlICAgICAgICAgICAgICA9IDB4MDIwMTRiNTA7CisKKyAgICAgIAorICAgIC8vIFRoZXNlIGFyZSBkaWN0YXRlZCBieSB0aGUgWmlwIFNwZWMuU2VlIEFQUE5PVEUudHh0CisgICAgcHVibGljIGNvbnN0IGludCBBZXNLZXlTaXplID0gMTkyOyAgLy8gMTI4LCAxOTIsIDI1NgorICAgIHB1YmxpYyBjb25zdCBpbnQgQWVzQmxvY2tTaXplID0gMTI4OyAgLy8gPz8/CisKKyAgICBwdWJsaWMgY29uc3QgVUludDE2IEFlc0FsZ0lkMTI4ID0gMHg2NjBFOyAKKyAgICBwdWJsaWMgY29uc3QgVUludDE2IEFlc0FsZ0lkMTkyID0gMHg2NjBGOyAKKyAgICBwdWJsaWMgY29uc3QgVUludDE2IEFlc0FsZ0lkMjU2ID0gMHg2NjEwOyAKKworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBDcnlwdG8uY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBDcnlwdG8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3ZjYyNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcENyeXB0by5jcwpAQCAtMCwwICsxLDQ1NSBAQAorLy8gWmlwQ3J5cHRvLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIDIwMTEgRGlubyBDaGllc2EKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtSnVseS0yOCAwNjozMDo1OT4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yICJ0cmFkaXRpb25hbCIgWmlwIGVuY3J5cHRpb24uCisvLworLy8gQ3JlYXRlZCBUdWUgQXByIDE1IDE3OjM5OjU2IDIwMDgKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgInRyYWRpdGlvbmFsIiBvciAiY2xhc3NpYyIgUEtaaXAgZW5jcnlwdGlvbiwKKyAgICAvLy8gICB3aGljaCB0b2RheSBpcyBjb25zaWRlcmVkIHRvIGJlIHdlYWsuIE9uIHRoZSBvdGhlciBoYW5kIGl0IGlzCisgICAgLy8vICAgdWJpcXVpdG91cy4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgdGhlIERvdE5ldFppcAorICAgIC8vLyAgIGxpYnJhcnkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vICAgTW9zdCB1c2VzIG9mIHRoZSBEb3ROZXRaaXAgbGlicmFyeSB3aWxsIG5vdCBpbnZvbHZlIGRpcmVjdCBjYWxscyBpbnRvCisgICAgLy8vICAgdGhlIFppcENyeXB0byBjbGFzcy4gIEluc3RlYWQsIHRoZSBaaXBDcnlwdG8gY2xhc3MgaXMgaW5zdGFudGlhdGVkIGFuZAorICAgIC8vLyAgIHVzZWQgYnkgdGhlIFppcEVudHJ5KCkgY2xhc3Mgd2hlbiBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gb24gYW4gZW50cnkKKyAgICAvLy8gICBpcyBlbXBsb3llZC4gIElmIGZvciBzb21lIHJlYXNvbiB5b3UgcmVhbGx5IHdhbnRlZCB0byB1c2UgYSB3ZWFrCisgICAgLy8vICAgZW5jcnlwdGlvbiBhbGdvcml0aG0gaW4gc29tZSBvdGhlciBhcHBsaWNhdGlvbiwgeW91IG1pZ2h0IHVzZSB0aGlzCisgICAgLy8vICAgbGlicmFyeS4gIEJ1dCB5b3Ugd291bGQgYmUgbXVjaCBiZXR0ZXIgb2ZmIHVzaW5nIG9uZSBvZiB0aGUgYnVpbHQtaW4KKyAgICAvLy8gICBzdHJvbmcgZW5jcnlwdGlvbiBsaWJyYXJpZXMgaW4gdGhlIC5ORVQgRnJhbWV3b3JrLCBsaWtlIHRoZSBBRVMKKyAgICAvLy8gICBhbGdvcml0aG0gb3IgU0hBLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgaW50ZXJuYWwgY2xhc3MgWmlwQ3J5cHRvCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBaaXBDcnlwdG8uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBieSB0aGUgbGlicmFyeSBvbmx5LiBJdCdzCisgICAgICAgIC8vLyAgIHByb2JhYmx5IG5vdCB1c2VmdWwgdG8geW91LiBTZXJpb3VzbHkuICBTdG9wIHJlYWRpbmcgdGhpcworICAgICAgICAvLy8gICBkb2N1bWVudGF0aW9uLiAgSXQncyBhIHdhc3RlIG9mIHlvdXIgdGltZS4gIEdvIGRvIHNvbWV0aGluZyBlbHNlLgorICAgICAgICAvLy8gICBDaGVjayB0aGUgZm9vdGJhbGwgc2NvcmVzLiBHbyBnZXQgYW4gaWNlIGNyZWFtIHdpdGggYSBmcmllbmQuCisgICAgICAgIC8vLyAgIFNlcmlvdXNseS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIHByaXZhdGUgWmlwQ3J5cHRvKCkgeyB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBaaXBDcnlwdG8gRm9yV3JpdGUoc3RyaW5nIHBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICBaaXBDcnlwdG8geiA9IG5ldyBaaXBDcnlwdG8oKTsKKyAgICAgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRQYXNzd29yZEV4Y2VwdGlvbigiVGhpcyBlbnRyeSByZXF1aXJlcyBhIHBhc3N3b3JkLiIpOworICAgICAgICAgICAgei5Jbml0Q2lwaGVyKHBhc3N3b3JkKTsKKyAgICAgICAgICAgIHJldHVybiB6OworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIFppcENyeXB0byBGb3JSZWFkKHN0cmluZyBwYXNzd29yZCwgWmlwRW50cnkgZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLklPLlN0cmVhbSBzID0gZS5fYXJjaGl2ZVN0cmVhbTsKKyAgICAgICAgICAgIGUuX1dlYWtFbmNyeXB0aW9uSGVhZGVyID0gbmV3IGJ5dGVbMTJdOworICAgICAgICAgICAgYnl0ZVtdIGVoID0gZS5fV2Vha0VuY3J5cHRpb25IZWFkZXI7CisgICAgICAgICAgICBaaXBDcnlwdG8geiA9IG5ldyBaaXBDcnlwdG8oKTsKKworICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFBhc3N3b3JkRXhjZXB0aW9uKCJUaGlzIGVudHJ5IHJlcXVpcmVzIGEgcGFzc3dvcmQuIik7CisKKyAgICAgICAgICAgIHouSW5pdENpcGhlcihwYXNzd29yZCk7CisKKyAgICAgICAgICAgIFppcEVudHJ5LlJlYWRXZWFrRW5jcnlwdGlvbkhlYWRlcihzLCBlaCk7CisKKyAgICAgICAgICAgIC8vIERlY3J5cHQgdGhlIGhlYWRlci4gIFRoaXMgaGFzIGEgc2lkZSBlZmZlY3Qgb2YgImZ1cnRoZXIgaW5pdGlhbGl6aW5nIHRoZQorICAgICAgICAgICAgLy8gZW5jcnlwdGlvbiBrZXlzIiBpbiB0aGUgdHJhZGl0aW9uYWwgemlwIGVuY3J5cHRpb24uCisgICAgICAgICAgICBieXRlW10gRGVjcnlwdGVkSGVhZGVyID0gei5EZWNyeXB0TWVzc2FnZShlaCwgZWguTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gQ1JDIGNoZWNrCisgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHBremlwIHNwZWMsIHRoZSBmaW5hbCBieXRlIGluIHRoZSBkZWNyeXB0ZWQgaGVhZGVyCisgICAgICAgICAgICAvLyBpcyB0aGUgaGlnaGVzdC1vcmRlciBieXRlIGluIHRoZSBDUkMuIFdlIGNoZWNrIGl0IGhlcmUuCisgICAgICAgICAgICBpZiAoRGVjcnlwdGVkSGVhZGVyWzExXSAhPSAoYnl0ZSkoKGUuX0NyYzMyID4+IDI0KSAmIDB4ZmYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgYml0IDMgb2YgdGhlIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyBpcyBzZXQgdG8KKyAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgYW4gJ0V4dGVuZGVkIEZpbGUgSGVhZGVyJyBvciBhICdkYXRhCisgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcicgKHNpZ25hdHVyZSAweDA4MDc0YjUwKSwgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZGVjcnlwdGVkCisgICAgICAgICAgICAgICAgLy8gaGVhZGVyIGlzIHNvbWV0aW1lcyBjb21wYXJlZCB3aXRoIHRoZSBoaWdoLW9yZGVyIGJ5dGUgb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gbGFzdG1vZGlmaWVkIHRpbWUsIHJhdGhlciB0aGFuIHRoZSBoaWdoLW9yZGVyIGJ5dGUgb2YgdGhlIENSQywgdG8KKyAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhlIHBhc3N3b3JkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgZG9jdW1lbnRlZCBpbiB0aGUgUEtXYXJlIEFwcG5vdGUudHh0LiAgSXQgd2FzCisgICAgICAgICAgICAgICAgLy8gZGlzY292ZXJlZCB0aGlzIGJ5IGFuYWx5c2lzIG9mIHRoZSBDcnlwdC5jIHNvdXJjZSBmaWxlIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIEluZm9aaXAgbGlicmFyeSBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC8KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgQ1JDIGZvciBhIGZpbGUgY2Fubm90IGJlIGtub3duCisgICAgICAgICAgICAgICAgLy8gdW50aWwgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZSBoYXZlIGJlZW4gc3RyZWFtZWQuIFRoaXMKKyAgICAgICAgICAgICAgICAvLyBtZWFucyBhIHRvb2wgd291bGQgaGF2ZSB0byByZWFkIHRoZSBmaWxlIGNvbnRlbnQgVFdJQ0UgaW4gaXRzCisgICAgICAgICAgICAgICAgLy8gZW50aXJldHkgaW4gb3JkZXIgdG8gcGVyZm9ybSBQS1pJUCBlbmNyeXB0aW9uIC0gb25jZSB0byBjb21wdXRlCisgICAgICAgICAgICAgICAgLy8gdGhlIENSQywgYW5kIGFnYWluIHRvIGFjdHVhbGx5IGVuY3J5cHQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHNvIGltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB1c2luZyB0aGUgdGltZWJsb2IgYXMKKyAgICAgICAgICAgICAgICAvLyB0aGUgdmVyaWZpY2F0aW9uIHNob3VsZCBiZSB0aGUgc3RhbmRhcmQgcHJhY3RpY2UgZm9yIERvdE5ldFppcAorICAgICAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgUEtaSVAgZW5jcnlwdGlvbi4gVGhpcyBpbXBsaWVzIHRoYXQgYml0IDMgbXVzdCBiZQorICAgICAgICAgICAgICAgIC8vIHNldC4gVGhlIGRvd25zaWRlIGlzIHRoYXQgc29tZSB0b29scyBzdGlsbCBjYW5ub3QgY29wZSB3aXRoIFpJUAorICAgICAgICAgICAgICAgIC8vIGZpbGVzIHRoYXQgdXNlIGJpdCAzLiAgVGhlcmVmb3JlLCBEb3ROZXRaaXAgRE9FUyBOT1QgZm9yY2UgYml0IDMKKyAgICAgICAgICAgICAgICAvLyB3aGVuIFBLWklQIGVuY3J5cHRpb24gaXMgaW4gdXNlLCBhbmQgaW5zdGVhZCwgcmVhZHMgdGhlIHN0cmVhbQorICAgICAgICAgICAgICAgIC8vIHR3aWNlLgorICAgICAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgICAgICBpZiAoKGUuX0JpdEZpZWxkICYgMHgwMDA4KSAhPSAweDAwMDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUGFzc3dvcmRFeGNlcHRpb24oIlRoZSBwYXNzd29yZCBkaWQgbm90IG1hdGNoLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChEZWNyeXB0ZWRIZWFkZXJbMTFdICE9IChieXRlKSgoZS5fVGltZUJsb2IgPj4gOCkgJiAweGZmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRQYXNzd29yZEV4Y2VwdGlvbigiVGhlIHBhc3N3b3JkIGRpZCBub3QgbWF0Y2guIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGdvb2QgcGFzc3dvcmQuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQS1PSworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0KKworCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGcm9tIEFwcE5vdGUudHh0OgorICAgICAgICAvLy8gdW5zaWduZWQgY2hhciBkZWNyeXB0X2J5dGUoKQorICAgICAgICAvLy8gICAgIGxvY2FsIHVuc2lnbmVkIHNob3J0IHRlbXAKKyAgICAgICAgLy8vICAgICB0ZW1wIDo9LSBLZXkoMikgfCAyCisgICAgICAgIC8vLyAgICAgZGVjcnlwdF9ieXRlIDo9ICh0ZW1wICogKHRlbXAgXiAxKSkgYml0c2hpZnQtcmlnaHQgOAorICAgICAgICAvLy8gZW5kIGRlY3J5cHRfYnl0ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGUgTWFnaWNCeXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVJbnQxNiB0ID0gKFVJbnQxNikoKFVJbnQxNikoX0tleXNbMl0gJiAweEZGRkYpIHwgMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgodCAqICh0IF4gMSkpID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVjcnlwdGluZzoKKyAgICAgICAgLy8gRnJvbSBBcHBOb3RlLnR4dDoKKyAgICAgICAgLy8gbG9vcCBmb3IgaSBmcm9tIDAgdG8gMTEKKyAgICAgICAgLy8gICAgIEMgOj0gYnVmZmVyKGkpIF4gZGVjcnlwdF9ieXRlKCkKKyAgICAgICAgLy8gICAgIHVwZGF0ZV9rZXlzKEMpCisgICAgICAgIC8vICAgICBidWZmZXIoaSkgOj0gQworICAgICAgICAvLyBlbmQgbG9vcAorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDYWxsIHRoaXMgbWV0aG9kIG9uIGEgY2lwaGVyIHRleHQgdG8gcmVuZGVyIHRoZSBwbGFpbnRleHQuIFlvdSBtdXN0CisgICAgICAgIC8vLyAgIGZpcnN0IGluaXRpYWxpemUgdGhlIGNpcGhlciB3aXRoIGEgY2FsbCB0byBJbml0Q2lwaGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICA8Y29kZT4KKyAgICAgICAgLy8vICAgICB2YXIgY2lwaGVyID0gbmV3IFppcENyeXB0bygpOworICAgICAgICAvLy8gICAgIGNpcGhlci5Jbml0Q2lwaGVyKFBhc3N3b3JkKTsKKyAgICAgICAgLy8vICAgICAvLyBEZWNyeXB0IHRoZSBoZWFkZXIuICBUaGlzIGhhcyBhIHNpZGUgZWZmZWN0IG9mICJmdXJ0aGVyIGluaXRpYWxpemluZyB0aGUKKyAgICAgICAgLy8vICAgICAvLyBlbmNyeXB0aW9uIGtleXMiIGluIHRoZSB0cmFkaXRpb25hbCB6aXAgZW5jcnlwdGlvbi4KKyAgICAgICAgLy8vICAgICBieXRlW10gRGVjcnlwdGVkTWVzc2FnZSA9IGNpcGhlci5EZWNyeXB0TWVzc2FnZShFbmNyeXB0ZWRNZXNzYWdlKTsKKyAgICAgICAgLy8vICAgPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaXBoZXJUZXh0Ij5UaGUgZW5jcnlwdGVkIGJ1ZmZlci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imxlbmd0aCI+CisgICAgICAgIC8vLyAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZW5jcnlwdC4KKyAgICAgICAgLy8vICAgU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBDaXBoZXJUZXh0Lkxlbmd0aC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIHBsYWludGV4dC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBieXRlW10gRGVjcnlwdE1lc3NhZ2UoYnl0ZVtdIGNpcGhlclRleHQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaXBoZXJUZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiY2lwaGVyVGV4dCIpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoID4gY2lwaGVyVGV4dC5MZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgbGVuZ3RoIGR1cmluZyBEZWNyeXB0aW9uOiB0aGUgbGVuZ3RoIHBhcmFtZXRlciBtdXN0IGJlIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYXJyYXkuIik7CisKKyAgICAgICAgICAgIGJ5dGVbXSBwbGFpblRleHQgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIEMgPSAoYnl0ZSkoY2lwaGVyVGV4dFtpXSBeIE1hZ2ljQnl0ZSk7CisgICAgICAgICAgICAgICAgVXBkYXRlS2V5cyhDKTsKKyAgICAgICAgICAgICAgICBwbGFpblRleHRbaV0gPSBDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBsYWluVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhpcyBpcyB0aGUgY29udmVyc2Ugb2YgRGVjcnlwdE1lc3NhZ2UuICBJdCBlbmNyeXB0cyB0aGUgcGxhaW50ZXh0CisgICAgICAgIC8vLyAgIGFuZCBwcm9kdWNlcyBhIGNpcGhlcnRleHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBsYWluVGV4dCI+VGhlIHBsYWluIHRleHQgYnVmZmVyLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imxlbmd0aCI+CisgICAgICAgIC8vLyAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZW5jcnlwdC4KKyAgICAgICAgLy8vICAgU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGFpblRleHQuTGVuZ3RoLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2lwaGVydGV4dC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBieXRlW10gRW5jcnlwdE1lc3NhZ2UoYnl0ZVtdIHBsYWluVGV4dCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBsYWluVGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInBsYWludGV4dCIpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoID4gcGxhaW5UZXh0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBsZW5ndGggZHVyaW5nIEVuY3J5cHRpb246IFRoZSBsZW5ndGggcGFyYW1ldGVyIG11c3QgYmUgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4iKTsKKworICAgICAgICAgICAgYnl0ZVtdIGNpcGhlclRleHQgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIEMgPSBwbGFpblRleHRbaV07CisgICAgICAgICAgICAgICAgY2lwaGVyVGV4dFtpXSA9IChieXRlKShwbGFpblRleHRbaV0gXiBNYWdpY0J5dGUpOworICAgICAgICAgICAgICAgIFVwZGF0ZUtleXMoQyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2lwaGVyVGV4dDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGlzIGluaXRpYWxpemVzIHRoZSBjaXBoZXIgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQuCisgICAgICAgIC8vLyAgIFNlZSBBcHBOb3RlLnR4dCBmb3IgZGV0YWlscy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFzc3BocmFzZSI+CisgICAgICAgIC8vLyAgIFRoZSBwYXNzcGhyYXNlIGZvciBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmcgd2l0aCB0aGlzIGNpcGhlci4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIFN0ZXAgMSAtIEluaXRpYWxpemluZyB0aGUgZW5jcnlwdGlvbiBrZXlzCisgICAgICAgIC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLy8gU3RhcnQgd2l0aCB0aGVzZSBrZXlzOgorICAgICAgICAvLy8gS2V5KDApIDo9IDMwNTQxOTg5NiAoMHgxMjM0NTY3OCkKKyAgICAgICAgLy8vIEtleSgxKSA6PSA1OTE3NTEwNDkgKDB4MjM0NTY3ODkpCisgICAgICAgIC8vLyBLZXkoMikgOj0gODc4MDgyMTkyICgweDM0NTY3ODkwKQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIFRoZW4sIGluaXRpYWxpemUgdGhlIGtleXMgd2l0aCBhIHBhc3N3b3JkOgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIGxvb3AgZm9yIGkgZnJvbSAwIHRvIGxlbmd0aChwYXNzd29yZCktMQorICAgICAgICAvLy8gICAgIHVwZGF0ZV9rZXlzKHBhc3N3b3JkKGkpKQorICAgICAgICAvLy8gZW5kIGxvb3AKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBXaGVyZSB1cGRhdGVfa2V5cygpIGlzIGRlZmluZWQgYXM6CisgICAgICAgIC8vLworICAgICAgICAvLy8gdXBkYXRlX2tleXMoY2hhcik6CisgICAgICAgIC8vLyAgIEtleSgwKSA6PSBjcmMzMihrZXkoMCksY2hhcikKKyAgICAgICAgLy8vICAgS2V5KDEpIDo9IEtleSgxKSArIChLZXkoMCkgYml0d2lzZUFORCAwMDAwMDBmZkgpCisgICAgICAgIC8vLyAgIEtleSgxKSA6PSBLZXkoMSkgKiAxMzQ3NzU4MTMgKyAxCisgICAgICAgIC8vLyAgIEtleSgyKSA6PSBjcmMzMihrZXkoMiksa2V5KDEpIHJpZ2h0c2hpZnQgMjQpCisgICAgICAgIC8vLyBlbmQgdXBkYXRlX2tleXMKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBXaGVyZSBjcmMzMihvbGRfY3JjLGNoYXIpIGlzIGEgcm91dGluZSB0aGF0IGdpdmVuIGEgQ1JDIHZhbHVlIGFuZCBhCisgICAgICAgIC8vLyBjaGFyYWN0ZXIsIHJldHVybnMgYW4gdXBkYXRlZCBDUkMgdmFsdWUgYWZ0ZXIgYXBwbHlpbmcgdGhlIENSQy0zMgorICAgICAgICAvLy8gYWxnb3JpdGhtIGRlc2NyaWJlZCBlbHNld2hlcmUgaW4gdGhpcyBkb2N1bWVudC4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFmdGVyIHRoZSBrZXlzIGFyZSBpbml0aWFsaXplZCwgdGhlbiB5b3UgY2FuIHVzZSB0aGUgY2lwaGVyIHRvCisgICAgICAgIC8vLyAgIGVuY3J5cHQgdGhlIHBsYWludGV4dC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRXNzZW50aWFsbHkgd2UgZW5jcnlwdCB0aGUgcGFzc3dvcmQgd2l0aCB0aGUga2V5cywgdGhlbiBkaXNjYXJkIHRoZQorICAgICAgICAvLy8gICBjaXBoZXJ0ZXh0IGZvciB0aGUgcGFzc3dvcmQuIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIGtleXMgZm9yIGxhdGVyIHVzZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRDaXBoZXIoc3RyaW5nIHBhc3NwaHJhc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBwID0gU2hhcmVkVXRpbGl0aWVzLlN0cmluZ1RvQnl0ZUFycmF5KHBhc3NwaHJhc2UpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzcGhyYXNlLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIFVwZGF0ZUtleXMocFtpXSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBVcGRhdGVLZXlzKGJ5dGUgYnl0ZVZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBfS2V5c1swXSA9IChVSW50MzIpY3JjMzIuQ29tcHV0ZUNyYzMyKChpbnQpX0tleXNbMF0sIGJ5dGVWYWx1ZSk7CisgICAgICAgICAgICBfS2V5c1sxXSA9IF9LZXlzWzFdICsgKGJ5dGUpX0tleXNbMF07CisgICAgICAgICAgICBfS2V5c1sxXSA9IF9LZXlzWzFdICogMHgwODA4ODQwNSArIDE7CisgICAgICAgICAgICBfS2V5c1syXSA9IChVSW50MzIpY3JjMzIuQ29tcHV0ZUNyYzMyKChpbnQpX0tleXNbMl0sIChieXRlKShfS2V5c1sxXSA+PiAyNCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIFRoZSBieXRlIGFycmF5IHJlcHJlc2VudGluZyB0aGUgc2VlZCBrZXlzIHVzZWQuCisgICAgICAgIC8vLy8vIEdldCB0aGlzIGFmdGVyIGNhbGxpbmcgSW5pdENpcGhlci4gIFRoZSAxMiBieXRlcyByZXByZXNlbnRzCisgICAgICAgIC8vLy8vIHdoYXQgdGhlIHppcCBzcGVjIGNhbGxzIHRoZSAiRW5jcnlwdGlvbkhlYWRlciIuCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9wdWJsaWMgYnl0ZVtdIEtleUhlYWRlcgorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0CisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVsxMl07CisgICAgICAgIC8vICAgICAgICByZXN1bHRbMF0gPSAoYnl0ZSkoX0tleXNbMF0gJiAweGZmKTsKKyAgICAgICAgLy8gICAgICAgIHJlc3VsdFsxXSA9IChieXRlKSgoX0tleXNbMF0gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgLy8gICAgICAgIHJlc3VsdFsyXSA9IChieXRlKSgoX0tleXNbMF0gPj4gMTYpICYgMHhmZik7CisgICAgICAgIC8vICAgICAgICByZXN1bHRbM10gPSAoYnl0ZSkoKF9LZXlzWzBdID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAvLyAgICAgICAgcmVzdWx0WzRdID0gKGJ5dGUpKF9LZXlzWzFdICYgMHhmZik7CisgICAgICAgIC8vICAgICAgICByZXN1bHRbNV0gPSAoYnl0ZSkoKF9LZXlzWzFdID4+IDgpICYgMHhmZik7CisgICAgICAgIC8vICAgICAgICByZXN1bHRbNl0gPSAoYnl0ZSkoKF9LZXlzWzFdID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAvLyAgICAgICAgcmVzdWx0WzddID0gKGJ5dGUpKChfS2V5c1sxXSA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgLy8gICAgICAgIHJlc3VsdFs4XSA9IChieXRlKShfS2V5c1syXSAmIDB4ZmYpOworICAgICAgICAvLyAgICAgICAgcmVzdWx0WzldID0gKGJ5dGUpKChfS2V5c1syXSA+PiA4KSAmIDB4ZmYpOworICAgICAgICAvLyAgICAgICAgcmVzdWx0WzEwXSA9IChieXRlKSgoX0tleXNbMl0gPj4gMTYpICYgMHhmZik7CisgICAgICAgIC8vICAgICAgICByZXN1bHRbMTFdID0gKGJ5dGUpKChfS2V5c1syXSA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgLy8gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy99CisKKyAgICAgICAgLy8gcHJpdmF0ZSBmaWVsZHMgZm9yIHRoZSBjcnlwdG8gc3R1ZmY6CisgICAgICAgIHByaXZhdGUgVUludDMyW10gX0tleXMgPSB7IDB4MTIzNDU2NzgsIDB4MjM0NTY3ODksIDB4MzQ1Njc4OTAgfTsKKyAgICAgICAgcHJpdmF0ZSBJb25pYy5DcmMuQ1JDMzIgY3JjMzIgPSBuZXcgSW9uaWMuQ3JjLkNSQzMyKCk7CisKKyAgICB9CisKKyAgICBpbnRlcm5hbCBlbnVtIENyeXB0b01vZGUKKyAgICB7CisgICAgICAgIEVuY3J5cHQsCisgICAgICAgIERlY3J5cHQKKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgQSBTdHJlYW0gZm9yIHJlYWRpbmcgYW5kIGNvbmN1cnJlbnRseSBkZWNyeXB0aW5nIGRhdGEgZnJvbSBhIHppcCBmaWxlLAorICAgIC8vLyAgIG9yIGZvciB3cml0aW5nIGFuZCBjb25jdXJyZW50bHkgZW5jcnlwdGluZyBkYXRhIHRvIGEgemlwIGZpbGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBjbGFzcyBaaXBDaXBoZXJTdHJlYW0gOiBTeXN0ZW0uSU8uU3RyZWFtCisgICAgeworICAgICAgICBwcml2YXRlIFppcENyeXB0byBfY2lwaGVyOworICAgICAgICBwcml2YXRlIFN5c3RlbS5JTy5TdHJlYW0gX3M7CisgICAgICAgIHByaXZhdGUgQ3J5cHRvTW9kZSBfbW9kZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+ICBUaGUgY29uc3RydWN0b3IuIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj5UaGUgdW5kZXJseWluZyBzdHJlYW08L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1vZGUiPlRvIGVpdGhlciBlbmNyeXB0IG9yIGRlY3J5cHQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaXBoZXIiPlRoZSBwcmUtaW5pdGlhbGl6ZWQgWmlwQ3J5cHRvIG9iamVjdC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgWmlwQ2lwaGVyU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gcywgWmlwQ3J5cHRvIGNpcGhlciwgQ3J5cHRvTW9kZSBtb2RlKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NpcGhlciA9IGNpcGhlcjsKKyAgICAgICAgICAgIF9zID0gczsKKyAgICAgICAgICAgIF9tb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbW9kZSA9PSBDcnlwdG9Nb2RlLkVuY3J5cHQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVGhpcyBzdHJlYW0gZG9lcyBub3QgZW5jcnlwdCB2aWEgUmVhZCgpIik7CisKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJidWZmZXIiKTsKKworICAgICAgICAgICAgYnl0ZVtdIGRiID0gbmV3IGJ5dGVbY291bnRdOworICAgICAgICAgICAgaW50IG4gPSBfcy5SZWFkKGRiLCAwLCBjb3VudCk7CisgICAgICAgICAgICBieXRlW10gZGVjcnlwdGVkID0gX2NpcGhlci5EZWNyeXB0TWVzc2FnZShkYiwgbik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBkZWNyeXB0ZWRbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9tb2RlID09IENyeXB0b01vZGUuRGVjcnlwdCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHN0cmVhbSBkb2VzIG5vdCBEZWNyeXB0IHZpYSBXcml0ZSgpIik7CisKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJidWZmZXIiKTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzY5NgorICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHJldHVybjsKKworICAgICAgICAgICAgYnl0ZVtdIHBsYWludGV4dCA9IG51bGw7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGxhaW50ZXh0ID0gbmV3IGJ5dGVbY291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dFtpXSA9IGJ1ZmZlcltvZmZzZXQgKyBpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHBsYWludGV4dCA9IGJ1ZmZlcjsKKworICAgICAgICAgICAgYnl0ZVtdIGVuY3J5cHRlZCA9IF9jaXBoZXIuRW5jcnlwdE1lc3NhZ2UocGxhaW50ZXh0LCBjb3VudCk7CisgICAgICAgICAgICBfcy5Xcml0ZShlbmNyeXB0ZWQsIDAsIGVuY3J5cHRlZC5MZW5ndGgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiAoX21vZGUgPT0gQ3J5cHRvTW9kZS5EZWNyeXB0KTsgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKF9tb2RlID09IENyeXB0b01vZGUuRW5jcnlwdCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy90aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgICAgIHNldCB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFNlZWsobG9uZyBvZmZzZXQsIFN5c3RlbS5JTy5TZWVrT3JpZ2luIG9yaWdpbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcERpckVudHJ5LmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRGlyRW50cnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjMjQ0NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcERpckVudHJ5LmNzCkBAIC0wLDAgKzEsMzgxIEBACisvLyBaaXBEaXJFbnRyeS5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMTEgRGlubyBDaGllc2EgLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTExIDEyOjAzOjAzPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgbWVtYmVycyBvZiB0aGUgWmlwRW50cnkgY2xhc3MgZm9yIHJlYWRpbmcgdGhlCisvLyBaaXAgZmlsZSBjZW50cmFsIGRpcmVjdG9yeS4KKy8vCisvLyBDcmVhdGVkOiBUdWUsIDI3IE1hciAyMDA3ICAxNTozMAorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisKKyAgICBwYXJ0aWFsIGNsYXNzIFppcEVudHJ5CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUcnVlIGlmIHRoZSByZWZlcmVuY2VkIGVudHJ5IGlzIGEgZGlyZWN0b3J5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBib29sIEF0dHJpYnV0ZXNJbmRpY2F0ZURpcmVjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKChfSW50ZXJuYWxGaWxlQXR0cnMgPT0gMCkgJiYgKChfRXh0ZXJuYWxGaWxlQXR0cnMgJiAweDAwMTApID09IDB4MDAxMCkpOyB9CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHZvaWQgUmVzZXREaXJFbnRyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIF9fRmlsZURhdGFQb3NpdGlvbiBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpbGUgZGF0YSBmb3IgYW4gZW50cnkuCisgICAgICAgICAgICAvLyBJdCBpcyBfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyICsgc2l6ZSBvZiBsb2NhbCBoZWFkZXIuCisKKyAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBrbm93IHRoZSBfX0ZpbGVEYXRhUG9zaXRpb24gdW50aWwgd2UgcmVhZCB0aGUgbG9jYWwKKyAgICAgICAgICAgIC8vIGhlYWRlci4KKworICAgICAgICAgICAgLy8gVGhlIGxvY2FsIGhlYWRlciBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSByZWNvcmQKKyAgICAgICAgICAgIC8vIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4KKworICAgICAgICAgICAgLy8gU2V0IHRvIC0xLCB0byBpbmRpY2F0ZSB3ZSBuZWVkIHRvIHJlYWQgdGhpcyBsYXRlci4KKyAgICAgICAgICAgIHRoaXMuX19GaWxlRGF0YVBvc2l0aW9uID0gLTE7CisKKyAgICAgICAgICAgIC8vIHNldCBfTGVuZ3RoT2ZIZWFkZXIgdG8gMCwgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byByZWFkIGxhdGVyLgorICAgICAgICAgICAgdGhpcy5fTGVuZ3RoT2ZIZWFkZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJvdmlkZXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWmlwRW50cnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSW5mbworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICAgICBaaXBFbnRyeTogezB9XG4iLCB0aGlzLkZpbGVOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChzdHJpbmcuRm9ybWF0KCIgICBWZXJzaW9uIE1hZGUgQnk6IHswfVxuIiwgdGhpcy5fVmVyc2lvbk1hZGVCeSkpCisgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiIE5lZWRlZCB0byBleHRyYWN0OiB7MH1cbiIsIHRoaXMuVmVyc2lvbk5lZWRlZCkpOworCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0lzRGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgiICAgICAgICBFbnRyeSB0eXBlOiBkaXJlY3RvcnlcbiIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICAgIEZpbGUgdHlwZTogezB9XG4iLCB0aGlzLl9Jc1RleHQ/ICJ0ZXh0IjoiYmluYXJ5IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICBDb21wcmVzc2lvbjogezB9XG4iLCB0aGlzLkNvbXByZXNzaW9uTWV0aG9kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgICBDb21wcmVzc2VkOiAweHswOlh9XG4iLCB0aGlzLkNvbXByZXNzZWRTaXplKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgVW5jb21wcmVzc2VkOiAweHswOlh9XG4iLCB0aGlzLlVuY29tcHJlc3NlZFNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChzdHJpbmcuRm9ybWF0KCIgICAgICAgICAgICAgQ1JDMzI6IDB4ezA6WDh9XG4iLCB0aGlzLl9DcmMzMikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZChzdHJpbmcuRm9ybWF0KCIgICAgICAgRGlzayBOdW1iZXI6IHswfVxuIiwgdGhpcy5fZGlza051bWJlcikpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPiAweEZGRkZGRkZGKQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgIFJlbGF0aXZlIE9mZnNldDogMHh7MDpYMTZ9XG4iLCB0aGlzLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChzdHJpbmcuRm9ybWF0KCIgICBSZWxhdGl2ZSBPZmZzZXQ6IDB4ezA6WDh9XG4iLCB0aGlzLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIpKTsKKworICAgICAgICAgICAgICAgICAgICBidWlsZGVyCisgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgICAgQml0IEZpZWxkOiAweHswOlg0fVxuIiwgdGhpcy5fQml0RmllbGQpKQorICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICAgRW5jcnlwdGVkPzogezB9XG4iLCB0aGlzLl9zb3VyY2VJc0VuY3J5cHRlZCkpCisgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgICAgIFRpbWVibG9iOiAweHswOlg4fVxuIiwgdGhpcy5fVGltZUJsb2IpKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChzdHJpbmcuRm9ybWF0KCIgICAgICAgICAgICAgIFRpbWU6IHswfVxuIiwgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5QYWNrZWRUb0RhdGVUaW1lKHRoaXMuX1RpbWVCbG9iKSkpOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgICAgSXMgWmlwNjQ/OiB7MH1cbiIsIHRoaXMuX0lucHV0VXNlc1ppcDY0KSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9Db21tZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICAgICAgQ29tbWVudDogezB9XG4iLCB0aGlzLl9Db21tZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHdvcmtpdGVtIDEwMzMwCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ29weUhlbHBlcgorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXggcmUgPQorICAgICAgICAgICAgICAgIG5ldyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXgoIiBcXChjb3B5IChcXGQrKVxcKSQiKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGxDb3VudCA9IDA7CisKKyAgICAgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgQXBwZW5kQ29weVRvRmlsZU5hbWUoc3RyaW5nIGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxDb3VudCA+IDI1KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFeGNlcHRpb24oIm92ZXJmbG93IHdoaWxlIGNyZWF0aW5nIGZpbGVuYW1lIik7CisKKyAgICAgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAgICAgaW50IHIgPSBmLkxhc3RJbmRleE9mKCIuIik7CisKKyAgICAgICAgICAgICAgICBpZiAociA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuTWF0Y2ggbSA9IHJlLk1hdGNoKGYpOworICAgICAgICAgICAgICAgICAgICBpZiAobS5TdWNjZXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gSW50MzIuUGFyc2UobS5Hcm91cHNbMV0uVmFsdWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb3B5ID0gU3RyaW5nLkZvcm1hdCgiIChjb3B5IHswfSkiLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBmLlN1YnN0cmluZygwLCBtLkluZGV4KSArIGNvcHk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29weSA9IFN0cmluZy5Gb3JtYXQoIiAoY29weSB7MH0pIiwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gZiArIGNvcHk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIkhhc0V4dGVuc2lvbiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuTWF0Y2ggbSA9IHJlLk1hdGNoKGYuU3Vic3RyaW5nKDAsIHIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG0uU3VjY2VzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbiA9IEludDMyLlBhcnNlKG0uR3JvdXBzWzFdLlZhbHVlKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29weSA9IFN0cmluZy5Gb3JtYXQoIiAoY29weSB7MH0pIiwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gZi5TdWJzdHJpbmcoMCwgbS5JbmRleCkgKyBjb3B5ICsgZi5TdWJzdHJpbmcocik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29weSA9IFN0cmluZy5Gb3JtYXQoIiAoY29weSB7MH0pIiwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gZi5TdWJzdHJpbmcoMCwgcikgKyBjb3B5ICsgZi5TdWJzdHJpbmcocik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5Db25zb2xlLldyaXRlTGluZSgicmV0dXJuaW5nIGYoezB9KSIsIGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJlYWRzIG9uZSBlbnRyeSBmcm9tIHRoZSB6aXAgZGlyZWN0b3J5IHN0cnVjdHVyZSBpbiB0aGUgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InpmIj4KKyAgICAgICAgLy8vICAgVGhlIHppcGZpbGUgZm9yIHdoaWNoIGEgZGlyZWN0b3J5IGVudHJ5IHdpbGwgYmUgcmVhZC4gIEZyb20gdGhpcyBwYXJhbSwgdGhlCisgICAgICAgIC8vLyAgIG1ldGhvZCBnZXRzIHRoZSBSZWFkU3RyZWFtIGFuZCB0aGUgZXhwZWN0ZWQgdGV4dCBlbmNvZGluZworICAgICAgICAvLy8gICAoUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZykgd2hpY2ggaXMgdXNlZCBpZiB0aGUgZW50cnkgaXMgbm90IG1hcmtlZAorICAgICAgICAvLy8gICBVVEYtOC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByZXZpb3VzbHlTZWVuIj4KKyAgICAgICAgLy8vICAgYSBsaXN0IG9mIHByZXZpb3VzbHkgc2VlbiBlbnRyeSBuYW1lczsgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZXMuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBlbnRyeSByZWFkIGZyb20gdGhlIGFyY2hpdmUuPC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgWmlwRW50cnkgUmVhZERpckVudHJ5KFppcEZpbGUgemYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxTdHJpbmcsT2JqZWN0PiBwcmV2aW91c2x5U2VlbikKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLklPLlN0cmVhbSBzID0gemYuUmVhZFN0cmVhbTsKKyAgICAgICAgICAgIFN5c3RlbS5UZXh0LkVuY29kaW5nIGV4cGVjdGVkRW5jb2RpbmcgPSAoemYuQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9PSBaaXBPcHRpb24uQWx3YXlzKQorICAgICAgICAgICAgICAgID8gemYuQWx0ZXJuYXRlRW5jb2RpbmcKKyAgICAgICAgICAgICAgICA6IFppcEZpbGUuRGVmYXVsdEVuY29kaW5nOworCisgICAgICAgICAgICBpbnQgc2lnbmF0dXJlID0gSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5SZWFkU2lnbmF0dXJlKHMpOworICAgICAgICAgICAgLy8gcmV0dXJuIG51bGwgaWYgdGhpcyBpcyBub3QgYSBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmUKKyAgICAgICAgICAgIGlmIChJc05vdFZhbGlkWmlwRGlyRW50cnlTaWcoc2lnbmF0dXJlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLlNlZWsoLTQsIFN5c3RlbS5JTy5TZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgocyk7CisKKyAgICAgICAgICAgICAgICAvLyBHZXR0aW5nICJub3QgYSBaaXBEaXJFbnRyeSBzaWduYXR1cmUiIGhlcmUgaXMgbm90IGFsd2F5cyB3cm9uZyBvciBhbgorICAgICAgICAgICAgICAgIC8vIGVycm9yLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2Fsa2luZyB0aHJvdWdoIGEgemlwZmlsZS4gIEFmdGVyIHRoZQorICAgICAgICAgICAgICAgIC8vIGxhc3QgWmlwRGlyRW50cnksIHdlIGV4cGVjdCB0byByZWFkIGFuCisgICAgICAgICAgICAgICAgLy8gRW5kT2ZDZW50cmFsRGlyZWN0b3J5U2lnbmF0dXJlLiAgV2hlbiB3ZSBnZXQgdGhpcyBpcyBob3cgd2Uga25vdworICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZSAhPSBaaXBDb25zdGFudHMuRW5kT2ZDZW50cmFsRGlyZWN0b3J5U2lnbmF0dXJlICYmCisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSAhPSBaaXBDb25zdGFudHMuWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmRTaWduYXR1cmUgJiYKKyAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlICE9IFppcENvbnN0YW50cy5aaXBFbnRyeVNpZ25hdHVyZSAgLy8gd29ya2l0ZW0gODI5OQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIEJhZCBzaWduYXR1cmUgKDB4ezA6WDh9KSBhdCBwb3NpdGlvbiAweHsxOlg4fSIsIHNpZ25hdHVyZSwgcy5Qb3NpdGlvbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDQyICsgNDsKKyAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG5ldyBieXRlWzQyXTsKKyAgICAgICAgICAgIGludCBuID0gcy5SZWFkKGJsb2NrLCAwLCBibG9jay5MZW5ndGgpOworICAgICAgICAgICAgaWYgKG4gIT0gYmxvY2suTGVuZ3RoKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgWmlwRW50cnkgemRlID0gbmV3IFppcEVudHJ5KCk7CisgICAgICAgICAgICB6ZGUuQWx0ZXJuYXRlRW5jb2RpbmcgPSBleHBlY3RlZEVuY29kaW5nOworICAgICAgICAgICAgemRlLl9Tb3VyY2UgPSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlOworICAgICAgICAgICAgemRlLl9jb250YWluZXIgPSBuZXcgWmlwQ29udGFpbmVyKHpmKTsKKworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemRlLl9WZXJzaW9uTWFkZUJ5ID0gKHNob3J0KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisgICAgICAgICAgICAgICAgemRlLl9WZXJzaW9uTmVlZGVkID0gKHNob3J0KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisgICAgICAgICAgICAgICAgemRlLl9CaXRGaWVsZCA9IChzaG9ydCkoYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYpOworICAgICAgICAgICAgICAgIHpkZS5fQ29tcHJlc3Npb25NZXRob2QgPSAoSW50MTYpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2KTsKKyAgICAgICAgICAgICAgICB6ZGUuX1RpbWVCbG9iID0gYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiAqIDI1NjsKKyAgICAgICAgICAgICAgICB6ZGUuX0xhc3RNb2RpZmllZCA9IElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuUGFja2VkVG9EYXRlVGltZSh6ZGUuX1RpbWVCbG9iKTsKKyAgICAgICAgICAgICAgICB6ZGUuX3RpbWVzdGFtcCB8PSBaaXBFbnRyeVRpbWVzdGFtcC5ET1M7CisKKyAgICAgICAgICAgICAgICB6ZGUuX0NyYzMyID0gYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiAqIDI1NjsKKyAgICAgICAgICAgICAgICB6ZGUuX0NvbXByZXNzZWRTaXplID0gKHVpbnQpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKiAyNTYpOworICAgICAgICAgICAgICAgIHpkZS5fVW5jb21wcmVzc2VkU2l6ZSA9ICh1aW50KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICogMjU2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHJlc2VydmUKKyAgICAgICAgICAgIHpkZS5fQ29tcHJlc3Npb25NZXRob2RfRnJvbVppcEZpbGUgPSB6ZGUuX0NvbXByZXNzaW9uTWV0aG9kOworCisgICAgICAgICAgICB6ZGUuX2ZpbGVuYW1lTGVuZ3RoID0gKHNob3J0KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisgICAgICAgICAgICB6ZGUuX2V4dHJhRmllbGRMZW5ndGggPSAoc2hvcnQpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2KTsKKyAgICAgICAgICAgIHpkZS5fY29tbWVudExlbmd0aCA9IChzaG9ydCkoYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYpOworICAgICAgICAgICAgemRlLl9kaXNrTnVtYmVyID0gKFVJbnQzMikoYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYpOworCisgICAgICAgICAgICB6ZGUuX0ludGVybmFsRmlsZUF0dHJzID0gKHNob3J0KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisgICAgICAgICAgICB6ZGUuX0V4dGVybmFsRmlsZUF0dHJzID0gYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiAqIDI1NjsKKworICAgICAgICAgICAgemRlLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPSAodWludCkoYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiAqIDI1Nik7CisKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc4MDEKKyAgICAgICAgICAgIHpkZS5Jc1RleHQgPSAoKHpkZS5fSW50ZXJuYWxGaWxlQXR0cnMgJiAweDAxKSA9PSAweDAxKTsKKworICAgICAgICAgICAgYmxvY2sgPSBuZXcgYnl0ZVt6ZGUuX2ZpbGVuYW1lTGVuZ3RoXTsKKyAgICAgICAgICAgIG4gPSBzLlJlYWQoYmxvY2ssIDAsIGJsb2NrLkxlbmd0aCk7CisgICAgICAgICAgICBieXRlc1JlYWQgKz0gbjsKKyAgICAgICAgICAgIGlmICgoemRlLl9CaXRGaWVsZCAmIDB4MDgwMCkgPT0gMHgwODAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVURi04IGlzIGluIHVzZQorICAgICAgICAgICAgICAgIHpkZS5fRmlsZU5hbWVJbkFyY2hpdmUgPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLlV0ZjhTdHJpbmdGcm9tQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZGUuX0ZpbGVOYW1lSW5BcmNoaXZlID0gSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5TdHJpbmdGcm9tQnVmZmVyKGJsb2NrLCBleHBlY3RlZEVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAzMzAKKyAgICAgICAgICAgIC8vIGluc3VyZSB1bmlxdWUgZW50cnkgbmFtZXMKKyAgICAgICAgICAgIHdoaWxlIChwcmV2aW91c2x5U2Vlbi5Db250YWluc0tleSh6ZGUuX0ZpbGVOYW1lSW5BcmNoaXZlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZGUuX0ZpbGVOYW1lSW5BcmNoaXZlID0gQ29weUhlbHBlci5BcHBlbmRDb3B5VG9GaWxlTmFtZSh6ZGUuX0ZpbGVOYW1lSW5BcmNoaXZlKTsKKyAgICAgICAgICAgICAgICB6ZGUuX21ldGFkYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh6ZGUuQXR0cmlidXRlc0luZGljYXRlRGlyZWN0b3J5KQorICAgICAgICAgICAgICAgIHpkZS5NYXJrQXNEaXJlY3RvcnkoKTsgIC8vIG1heSBhcHBlbmQgYSBzbGFzaCB0byBmaWxlbmFtZSBpZiBuZWMuCisgICAgICAgICAgICAvLyB3b3JraXRlbSA2ODk4CisgICAgICAgICAgICBlbHNlIGlmICh6ZGUuX0ZpbGVOYW1lSW5BcmNoaXZlLkVuZHNXaXRoKCIvIikpIHpkZS5NYXJrQXNEaXJlY3RvcnkoKTsKKworICAgICAgICAgICAgemRlLl9Db21wcmVzc2VkRmlsZURhdGFTaXplID0gemRlLl9Db21wcmVzc2VkU2l6ZTsKKyAgICAgICAgICAgIGlmICgoemRlLl9CaXRGaWVsZCAmIDB4MDEpID09IDB4MDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtYXkgY2hhbmdlIGFmdGVyIHByb2Nlc3NpbmcgdGhlIEV4dHJhIGZpZWxkCisgICAgICAgICAgICAgICAgemRlLl9FbmNyeXB0aW9uX0Zyb21aaXBGaWxlID0gemRlLl9FbmNyeXB0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGlvbkFsZ29yaXRobS5Qa3ppcFdlYWs7CisgICAgICAgICAgICAgICAgemRlLl9zb3VyY2VJc0VuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh6ZGUuX2V4dHJhRmllbGRMZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpkZS5fSW5wdXRVc2VzWmlwNjQgPSAoemRlLl9Db21wcmVzc2VkU2l6ZSA9PSAweEZGRkZGRkZGIHx8CisgICAgICAgICAgICAgICAgICAgICAgemRlLl9VbmNvbXByZXNzZWRTaXplID09IDB4RkZGRkZGRkYgfHwKKyAgICAgICAgICAgICAgICAgICAgICB6ZGUuX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9PSAweEZGRkZGRkZGKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnNvbGUuV3JpdGVMaW5lKCIgIElucHV0IHVzZXMgWjY0PzogICAgICB7MH0iLCB6ZGUuX0lucHV0VXNlc1ppcDY0KTsKKworICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCArPSB6ZGUuUHJvY2Vzc0V4dHJhRmllbGQocywgemRlLl9leHRyYUZpZWxkTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB6ZGUuX0NvbXByZXNzZWRGaWxlRGF0YVNpemUgPSB6ZGUuX0NvbXByZXNzZWRTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZSd2ZSBwcm9jZXNzZWQgdGhlIGV4dHJhIGZpZWxkLCBzbyB3ZSBrbm93IHRoZSBlbmNyeXB0aW9uIG1ldGhvZCBpcyBzZXQgbm93LgorICAgICAgICAgICAgaWYgKHpkZS5fRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLlBremlwV2VhaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgImVuY3J5cHRpb24gaGVhZGVyIiBvZiAxMiBieXRlcyBwcmVjZWRlcyB0aGUgZmlsZSBkYXRhCisgICAgICAgICAgICAgICAgemRlLl9Db21wcmVzc2VkRmlsZURhdGFTaXplIC09IDEyOworICAgICAgICAgICAgfQorI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgZWxzZSBpZiAoemRlLkVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMxMjggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpkZS5FbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpkZS5fQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSA9IHpkZS5Db21wcmVzc2VkU2l6ZSAtCisgICAgICAgICAgICAgICAgICAgIChaaXBFbnRyeS5HZXRMZW5ndGhPZkNyeXB0b0hlYWRlckJ5dGVzKHpkZS5FbmNyeXB0aW9uKSArIDEwKTsKKyAgICAgICAgICAgICAgICB6ZGUuX0xlbmd0aE9mVHJhaWxlciA9IDEwOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8vIHRhbGx5IHRoZSB0cmFpbGluZyBkZXNjcmlwdG9yCisgICAgICAgICAgICBpZiAoKHpkZS5fQml0RmllbGQgJiAweDAwMDgpID09IDB4MDAwOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzaWcsIENSQywgQ29tcCBhbmQgVW5jb21wIHNpemVzCisgICAgICAgICAgICAgICAgaWYgKHpkZS5fSW5wdXRVc2VzWmlwNjQpCisgICAgICAgICAgICAgICAgICAgIHpkZS5fTGVuZ3RoT2ZUcmFpbGVyICs9IDI0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgemRlLl9MZW5ndGhPZlRyYWlsZXIgKz0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEyNzQ0CisgICAgICAgICAgICB6ZGUuQWx0ZXJuYXRlRW5jb2RpbmcgPSAoKHpkZS5fQml0RmllbGQgJiAweDA4MDApID09IDB4MDgwMCkKKyAgICAgICAgICAgICAgICA/IFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjgKKyAgICAgICAgICAgICAgICA6ZXhwZWN0ZWRFbmNvZGluZzsKKworICAgICAgICAgICAgemRlLkFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPSBaaXBPcHRpb24uQWx3YXlzOworCisgICAgICAgICAgICBpZiAoemRlLl9jb21tZW50TGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlW3pkZS5fY29tbWVudExlbmd0aF07CisgICAgICAgICAgICAgICAgbiA9IHMuUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBieXRlc1JlYWQgKz0gbjsKKyAgICAgICAgICAgICAgICBpZiAoKHpkZS5fQml0RmllbGQgJiAweDA4MDApID09IDB4MDgwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVURi04IGlzIGluIHVzZQorICAgICAgICAgICAgICAgICAgICB6ZGUuX0NvbW1lbnQgPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLlV0ZjhTdHJpbmdGcm9tQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemRlLl9Db21tZW50ID0gSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5TdHJpbmdGcm9tQnVmZmVyKGJsb2NrLCBleHBlY3RlZEVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3pkZS5fTGVuZ3RoT2ZEaXJFbnRyeSA9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgIHJldHVybiB6ZGU7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkLWluIHZhbHVlIGlzIGEgdmFsaWQgc2lnbmF0dXJlIGZvciBhIFppcERpckVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNpZ25hdHVyZSI+dGhlIGNhbmRpZGF0ZSA0LWJ5dGUgc2lnbmF0dXJlIHZhbHVlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlLCBpZiB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgUEtXYXJlIHNwZWMuPC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc05vdFZhbGlkWmlwRGlyRW50cnlTaWcoaW50IHNpZ25hdHVyZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaWduYXR1cmUgIT0gWmlwQ29uc3RhbnRzLlppcERpckVudHJ5U2lnbmF0dXJlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBJbnQxNiBfVmVyc2lvbk1hZGVCeTsKKyAgICAgICAgcHJpdmF0ZSBJbnQxNiBfSW50ZXJuYWxGaWxlQXR0cnM7CisgICAgICAgIHByaXZhdGUgSW50MzIgX0V4dGVybmFsRmlsZUF0dHJzOworCisgICAgICAgIC8vcHJpdmF0ZSBJbnQzMiBfTGVuZ3RoT2ZEaXJFbnRyeTsKKyAgICAgICAgcHJpdmF0ZSBJbnQxNiBfZmlsZW5hbWVMZW5ndGg7CisgICAgICAgIHByaXZhdGUgSW50MTYgX2V4dHJhRmllbGRMZW5ndGg7CisgICAgICAgIHByaXZhdGUgSW50MTYgX2NvbW1lbnRMZW5ndGg7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEVudHJ5LkV4dHJhY3QuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBFbnRyeS5FeHRyYWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTJiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBFbnRyeS5FeHRyYWN0LmNzCkBAIC0wLDAgKzEsMTQ1NSBAQAorLy8gWmlwRW50cnkuRXh0cmFjdC5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgRGlubyBDaGllc2EKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtQXVndXN0LTA2IDE4OjA4OjIxPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgbG9naWMgZm9yIEV4dHJhY3QgbWV0aG9kcyBvbiB0aGUgWmlwRW50cnkgY2xhc3MuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFppcEVudHJ5CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEV4dHJhY3QgdGhlIGVudHJ5IHRvIHRoZSBmaWxlc3lzdGVtLCBzdGFydGluZyBhdCB0aGUgY3VycmVudAorICAgICAgICAvLy8gICB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8b3ZlcmxvYWRzPgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCBoYXMgYSBidW5jaCBvZiBvdmVybG9hZHMhIE9uZSBvZiB0aGVtIGlzIHN1cmUgdG8KKyAgICAgICAgLy8vICAgYmUgdGhlIHJpZ2h0IG9uZSBmb3IgeW91Li4uIElmIHlvdSBkb24ndCBsaWtlIHRoZXNlLCBjaGVjaworICAgICAgICAvLy8gICBvdXQgdGhlIDxjPkV4dHJhY3RXaXRoUGFzc3dvcmQoKTwvYz4gbWV0aG9kcy4KKyAgICAgICAgLy8vIDwvb3ZlcmxvYWRzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkV4dHJhY3QoRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbikiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgZXh0cmFjdHMgYW4gZW50cnkgZnJvbSBhIHppcCBmaWxlIGludG8gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8vICAgd29ya2luZyBkaXJlY3RvcnkuICBUaGUgcGF0aCBvZiB0aGUgZW50cnkgYXMgZXh0cmFjdGVkIGlzIHRoZSBmdWxsCisgICAgICAgIC8vLyAgIHBhdGggYXMgc3BlY2lmaWVkIGluIHRoZSB6aXAgYXJjaGl2ZSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8vICAgd29ya2luZyBkaXJlY3RvcnkuICBBZnRlciB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGUKKyAgICAgICAgLy8vICAgZmlsZSBhdHRyaWJ1dGVzIGFuZCB0aW1lc3RhbXBzIGFyZSBzZXQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBhY3Rpb24gdGFrZW4gd2hlbiBleHRyYWN0aW9uIGFuIGVudHJ5IHdvdWxkIG92ZXJ3cml0ZSBhbgorICAgICAgICAvLy8gICBleGlzdGluZyBmaWxlIGlzIGRldGVybWluZWQgYnkgdGhlIDxzZWUgY3JlZj0iRXh0cmFjdEV4aXN0aW5nRmlsZSIKKyAgICAgICAgLy8vICAgLz4gcHJvcGVydHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdpdGhpbiB0aGUgY2FsbCB0byA8Yz5FeHRyYWN0KCk8L2M+LCB0aGUgY29udGVudCBmb3IgdGhlIGVudHJ5IGlzCisgICAgICAgIC8vLyAgIHdyaXR0ZW4gaW50byBhIGZpbGVzeXN0ZW0gZmlsZSwgYW5kIHRoZW4gdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUKKyAgICAgICAgLy8vICAgZmlsZSBpcyBzZXQgYWNjb3JkaW5nIHRvIHRoZSA8c2VlIGNyZWY9Ikxhc3RNb2RpZmllZCIvPiBwcm9wZXJ0eSBvbgorICAgICAgICAvLy8gICB0aGUgZW50cnkuIFNlZSB0aGUgcmVtYXJrcyB0aGUgPHNlZSBjcmVmPSJMYXN0TW9kaWZpZWQiLz4gcHJvcGVydHkgZm9yCisgICAgICAgIC8vLyAgIHNvbWUgZGV0YWlscyBhYm91dCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBFeHRyYWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJuYWxFeHRyYWN0KCIuIiwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRXh0cmFjdCB0aGUgZW50cnkgdG8gYSBmaWxlIGluIHRoZSBmaWxlc3lzdGVtLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyAgIGJlaGF2aW9yIHdoZW4gZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZWUgdGhlIHJlbWFya3Mgb24gdGhlIDxzZWUgY3JlZj0iTGFzdE1vZGlmaWVkIi8+IHByb3BlcnR5LCBmb3Igc29tZQorICAgICAgICAvLy8gICBkZXRhaWxzIGFib3V0IGhvdyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSBmaWxlIGlzIHNldCBhZnRlcgorICAgICAgICAvLy8gICBleHRyYWN0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJleHRyYWN0RXhpc3RpbmdGaWxlIj4KKyAgICAgICAgLy8vICAgVGhlIGFjdGlvbiB0byB0YWtlIGlmIGV4dHJhY3Rpb24gd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCB2b2lkIEV4dHJhY3QoRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbiBleHRyYWN0RXhpc3RpbmdGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBFeHRyYWN0RXhpc3RpbmdGaWxlID0gZXh0cmFjdEV4aXN0aW5nRmlsZTsKKyAgICAgICAgICAgIEludGVybmFsRXh0cmFjdCgiLiIsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBFeHRyYWN0cyB0aGUgZW50cnkgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGNhbGxlciBjYW4gc3BlY2lmeSBhbnkgd3JpdGUtYWJsZSBzdHJlYW0sIGZvciBleGFtcGxlIGEgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTeXN0ZW0uSU8uRmlsZVN0cmVhbSIvPiwgYSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlN5c3RlbS5JTy5NZW1vcnlTdHJlYW0iLz4sIG9yIEFTUC5ORVQncworICAgICAgICAvLy8gICA8Yz5SZXNwb25zZS5PdXRwdXRTdHJlYW08L2M+LiAgVGhlIGNvbnRlbnQgd2lsbCBiZSBkZWNyeXB0ZWQgYW5kCisgICAgICAgIC8vLyAgIGRlY29tcHJlc3NlZCBhcyBuZWNlc3NhcnkuIElmIHRoZSBlbnRyeSBpcyBlbmNyeXB0ZWQgYW5kIG5vIHBhc3N3b3JkCisgICAgICAgIC8vLyAgIGlzIHByb3ZpZGVkLCB0aGlzIG1ldGhvZCB3aWxsIHRocm93LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBwb3NpdGlvbiBvbiB0aGUgc3RyZWFtIGlzIG5vdCByZXNldCBieSB0aGlzIG1ldGhvZCBiZWZvcmUgaXQgZXh0cmFjdHMuCisgICAgICAgIC8vLyAgIFlvdSBtYXkgd2FudCB0byBjYWxsIHN0cmVhbS5TZWVrKCkgYmVmb3JlIGNhbGxpbmcgWmlwRW50cnkuRXh0cmFjdCgpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPgorICAgICAgICAvLy8gICB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBlbnRyeSBzaG91bGQgYmUgZXh0cmFjdGVkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyB2b2lkIEV4dHJhY3QoU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJuYWxFeHRyYWN0KG51bGwsIHN0cmVhbSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEV4dHJhY3QgdGhlIGVudHJ5IHRvIHRoZSBmaWxlc3lzdGVtLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGJhc2UKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiYXNlRGlyZWN0b3J5Ij50aGUgcGF0aG5hbWUgb2YgdGhlIGJhc2UgZGlyZWN0b3J5PC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBFbnRyeS5FeHRyYWN0RXhpc3RpbmdGaWxlIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBFbnRyeS5FeHRyYWN0KHN0cmluZywgRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbikiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBleHRyYWN0cyBvbmx5IHRoZSBlbnRyaWVzIGluIGEgemlwIGZpbGUgdGhhdCBhcmUgLnR4dCBmaWxlcywKKyAgICAgICAgLy8vIGludG8gYSBkaXJlY3RvcnkgY2FsbGVkICJ0ZXh0ZmlsZXMiLgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gWmlwRmlsZS5SZWFkKCJQYWNrZWREb2N1bWVudHMuemlwIikpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIGZvcmVhY2ggKHN0cmluZyBzMSBpbiB6aXAuRW50cnlGaWxlbmFtZXMpCisgICAgICAgIC8vLyAgIHsKKyAgICAgICAgLy8vICAgICBpZiAoczEuRW5kc1dpdGgoIi50eHQiKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICB6aXBbczFdLkV4dHJhY3QoInRleHRmaWxlcyIpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gICBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IFppcEZpbGUuUmVhZCgiUGFja2VkRG9jdW1lbnRzLnppcCIpCisgICAgICAgIC8vLyAgICAgICBEaW0gczEgQXMgU3RyaW5nCisgICAgICAgIC8vLyAgICAgICBGb3IgRWFjaCBzMSBJbiB6aXAuRW50cnlGaWxlbmFtZXMKKyAgICAgICAgLy8vICAgICAgICAgICBJZiBzMS5FbmRzV2l0aCgiLnR4dCIpIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgemlwKHMxKS5FeHRyYWN0KCJ0ZXh0ZmlsZXMiKQorICAgICAgICAvLy8gICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgTmV4dAorICAgICAgICAvLy8gICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVXNpbmcgdGhpcyBtZXRob2QsIGV4aXN0aW5nIGVudHJpZXMgaW4gdGhlIGZpbGVzeXN0ZW0gd2lsbCBub3QgYmUKKyAgICAgICAgLy8vICAgb3ZlcndyaXR0ZW4uIElmIHlvdSB3b3VsZCBsaWtlIHRvIGZvcmNlIHRoZSBvdmVyd3JpdGUgb2YgZXhpc3RpbmcKKyAgICAgICAgLy8vICAgZmlsZXMsIHNlZSB0aGUgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+IHByb3BlcnR5LCBvciBjYWxsCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iRXh0cmFjdChzdHJpbmcsIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24pIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZWUgdGhlIHJlbWFya3Mgb24gdGhlIDxzZWUgY3JlZj0iTGFzdE1vZGlmaWVkIi8+IHByb3BlcnR5LCBmb3Igc29tZQorICAgICAgICAvLy8gICBkZXRhaWxzIGFib3V0IGhvdyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSBjcmVhdGVkIGZpbGUgaXMgc2V0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgdm9pZCBFeHRyYWN0KHN0cmluZyBiYXNlRGlyZWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBJbnRlcm5hbEV4dHJhY3QoYmFzZURpcmVjdG9yeSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRXh0cmFjdCB0aGUgZW50cnkgdG8gdGhlIGZpbGVzeXN0ZW0sIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgYmFzZQorICAgICAgICAvLy8gICBkaXJlY3RvcnksIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIHdoZW4gZXh0cmFjdGlvbiB3b3VsZAorICAgICAgICAvLy8gICBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZWUgdGhlIHJlbWFya3Mgb24gdGhlIDxzZWUgY3JlZj0iTGFzdE1vZGlmaWVkIi8+IHByb3BlcnR5LCBmb3Igc29tZQorICAgICAgICAvLy8gICBkZXRhaWxzIGFib3V0IGhvdyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSBjcmVhdGVkIGZpbGUgaXMgc2V0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gU3RyaW5nIHNaaXBQYXRoID0gIkFpcmJvcm5lLnppcCI7CisgICAgICAgIC8vLyBTdHJpbmcgc0ZpbGVQYXRoID0gIlJlYWRtZS50eHQiOworICAgICAgICAvLy8gU3RyaW5nIHNSb290Rm9sZGVyID0gIkRpZ2FkbyI7CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBaaXBGaWxlLlJlYWQoc1ppcFBhdGgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICBpZiAoemlwLkVudHJ5RmlsZU5hbWVzLkNvbnRhaW5zKHNGaWxlUGF0aCkpCisgICAgICAgIC8vLyAgIHsKKyAgICAgICAgLy8vICAgICAvLyB1c2UgdGhlIHN0cmluZyBpbmRleGVyIG9uIHRoZSB6aXAgZmlsZQorICAgICAgICAvLy8gICAgIHppcFtzRmlsZU5hbWVdLkV4dHJhY3Qoc1Jvb3RGb2xkZXIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLk92ZXJ3cml0ZVNpbGVudGx5KTsKKyAgICAgICAgLy8vICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIERpbSBzWmlwUGF0aCBhcyBTdHJpbmcgPSAiQWlyYm9ybmUuemlwIgorICAgICAgICAvLy8gRGltIHNGaWxlUGF0aCBBcyBTdHJpbmcgPSAiUmVhZG1lLnR4dCIKKyAgICAgICAgLy8vIERpbSBzUm9vdEZvbGRlciBBcyBTdHJpbmcgPSAiRGlnYWRvIgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoc1ppcFBhdGgpCisgICAgICAgIC8vLyAgIElmIHppcC5FbnRyeUZpbGVOYW1lcy5Db250YWlucyhzRmlsZVBhdGgpCisgICAgICAgIC8vLyAgICAgJyB1c2UgdGhlIHN0cmluZyBpbmRleGVyIG9uIHRoZSB6aXAgZmlsZQorICAgICAgICAvLy8gICAgIHppcChzRmlsZVBhdGgpLkV4dHJhY3Qoc1Jvb3RGb2xkZXIsIF8KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uT3ZlcndyaXRlU2lsZW50bHkpCisgICAgICAgIC8vLyAgIEVuZCBJZgorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJhc2VEaXJlY3RvcnkiPnRoZSBwYXRobmFtZSBvZiB0aGUgYmFzZSBkaXJlY3Rvcnk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4dHJhY3RFeGlzdGluZ0ZpbGUiPgorICAgICAgICAvLy8gVGhlIGFjdGlvbiB0byB0YWtlIGlmIGV4dHJhY3Rpb24gd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCB2b2lkIEV4dHJhY3Qoc3RyaW5nIGJhc2VEaXJlY3RvcnksIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24gZXh0cmFjdEV4aXN0aW5nRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXh0cmFjdEV4aXN0aW5nRmlsZSA9IGV4dHJhY3RFeGlzdGluZ0ZpbGU7CisgICAgICAgICAgICBJbnRlcm5hbEV4dHJhY3QoYmFzZURpcmVjdG9yeSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRXh0cmFjdCB0aGUgZW50cnkgdG8gdGhlIGZpbGVzeXN0ZW0sIHVzaW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CisgICAgICAgIC8vLyAgIGFuZCB0aGUgc3BlY2lmaWVkIHBhc3N3b3JkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxvdmVybG9hZHM+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIGhhcyBhIGJ1bmNoIG9mIG92ZXJsb2FkcyEgT25lIG9mIHRoZW0gaXMgc3VyZSB0byBiZQorICAgICAgICAvLy8gICB0aGUgcmlnaHQgb25lIGZvciB5b3UuLi4KKyAgICAgICAgLy8vIDwvb3ZlcmxvYWRzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkV4dHJhY3RXaXRoUGFzc3dvcmQoRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbiwgc3RyaW5nKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBFeGlzdGluZyBlbnRyaWVzIGluIHRoZSBmaWxlc3lzdGVtIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuLiBJZiB5b3UKKyAgICAgICAgLy8vICAgd291bGQgbGlrZSB0byBmb3JjZSB0aGUgb3ZlcndyaXRlIG9mIGV4aXN0aW5nIGZpbGVzLCBzZWUgdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuRXh0cmFjdEV4aXN0aW5nRmlsZSIvPnByb3BlcnR5LCBvciBjYWxsCisgICAgICAgIC8vLyAgIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iRXh0cmFjdFdpdGhQYXNzd29yZChFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLHN0cmluZykiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgcmVtYXJrcyBvbiB0aGUgPHNlZSBjcmVmPSJMYXN0TW9kaWZpZWQiLz4gcHJvcGVydHkgZm9yIHNvbWUKKyAgICAgICAgLy8vICAgZGV0YWlscyBhYm91dCBob3cgdGhlICJsYXN0IG1vZGlmaWVkIiB0aW1lIG9mIHRoZSBjcmVhdGVkIGZpbGUgaXMKKyAgICAgICAgLy8vICAgc2V0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICBJbiB0aGlzIGV4YW1wbGUsIGVudHJpZXMgdGhhdCB1c2UgZW5jcnlwdGlvbiBhcmUgZXh0cmFjdGVkIHVzaW5nIGEKKyAgICAgICAgLy8vICAgcGFydGljdWxhciBwYXNzd29yZC4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKHZhciB6aXAgPSBaaXBGaWxlLlJlYWQoRmlsZVBhdGgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gemlwKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgaWYgKGUuVXNlc0VuY3J5cHRpb24pCisgICAgICAgIC8vLyAgICAgICAgICAgICBlLkV4dHJhY3RXaXRoUGFzc3dvcmQoIlNlY3JldCEiKTsKKyAgICAgICAgLy8vICAgICAgICAgZWxzZQorICAgICAgICAvLy8gICAgICAgICAgICAgZS5FeHRyYWN0KCk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoRmlsZVBhdGgpCisgICAgICAgIC8vLyAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICBGb3IgRWFjaCBlIEluIHppcAorICAgICAgICAvLy8gICAgICAgICBJZiAoZS5Vc2VzRW5jcnlwdGlvbikKKyAgICAgICAgLy8vICAgICAgICAgICBlLkV4dHJhY3RXaXRoUGFzc3dvcmQoIlNlY3JldCEiKQorICAgICAgICAvLy8gICAgICAgICBFbHNlCisgICAgICAgIC8vLyAgICAgICAgICAgZS5FeHRyYWN0CisgICAgICAgIC8vLyAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgIE5leHQKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5UaGUgUGFzc3dvcmQgdG8gdXNlIGZvciBkZWNyeXB0aW5nIHRoZSBlbnRyeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBFeHRyYWN0V2l0aFBhc3N3b3JkKHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJuYWxFeHRyYWN0KCIuIiwgbnVsbCwgcGFzc3dvcmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBFeHRyYWN0IHRoZSBlbnRyeSB0byB0aGUgZmlsZXN5c3RlbSwgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBiYXNlCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSwgYW5kIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFzc3dvcmQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRW50cnkuRXh0cmFjdEV4aXN0aW5nRmlsZSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRW50cnkuRXh0cmFjdFdpdGhQYXNzd29yZChzdHJpbmcsIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24sIHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBFeGlzdGluZyBlbnRyaWVzIGluIHRoZSBmaWxlc3lzdGVtIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuLiBJZiB5b3UKKyAgICAgICAgLy8vICAgd291bGQgbGlrZSB0byBmb3JjZSB0aGUgb3ZlcndyaXRlIG9mIGV4aXN0aW5nIGZpbGVzLCBzZWUgdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuRXh0cmFjdEV4aXN0aW5nRmlsZSIvPnByb3BlcnR5LCBvciBjYWxsCisgICAgICAgIC8vLyAgIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iRXh0cmFjdFdpdGhQYXNzd29yZChFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLHN0cmluZykiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgcmVtYXJrcyBvbiB0aGUgPHNlZSBjcmVmPSJMYXN0TW9kaWZpZWQiLz4gcHJvcGVydHksIGZvciBzb21lCisgICAgICAgIC8vLyAgIGRldGFpbHMgYWJvdXQgaG93IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlIGNyZWF0ZWQgZmlsZSBpcyBzZXQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJhc2VEaXJlY3RvcnkiPlRoZSBwYXRobmFtZSBvZiB0aGUgYmFzZSBkaXJlY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIFBhc3N3b3JkIHRvIHVzZSBmb3IgZGVjcnlwdGluZyB0aGUgZW50cnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgRXh0cmFjdFdpdGhQYXNzd29yZChzdHJpbmcgYmFzZURpcmVjdG9yeSwgc3RyaW5nIHBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRlcm5hbEV4dHJhY3QoYmFzZURpcmVjdG9yeSwgbnVsbCwgcGFzc3dvcmQpOworICAgICAgICB9CisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBFeHRyYWN0IHRoZSBlbnRyeSB0byBhIGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0sIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICAvLy8gICBjdXJyZW50IGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNwZWNpZmllZCBiZWhhdmlvciB3aGVuIGV4dHJhY3Rpb24KKyAgICAgICAgLy8vICAgd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2VlIHRoZSByZW1hcmtzIG9uIHRoZSA8c2VlIGNyZWY9Ikxhc3RNb2RpZmllZCIvPiBwcm9wZXJ0eSwgZm9yIHNvbWUKKyAgICAgICAgLy8vICAgZGV0YWlscyBhYm91dCBob3cgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgY3JlYXRlZCBmaWxlIGlzIHNldC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFzc3dvcmQiPlRoZSBQYXNzd29yZCB0byB1c2UgZm9yIGRlY3J5cHRpbmcgdGhlIGVudHJ5LjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4dHJhY3RFeGlzdGluZ0ZpbGUiPgorICAgICAgICAvLy8gVGhlIGFjdGlvbiB0byB0YWtlIGlmIGV4dHJhY3Rpb24gd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCB2b2lkIEV4dHJhY3RXaXRoUGFzc3dvcmQoRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbiBleHRyYWN0RXhpc3RpbmdGaWxlLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4dHJhY3RFeGlzdGluZ0ZpbGUgPSBleHRyYWN0RXhpc3RpbmdGaWxlOworICAgICAgICAgICAgSW50ZXJuYWxFeHRyYWN0KCIuIiwgbnVsbCwgcGFzc3dvcmQpOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRXh0cmFjdCB0aGUgZW50cnkgdG8gdGhlIGZpbGVzeXN0ZW0sIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgYmFzZQorICAgICAgICAvLy8gICBkaXJlY3RvcnksIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIHdoZW4gZXh0cmFjdGlvbiB3b3VsZAorICAgICAgICAvLy8gICBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgU2VlIHRoZSByZW1hcmtzIG9uIHRoZSA8c2VlIGNyZWY9Ikxhc3RNb2RpZmllZCIvPiBwcm9wZXJ0eSwgZm9yIHNvbWUKKyAgICAgICAgLy8vICAgZGV0YWlscyBhYm91dCBob3cgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgY3JlYXRlZCBmaWxlIGlzIHNldC4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYmFzZURpcmVjdG9yeSI+dGhlIHBhdGhuYW1lIG9mIHRoZSBiYXNlIGRpcmVjdG9yeTwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4dHJhY3RFeGlzdGluZ0ZpbGUiPlRoZSBhY3Rpb24gdG8gdGFrZSBpZiBleHRyYWN0aW9uIHdvdWxkCisgICAgICAgIC8vLyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIFBhc3N3b3JkIHRvIHVzZSBmb3IgZGVjcnlwdGluZyB0aGUgZW50cnkuPC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBFeHRyYWN0V2l0aFBhc3N3b3JkKHN0cmluZyBiYXNlRGlyZWN0b3J5LCBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uIGV4dHJhY3RFeGlzdGluZ0ZpbGUsIHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgRXh0cmFjdEV4aXN0aW5nRmlsZSA9IGV4dHJhY3RFeGlzdGluZ0ZpbGU7CisgICAgICAgICAgICBJbnRlcm5hbEV4dHJhY3QoYmFzZURpcmVjdG9yeSwgbnVsbCwgcGFzc3dvcmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBFeHRyYWN0cyB0aGUgZW50cnkgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0sIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vICAgUGFzc3dvcmQuICBGb3IgZXhhbXBsZSwgdGhlIGNhbGxlciBjb3VsZCBleHRyYWN0IHRvIENvbnNvbGUuT3V0LCBvcgorICAgICAgICAvLy8gICB0byBhIE1lbW9yeVN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgY2FsbGVyIGNhbiBzcGVjaWZ5IGFueSB3cml0ZS1hYmxlIHN0cmVhbSwgZm9yIGV4YW1wbGUgYSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlN5c3RlbS5JTy5GaWxlU3RyZWFtIi8+LCBhIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU3lzdGVtLklPLk1lbW9yeVN0cmVhbSIvPiwgb3IgQVNQLk5FVCdzCisgICAgICAgIC8vLyAgIDxjPlJlc3BvbnNlLk91dHB1dFN0cmVhbTwvYz4uICBUaGUgY29udGVudCB3aWxsIGJlIGRlY3J5cHRlZCBhbmQKKyAgICAgICAgLy8vICAgZGVjb21wcmVzc2VkIGFzIG5lY2Vzc2FyeS4gSWYgdGhlIGVudHJ5IGlzIGVuY3J5cHRlZCBhbmQgbm8gcGFzc3dvcmQKKyAgICAgICAgLy8vICAgaXMgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHBvc2l0aW9uIG9uIHRoZSBzdHJlYW0gaXMgbm90IHJlc2V0IGJ5IHRoaXMgbWV0aG9kIGJlZm9yZSBpdCBleHRyYWN0cy4KKyAgICAgICAgLy8vICAgWW91IG1heSB3YW50IHRvIGNhbGwgc3RyZWFtLlNlZWsoKSBiZWZvcmUgY2FsbGluZyBaaXBFbnRyeS5FeHRyYWN0KCkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPgorICAgICAgICAvLy8gICB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBlbnRyeSBzaG91bGQgYmUgZXh0cmFjdGVkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+CisgICAgICAgIC8vLyAgIFRoZSBwYXNzd29yZCB0byB1c2UgZm9yIGRlY3J5cHRpbmcgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgRXh0cmFjdFdpdGhQYXNzd29yZChTdHJlYW0gc3RyZWFtLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEludGVybmFsRXh0cmFjdChudWxsLCBzdHJlYW0sIHBhc3N3b3JkKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBPcGVucyBhIHJlYWRhYmxlIHN0cmVhbSBjb3JyZXNwb25kaW5nIHRvIHRoZSB6aXAgZW50cnkgaW4gdGhlCisgICAgICAgIC8vLyAgIGFyY2hpdmUuICBUaGUgc3RyZWFtIGRlY29tcHJlc3NlcyBhbmQgZGVjcnlwdHMgYXMgbmVjZXNzYXJ5LCBhcyBpdAorICAgICAgICAvLy8gICBpcyByZWFkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBEb3ROZXRaaXAgb2ZmZXJzIGEgdmFyaWV0eSBvZiB3YXlzIHRvIGV4dHJhY3QgZW50cmllcyBmcm9tIGEgemlwCisgICAgICAgIC8vLyAgIGZpbGUuICBUaGlzIG1ldGhvZCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZXh0cmFjdCBhbiBlbnRyeSBieQorICAgICAgICAvLy8gICByZWFkaW5nIGEgPHNlZSBjcmVmPSJTeXN0ZW0uSU8uU3RyZWFtIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgcmV0dXJuIHZhbHVlIGlzIG9mIHR5cGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJJb25pYy5DcmMuQ3JjQ2FsY3VsYXRvclN0cmVhbSIvPi4gIFVzZSBpdCBhcyB5b3Ugd291bGQgYW55CisgICAgICAgIC8vLyAgIHN0cmVhbSBmb3IgcmVhZGluZy4gIFdoZW4gYW4gYXBwbGljYXRpb24gY2FsbHMgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTdHJlYW0uUmVhZChieXRlW10sIGludCwgaW50KSIvPiBvbiB0aGF0IHN0cmVhbSwgaXQgd2lsbAorICAgICAgICAvLy8gICByZWNlaXZlIGRhdGEgZnJvbSB0aGUgemlwIGVudHJ5IHRoYXQgaXMgZGVjcnlwdGVkIGFuZCBkZWNvbXByZXNzZWQKKyAgICAgICAgLy8vICAgYXMgbmVjZXNzYXJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICA8Yz5DcmNDYWxjdWxhdG9yU3RyZWFtPC9jPiBhZGRzIG9uZSBhZGRpdGlvbmFsIGZlYXR1cmU6IGl0IGtlZXBzIGEKKyAgICAgICAgLy8vICAgQ1JDMzIgY2hlY2tzdW0gb24gdGhlIGJ5dGVzIG9mIHRoZSBzdHJlYW0gYXMgaXQgaXMgcmVhZC4gIFRoZSBDUkMKKyAgICAgICAgLy8vICAgdmFsdWUgaXMgYXZhaWxhYmxlIGluIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IklvbmljLkNyYy5DcmNDYWxjdWxhdG9yU3RyZWFtLkNyYyIvPiBwcm9wZXJ0eSBvbiB0aGUKKyAgICAgICAgLy8vICAgPGM+Q3JjQ2FsY3VsYXRvclN0cmVhbTwvYz4uICBXaGVuIHRoZSByZWFkIGlzIGNvbXBsZXRlLCB5b3VyCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uCisgICAgICAgIC8vLyAgIDxlbT5zaG91bGQ8L2VtPiBjaGVjayB0aGlzIENSQyBhZ2FpbnN0IHRoZSA8c2VlIGNyZWY9IlppcEVudHJ5LkNyYyIvPgorICAgICAgICAvLy8gICBwcm9wZXJ0eSBvbiB0aGUgPGM+WmlwRW50cnk8L2M+IHRvIHZhbGlkYXRlIHRoZSBjb250ZW50IG9mIHRoZQorICAgICAgICAvLy8gICBaaXBFbnRyeS4gWW91IGRvbid0IGhhdmUgdG8gdmFsaWRhdGUgdGhlIGVudHJ5IHVzaW5nIHRoZSBDUkMsIGJ1dAorICAgICAgICAvLy8gICB5b3Ugc2hvdWxkLCB0byB2ZXJpZnkgaW50ZWdyaXR5LiBDaGVjayB0aGUgZXhhbXBsZSBmb3IgaG93IHRvIGRvCisgICAgICAgIC8vLyAgIHRoaXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHRoZSBlbnRyeSBpcyBwcm90ZWN0ZWQgd2l0aCBhIHBhc3N3b3JkLCB0aGVuIHlvdSBuZWVkIHRvIHByb3ZpZGUKKyAgICAgICAgLy8vICAgYSBwYXNzd29yZCBwcmlvciB0byBjYWxsaW5nIDxzZWUgY3JlZj0iT3BlblJlYWRlcigpIi8+LCBlaXRoZXIgYnkKKyAgICAgICAgLy8vICAgc2V0dGluZyB0aGUgPHNlZSBjcmVmPSJQYXNzd29yZCIvPiBwcm9wZXJ0eSBvbiB0aGUgZW50cnksIG9yIHRoZQorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEZpbGUuUGFzc3dvcmQiLz4gcHJvcGVydHkgb24gdGhlIDxjPlppcEZpbGU8L2M+CisgICAgICAgIC8vLyAgIGl0c2VsZi4gT3IsIHlvdSBjYW4gdXNlIDxzZWUgY3JlZj0iT3BlblJlYWRlcihTdHJpbmcpIiAvPiwgdGhlCisgICAgICAgIC8vLyAgIG92ZXJsb2FkIG9mIE9wZW5SZWFkZXIgdGhhdCBhY2NlcHRzIGEgcGFzc3dvcmQgcGFyYW1ldGVyLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugd2FudCB0byBleHRyYWN0IGVudHJ5IGRhdGEgaW50byBhIHdyaXRlLWFibGUgc3RyZWFtIHRoYXQgaXMKKyAgICAgICAgLy8vICAgYWxyZWFkeSBvcGVuZWQsIGxpa2UgYSA8c2VlIGNyZWY9IlN5c3RlbS5JTy5GaWxlU3RyZWFtIi8+LCBkbyBub3QKKyAgICAgICAgLy8vICAgdXNlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCB1c2UgPHNlZSBjcmVmPSJFeHRyYWN0KFN0cmVhbSkiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFlvdXIgYXBwbGljYXRpb24gbWF5IHVzZSBvbmx5IG9uZSBzdHJlYW0gY3JlYXRlZCBieSBPcGVuUmVhZGVyKCkgYXQKKyAgICAgICAgLy8vICAgYSB0aW1lLCBhbmQgeW91IHNob3VsZCBub3QgY2FsbCBvdGhlciBFeHRyYWN0IG1ldGhvZHMgYmVmb3JlCisgICAgICAgIC8vLyAgIGNvbXBsZXRpbmcgeW91ciByZWFkcyBvbiBhIHN0cmVhbSBvYnRhaW5lZCBmcm9tIE9wZW5SZWFkZXIoKS4gIFRoaXMKKyAgICAgICAgLy8vICAgaXMgYmVjYXVzZSB0aGVyZSBpcyByZWFsbHkgb25seSBvbmUgc291cmNlIHN0cmVhbSBmb3IgdGhlIGNvbXByZXNzZWQKKyAgICAgICAgLy8vICAgY29udGVudC4gIEEgY2FsbCB0byBPcGVuUmVhZGVyKCkgc2Vla3MgaW4gdGhlIHNvdXJjZSBzdHJlYW0sIHRvIHRoZQorICAgICAgICAvLy8gICBiZWdpbm5pbmcgb2YgdGhlIGNvbXByZXNzZWQgY29udGVudC4gIEEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgIC8vLyAgIE9wZW5SZWFkZXIoKSBvbiBhIGRpZmZlcmVudCBlbnRyeSB3aWxsIHNlZWsgdG8gYSBkaWZmZXJlbnQgcG9zaXRpb24KKyAgICAgICAgLy8vICAgaW4gdGhlIHNvdXJjZSBzdHJlYW0sIGFzIHdpbGwgYSBjYWxsIHRvIEV4dHJhY3QoKSBvciBvbmUgb2YgaXRzCisgICAgICAgIC8vLyAgIG92ZXJsb2Fkcy4gIFRoaXMgd2lsbCBjb3JydXB0IHRoZSBzdGF0ZSBmb3IgdGhlIGRlY29tcHJlc3Npbmcgc3RyZWFtCisgICAgICAgIC8vLyAgIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gT3BlblJlYWRlcigpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICAgVGhlIDxjPk9wZW5SZWFkZXIoKTwvYz4gbWV0aG9kIHdvcmtzIG9ubHkgd2hlbiB0aGUgWmlwRW50cnkgaXMKKyAgICAgICAgLy8vICAgIG9idGFpbmVkIGZyb20gYW4gaW5zdGFuY2Ugb2YgPGM+WmlwRmlsZTwvYz4uIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cKKyAgICAgICAgLy8vICAgIGFuIGV4Y2VwdGlvbiBpZiB0aGUgWmlwRW50cnkgaXMgb2J0YWluZWQgZnJvbSBhIFppcElucHV0U3RyZWFtLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIG9wZW4gYSB6aXAgYXJjaGl2ZSwgdGhlbiByZWFkIGluIGEgbmFtZWQKKyAgICAgICAgLy8vICAgZW50cnkgdmlhIGEgc3RyZWFtLiBBZnRlciB0aGUgcmVhZCBsb29wIGlzIGNvbXBsZXRlLCB0aGUgY29kZQorICAgICAgICAvLy8gICBjb21wYXJlcyB0aGUgY2FsY3VsYXRlZCBkdXJpbmcgdGhlIHJlYWQgbG9vcCB3aXRoIHRoZSBleHBlY3RlZCBDUkMKKyAgICAgICAgLy8vICAgb24gdGhlIDxjPlppcEVudHJ5PC9jPiwgdG8gdmVyaWZ5IHRoZSBleHRyYWN0aW9uLgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZShaaXBGaWxlVG9SZWFkKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgWmlwRW50cnkgZTE9IHppcFsiRWxldmF0aW9uLm1wMyJdOworICAgICAgICAvLy8gICB1c2luZyAoSW9uaWMuWmxpYi5DcmNDYWxjdWxhdG9yU3RyZWFtIHMgPSBlMS5PcGVuUmVhZGVyKCkpCisgICAgICAgIC8vLyAgIHsKKyAgICAgICAgLy8vICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgIC8vLyAgICAgaW50IG4sIHRvdGFsQnl0ZXNSZWFkPSAwOworICAgICAgICAvLy8gICAgIGRvIHsKKyAgICAgICAgLy8vICAgICAgIG4gPSBzLlJlYWQoYnVmZmVyLDAsIGJ1ZmZlci5MZW5ndGgpOworICAgICAgICAvLy8gICAgICAgdG90YWxCeXRlc1JlYWQrPW47CisgICAgICAgIC8vLyAgICAgfSB3aGlsZSAobiZndDswKTsKKyAgICAgICAgLy8vICAgICAgaWYgKHMuQ3JjMzIgIT0gZTEuQ3JjMzIpCisgICAgICAgIC8vLyAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRoZSBaaXAgRW50cnkgZmFpbGVkIHRoZSBDUkMgQ2hlY2suICgweHswOlg4fSE9MHh7MTpYOH0pIiwgcy5DcmMzMiwgZTEuQ3JjMzIpKTsKKyAgICAgICAgLy8vICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkICE9IGUxLlVuY29tcHJlc3NlZFNpemUpCisgICAgICAgIC8vLyAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIldlIHJlYWQgYW4gdW5leHBlY3RlZCBudW1iZXIgb2YgYnl0ZXMuICh7MH0hPXsxfSkiLCB0b3RhbEJ5dGVzUmVhZCwgZTEuVW5jb21wcmVzc2VkU2l6ZSkpOworICAgICAgICAvLy8gICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyAgIFVzaW5nIHppcCBBcyBOZXcgWmlwRmlsZShaaXBGaWxlVG9SZWFkKQorICAgICAgICAvLy8gICAgICAgRGltIGUxIEFzIFppcEVudHJ5ID0gemlwLkl0ZW0oIkVsZXZhdGlvbi5tcDMiKQorICAgICAgICAvLy8gICAgICAgVXNpbmcgcyBBcyBJb25pYy5abGliLkNyY0NhbGN1bGF0b3JTdHJlYW0gPSBlMS5PcGVuUmVhZGVyCisgICAgICAgIC8vLyAgICAgICAgICAgRGltIG4gQXMgSW50ZWdlcgorICAgICAgICAvLy8gICAgICAgICAgIERpbSBidWZmZXIgQXMgQnl0ZSgpID0gTmV3IEJ5dGUoNDA5Nikge30KKyAgICAgICAgLy8vICAgICAgICAgICBEaW0gdG90YWxCeXRlc1JlYWQgQXMgSW50ZWdlciA9IDAKKyAgICAgICAgLy8vICAgICAgICAgICBEbworICAgICAgICAvLy8gICAgICAgICAgICAgICBuID0gcy5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSAodG90YWxCeXRlc1JlYWQgKyBuKQorICAgICAgICAvLy8gICAgICAgICAgIExvb3AgV2hpbGUgKG4gJmd0OyAwKQorICAgICAgICAvLy8gICAgICAgICAgIElmIChzLkNyYzMyICZsdDsmZ3Q7IGUxLkNyYzMyKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgIFRocm93IE5ldyBFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiVGhlIFppcCBFbnRyeSBmYWlsZWQgdGhlIENSQyBDaGVjay4gKDB4ezA6WDh9IT0weHsxOlg4fSkiLCBzLkNyYzMyLCBlMS5DcmMzMikpCisgICAgICAgIC8vLyAgICAgICAgICAgRW5kIElmCisgICAgICAgIC8vLyAgICAgICAgICAgSWYgKHRvdGFsQnl0ZXNSZWFkICZsdDsmZ3Q7IGUxLlVuY29tcHJlc3NlZFNpemUpIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgVGhyb3cgTmV3IEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJXZSByZWFkIGFuIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIGJ5dGVzLiAoezB9IT17MX0pIiwgdG90YWxCeXRlc1JlYWQsIGUxLlVuY29tcHJlc3NlZFNpemUpKQorICAgICAgICAvLy8gICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRW50cnkuRXh0cmFjdChTeXN0ZW0uSU8uU3RyZWFtKSIvPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIFN0cmVhbSBmb3IgcmVhZGluZy48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIElvbmljLkNyYy5DcmNDYWxjdWxhdG9yU3RyZWFtIE9wZW5SZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDkyMworICAgICAgICAgICAgaWYgKF9jb250YWluZXIuWmlwRmlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgT3BlblJlYWRlcigpIG9ubHkgd2l0aCBaaXBGaWxlLiIpOworCisgICAgICAgICAgICAvLyB1c2UgdGhlIGVudHJ5IHBhc3N3b3JkIGlmIGl0IGlzIG5vbi1udWxsLAorICAgICAgICAgICAgLy8gZWxzZSB1c2UgdGhlIHppcGZpbGUgcGFzc3dvcmQsIHdoaWNoIGlzIHBvc3NpYmx5IG51bGwKKyAgICAgICAgICAgIHJldHVybiBJbnRlcm5hbE9wZW5SZWFkZXIodGhpcy5fUGFzc3dvcmQgPz8gdGhpcy5fY29udGFpbmVyLlBhc3N3b3JkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgT3BlbnMgYSByZWFkYWJsZSBzdHJlYW0gZm9yIGFuIGVuY3J5cHRlZCB6aXAgZW50cnkgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgIC8vLyAgIFRoZSBzdHJlYW0gZGVjb21wcmVzc2VzIGFuZCBkZWNyeXB0cyBhcyBuZWNlc3NhcnksIGFzIGl0IGlzIHJlYWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZSA8c2VlIGNyZWY9Ik9wZW5SZWFkZXIoKSIvPiBtZXRob2QgZm9yCisgICAgICAgIC8vLyAgIGZ1bGwgZGV0YWlscy4gVGhpcyBvdmVybG9hZCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNwZWNpZnkgYQorICAgICAgICAvLy8gICBwYXNzd29yZCBmb3IgdGhlIDxjPlppcEVudHJ5PC9jPiB0byBiZSByZWFkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+VGhlIHBhc3N3b3JkIHRvIHVzZSBmb3IgZGVjcnlwdGluZyB0aGUgZW50cnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBTdHJlYW0gZm9yIHJlYWRpbmcuPC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBJb25pYy5DcmMuQ3JjQ2FsY3VsYXRvclN0cmVhbSBPcGVuUmVhZGVyKHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTA5MjMKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIE9wZW5SZWFkZXIoKSBvbmx5IHdpdGggWmlwRmlsZS4iKTsKKworICAgICAgICAgICAgcmV0dXJuIEludGVybmFsT3BlblJlYWRlcihwYXNzd29yZCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgSW9uaWMuQ3JjLkNyY0NhbGN1bGF0b3JTdHJlYW0gSW50ZXJuYWxPcGVuUmVhZGVyKHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVDb21wcmVzc2lvbigpOworICAgICAgICAgICAgVmFsaWRhdGVFbmNyeXB0aW9uKCk7CisgICAgICAgICAgICBTZXR1cENyeXB0b0ZvckV4dHJhY3QocGFzc3dvcmQpOworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA3OTU4CisgICAgICAgICAgICBpZiAodGhpcy5fU291cmNlICE9IFppcEVudHJ5U291cmNlLlppcEZpbGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFN0YXRlRXhjZXB0aW9uKCJZb3UgbXVzdCBjYWxsIFppcEZpbGUuU2F2ZSBiZWZvcmUgY2FsbGluZyBPcGVuUmVhZGVyIik7CisKKyAgICAgICAgICAgIC8vIExlZnRUb1JlYWQgaXMgYSBjb3VudCBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgcmVhZCAob3V0KQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3RyZWFtIEFGVEVSIGRlY29tcHJlc3Npb24gYW5kIGRlY3J5cHRpb24uCisgICAgICAgICAgICAvLyBJdCBpcyB0aGUgdW5jb21wcmVzc2VkIHNpemUsIHVubGVzcyAuLi4gdGhlcmUgaXMgbm8gY29tcHJlc3Npb24gaW4gd2hpY2gKKyAgICAgICAgICAgIC8vIGNhc2UgLi4uPyAgOjwgSSdtIG5vdCBzdXJlIHdoeSBpdCdzIG5vdCBhbHdheXMgVW5jb21wcmVzc2VkU2l6ZQorICAgICAgICAgICAgSW50NjQgTGVmdFRvUmVhZCA9IChfQ29tcHJlc3Npb25NZXRob2RfRnJvbVppcEZpbGUgPT0gKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLk5vbmUpCisgICAgICAgICAgICAgICAgPyB0aGlzLl9Db21wcmVzc2VkRmlsZURhdGFTaXplCisgICAgICAgICAgICAgICAgOiB0aGlzLlVuY29tcHJlc3NlZFNpemU7CisKKyAgICAgICAgICAgIFN0cmVhbSBpbnB1dCA9IHRoaXMuQXJjaGl2ZVN0cmVhbTsKKworICAgICAgICAgICAgdGhpcy5BcmNoaXZlU3RyZWFtLlNlZWsodGhpcy5GaWxlRGF0YVBvc2l0aW9uLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOCh0aGlzLkFyY2hpdmVTdHJlYW0pOworCisgICAgICAgICAgICBfaW5wdXREZWNyeXB0b3JTdHJlYW0gPSBHZXRFeHRyYWN0RGVjcnlwdG9yKGlucHV0KTsKKyAgICAgICAgICAgIFN0cmVhbSBpbnB1dDMgPSBHZXRFeHRyYWN0RGVjb21wcmVzc29yKF9pbnB1dERlY3J5cHRvclN0cmVhbSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW9uaWMuQ3JjLkNyY0NhbGN1bGF0b3JTdHJlYW0oaW5wdXQzLCBMZWZ0VG9SZWFkKTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHZvaWQgT25FeHRyYWN0UHJvZ3Jlc3MoSW50NjQgYnl0ZXNXcml0dGVuLCBJbnQ2NCB0b3RhbEJ5dGVzVG9Xcml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jb250YWluZXIuWmlwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgX2lvT3BlcmF0aW9uQ2FuY2VsZWQgPSBfY29udGFpbmVyLlppcEZpbGUuT25FeHRyYWN0QmxvY2sodGhpcywgYnl0ZXNXcml0dGVuLCB0b3RhbEJ5dGVzVG9Xcml0ZSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBPbkJlZm9yZUV4dHJhY3Qoc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdoZW4gaW4gdGhlIGNvbnRleHQgb2YgYSBaaXBGaWxlLkV4dHJhY3RBbGwsIHRoZSBldmVudHMgYXJlIGdlbmVyYXRlZCBmcm9tCisgICAgICAgICAgICAvLyB0aGUgWmlwRmlsZSBtZXRob2QsIG5vdCBmcm9tIHdpdGhpbiB0aGUgWmlwRW50cnkgaW5zdGFuY2UuICh3aHk/KQorICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIHN1cHByZXNzIHRoZSBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgWmlwRW50cnkgbWV0aG9kLgorICAgICAgICAgICAgaWYgKF9jb250YWluZXIuWmlwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX2NvbnRhaW5lci5aaXBGaWxlLl9pbkV4dHJhY3RBbGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW9PcGVyYXRpb25DYW5jZWxlZCA9IF9jb250YWluZXIuWmlwRmlsZS5PblNpbmdsZUVudHJ5RXh0cmFjdCh0aGlzLCBwYXRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgT25BZnRlckV4dHJhY3Qoc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdoZW4gaW4gdGhlIGNvbnRleHQgb2YgYSBaaXBGaWxlLkV4dHJhY3RBbGwsIHRoZSBldmVudHMgYXJlIGdlbmVyYXRlZCBmcm9tCisgICAgICAgICAgICAvLyB0aGUgWmlwRmlsZSBtZXRob2QsIG5vdCBmcm9tIHdpdGhpbiB0aGUgWmlwRW50cnkgaW5zdGFuY2UuICh3aHk/KQorICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIHN1cHByZXNzIHRoZSBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgWmlwRW50cnkgbWV0aG9kLgorICAgICAgICAgICAgaWYgKF9jb250YWluZXIuWmlwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX2NvbnRhaW5lci5aaXBGaWxlLl9pbkV4dHJhY3RBbGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY29udGFpbmVyLlppcEZpbGUuT25TaW5nbGVFbnRyeUV4dHJhY3QodGhpcywgcGF0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBPbkV4dHJhY3RFeGlzdGluZyhzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jb250YWluZXIuWmlwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9pb09wZXJhdGlvbkNhbmNlbGVkID0gX2NvbnRhaW5lci5aaXBGaWxlLk9uRXh0cmFjdEV4aXN0aW5nKHRoaXMsIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZWFsbHlEZWxldGUoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA3ODgxCisgICAgICAgICAgICAvLyByZXNldCBSZWFkT25seSBiaXQgaWYgbmVjZXNzYXJ5CisjaWYgTkVUQ0YKKyAgICAgICAgICAgIGlmICggKE5ldENmRmlsZS5HZXRBdHRyaWJ1dGVzKGZpbGVOYW1lKSAmICh1aW50KUZpbGVBdHRyaWJ1dGVzLlJlYWRPbmx5KSA9PSAodWludClGaWxlQXR0cmlidXRlcy5SZWFkT25seSkKKyAgICAgICAgICAgICAgICBOZXRDZkZpbGUuU2V0QXR0cmlidXRlcyhmaWxlTmFtZSwgKHVpbnQpRmlsZUF0dHJpYnV0ZXMuTm9ybWFsKTsKKyNlbGlmIFNJTFZFUkxJR0hUCisjZWxzZQorICAgICAgICAgICAgaWYgKChGaWxlLkdldEF0dHJpYnV0ZXMoZmlsZU5hbWUpICYgRmlsZUF0dHJpYnV0ZXMuUmVhZE9ubHkpID09IEZpbGVBdHRyaWJ1dGVzLlJlYWRPbmx5KQorICAgICAgICAgICAgICAgIEZpbGUuU2V0QXR0cmlidXRlcyhmaWxlTmFtZSwgRmlsZUF0dHJpYnV0ZXMuTm9ybWFsKTsKKyNlbmRpZgorICAgICAgICAgICAgRmlsZS5EZWxldGUoZmlsZU5hbWUpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVTdGF0dXMoc3RyaW5nIGZvcm1hdCwgcGFyYW1zIE9iamVjdFtdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUgIT0gbnVsbCAmJiBfY29udGFpbmVyLlppcEZpbGUuVmVyYm9zZSkgX2NvbnRhaW5lci5aaXBGaWxlLlN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZShmb3JtYXQsIGFyZ3MpOworICAgICAgICB9CisKKworICAgICAgICAvLyBQYXNzIGluIGVpdGhlciBiYXNlZGlyIG9yIHMsIGJ1dCBub3QgYm90aC4KKyAgICAgICAgLy8gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gZXh0cmFjdCB0byBhIHN0cmVhbSBvciB0byBhIGRpcmVjdG9yeSAoZmlsZXN5c3RlbSksIGJ1dCBub3QgYm90aCEKKyAgICAgICAgLy8gVGhlIFBhc3N3b3JkIHBhcmFtIGlzIHJlcXVpcmVkIGZvciBlbmNyeXB0ZWQgZW50cmllcy4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRXh0cmFjdChzdHJpbmcgYmFzZURpciwgU3RyZWFtIG91dHN0cmVhbSwgc3RyaW5nIHBhc3N3b3JkKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA3OTU4CisgICAgICAgICAgICBpZiAoX2NvbnRhaW5lciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRTdGF0ZUV4Y2VwdGlvbigiVGhpcyBlbnRyeSBpcyBhbiBvcnBoYW4iKTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAzNTUKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIEV4dHJhY3QoKSBvbmx5IHdpdGggWmlwRmlsZS4iKTsKKworICAgICAgICAgICAgX2NvbnRhaW5lci5aaXBGaWxlLlJlc2V0KGZhbHNlKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuX1NvdXJjZSAhPSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRTdGF0ZUV4Y2VwdGlvbigiWW91IG11c3QgY2FsbCBaaXBGaWxlLlNhdmUgYmVmb3JlIGNhbGxpbmcgYW55IEV4dHJhY3QgbWV0aG9kIik7CisKKyAgICAgICAgICAgIE9uQmVmb3JlRXh0cmFjdChiYXNlRGlyKTsKKyAgICAgICAgICAgIF9pb09wZXJhdGlvbkNhbmNlbGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyZWFtIG91dHB1dCA9IG51bGw7CisgICAgICAgICAgICBib29sIGZpbGVFeGlzdHNCZWZvcmVFeHRyYWN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICBib29sIGNoZWNrTGF0ZXJGb3JSZXNldERpclRpbWVzID0gZmFsc2U7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUNvbXByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgVmFsaWRhdGVFbmNyeXB0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoVmFsaWRhdGVPdXRwdXQoYmFzZURpciwgb3V0c3RyZWFtLCBvdXQgdGFyZ2V0RmlsZU5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVTdGF0dXMoImV4dHJhY3QgZGlyIHswfS4uLiIsIHRhcmdldEZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgdGhlbiB0aGUgZW50cnkgd2FzIGEgZGlyZWN0b3J5IGFuZCBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGZpcmUgdGhlIEV4dHJhY3QgRXZlbnQuCisgICAgICAgICAgICAgICAgICAgIE9uQWZ0ZXJFeHRyYWN0KGJhc2VEaXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTA2MzkKKyAgICAgICAgICAgICAgICAvLyBkbyB3ZSB3YW50IHRvIGV4dHJhY3QgdG8gYSByZWd1bGFyIGZpbGVzeXN0ZW0gZmlsZT8KKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0aW5nIHRvIGEgcHJldmlvdXNseSBleHRhbnQgZmlsZS4gVGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHNwZWNpZnkgYmVqYXZpb3IgZm9yIHRoYXQgY2FzZTogb3ZlcndyaXRlLCBkb24ndAorICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdGUsIGFuZCB0aHJvdy4gIEFsc28sIGlmIHRoZSBmaWxlIGV4aXN0cyBwcmlvciB0bworICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0aW9uLCBpdCBhZmZlY3RzIGV4Y2VwdGlvbiBoYW5kbGluZzogd2hldGhlciB0byBkZWxldGUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBvZiBleHRyYWN0aW9uIG9yIG5vdC4gIFRoaXMgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHBhc3N3b3JkIGNoZWNrIGlzIGRvbmUsIGJlY2F1c2UgcGFzc3dvcmQgY2hlY2sgbWF5CisgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGEgQmFkUGFzc3dvcmRFeGNlcHRpb24sIHdoaWNoIHRyaWdnZXJzIHRoZSBjYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmVpbiB0aGUgZXh0YW50IGZpbGUgbWF5IGJlIGRlbGV0ZWQgaWYgbm90IGZsYWdnZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlLWV4aXN0aW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHModGFyZ2V0RmlsZU5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlRXhpc3RzQmVmb3JlRXh0cmFjdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBDaGVja0V4dHJhY3RFeGlzdGluZ0ZpbGUoYmFzZURpciwgdGFyZ2V0RmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjID09IDIpIGdvdG8gRXhpdFRyeTsgLy8gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMSkgcmV0dXJuOyAvLyBkbyBub3Qgb3ZlcndyaXRlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiBubyBwYXNzd29yZCBleHBsaWNpdGx5IHNwZWNpZmllZCwgdXNlIHRoZSBwYXNzd29yZCBvbiB0aGUgZW50cnkgaXRzZWxmLAorICAgICAgICAgICAgICAgIC8vIG9yIG9uIHRoZSB6aXBmaWxlIGl0c2VsZi4KKyAgICAgICAgICAgICAgICBzdHJpbmcgcCA9IHBhc3N3b3JkID8/IHRoaXMuX1Bhc3N3b3JkID8/IHRoaXMuX2NvbnRhaW5lci5QYXNzd29yZDsKKyAgICAgICAgICAgICAgICBpZiAoX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgIT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRQYXNzd29yZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBTZXR1cENyeXB0b0ZvckV4dHJhY3QocCk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBzZXQgdXAgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RhdHVzKCJleHRyYWN0IGZpbGUgezB9Li4uIiwgdGFyZ2V0RmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0YXJnZXRGaWxlTmFtZSArPSAiLnRtcCI7CisgICAgICAgICAgICAgICAgICAgIHZhciBkaXJOYW1lID0gUGF0aC5HZXREaXJlY3RvcnlOYW1lKHRhcmdldEZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSB0YXJnZXQgcGF0aCBleGlzdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKGRpck5hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgdGhlIGRpcmVjdG9yeSBoZXJlLCBidXQgd2UgZG8gbm90IHNldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS9tb2RpZmllZC9hY2Nlc3NlZCB0aW1lcyBvbiBpdCBiZWNhdXNlIGl0IGlzIGJlaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIGltcGxpY2l0bHksIG5vdCBleHBsY2l0bHkuIFRoZXJlJ3Mgbm8gZW50cnkgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB6aXAgYXJjaGl2ZSBmb3IgdGhlIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoZGlyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MjY0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5aaXBGaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMYXRlckZvclJlc2V0RGlyVGltZXMgPSBfY29udGFpbmVyLlppcEZpbGUuX2luRXh0cmFjdEFsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUuQ3JlYXRlKENyZWF0ZU5ldykgd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGUuCisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlU3RyZWFtKHRhcmdldEZpbGVOYW1lLCBGaWxlTW9kZS5DcmVhdGVOZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXcml0ZVN0YXR1cygiZXh0cmFjdCBlbnRyeSB7MH0gdG8gc3RyZWFtLi4uIiwgRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRzdHJlYW07CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoX2lvT3BlcmF0aW9uQ2FuY2VsZWQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdFRyeTsKKworICAgICAgICAgICAgICAgIEludDMyIEFjdHVhbENyYzMyID0gRXh0cmFjdE9uZShvdXRwdXQpOworCisgICAgICAgICAgICAgICAgaWYgKF9pb09wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXRUcnk7CisKKyAgICAgICAgICAgICAgICBWZXJpZnlDcmNBZnRlckV4dHJhY3QoQWN0dWFsQ3JjMzIpOworCisgICAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDYzOQorICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGZpbGUgdG8gcGVybWFuZW50IGhvbWUKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRtcE5hbWUgPSB0YXJnZXRGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHpvbWJpZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldEZpbGVOYW1lID0gdG1wTmFtZS5TdWJzdHJpbmcoMCx0bXBOYW1lLkxlbmd0aC00KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUV4aXN0c0JlZm9yZUV4dHJhY3Rpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIEFWIHByb2dyYW0gbWF5IGhvbGQgdGhlIHRhcmdldCBmaWxlIG9wZW4sIHdoaWNoIG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlLkRlbGV0ZSgpIHdpbGwgc3VjY2VlZCwgdGhvdWdoIHRoZSBhY3R1YWwgZGVsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbWFpbnMgcGVuZGluZy4gVGhpcyB3aWxsIHByZXZlbnQgYSBzdWJzZXF1ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlLk1vdmUoKSBmcm9tIHN1Y2NlZWRpbmcuIFRvIGF2b2lkIHRoaXMsIHdoZW4gdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3RzLCB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQgaW4gMyBzdGVwczoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgMS4gcmVuYW1lIHRoZSBleGlzdGluZyBmaWxlIHRvIGEgem9tYmllIG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgMi4gcmVuYW1lIHRoZSBleHRyYWN0ZWQgZmlsZSBmcm9tIHRoZSB0ZW1wIG5hbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICB0aGUgdGFyZ2V0IGZpbGUgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAzLiBkZWxldGUgdGhlIHpvbWJpZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICB6b21iaWUgPSB0YXJnZXRGaWxlTmFtZSArICIuUGVuZGluZ092ZXJ3cml0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLk1vdmUodGFyZ2V0RmlsZU5hbWUsIHpvbWJpZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBGaWxlLk1vdmUodG1wTmFtZSwgdGFyZ2V0RmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBfU2V0VGltZXModGFyZ2V0RmlsZU5hbWUsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh6b21iaWUgIT0gbnVsbCAmJiBGaWxlLkV4aXN0cyh6b21iaWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgUmVhbGx5RGVsZXRlKHpvbWJpZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gODI2NAorICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tMYXRlckZvclJlc2V0RGlyVGltZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgc29ydCBvZiBhIGhhY2suICBXaGF0IEkgZG8gaGVyZSBpcyBzZXQgdGhlIHRpbWUgb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZGlyZWN0b3J5LCBldmVyeSB0aW1lIGEgZmlsZSBpcyBleHRyYWN0ZWQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuICBJZiB0aGVyZSBpcyBhIGRpcmVjdG9yeSB3aXRoIDEwMDAgZmlsZXMsIHRoZW4gSSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIG9uIHRoZSBkaXIsIDEwMDAgdGltZXMuIFRoaXMgYWxsb3dzIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGhhdmUgdGltZXMgdGhhdCByZWZsZWN0IHRoZSBhY3R1YWwgdGltZSBvbiB0aGUgZW50cnkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB6aXAgYXJjaGl2ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nLkNvbnRhaW5zIGlzIG5vdCBhdmFpbGFibGUgb24gLk5FVCBDRiAyLjAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkZpbGVOYW1lLkluZGV4T2YoJy8nKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGlybmFtZSA9IFBhdGguR2V0RGlyZWN0b3J5TmFtZSh0aGlzLkZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyLlppcEZpbGVbZGlybmFtZV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TZXRUaW1lcyhQYXRoLkdldERpcmVjdG9yeU5hbWUodGFyZ2V0RmlsZU5hbWUpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3OTI2IC0gdmVyc2lvbiBtYWRlIGJ5IE9TIGNhbiBiZSB6ZXJvIG9yIDEwCisgICAgICAgICAgICAgICAgICAgIGlmICgoX1ZlcnNpb25NYWRlQnkgJiAweEZGMDApID09IDB4MGEwMCB8fCAoX1ZlcnNpb25NYWRlQnkgJiAweEZGMDApID09IDB4MDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE5ldENmRmlsZS5TZXRBdHRyaWJ1dGVzKHRhcmdldEZpbGVOYW1lLCAodWludClfRXh0ZXJuYWxGaWxlQXR0cnMpOworCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3MDcxCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IGFwcGx5IGF0dHJpYnV0ZXMgaWYgdGhleSBhcmUgcmVsZXZhbnQgdG8gdGhlIE5URlMKKyAgICAgICAgICAgICAgICAgICAgLy8gT1MuICBNdXN0IGRvIHRoaXMgTEFTVCBiZWNhdXNlIGl0IG1heSBpbnZvbHZlIGEgUmVhZE9ubHkgYml0LAorICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBwcmV2ZW50IHVzIGZyb20gc2V0dGluZyB0aGUgdGltZSwgZXRjLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3OTI2IC0gdmVyc2lvbiBtYWRlIGJ5IE9TIGNhbiBiZSB6ZXJvIChGQVQpIG9yIDEwCisgICAgICAgICAgICAgICAgICAgIC8vIChOVEZTKQorICAgICAgICAgICAgICAgICAgICBpZiAoKF9WZXJzaW9uTWFkZUJ5ICYgMHhGRjAwKSA9PSAweDBhMDAgfHwgKF9WZXJzaW9uTWFkZUJ5ICYgMHhGRjAwKSA9PSAweDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLlNldEF0dHJpYnV0ZXModGFyZ2V0RmlsZU5hbWUsIChGaWxlQXR0cmlidXRlcylfRXh0ZXJuYWxGaWxlQXR0cnMpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgT25BZnRlckV4dHJhY3QoYmFzZURpcik7CisKKyAgICAgICAgICAgICAgICBFeGl0VHJ5OiA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pb09wZXJhdGlvbkNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lvT3BlcmF0aW9uQ2FuY2VsZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSBvdXRwdXQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLiBJZiB0aGUgZmlsZSBleGlzdHMsIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VlIGlmIGl0IGV4aXN0ZWQgYmVmb3JlIHdlIHRyaWVkIGV4dHJhY3RpbmcuICBJZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGRpZCBub3QsIGF0dGVtcHQgdG8gcmVtb3ZlIHRoZSB0YXJnZXQgZmlsZS4gVGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBhIHNtYWxsIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGV4aXN0aW5nIGZpbGUgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBleHRyYWN0ZWQgc3VjY2Vzc2Z1bGx5LCBvdmVyd3JpdGluZyBhIHByZXZpb3VzbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBmaWxlLCBhbmQgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYWZ0ZXIgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBiZWZvcmUgZmluYWwgY29tcGxldGlvbiAoc2V0dGluZyB0aW1lcywgZXRjKS4gSW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGNhc2UgdGhlIGZpbGUgd2lsbCByZW1haW4sIGV2ZW4gdGhvdWdoIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBvY2N1cnJlZC4gIE5vdGhpbmcgdG8gYmUgZG9uZSBhYm91dCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHModGFyZ2V0RmlsZU5hbWUpICYmICFmaWxlRXhpc3RzQmVmb3JlRXh0cmFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUodGFyZ2V0RmlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworI2lmIE5PVAorICAgICAgICBpbnRlcm5hbCB2b2lkIENhbGNXaW5aaXBBZXNNYWMoU3RyZWFtIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCB8fAorICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0IGlzIFdpblppcEFlc0NpcGhlclN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgd3pzID0gaW5wdXQgYXMgV2luWmlwQWVzQ2lwaGVyU3RyZWFtOworCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXQgaXMgSW9uaWMuWmxpYi5DcmNDYWxjdWxhdG9yU3RyZWFtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeHh4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworCisgICAgICAgIGludGVybmFsIHZvaWQgVmVyaWZ5Q3JjQWZ0ZXJFeHRyYWN0KEludDMyIGFjdHVhbENyYzMyKQorICAgICAgICB7CisKKyNpZiBBRVNDUllQVE8KKyAgICAgICAgICAgICAgICAvLyBBZnRlciBleHRyYWN0aW5nLCBWYWxpZGF0ZSB0aGUgQ1JDMzIKKyAgICAgICAgICAgICAgICBpZiAoYWN0dWFsQ3JjMzIgIT0gX0NyYzMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ1JDIGlzIG5vdCBtZWFuaW5nZnVsIHdpdGggV2luWmlwQUVTIGFuZCBBRVMgbWV0aG9kIDIgKEFFLTIpCisgICAgICAgICAgICAgICAgICAgIGlmICgoRW5jcnlwdGlvbiAhPSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gIT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBfV2luWmlwQWVzTWV0aG9kICE9IDB4MDIpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkQ3JjRXhjZXB0aW9uKCJDUkMgZXJyb3I6IHRoZSBmaWxlIGJlaW5nIGV4dHJhY3RlZCBhcHBlYXJzIHRvIGJlIGNvcnJ1cHRlZC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoIkV4cGVjdGVkIDB4ezA6WDh9LCBBY3R1YWwgMHh7MTpYOH0iLCBfQ3JjMzIsIGFjdHVhbENyYzMyKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWdub3JlIE1BQyBpZiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBpcyB6ZXJvCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuVW5jb21wcmVzc2VkU2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIE1BQworICAgICAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMTI4IHx8CisgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXaW5aaXBBZXNDaXBoZXJTdHJlYW0gd3pzID0gX2lucHV0RGVjcnlwdG9yU3RyZWFtIGFzIFdpblppcEFlc0NpcGhlclN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgX2Flc0NyeXB0b19mb3JFeHRyYWN0LkNhbGN1bGF0ZWRNYWMgPSB3enMuRmluYWxBdXRoZW50aWNhdGlvbjsKKworICAgICAgICAgICAgICAgICAgICBfYWVzQ3J5cHRvX2ZvckV4dHJhY3QuUmVhZEFuZFZlcmlmeU1hYyh0aGlzLkFyY2hpdmVTdHJlYW0pOyAvLyB0aHJvd3MgaWYgTUFDIGlzIGJhZAorICAgICAgICAgICAgICAgICAgICAvLyBzaWRlIGVmZmVjdDogYWR2YW5jZXMgZmlsZSBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICB9CisKKworCisKKyNlbHNlCisgICAgICAgICAgICBpZiAoYWN0dWFsQ3JjMzIgIT0gX0NyYzMyKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRDcmNFeGNlcHRpb24oIkNSQyBlcnJvcjogdGhlIGZpbGUgYmVpbmcgZXh0cmFjdGVkIGFwcGVhcnMgdG8gYmUgY29ycnVwdGVkLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoIkV4cGVjdGVkIDB4ezA6WDh9LCBBY3R1YWwgMHh7MTpYOH0iLCBfQ3JjMzIsIGFjdHVhbENyYzMyKSk7CisjZW5kaWYKKyAgICAgICAgfQorCisKKworCisgICAgICAgIHByaXZhdGUgaW50IENoZWNrRXh0cmFjdEV4aXN0aW5nRmlsZShzdHJpbmcgYmFzZURpciwgc3RyaW5nIHRhcmdldEZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbG9vcCA9IDA7CisgICAgICAgICAgICAvLyByZXR1cm5zOiAwID09IGV4dHJhY3QsIDEgPSBkb24ndCwgMiA9IGNhbmNlbAorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKEV4dHJhY3RFeGlzdGluZ0ZpbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uT3ZlcndyaXRlU2lsZW50bHk6CisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0YXR1cygidGhlIGZpbGUgezB9IGV4aXN0czsgd2lsbCBvdmVyd3JpdGUgaXQuLi4iLCB0YXJnZXRGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uRG9Ob3RPdmVyd3JpdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0YXR1cygidGhlIGZpbGUgezB9IGV4aXN0czsgbm90IGV4dHJhY3RpbmcgZW50cnkuLi4iLCBGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBPbkFmdGVyRXh0cmFjdChiYXNlRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5JbnZva2VFeHRyYWN0UHJvZ3Jlc3NFdmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29wPjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJUaGUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIiwgdGFyZ2V0RmlsZU5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9uRXh0cmFjdEV4aXN0aW5nKGJhc2VEaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pb09wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIGFyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLlRocm93OgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJUaGUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIiwgdGFyZ2V0RmlsZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHRydWUpOworICAgICAgICB9CisKKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9DaGVja1JlYWQoaW50IG5ieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5ieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZWFkRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoImJhZCByZWFkIG9mIGVudHJ5IHswfSBmcm9tIGNvbXByZXNzZWQgYXJjaGl2ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZpbGVOYW1lKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dERlY3J5cHRvclN0cmVhbTsKKworICAgICAgICBwcml2YXRlIEludDMyIEV4dHJhY3RPbmUoU3RyZWFtIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgSW50MzIgQ3JjUmVzdWx0ID0gMDsKKyAgICAgICAgICAgIFN0cmVhbSBpbnB1dCA9IHRoaXMuQXJjaGl2ZVN0cmVhbTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGZvciB3b3JraXRlbSA4MDk4CisgICAgICAgICAgICAgICAgaW5wdXQuU2Vlayh0aGlzLkZpbGVEYXRhUG9zaXRpb24sIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgoaW5wdXQpOworCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQnVmZmVyU2l6ZV07CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgZXh0cmFjdGlvbiBwcm9jZXNzIHZhcmllcyBkZXBlbmRpbmcgb24gaG93IHRoZSBlbnRyeSB3YXMKKyAgICAgICAgICAgICAgICAvLyBzdG9yZWQuICBJdCBjb3VsZCBoYXZlIGJlZW4gZW5jcnlwdGVkLCBhbmQgaXQgY29vdWxkIGhhdmUKKyAgICAgICAgICAgICAgICAvLyBiZWVuIGNvbXByZXNzZWQsIG9yIGJvdGgsIG9yIG5laXRoZXIuIFNvIHdlIG5lZWQgdG8gY2hlY2sKKyAgICAgICAgICAgICAgICAvLyBib3RoIHRoZSBlbmNyeXB0aW9uIGZsYWcgYW5kIHRoZSBjb21wcmVzc2lvbiBmbGFnLCBhbmQgdGFrZQorICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXIgYWN0aW9uIGluIGFsbCBjYXNlcy4KKworICAgICAgICAgICAgICAgIEludDY0IExlZnRUb1JlYWQgPSAoX0NvbXByZXNzaW9uTWV0aG9kX0Zyb21aaXBGaWxlICE9IChzaG9ydClDb21wcmVzc2lvbk1ldGhvZC5Ob25lKQorICAgICAgICAgICAgICAgICAgICA/IHRoaXMuVW5jb21wcmVzc2VkU2l6ZQorICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX0NvbXByZXNzZWRGaWxlRGF0YVNpemU7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBzdHJlYW0gdGhhdCBlaXRoZXIgZGVjcnlwdHMgb3Igbm90LgorICAgICAgICAgICAgICAgIF9pbnB1dERlY3J5cHRvclN0cmVhbSA9IEdldEV4dHJhY3REZWNyeXB0b3IoaW5wdXQpOworCisgICAgICAgICAgICAgICAgU3RyZWFtIGlucHV0MyA9IEdldEV4dHJhY3REZWNvbXByZXNzb3IoIF9pbnB1dERlY3J5cHRvclN0cmVhbSApOworCisgICAgICAgICAgICAgICAgSW50NjQgYnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgICAgICAvLyBBcyB3ZSByZWFkLCB3ZSBtYXliZSBkZWNyeXB0LCBhbmQgdGhlbiB3ZSBtYXliZSBkZWNvbXByZXNzLiBUaGVuIHdlIHdyaXRlLgorICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgczEgPSBuZXcgSW9uaWMuQ3JjLkNyY0NhbGN1bGF0b3JTdHJlYW0oaW5wdXQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChMZWZ0VG9SZWFkID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Db25zb2xlLldyaXRlTGluZSgiRXh0cmFjdE9uZTogTGVmdFRvUmVhZCB7MH0iLCBMZWZ0VG9SZWFkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FzdGluZyBMZWZ0VG9SZWFkIGRvd24gdG8gYW4gaW50IGlzIG9rIGhlcmUgaW4gdGhlIGVsc2UgY2xhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IG9ubHkgaGFwcGVucyB3aGVuIGl0IGlzIGxlc3MgdGhhbiBieXRlcy5MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBtdWNoIGxlc3MgdGhhbiBNQVhfSU5ULgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IChMZWZ0VG9SZWFkID4gYnl0ZXMuTGVuZ3RoKSA/IGJ5dGVzLkxlbmd0aCA6IChpbnQpTGVmdFRvUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gczEuUmVhZChieXRlcywgMCwgbGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBjaGVjayBkYXRhIHJlYWQgLSBlc3NlbnRpYWwgZm9yIGRldGVjdGluZyBjb3JydXB0IHppcCBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgX0NoZWNrUmVhZChuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKGJ5dGVzLCAwLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlZnRUb1JlYWQgLT0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiArPSBuOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIHRoZSBwcm9ncmVzcyBldmVudCwgY2hlY2sgZm9yIGNhbmNlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIE9uRXh0cmFjdFByb2dyZXNzKGJ5dGVzV3JpdHRlbiwgVW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lvT3BlcmF0aW9uQ2FuY2VsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDcmNSZXN1bHQgPSBzMS5DcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB6c3MgPSBpbnB1dCBhcyBaaXBTZWdtZW50ZWRTdHJlYW07CisgICAgICAgICAgICAgICAgaWYgKHpzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICB6c3MuQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGlzcG9zZSBpdAorICAgICAgICAgICAgICAgICAgICB6c3MuRGlzcG9zZSgpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIF9hcmNoaXZlU3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBDcmNSZXN1bHQ7CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgU3RyZWFtIEdldEV4dHJhY3REZWNvbXByZXNzb3IoU3RyZWFtIGlucHV0MikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZ2V0IGEgc3RyZWFtIHRoYXQgZWl0aGVyIGRlY29tcHJlc3NlcyBvciBub3QuCisgICAgICAgICAgICBzd2l0Y2ggKF9Db21wcmVzc2lvbk1ldGhvZF9Gcm9tWmlwRmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIChzaG9ydClDb21wcmVzc2lvbk1ldGhvZC5Ob25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQyOworICAgICAgICAgICAgICAgIGNhc2UgKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLkRlZmxhdGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW9uaWMuWmxpYi5EZWZsYXRlU3RyZWFtKGlucHV0MiwgSW9uaWMuWmxpYi5Db21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcywgdHJ1ZSk7CisjaWYgQlpJUAorICAgICAgICAgICAgICAgIGNhc2UgKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLkJaaXAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElvbmljLkJaaXAyLkJaaXAySW5wdXRTdHJlYW0oaW5wdXQyLCB0cnVlKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisKKworICAgICAgICBpbnRlcm5hbCBTdHJlYW0gR2V0RXh0cmFjdERlY3J5cHRvcihTdHJlYW0gaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmVhbSBpbnB1dDIgPSBudWxsOworICAgICAgICAgICAgaWYgKF9FbmNyeXB0aW9uX0Zyb21aaXBGaWxlID09IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrKQorICAgICAgICAgICAgICAgIGlucHV0MiA9IG5ldyBaaXBDaXBoZXJTdHJlYW0oaW5wdXQsIF96aXBDcnlwdG9fZm9yRXh0cmFjdCwgQ3J5cHRvTW9kZS5EZWNyeXB0KTsKKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgZWxzZSBpZiAoX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMxMjggfHwKKyAgICAgICAgICAgICAgICAgX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICAgICAgaW5wdXQyID0gbmV3IFdpblppcEFlc0NpcGhlclN0cmVhbShpbnB1dCwgX2Flc0NyeXB0b19mb3JFeHRyYWN0LCBfQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSwgQ3J5cHRvTW9kZS5EZWNyeXB0KTsKKyNlbmRpZgorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5wdXQyID0gaW5wdXQ7CisKKyAgICAgICAgICAgIHJldHVybiBpbnB1dDI7CisgICAgICAgIH0KKworCisKKworICAgICAgICBpbnRlcm5hbCB2b2lkIF9TZXRUaW1lcyhzdHJpbmcgZmlsZU9yRGlyZWN0b3J5LCBib29sIGlzRmlsZSkKKyAgICAgICAgeworI2lmIFNJTFZFUkxJR0hUCisgICAgICAgICAgICAgICAgICAgIC8vIHB1bnQgb24gc2V0dGluZyBmaWxlIHRpbWVzCisjZWxzZQorICAgICAgICAgICAgLy8gd29ya2l0ZW0gODgwNzoKKyAgICAgICAgICAgIC8vIEJlY2F1c2Ugc2V0dGluZyB0aGUgdGltZSBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBhIGZhdGFsIGVycm9yLAorICAgICAgICAgICAgLy8gYW5kIGJlY2F1c2Ugb3RoZXIgYXBwbGljYXRpb25zIGNhbiBpbnRlcmZlcmUgd2l0aCB0aGUgc2V0dGluZworICAgICAgICAgICAgLy8gb2YgYSB0aW1lIG9uIGEgZGlyZWN0b3J5LCB3ZSdyZSBnb2luZyB0byBzd2FsbG93IElPIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIC8vIGluIHRoaXMgbWV0aG9kLgorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX250ZnNUaW1lc0FyZVNldCkKKyAgICAgICAgICAgICAgICB7CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzk0NDogc2V0IHRpbWUgc2hvdWxkIG5vdCBiZSBhIGZhdGFsIGVycm9yIG9uIENGCisgICAgICAgICAgICAgICAgICAgIGludCByYyA9IE5ldENmRmlsZS5TZXRUaW1lcyhmaWxlT3JEaXJlY3RvcnksIF9DdGltZSwgX0F0aW1lLCBfTXRpbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJjICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RhdHVzKCJXYXJuaW5nOiBTZXRUaW1lcyBmYWlsZWQuICBlbnRyeSh7MH0pICBmaWxlKHsxfSkgIHJjKHsyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5hbWUsIGZpbGVPckRpcmVjdG9yeSwgcmMpOworICAgICAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaWxlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGV4dHJhY3Qgd2FzIGNhbmNlbGxlZCwgaW4gd2hpY2ggY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGZpbGVPckRpcmVjdG9yeSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5TZXRDcmVhdGlvblRpbWVVdGMoZmlsZU9yRGlyZWN0b3J5LCBfQ3RpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuU2V0TGFzdEFjY2Vzc1RpbWVVdGMoZmlsZU9yRGlyZWN0b3J5LCBfQXRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuU2V0TGFzdFdyaXRlVGltZVV0YyhmaWxlT3JEaXJlY3RvcnksIF9NdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGV4dHJhY3Qgd2FzIGNhbmNlbGxlZCwgaW4gd2hpY2ggY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhmaWxlT3JEaXJlY3RvcnkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeS5TZXRDcmVhdGlvblRpbWVVdGMoZmlsZU9yRGlyZWN0b3J5LCBfQ3RpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeS5TZXRMYXN0QWNjZXNzVGltZVV0YyhmaWxlT3JEaXJlY3RvcnksIF9BdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5LlNldExhc3RXcml0ZVRpbWVVdGMoZmlsZU9yRGlyZWN0b3J5LCBfTXRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNjE5MQorICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBBZGp1c3RlZExhc3RNb2RpZmllZCA9IElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuQWRqdXN0VGltZV9SZXZlcnNlKExhc3RNb2RpZmllZCk7CisKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBOZXRDZkZpbGUuU2V0TGFzdFdyaXRlVGltZShmaWxlT3JEaXJlY3RvcnksIEFkanVzdGVkTGFzdE1vZGlmaWVkKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHJjICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RhdHVzKCJXYXJuaW5nOiBTZXRMYXN0V3JpdGVUaW1lIGZhaWxlZC4gIGVudHJ5KHswfSkgIGZpbGUoezF9KSAgcmMoezJ9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZSwgZmlsZU9yRGlyZWN0b3J5LCByYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLlNldExhc3RXcml0ZVRpbWUoZmlsZU9yRGlyZWN0b3J5LCBBZGp1c3RlZExhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeS5TZXRMYXN0V3JpdGVUaW1lKGZpbGVPckRpcmVjdG9yeSwgQWRqdXN0ZWRMYXN0TW9kaWZpZWQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiBpb2V4YzEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVTdGF0dXMoImZhaWxlZCB0byBzZXQgdGltZSBvbiB7MH06IHsxfSIsIGZpbGVPckRpcmVjdG9yeSwgaW9leGMxLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKworCisgICAgICAgICNyZWdpb24gU3VwcG9ydCBtZXRob2RzCisKKworICAgICAgICAvLyB3b3JraXRlbSA3OTY4CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFVuc3VwcG9ydGVkQWxnb3JpdGhtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBhbGcgPSBTdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChfVW5zdXBwb3J0ZWRBbGdvcml0aG1JZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsZyA9ICItLSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY2MDE6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGcgPSAiREVTIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjYwMjogLy8gLSBSQzIgKHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgPCA1LjIpCisgICAgICAgICAgICAgICAgICAgICAgICBhbGcgPSAiUkMyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjYwMzogLy8gLSAzREVTIDE2OAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnID0gIjNERVMtMTY4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjYwOTogLy8gLSAzREVTIDExMgorICAgICAgICAgICAgICAgICAgICAgICAgYWxnID0gIjNERVMtMTEyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjYwRTogLy8gLSBBRVMgMTI4CisgICAgICAgICAgICAgICAgICAgICAgICBhbGcgPSAiUEtXYXJlIEFFUzEyOCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY2MEY6IC8vIC0gQUVTIDE5MgorICAgICAgICAgICAgICAgICAgICAgICAgYWxnID0gIlBLV2FyZSBBRVMxOTIiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2NjEwOiAvLyAtIEFFUyAyNTYKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsZyA9ICJQS1dhcmUgQUVTMjU2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjcwMjogLy8gLSBSQzIgKHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgPj0gNS4yKQorICAgICAgICAgICAgICAgICAgICAgICAgYWxnID0gIlJDMiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY3MjA6IC8vIC0gQmxvd2Zpc2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsZyA9ICJCbG93ZmlzaCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY3MjE6IC8vIC0gVHdvZmlzaAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnID0gIlR3b2Zpc2giOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2ODAxOiAvLyAtIFJDNAorICAgICAgICAgICAgICAgICAgICAgICAgYWxnID0gIlJDNCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweEZGRkY6IC8vIC0gVW5rbm93biBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsZyA9IFN0cmluZy5Gb3JtYXQoIlVua25vd24gKDB4ezA6WDR9KSIsIF9VbnN1cHBvcnRlZEFsZ29yaXRobUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYWxnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2l0ZW0gNzk2OAorICAgICAgICBwcml2YXRlIHN0cmluZyBVbnN1cHBvcnRlZENvbXByZXNzaW9uTWV0aG9kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBtZXRoID0gU3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICAgIHN3aXRjaCAoKGludClfQ29tcHJlc3Npb25NZXRob2QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRoID0gIlN0b3JlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRoID0gIlNocmluayI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aCA9ICJERUZMQVRFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRoID0gIkRlZmxhdGU2NCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGggPSAiQlpJUDIiOyAvLyBvbmx5IGlmIEJaSVAgbm90IGNvbXBpbGVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGggPSAiTFpNQSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGggPSAiTFo3NyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA5ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGggPSAiUFBNZCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGggPSBTdHJpbmcuRm9ybWF0KCJVbmtub3duICgweHswOlg0fSkiLCBfQ29tcHJlc3Npb25NZXRob2QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtZXRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCB2b2lkIFZhbGlkYXRlRW5jcnlwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uICE9IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrICYmCisjaWYgQUVTQ1JZUFRPCisgRW5jcnlwdGlvbiAhPSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCAmJgorICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gIT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYgJiYKKyNlbmRpZgorIEVuY3J5cHRpb24gIT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc5NjgKKyAgICAgICAgICAgICAgICBpZiAoX1Vuc3VwcG9ydGVkQWxnb3JpdGhtSWQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJDYW5ub3QgZXh0cmFjdDogRW50cnkgezB9IGlzIGVuY3J5cHRlZCB3aXRoIGFuIGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkIGJ5IERvdE5ldFppcDogezF9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lLCBVbnN1cHBvcnRlZEFsZ29yaXRobSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJDYW5ub3QgZXh0cmFjdDogRW50cnkgezB9IHVzZXMgYW4gdW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG0gKHsxOlgyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5hbWUsIChpbnQpRW5jcnlwdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVDb21wcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoX0NvbXByZXNzaW9uTWV0aG9kX0Zyb21aaXBGaWxlICE9IChzaG9ydClDb21wcmVzc2lvbk1ldGhvZC5Ob25lKSAmJgorICAgICAgICAgICAgICAgIChfQ29tcHJlc3Npb25NZXRob2RfRnJvbVppcEZpbGUgIT0gKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLkRlZmxhdGUpCisjaWYgQlpJUAorICAgICAgICAgICAgICAgICYmIChfQ29tcHJlc3Npb25NZXRob2RfRnJvbVppcEZpbGUgIT0gKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLkJaaXAyKQorI2VuZGlmCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiRW50cnkgezB9IHVzZXMgYW4gdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICgweHsxOlgyfSwgezJ9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5hbWUsIF9Db21wcmVzc2lvbk1ldGhvZF9Gcm9tWmlwRmlsZSwgVW5zdXBwb3J0ZWRDb21wcmVzc2lvbk1ldGhvZCkpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0dXBDcnlwdG9Gb3JFeHRyYWN0KHN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAocGFzc3dvcmQgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgaWYgKF9FbmNyeXB0aW9uX0Zyb21aaXBGaWxlID09IEVuY3J5cHRpb25BbGdvcml0aG0uTm9uZSkgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Qa3ppcFdlYWspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIk1pc3NpbmcgcGFzc3dvcmQuIik7CisKKyAgICAgICAgICAgICAgICB0aGlzLkFyY2hpdmVTdHJlYW0uU2Vlayh0aGlzLkZpbGVEYXRhUG9zaXRpb24gLSAxMiwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOCh0aGlzLkFyY2hpdmVTdHJlYW0pOworICAgICAgICAgICAgICAgIF96aXBDcnlwdG9fZm9yRXh0cmFjdCA9IFppcENyeXB0by5Gb3JSZWFkKHBhc3N3b3JkLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgZWxzZSBpZiAoX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMxMjggfHwKKyAgICAgICAgICAgICAgICAgX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIk1pc3NpbmcgcGFzc3dvcmQuIik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBXaW5aaXBBZXNDcnlwdG8gb2JqZWN0IGluIHBsYWNlLCB1c2UgaXQuCisgICAgICAgICAgICAgICAgLy8gSXQgY2FuIGJlIHNldCB1cCBpbiB0aGUgUmVhZERpckVudHJ5KCksIG9yIGR1cmluZyBhIHByZXZpb3VzIEV4dHJhY3QuCisgICAgICAgICAgICAgICAgaWYgKF9hZXNDcnlwdG9fZm9yRXh0cmFjdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Flc0NyeXB0b19mb3JFeHRyYWN0LlBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplT2ZTYWx0QW5kUHYgPSBHZXRMZW5ndGhPZkNyeXB0b0hlYWRlckJ5dGVzKF9FbmNyeXB0aW9uX0Zyb21aaXBGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5BcmNoaXZlU3RyZWFtLlNlZWsodGhpcy5GaWxlRGF0YVBvc2l0aW9uIC0gc2l6ZU9mU2FsdEFuZFB2LCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgodGhpcy5BcmNoaXZlU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGtleXN0cmVuZ3RoID0gR2V0S2V5U3RyZW5ndGhJbkJpdHMoX0VuY3J5cHRpb25fRnJvbVppcEZpbGUpOworICAgICAgICAgICAgICAgICAgICBfYWVzQ3J5cHRvX2ZvckV4dHJhY3QgPSBXaW5aaXBBZXNDcnlwdG8uUmVhZEZyb21TdHJlYW0ocGFzc3dvcmQsIGtleXN0cmVuZ3RoLCB0aGlzLkFyY2hpdmVTdHJlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZhbGlkYXRlcyB0aGF0IHRoZSBhcmdzIGFyZSBjb25zaXN0ZW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBPbmx5IG9uZSBvZiB7YmFzZURpciwgb3V0U3RyZWFtfSBjYW4gYmUgbm9uLW51bGwuCisgICAgICAgIC8vLyBJZiBiYXNlRGlyIGlzIG5vbi1udWxsLCB0aGVuIHRoZSBvdXRwdXRGaWxlIGlzIGNyZWF0ZWQuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZU91dHB1dChzdHJpbmcgYmFzZWRpciwgU3RyZWFtIG91dHN0cmVhbSwgb3V0IHN0cmluZyBvdXRGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhc2VkaXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIG5hbWUgb24gdGhlIGVudHJ5IHN0YXJ0cyB3aXRoIGEgc2xhc2guCisgICAgICAgICAgICAgICAgLy8gUmF0aGVyIHRoYW4gdW5wYWNrIHRvIHRoZSByb290IG9mIHRoZSB2b2x1bWUsIHdlJ3JlIGdvaW5nIHRvCisgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgc2xhc2ggYW5kIHVucGFjayB0byB0aGUgc3BlY2lmaWVkIGJhc2UgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIHN0cmluZyBmID0gdGhpcy5GaWxlTmFtZS5SZXBsYWNlKCJcXCIsIi8iKTsKKworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDExNzcyOiByZW1vdmUgZHJpdmUgbGV0dGVyIHdpdGggc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgaWYgKGYuSW5kZXhPZignOicpID09IDEpCisgICAgICAgICAgICAgICAgICAgIGY9IGYuU3Vic3RyaW5nKDIpOworCisgICAgICAgICAgICAgICAgaWYgKGYuU3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgICAgICBmPSBmLlN1YnN0cmluZygxKTsKKworICAgICAgICAgICAgICAgIC8vIFN0cmluZy5Db250YWlucyBpcyBub3QgYXZhaWxhYmxlIG9uIC5ORVQgQ0YgMi4wCisKKyAgICAgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5aaXBGaWxlLkZsYXR0ZW5Gb2xkZXJzT25FeHRyYWN0KQorICAgICAgICAgICAgICAgICAgICBvdXRGaWxlTmFtZSA9IFBhdGguQ29tYmluZShiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmLkluZGV4T2YoJy8nKSAhPSAtMSkgPyBQYXRoLkdldEZpbGVOYW1lKGYpIDogZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdXRGaWxlTmFtZSA9IFBhdGguQ29tYmluZShiYXNlZGlyLCBmKTsKKworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwNjM5CisgICAgICAgICAgICAgICAgb3V0RmlsZU5hbWUgPSBvdXRGaWxlTmFtZS5SZXBsYWNlKCIvIiwiXFwiKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIGEgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgaWYgKChJc0RpcmVjdG9yeSkgfHwgKEZpbGVOYW1lLkVuZHNXaXRoKCIvIikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKG91dEZpbGVOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShvdXRGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfU2V0VGltZXMob3V0RmlsZU5hbWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkaXIgZXhpc3RzLCBtYXliZSB3ZSB3YW50IHRvIG92ZXJ3cml0ZSB0aW1lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRyYWN0RXhpc3RpbmdGaWxlID09IEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uT3ZlcndyaXRlU2lsZW50bHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1NldFRpbWVzKG91dEZpbGVOYW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyB0cnVlID09IGFsbCBkb25lLCBjYWxsZXIgd2lsbCByZXR1cm4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZmFsc2UgPT0gd29yayB0byBkbyBieSBjYWxsZXIuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdXRzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRGaWxlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKChJc0RpcmVjdG9yeSkgfHwgKEZpbGVOYW1lLkVuZHNXaXRoKCIvIikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBhIGRpcmVjdG9yeSB0byBzdHJlYW13cml0ZXI/ICBub3RoaW5nIHRvIGRvIQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIHRydWUgPT0gYWxsIGRvbmUhICBjYWxsZXIgY2FuIHJldHVybgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIm91dHN0cmVhbSIpOworICAgICAgICB9CisKKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBFbnRyeS5SZWFkLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnkuUmVhZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTExZTVhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnkuUmVhZC5jcwpAQCAtMCwwICsxLDc5OCBAQAorLy8gWmlwRW50cnkuUmVhZC5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgRGlubyBDaGllc2EKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtSnVseS0wOSAyMTozMToyOD4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIGxvZ2ljIGZvciBSZWFkaW5nIHRoZSBaaXBFbnRyeSBmcm9tIGEKKy8vIHppcCBmaWxlLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgWmlwRW50cnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgaW50IF9yZWFkRXh0cmFEZXB0aDsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRFeHRyYUZpZWxkKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3JlYWRFeHRyYURlcHRoKys7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA4MDk4OiBvayAocmVzdG9yZSkKKyAgICAgICAgICAgIGxvbmcgcG9zbiA9IHRoaXMuQXJjaGl2ZVN0cmVhbS5Qb3NpdGlvbjsKKyAgICAgICAgICAgIHRoaXMuQXJjaGl2ZVN0cmVhbS5TZWVrKHRoaXMuX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgodGhpcy5BcmNoaXZlU3RyZWFtKTsKKworICAgICAgICAgICAgYnl0ZVtdIGJsb2NrID0gbmV3IGJ5dGVbMzBdOworICAgICAgICAgICAgdGhpcy5BcmNoaXZlU3RyZWFtLlJlYWQoYmxvY2ssIDAsIGJsb2NrLkxlbmd0aCk7CisgICAgICAgICAgICBpbnQgaSA9IDI2OworICAgICAgICAgICAgSW50MTYgZmlsZW5hbWVMZW5ndGggPSAoc2hvcnQpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2KTsKKyAgICAgICAgICAgIEludDE2IGV4dHJhRmllbGRMZW5ndGggPSAoc2hvcnQpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2KTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODA5ODogb2sgKHJlbGF0aXZlKQorICAgICAgICAgICAgdGhpcy5BcmNoaXZlU3RyZWFtLlNlZWsoZmlsZW5hbWVMZW5ndGgsIFNlZWtPcmlnaW4uQ3VycmVudCk7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgodGhpcy5BcmNoaXZlU3RyZWFtKTsKKworICAgICAgICAgICAgUHJvY2Vzc0V4dHJhRmllbGQodGhpcy5BcmNoaXZlU3RyZWFtLCBleHRyYUZpZWxkTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODA5ODogb2sgKHJlc3RvcmUpCisgICAgICAgICAgICB0aGlzLkFyY2hpdmVTdHJlYW0uU2Vlayhwb3NuLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOCh0aGlzLkFyY2hpdmVTdHJlYW0pOworICAgICAgICAgICAgX3JlYWRFeHRyYURlcHRoLS07CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgUmVhZEhlYWRlcihaaXBFbnRyeSB6ZSwgU3lzdGVtLlRleHQuRW5jb2RpbmcgZGVmYXVsdEVuY29kaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gMDsKKworICAgICAgICAgICAgLy8gY2hhbmdlIGZvciB3b3JraXRlbSA4MDk4CisgICAgICAgICAgICB6ZS5fUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID0gemUuQXJjaGl2ZVN0cmVhbS5Qb3NpdGlvbjsKKworICAgICAgICAgICAgaW50IHNpZ25hdHVyZSA9IElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuUmVhZEVudHJ5U2lnbmF0dXJlKHplLkFyY2hpdmVTdHJlYW0pOworICAgICAgICAgICAgYnl0ZXNSZWFkICs9IDQ7CisKKyAgICAgICAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGlzIGlzIG5vdCBhIGxvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIGlmIChaaXBFbnRyeS5Jc05vdFZhbGlkU2lnKHNpZ25hdHVyZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gR2V0dGluZyAibm90IGEgWmlwRW50cnkgc2lnbmF0dXJlIiBpcyBub3QgYWx3YXlzIHdyb25nIG9yIGFuIGVycm9yLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoYXBwZW4gYWZ0ZXIgdGhlIGxhc3QgZW50cnkgaW4gYSB6aXBmaWxlLiAgSW4gdGhhdCBjYXNlLCB3ZQorICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0byByZWFkIDoKKyAgICAgICAgICAgICAgICAvLyAgICBhIFppcERpckVudHJ5IHNpZ25hdHVyZSAoaWYgYSBub24tZW1wdHkgemlwIGZpbGUpIG9yCisgICAgICAgICAgICAgICAgLy8gICAgYSBaaXBDb25zdGFudHMuRW5kT2ZDZW50cmFsRGlyZWN0b3J5U2lnbmF0dXJlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBpcyBhIHN1cnByaXNlLgorCisgICAgICAgICAgICAgICAgemUuQXJjaGl2ZVN0cmVhbS5TZWVrKC00LCBTZWVrT3JpZ2luLkN1cnJlbnQpOyAvLyB1bnJlYWQgdGhlIHNpZ25hdHVyZQorICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgoemUuQXJjaGl2ZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKFppcEVudHJ5LklzTm90VmFsaWRaaXBEaXJFbnRyeVNpZyhzaWduYXR1cmUpICYmIChzaWduYXR1cmUgIT0gWmlwQ29uc3RhbnRzLkVuZE9mQ2VudHJhbERpcmVjdG9yeVNpZ25hdHVyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIEJhZCBzaWduYXR1cmUgKDB4ezA6WDh9KSBhdCBwb3NpdGlvbiAgMHh7MTpYOH0iLCBzaWduYXR1cmUsIHplLkFyY2hpdmVTdHJlYW0uUG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gYmxvY2sgPSBuZXcgYnl0ZVsyNl07CisgICAgICAgICAgICBpbnQgbiA9IHplLkFyY2hpdmVTdHJlYW0uUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChuICE9IGJsb2NrLkxlbmd0aCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnl0ZXNSZWFkICs9IG47CisKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHplLl9WZXJzaW9uTmVlZGVkID0gKEludDE2KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisgICAgICAgICAgICB6ZS5fQml0RmllbGQgPSAoSW50MTYpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2KTsKKyAgICAgICAgICAgIHplLl9Db21wcmVzc2lvbk1ldGhvZF9Gcm9tWmlwRmlsZSA9IHplLl9Db21wcmVzc2lvbk1ldGhvZCA9IChJbnQxNikoYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYpOworICAgICAgICAgICAgemUuX1RpbWVCbG9iID0gYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiAqIDI1NjsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgdGltZSBkYXRhIGludG8gc29tZXRoaW5nIHVzYWJsZSAoYSBEYXRlVGltZSkKKyAgICAgICAgICAgIHplLl9MYXN0TW9kaWZpZWQgPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLlBhY2tlZFRvRGF0ZVRpbWUoemUuX1RpbWVCbG9iKTsKKyAgICAgICAgICAgIHplLl90aW1lc3RhbXAgfD0gWmlwRW50cnlUaW1lc3RhbXAuRE9TOworCisgICAgICAgICAgICBpZiAoKHplLl9CaXRGaWVsZCAmIDB4MDEpID09IDB4MDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemUuX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPSB6ZS5fRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrOyAvLyB0aGlzICptYXkqIGNoYW5nZSBhZnRlciBwcm9jZXNzaW5nIHRoZSBFeHRyYSBmaWVsZAorICAgICAgICAgICAgICAgIHplLl9zb3VyY2VJc0VuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5COiBpZiAoKHplLl9CaXRGaWVsZCAmIDB4MDAwOCkgIT0gMHgwMDA4KSwgdGhlbiB0aGUgQ29tcHJlc3NlZCwgdW5jb21wcmVzc2VkIGFuZAorICAgICAgICAgICAgLy8gQ1JDIHZhbHVlcyBhcmUgbm90IHRydWUgdmFsdWVzOyB0aGUgdHJ1ZSB2YWx1ZXMgd2lsbCBmb2xsb3cgdGhlIGVudHJ5IGRhdGEuCisgICAgICAgICAgICAvLyBCdXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cyBvZiBiaXQgMyBpbiB0aGUgYml0ZmllbGQsIHRoZSBzbG90cyBmb3IKKyAgICAgICAgICAgIC8vIHRoZSB0aHJlZSBhbWlnb3MgbWF5IGNvbnRhaW4gbWFya2VyIHZhbHVlcyBmb3IgWklQNjQuICBTbyB3ZSBtdXN0IHJlYWQgdGhlbS4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZS5fQ3JjMzIgPSAoSW50MzIpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKiAyNTYpOworICAgICAgICAgICAgICAgIHplLl9Db21wcmVzc2VkU2l6ZSA9ICh1aW50KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICogMjU2KTsKKyAgICAgICAgICAgICAgICB6ZS5fVW5jb21wcmVzc2VkU2l6ZSA9ICh1aW50KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICogMjU2KTsKKworICAgICAgICAgICAgICAgIGlmICgodWludCl6ZS5fQ29tcHJlc3NlZFNpemUgPT0gMHhGRkZGRkZGRiB8fAorICAgICAgICAgICAgICAgICAgICAodWludCl6ZS5fVW5jb21wcmVzc2VkU2l6ZSA9PSAweEZGRkZGRkZGKQorCisgICAgICAgICAgICAgICAgICAgIHplLl9JbnB1dFVzZXNaaXA2NCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEludDE2IGZpbGVuYW1lTGVuZ3RoID0gKHNob3J0KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisgICAgICAgICAgICBJbnQxNiBleHRyYUZpZWxkTGVuZ3RoID0gKHNob3J0KShibG9ja1tpKytdICsgYmxvY2tbaSsrXSAqIDI1Nik7CisKKyAgICAgICAgICAgIGJsb2NrID0gbmV3IGJ5dGVbZmlsZW5hbWVMZW5ndGhdOworICAgICAgICAgICAgbiA9IHplLkFyY2hpdmVTdHJlYW0uUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKyAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBuOworCisgICAgICAgICAgICAvLyBpZiB0aGUgVVRGOCBiaXQgaXMgc2V0IGZvciB0aGlzIGVudHJ5LCBvdmVycmlkZSB0aGUKKyAgICAgICAgICAgIC8vIGVuY29kaW5nIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0ZWQuCisKKyAgICAgICAgICAgIGlmICgoemUuX0JpdEZpZWxkICYgMHgwODAwKSA9PSAweDA4MDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTI3NDQKKyAgICAgICAgICAgICAgICB6ZS5BbHRlcm5hdGVFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjg7CisgICAgICAgICAgICAgICAgemUuQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5BbHdheXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gdXNlIHRoaXMgZm9ybSBvZiBHZXRTdHJpbmcoKSBmb3IgLk5FVCBDRgorICAgICAgICAgICAgemUuX0ZpbGVOYW1lSW5BcmNoaXZlID0gemUuQWx0ZXJuYXRlRW5jb2RpbmcuR2V0U3RyaW5nKGJsb2NrLCAwLCBibG9jay5MZW5ndGgpOworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA2ODk4CisgICAgICAgICAgICBpZiAoemUuX0ZpbGVOYW1lSW5BcmNoaXZlLkVuZHNXaXRoKCIvIikpIHplLk1hcmtBc0RpcmVjdG9yeSgpOworCisgICAgICAgICAgICBieXRlc1JlYWQgKz0gemUuUHJvY2Vzc0V4dHJhRmllbGQoemUuQXJjaGl2ZVN0cmVhbSwgZXh0cmFGaWVsZExlbmd0aCk7CisKKyAgICAgICAgICAgIHplLl9MZW5ndGhPZlRyYWlsZXIgPSAwOworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA2NjA3IC0gZG9uJ3QgcmVhZCBmb3IgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IGdldCB0aGUgY29tcHJlc3NlZCBzaXplIGFuZCBDUkMgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoIXplLl9GaWxlTmFtZUluQXJjaGl2ZS5FbmRzV2l0aCgiLyIpICYmICh6ZS5fQml0RmllbGQgJiAweDAwMDgpID09IDB4MDAwOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGRlc2NyaXB0b3IgZXhpc3RzIG9ubHkgaWYgYml0IDMgb2YgdGhlIGdlbmVyYWwKKyAgICAgICAgICAgICAgICAvLyBwdXJwb3NlIGJpdCBmbGFnIGlzIHNldCAoc2VlIGJlbG93KS4gIEl0IGlzIGJ5dGUgYWxpZ25lZAorICAgICAgICAgICAgICAgIC8vIGFuZCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBsYXN0IGJ5dGUgb2YgY29tcHJlc3NlZCBkYXRhLAorICAgICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYW55IGVuY3J5cHRpb24gdHJhaWxlciwgYXMgd2l0aCBBRVMuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBkZXNjcmlwdG9yIGlzIHVzZWQgb25seSB3aGVuIGl0IHdhcyBub3QgcG9zc2libGUgdG8KKyAgICAgICAgICAgICAgICAvLyBzZWVrIGluIHRoZSBvdXRwdXQgLlpJUCBmaWxlLCBlLmcuLCB3aGVuIHRoZSBvdXRwdXQgLlpJUCBmaWxlCisgICAgICAgICAgICAgICAgLy8gd2FzIHN0YW5kYXJkIG91dHB1dCBvciBhIG5vbi1zZWVrYWJsZSBkZXZpY2UuICBGb3IgWklQNjQodG0pIGZvcm1hdAorICAgICAgICAgICAgICAgIC8vIGFyY2hpdmVzLCB0aGUgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHNpemVzIGFyZSA4IGJ5dGVzIGVhY2guCisKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MDk4OiBvayAocmVzdG9yZSkKKyAgICAgICAgICAgICAgICBsb25nIHBvc24gPSB6ZS5BcmNoaXZlU3RyZWFtLlBvc2l0aW9uOworCisgICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UncmUgZ29pbmcgdG8gbG9vcCB1bnRpbCB3ZSBmaW5kIGEgWmlwRW50cnlEYXRhRGVzY3JpcHRvclNpZ25hdHVyZSBhbmQKKyAgICAgICAgICAgICAgICAvLyBhIGNvbnNpc3RlbnQgZGF0YSByZWNvcmQgYWZ0ZXIgdGhhdC4gICBUbyBiZSBjb25zaXN0ZW50LCB0aGUgZGF0YSByZWNvcmQgbXVzdAorICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIGVudHJ5IGRhdGEuCisgICAgICAgICAgICAgICAgYm9vbCB3YW50TW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9uZyBTaXplT2ZEYXRhUmVhZCA9IDA7CisgICAgICAgICAgICAgICAgaW50IHRyaWVzID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAod2FudE1vcmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmllcysrOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYWxsIHRoZSBGaW5kU2lnbmF0dXJlIHNoYXJlZCByb3V0aW5lIHRvIGZpbmQgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGFscmVhZHktb3BlbmVkIHppcCBhcmNoaXZlLCBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IGN1cnNvcgorICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBpbiB0aGF0IGZpbGVzdHJlYW0uICBJZiB3ZSBjYW5ub3QgZmluZCB0aGUgc2lnbmF0dXJlLCB0aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyByb3V0aW5lIHJldHVybnMgLTEsIGFuZCB0aGUgUmVhZEhlYWRlcigpIG1ldGhvZCByZXR1cm5zIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0aW5nIHdlIGNhbm5vdCByZWFkIGEgbGVnYWwgZW50cnkgaGVhZGVyLiAgSWYgd2UgaGF2ZSBmb3VuZCBpdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGUgRmluZFNpZ25hdHVyZSgpIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB3ZSBoYWQgdG8gc2VlayBmb3J3YXJkLCB0byBmaW5kIHRoZSBzaWcuICBXZSBuZWVkIHRoaXMgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoZSB6aXAgZW50cnkgaXMgdmFsaWQsIGxhdGVyLgorCisgICAgICAgICAgICAgICAgICAgIGlmICh6ZS5fY29udGFpbmVyLlppcEZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHplLl9jb250YWluZXIuWmlwRmlsZS5PblJlYWRCeXRlcyh6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBkID0gSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5GaW5kU2lnbmF0dXJlKHplLkFyY2hpdmVTdHJlYW0sIFppcENvbnN0YW50cy5aaXBFbnRyeURhdGFEZXNjcmlwdG9yU2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT0gLTEpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0b3RhbCBzaXplIG9mIGRhdGEgcmVhZCAodGhyb3VnaCBhbGwgbG9vcHMgb2YgdGhpcykuCisgICAgICAgICAgICAgICAgICAgIFNpemVPZkRhdGFSZWFkICs9IGQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHplLl9JbnB1dFVzZXNaaXA2NCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCAxeCA0LWJ5dGUgKENSQykgYW5kIDJ4IDgtYnl0ZXMgKENvbXByZXNzZWQgU2l6ZSwgVW5jb21wcmVzc2VkIFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB6ZS5BcmNoaXZlU3RyZWFtLlJlYWQoYmxvY2ssIDAsIGJsb2NrLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAyMCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaW5jcmVtZW50IGJ5dGVzUmVhZCAtIGl0IGlzIGZvciBlbnRyeSBoZWFkZXIgb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHdlIGhhdmUganVzdCByZWFkIGlzIGEgZm9vdGVyIChmYWxscyBhZnRlciB0aGUgZmlsZSBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgLy9ieXRlc1JlYWQgKz0gbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZS5fQ3JjMzIgPSAoSW50MzIpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKiAyNTYpOworICAgICAgICAgICAgICAgICAgICAgICAgemUuX0NvbXByZXNzZWRTaXplID0gQml0Q29udmVydGVyLlRvSW50NjQoYmxvY2ssIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgemUuX1VuY29tcHJlc3NlZFNpemUgPSBCaXRDb252ZXJ0ZXIuVG9JbnQ2NChibG9jaywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHplLl9MZW5ndGhPZlRyYWlsZXIgKz0gMjQ7ICAvLyBieXRlcyBpbmNsdWRpbmcgc2lnLCBDUkMsIENvbXAgYW5kIFVuY29tcCBzaXplcworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCAzeCA0LWJ5dGUgZmllbGRzIChDUkMsIENvbXByZXNzZWQgU2l6ZSwgVW5jb21wcmVzc2VkIFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlWzEyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB6ZS5BcmNoaXZlU3RyZWFtLlJlYWQoYmxvY2ssIDAsIGJsb2NrLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAxMikgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaW5jcmVtZW50IGJ5dGVzUmVhZCAtIGl0IGlzIGZvciBlbnRyeSBoZWFkZXIgb25seS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHdlIGhhdmUganVzdCByZWFkIGlzIGEgZm9vdGVyIChmYWxscyBhZnRlciB0aGUgZmlsZSBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgLy9ieXRlc1JlYWQgKz0gbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZS5fQ3JjMzIgPSAoSW50MzIpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKiAyNTYpOworICAgICAgICAgICAgICAgICAgICAgICAgemUuX0NvbXByZXNzZWRTaXplID0gKHVpbnQpKGJsb2NrW2krK10gKyBibG9ja1tpKytdICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiArIGJsb2NrW2krK10gKiAyNTYgKiAyNTYgKiAyNTYpOworICAgICAgICAgICAgICAgICAgICAgICAgemUuX1VuY29tcHJlc3NlZFNpemUgPSAodWludCkoYmxvY2tbaSsrXSArIGJsb2NrW2krK10gKiAyNTYgKyBibG9ja1tpKytdICogMjU2ICogMjU2ICsgYmxvY2tbaSsrXSAqIDI1NiAqIDI1NiAqIDI1Nik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHplLl9MZW5ndGhPZlRyYWlsZXIgKz0gMTY7ICAvLyBieXRlcyBpbmNsdWRpbmcgc2lnLCBDUkMsIENvbXAgYW5kIFVuY29tcCBzaXplcworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3YW50TW9yZSA9IChTaXplT2ZEYXRhUmVhZCAhPSB6ZS5fQ29tcHJlc3NlZFNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3YW50TW9yZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlayBiYWNrIHRvIHVuLXJlYWQgdGhlIGxhc3QgMTIgYnl0ZXMgIC0gbWF5YmUgVEhFWSBjb250YWluCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgWmlwRW50cnlEYXRhRGVzY3JpcHRvclNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICgxMiBieXRlcyBmb3IgdGhlIENSQywgQ29tcCBhbmQgVW5jb21wIHNpemUuKQorICAgICAgICAgICAgICAgICAgICAgICAgemUuQXJjaGl2ZVN0cmVhbS5TZWVrKC0xMiwgU2Vla09yaWdpbi5DdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOCh6ZS5BcmNoaXZlU3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBzaXplIHRvIGFjY291bnQgZm9yIHRoZSBmYWxzZSBzaWduYXR1cmUgcmVhZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZFNpZ25hdHVyZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZU9mRGF0YVJlYWQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNlZWsgYmFjayB0byBwcmV2aW91cyBwb3NpdGlvbiwgdG8gcHJlcGFyZSB0byByZWFkIGZpbGUgZGF0YQorICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDgwOTg6IG9rIChyZXN0b3JlKQorICAgICAgICAgICAgICAgIHplLkFyY2hpdmVTdHJlYW0uU2Vlayhwb3NuLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgIElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KHplLkFyY2hpdmVTdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6ZS5fQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSA9IHplLl9Db21wcmVzc2VkU2l6ZTsKKworCisgICAgICAgICAgICAvLyBiaXQgMCBzZXQgaW5kaWNhdGVzIHRoYXQgc29tZSBraW5kIG9mIGVuY3J5cHRpb24gaXMgaW4gdXNlCisgICAgICAgICAgICBpZiAoKHplLl9CaXRGaWVsZCAmIDB4MDEpID09IDB4MDEpCisgICAgICAgICAgICB7CisjaWYgQUVTQ1JZUFRPCisgICAgICAgICAgICAgICAgaWYgKHplLkVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMxMjggfHwKKyAgICAgICAgICAgICAgICAgICAgemUuRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBiaXRzID0gWmlwRW50cnkuR2V0S2V5U3RyZW5ndGhJbkJpdHMoemUuX0VuY3J5cHRpb25fRnJvbVppcEZpbGUpOworICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGluIHRoZSBXaW5aaXAgQUVTIG1ldGFkYXRhOiBzYWx0ICsgUFYuIDE4IGJ5dGVzIGZvciBBRVMyNTYuIDEwIGJ5dGVzIGZvciBBRVMxMjguCisgICAgICAgICAgICAgICAgICAgIHplLl9hZXNDcnlwdG9fZm9yRXh0cmFjdCA9IFdpblppcEFlc0NyeXB0by5SZWFkRnJvbVN0cmVhbShudWxsLCBiaXRzLCB6ZS5BcmNoaXZlU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkICs9IHplLl9hZXNDcnlwdG9fZm9yRXh0cmFjdC5TaXplT2ZFbmNyeXB0aW9uTWV0YWRhdGEgLSAxMDsgLy8gTUFDIChmb2xsb3dzIGNyeXB0byBieXRlcykKKyAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIFdpblppcCwgdGhlIENvbXByZXNzZWRTaXplIGluY2x1ZGVzIHRoZSBBRVMgQ3J5cHRvIGZyYW1pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgemUuX0NvbXByZXNzZWRGaWxlRGF0YVNpemUgLT0gemUuX2Flc0NyeXB0b19mb3JFeHRyYWN0LlNpemVPZkVuY3J5cHRpb25NZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgemUuX0xlbmd0aE9mVHJhaWxlciArPSAxMDsgIC8vIE1BQworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgaW4gdGhlIGhlYWRlciBkYXRhIGZvciAid2VhayIgZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgICAgICB6ZS5fV2Vha0VuY3J5cHRpb25IZWFkZXIgPSBuZXcgYnl0ZVsxMl07CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBaaXBFbnRyeS5SZWFkV2Vha0VuY3J5cHRpb25IZWFkZXIoemUuX2FyY2hpdmVTdHJlYW0sIHplLl9XZWFrRW5jcnlwdGlvbkhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlYXNlIHRoZSBmaWxlZGF0YSBzaXplIGJ5IDEyIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIHplLl9Db21wcmVzc2VkRmlsZURhdGFTaXplIC09IDEyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIHNpemUgb2YgdGhlIGJsb2IgZm9yIHRoaXMgZW50cnkuCisgICAgICAgICAgICAvLyBXZSBhbHNvIGhhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gZm9yIHRoaXMgZW50cnkuCisgICAgICAgICAgICB6ZS5fTGVuZ3RoT2ZIZWFkZXIgPSBieXRlc1JlYWQ7CisgICAgICAgICAgICB6ZS5fVG90YWxFbnRyeVNpemUgPSB6ZS5fTGVuZ3RoT2ZIZWFkZXIgKyB6ZS5fQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSArIHplLl9MZW5ndGhPZlRyYWlsZXI7CisKKworICAgICAgICAgICAgLy8gV2UndmUgcmVhZCBpbiB0aGUgcmVndWxhciBlbnRyeSBoZWFkZXIsIHRoZSBleHRyYSBmaWVsZCwgYW5kIGFueQorICAgICAgICAgICAgLy8gZW5jcnlwdGlvbiBoZWFkZXIuICBUaGUgcG9pbnRlciBpbiB0aGUgZmlsZSBpcyBub3cgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAgICAgLy8gZmlsZWRhdGEsIHdoaWNoIGlzIHBvdGVudGlhbGx5IGNvbXByZXNzZWQgYW5kIGVuY3J5cHRlZC4gIEp1c3QgYWhlYWQgaW4KKyAgICAgICAgICAgIC8vIHRoZSBmaWxlLCB0aGVyZSBhcmUgX0NvbXByZXNzZWRGaWxlRGF0YVNpemUgYnl0ZXMgb2YgZGF0YSwgZm9sbG93ZWQgYnkKKyAgICAgICAgICAgIC8vIHBvdGVudGlhbGx5IGEgbm9uLXplcm8gbGVuZ3RoIHRyYWlsZXIsIGNvbnNpc3Rpbmcgb2Ygb3B0aW9uYWxseSwgc29tZQorICAgICAgICAgICAgLy8gZW5jcnlwdGlvbiBzdHVmZiAoMTAgYnl0ZSBNQUMgZm9yIEFFUyksIGFuZCB0aGUgYml0LTMgdHJhaWxlciAoMTYgb3IgMjQKKyAgICAgICAgICAgIC8vIGJ5dGVzKS4KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBSZWFkV2Vha0VuY3J5cHRpb25IZWFkZXIoU3RyZWFtIHMsIGJ5dGVbXSBidWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFBLWklQIGVuY3J5cHRzIHRoZSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgRW5jcnlwdGVkIGZpbGVzIG11c3QKKyAgICAgICAgICAgIC8vIGJlIGRlY3J5cHRlZCBiZWZvcmUgdGhleSBjYW4gYmUgZXh0cmFjdGVkLgorCisgICAgICAgICAgICAvLyBFYWNoIFBLWklQLWVuY3J5cHRlZCBmaWxlIGhhcyBhbiBleHRyYSAxMiBieXRlcyBzdG9yZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhCisgICAgICAgICAgICAvLyBhcmVhIGRlZmluaW5nIHRoZSBlbmNyeXB0aW9uIGhlYWRlciBmb3IgdGhhdCBmaWxlLiAgVGhlIGVuY3J5cHRpb24gaGVhZGVyIGlzCisgICAgICAgICAgICAvLyBvcmlnaW5hbGx5IHNldCB0byByYW5kb20gdmFsdWVzLCBhbmQgdGhlbiBpdHNlbGYgZW5jcnlwdGVkLCB1c2luZyB0aHJlZSwgMzItYml0CisgICAgICAgICAgICAvLyBrZXlzLiAgVGhlIGtleSB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHRoZSBzdXBwbGllZCBlbmNyeXB0aW9uIHBhc3N3b3JkLgorICAgICAgICAgICAgLy8gQWZ0ZXIgZWFjaCBieXRlIGlzIGVuY3J5cHRlZCwgdGhlIGtleXMgYXJlIHRoZW4gdXBkYXRlZCB1c2luZyBwc2V1ZG8tcmFuZG9tCisgICAgICAgICAgICAvLyBudW1iZXIgZ2VuZXJhdGlvbiB0ZWNobmlxdWVzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHNhbWUgQ1JDLTMyIGFsZ29yaXRobSB1c2VkCisgICAgICAgICAgICAvLyBpbiBQS1pJUCBhbmQgaW1wbGVtZW50ZWQgaW4gdGhlIENSQzMyLmNzIG1vZHVsZSBpbiB0aGlzIHByb2plY3QuCisKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIDEyLWJ5dGUgZW5jcnlwdGlvbiBoZWFkZXIKKyAgICAgICAgICAgIGludCBhZGRpdGlvbmFsQnl0ZXNSZWFkID0gcy5SZWFkKGJ1ZmZlciwgMCwgMTIpOworICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxCeXRlc1JlYWQgIT0gMTIpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJVbmV4cGVjdGVkIGVuZCBvZiBkYXRhIGF0IHBvc2l0aW9uIDB4ezA6WDh9Iiwgcy5Qb3NpdGlvbikpOworCisgICAgICAgICAgICByZXR1cm4gYWRkaXRpb25hbEJ5dGVzUmVhZDsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzTm90VmFsaWRTaWcoaW50IHNpZ25hdHVyZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaWduYXR1cmUgIT0gWmlwQ29uc3RhbnRzLlppcEVudHJ5U2lnbmF0dXJlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZWFkcyBvbmUgPGM+WmlwRW50cnk8L2M+IGZyb20gdGhlIGdpdmVuIHN0cmVhbS4gIFRoZSBjb250ZW50IGZvcgorICAgICAgICAvLy8gICB0aGUgZW50cnkgZG9lcyBub3QgZ2V0IGRlY29tcHJlc3NlZCBvciBkZWNyeXB0ZWQuICBUaGlzIG1ldGhvZAorICAgICAgICAvLy8gICBiYXNpY2FsbHkgcmVhZHMgbWV0YWRhdGEsIGFuZCBzZWVrcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ6YyI+dGhlIFppcENvbnRhaW5lciB0aGlzIGVudHJ5IGJlbG9uZ3MgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaXJzdCI+CisgICAgICAgIC8vLyAgIHRydWUgb2YgdGhpcyBpcyB0aGUgZmlyc3QgZW50cnkgYmVpbmcgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIDxjPlppcEVudHJ5PC9jPiByZWFkIGZyb20gdGhlIHN0cmVhbS48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBaaXBFbnRyeSBSZWFkRW50cnkoWmlwQ29udGFpbmVyIHpjLCBib29sIGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBaaXBGaWxlIHpmID0gemMuWmlwRmlsZTsKKyAgICAgICAgICAgIFN0cmVhbSBzID0gemMuUmVhZFN0cmVhbTsKKyAgICAgICAgICAgIFN5c3RlbS5UZXh0LkVuY29kaW5nIGRlZmF1bHRFbmNvZGluZyA9IHpjLkFsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoKTsKKyAgICAgICAgICAgIGVudHJ5Ll9Tb3VyY2UgPSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlOworICAgICAgICAgICAgZW50cnkuX2NvbnRhaW5lciA9IHpjOworICAgICAgICAgICAgZW50cnkuX2FyY2hpdmVTdHJlYW0gPSBzOworICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpCisgICAgICAgICAgICAgICAgemYuT25SZWFkRW50cnkodHJ1ZSwgbnVsbCk7CisKKyAgICAgICAgICAgIGlmIChmaXJzdCkgSGFuZGxlUEswMFByZWZpeChzKTsKKworICAgICAgICAgICAgLy8gUmVhZCBlbnRyeSBoZWFkZXIsIGluY2x1ZGluZyBhbnkgZW5jcnlwdGlvbiBoZWFkZXIKKyAgICAgICAgICAgIGlmICghUmVhZEhlYWRlcihlbnRyeSwgZGVmYXVsdEVuY29kaW5nKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtIGZvciB0aGlzIGVudHJ5CisgICAgICAgICAgICAvLyBjaGFuZ2UgZm9yIHdvcmtpdGVtIDgwOTgKKyAgICAgICAgICAgIGVudHJ5Ll9fRmlsZURhdGFQb3NpdGlvbiA9IGVudHJ5LkFyY2hpdmVTdHJlYW0uUG9zaXRpb247CisKKyAgICAgICAgICAgIC8vIHNlZWsgcGFzdCB0aGUgZGF0YSB3aXRob3V0IHJlYWRpbmcgaXQuIFdlIHdpbGwgcmVhZCBvbiBFeHRyYWN0KCkKKyAgICAgICAgICAgIHMuU2VlayhlbnRyeS5fQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSArIGVudHJ5Ll9MZW5ndGhPZlRyYWlsZXIsIFNlZWtPcmlnaW4uQ3VycmVudCk7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgocyk7CisKKyAgICAgICAgICAgIC8vIFJlYWRIZWFkZXIgbW92ZXMgdGhlIGZpbGUgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBlbnRyeSBoZWFkZXIsCisgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFueSBlbmNyeXB0aW9uIGhlYWRlci4KKworICAgICAgICAgICAgLy8gQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSBpbmNsdWRlczoKKyAgICAgICAgICAgIC8vICAgdGhlIG1heWJlIGNvbXByZXNzZWQsIG1heWJlIGVuY3J5cHRlZCBmaWxlIGRhdGEKKyAgICAgICAgICAgIC8vICAgdGhlIGVuY3J5cHRpb24gdHJhaWxlciwgaWYgYW55CisgICAgICAgICAgICAvLyAgIHRoZSBiaXQgMyBkZXNjcmlwdG9yLCBpZiBhbnkKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNTMwNgorICAgICAgICAgICAgLy8gaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRG90TmV0WmlwL1dvcmtJdGVtL1ZpZXcuYXNweD9Xb3JrSXRlbUlkPTUzMDYKKyAgICAgICAgICAgIEhhbmRsZVVuZXhwZWN0ZWREYXRhRGVzY3JpcHRvcihlbnRyeSk7CisKKyAgICAgICAgICAgIGlmICh6ZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmLk9uUmVhZEJ5dGVzKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB6Zi5PblJlYWRFbnRyeShmYWxzZSwgZW50cnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEhhbmRsZVBLMDBQcmVmaXgoU3RyZWFtIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGluIHNvbWUgY2FzZXMsIHRoZSB6aXAgZmlsZSBiZWdpbnMgd2l0aCAiUEswMCIuICBUaGlzIGlzIGEgdGhyb3diYWNrIGFuZCBpcyByYXJlLAorICAgICAgICAgICAgLy8gYnV0IHdlIGhhbmRsZSBpdCBhbnl3YXkuIFdlIGRvIG5vdCBjaGFuZ2UgYmVoYXZpb3IgYmFzZWQgb24gaXQuCisgICAgICAgICAgICB1aW50IGRhdHVtID0gKHVpbnQpSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5SZWFkSW50KHMpOworICAgICAgICAgICAgaWYgKGRhdHVtICE9IFppcENvbnN0YW50cy5QYWNrZWRUb1JlbW92YWJsZU1lZGlhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMuU2VlaygtNCwgU2Vla09yaWdpbi5DdXJyZW50KTsgLy8gdW5yZWFkIHRoZSBibG9jaworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBIYW5kbGVVbmV4cGVjdGVkRGF0YURlc2NyaXB0b3IoWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmVhbSBzID0gZW50cnkuQXJjaGl2ZVN0cmVhbTsKKworICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcywgdGhlICJkYXRhIGRlc2NyaXB0b3IiIGlzIHByZXNlbnQsIHdpdGhvdXQgYSBzaWduYXR1cmUsIGV2ZW4gd2hlbgorICAgICAgICAgICAgLy8gYml0IDMgb2YgdGhlIEJpdEZpZWxkIGlzIE5PVCBTRVQuICBUaGlzIGlzIHRoZSBDUkMsIGZvbGxvd2VkCisgICAgICAgICAgICAvLyAgICBieSB0aGUgY29tcHJlc3NlZCBsZW5ndGggYW5kIHRoZSB1bmNvbXByZXNzZWQgbGVuZ3RoICg0IGJ5dGVzIGZvciBlYWNoCisgICAgICAgICAgICAvLyAgICBvZiB0aG9zZSB0aHJlZSBlbGVtZW50cykuICBOZWVkIHRvIGNoZWNrIHRoYXQgaGVyZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB1aW50IGRhdHVtID0gKHVpbnQpSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5SZWFkSW50KHMpOworICAgICAgICAgICAgaWYgKGRhdHVtID09IGVudHJ5Ll9DcmMzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3ogPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLlJlYWRJbnQocyk7CisgICAgICAgICAgICAgICAgaWYgKHN6ID09IGVudHJ5Ll9Db21wcmVzc2VkU2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN6ID0gSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5SZWFkSW50KHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ogPT0gZW50cnkuX1VuY29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBldmVyeXRoaW5nIGFuZCBkaXNjYXJkIGl0LgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcy5TZWVrKC0xMiwgU2Vla09yaWdpbi5DdXJyZW50KTsgLy8gdW5yZWFkIHRoZSB0aHJlZSBibG9ja3MKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICAgICAgICAgIElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMuU2VlaygtOCwgU2Vla09yaWdpbi5DdXJyZW50KTsgLy8gdW5yZWFkIHRoZSB0d28gYmxvY2tzCisKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMuU2VlaygtNCwgU2Vla09yaWdpbi5DdXJyZW50KTsgLy8gdW5yZWFkIHRoZSBibG9jaworCisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBGaW5kcyBhIHBhcnRpY3VsYXIgc2VnbWVudCBpbiB0aGUgZ2l2ZW4gZXh0cmEgZmllbGQuCisgICAgICAgIC8vLyAgIFRoaXMgaXMgdXNlZCB3aGVuIG1vZGlmeWluZyBhIHByZXZpb3VzbHktZ2VuZXJhdGVkCisgICAgICAgIC8vLyAgIGV4dHJhIGZpZWxkLCBpbiBwYXJ0aWN1bGFyIHdoZW4gcmVtb3ZpbmcgdGhlIEFFUyBjcnlwdG8KKyAgICAgICAgLy8vICAgc2VnbWVudCBpbiB0aGUgZXh0cmEgZmllbGQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHN0YXRpYyBpbnRlcm5hbCBpbnQgRmluZEV4dHJhRmllbGRTZWdtZW50KGJ5dGVbXSBleHRyYSwgaW50IG9mZngsIFVJbnQxNiB0YXJnZXRIZWFkZXJJZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGogPSBvZmZ4OworICAgICAgICAgICAgd2hpbGUgKGogKyAzIDwgZXh0cmEuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVJbnQxNiBoZWFkZXJJZCA9IChVSW50MTYpKGV4dHJhW2orK10gKyBleHRyYVtqKytdICogMjU2KTsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVySWQgPT0gdGFyZ2V0SGVhZGVySWQpIHJldHVybiBqLTI7CisKKyAgICAgICAgICAgICAgICAvLyBlbHNlIGFkdmFuY2UgdG8gbmV4dCBzZWdtZW50CisgICAgICAgICAgICAgICAgSW50MTYgZGF0YVNpemUgPSAoc2hvcnQpKGV4dHJhW2orK10gKyBleHRyYVtqKytdICogMjU2KTsKKyAgICAgICAgICAgICAgICBqKz0gZGF0YVNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBdCBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLCByZWFkIHRoZSBleHRyYQorICAgICAgICAvLy8gICBmaWVsZCwgYW5kIHNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgWmlwRW50cnkgaW5zdGFuY2UKKyAgICAgICAgLy8vICAgYXBwcm9wcmlhdGVseS4gIFRoaXMgY2FuIGJlIGNhbGxlZCB3aGVuIHByb2Nlc3NpbmcgdGhlCisgICAgICAgIC8vLyAgIEV4dHJhIGZpZWxkIGluIHRoZSBDZW50cmFsIERpcmVjdG9yeSwgb3IgaW4gdGhlIGxvY2FsCisgICAgICAgIC8vLyAgIGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgaW50IFByb2Nlc3NFeHRyYUZpZWxkKFN0cmVhbSBzLCBJbnQxNiBleHRyYUZpZWxkTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWRkaXRpb25hbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICBpZiAoZXh0cmFGaWVsZExlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IHRoaXMuX0V4dHJhID0gbmV3IGJ5dGVbZXh0cmFGaWVsZExlbmd0aF07CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbEJ5dGVzUmVhZCA9IHMuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGxvbmcgcG9zbiA9IHMuUG9zaXRpb24gLSBhZGRpdGlvbmFsQnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaiArIDMgPCBidWZmZXIuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gajsKKyAgICAgICAgICAgICAgICAgICAgVUludDE2IGhlYWRlcklkID0gKFVJbnQxNikoYnVmZmVyW2orK10gKyBidWZmZXJbaisrXSAqIDI1Nik7CisgICAgICAgICAgICAgICAgICAgIEludDE2IGRhdGFTaXplID0gKHNob3J0KShidWZmZXJbaisrXSArIGJ1ZmZlcltqKytdICogMjU2KTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhlYWRlcklkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDAwYTogIC8vIE5URlMgY3RpbWUsIGF0aW1lLCBtdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBQcm9jZXNzRXh0cmFGaWVsZFdpbmRvd3NUaW1lcyhidWZmZXIsIGosIGRhdGFTaXplLCBwb3NuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDU0NTU6ICAvLyBVbml4IGN0aW1lLCBhdGltZSwgbXRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gUHJvY2Vzc0V4dHJhRmllbGRVbml4VGltZXMoYnVmZmVyLCBqLCBkYXRhU2l6ZSwgcG9zbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg1ODU1OiAgLy8gSW5mby16aXAgRXh0cmEgZmllbGQgKG91dGRhdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3V0ZGF0ZWQsIHNvIHRoZSBmaWVsZCBpcyBzdXBwb3J0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IFByb2Nlc3NFeHRyYUZpZWxkSW5mb1ppcFRpbWVzKGJ1ZmZlciwgaiwgZGF0YVNpemUsIHBvc24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4Nzg1NTogIC8vIFVuaXggdWlkL2dpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuIERvdE5ldFppcCBkb2VzIG5vdCBoYW5kbGUgdGhpcyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDc4NzU6ICAvLyA/PworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuICBJIGNvdWxkIG5vdCBmaW5kIGRvY3VtZW50YXRpb24gb24gdGhpcyBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aG91Z2ggaXQgYXBwZWFycyBpbiBzb21lIHppcCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAwMDE6IC8vIFpJUDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IFByb2Nlc3NFeHRyYUZpZWxkWmlwNjQoYnVmZmVyLCBqLCBkYXRhU2l6ZSwgcG9zbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZiBBRVNDUllQVE8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5OTAxOiAvLyBXaW5aaXAgQUVTIGVuY3J5cHRpb24gaXMgaW4gdXNlLiAgKHdvcmtpdGVtIDY4MzQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBoYW5kbGUgdGhpcyBleHRyYSBmaWVsZCBvbmx5ICBpZiBjb21wcmVzc2lvbm1ldGhvZCBpcyAweDYzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IFByb2Nlc3NFeHRyYUZpZWxkV2luWmlwQWVzKGJ1ZmZlciwgaiwgZGF0YVNpemUsIHBvc24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDAxNzogLy8gd29ya2l0ZW0gNzk2ODogaGFuZGxlIFBLV2FyZSBTdHJvbmcgZW5jcnlwdGlvbiBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gUHJvY2Vzc0V4dHJhRmllbGRQa3dhcmVTdHJvbmdFbmNyeXB0aW9uKGJ1ZmZlciwgaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IEhlYWRlciBpbiB0aGUgZXh0cmEgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgaiA9IHN0YXJ0ICsgZGF0YVNpemUgKyA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsQnl0ZXNSZWFkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgUHJvY2Vzc0V4dHJhRmllbGRQa3dhcmVTdHJvbmdFbmNyeXB0aW9uKGJ5dGVbXSBCdWZmZXIsIGludCBqKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgVmFsdWUgICAgIFNpemUgICAgIERlc2NyaXB0aW9uCisgICAgICAgICAgICAvLyAgICAgICAgICAgLS0tLS0gICAgIC0tLS0gICAgIC0tLS0tLS0tLS0tCisgICAgICAgICAgICAvLyAgICAgICAgICAgMHgwMDE3ICAgIDIgYnl0ZXMgIFRhZyBmb3IgdGhpcyAiZXh0cmEiIGJsb2NrIHR5cGUKKyAgICAgICAgICAgIC8vICAgICAgICAgICBUU2l6ZSAgICAgMiBieXRlcyAgU2l6ZSBvZiBkYXRhIHRoYXQgZm9sbG93cworICAgICAgICAgICAgLy8gICAgICAgICAgIEZvcm1hdCAgICAyIGJ5dGVzICBGb3JtYXQgZGVmaW5pdGlvbiBmb3IgdGhpcyByZWNvcmQKKyAgICAgICAgICAgIC8vICAgICAgICAgICBBbGdJRCAgICAgMiBieXRlcyAgRW5jcnlwdGlvbiBhbGdvcml0aG0gaWRlbnRpZmllcgorICAgICAgICAgICAgLy8gICAgICAgICAgIEJpdGxlbiAgICAyIGJ5dGVzICBCaXQgbGVuZ3RoIG9mIGVuY3J5cHRpb24ga2V5CisgICAgICAgICAgICAvLyAgICAgICAgICAgRmxhZ3MgICAgIDIgYnl0ZXMgIFByb2Nlc3NpbmcgZmxhZ3MKKyAgICAgICAgICAgIC8vICAgICAgICAgICBDZXJ0RGF0YSAgVFNpemUtOCAgQ2VydGlmaWNhdGUgZGVjcnlwdGlvbiBleHRyYSBmaWVsZCBkYXRhCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWZlciB0byB0aGUgZXhwbGFuYXRpb24gZm9yIENlcnREYXRhCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc2VjdGlvbiBkZXNjcmliaW5nIHRoZQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgUHJvY2Vzc2luZyBNZXRob2QgdW5kZXIKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTdHJvbmcgRW5jcnlwdGlvbiBTcGVjaWZpY2F0aW9uKQorCisgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICBfVW5zdXBwb3J0ZWRBbGdvcml0aG1JZCA9IChVSW50MTYpKEJ1ZmZlcltqKytdICsgQnVmZmVyW2orK10gKiAyNTYpOworICAgICAgICAgICAgX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPSBfRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uVW5zdXBwb3J0ZWQ7CisKKyAgICAgICAgICAgIC8vIERvdE5ldFppcCBkb2Vzbid0IHN1cHBvcnQgdGhpcyBhbGdvcml0aG0sIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHRocm93CisgICAgICAgICAgICAvLyBoZXJlLiAgd2UgbWlnaHQganVzdCBiZSByZWFkaW5nIHRoZSBhcmNoaXZlLCB3aGljaCBpcyBmaW5lLiAgV2UnbGwKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gdGhyb3cgaWYgRXh0cmFjdCgpIGlzIGNhbGxlZC4KKworICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKworCisjaWYgQUVTQ1JZUFRPCisgICAgICAgIHByaXZhdGUgaW50IFByb2Nlc3NFeHRyYUZpZWxkV2luWmlwQWVzKGJ5dGVbXSBidWZmZXIsIGludCBqLCBJbnQxNiBkYXRhU2l6ZSwgbG9uZyBwb3NuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5fQ29tcHJlc3Npb25NZXRob2QgPT0gMHgwMDYzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy5fQml0RmllbGQgJiAweDAxKSAhPSAweDAxKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIEluY29uc2lzdGVudCBtZXRhZGF0YSBhdCBwb3NpdGlvbiAweHswOlgxNn0iLCBwb3NuKSk7CisKKyAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VJc0VuY3J5cHRlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvL3RoaXMuX2Flc0NyeXB0byA9IG5ldyBXaW5aaXBBZXNDcnlwdG8odGhpcyk7CisgICAgICAgICAgICAgICAgLy8gc2VlIHNwZWMgYXQgaHR0cDovL3d3dy53aW56aXAuY29tL2Flc19pbmZvLmh0bQorICAgICAgICAgICAgICAgIGlmIChkYXRhU2l6ZSAhPSA3KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIEluY29uc2lzdGVudCBzaXplICgweHswOlg0fSkgaW4gV2luWmlwIEFFUyBmaWVsZCBhdCBwb3NpdGlvbiAweHsxOlgxNn0iLCBkYXRhU2l6ZSwgcG9zbikpOworCisgICAgICAgICAgICAgICAgdGhpcy5fV2luWmlwQWVzTWV0aG9kID0gQml0Q29udmVydGVyLlRvSW50MTYoYnVmZmVyLCBqKTsKKyAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX1dpblppcEFlc01ldGhvZCAhPSAweDAxICYmIHRoaXMuX1dpblppcEFlc01ldGhvZCAhPSAweDAyKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIFVuZXhwZWN0ZWQgdmVuZG9yIHZlcnNpb24gbnVtYmVyICgweHswOlg0fSkgZm9yIFdpblppcCBBRVMgbWV0YWRhdGEgYXQgcG9zaXRpb24gMHh7MTpYMTZ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX1dpblppcEFlc01ldGhvZCwgcG9zbikpOworCisgICAgICAgICAgICAgICAgSW50MTYgdmVuZG9ySWQgPSBCaXRDb252ZXJ0ZXIuVG9JbnQxNihidWZmZXIsIGopOworICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAodmVuZG9ySWQgIT0gMHg0NTQxKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIFVuZXhwZWN0ZWQgdmVuZG9yIElEICgweHswOlg0fSkgZm9yIFdpblppcCBBRVMgbWV0YWRhdGEgYXQgcG9zaXRpb24gMHh7MTpYMTZ9IiwgdmVuZG9ySWQsIHBvc24pKTsKKworICAgICAgICAgICAgICAgIGludCBrZXlzdHJlbmd0aCA9IChidWZmZXJbal0gPT0gMSkgPyAxMjggOiAoYnVmZmVyW2pdID09IDMpID8gMjU2IDogLTE7CisgICAgICAgICAgICAgICAgaWYgKGtleXN0cmVuZ3RoIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlYWRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiSW52YWxpZCBrZXkgc3RyZW5ndGggKHswfSkiLCBrZXlzdHJlbmd0aCkpOworCisgICAgICAgICAgICAgICAgX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPSB0aGlzLl9FbmNyeXB0aW9uID0gKGtleXN0cmVuZ3RoID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgPyBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOAorICAgICAgICAgICAgICAgICAgICA6IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2OworCisgICAgICAgICAgICAgICAgaisrOworCisgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBhY3R1YWwgY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgICAgICAgICAgdGhpcy5fQ29tcHJlc3Npb25NZXRob2RfRnJvbVppcEZpbGUgPQorICAgICAgICAgICAgICAgIHRoaXMuX0NvbXByZXNzaW9uTWV0aG9kID0gQml0Q29udmVydGVyLlRvSW50MTYoYnVmZmVyLCBqKTsKKyAgICAgICAgICAgICAgICBqICs9IDI7IC8vIGZvciB0aGUgbmV4dCBzZWdtZW50IG9mIHRoZSBleHRyYSBmaWVsZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKworI2VuZGlmCisKKyAgICAgICAgcHJpdmF0ZSBkZWxlZ2F0ZSBUIEZ1bmM8VD4oKTsKKworICAgICAgICBwcml2YXRlIGludCBQcm9jZXNzRXh0cmFGaWVsZFppcDY0KGJ5dGVbXSBidWZmZXIsIGludCBqLCBJbnQxNiBkYXRhU2l6ZSwgbG9uZyBwb3NuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgUEtXYXJlIHNwZWMgc2F5cyB0aGF0IGFueSBvZiB7VW5jb21wcmVzc2VkU2l6ZSwgQ29tcHJlc3NlZFNpemUsCisgICAgICAgICAgICAvLyBSZWxhdGl2ZU9mZnNldH0gZXhjZWVkaW5nIDB4RkZGRkZGRkYgY2FuIGxlYWQgdG8gdGhlIFpJUDY0IGhlYWRlciwKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgWklQNjQgaGVhZGVyIG1heSBjb250YWluIG9uZSBvciBtb3JlIG9mIHRob3NlLiAgSWYgdGhlCisgICAgICAgICAgICAvLyB2YWx1ZXMgYXJlIHByZXNlbnQsIHRoZXkgd2lsbCBiZSBmb3VuZCBpbiB0aGUgcHJlc2NyaWJlZCBvcmRlci4KKyAgICAgICAgICAgIC8vIFRoZXJlIG1heSBhbHNvIGJlIGEgNC1ieXRlICJkaXNrIHN0YXJ0IG51bWJlci4iCisgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIERhdGFTaXplIG11c3QgYmUgMjggYnl0ZXMgb3IgbGVzcy4KKworICAgICAgICAgICAgdGhpcy5fSW5wdXRVc2VzWmlwNjQgPSB0cnVlOworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA3OTQxOiBjaGVjayBkYXRhc2l6ZSBiZWZvcmUgcmVhZGluZy4KKyAgICAgICAgICAgIGlmIChkYXRhU2l6ZSA+IDI4KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZWFkRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIiAgSW5jb25zaXN0ZW50IHNpemUgKDB4ezA6WDR9KSBmb3IgWklQNjQgZXh0cmEgZmllbGQgYXQgcG9zaXRpb24gMHh7MTpYMTZ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLCBwb3NuKSk7CisgICAgICAgICAgICBpbnQgcmVtYWluaW5nRGF0YSA9IGRhdGFTaXplOworCisgICAgICAgICAgICB2YXIgc2x1cnAgPSBuZXcgRnVuYzxJbnQ2ND4oICgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0RhdGEgPCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlYWRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiICBNaXNzaW5nIGRhdGEgZm9yIFpJUDY0IGV4dHJhIGZpZWxkLCBwb3NpdGlvbiAweHswOlgxNn0iLCBwb3NuKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gQml0Q29udmVydGVyLlRvSW50NjQoYnVmZmVyLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgais9IDg7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0RhdGEgLT0gODsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9VbmNvbXByZXNzZWRTaXplID09IDB4RkZGRkZGRkYpCisgICAgICAgICAgICAgICAgdGhpcy5fVW5jb21wcmVzc2VkU2l6ZSA9IHNsdXJwKCk7CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9Db21wcmVzc2VkU2l6ZSA9PSAweEZGRkZGRkZGKQorICAgICAgICAgICAgICAgIHRoaXMuX0NvbXByZXNzZWRTaXplID0gc2x1cnAoKTsKKworICAgICAgICAgICAgaWYgKHRoaXMuX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9PSAweEZGRkZGRkZGKQorICAgICAgICAgICAgICAgIHRoaXMuX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9IHNsdXJwKCk7CisKKyAgICAgICAgICAgIC8vIElnbm9yZSBhbnl0aGluZyBlbHNlLiBQb3RlbnRpYWxseSB0aGVyZSBhcmUgNCBtb3JlIGJ5dGVzIGZvciB0aGUKKyAgICAgICAgICAgIC8vIGRpc2sgc3RhcnQgbnVtYmVyLiAgRG90TmV0WmlwIGN1cnJlbnRseSBkb2Vzbid0IGhhbmRsZSBtdWx0aS1kaXNrCisgICAgICAgICAgICAvLyBhcmNoaXZlcy4KKyAgICAgICAgICAgIHJldHVybiBqOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGludCBQcm9jZXNzRXh0cmFGaWVsZEluZm9aaXBUaW1lcyhieXRlW10gYnVmZmVyLCBpbnQgaiwgSW50MTYgZGF0YVNpemUsIGxvbmcgcG9zbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRhdGFTaXplICE9IDEyICYmIGRhdGFTaXplICE9IDgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlYWRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiICBVbmV4cGVjdGVkIHNpemUgKDB4ezA6WDR9KSBmb3IgSW5mb1ppcCB2MSBleHRyYSBmaWVsZCBhdCBwb3NpdGlvbiAweHsxOlgxNn0iLCBkYXRhU2l6ZSwgcG9zbikpOworCisgICAgICAgICAgICBJbnQzMiB0aW1ldCA9IEJpdENvbnZlcnRlci5Ub0ludDMyKGJ1ZmZlciwgaik7CisgICAgICAgICAgICB0aGlzLl9NdGltZSA9IF91bml4RXBvY2guQWRkU2Vjb25kcyh0aW1ldCk7CisgICAgICAgICAgICBqICs9IDQ7CisKKyAgICAgICAgICAgIHRpbWV0ID0gQml0Q29udmVydGVyLlRvSW50MzIoYnVmZmVyLCBqKTsKKyAgICAgICAgICAgIHRoaXMuX0F0aW1lID0gX3VuaXhFcG9jaC5BZGRTZWNvbmRzKHRpbWV0KTsKKyAgICAgICAgICAgIGogKz0gNDsKKworICAgICAgICAgICAgdGhpcy5fQ3RpbWUgPSBEYXRlVGltZS5VdGNOb3c7CisKKyAgICAgICAgICAgIF9udGZzVGltZXNBcmVTZXQgPSB0cnVlOworICAgICAgICAgICAgX3RpbWVzdGFtcCB8PSBaaXBFbnRyeVRpbWVzdGFtcC5JbmZvWmlwMTsgcmV0dXJuIGo7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBpbnQgUHJvY2Vzc0V4dHJhRmllbGRVbml4VGltZXMoYnl0ZVtdIGJ1ZmZlciwgaW50IGosIEludDE2IGRhdGFTaXplLCBsb25nIHBvc24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBVbml4IGZpbGV0aW1lcyBhcmUgMzItYml0IHVuc2lnbmVkIGludGVnZXJzLAorICAgICAgICAgICAgLy8gc3RvcmluZyBzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2guCisKKyAgICAgICAgICAgIGlmIChkYXRhU2l6ZSAhPSAxMyAmJiBkYXRhU2l6ZSAhPSA5ICYmIGRhdGFTaXplICE9IDUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlYWRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiICBVbmV4cGVjdGVkIHNpemUgKDB4ezA6WDR9KSBmb3IgRXh0ZW5kZWQgVGltZXN0YW1wIGV4dHJhIGZpZWxkIGF0IHBvc2l0aW9uIDB4ezE6WDE2fSIsIGRhdGFTaXplLCBwb3NuKSk7CisKKyAgICAgICAgICAgIGludCByZW1haW5pbmdEYXRhID0gZGF0YVNpemU7CisKKyAgICAgICAgICAgIHZhciBzbHVycCA9IG5ldyBGdW5jPERhdGVUaW1lPiggKCkgPT4geworICAgICAgICAgICAgICAgICAgICBJbnQzMiB0aW1ldCA9IEJpdENvbnZlcnRlci5Ub0ludDMyKGJ1ZmZlciwgaik7CisgICAgICAgICAgICAgICAgICAgIGogKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nRGF0YSAtPSA0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VuaXhFcG9jaC5BZGRTZWNvbmRzKHRpbWV0KTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKGRhdGFTaXplID09IDEzIHx8IF9yZWFkRXh0cmFEZXB0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBmbGFnID0gYnVmZmVyW2orK107CisgICAgICAgICAgICAgICAgcmVtYWluaW5nRGF0YS0tOworCisgICAgICAgICAgICAgICAgaWYgKChmbGFnICYgMHgwMDAxKSAhPSAwICYmIHJlbWFpbmluZ0RhdGEgPj0gNCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fTXRpbWUgPSBzbHVycCgpOworCisgICAgICAgICAgICAgICAgIHRoaXMuX0F0aW1lID0gKChmbGFnICYgMHgwMDAyKSAhPSAwICYmIHJlbWFpbmluZ0RhdGEgPj0gNCkKKyAgICAgICAgICAgICAgICAgICAgID8gc2x1cnAoKQorICAgICAgICAgICAgICAgICAgICAgOiBEYXRlVGltZS5VdGNOb3c7CisKKyAgICAgICAgICAgICAgICAgdGhpcy5fQ3RpbWUgPSAgKChmbGFnICYgMHgwMDA0KSAhPSAwICYmIHJlbWFpbmluZ0RhdGEgPj0gNCkKKyAgICAgICAgICAgICAgICAgICAgID8gc2x1cnAoKQorICAgICAgICAgICAgICAgICAgICAgOkRhdGVUaW1lLlV0Y05vdzsKKworICAgICAgICAgICAgICAgIF90aW1lc3RhbXAgfD0gWmlwRW50cnlUaW1lc3RhbXAuVW5peDsKKyAgICAgICAgICAgICAgICBfbnRmc1RpbWVzQXJlU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfZW1pdFVuaXhUaW1lcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUmVhZEV4dHJhRmllbGQoKTsgLy8gd2lsbCByZWN1cnNlCisKKyAgICAgICAgICAgIHJldHVybiBqOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGludCBQcm9jZXNzRXh0cmFGaWVsZFdpbmRvd3NUaW1lcyhieXRlW10gYnVmZmVyLCBpbnQgaiwgSW50MTYgZGF0YVNpemUsIGxvbmcgcG9zbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIE5URlMgZmlsZXRpbWVzIGFyZSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMsIHN0b3JlZCBpbiBJbnRlbAorICAgICAgICAgICAgLy8gKGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QpIGJ5dGUgb3JkZXIuIFRoZXkgYXJlIGV4cHJlc3NlZCBhcyB0aGUKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiAxLjBFLTA3IHNlY29uZHMgKDEvMTB0aCBtaWNyb3NlY29uZHMhKSBwYXN0IFdpbk5UICJlcG9jaCIsCisgICAgICAgICAgICAvLyB3aGljaCBpcyAiMDEtSmFuLTE2MDEgMDA6MDA6MDAgVVRDIi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIZWFkZXJJZCAgIDIgYnl0ZXMgICAgMHgwMDBhID09IE5URlMgc3R1ZmYKKyAgICAgICAgICAgIC8vIERhdGFzaXplICAgMiBieXRlcyAgICA/PyAodXN1YWxseSAzMikKKyAgICAgICAgICAgIC8vIHJlc2VydmVkICAgNCBieXRlcyAgICA/PworICAgICAgICAgICAgLy8gdGltZXRhZyAgICAyIGJ5dGVzICAgIDB4MDAwMSA9PSB0aW1lCisgICAgICAgICAgICAvLyBzaXplICAgICAgIDIgYnl0ZXMgICAgMjQgPT0gOCBieXRlcyBlYWNoIGZvciBjdGltZSwgbXRpbWUsIGF0aW1lCisgICAgICAgICAgICAvLyBtdGltZSAgICAgIDggYnl0ZXMgICAgd2luMzIgdGlja3Mgc2luY2Ugd2luMzJlcG9jaAorICAgICAgICAgICAgLy8gYXRpbWUgICAgICA4IGJ5dGVzICAgIHdpbjMyIHRpY2tzIHNpbmNlIHdpbjMyZXBvY2gKKyAgICAgICAgICAgIC8vIGN0aW1lICAgICAgOCBieXRlcyAgICB3aW4zMiB0aWNrcyBzaW5jZSB3aW4zMmVwb2NoCisKKyAgICAgICAgICAgIGlmIChkYXRhU2l6ZSAhPSAzMikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVhZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCIgIFVuZXhwZWN0ZWQgc2l6ZSAoMHh7MDpYNH0pIGZvciBOVEZTIHRpbWVzIGV4dHJhIGZpZWxkIGF0IHBvc2l0aW9uIDB4ezE6WDE2fSIsIGRhdGFTaXplLCBwb3NuKSk7CisKKyAgICAgICAgICAgIGogKz0gNDsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICBJbnQxNiB0aW1ldGFnID0gKEludDE2KShidWZmZXJbal0gKyBidWZmZXJbaiArIDFdICogMjU2KTsKKyAgICAgICAgICAgIEludDE2IGFkZGxzaXplID0gKEludDE2KShidWZmZXJbaiArIDJdICsgYnVmZmVyW2ogKyAzXSAqIDI1Nik7CisgICAgICAgICAgICBqICs9IDQ7ICAvLyB0YWcgYW5kIHNpemUKKworICAgICAgICAgICAgaWYgKHRpbWV0YWcgPT0gMHgwMDAxICYmIGFkZGxzaXplID09IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEludDY0IHogPSBCaXRDb252ZXJ0ZXIuVG9JbnQ2NChidWZmZXIsIGopOworICAgICAgICAgICAgICAgIHRoaXMuX010aW1lID0gRGF0ZVRpbWUuRnJvbUZpbGVUaW1lVXRjKHopOworICAgICAgICAgICAgICAgIGogKz0gODsKKworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGxpYnJhcnkgKmNvdWxkKiBzZXQgdGhlIExhc3RNb2RpZmllZCB2YWx1ZQorICAgICAgICAgICAgICAgIC8vIHRvIGNvaW5jaWRlIHdpdGggdGhlIE10aW1lIHZhbHVlLiAgSW4gdGhlb3J5LCB0aGV5IHJlZmVyIHRvCisgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgcHJvcGVydHkgb2YgdGhlIGZpbGUsIGFuZCBzaG91bGQgYmUgdGhlIHNhbWUgYW55d2F5LAorICAgICAgICAgICAgICAgIC8vIGFsbG93aW5nIGZvciBkaWZmZXJlbmNlcyBpbiBwcmVjaXNpb24uICBCdXQgdGhleSBhcmUKKyAgICAgICAgICAgICAgICAvLyBpbmRlcGVuZGVudCBxdWFudGl0aWVzIGluIHRoZSB6aXAgYXJjaGl2ZSwgYW5kIHRoaXMgbGlicmFyeQorICAgICAgICAgICAgICAgIC8vIHdpbGwga2VlcCB0aGVtIHNlcGFyYXRlIGluIHRoZSBvYmplY3QgbW9kZWwuIFRoZXJlIGlzIG5vIGlsbAorICAgICAgICAgICAgICAgIC8vIGVmZmVjdCBmcm9tIHRoaXMsIGJlY2F1c2UgYXMgZmlsZXMgYXJlIGV4dHJhY3RlZCwgdGhlCisgICAgICAgICAgICAgICAgLy8gaGlnaGVyLXByZWNpc2lvbiB2YWx1ZSAoTXRpbWUpIGlzIHVzZWQgaWYgaXQgaXMgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAvLyBBcHBzIG1heSB3aXNoIHRvIGNvbXBhcmUgdGhlIE10aW1lIHZlcnN1cyBMYXN0TW9kaWZpZWQKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZXMsIGJ1dCBhbnkgZGlmZmVyZW5jZSB3aGVuIGJvdGggYXJlIHByZXNlbnQgaXMgbm90CisgICAgICAgICAgICAgICAgLy8gZ2VybWFpbmUgdG8gdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBsaWJyYXJ5LiBidXQgbm90ZTogd2hlbgorICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2V0dGluZyBlaXRoZXIgdmFsdWUsIGJvdGggYXJlIHNldC4gU2VlIHRoZSBzZXR0ZXIKKyAgICAgICAgICAgICAgICAvLyBmb3IgTGFzdE1vZGlmaWVkIG9yIHRoZSBTZXROdGZzVGltZXMoKSBtZXRob2QuCisKKyAgICAgICAgICAgICAgICB6ID0gQml0Q29udmVydGVyLlRvSW50NjQoYnVmZmVyLCBqKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9BdGltZSA9IERhdGVUaW1lLkZyb21GaWxlVGltZVV0Yyh6KTsKKyAgICAgICAgICAgICAgICBqICs9IDg7CisKKyAgICAgICAgICAgICAgICB6ID0gQml0Q29udmVydGVyLlRvSW50NjQoYnVmZmVyLCBqKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9DdGltZSA9IERhdGVUaW1lLkZyb21GaWxlVGltZVV0Yyh6KTsKKyAgICAgICAgICAgICAgICBqICs9IDg7CisKKyAgICAgICAgICAgICAgICBfbnRmc1RpbWVzQXJlU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfdGltZXN0YW1wIHw9IFppcEVudHJ5VGltZXN0YW1wLldpbmRvd3M7CisgICAgICAgICAgICAgICAgX2VtaXROdGZzVGltZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnkuV3JpdGUuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBFbnRyeS5Xcml0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk1MjExCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnkuV3JpdGUuY3MKQEAgLTAsMCArMSwyNTgzIEBACisvLyNkZWZpbmUgVHJhY2UKKworLy8gWmlwRW50cnkuV3JpdGUuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOS0yMDExIERpbm8gQ2hpZXNhCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIExhc3QgU2F2ZWQ6IDwyMDExLUp1bHktMzAgMTQ6NTU6NDc+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBsb2dpYyBmb3Igd3JpdGluZyAoc2F2aW5nKSB0aGUgWmlwRW50cnkgaW50byBhCisvLyB6aXAgZmlsZS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgUkUgPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFppcEVudHJ5CisgICAgeworICAgICAgICBpbnRlcm5hbCB2b2lkIFdyaXRlQ2VudHJhbERpcmVjdG9yeUVudHJ5KFN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIC8vIHNpZ25hdHVyZQorICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShaaXBDb25zdGFudHMuWmlwRGlyRW50cnlTaWduYXR1cmUgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKFppcENvbnN0YW50cy5aaXBEaXJFbnRyeVNpZ25hdHVyZSAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoWmlwQ29uc3RhbnRzLlppcERpckVudHJ5U2lnbmF0dXJlICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoWmlwQ29uc3RhbnRzLlppcERpckVudHJ5U2lnbmF0dXJlICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCisgICAgICAgICAgICAvLyBWZXJzaW9uIE1hZGUgQnkKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDcwNzEKKyAgICAgICAgICAgIC8vIFdlIG11c3Qgbm90IG92ZXJ3cml0ZSB0aGUgVmVyc2lvbk1hZGVCeSBmaWVsZCB3aGVuIHdyaXRpbmcgb3V0IGEgemlwCisgICAgICAgICAgICAvLyBhcmNoaXZlLiAgVGhlIFZlcnNpb25NYWRlQnkgdGVsbHMgdGhlIHppcCByZWFkZXIgdGhlIG1lYW5pbmcgb2YgdGhlCisgICAgICAgICAgICAvLyBGaWxlIGF0dHJpYnV0ZXMuICBPdmVyd3JpdGluZyB0aGUgVmVyc2lvbk1hZGVCeSB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgICAgLy8gaW5jb25zaXN0ZW50IG1ldGFkYXRhLiAgQ29uc2lkZXIgdGhlIHNjZW5hcmlvIHdoZXJlIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgLy8gb3BlbnMgYW5kIHJlYWRzIGEgemlwIGZpbGUgdGhhdCBoYWQgYmVlbiBjcmVhdGVkIG9uIExpbnV4LiBUaGVuIHRoZQorICAgICAgICAgICAgLy8gYXBwIGFkZHMgb25lIGZpbGUgdG8gdGhlIFppcCBhcmNoaXZlLCBhbmQgc2F2ZXMgaXQuICBUaGUgZmlsZQorICAgICAgICAgICAgLy8gYXR0cmlidXRlcyBmb3IgYWxsIHRoZSBlbnRyaWVzIGFkZGVkIG9uIExpbnV4IHdpbGwgYmUgc2lnbmlmaWNhbnQgZm9yCisgICAgICAgICAgICAvLyBMaW51eC4gIFRoZXJlZm9yZSB0aGUgVmVyc2lvbk1hZGVCeSBmb3IgdGhvc2UgZW50cmllcyBtdXN0IG5vdCBiZQorICAgICAgICAgICAgLy8gY2hhbmdlZC4gIE9ubHkgdGhlIGVudHJpZXMgdGhhdCBhcmUgYWN0dWFsbHkgY3JlYXRlZCBvbiBXaW5kb3dzIE5URlMKKyAgICAgICAgICAgIC8vIHNob3VsZCBnZXQgdGhlIFZlcnNpb25NYWRlQnkgaW5kaWNhdGluZyBXaW5kb3dzL05URlMuCisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKF9WZXJzaW9uTWFkZUJ5ICYgMHgwMEZGKTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9WZXJzaW9uTWFkZUJ5ICYgMHhGRjAwKSA+PiA4KTsKKworICAgICAgICAgICAgLy8gQXBwYXJlbnRseSB3ZSB3YW50IHRvIGR1cGxpY2F0ZSB0aGUgZXh0cmEgZmllbGQgaGVyZTsgd2UgY2Fubm90CisgICAgICAgICAgICAvLyBzaW1wbHkgemVybyBpdCBvdXQgYW5kIGFzc3VtZSB0b29scyBhbmQgYXBwcyB3aWxsIHVzZSB0aGUgcmlnaHQgb25lLgorCisgICAgICAgICAgICAvLy8vSW50MTYgZXh0cmFGaWVsZExlbmd0aFNhdmUgPSAoc2hvcnQpKF9FbnRyeUhlYWRlclsyOF0gKyBfRW50cnlIZWFkZXJbMjldICogMjU2KTsKKyAgICAgICAgICAgIC8vLy9fRW50cnlIZWFkZXJbMjhdID0gMDsKKyAgICAgICAgICAgIC8vLy9fRW50cnlIZWFkZXJbMjldID0gMDsKKworICAgICAgICAgICAgLy8gVmVyc2lvbiBOZWVkZWQsIEJpdGZpZWxkLCBjb21wcmVzc2lvbiBtZXRob2QsIGxhc3Rtb2QsCisgICAgICAgICAgICAvLyBjcmMsIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcywgZmlsZW5hbWUgbGVuZ3RoIGFuZCBleHRyYSBmaWVsZCBsZW5ndGguCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxsIHByZXNlbnQgaW4gdGhlIGxvY2FsIGZpbGUgaGVhZGVyLCBidXQgdGhleSBtYXkgYmUgemVybyB2YWx1ZXMgdGhlcmUuCisgICAgICAgICAgICAvLyBTbyB3ZSBjYW5ub3QganVzdCBjb3B5IHRoZW0uCisKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDExOTY5OiBWZXJzaW9uIE5lZWRlZCBUbyBFeHRyYWN0IGluIGNlbnRyYWwgZGlyZWN0b3J5IG11c3QgYmUKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBlbnRyeSBvciBNUyAuTkVUIFN5c3RlbS5JTy5aaXAgZmFpbHMgcmVhZC4KKyAgICAgICAgICAgIEludDE2IHZOZWVkZWQgPSAoSW50MTYpKFZlcnNpb25OZWVkZWQgIT0gMCA/IFZlcnNpb25OZWVkZWQgOiAyMCk7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMjk2NAorICAgICAgICAgICAgaWYgKF9PdXRwdXRVc2VzWmlwNjQ9PW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYSB6aXBlbnRyeSBpbiBhIHppcG91dHB1dHN0cmVhbSwgd2l0aCB6ZXJvIGJ5dGVzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICBfT3V0cHV0VXNlc1ppcDY0ID0gbmV3IE51bGxhYmxlPGJvb2w+KF9jb250YWluZXIuWmlwNjQgPT0gWmlwNjRPcHRpb24uQWx3YXlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSW50MTYgdmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IChJbnQxNikoX091dHB1dFVzZXNaaXA2NC5WYWx1ZSA/IDQ1IDogdk5lZWRlZCk7CisjaWYgQlpJUAorICAgICAgICAgICAgaWYgKHRoaXMuQ29tcHJlc3Npb25NZXRob2QgPT0gSW9uaWMuWmlwLkNvbXByZXNzaW9uTWV0aG9kLkJaaXAyKQorICAgICAgICAgICAgICAgIHZlcnNpb25OZWVkZWRUb0V4dHJhY3QgPSA0NjsKKyNlbmRpZgorCisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKHZlcnNpb25OZWVkZWRUb0V4dHJhY3QgJiAweDAwRkYpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgodmVyc2lvbk5lZWRlZFRvRXh0cmFjdCAmIDB4RkYwMCkgPj4gOCk7CisKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoX0JpdEZpZWxkICYgMHgwMEZGKTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9CaXRGaWVsZCAmIDB4RkYwMCkgPj4gOCk7CisKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoX0NvbXByZXNzaW9uTWV0aG9kICYgMHgwMEZGKTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9Db21wcmVzc2lvbk1ldGhvZCAmIDB4RkYwMCkgPj4gOCk7CisKKyNpZiBBRVNDUllQVE8KKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMTI4IHx8CisgICAgICAgICAgICBFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgLT0gMjsKKyAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gMHg2MzsKKyAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKF9UaW1lQmxvYiAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoX1RpbWVCbG9iICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfVGltZUJsb2IgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfVGltZUJsb2IgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKF9DcmMzMiAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoX0NyYzMyICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfQ3JjMzIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfQ3JjMzIgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGlmIChfT3V0cHV0VXNlc1ppcDY0LlZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvbXByZXNzZWRTaXplIChJbnQzMikgYW5kIFVuY29tcHJlc3NlZFNpemUgLSBhbGwgMHhGRgorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAweEZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoX0NvbXByZXNzZWRTaXplICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoX0NvbXByZXNzZWRTaXplICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoX0NvbXByZXNzZWRTaXplICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9Db21wcmVzc2VkU2l6ZSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoX1VuY29tcHJlc3NlZFNpemUgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfVW5jb21wcmVzc2VkU2l6ZSAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9VbmNvbXByZXNzZWRTaXplICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9VbmNvbXByZXNzZWRTaXplICYgMHhGRjAwMDAwMCkgPj4gMjQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gZmlsZU5hbWVCeXRlcyA9IEdldEVuY29kZWRGaWxlTmFtZUJ5dGVzKCk7CisgICAgICAgICAgICBJbnQxNiBmaWxlbmFtZUxlbmd0aCA9IChJbnQxNilmaWxlTmFtZUJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoZmlsZW5hbWVMZW5ndGggJiAweDAwRkYpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoZmlsZW5hbWVMZW5ndGggJiAweEZGMDApID4+IDgpOworCisgICAgICAgICAgICAvLyBkbyB0aGlzIGFnYWluIGJlY2F1c2Ugbm93IHdlIGhhdmUgcmVhbCBkYXRhCisgICAgICAgICAgICBfcHJlc3VtZVppcDY0ID0gX091dHB1dFVzZXNaaXA2NC5WYWx1ZTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTExMzEKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBjYW5ub3QgZ2VuZXJhdGUgdGhlIGV4dHJhIGZpZWxkIGFnYWluLCBoZXJlJ3Mgd2h5OiBJbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAvLyB6ZXJvLWJ5dGUgZW50cnksIHdoaWNoIHVzZXMgZW5jcnlwdGlvbiwgRG90TmV0WmlwIHdpbGwgInJlbW92ZSIgdGhlCisgICAgICAgICAgICAvLyBlbmNyeXB0aW9uIGZyb20gdGhlIGVudHJ5LiAgSXQgZG9lcyB0aGlzIGluIFBvc3RQcm9jZXNzT3V0cHV0OyBpdAorICAgICAgICAgICAgLy8gbW9kaWZpZXMgdGhlIGVudHJ5IGhlYWRlciwgYW5kIHJld3JpdGVzIGl0LCByZXNldHRpbmcgdGhlIEJpdGZpZWxkCisgICAgICAgICAgICAvLyAob25lIGJpdCBpbmRpY2F0ZXMgZW5jcnlwdGlvbiksIGFuZCBwb3RlbnRpYWxseSByZXNldHRpbmcgdGhlCisgICAgICAgICAgICAvLyBjb21wcmVzc2lvbiBtZXRob2QgLSBmb3IgQUVTIHRoZSBDb21wcmVzc2lvbiBtZXRob2QgaXMgMHg2MywgYW5kIGl0CisgICAgICAgICAgICAvLyB3b3VsZCBnZXQgcmVzZXQgdG8gemVybyAobm8gY29tcHJlc3Npb24pLiAgSXQgdGhlbiBjYWxscyBTZXRMZW5ndGgoKQorICAgICAgICAgICAgLy8gdG8gdHJ1bmNhdGUgdGhlIHN0cmVhbSB0byByZW1vdmUgdGhlIGVuY3J5cHRpb24gaGVhZGVyICgxMiBieXRlcyBmb3IKKyAgICAgICAgICAgIC8vIEFFUzI1NikuICBCdXQsIGl0IGxlYXZlcyB0aGUgcHJldmlvdXNseS1nZW5lcmF0ZWQgIkV4dHJhIEZpZWxkIgorICAgICAgICAgICAgLy8gbWV0YWRhdGEgKDExIGJ5dGVzKSBmb3IgQUVTIGluIHRoZSBlbnRyeSBoZWFkZXIuIFRoaXMgZXh0cmEgZmllbGQKKyAgICAgICAgICAgIC8vIGRhdGEgaXMgbm93ICJvcnBoYW5lZCIgLSBpdCByZWZlcnMgdG8gQUVTIGVuY3J5cHRpb24gd2hlbiBpbiBmYWN0IG5vCisgICAgICAgICAgICAvLyBBRVMgZW5jcnlwdGlvbiBpcyB1c2VkLiBCdXQgbm8gcHJvYmxlbSwgdGhlIFBLV0FSRSBzcGVjIHNheXMgdGhhdAorICAgICAgICAgICAgLy8gdW5yZWNvZ25pemVkIGV4dHJhIGZpZWxkcyBjYW4ganVzdCBiZSBpZ25vcmVkLiBvay4gIEFmdGVyICJyZW1vdmFsIgorICAgICAgICAgICAgLy8gb2YgQUVTIGVuY3J5cHRpb24sIHRoZSBsZW5ndGggb2YgdGhlIEV4dHJhIEZpZWxkIGNhbiByZW1haW5zIHRoZQorICAgICAgICAgICAgLy8gc2FtZTsgaXQncyBqdXN0IHRoYXQgdGhlcmUgd2lsbCBiZSAxMSBieXRlcyBpbiB0aGVyZSB0aGF0IHByZXZpb3VzbHkKKyAgICAgICAgICAgIC8vIHBlcnRhaW5lZCB0byBBRVMgd2hpY2ggYXJlIG5vdyB1bnVzZWQuIEV2ZW4gdGhlIGZpZWxkIGNvZGUgaXMgc3RpbGwKKyAgICAgICAgICAgIC8vIHRoZXJlLCBidXQgaXQgd2lsbCBiZSB1bnVzZWQgYnkgcmVhZGVycywgYXMgdGhlIGVuY3J5cHRpb24gYml0IGlzIG5vdAorICAgICAgICAgICAgLy8gc2V0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0aW5nIHRoZSBFeHRyYSBmaWVsZCBub3cgd291bGQgcHJvZHVjZSBhIGJsb2NrIHRoYXQgaXMgMTEKKyAgICAgICAgICAgIC8vIGJ5dGVzIHNob3J0ZXIsIGFuZCB0aGF0IG1pc21hdGNoIC0gYmV0d2VlbiB0aGUgZXh0cmEgZmllbGQgaW4gdGhlCisgICAgICAgICAgICAvLyBsb2NhbCBoZWFkZXIgYW5kIHRoZSBleHRyYSBmaWVsZCBpbiB0aGUgQ2VudHJhbCBEaXJlY3RvcnkgLSB3b3VsZAorICAgICAgICAgICAgLy8gY2F1c2UgcHJvYmxlbXMuICh3aGVyZT8gd2h5PyB3aGF0IHByb2JsZW1zPykgIFNvIHdlIGNhbid0IGRvCisgICAgICAgICAgICAvLyB0aGF0LiBJdCdzIGFsbCBnb29kIHRob3VnaCwgYmVjYXVzZSB0aG91Z2ggdGhlIGNvbnRlbnQgbWF5IGhhdmUKKyAgICAgICAgICAgIC8vIGNoYW5nZWQsIHRoZSBsZW5ndGggZGVmaW5pdGVseSBoYXMgbm90LiBBbHNvLCB0aGUgX0VudHJ5SGVhZGVyCisgICAgICAgICAgICAvLyBjb250YWlucyB0aGUgInVwZGF0ZWQiIGV4dHJhIGZpZWxkIChhZnRlciBQb3N0UHJvY2Vzc091dHB1dCkgYXQKKyAgICAgICAgICAgIC8vIG9mZnNldCAoMzAgKyBmaWxlbmFtZUxlbmd0aCkuCisKKyAgICAgICAgICAgIF9FeHRyYSA9IENvbnN0cnVjdEV4dHJhRmllbGQodHJ1ZSk7CisKKyAgICAgICAgICAgIEludDE2IGV4dHJhRmllbGRMZW5ndGggPSAoSW50MTYpKChfRXh0cmEgPT0gbnVsbCkgPyAwIDogX0V4dHJhLkxlbmd0aCk7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKGV4dHJhRmllbGRMZW5ndGggJiAweDAwRkYpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoZXh0cmFGaWVsZExlbmd0aCAmIDB4RkYwMCkgPj4gOCk7CisKKyAgICAgICAgICAgIC8vIEZpbGUgKGVudHJ5KSBDb21tZW50IExlbmd0aAorICAgICAgICAgICAgLy8gdGhlIF9Db21tZW50Qnl0ZXMgcHJpdmF0ZSBmaWVsZCB3YXMgc2V0IGR1cmluZyBXcml0ZUhlYWRlcigpCisgICAgICAgICAgICBpbnQgY29tbWVudExlbmd0aCA9IChfQ29tbWVudEJ5dGVzID09IG51bGwpID8gMCA6IF9Db21tZW50Qnl0ZXMuTGVuZ3RoOworCisgICAgICAgICAgICAvLyB0aGUgc2l6ZSBvZiBvdXIgYnVmZmVyIGRlZmluZXMgdGhlIG1heCBsZW5ndGggb2YgdGhlIGNvbW1lbnQgd2UgY2FuIHdyaXRlCisgICAgICAgICAgICBpZiAoY29tbWVudExlbmd0aCArIGkgPiBieXRlcy5MZW5ndGgpIGNvbW1lbnRMZW5ndGggPSBieXRlcy5MZW5ndGggLSBpOworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShjb21tZW50TGVuZ3RoICYgMHgwMEZGKTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKGNvbW1lbnRMZW5ndGggJiAweEZGMDApID4+IDgpOworCisgICAgICAgICAgICAvLyBEaXNrIG51bWJlciBzdGFydAorICAgICAgICAgICAgYm9vbCBzZWdtZW50ZWQgPSAodGhpcy5fY29udGFpbmVyLlppcEZpbGUgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAodGhpcy5fY29udGFpbmVyLlppcEZpbGUuTWF4T3V0cHV0U2VnbWVudFNpemUgIT0gMCk7CisgICAgICAgICAgICBpZiAoc2VnbWVudGVkKSAvLyB3b3JraXRlbSAxMzkxNQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEVtaXQgbm9uemVybyBkaXNrbnVtYmVyIG9ubHkgaWYgc2F2aW5nIHNlZ21lbnRlZCBhcmNoaXZlLgorICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoX2Rpc2tOdW1iZXIgJiAweDAwRkYpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9kaXNrTnVtYmVyICYgMHhGRjAwKSA+PiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJZiByZWFkaW5nIGEgc2VnbW5ldGVkIGFyY2hpdmUgYW5kIHNhdmluZyB0byBhIHJlZ3VsYXIgYXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAvLyBaaXBFbnRyeS5fZGlza051bWJlciB3aWxsIGJlIG5vbi16ZXJvIGJ1dCBpdCBzaG91bGQgYmUgc2F2ZWQgYXMKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLgorICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAwOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJzCisgICAgICAgICAgICAvLyB3b3JraXRlbSA3ODAxCisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfSXNUZXh0KSA/IDEgOiAwKTsgLy8gbG8gYml0OiBmaWxldHlwZSBoaW50LiAgMD1iaW4sIDE9dHh0LgorICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDA7CisKKyAgICAgICAgICAgIC8vIGV4dGVybmFsIGZpbGUgYXR0cnMKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDcwNzEKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoX0V4dGVybmFsRmlsZUF0dHJzICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChfRXh0ZXJuYWxGaWxlQXR0cnMgJiAweDAwMDBGRjAwKSA+PiA4KTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9FeHRlcm5hbEZpbGVBdHRycyAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9FeHRlcm5hbEZpbGVBdHRycyAmIDB4RkYwMDAwMDApID4+IDI0KTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTExMzEKKyAgICAgICAgICAgIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgbmVjZXNzYXJ5IHRvIGdvIHRvIDY0LWJpdCB2YWx1ZSwgdGhlbiBlbWl0IDB4RkZGRkZGRkYsCisgICAgICAgICAgICAvLyBlbHNlIHdyaXRlIG91dCB0aGUgdmFsdWUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRXZlbiBpZiB6aXA2NCBpcyByZXF1aXJlZCBmb3Igb3RoZXIgcmVhc29ucyAtIG51bWJlciBvZiB0aGUgZW50cnkKKyAgICAgICAgICAgIC8vID4gNjU1MzQsIG9yIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBlbnRyeSA+IE1BWF9JTlQzMiwgdGhlIFJPTEgKKyAgICAgICAgICAgIC8vIG5lZWQgbm90IGJlIHN0b3JlZCBpbiBhIDY0LWJpdCBmaWVsZCAuCisgICAgICAgICAgICBpZiAoX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA+IDB4RkZGRkZGRkZMKSAvLyBfT3V0cHV0VXNlc1ppcDY0LlZhbHVlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDB4RkY7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDB4RkY7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDB4RkY7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKF9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciAmIDB4RkYwMDAwMDApID4+IDI0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWN0dWFsIGZpbGVuYW1lCisgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGZpbGVOYW1lQnl0ZXMsIDAsIGJ5dGVzLCBpLCBmaWxlbmFtZUxlbmd0aCk7CisgICAgICAgICAgICBpICs9IGZpbGVuYW1lTGVuZ3RoOworCisgICAgICAgICAgICAvLyAiRXh0cmEgZmllbGQiCisgICAgICAgICAgICBpZiAoX0V4dHJhICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTExMzEKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBFbnRyeUhlYWRlciBpZiBhdmFpbGFibGUgLSBpdCBtYXkgaGF2ZSBiZWVuIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgLy8gaWYgbm90LCBjb3B5IGZyb20gRXh0cmEuIFRoaXMgd291bGQgYmUgdW5uZWNlc3NhcnkgaWYgSSBqdXN0CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlZCB0aGUgRXh0cmEgZmllbGQgd2hlbiB1cGRhdGluZyBFbnRyeUhlYWRlciwgaW4KKyAgICAgICAgICAgICAgICAvLyBQb3N0UHJvY2Vzc091dHB1dC4KKworICAgICAgICAgICAgICAgIC8vPz8gSSBkb24ndCB1bmRlcnN0YW5kIHdoeSBJIHdvdWxkbid0IHdhbnQgdG8ganVzdCB1c2UKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVjYWxjdWxhdGVkIEV4dHJhIGZpZWxkLiA/PworCisgICAgICAgICAgICAgICAgLy8gYnl0ZVtdIGggPSBfRW50cnlIZWFkZXIgPz8gX0V4dHJhOworICAgICAgICAgICAgICAgIC8vIGludCBvZmZ4ID0gKGggPT0gX0VudHJ5SGVhZGVyKSA/IDMwICsgZmlsZW5hbWVMZW5ndGggOiAwOworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlci5CbG9ja0NvcHkoaCwgb2ZmeCwgYnl0ZXMsIGksIGV4dHJhRmllbGRMZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIGkgKz0gZXh0cmFGaWVsZExlbmd0aDsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBoID0gX0V4dHJhOworICAgICAgICAgICAgICAgIGludCBvZmZ4ID0gMDsKKyAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGgsIG9mZngsIGJ5dGVzLCBpLCBleHRyYUZpZWxkTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpICs9IGV4dHJhRmllbGRMZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZpbGUgKGVudHJ5KSBjb21tZW50CisgICAgICAgICAgICBpZiAoY29tbWVudExlbmd0aCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdyBhY3R1YWxseSB3cml0ZSB0aGUgY29tbWVudCBpdHNlbGYgaW50byB0aGUgYnl0ZSBidWZmZXIKKyAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KF9Db21tZW50Qnl0ZXMsIDAsIGJ5dGVzLCBpLCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBmb3IgKGogPSAwOyAoaiA8IGNvbW1lbnRMZW5ndGgpICYmIChpICsgaiA8IGJ5dGVzLkxlbmd0aCk7IGorKykKKyAgICAgICAgICAgICAgICAvLyAgICAgYnl0ZXNbaSArIGpdID0gX0NvbW1lbnRCeXRlc1tqXTsKKyAgICAgICAgICAgICAgICBpICs9IGNvbW1lbnRMZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMuV3JpdGUoYnl0ZXMsIDAsIGkpOworICAgICAgICB9CisKKworI2lmIElORk9aSVBfVVRGOAorICAgICAgICBzdGF0aWMgcHJpdmF0ZSBib29sIEZpbGVOYW1lSXNVdGY4KGNoYXJbXSBGaWxlTmFtZUNoYXJzKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzVVRGOCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbCBpc1VuaWNvZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgRmlsZU5hbWVDaGFycy5MZW5ndGg7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gYiA9IFN5c3RlbS5CaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoRmlsZU5hbWVDaGFyc1tqXSk7CisgICAgICAgICAgICAgICAgaXNVbmljb2RlIHw9IChiLkxlbmd0aCAhPSAyKTsKKyAgICAgICAgICAgICAgICBpc1VuaWNvZGUgfD0gKGJbMV0gIT0gMCk7CisgICAgICAgICAgICAgICAgaXNVVEY4IHw9ICgoYlswXSAmIDB4ODApICE9IDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaXNVVEY4OworICAgICAgICB9CisjZW5kaWYKKworCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIENvbnN0cnVjdEV4dHJhRmllbGQoYm9vbCBmb3JDZW50cmFsRGlyZWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGlzdE9mQmxvY2tzID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8Ynl0ZVtdPigpOworICAgICAgICAgICAgYnl0ZVtdIGJsb2NrOworCisgICAgICAgICAgICAvLyBDb25kaXRpb25hbGx5IGVtaXQgYW4gZXh0cmEgZmllbGQgd2l0aCBaaXA2NCBpbmZvcm1hdGlvbi4gIElmIHRoZQorICAgICAgICAgICAgLy8gWmlwNjQgb3B0aW9uIGlzIEFsd2F5cywgd2UgZW1pdCB0aGUgZmllbGQsIGJlZm9yZSBrbm93aW5nIHRoYXQgaXQncworICAgICAgICAgICAgLy8gbmVjZXNzYXJ5LiAgTGF0ZXIsIGlmIGl0IHR1cm5zIG91dCB0aGlzIGVudHJ5IGRvZXMgbm90IG5lZWQgemlwNjQsCisgICAgICAgICAgICAvLyB3ZSdsbCBzZXQgdGhlIGhlYWRlciBJRCB0byBydWJiaXNoIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAgICAvLyBUaGlzIHJlc3VsdHMgaW4gYWRkaXRpb25hbCBvdmVyaGVhZCBtZXRhZGF0YSBpbiB0aGUgemlwIGZpbGUsIGJ1dAorICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBzbWFsbCBpbiBjb21wYXJpc29uIHRvIHRoZSBlbnRyeSBkYXRhLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9uIHRoZSBvdGhlciBoYW5kIGlmIHRoZSBaaXA2NCBvcHRpb24gaXMgQXNOZWNlc3NhcnkgYW5kIGl0J3MgTk9UCisgICAgICAgICAgICAvLyBmb3IgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LCB0aGVuIHdlIGRvIHRoZSBzYW1lIHRoaW5nLiAgT3IsIGlmIHRoZQorICAgICAgICAgICAgLy8gWmlwNjQgb3B0aW9uIGlzIEFzTmVjZXNzYXJ5IGFuZCBpdCBJUyBmb3IgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LAorICAgICAgICAgICAgLy8gYW5kIHRoZSBlbnRyeSByZXF1aXJlcyB6aXA2NCwgdGhlbiBlbWl0IHRoZSBoZWFkZXIuCisgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5aaXA2NCA9PSBaaXA2NE9wdGlvbi5BbHdheXMgfHwKKyAgICAgICAgICAgICAgICAoX2NvbnRhaW5lci5aaXA2NCA9PSBaaXA2NE9wdGlvbi5Bc05lY2Vzc2FyeSAmJgorICAgICAgICAgICAgICAgICAoIWZvckNlbnRyYWxEaXJlY3RvcnkgfHwgX2VudHJ5UmVxdWlyZXNaaXA2NC5WYWx1ZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGFkZCBleHRyYSBmaWVsZCBmb3IgemlwNjQgaGVyZQorICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc5MjQKKyAgICAgICAgICAgICAgICBpbnQgc3ogPSA0ICsgKGZvckNlbnRyYWxEaXJlY3RvcnkgPyAyOCA6IDE2KTsKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlW3N6XTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoX3ByZXN1bWVaaXA2NCB8fCBmb3JDZW50cmFsRGlyZWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVySWQgPSBhbHdheXMgdXNlIHppcDY0IGV4dGVuc2lvbnMuCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDAxOworICAgICAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHgwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVySWQgPSBkdW1teSBkYXRhIG5vdywgbWF5YmUgc2V0IHRvIDB4MDAwMSAoWklQNjQpIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHg5OTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IDB4OTk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGF0YVNpemUKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKHN6IC0gNCk7ICAvLyBkZWNpbWFsIDI4IG9yIDE2ICAod29ya2l0ZW0gNzkyNCkKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHgwMDsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgbWV0YWRhdGEgLSB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIHJlYWwgdmFsdWVzIHlldC4uLgorCisgICAgICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyhfVW5jb21wcmVzc2VkU2l6ZSksIDAsIGJsb2NrLCBpLCA4KTsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplCisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoX0NvbXByZXNzZWRTaXplKSwgMCwgYmxvY2ssIGksIDgpOworICAgICAgICAgICAgICAgIGkgKz0gODsKKworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc5MjQgLSBvbmx5IGluY2x1ZGUgdGhpcyBpZiB0aGUgImV4dHJhIiBmaWVsZCBpcyBmb3IKKyAgICAgICAgICAgICAgICAvLyB1c2UgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5LiAgSXQgaXMgdW5uZWNlc3NhcnkgYW5kIG5vdCB1c2VmdWwKKyAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgaGVhZGVyOyBtYWtlcyBXaW5aaXAgY2hva2UuCisgICAgICAgICAgICAgICAgaWYgKGZvckNlbnRyYWxEaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciksIDAsIGJsb2NrLCBpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSA4OworCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIGRpc2sgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKDApLCAwLCBibG9jaywgaSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3RPZkJsb2Nrcy5BZGQoYmxvY2spOworICAgICAgICAgICAgfQorCisKKyNpZiBBRVNDUllQVE8KKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMTI4IHx8CisgICAgICAgICAgICAgICAgRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlWzQgKyA3XTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgZm9yIFdpblppcCBBRVMKKyAgICAgICAgICAgICAgICAvLyBoZWFkZXIgaWQKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHgwMTsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHg5OTsKKworICAgICAgICAgICAgICAgIC8vIGRhdGEgc2l6ZQorICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDA3OworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDAwOworCisgICAgICAgICAgICAgICAgLy8gdmVuZG9yIG51bWJlcgorICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDAxOyAgLy8gQUUtMSAtIG1lYW5zICJWZXJpZnkgQ1JDIgorICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDAwOworCisgICAgICAgICAgICAgICAgLy8gdmVuZG9yIGlkICJBRSIKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHg0MTsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHg0NTsKKworICAgICAgICAgICAgICAgIC8vIGtleSBzdHJlbmd0aAorICAgICAgICAgICAgICAgIGludCBrZXlzdHJlbmd0aCA9IEdldEtleVN0cmVuZ3RoSW5CaXRzKEVuY3J5cHRpb24pOworICAgICAgICAgICAgICAgIGlmIChrZXlzdHJlbmd0aCA9PSAxMjgpCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2ldID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXlzdHJlbmd0aCA9PSAyNTYpCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2ldID0gMzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJsb2NrW2ldID0gMHhGRjsKKyAgICAgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgICAgICAvLyBhY3R1YWwgY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKShfQ29tcHJlc3Npb25NZXRob2QgJiAweDAwRkYpOworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoX0NvbXByZXNzaW9uTWV0aG9kICYgMHhGRjAwKTsKKworICAgICAgICAgICAgICAgIGxpc3RPZkJsb2Nrcy5BZGQoYmxvY2spOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChfbnRmc1RpbWVzQXJlU2V0ICYmIF9lbWl0TnRmc1RpbWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJsb2NrID0gbmV3IGJ5dGVbMzIgKyA0XTsKKyAgICAgICAgICAgICAgICAvLyBIZWFkZXJJZCAgIDIgYnl0ZXMgICAgMHgwMDBhID09IE5URlMgdGltZXMKKyAgICAgICAgICAgICAgICAvLyBEYXRhc2l6ZSAgIDIgYnl0ZXMgICAgMzIKKyAgICAgICAgICAgICAgICAvLyByZXNlcnZlZCAgIDQgYnl0ZXMgICAgPz8gZG9uJ3QgY2FyZQorICAgICAgICAgICAgICAgIC8vIHRpbWV0YWcgICAgMiBieXRlcyAgICAweDAwMDEgPT0gTlRGUyB0aW1lCisgICAgICAgICAgICAgICAgLy8gc2l6ZSAgICAgICAyIGJ5dGVzICAgIDI0ID09IDggYnl0ZXMgZWFjaCBmb3IgY3RpbWUsIG10aW1lLCBhdGltZQorICAgICAgICAgICAgICAgIC8vIG10aW1lICAgICAgOCBieXRlcyAgICB3aW4zMiB0aWNrcyBzaW5jZSB3aW4zMmVwb2NoCisgICAgICAgICAgICAgICAgLy8gYXRpbWUgICAgICA4IGJ5dGVzICAgIHdpbjMyIHRpY2tzIHNpbmNlIHdpbjMyZXBvY2gKKyAgICAgICAgICAgICAgICAvLyBjdGltZSAgICAgIDggYnl0ZXMgICAgd2luMzIgdGlja3Mgc2luY2Ugd2luMzJlcG9jaAorICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBmb3IgTlRGUyB0aW1lcworICAgICAgICAgICAgICAgIC8vIGhlYWRlciBpZAorICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDBhOworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDAwOworCisgICAgICAgICAgICAgICAgLy8gZGF0YSBzaXplCisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IDMyOworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAwOworCisgICAgICAgICAgICAgICAgaSArPSA0OyAvLyByZXNlcnZlZAorCisgICAgICAgICAgICAgICAgLy8gdGltZSB0YWcKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHgwMTsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHgwMDsKKworICAgICAgICAgICAgICAgIC8vIGRhdGEgc2l6ZSAoYWdhaW4pCisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IDI0OworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAwOworCisgICAgICAgICAgICAgICAgSW50NjQgeiA9IF9NdGltZS5Ub0ZpbGVUaW1lKCk7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoeiksIDAsIGJsb2NrLCBpLCA4KTsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgeiA9IF9BdGltZS5Ub0ZpbGVUaW1lKCk7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoeiksIDAsIGJsb2NrLCBpLCA4KTsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgeiA9IF9DdGltZS5Ub0ZpbGVUaW1lKCk7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoeiksIDAsIGJsb2NrLCBpLCA4KTsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisKKyAgICAgICAgICAgICAgICBsaXN0T2ZCbG9ja3MuQWRkKGJsb2NrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9udGZzVGltZXNBcmVTZXQgJiYgX2VtaXRVbml4VGltZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IDUgKyA0OworICAgICAgICAgICAgICAgIGlmICghZm9yQ2VudHJhbERpcmVjdG9yeSkgbGVuICs9IDg7CisKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICAgICAgLy8gbG9jYWwgZm9ybToKKyAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIC8vIEhlYWRlcklkICAgMiBieXRlcyAgICAweDU0NTUgPT0gdW5peCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAvLyBEYXRhc2l6ZSAgIDIgYnl0ZXMgICAgMTMKKyAgICAgICAgICAgICAgICAvLyBmbGFncyAgICAgIDEgYnl0ZSAgICAgNyAobG93IHRocmVlIGJpdHMgYWxsIHNldCkKKyAgICAgICAgICAgICAgICAvLyBtdGltZSAgICAgIDQgYnl0ZXMgICAgc2Vjb25kcyBzaW5jZSB1bml4IGVwb2NoCisgICAgICAgICAgICAgICAgLy8gYXRpbWUgICAgICA0IGJ5dGVzICAgIHNlY29uZHMgc2luY2UgdW5peCBlcG9jaAorICAgICAgICAgICAgICAgIC8vIGN0aW1lICAgICAgNCBieXRlcyAgICBzZWNvbmRzIHNpbmNlIHVuaXggZXBvY2gKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGZvcm06CisgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAvLyBIZWFkZXJJZCAgIDIgYnl0ZXMgICAgMHg1NDU1ID09IHVuaXggdGltZXN0YW1wCisgICAgICAgICAgICAgICAgLy8gRGF0YXNpemUgICAyIGJ5dGVzICAgIDUKKyAgICAgICAgICAgICAgICAvLyBmbGFncyAgICAgIDEgYnl0ZSAgICAgNyAobG93IHRocmVlIGJpdHMgYWxsIHNldCkKKyAgICAgICAgICAgICAgICAvLyBtdGltZSAgICAgIDQgYnl0ZXMgICAgc2Vjb25kcyBzaW5jZSB1bml4IGVwb2NoCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgZm9yICJ1bml4IiB0aW1lcworICAgICAgICAgICAgICAgIC8vIGhlYWRlciBpZAorICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDU1OworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAweDU0OworCisgICAgICAgICAgICAgICAgLy8gZGF0YSBzaXplCisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IHVuY2hlY2tlZCgoYnl0ZSkobGVuIC0gNCkpOworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAwOworCisgICAgICAgICAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHgwNzsKKworICAgICAgICAgICAgICAgIEludDMyIHogPSB1bmNoZWNrZWQoKGludCkoKF9NdGltZSAtIF91bml4RXBvY2gpLlRvdGFsU2Vjb25kcykpOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKHopLCAwLCBibG9jaywgaSwgNCk7CisgICAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICAgIGlmICghZm9yQ2VudHJhbERpcmVjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHogPSB1bmNoZWNrZWQoKGludCkoKF9BdGltZSAtIF91bml4RXBvY2gpLlRvdGFsU2Vjb25kcykpOworICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh6KSwgMCwgYmxvY2ssIGksIDQpOworICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHogPSB1bmNoZWNrZWQoKGludCkoKF9DdGltZSAtIF91bml4RXBvY2gpLlRvdGFsU2Vjb25kcykpOworICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh6KSwgMCwgYmxvY2ssIGksIDQpOworICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3RPZkJsb2Nrcy5BZGQoYmxvY2spOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIGluamVjdCBvdGhlciBibG9ja3MgaGVyZS4uLgorCisKKyAgICAgICAgICAgIC8vIGNvbmNhdGVuYXRlIGFueSBibG9ja3Mgd2UndmUgZ290OgorICAgICAgICAgICAgYnl0ZVtdIGFnZ3JlZ2F0ZUJsb2NrID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChsaXN0T2ZCbG9ja3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0b3RhbExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGksIGN1cnJlbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0T2ZCbG9ja3MuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gbGlzdE9mQmxvY2tzW2ldLkxlbmd0aDsKKyAgICAgICAgICAgICAgICBhZ2dyZWdhdGVCbG9jayA9IG5ldyBieXRlW3RvdGFsTGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdE9mQmxvY2tzLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uQXJyYXkuQ29weShsaXN0T2ZCbG9ja3NbaV0sIDAsIGFnZ3JlZ2F0ZUJsb2NrLCBjdXJyZW50LCBsaXN0T2ZCbG9ja3NbaV0uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCArPSBsaXN0T2ZCbG9ja3NbaV0uTGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZUJsb2NrOworICAgICAgICB9CisKKworCisgICAgICAgIC8vIHByaXZhdGUgU3lzdGVtLlRleHQuRW5jb2RpbmcgR2VuZXJhdGVDb21tZW50Qnl0ZXMoKQorICAgICAgICAvLyB7CisgICAgICAgIC8vICAgICB2YXIgZ2V0RW5jb2RpbmcgPSBuZXcgRnVuYzxTeXN0ZW0uVGV4dC5FbmNvZGluZz4oeworICAgICAgICAvLyAgICAgc3dpdGNoIChBbHRlcm5hdGVFbmNvZGluZ1VzYWdlKQorICAgICAgICAvLyAgICAgeworICAgICAgICAvLyAgICAgICAgIGNhc2UgWmlwT3B0aW9uLkFsd2F5czoKKyAgICAgICAgLy8gICAgICAgICAgICAgcmV0dXJuIEFsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAvLyAgICAgICAgIGNhc2UgWmlwT3B0aW9uLk5ldmVyOgorICAgICAgICAvLyAgICAgICAgICAgICByZXR1cm4gaWJtNDM3OworICAgICAgICAvLyAgICAgfQorICAgICAgICAvLyAgICAgdmFyIGNiID0gaWJtNDM3LkdldEJ5dGVzKF9Db21tZW50KTsKKyAgICAgICAgLy8gICAgIC8vIG5lZWQgdG8gdXNlIHRoaXMgZm9ybSBvZiBHZXRTdHJpbmcoKSBmb3IgLk5FVCBDRgorICAgICAgICAvLyAgICAgc3RyaW5nIHMxID0gaWJtNDM3LkdldFN0cmluZyhjYiwgMCwgY2IuTGVuZ3RoKTsKKyAgICAgICAgLy8gICAgIGlmIChzMSA9PSBfQ29tbWVudCkKKyAgICAgICAgLy8gICAgICAgICByZXR1cm4gaWJtNDM3OworICAgICAgICAvLyAgICAgcmV0dXJuIEFsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAvLyAgICAgfSk7CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICB2YXIgZW5jb2RpbmcgPSBnZXRFbmNvZGluZygpOworICAgICAgICAvLyAgICAgX0NvbW1lbnRCeXRlcyA9IGVuY29kaW5nLkdldEJ5dGVzKF9Db21tZW50KTsKKyAgICAgICAgLy8gICAgIHJldHVybiBlbmNvZGluZzsKKyAgICAgICAgLy8gfQorCisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgTm9ybWFsaXplRmlsZU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBoZXJlLCB3ZSBuZWVkIHRvIGZsaXAgdGhlIGJhY2tzbGFzaGVzIHRvIGZvcndhcmQtc2xhc2hlcywKKyAgICAgICAgICAgIC8vIGFsc28sIHdlIG5lZWQgdG8gdHJpbSB0aGUgXFxzZXJ2ZXJcc2hhcmUgc3ludGF4IGZyb20gYW55IFVOQyBwYXRoLgorICAgICAgICAgICAgLy8gYW5kIGZpbmFsbHksIHdlIG5lZWQgdG8gcmVtb3ZlIGFueSBsZWFkaW5nIC5cCisKKyAgICAgICAgICAgIHN0cmluZyBTbGFzaEZpeGVkID0gRmlsZU5hbWUuUmVwbGFjZSgiXFwiLCAiLyIpOworICAgICAgICAgICAgc3RyaW5nIHMxID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgoX1RyaW1Wb2x1bWVGcm9tRnVsbHlRdWFsaWZpZWRQYXRocykgJiYgKEZpbGVOYW1lLkxlbmd0aCA+PSAzKQorICAgICAgICAgICAgICAgICYmIChGaWxlTmFtZVsxXSA9PSAnOicpICYmIChTbGFzaEZpeGVkWzJdID09ICcvJykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdHJpbSBvZmYgdm9sdW1lIGxldHRlciwgY29sb24sIGFuZCBzbGFzaAorICAgICAgICAgICAgICAgIHMxID0gU2xhc2hGaXhlZC5TdWJzdHJpbmcoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoRmlsZU5hbWUuTGVuZ3RoID49IDQpCisgICAgICAgICAgICAgICAgICAgICAmJiAoKFNsYXNoRml4ZWRbMF0gPT0gJy8nKSAmJiAoU2xhc2hGaXhlZFsxXSA9PSAnLycpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IFNsYXNoRml4ZWQuSW5kZXhPZignLycsIDIpOworICAgICAgICAgICAgICAgIGlmIChuID09IC0xKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXRoIGZvciB0aGF0IGVudHJ5IGFwcGVhcnMgdG8gYmUgYmFkbHkgZm9ybWF0dGVkIik7CisgICAgICAgICAgICAgICAgczEgPSBTbGFzaEZpeGVkLlN1YnN0cmluZyhuICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoRmlsZU5hbWUuTGVuZ3RoID49IDMpCisgICAgICAgICAgICAgICAgICAgICAmJiAoKFNsYXNoRml4ZWRbMF0gPT0gJy4nKSAmJiAoU2xhc2hGaXhlZFsxXSA9PSAnLycpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0cmltIG9mZiBkb3QgYW5kIHNsYXNoCisgICAgICAgICAgICAgICAgczEgPSBTbGFzaEZpeGVkLlN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzMSA9IFNsYXNoRml4ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gczE7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgZ2VuZXJhdGUgYW5kIHJldHVybiBhIGJ5dGUgYXJyYXkgdGhhdCBlbmNvZGVzIHRoZSBmaWxlbmFtZQorICAgICAgICAvLy8gICBmb3IgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIHNpZGUgZWZmZWN0czogZ2VuZXJhdGUgYW5kIHN0b3JlIGludG8gX0NvbW1lbnRCeXRlcyB0aGUKKyAgICAgICAgLy8vICAgICBieXRlIGFycmF5IGZvciBhbnkgY29tbWVudCBhdHRhY2hlZCB0byB0aGUgZW50cnkuIEFsc28KKyAgICAgICAgLy8vICAgICBzZXRzIF9hY3R1YWxFbmNvZGluZyB0byBpbmRpY2F0ZSB0aGUgYWN0dWFsIGVuY29kaW5nCisgICAgICAgIC8vLyAgICAgdXNlZC4gVGhlIHNhbWUgZW5jb2RpbmcgaXMgdXNlZCBmb3IgYm90aCBmaWxlbmFtZSBhbmQKKyAgICAgICAgLy8vICAgICBjb21tZW50LgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldEVuY29kZWRGaWxlTmFtZUJ5dGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNjUxMworICAgICAgICAgICAgdmFyIHMxID0gTm9ybWFsaXplRmlsZU5hbWUoKTsKKworICAgICAgICAgICAgc3dpdGNoKEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBaaXBPcHRpb24uQWx3YXlzOgorICAgICAgICAgICAgICAgICAgICBpZiAoIShfQ29tbWVudCA9PSBudWxsIHx8IF9Db21tZW50Lkxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9Db21tZW50Qnl0ZXMgPSBBbHRlcm5hdGVFbmNvZGluZy5HZXRCeXRlcyhfQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIF9hY3R1YWxFbmNvZGluZyA9IEFsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWx0ZXJuYXRlRW5jb2RpbmcuR2V0Qnl0ZXMoczEpOworCisgICAgICAgICAgICAgICAgY2FzZSBaaXBPcHRpb24uTmV2ZXI6CisgICAgICAgICAgICAgICAgICAgIGlmICghKF9Db21tZW50ID09IG51bGwgfHwgX0NvbW1lbnQuTGVuZ3RoID09IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgX0NvbW1lbnRCeXRlcyA9IGlibTQzNy5HZXRCeXRlcyhfQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIF9hY3R1YWxFbmNvZGluZyA9IGlibTQzNzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlibTQzNy5HZXRCeXRlcyhzMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFycml2aW5nIGhlcmUgbWVhbnMgQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSBpcyAiQXNOZWNlc3NhcnkiCisKKyAgICAgICAgICAgIC8vIGNhc2UgWmlwT3B0aW9uLkFzTmVjZXNzYXJ5OgorICAgICAgICAgICAgLy8gd29ya2l0ZW0gNjUxMzogd2hlbiB3cml0aW5nLCB1c2UgdGhlIGFsdGVybmF0aXZlIGVuY29kaW5nCisgICAgICAgICAgICAvLyBvbmx5IHdoZW4gX2FjdHVhbEVuY29kaW5nIGlzIG5vdCB5ZXQgc2V0IChpdCBjYW4gYmUgc2V0CisgICAgICAgICAgICAvLyBkdXJpbmcgUmVhZCksIGFuZCB3aGVuIGlibTQzNyB3aWxsIG5vdCBkby4KKworICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IGlibTQzNy5HZXRCeXRlcyhzMSk7CisgICAgICAgICAgICAvLyBuZWVkIHRvIHVzZSB0aGlzIGZvcm0gb2YgR2V0U3RyaW5nKCkgZm9yIC5ORVQgQ0YKKyAgICAgICAgICAgIHN0cmluZyBzMiA9IGlibTQzNy5HZXRTdHJpbmcocmVzdWx0LCAwLCByZXN1bHQuTGVuZ3RoKTsKKyAgICAgICAgICAgIF9Db21tZW50Qnl0ZXMgPSBudWxsOworICAgICAgICAgICAgaWYgKHMyICE9IHMxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEVuY29kaW5nIHRoZSBmaWxlbmFtZSB3aXRoIGlibTQzNyBkb2VzIG5vdCBhbGxvdyByb3VuZC10cmlwcy4KKyAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHVzZSB0aGUgYWx0ZXJuYXRlIGVuY29kaW5nLiAgQXNzdW1lIGl0IHdpbGwgd29yaywKKyAgICAgICAgICAgICAgICAvLyBubyBjaGVja2luZyBvZiByb3VuZCB0cmlwcyBoZXJlLgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFsdGVybmF0ZUVuY29kaW5nLkdldEJ5dGVzKHMxKTsKKyAgICAgICAgICAgICAgICBpZiAoX0NvbW1lbnQgIT0gbnVsbCAmJiBfQ29tbWVudC5MZW5ndGggIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgX0NvbW1lbnRCeXRlcyA9IEFsdGVybmF0ZUVuY29kaW5nLkdldEJ5dGVzKF9Db21tZW50KTsKKyAgICAgICAgICAgICAgICBfYWN0dWFsRW5jb2RpbmcgPSBBbHRlcm5hdGVFbmNvZGluZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfYWN0dWFsRW5jb2RpbmcgPSBpYm00Mzc7CisKKyAgICAgICAgICAgIC8vIFVzaW5nIGlibTQzNywgRmlsZU5hbWUgY2FuIGJlIGVuY29kZWQgd2l0aG91dCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgLy8gbG9zczsgbm93IHRyeSB0aGUgQ29tbWVudC4KKworICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY29tbWVudCwgdXNlIGlibTQzNy4KKyAgICAgICAgICAgIGlmIChfQ29tbWVudCA9PSBudWxsIHx8IF9Db21tZW50Lkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgY29tbWVudC4gR2V0IHRoZSBlbmNvZGVkIGZvcm0uCisgICAgICAgICAgICBieXRlW10gY2J5dGVzID0gaWJtNDM3LkdldEJ5dGVzKF9Db21tZW50KTsKKyAgICAgICAgICAgIHN0cmluZyBjMiA9IGlibTQzNy5HZXRTdHJpbmcoY2J5dGVzLDAsY2J5dGVzLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciByb3VuZC10cmlwLgorICAgICAgICAgICAgaWYgKGMyICE9IENvbW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBjYW5ub3QgY29ycmVjdGx5IGJlIGVuY29kZWQgd2l0aCBpYm00MzcuICBVc2UKKyAgICAgICAgICAgICAgICAvLyB0aGUgYWx0ZXJuYXRlIGVuY29kaW5nLgorCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQWx0ZXJuYXRlRW5jb2RpbmcuR2V0Qnl0ZXMoczEpOworICAgICAgICAgICAgICAgIF9Db21tZW50Qnl0ZXMgPSBBbHRlcm5hdGVFbmNvZGluZy5HZXRCeXRlcyhfQ29tbWVudCk7CisgICAgICAgICAgICAgICAgX2FjdHVhbEVuY29kaW5nID0gQWx0ZXJuYXRlRW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXNlIElCTTQzNworICAgICAgICAgICAgX0NvbW1lbnRCeXRlcyA9IGNieXRlczsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBib29sIFdhbnRSZWFkQWdhaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX1VuY29tcHJlc3NlZFNpemUgPCAweDEwKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoX0NvbXByZXNzaW9uTWV0aG9kID09IDB4MDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChDb21wcmVzc2lvbkxldmVsID09IE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbC5Ob25lKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoX0NvbXByZXNzZWRTaXplIDwgX1VuY29tcHJlc3NlZFNpemUpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHRoaXMuX1NvdXJjZSA9PSBaaXBFbnRyeVNvdXJjZS5TdHJlYW0gJiYgIXRoaXMuX3NvdXJjZVN0cmVhbS5DYW5TZWVrKSByZXR1cm4gZmFsc2U7CisKKyNpZiBBRVNDUllQVE8KKyAgICAgICAgICAgIGlmIChfYWVzQ3J5cHRvX2ZvcldyaXRlICE9IG51bGwgJiYgKENvbXByZXNzZWRTaXplIC0gX2Flc0NyeXB0b19mb3JXcml0ZS5TaXplT2ZFbmNyeXB0aW9uTWV0YWRhdGEpIDw9IFVuY29tcHJlc3NlZFNpemUgKyAweDEwKSByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKF96aXBDcnlwdG9fZm9yV3JpdGUgIT0gbnVsbCAmJiAoQ29tcHJlc3NlZFNpemUgLSAxMikgPD0gVW5jb21wcmVzc2VkU2l6ZSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHZvaWQgTWF5YmVVbnNldENvbXByZXNzaW9uTWV0aG9kRm9yV3JpdGluZyhpbnQgY3ljbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgd2l0aCBjb21wcmVzc2lvbi4uLiB0dXJuIGl0IG9mZiB0aGlzIHRpbWUKKyAgICAgICAgICAgIGlmIChjeWNsZSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NvbXByZXNzaW9uTWV0aG9kID0gMHgwOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIGZvciBkaXJlY3RvcmllcyA9IDB4MDAgKE5vIENvbXByZXNzaW9uKQorICAgICAgICAgICAgaWYgKElzRGlyZWN0b3J5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZCA9IDB4MDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwRmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgX19GaWxlRGF0YVBvc2l0aW9uIGlzIHplcm8sIHRoZW4gdGhhdCBtZWFucyB3ZSB3aWxsIGdldCB0aGUgZGF0YQorICAgICAgICAgICAgLy8gZnJvbSBhIGZpbGUgb3Igc3RyZWFtLgorCisgICAgICAgICAgICAvLyBJdCBpcyBuZXZlciBwb3NzaWJsZSB0byBjb21wcmVzcyBhIHplcm8tbGVuZ3RoIGZpbGUsIHNvIHdlIGNoZWNrIGZvcgorICAgICAgICAgICAgLy8gdGhpcyBjb25kaXRpb24uCisKKyAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuU3RyZWFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc3NDIKKyAgICAgICAgICAgICAgICBpZiAoX3NvdXJjZVN0cmVhbSAhPSBudWxsICYmIF9zb3VyY2VTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIExlbmd0aCBwcm9wIHdpbGwgdGhyb3cgaWYgQ2FuU2VlayBpcyBmYWxzZQorICAgICAgICAgICAgICAgICAgICBsb25nIGZpbGVMZW5ndGggPSBfc291cmNlU3RyZWFtLkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXByZXNzaW9uTWV0aG9kID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuRmlsZVN5c3RlbSkgJiYgKFNoYXJlZFV0aWxpdGllcy5HZXRGaWxlTGVuZ3RoKExvY2FsRmlsZU5hbWUpID09IDBMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ29tcHJlc3Npb25NZXRob2QgPSAweDAwOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT2ssIHdlJ3JlIGdldHRpbmcgdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBmcm9tIGEKKyAgICAgICAgICAgIC8vIG5vbi16ZXJvLWxlbmd0aCBmaWxlIG9yIHN0cmVhbSwgb3IgYSBmaWxlIG9yIHN0cmVhbSBvZgorICAgICAgICAgICAgLy8gdW5rbm93biBsZW5ndGgsIGFuZCB3ZSBwcmVzdW1lIHRoYXQgaXQgaXMgbm9uLXplcm8uICBJbgorICAgICAgICAgICAgLy8gdGhhdCBjYXNlIHdlIGNoZWNrIHRoZSBjYWxsYmFjayB0byBzZWUgaWYgdGhlIGFwcCB3YW50cworICAgICAgICAgICAgLy8gdG8gdGVsbCB1cyB3aGV0aGVyIHRvIGNvbXByZXNzIG9yIG5vdC4KKyAgICAgICAgICAgIGlmIChTZXRDb21wcmVzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTGV2ZWwgPSBTZXRDb21wcmVzc2lvbihMb2NhbEZpbGVOYW1lLCBfRmlsZU5hbWVJbkFyY2hpdmUpOworCisgICAgICAgICAgICAvLyBmaW5hbGx5LCBzZXQgQ29tcHJlc3Npb25NZXRob2QgdG8gTm9uZSBpZiBDb21wcmVzc2lvbkxldmVsIGlzIE5vbmUKKyAgICAgICAgICAgIGlmIChDb21wcmVzc2lvbkxldmVsID09IChzaG9ydClJb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwuTm9uZSAmJgorICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTWV0aG9kID09IElvbmljLlppcC5Db21wcmVzc2lvbk1ldGhvZC5EZWZsYXRlKQorICAgICAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZCA9IDB4MDA7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLyB3cml0ZSB0aGUgaGVhZGVyIGluZm8gZm9yIGFuIGVudHJ5CisgICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVIZWFkZXIoU3RyZWFtIHMsIGludCBjeWNsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTXVzdCByZW1lbWJlciB0aGUgb2Zmc2V0LCB3aXRoaW4gdGhlIG91dHB1dCBzdHJlYW0sIG9mIHRoaXMgcGFydGljdWxhcgorICAgICAgICAgICAgLy8gZW50cnkgaGVhZGVyLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIDIgcmVhc29uczoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgMS4gc28gd2UgY2FuIGRldGVybWluZSB0aGUgUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyIChST0xIKSBmb3IKKyAgICAgICAgICAgIC8vICAgICB1c2UgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5LgorICAgICAgICAgICAgLy8gIDIuIHNvIHdlIGNhbiBzZWVrIGJhY2t3YXJkIGluIGNhc2UgdGhlcmUgaXMgYW4gZXJyb3Igb3BlbmluZyBvciByZWFkaW5nCisgICAgICAgICAgICAvLyAgICAgdGhlIGZpbGUsIGFuZCB0aGUgYXBwbGljYXRpb24gZGVjaWRlcyB0byBza2lwIHRoZSBmaWxlLiBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAvLyAgICAgd2UgbmVlZCB0byBzZWVrIGJhY2t3YXJkIGluIHRoZSBvdXRwdXQgc3RyZWFtIHRvIGFsbG93IHRoZSBuZXh0IGVudHJ5CisgICAgICAgICAgICAvLyAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIHppcGZpbGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOb3JtYWxseSB5b3Ugd291bGQganVzdCBzdG9yZSB0aGUgb2Zmc2V0IGJlZm9yZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIC8vIHN0cmVhbSBhbmQgYmUgZG9uZSB3aXRoIGl0LiAgQnV0IHRoZSBwb3NzaWJpbGl0eSB0byB1c2Ugc3BsaXQgYXJjaGl2ZXMKKyAgICAgICAgICAgIC8vIG1ha2VzIHRoaXMgYXBwcm9hY2ggaW5lZmZlY3RpdmUuICBJbiBzcGxpdCBhcmNoaXZlcywgZWFjaCBmaWxlIG9yIHNlZ21lbnQKKyAgICAgICAgICAgIC8vIGlzIGJvdW5kIHRvIGEgbWF4IHNpemUgbGltaXQsIGFuZCBlYWNoIGxvY2FsIGZpbGUgaGVhZGVyIG11c3Qgbm90IHNwYW4gYQorICAgICAgICAgICAgLy8gc2VnbWVudCBib3VuZGFyeTsgaXQgbXVzdCBiZSB3cml0dGVuIGNvbnRpZ3VvdXNseS4gIElmIGl0IHdpbGwgZml0IGluIHRoZQorICAgICAgICAgICAgLy8gY3VycmVudCBzZWdtZW50LCB0aGVuIHRoZSBST0xIIGlzIGp1c3QgdGhlIGN1cnJlbnQgUG9zaXRpb24gaW4gdGhlIG91dHB1dAorICAgICAgICAgICAgLy8gc3RyZWFtLiAgSWYgaXQgd29uJ3QgZml0LCB0aGVuIHdlIG5lZWQgYSBuZXcgZmlsZSAoc2VnbWVudCkgYW5kIHRoZSBST0xICisgICAgICAgICAgICAvLyBpcyB6ZXJvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEJ1dCB3ZSBvbmx5IGNhbiBrbm93IGlmIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgaGVhZGVyIGNvbnRpZ3VvdXNseQorICAgICAgICAgICAgLy8gYWZ0ZXIgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgaGVhZGVyLCBhIHNpemUgdGhhdCB2YXJpZXMgd2l0aAorICAgICAgICAgICAgLy8gdGhpbmdzIGxpa2UgZmlsZW5hbWUgbGVuZ3RoLCBjb21tZW50cywgYW5kIGV4dHJhIGZpZWxkcy4gIFdlIGhhdmUgdG8KKyAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGhlYWRlciBmdWxseSBiZWZvcmUga25vd2luZyB3aGV0aGVyIGl0IHdpbGwgZml0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoYXQgdGFrZXMgY2FyZSBvZiBpdGVtICMxIGFib3ZlLiAgTm93LCByZWdhcmRpbmcgIzIuICBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgICAgICAgIC8vIHdoaWxlIGNvbXB1dGluZyB0aGUgbG9jYWwgaGVhZGVyLCB3ZSB3YW50IHRvIGp1c3Qgc2VlayBiYWNrd2FyZC4gVGhlCisgICAgICAgICAgICAvLyBleGNlcHRpb24gaGFuZGxpbmcgbG9naWMgKGluIHRoZSBjYWxsZXIgb2YgV3JpdGVIZWFkZXIpIHVzZXMgUk9MSCB0bworICAgICAgICAgICAgLy8gc2Nyb2xsIGJhY2suCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQWxsIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgc3RhcnRpbmcgb2Zmc2V0IGJlZm9yZSBjb21wdXRpbmcKKyAgICAgICAgICAgIC8vIHRoZSBoZWFkZXIsIGFuZCBhbHNvIHdlIGhhdmUgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0IGxhdGVyLCB0byBoYW5kbGUgdGhlCisgICAgICAgICAgICAvLyBjYXNlIG9mIHNwbGl0IGFyY2hpdmVzLgorCisgICAgICAgICAgICB2YXIgY291bnRlciA9IHMgYXMgQ291bnRpbmdTdHJlYW07CisKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDgwOTg6IG9rIChvdXRwdXQpCisgICAgICAgICAgICAvLyBUaGlzIG1heSBjaGFuZ2UgbGF0ZXIsIGZvciBzcGxpdCBhcmNoaXZlcworCisgICAgICAgICAgICAvLyBEb24ndCBzZXQgX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlci4gSW5zdGVhZCwgc2V0IGEgdGVtcCB2YXJpYWJsZS4KKyAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGZvciByZS1zdHJlYW1pbmcsIHdoZXJlIGEgemlwIGVudHJ5IG1pZ2h0IGJlIHJlYWQgZnJvbSBhCisgICAgICAgICAgICAvLyB6aXAgYXJjaGl2ZSAoYW5kIG1heWJlIGRlY3J5cHRlZCwgYW5kIG1heWJlIGRlY29tcHJlc3NlZCkgYW5kIHRoZW4KKyAgICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gYW5vdGhlciB6aXAgYXJjaGl2ZSwgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgZm9yCisgICAgICAgICAgICAvLyBjb21wcmVzc2lvbiBtZXRob2QsIGNvbXByZXNzaW9uIGxldmVsLCBvciBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKyAgICAgICAgICAgIF9mdXR1cmVfUk9MSCA9IChjb3VudGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgPyBjb3VudGVyLkNvbXB1dGVkUG9zaXRpb24KKyAgICAgICAgICAgICAgICA6IHMuUG9zaXRpb247CisKKyAgICAgICAgICAgIGludCBqID0gMCwgaSA9IDA7CisKKyAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG5ldyBieXRlWzMwXTsKKworICAgICAgICAgICAgLy8gc2lnbmF0dXJlCisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKFppcENvbnN0YW50cy5aaXBFbnRyeVNpZ25hdHVyZSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoWmlwQ29uc3RhbnRzLlppcEVudHJ5U2lnbmF0dXJlICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChaaXBDb25zdGFudHMuWmlwRW50cnlTaWduYXR1cmUgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChaaXBDb25zdGFudHMuWmlwRW50cnlTaWduYXR1cmUgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisKKyAgICAgICAgICAgIC8vIERlc2lnbiBub3RlcyBmb3IgWklQNjQ6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IHRoZSBoZWFkZXIgbXVzdCBpbmNsdWRlIHRoZSBDb21wcmVzc2VkCisgICAgICAgICAgICAvLyBhbmQgVW5jb21wcmVzc2VkIHNpemVzLCBhcyB3ZWxsIGFzIHRoZSBDUkMzMiB2YWx1ZS4gIFdoZW4gY3JlYXRpbmcKKyAgICAgICAgICAgIC8vIGEgemlwIHZpYSBzdHJlYW1lZCBwcm9jZXNzaW5nLCB0aGVzZSBxdWFudGl0aWVzIGFyZSBub3Qga25vd24gdW50aWwKKyAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBpcyBkb25lLiAgVGh1cywgYSB0eXBpY2FsIHdheSB0byBkbyBpdCBpcyB0bworICAgICAgICAgICAgLy8gaW5zZXJ0IHplcm9lcyBmb3IgdGhlc2UgcXVhbnRpdGllcywgdGhlbiBkbyB0aGUgY29tcHJlc3Npb24sIHRoZW4KKyAgICAgICAgICAgIC8vIHNlZWsgYmFjayB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIHZhbHVlcywgdGhlbiBzZWVrIGZvcndhcmQgdG8KKyAgICAgICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGZpbGUgZGF0YS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbHNvIHRoZSBvcHRpb24gb2YgdXNpbmcgYml0IDMgaW4gdGhlIEdQIGJpdGZpZWxkIC0gdG8KKyAgICAgICAgICAgIC8vIHNwZWNpZnkgdGhhdCB0aGVyZSBpcyBhIGRhdGEgZGVzY3JpcHRvciBhZnRlciB0aGUgZmlsZSBkYXRhCisgICAgICAgICAgICAvLyBjb250YWluaW5nIHRoZXNlIHRocmVlIHF1YW50aXRpZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyB3aGVuIHRoZSBzaXplIG9mIHRoZSBxdWFudGl0aWVzIGlzIGtub3duLCBlaXRoZXIgMzItYml0cworICAgICAgICAgICAgLy8gb3IgNjQgYml0cyBhcyB3aXRoIHRoZSBaSVA2NCBleHRlbnNpb25zLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdpdGggWmlwNjQsIHRoZSA0LWJ5dGUgZmllbGRzIGFyZSBzZXQgdG8gMHhmZmZmZmZmZiwgYW5kIHRoZXJlIGlzIGEKKyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZGF0YSBibG9jayBpbiB0aGUgImV4dHJhIGZpZWxkIiB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICAgICAgLy8gYWN0dWFsIENvbXByZXNzZWQsIHVuY29tcHJlc3NlZCBzaXplcy4gIChBcyB3ZWxsIGFzIGFuIGFkZGl0aW9uYWwKKyAgICAgICAgICAgIC8vIGZpZWxkLCB0aGUgIlJlbGF0aXZlIE9mZnNldCBvZiBMb2NhbCBIZWFkZXIiKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoZSBwcm9ibGVtIGlzIHdoZW4gdGhlIGFwcCBkZXNpcmVzIHRvIHVzZSBaSVA2NCBleHRlbnNpb25zCisgICAgICAgICAgICAvLyBvcHRpb25hbGx5LCBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgU3VwcG9zZSB0aGUgbGlicmFyeSBhc3N1bWVzIG5vCisgICAgICAgICAgICAvLyB6aXA2NCBleHRlbnNpb25zIHdoZW4gd3JpdGluZyB0aGUgaGVhZGVyLCB0aGVuIGFmdGVyIGNvbXByZXNzaW9uCisgICAgICAgICAgICAvLyBmaW5kcyB0aGF0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHJlcXVpcmVzIHppcDY0LiAgQXQgdGhpcyBwb2ludCwgdGhlCisgICAgICAgICAgICAvLyBoZWFkZXIsIGFscmVhZHkgd3JpdHRlbiB0byB0aGUgZmlsZSwgd29uJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IGRhdGEKKyAgICAgICAgICAgIC8vIGJsb2NrIGluIHRoZSAiZXh0cmEgZmllbGQiLiAgVGhlIHNpemUgb2YgdGhlIGVudHJ5IGhlYWRlciBpcyBmaXhlZCwKKyAgICAgICAgICAgIC8vIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBqdXN0ICJhZGQgb24iIHRoZSB6aXA2NCBkYXRhIGJsb2NrIGFmdGVyCisgICAgICAgICAgICAvLyBjb21wcmVzc2luZyB0aGUgZmlsZS4gIE9uIHRoZSBvdGhlciBoYW5kLCBhbHdheXMgdXNpbmcgemlwNjQgd2lsbAorICAgICAgICAgICAgLy8gYnJlYWsgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG1hbnkgb3RoZXIgc3lzdGVtcyBhbmQgYXBwcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGUgYXBwcm9hY2ggd2UgdGFrZSBpcyB0byBpbnNlcnQgYSAzMi1ieXRlIGR1bW15IGRhdGEgYmxvY2sgaW4gdGhlCisgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCwgd2hlbmV2ZXIgemlwNjQgaXMgdG8gYmUgdXNlZCAiYXMgbmVjZXNzYXJ5Ii4gVGhpcyBkYXRhCisgICAgICAgICAgICAvLyBibG9jayB3aWxsIGdldCB0aGUgYWN0dWFsIHppcDY0IEhlYWRlcklkIGFuZCB6aXA2NCBtZXRhZGF0YSBpZgorICAgICAgICAgICAgLy8gbmVjZXNzYXJ5LiAgSWYgbm90IG5lY2Vzc2FyeSwgdGhlIGRhdGEgYmxvY2sgd2lsbCBnZXQgYSBtZWFuaW5nbGVzcworICAgICAgICAgICAgLy8gSGVhZGVySWQgKDB4MTExMSksIGFuZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHplcm9lcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXaGVuIHppcDY0IGlzIGFjdHVhbGx5IGluIHVzZSwgd2UgYWxzbyBuZWVkIHRvIHNldCB0aGUKKyAgICAgICAgICAgIC8vIFZlcnNpb25OZWVkZWRUb0V4dHJhY3QgZmllbGQgdG8gNDUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmUgaXMgb25lIGFkZGl0aW9uYWwgd3JpbmtsZTogdXNpbmcgemlwNjQgYXMgbmVjZXNzYXJ5IGNvbmZsaWN0cworICAgICAgICAgICAgLy8gd2l0aCBvdXRwdXQgdG8gbm9uLXNlZWthYmxlIGRldmljZXMuICBUaGUgaGVhZGVyIGlzIGVtaXR0ZWQgYW5kCisgICAgICAgICAgICAvLyBtdXN0IGluZGljYXRlIHdoZXRoZXIgemlwNjQgaXMgaW4gdXNlLCBiZWZvcmUgd2Uga25vdyBpZiB6aXA2NCBpcworICAgICAgICAgICAgLy8gbmVjZXNzYXJ5LiAgQmVjYXVzZSB0aGVyZSBpcyBubyBzZWVraW5nLCB0aGUgaGVhZGVyIGNhbiBuZXZlciBiZQorICAgICAgICAgICAgLy8gY2hhbmdlZC4gIFRoZXJlZm9yZSwgb24gbm9uLXNlZWthYmxlIGRldmljZXMsCisgICAgICAgICAgICAvLyBaaXA2NE9wdGlvbi5Bc05lY2Vzc2FyeSBpcyB0aGUgc2FtZSBhcyBaaXA2NE9wdGlvbi5BbHdheXMuCisgICAgICAgICAgICAvLworCisKKyAgICAgICAgICAgIC8vIHZlcnNpb24gbmVlZGVkLSBzZWUgQXBwTm90ZS50eHQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gbmVlZCB2NS4xIGZvciBQS1pJUCBzdHJvbmcgZW5jcnlwdGlvbiwgb3IgdjIuMCBmb3Igbm8gZW5jcnlwdGlvbiBvcgorICAgICAgICAgICAgLy8gZm9yIFBLIGVuY3J5cHRpb24sIDQuNSBmb3IgemlwNjQuICBXZSBtYXkgcmVzZXQgdGhpcyBsYXRlciwgYXMKKyAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSBvciB6aXA2NC4KKworICAgICAgICAgICAgX3ByZXN1bWVaaXA2NCA9IChfY29udGFpbmVyLlppcDY0ID09IFppcDY0T3B0aW9uLkFsd2F5cyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2NvbnRhaW5lci5aaXA2NCA9PSBaaXA2NE9wdGlvbi5Bc05lY2Vzc2FyeSAmJiAhcy5DYW5TZWVrKSk7CisgICAgICAgICAgICBJbnQxNiBWZXJzaW9uTmVlZGVkVG9FeHRyYWN0ID0gKEludDE2KShfcHJlc3VtZVppcDY0ID8gNDUgOiAyMCk7CisjaWYgQlpJUAorICAgICAgICAgICAgaWYgKHRoaXMuQ29tcHJlc3Npb25NZXRob2QgPT0gSW9uaWMuWmlwLkNvbXByZXNzaW9uTWV0aG9kLkJaaXAyKQorICAgICAgICAgICAgICAgIFZlcnNpb25OZWVkZWRUb0V4dHJhY3QgPSA0NjsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyAoaT09NCkKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoVmVyc2lvbk5lZWRlZFRvRXh0cmFjdCAmIDB4MDBGRik7CisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChWZXJzaW9uTmVlZGVkVG9FeHRyYWN0ICYgMHhGRjAwKSA+PiA4KTsKKworICAgICAgICAgICAgLy8gR2V0IGJ5dGUgYXJyYXkuIFNpZGUgZWZmZWN0OiBzZXRzIEFjdHVhbEVuY29kaW5nLgorICAgICAgICAgICAgLy8gTXVzdCBkZXRlcm1pbmUgZW5jb2RpbmcgYmVmb3JlIHNldHRpbmcgdGhlIGJpdGZpZWxkLgorICAgICAgICAgICAgLy8gd29ya2l0ZW0gNjUxMworICAgICAgICAgICAgYnl0ZVtdIGZpbGVOYW1lQnl0ZXMgPSBHZXRFbmNvZGVkRmlsZU5hbWVCeXRlcygpOworICAgICAgICAgICAgSW50MTYgZmlsZW5hbWVMZW5ndGggPSAoSW50MTYpZmlsZU5hbWVCeXRlcy5MZW5ndGg7CisKKyAgICAgICAgICAgIC8vIGdlbmVyYWwgcHVycG9zZSBiaXRmaWVsZAorICAgICAgICAgICAgLy8gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoaXMgbGlicmFyeSB1c2VzIG9ubHkgdGhlc2UgYml0cworICAgICAgICAgICAgLy8gaW4gdGhlIEdQIGJpdGZpZWxkOgorICAgICAgICAgICAgLy8gIGJpdCAwID0gaWYgc2V0LCBpbmRpY2F0ZXMgdGhlIGVudHJ5IGlzIGVuY3J5cHRlZAorICAgICAgICAgICAgLy8gIGJpdCAzID0gaWYgc2V0LCBpbmRpY2F0ZXMgdGhlIENSQywgQyBhbmQgVUMgc2l6ZXMgZm9sbG93IHRoZSBmaWxlIGRhdGEuCisgICAgICAgICAgICAvLyAgYml0IDYgPSBzdHJvbmcgZW5jcnlwdGlvbiAtIGZvciBwa3dhcmUncyBtZWFuaW5nIG9mIHN0cm9uZyBlbmNyeXB0aW9uCisgICAgICAgICAgICAvLyAgYml0IDExID0gVVRGLTggZW5jb2RpbmcgaXMgdXNlZCBpbiB0aGUgY29tbWVudCBhbmQgZmlsZW5hbWUKKworCisgICAgICAgICAgICAvLyBIZXJlIHdlIHNldCBvciB1bnNldCB0aGUgZW5jcnlwdGlvbiBiaXQuCisgICAgICAgICAgICAvLyBfQml0RmllbGQgbWF5IGFscmVhZHkgYmUgc2V0LCBhcyB3aXRoIGEgWmlwRW50cnkgYWRkZWQgaW50byBaaXBPdXRwdXRTdHJlYW0sIHdoaWNoCisgICAgICAgICAgICAvLyBoYXMgYml0IDMgYWx3YXlzIHNldC4gV2Ugb25seSB3YW50IHRvIHNldCBvbmUgYml0CisgICAgICAgICAgICBpZiAoX0VuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lKQorICAgICAgICAgICAgICAgIF9CaXRGaWVsZCAmPSB+MTsgIC8vIGVuY3J5cHRpb24gYml0IE9GRgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9CaXRGaWVsZCB8PSAxOyAgIC8vIGVuY3J5cHRpb24gYml0IE9OCisKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzk0MTogV2luWmlwIGRvZXMgbm90IHRoZSAic3Ryb25nIGVuY3J5cHRpb24iIGJpdCAgd2hlbiB1c2luZyBBRVMuCisgICAgICAgICAgICAvLyBUaGlzICJTdHJvbmcgRW5jcnlwdGlvbiIgaXMgYSBQS1dhcmUgU3Ryb25nIGVuY3J5cHRpb24gdGhpbmcuCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgX0JpdEZpZWxkIHw9IDB4MDAyMDsKKworICAgICAgICAgICAgLy8gc2V0IHRoZSBVVEY4IGJpdCBpZiBuZWNlc3NhcnkKKyNpZiBTSUxWRVJMSUdIVAorICAgICAgICAgICAgaWYgKF9hY3R1YWxFbmNvZGluZy5XZWJOYW1lID09ICJ1dGYtOCIpCisjZWxzZQorICAgICAgICAgICAgaWYgKF9hY3R1YWxFbmNvZGluZy5Db2RlUGFnZSA9PSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5VVEY4LkNvZGVQYWdlKQorI2VuZGlmCisgICAgICAgICAgICAgICAgX0JpdEZpZWxkIHw9IDB4MDgwMDsKKworICAgICAgICAgICAgLy8gVGhlIFBLWklQIHNwZWMgc2F5cyB0aGF0IGlmIGJpdCAzIGlzIHNldCAoMHgwMDA4KSBpbiB0aGUgR2VuZXJhbAorICAgICAgICAgICAgLy8gUHVycG9zZSBCaXRGaWVsZCwgdGhlbiB0aGUgQ1JDLCBDb21wcmVzc2VkIHNpemUsIGFuZCB1bmNvbXByZXNzZWQKKyAgICAgICAgICAgIC8vIHNpemUgYXJlIHdyaXR0ZW4gZGlyZWN0bHkgYWZ0ZXIgdGhlIGZpbGUgZGF0YS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGVzZSAzIHF1YW50aXRpZXMgYXJlIG5vcm1hbGx5IHByZXNlbnQgaW4gdGhlIHJlZ3VsYXIgemlwIGVudHJ5CisgICAgICAgICAgICAvLyBoZWFkZXIuIEJ1dCwgdGhleSBhcmUgbm90IGtub3dhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBpcworICAgICAgICAgICAgLy8gZG9uZS4gU28sIGluIHRoZSBub3JtYWwgY2FzZSwgd2UKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgLSB3cml0ZSB0aGUgaGVhZGVyLCB1c2luZyB6ZXJvcyBmb3IgdGhlc2UgcXVhbnRpdGllcworICAgICAgICAgICAgLy8gIC0gY29tcHJlc3MgdGhlIGRhdGEsIGFuZCBpbmNpZGVudGFsbHkgY29tcHV0ZSB0aGVzZSBxdWFudGl0aWVzLgorICAgICAgICAgICAgLy8gIC0gc2VlayBiYWNrIGFuZCB3cml0ZSB0aGUgY29ycmVjdCB2YWx1ZXMgdGhlbSBpbnRvIHRoZSBoZWFkZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhpcyBpcyBuaWNlIGJlY2F1c2UsIHdoaWxlIGl0IGlzIG1vcmUgY29tcGxpY2F0ZWQgdG8gd3JpdGUgdGhlIHppcAorICAgICAgICAgICAgLy8gZmlsZSwgaXQgaXMgc2ltcGxlciBhbmQgbGVzcyBlcnJvciBwcm9uZSB0byByZWFkIHRoZSB6aXAgZmlsZSwgYW5kCisgICAgICAgICAgICAvLyBhcyBhIHJlc3VsdCBtb3JlIGFwcGxpY2F0aW9ucyBjYW4gcmVhZCB6aXAgZmlsZXMgcHJvZHVjZWQgdGhpcyB3YXksCisgICAgICAgICAgICAvLyB3aXRoIHRob3NlIDMgcXVhbnRpdGllcyBpbiB0aGUgaGVhZGVyLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEJ1dCBpZiBzZWVraW5nIGluIHRoZSBvdXRwdXQgc3RyZWFtIGlzIG5vdCBwb3NzaWJsZSwgdGhlbiB3ZSBuZWVkCisgICAgICAgICAgICAvLyB0byBzZXQgdGhlIGFwcHJvcHJpYXRlIGJpdGZpZWxkIGFuZCBlbWl0IHRoZXNlIHF1YW50aXRpZXMgYWZ0ZXIgdGhlCisgICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZpbGUgZGF0YSBpbiB0aGUgb3V0cHV0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDcyMTYgLSBoYXZpbmcgdHJvdWJsZSBmb3JtYXR0aW5nIGEgemlwNjQgZmlsZSB0aGF0IGlzCisgICAgICAgICAgICAvLyByZWFkYWJsZSBieSBXaW5aaXAuICBub3Qgc3VyZSB3aHkhICBXaGF0IEkgZm91bmQgaXMgdGhhdCBzZXR0aW5nCisgICAgICAgICAgICAvLyBiaXQgMyBhbmQgZm9sbG93aW5nIGFsbCB0aGUgaW1wbGljYXRpb25zLCB0aGUgemlwNjQgZmlsZSBpcworICAgICAgICAgICAgLy8gcmVhZGFibGUgYnkgV2luWmlwIDEyLiBhbmQgUGVybCdzIElPOjpDb21wcmVzczo6WmlwIC4gIFBlcmwgdGFrZXMKKyAgICAgICAgICAgIC8vIGFuIGludGVyZXN0aW5nIGFwcHJvYWNoIC0gaXQgYWx3YXlzIHNldHMgYml0IDMgaWYgWklQNjQgaW4gdXNlLgorICAgICAgICAgICAgLy8gRG90TmV0WmlwIG5vdyBkb2VzIHRoZSBzYW1lOyB0aGlzIGdpdmVzIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgICAgIC8vIFdpblppcCAxMi4KKworICAgICAgICAgICAgaWYgKElzRGlyZWN0b3J5IHx8IGN5Y2xlID09IDk5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIChjeWNsZSA9PSA5OSkgaW5kaWNhdGVzIGEgemVyby1sZW5ndGggZW50cnkgd3JpdHRlbiBieSBaaXBPdXRwdXRTdHJlYW0KKworICAgICAgICAgICAgICAgIF9CaXRGaWVsZCAmPSB+MHgwMDA4OyAgLy8gdW5zZXQgYml0IDMgLSBubyAiZGF0YSBkZXNjcmlwdG9yIiAtIGV2ZXIKKyAgICAgICAgICAgICAgICBfQml0RmllbGQgJj0gfjB4MDAwMTsgIC8vIHVuc2V0IGJpdCAxIC0gbm8gZW5jcnlwdGlvbiAtIGV2ZXIKKyAgICAgICAgICAgICAgICBFbmNyeXB0aW9uID0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lOworICAgICAgICAgICAgICAgIFBhc3N3b3JkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzLkNhblNlZWspCisgICAgICAgICAgICAgICAgX0JpdEZpZWxkIHw9IDB4MDAwODsKKworI2lmIERPTlRfR09fVEhFUkUKKyAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLlBremlwV2VhayAgJiYKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMuX1NvdXJjZSAhPSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFNldCBiaXQgMyB0byBhdm9pZCB0aGUgZG91YmxlLXJlYWQgcGVyZiBpc3N1ZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdoZW4gUEtaSVAgZW5jcnlwdGlvbiBpcyB1c2VkLCBieXRlIDExIG9mIHRoZSBlbmNyeXB0aW9uIGhlYWRlciBpcworICAgICAgICAgICAgICAgIC8vIHVzZWQgYXMgYSBjb25zaXN0ZW5jeSBjaGVjay4gSXQgaXMgbm9ybWFsbHkgc2V0IHRvIHRoZSBNU0J5dGUgb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gQ1JDLiAgQnV0IHRoaXMgbWVhbnMgdGhlIGNSQyBtdXN0IGJlIGtub3duIGViZm9yZSBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgICAgICAgICAvLyBlbmNyeXB0aW9uLCB3aGljaCBtZWFucyB0aGUgZW50aXJlIHN0cmVhbSBoYXMgdG8gYmUgcmVhZCB0d2ljZS4gIFRvCisgICAgICAgICAgICAgICAgLy8gYXZvaWQgdGhhdCwgdGhlIGhpZ2gtYnl0ZSBvZiB0aGUgdGltZSBibG9iICh3aGVuIGluIERPUyBmb3JtYXQpIGNhbgorICAgICAgICAgICAgICAgIC8vIGJlIHVzZWQgZm9yIHRoZSBjb25zaXN0ZW5jeSBjaGVjayAoYnl0ZSAxMSBpbiB0aGUgZW5jcnlwdGlvbiBoZWFkZXIpLgorICAgICAgICAgICAgICAgIC8vIEJ1dCB0aGlzIG1lYW5zIHRoZSBlbnRyeSBtdXN0IGhhdmUgYml0IDMgc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUHJldmlvdXNseSBJIHVzZWQgYSBtb3JlIGNvbXBsZXggYXJyYW5nZW1lbnQgLSB1c2luZyB0aGUgbWV0aG9kcyBsaWtlCisgICAgICAgICAgICAgICAgLy8gRmlndXJlQ3JjMzIoKSwgUHJlcE91dHB1dFN0cmVhbSgpIGFuZCBvdGhlcnMsIGluIG9yZGVyIHRvIG1hbmFnZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBzZWVrLWJhY2sgaW4gdGhlIHNvdXJjZSBzdHJlYW0uICBXaHk/ICBCZWNhdXNlIGJpdCAzIGlzIG5vdCBhbHdheXMKKyAgICAgICAgICAgICAgICAvLyBmcmllbmRseSB3aXRoIHRoaXJkLXBhcnR5IHppcCB0b29scywgbGlrZSB0aG9zZSBvbiB0aGUgTWFjLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB3aHkgdGhpcyBjb2RlIGlzIHN0aWxsIGlmZGVmJ2QgIG91dC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIE1pZ2h0IGNvbnNpZGVyIG1ha2luZyB0aGlzIHlldCBhbm90aGVyIHByb2dyYW1tYWJsZSBvcHRpb24gLQorICAgICAgICAgICAgICAgIC8vIEFsd2F5c1VzZUJpdDNGb3JQa3ppcC4gIEJ1dCB0aGF0J3MgZm9yIGFub3RoZXIgZGF5LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgX0JpdEZpZWxkIHw9IDB4MDAwODsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvLyAoaT09NikKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoX0JpdEZpZWxkICYgMHgwMEZGKTsKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoKF9CaXRGaWVsZCAmIDB4RkYwMCkgPj4gOCk7CisKKyAgICAgICAgICAgIC8vIEhlcmUsIHdlIHdhbnQgdG8gc2V0IHZhbHVlcyBmb3IgQ29tcHJlc3NlZCBTaXplLCBVbmNvbXByZXNzZWQgU2l6ZSwKKyAgICAgICAgICAgIC8vIGFuZCBDUkMuICBJZiB3ZSBoYXZlIF9fRmlsZURhdGFQb3NpdGlvbiBhcyBub3QgLTEgKHplcm8gaXMgYSB2YWxpZAorICAgICAgICAgICAgLy8gRkRQKSwgdGhlbiB0aGF0IG1lYW5zIHdlIGFyZSByZWFkaW5nIHRoaXMgemlwIGVudHJ5IGZyb20gYSB6aXAKKyAgICAgICAgICAgIC8vIGZpbGUsIGFuZCB3ZSBoYXZlIGdvb2QgdmFsdWVzIGZvciB0aG9zZSBxdWFudGl0aWVzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIF9GaWxlRGF0YVBvc2l0aW9uIGlzIC0xLCB0aGVuIHdlIGFyZSBjb25zdHJ1Y3RpbmcgdGhpcyBFbnRyeQorICAgICAgICAgICAgLy8gZnJvbSBub3RoaW5nLiAgV2UgemVybyB0aG9zZSBxdWFudGl0aWVzIG5vdywgYW5kIHdlIHdpbGwgY29tcHV0ZQorICAgICAgICAgICAgLy8gYWN0dWFsIHZhbHVlcyBmb3IgdGhlIHRocmVlIHF1YW50aXRpZXMgbGF0ZXIsIHdoZW4gd2UgZG8gdGhlCisgICAgICAgICAgICAvLyBjb21wcmVzc2lvbiwgYW5kIHRoZW4gc2VlayBiYWNrIHRvIHdyaXRlIHRoZW0gaW50byB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgIC8vIHBsYWNlIGluIHRoZSBoZWFkZXIuCisgICAgICAgICAgICBpZiAodGhpcy5fX0ZpbGVEYXRhUG9zaXRpb24gPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9fVW5jb21wcmVzc2VkU2l6ZSA9IDA7IC8vIGRvIG5vdCB1bnNldCAtIG1heSBuZWVkIHRoaXMgdmFsdWUgZm9yIHJlc3RyZWFtCisgICAgICAgICAgICAgICAgLy8gX0NyYzMyID0gMDsgICAgICAgICAgIC8vIGRpdHRvCisgICAgICAgICAgICAgICAgX0NvbXByZXNzZWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBfY3JjQ2FsY3VsYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXQgY29tcHJlc3Npb24gbWV0aG9kIGhlcmUKKyAgICAgICAgICAgIE1heWJlVW5zZXRDb21wcmVzc2lvbk1ldGhvZEZvcldyaXRpbmcoY3ljbGUpOworCisgICAgICAgICAgICAvLyAoaT09OCkgY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKF9Db21wcmVzc2lvbk1ldGhvZCAmIDB4MDBGRik7CisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChfQ29tcHJlc3Npb25NZXRob2QgJiAweEZGMDApID4+IDgpOworCisgICAgICAgICAgICBpZiAoY3ljbGUgPT0gOTkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gKGN5Y2xlID09IDk5KSBpbmRpY2F0ZXMgYSB6ZXJvLWxlbmd0aCBlbnRyeSB3cml0dGVuIGJ5IFppcE91dHB1dFN0cmVhbQorICAgICAgICAgICAgICAgIFNldFppcDY0RmxhZ3MoKTsKKyAgICAgICAgICAgIH0KKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgZWxzZSBpZiAoRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCB8fCBFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgLT0gMjsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMHg2MzsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvLyBMYXN0TW9kCisgICAgICAgICAgICBfVGltZUJsb2IgPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLkRhdGVUaW1lVG9QYWNrZWQoTGFzdE1vZGlmaWVkKTsKKworICAgICAgICAgICAgLy8gKGk9PTEwKSB0aW1lIGJsb2IKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoX1RpbWVCbG9iICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChfVGltZUJsb2IgJiAweDAwMDBGRjAwKSA+PiA4KTsKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoKF9UaW1lQmxvYiAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoKF9UaW1lQmxvYiAmIDB4RkYwMDAwMDApID4+IDI0KTsKKworICAgICAgICAgICAgLy8gKGk9PTE0KSBDUkMgLSBpZiBzb3VyY2U9PWZpbGVzeXN0ZW0sIHRoaXMgaXMgemVybyBub3csIGFjdHVhbCB2YWx1ZQorICAgICAgICAgICAgLy8gd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAgaWYgc291cmNlPT1hcmNoaXZlLCB0aGlzIGlzIGEgYm9uYWZpZGUKKyAgICAgICAgICAgIC8vIHZhbHVlLgorICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKShfQ3JjMzIgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoKF9DcmMzMiAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoX0NyYzMyICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoX0NyYzMyICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCisgICAgICAgICAgICBpZiAoX3ByZXN1bWVaaXA2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAoaT09MTgpIENvbXByZXNzZWRTaXplIChJbnQzMikgYW5kIFVuY29tcHJlc3NlZFNpemUgLSBhbGwgMHhGRiBmb3Igbm93CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gKGk9PTE4KSBDb21wcmVzc2VkU2l6ZSAoSW50MzIpIC0gdGhpcyB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZQorICAgICAgICAgICAgICAgIC8vIGJvbmFmaWRlLiAgaWYgc291cmNlID09IGZpbGVzeXN0ZW0sIHRoZW4gaXQgaXMgemVybywgYW5kIHdlJ2xsCisgICAgICAgICAgICAgICAgLy8gbGVhcm4gaXQgYWZ0ZXIgd2UgY29tcHJlc3MuICBpZiBzb3VyY2UgPT0gYXJjaGl2ZSwgdGhlbiBpdCBpcworICAgICAgICAgICAgICAgIC8vIGJvbmFmaWRlIGRhdGEuCisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKShfQ29tcHJlc3NlZFNpemUgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChfQ29tcHJlc3NlZFNpemUgJiAweDAwMDBGRjAwKSA+PiA4KTsKKyAgICAgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChfQ29tcHJlc3NlZFNpemUgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoX0NvbXByZXNzZWRTaXplICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCisgICAgICAgICAgICAgICAgLy8gKGk9PTIyKSBVbmNvbXByZXNzZWRTaXplIChJbnQzMikgLSB0aGlzIHZhbHVlIG1heSBvciBtYXkgbm90IGJlCisgICAgICAgICAgICAgICAgLy8gYm9uYWZpZGUuCisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKShfVW5jb21wcmVzc2VkU2l6ZSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoKF9VbmNvbXByZXNzZWRTaXplICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoX1VuY29tcHJlc3NlZFNpemUgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoX1VuY29tcHJlc3NlZFNpemUgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIChpPT0yNikgZmlsZW5hbWUgbGVuZ3RoIChJbnQxNikKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoZmlsZW5hbWVMZW5ndGggJiAweDAwRkYpOworICAgICAgICAgICAgYmxvY2tbaSsrXSA9IChieXRlKSgoZmlsZW5hbWVMZW5ndGggJiAweEZGMDApID4+IDgpOworCisgICAgICAgICAgICBfRXh0cmEgPSBDb25zdHJ1Y3RFeHRyYUZpZWxkKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gKGk9PTI4KSBleHRyYSBmaWVsZCBsZW5ndGggKHNob3J0KQorICAgICAgICAgICAgSW50MTYgZXh0cmFGaWVsZExlbmd0aCA9IChJbnQxNikoKF9FeHRyYSA9PSBudWxsKSA/IDAgOiBfRXh0cmEuTGVuZ3RoKTsKKyAgICAgICAgICAgIGJsb2NrW2krK10gPSAoYnl0ZSkoZXh0cmFGaWVsZExlbmd0aCAmIDB4MDBGRik7CisgICAgICAgICAgICBibG9ja1tpKytdID0gKGJ5dGUpKChleHRyYUZpZWxkTGVuZ3RoICYgMHhGRjAwKSA+PiA4KTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTM1NDIKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2kgKyBmaWxlbmFtZUxlbmd0aCArIGV4dHJhRmllbGRMZW5ndGhdOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIGZpeGVkIHBvcnRpb24KKyAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoYmxvY2ssIDAsIGJ5dGVzLCAwLCBpKTsKKyAgICAgICAgICAgIC8vZm9yIChqID0gMDsgaiA8IGk7IGorKykgYnl0ZXNbal0gPSBibG9ja1tqXTsKKworICAgICAgICAgICAgLy8gVGhlIGZpbGVuYW1lIHdyaXR0ZW4gdG8gdGhlIGFyY2hpdmUuCisgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KGZpbGVOYW1lQnl0ZXMsIDAsIGJ5dGVzLCBpLCBmaWxlTmFtZUJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICAvLyBmb3IgKGogPSAwOyBqIDwgZmlsZU5hbWVCeXRlcy5MZW5ndGg7IGorKykKKyAgICAgICAgICAgIC8vICAgICBieXRlc1tpICsgal0gPSBmaWxlTmFtZUJ5dGVzW2pdOworCisgICAgICAgICAgICBpICs9IGZpbGVOYW1lQnl0ZXMuTGVuZ3RoOworCisgICAgICAgICAgICAvLyAiRXh0cmEgZmllbGQiCisgICAgICAgICAgICBpZiAoX0V4dHJhICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weShfRXh0cmEsIDAsIGJ5dGVzLCBpLCBfRXh0cmEuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBmb3IgKGogPSAwOyBqIDwgX0V4dHJhLkxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgIC8vICAgICBieXRlc1tpICsgal0gPSBfRXh0cmFbal07CisgICAgICAgICAgICAgICAgaSArPSBfRXh0cmEuTGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfTGVuZ3RoT2ZIZWFkZXIgPSBpOworCisgICAgICAgICAgICAvLyBoYW5kbGUgc3BsaXQgYXJjaGl2ZXMKKyAgICAgICAgICAgIHZhciB6c3MgPSBzIGFzIFppcFNlZ21lbnRlZFN0cmVhbTsKKyAgICAgICAgICAgIGlmICh6c3MgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6c3MuQ29udGlndW91c1dyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBVSW50MzIgcmVxdWlyZWRTZWdtZW50ID0genNzLkNvbXB1dGVTZWdtZW50KGkpOworICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFNlZ21lbnQgIT0genNzLkN1cnJlbnRTZWdtZW50KQorICAgICAgICAgICAgICAgICAgICBfZnV0dXJlX1JPTEggPSAwOyAvLyByb2xsb3ZlciEKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9mdXR1cmVfUk9MSCA9IHpzcy5Qb3NpdGlvbjsKKworICAgICAgICAgICAgICAgIF9kaXNrTnVtYmVyID0gcmVxdWlyZWRTZWdtZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgWklQNjQgdXNhZ2UKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcDY0ID09IFppcDY0T3B0aW9uLk5ldmVyICYmICh1aW50KV9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPj0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJPZmZzZXQgd2l0aGluIHRoZSB6aXAgYXJjaGl2ZSBleGNlZWRzIDB4RkZGRkZGRkYuIENvbnNpZGVyIHNldHRpbmcgdGhlIFVzZVppcDY0V2hlblNhdmluZyBwcm9wZXJ0eSBvbiB0aGUgWmlwRmlsZSBpbnN0YW5jZS4iKTsKKworCisgICAgICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgaGVhZGVyIHRvIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIHMuV3JpdGUoYnl0ZXMsIDAsIGkpOworCisgICAgICAgICAgICAvLyBub3cgdGhhdCB0aGUgaGVhZGVyIGlzIHdyaXR0ZW4sIHdlIGNhbiB0dXJuIG9mZiB0aGUgY29udGlndW91cyB3cml0ZSByZXN0cmljdGlvbi4KKyAgICAgICAgICAgIGlmICh6c3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB6c3MuQ29udGlndW91c1dyaXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoaXMgaGVhZGVyIGRhdGEsIHdlJ2xsIHVzZSBpdCBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgIC8vIC4ud2hlbiBzZWVraW5nIGJhY2t3YXJkLCB0byB3cml0ZSBhZ2FpbiwgYWZ0ZXIgd2UgaGF2ZSB0aGUgQ3JjLCBjb21wcmVzc2VkCisgICAgICAgICAgICAvLyAgIGFuZCB1bmNvbXByZXNzZWQgc2l6ZXMuCisgICAgICAgICAgICAvLyAuLmFuZCB3aGVuIHdyaXRpbmcgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAgICAgICAgICAgIF9FbnRyeUhlYWRlciA9IGJ5dGVzOworICAgICAgICB9CisKKworCisKKyAgICAgICAgcHJpdmF0ZSBJbnQzMiBGaWd1cmVDcmMzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY3JjQ2FsY3VsYXRlZCA9PSBmYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJlYW0gaW5wdXQgPSBudWxsOworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb3JpZ2luYWwgc3RyZWFtOgorICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuV3JpdGVEZWxlZ2F0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgSW9uaWMuQ3JjLkNyY0NhbGN1bGF0b3JTdHJlYW0oU3RyZWFtLk51bGwpOworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gd3JpdGUgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fV3JpdGVEZWxlZ2F0ZSh0aGlzLkZpbGVOYW1lLCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBfQ3JjMzIgPSBvdXRwdXQuQ3JjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwRmlsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gLSB0aGUgQ1JDIGlzIGFscmVhZHkgc2V0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuU3RyZWFtKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQcmVwU291cmNlU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuX3NvdXJjZVN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuSml0U3RyZWFtKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gb3BlbiB0aGUgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc291cmNlU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NvdXJjZVN0cmVhbSA9IHRoaXMuX09wZW5EZWxlZ2F0ZSh0aGlzLkZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByZXBTb3VyY2VTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5fc291cmNlU3RyZWFtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX1NvdXJjZSA9PSBaaXBFbnRyeVNvdXJjZS5aaXBPdXRwdXRTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaW5wdXQgPSBGaWxlLk9wZW5SZWFkKExvY2FsRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBGaWxlLk9wZW4oTG9jYWxGaWxlTmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkLCBGaWxlU2hhcmUuUmVhZFdyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhciBjcmMzMiA9IG5ldyBJb25pYy5DcmMuQ1JDMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgX0NyYzMyID0gY3JjMzIuR2V0Q3JjMzIoaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfc291cmNlU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5EaXNwb3NlKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfY3JjQ2FsY3VsYXRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX0NyYzMyOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFN0b3JlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGVudHJ5IHNvdXJjZSBzdHJlYW0sIG9yLCBpZiB0aGUgcG9zaXRpb24gaXMKKyAgICAgICAgLy8vICAgYWxyZWFkeSBzdG9yZWQsIHNlZWtzIHRvIHRoYXQgcG9zaXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHByZXAgZm9yIHJlYWRpbmcgdGhlIHNvdXJjZSBzdHJlYW0uICBJZiBQS1pJUAorICAgICAgICAvLy8gICBlbmNyeXB0aW9uIGlzIHVzZWQsIHRoZW4gd2UgbmVlZCB0byBjYWxjIHRoZSBDUkMzMiBiZWZvcmUgZG9pbmcgdGhlCisgICAgICAgIC8vLyAgIGVuY3J5cHRpb24sIGJlY2F1c2UgdGhlIENSQyBpcyB1c2VkIGluIHRoZSAxMnRoIGJ5dGUgb2YgdGhlIFBLWklQCisgICAgICAgIC8vLyAgIGVuY3J5cHRpb24gaGVhZGVyLiAgU28sIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzZWVrIGJhY2t3YXJkIGluIHRoZSBzb3VyY2UKKyAgICAgICAgLy8vICAgd2hlbiBzYXZpbmcgdGhlIFppcEVudHJ5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgcGxhY2UgdGhhdAorICAgICAgICAvLy8gICBjYWxjdWxhdGVzIHRoZSBDUkMsIGFuZCBhbHNvIGZyb20gdGhlIG1ldGhvZCB0aGF0IGRvZXMgdGhlIGVuY3J5cHRpb24gb2YKKyAgICAgICAgLy8vICAgdGhlIGZpbGUgZGF0YS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgdGhpcyBtZXRob2Qgc2V0cyB0aGUgX3NvdXJjZVN0cmVhbU9yaWdpbmFsUG9zaXRpb24KKyAgICAgICAgLy8vICAgZmllbGQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBtZXRob2Qgc2VlayB0byB0aGF0IHBvc2l0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwcml2YXRlIHZvaWQgUHJlcFNvdXJjZVN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc291cmNlU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJUaGUgaW5wdXQgc3RyZWFtIGlzIG51bGwgZm9yIGVudHJ5ICd7MH0nLiIsIEZpbGVOYW1lKSk7CisKKyAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VTdHJlYW1PcmlnaW5hbFBvc2l0aW9uICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGhhcHBlbiB0aGUgMm5kIGN5Y2xlIHRocm91Z2gsIGlmIHRoZSBzdHJlYW0gaXMgc2Vla2FibGUKKyAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VTdHJlYW0uUG9zaXRpb24gPSB0aGlzLl9zb3VyY2VTdHJlYW1PcmlnaW5hbFBvc2l0aW9uLlZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fc291cmNlU3RyZWFtLkNhblNlZWspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGhhcHBlbiB0aGUgZmlyc3QgY3ljbGUgdGhyb3VnaCwgaWYgc2Vla2FibGUKKyAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VTdHJlYW1PcmlnaW5hbFBvc2l0aW9uID0gbmV3IE51bGxhYmxlPEludDY0Pih0aGlzLl9zb3VyY2VTdHJlYW0uUG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5FbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEluIGdlbmVyYWwsIHVzaW5nIFBLWklQIGVuY3J5cHRpb24gb24gYSBhIHppcCBlbnRyeSB3aG9zZSBpbnB1dAorICAgICAgICAgICAgICAgIC8vIGNvbWVzIGZyb20gYSBub24tc2Vla2FibGUgc3RyZWFtLCBpcyB0cmlja3kuICBIZXJlJ3Mgd2h5OgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQnl0ZSAxMSBvZiB0aGUgUEtaSVAgZW5jcnlwdGlvbiBoZWFkZXIgaXMgdXNlZCBmb3IgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGFuZCBjb25zaXN0ZW5jeSBjaGVja25pZy4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIE5vcm1hbGx5LCB0aGUgaGlnaGVzdCBieXRlIG9mIHRoZSBDUkMgaXMgdXNlZCBhcyB0aGUgMTF0aCAobGFzdCkgYnl0ZQorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBQS1pJUCBlbmNyeXB0aW9uIGhlYWRlci4gVGhpcyBtZWFucyB0aGUgQ1JDIG11c3QgYmUga25vd24KKyAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZW5jcnlwdGlvbiBpcyBwZXJmb3JtZWQuIE5vcm1hbGx5IHRoYXQgbWVhbnMgd2UgcmVhZCB0aGUgZnVsbAorICAgICAgICAgICAgICAgIC8vIGRhdGEgc3RyZWFtLCBjb21wdXRlIHRoZSBDUkMsIHRoZW4gc2VlayBiYWNrIGFuZCByZWFkIGl0IGFnYWluIGZvcgorICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wcmVzc2lvbitlbmNyeXB0aW9uIHBoYXNlLiBPYnZpb3VzbHkgdGhpcyBpcyBiYWQgZm9yCisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2Ugd2l0aCBhIGxhcmdlIGlucHV0IGZpbGUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIGEgdHdpc3QgaW4gdGhlIFpJUCBzcGVjIChhY3R1YWxseSBkb2N1bWVudGVkIG9ubHkgaW4gaW5mb3ppcAorICAgICAgICAgICAgICAgIC8vIGNvZGUsIG5vdCBpbiB0aGUgc3BlYyBpdHNlbGYpIHRoYXQgYWxsb3dzIHRoZSBoaWdoLW9yZGVyIGJ5dGUgb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gbGFzdCBtb2RpZmllZCB0aW1lIGZvciB0aGUgZW50cnksIHdoZW4gdGhlIGxhc3Rtb2QgdGltZSBpcyBpbiBwYWNrZWQKKyAgICAgICAgICAgICAgICAvLyAoRE9TKSBmb3JtYXQsIHRvIGJlIHVzZWQgZm9yIEJ5dGUgMTEgaW4gdGhlIGVuY3J5cHRpb24gaGVhZGVyLiBJbgorICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FzZSwgdGhlIGJpdCAzICJkYXRhIGRlc2NyaXB0b3IiIG11c3QgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFuIGludGVsbGlnZW50IGltcGxlbWVudGF0aW9uIHdvdWxkIHRoZXJlZm9yZSBmb3JjZSB0aGUgdXNlIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIGJpdCAzIGRhdGEgZGVzY3JpcHRvciB3aGVuIFBLWklQIGVuY3J5cHRpb24gaXMgaW4gdXNlLCByZWdhcmRsZXNzLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIHRoZSBkb3VibGUtcmVhZCBvZiB0aGUgc3RyZWFtIHRvIGJlIGVuY3J5cHRlZC4gIFNvIGZhciwKKyAgICAgICAgICAgICAgICAvLyBEb3ROZXRaaXAgZG9lc24ndCBkbyB0aGF0OyBpdCBqdXN0IHB1bnRzIHdoZW4gdGhlIGlucHV0IHN0cmVhbSBpcworICAgICAgICAgICAgICAgIC8vIG5vbi1zZWVrYWJsZSwgYW5kIHRoZSBvdXRwdXQgZG9lcyBub3QgdXNlIEJpdCAzLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIG90aGVyIG9wdGlvbiBpcyB0byB1c2UgdGhlIENSQyB3aGVuIGl0IGlzIGFscmVhZHkgYXZhaWxhYmxlLCBlZywKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzb3VyY2UgZm9yIHRoZSBkYXRhIGlzIGEgWmlwRW50cnkgKHdoZW4gdGhlIHppcCBmaWxlIGlzCisgICAgICAgICAgICAgICAgLy8gYmVpbmcgdXBkYXRlZCkuIEluIHRoaXMgY2FzZSB3ZSBhbHJlYWR5IGtub3cgdGhlIENSQyBhbmQgY2FuIGp1c3QgdXNlCisgICAgICAgICAgICAgICAgLy8gd2hhdCB3ZSBrbm93LgorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX1NvdXJjZSAhPSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlICYmICgodGhpcy5fQml0RmllbGQgJiAweDAwMDgpICE9IDB4MDAwOCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIkl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgUEtaSVAgZW5jcnlwdGlvbiBvbiBhIG5vbi1zZWVrYWJsZSBpbnB1dCBzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29weSBtZXRhZGF0YSB0aGF0IG1heSBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGUgYXBwLiAgV2UgZG8gdGhpcyB3aGVuCisgICAgICAgIC8vLyByZXNldHRpbmcgdGhlIHppcEZpbGUgaW5zdGFuY2UuICBJZiB0aGUgYXBwIGNhbGxzIFNhdmUoKSBvbiBhIFppcEZpbGUsIHRoZW4KKyAgICAgICAgLy8vIHRyaWVzIHRvIHBhcnR5IG9uIHRoYXQgZmlsZSBzb21lIG1vcmUsIHdlIG1heSBuZWVkIHRvIFJlc2V0KCkgaXQgLCB3aGljaAorICAgICAgICAvLy8gbWVhbnMgcmUtcmVhZGluZyB0aGUgZW50cmllcyBhbmQgdGhlbiBjb3B5aW5nIHRoZSBtZXRhZGF0YS4gIEkgdGhpbmsuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHZvaWQgQ29weU1ldGFEYXRhKFppcEVudHJ5IHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fX0ZpbGVEYXRhUG9zaXRpb24gPSBzb3VyY2UuX19GaWxlRGF0YVBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy5Db21wcmVzc2lvbk1ldGhvZCA9IHNvdXJjZS5Db21wcmVzc2lvbk1ldGhvZDsKKyAgICAgICAgICAgIHRoaXMuX0NvbXByZXNzaW9uTWV0aG9kX0Zyb21aaXBGaWxlID0gc291cmNlLl9Db21wcmVzc2lvbk1ldGhvZF9Gcm9tWmlwRmlsZTsKKyAgICAgICAgICAgIHRoaXMuX0NvbXByZXNzZWRGaWxlRGF0YVNpemUgPSBzb3VyY2UuX0NvbXByZXNzZWRGaWxlRGF0YVNpemU7CisgICAgICAgICAgICB0aGlzLl9VbmNvbXByZXNzZWRTaXplID0gc291cmNlLl9VbmNvbXByZXNzZWRTaXplOworICAgICAgICAgICAgdGhpcy5fQml0RmllbGQgPSBzb3VyY2UuX0JpdEZpZWxkOworICAgICAgICAgICAgdGhpcy5fU291cmNlID0gc291cmNlLl9Tb3VyY2U7CisgICAgICAgICAgICB0aGlzLl9MYXN0TW9kaWZpZWQgPSBzb3VyY2UuX0xhc3RNb2RpZmllZDsKKyAgICAgICAgICAgIHRoaXMuX010aW1lID0gc291cmNlLl9NdGltZTsKKyAgICAgICAgICAgIHRoaXMuX0F0aW1lID0gc291cmNlLl9BdGltZTsKKyAgICAgICAgICAgIHRoaXMuX0N0aW1lID0gc291cmNlLl9DdGltZTsKKyAgICAgICAgICAgIHRoaXMuX250ZnNUaW1lc0FyZVNldCA9IHNvdXJjZS5fbnRmc1RpbWVzQXJlU2V0OworICAgICAgICAgICAgdGhpcy5fZW1pdFVuaXhUaW1lcyA9IHNvdXJjZS5fZW1pdFVuaXhUaW1lczsKKyAgICAgICAgICAgIHRoaXMuX2VtaXROdGZzVGltZXMgPSBzb3VyY2UuX2VtaXROdGZzVGltZXM7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBPbldyaXRlQmxvY2soSW50NjQgYnl0ZXNYZmVycmVkLCBJbnQ2NCB0b3RhbEJ5dGVzVG9YZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5aaXBGaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2lvT3BlcmF0aW9uQ2FuY2VsZWQgPSBfY29udGFpbmVyLlppcEZpbGUuT25TYXZlQmxvY2sodGhpcywgYnl0ZXNYZmVycmVkLCB0b3RhbEJ5dGVzVG9YZmVyKTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHZvaWQgX1dyaXRlRW50cnlEYXRhKFN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWFkIGluIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSAob2Z0ZW4gYSBmaWxlIGluIHRoZSBmaWxlc3lzdGVtKSwKKyAgICAgICAgICAgIC8vIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSwgY2FsY3VsYXRpbmcgYSBDUkMgb24gaXQgYXMgd2UgZ28uCisgICAgICAgICAgICAvLyBXZSB3aWxsIGFsc28gY29tcHJlc3MgYW5kIGVuY3J5cHQgYXMgbmVjZXNzYXJ5LgorCisgICAgICAgICAgICBTdHJlYW0gaW5wdXQgPSBudWxsOworICAgICAgICAgICAgbG9uZyBmZHAgPSAtMUw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXYW50IHRvIHJlY29yZCB0aGUgcG9zaXRpb24gaW4gdGhlIHppcCBmaWxlIG9mIHRoZSB6aXAgZW50cnkKKyAgICAgICAgICAgICAgICAvLyBkYXRhIChhcyBvcHBvc2VkIHRvIHRoZSBtZXRhZGF0YSkuICBzLlBvc2l0aW9uIG1heSBmYWlsIG9uIHNvbWUKKyAgICAgICAgICAgICAgICAvLyB3cml0ZS1vbmx5IHN0cmVhbXMsIGVnIHN0ZG91dCBvciBTeXN0ZW0uV2ViLkh0dHBSZXNwb25zZVN0cmVhbS4KKyAgICAgICAgICAgICAgICAvLyBXZSBzd2FsbG93IHRoYXQgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGRvbid0IGNhcmUsIGluIHRoYXQgY2FzZS4KKyAgICAgICAgICAgICAgICAvLyBCdXQsIGRvbid0IHNldCBfX0ZpbGVEYXRhUG9zaXRpb24gZGlyZWN0bHkuICBJdCBtYXkgYmUgbmVlZGVkCisgICAgICAgICAgICAgICAgLy8gdG8gUkVBRCB0aGUgemlwIGVudHJ5IGZyb20gdGhlIHppcCBmaWxlLCBpZiB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAvLyAicmUtc3RyZWFtIiBzaXR1YXRpb24uIEluIG90aGVyIHdvcmRzIGlmIHRoZSB6aXAgZW50cnkgaGFzCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBjb21wcmVzc2lvbiBsZXZlbCwgb3IgY29tcHJlc3Npb24gbWV0aG9kLCBvciAobWF5YmU/KQorICAgICAgICAgICAgICAgIC8vIGVuY3J5cHRpb24gYWxnb3JpdGhtLiAgSW4gdGhhdCBjYXNlIGlmIHRoZSBvcmlnaW5hbCBlbnRyeSBpcworICAgICAgICAgICAgICAgIC8vIGVuY3J5cHRlZCwgd2UgbmVlZCBfX0ZpbGVEYXRhUG9zaXRpb24gdG8gYmUgdGhlIHZhbHVlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAvLyBpbnB1dCB6aXAgZmlsZS4gIFRoaXMgcy5Qb3NpdGlvbiBpcyBmb3IgdGhlIG91dHB1dCB6aXBmaWxlLiAgU28KKyAgICAgICAgICAgICAgICAvLyB3ZSBjb3B5IGZkcCB0byBfX0ZpbGVEYXRhUG9zaXRpb24gYWZ0ZXIgdGhpcyBlbnRyeSBoYXMgYmVlbgorICAgICAgICAgICAgICAgIC8vIChtYXliZSkgcmVzdHJlYW1lZC4KKyAgICAgICAgICAgICAgICBmZHAgPSBzLlBvc2l0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVzZSBmaWxlTGVuZ3RoIGZvciBwcm9ncmVzcyB1cGRhdGVzLCBhbmQgdG8gZGVjaWRlIHdoZXRoZXIgd2UgY2FuCisgICAgICAgICAgICAgICAgLy8gc2tpcCBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbiBhbHRvZ2V0aGVyIChpbiBjYXNlIG9mIGxlbmd0aD09emVybykKKyAgICAgICAgICAgICAgICBsb25nIGZpbGVMZW5ndGggPSBTZXRJbnB1dEFuZEZpZ3VyZUZpbGVMZW5ndGgocmVmIGlucHV0KTsKKworICAgICAgICAgICAgICAgIC8vIFdyYXAgYSBjb3VudGluZyBzdHJlYW0gYXJvdW5kIHRoZSByYXcgb3V0cHV0IHN0cmVhbToKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IHRoaW5nIHRoYXQgaGFwcGVucyBiZWZvcmUgdGhlIGJpdHMgZ28gdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24tcHJvdmlkZWQgc3RyZWFtLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIHMgaXMgYSBDb3VudGluZ1N0cmVhbS4gRG9lc24ndCBtYXR0ZXIuIFdyYXAgaXQgd2l0aCBhCisgICAgICAgICAgICAgICAgLy8gY291bnRlciBhbnl3YXkuIFdlIG5lZWQgdG8gY291bnQgYXQgYm90aCBsZXZlbHMuCisKKyAgICAgICAgICAgICAgICBDb3VudGluZ1N0cmVhbSBlbnRyeUNvdW50ZXIgPSBuZXcgQ291bnRpbmdTdHJlYW0ocyk7CisKKyAgICAgICAgICAgICAgICBTdHJlYW0gZW5jcnlwdG9yOworICAgICAgICAgICAgICAgIFN0cmVhbSBjb21wcmVzc29yOworCisgICAgICAgICAgICAgICAgaWYgKGZpbGVMZW5ndGggIT0gMEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBNYXliZSB3cmFwIGFuIGVuY3J5cHRpbmcgc3RyZWFtIGFyb3VuZCB0aGUgY291bnRlcjogVGhpcyB3aWxsCisgICAgICAgICAgICAgICAgICAgIC8vIGhhcHBlbiBCRUZPUkUgb3V0cHV0IGNvdW50aW5nLCBhbmQgQUZURVIgY29tcHJlc3Npb24sIGlmIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdG9yID0gTWF5YmVBcHBseUVuY3J5cHRpb24oZW50cnlDb3VudGVyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBNYXliZSB3cmFwIGEgY29tcHJlc3NpbmcgU3RyZWFtIGFyb3VuZCB0aGF0LgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIEJFRk9SRSBlbmNyeXB0aW9uIChpZiBhbnkpIGFzIHdlIHdyaXRlIGRhdGEgb3V0LgorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yID0gTWF5YmVBcHBseUNvbXByZXNzaW9uKGVuY3J5cHRvciwgZmlsZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRvciA9IGNvbXByZXNzb3IgPSBlbnRyeUNvdW50ZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gV3JhcCBhIENyY0NhbGN1bGF0b3JTdHJlYW0gYXJvdW5kIHRoYXQuCisgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGhhcHBlbiBCRUZPUkUgY29tcHJlc3Npb24gKGlmIGFueSkgYXMgd2Ugd3JpdGUgZGF0YSBvdXQuCisgICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBJb25pYy5DcmMuQ3JjQ2FsY3VsYXRvclN0cmVhbShjb21wcmVzc29yLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vIG91dHB1dC5Xcml0ZSgpIGNhdXNlcyB0aGlzIGZsb3c6CisgICAgICAgICAgICAgICAgLy8gY2FsYy1jcmMgLT4gY29tcHJlc3MgLT4gZW5jcnlwdCAtPiBjb3VudCAtPiBhY3R1YWxseSB3cml0ZQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX1NvdXJjZSA9PSBaaXBFbnRyeVNvdXJjZS5Xcml0ZURlbGVnYXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHdyaXRlIHRoZSBkYXRhCisgICAgICAgICAgICAgICAgICAgIHRoaXMuX1dyaXRlRGVsZWdhdGUodGhpcy5GaWxlTmFtZSwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3luY2hyb25vdXNseSBjb3B5IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0tY2hhaW4KKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChuID0gU2hhcmVkVXRpbGl0aWVzLlJlYWRXaXRoUmV0cnkoaW5wdXQsIGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgRmlsZU5hbWUpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9uV3JpdGVCbG9jayhvdXRwdXQuVG90YWxCeXRlc1NsdXJwZWQsIGZpbGVMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pb09wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRmluaXNoT3V0cHV0U3RyZWFtKHMsIGVudHJ5Q291bnRlciwgZW5jcnlwdG9yLCBjb21wcmVzc29yLCBvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuSml0U3RyZWFtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGNsb3NlIHRoZSBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0Nsb3NlRGVsZWdhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0Nsb3NlRGVsZWdhdGUodGhpcy5GaWxlTmFtZSwgaW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW5wdXQgYXMgRmlsZVN0cmVhbSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGlucHV0LkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9pb09wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gc2V0IEZEUCBub3csIHRvIGFsbG93IGZvciByZS1zdHJlYW1pbmcKKyAgICAgICAgICAgIHRoaXMuX19GaWxlRGF0YVBvc2l0aW9uID0gZmRwOworICAgICAgICAgICAgUG9zdFByb2Nlc3NPdXRwdXQocyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgU2V0IHRoZSBpbnB1dCBzdHJlYW0gYW5kIGdldCBpdHMgbGVuZ3RoLCBpZiBwb3NzaWJsZS4gIFRoZSBsZW5ndGggaXMKKyAgICAgICAgLy8vICAgdXNlZCBmb3IgcHJvZ3Jlc3MgdXBkYXRlcywgQU5ELCB0byBhbGxvdyBhbiBvcHRpbWl6YXRpb24gaW4gY2FzZSBvZgorICAgICAgICAvLy8gICBhIHN0cmVhbS9maWxlIG9mIHplcm8gbGVuZ3RoLiBJbiB0aGF0IGNhc2Ugd2Ugc2tpcCB0aGUgRW5jcnlwdCBhbmQKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24gU3RyZWFtLiAobGlrZSBEZWZsYXRlU3RyZWFtIG9yIEJaaXAyT3V0cHV0U3RyZWFtKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGxvbmcgU2V0SW5wdXRBbmRGaWd1cmVGaWxlTGVuZ3RoKHJlZiBTdHJlYW0gaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZmlsZUxlbmd0aCA9IC0xTDsKKyAgICAgICAgICAgIC8vIGdldCB0aGUgb3JpZ2luYWwgc3RyZWFtOgorICAgICAgICAgICAgaWYgKHRoaXMuX1NvdXJjZSA9PSBaaXBFbnRyeVNvdXJjZS5TdHJlYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJlcFNvdXJjZVN0cmVhbSgpOworICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5fc291cmNlU3RyZWFtOworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCB0aGUgbGVuZ3RoLCBubyBiaWcgZGVhbCBpZiBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgIHRyeSB7IGZpbGVMZW5ndGggPSB0aGlzLl9zb3VyY2VTdHJlYW0uTGVuZ3RoOyB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwRmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgInJlLXN0cmVhbWluZyIgdGhlIHppcCBlbnRyeS4KKyAgICAgICAgICAgICAgICBzdHJpbmcgcHdkID0gKF9FbmNyeXB0aW9uX0Zyb21aaXBGaWxlID09IEVuY3J5cHRpb25BbGdvcml0aG0uTm9uZSkgPyBudWxsIDogKHRoaXMuX1Bhc3N3b3JkID8/IHRoaXMuX2NvbnRhaW5lci5QYXNzd29yZCk7CisgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlU3RyZWFtID0gSW50ZXJuYWxPcGVuUmVhZGVyKHB3ZCk7CisgICAgICAgICAgICAgICAgUHJlcFNvdXJjZVN0cmVhbSgpOworICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5fc291cmNlU3RyZWFtOworICAgICAgICAgICAgICAgIGZpbGVMZW5ndGggPSB0aGlzLl9zb3VyY2VTdHJlYW0uTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fU291cmNlID09IFppcEVudHJ5U291cmNlLkppdFN0cmVhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gb3BlbiB0aGUgc3RyZWFtCisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZVN0cmVhbSA9PSBudWxsKSBfc291cmNlU3RyZWFtID0gdGhpcy5fT3BlbkRlbGVnYXRlKHRoaXMuRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIFByZXBTb3VyY2VTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IHRoaXMuX3NvdXJjZVN0cmVhbTsKKyAgICAgICAgICAgICAgICB0cnkgeyBmaWxlTGVuZ3RoID0gdGhpcy5fc291cmNlU3RyZWFtLkxlbmd0aDsgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RTdXBwb3J0ZWRFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fU291cmNlID09IFppcEVudHJ5U291cmNlLkZpbGVTeXN0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzE0NQorICAgICAgICAgICAgICAgIEZpbGVTaGFyZSBmcyA9IEZpbGVTaGFyZS5SZWFkV3JpdGU7CisjaWYgIU5FVENGCisgICAgICAgICAgICAgICAgLy8gRmlsZVNoYXJlLkRlbGV0ZSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIENvbXBhY3QgRnJhbWV3b3JrCisgICAgICAgICAgICAgICAgZnMgfD0gRmlsZVNoYXJlLkRlbGV0ZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDg0MjMKKyAgICAgICAgICAgICAgICBpbnB1dCA9IEZpbGUuT3BlbihMb2NhbEZpbGVOYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQsIGZzKTsKKyAgICAgICAgICAgICAgICBmaWxlTGVuZ3RoID0gaW5wdXQuTGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmlsZUxlbmd0aDsKKyAgICAgICAgfQorCisKKworICAgICAgICBpbnRlcm5hbCB2b2lkIEZpbmlzaE91dHB1dFN0cmVhbShTdHJlYW0gcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdTdHJlYW0gZW50cnlDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gZW5jcnlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW9uaWMuQ3JjLkNyY0NhbGN1bGF0b3JTdHJlYW0gb3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgb3V0cHV0LkNsb3NlKCk7CisKKyAgICAgICAgICAgIC8vIGJ5IGNhbGxpbmcgQ2xvc2UoKSBvbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHdlIHdyaXRlIHRoZSBmb290ZXIgYnl0ZXMsIGFzIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmICgoY29tcHJlc3NvciBhcyBJb25pYy5abGliLkRlZmxhdGVTdHJlYW0pICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5DbG9zZSgpOworI2lmIEJaSVAKKyAgICAgICAgICAgIGVsc2UgaWYgKChjb21wcmVzc29yIGFzIElvbmljLkJaaXAyLkJaaXAyT3V0cHV0U3RyZWFtKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuQ2xvc2UoKTsKKyNpZiAhTkVUQ0YKKyAgICAgICAgICAgIGVsc2UgaWYgKChjb21wcmVzc29yIGFzIElvbmljLkJaaXAyLlBhcmFsbGVsQlppcDJPdXRwdXRTdHJlYW0pICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5DbG9zZSgpOworI2VuZGlmCisjZW5kaWYKKworI2lmICFORVRDRgorICAgICAgICAgICAgZWxzZSBpZiAoKGNvbXByZXNzb3IgYXMgSW9uaWMuWmxpYi5QYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0pICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5DbG9zZSgpOworI2VuZGlmCisKKyAgICAgICAgICAgIGVuY3J5cHRvci5GbHVzaCgpOworICAgICAgICAgICAgZW5jcnlwdG9yLkNsb3NlKCk7CisKKyAgICAgICAgICAgIF9MZW5ndGhPZlRyYWlsZXIgPSAwOworCisgICAgICAgICAgICBfVW5jb21wcmVzc2VkU2l6ZSA9IG91dHB1dC5Ub3RhbEJ5dGVzU2x1cnBlZDsKKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgV2luWmlwQWVzQ2lwaGVyU3RyZWFtIHd6YWNzID0gZW5jcnlwdG9yIGFzIFdpblppcEFlc0NpcGhlclN0cmVhbTsKKyAgICAgICAgICAgIGlmICh3emFjcyAhPSBudWxsICYmIF9VbmNvbXByZXNzZWRTaXplID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLldyaXRlKHd6YWNzLkZpbmFsQXV0aGVudGljYXRpb24sIDAsIDEwKTsKKyAgICAgICAgICAgICAgICBfTGVuZ3RoT2ZUcmFpbGVyICs9IDEwOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBfQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSA9IGVudHJ5Q291bnRlci5CeXRlc1dyaXR0ZW47CisgICAgICAgICAgICBfQ29tcHJlc3NlZFNpemUgPSBfQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZTsgICAvLyBtYXkgYmUgYWRqdXN0ZWQKKyAgICAgICAgICAgIF9DcmMzMiA9IG91dHB1dC5DcmM7CisKKyAgICAgICAgICAgIC8vIFNldCBfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyIG5vdywgdG8gYWxsb3cgZm9yIHJlLXN0cmVhbWluZworICAgICAgICAgICAgU3RvcmVSZWxhdGl2ZU9mZnNldCgpOworICAgICAgICB9CisKKworCisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBQb3N0UHJvY2Vzc091dHB1dChTdHJlYW0gcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHMxID0gcyBhcyBDb3VudGluZ1N0cmVhbTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODkzMSAtIGZvciBXcml0ZURlbGVnYXRlLgorICAgICAgICAgICAgLy8gVGhlIFdyaXRlRGVsZWdhdGUgY2hhbmdlcyB0aGluZ3MgYmVjYXVzZSB0aGVyZSBjYW4gYmUgYSB6ZXJvLWJ5dGUgc3RyZWFtCisgICAgICAgICAgICAvLyB3cml0dGVuLiBJbiBhbGwgb3RoZXIgY2FzZXMgRG90TmV0WmlwIGtub3dzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbQorICAgICAgICAgICAgLy8gYmVmb3JlIGNvbXByZXNzaW5nIGFuZCBlbmNyeXB0aW5nLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBjaXJjbGUgYmFjaywKKyAgICAgICAgICAgIC8vIGFuZCBvbWl0IGFsbCB0aGUgY3J5cHRvIHN0dWZmIC0gdGhlIEdQIGJpdGZpZWxkLCBhbmQgdGhlIGNyeXB0byBoZWFkZXIuCisgICAgICAgICAgICBpZiAoX1VuY29tcHJlc3NlZFNpemUgPT0gMCAmJiBfQ29tcHJlc3NlZFNpemUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fU291cmNlID09IFppcEVudHJ5U291cmNlLlppcE91dHB1dFN0cmVhbSkgcmV0dXJuOyAgLy8gbm90aGluZyB0byBkby4uLgorCisgICAgICAgICAgICAgICAgaWYgKF9QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlckJ5dGVzVG9SZXRyYWN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Qa3ppcFdlYWspCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCeXRlc1RvUmV0cmFjdCA9IDEyOworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMTI4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJ5dGVzVG9SZXRyYWN0ID0gX2Flc0NyeXB0b19mb3JXcml0ZS5fU2FsdC5MZW5ndGggKyBfYWVzQ3J5cHRvX2ZvcldyaXRlLkdlbmVyYXRlZFBWLkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwT3V0cHV0U3RyZWFtICYmICFzLkNhblNlZWspCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJaZXJvIGJ5dGVzIHdyaXR0ZW4sIGVuY3J5cHRpb24gaW4gdXNlLCBhbmQgbm9uLXNlZWthYmxlIG91dHB1dC4iKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoRW5jcnlwdGlvbiAhPSBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZWsgYmFjayBpbiB0aGUgc3RyZWFtIHRvIHVuLW91dHB1dCB0aGUgc2VjdXJpdHkgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuU2VlaygtMSAqIGhlYWRlckJ5dGVzVG9SZXRyYWN0LCBTZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcy5TZXRMZW5ndGgocy5Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgocyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDExMTMxCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGNvdW50IG9uIHRoZSBDb3VudGluZ1N0cmVhbSBhcyBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMSAhPSBudWxsKSBzMS5BZGp1c3QoaGVhZGVyQnl0ZXNUb1JldHJhY3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUgc2VjdXJpdHkgaGVhZGVyIGZyb20gdGhlIF9MZW5ndGhPZkhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgX0xlbmd0aE9mSGVhZGVyIC09IGhlYWRlckJ5dGVzVG9SZXRyYWN0OworICAgICAgICAgICAgICAgICAgICAgICAgX19GaWxlRGF0YVBvc2l0aW9uIC09IGhlYWRlckJ5dGVzVG9SZXRyYWN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9QYXNzd29yZCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdHVybiBvZmYgdGhlIGVuY3J5cHRpb24gYml0CisgICAgICAgICAgICAgICAgICAgIF9CaXRGaWVsZCAmPSB+KDB4MDAwMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdXBkYXRlZCBiaXRmaWVsZCB2YWx1ZSBpbnRvIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgaW50IGogPSA2OworICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaisrXSA9IChieXRlKShfQml0RmllbGQgJiAweDAwRkYpOworICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaisrXSA9IChieXRlKSgoX0JpdEZpZWxkICYgMHhGRjAwKSA+PiA4KTsKKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgICAgICAgICBpZiAoRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4IHRoZSBleHRyYSBmaWVsZCAtIG92ZXJ3cml0ZSB0aGUgMHg5OTAxIGhlYWRlcklkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGR1bW15IGRhdGEuIChhcmJpdHJhcmlseSwgMHg5OTk5KQorICAgICAgICAgICAgICAgICAgICAgICAgSW50MTYgZm5MZW5ndGggPSAoc2hvcnQpKF9FbnRyeUhlYWRlclsyNl0gKyBfRW50cnlIZWFkZXJbMjddICogMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZ4ID0gMzAgKyBmbkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZXNJbmRleCA9IEZpbmRFeHRyYUZpZWxkU2VnbWVudChfRW50cnlIZWFkZXIsIG9mZngsIDB4OTkwMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWVzSW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbYWVzSW5kZXgrK10gPSAweDk5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FbnRyeUhlYWRlclthZXNJbmRleCsrXSA9IDB4OTk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTWV0aG9kID0gMDsKKyAgICAgICAgICAgICAgICBFbmNyeXB0aW9uID0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX3ppcENyeXB0b19mb3JXcml0ZSAhPSBudWxsCisjaWYgQUVTQ1JZUFRPCisgICAgICAgICAgICAgICAgICAgICB8fCBfYWVzQ3J5cHRvX2ZvcldyaXRlICE9IG51bGwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Qa3ppcFdlYWspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfQ29tcHJlc3NlZFNpemUgKz0gMTI7IC8vIDEyIGV4dHJhIGJ5dGVzIGZvciB0aGUgZW5jcnlwdGlvbiBoZWFkZXIKKyAgICAgICAgICAgICAgICB9CisjaWYgQUVTQ1JZUFRPCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGNvbXByZXNzZWQgc2l6ZSB0byBpbmNsdWRlIHRoZSB2YXJpYWJsZSAoc2FsdCtwdikKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkgaGVhZGVyIGFuZCAxMC1ieXRlIHRyYWlsZXIuIEFjY29yZGluZyB0byB0aGUgd2luemlwIEFFUworICAgICAgICAgICAgICAgICAgICAvLyBzcGVjLCB0aGF0IG1ldGFkYXRhIGlzIGluY2x1ZGVkIGluIHRoZSAiQ29tcHJlc3NlZCBTaXplIiBmaWd1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBlbmNvZGluZyB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgICAgICAgICAgICAgIF9Db21wcmVzc2VkU2l6ZSArPSBfYWVzQ3J5cHRvX2ZvcldyaXRlLlNpemVPZkVuY3J5cHRpb25NZXRhZGF0YTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGkgPSA4OworICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoX0NvbXByZXNzaW9uTWV0aG9kICYgMHgwMEZGKTsKKyAgICAgICAgICAgIF9FbnRyeUhlYWRlcltpKytdID0gKGJ5dGUpKChfQ29tcHJlc3Npb25NZXRob2QgJiAweEZGMDApID4+IDgpOworCisgICAgICAgICAgICBpID0gMTQ7CisgICAgICAgICAgICAvLyBDUkMgLSB0aGUgY29ycmVjdCB2YWx1ZSBub3cKKyAgICAgICAgICAgIF9FbnRyeUhlYWRlcltpKytdID0gKGJ5dGUpKF9DcmMzMiAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoKF9DcmMzMiAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoKF9DcmMzMiAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgICAgICAgIF9FbnRyeUhlYWRlcltpKytdID0gKGJ5dGUpKChfQ3JjMzIgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisKKyAgICAgICAgICAgIFNldFppcDY0RmxhZ3MoKTsKKworICAgICAgICAgICAgLy8gKGk9PTI2KSBmaWxlbmFtZSBsZW5ndGggKEludDE2KQorICAgICAgICAgICAgSW50MTYgZmlsZW5hbWVMZW5ndGggPSAoc2hvcnQpKF9FbnRyeUhlYWRlclsyNl0gKyBfRW50cnlIZWFkZXJbMjddICogMjU2KTsKKyAgICAgICAgICAgIEludDE2IGV4dHJhRmllbGRMZW5ndGggPSAoc2hvcnQpKF9FbnRyeUhlYWRlclsyOF0gKyBfRW50cnlIZWFkZXJbMjldICogMjU2KTsKKworICAgICAgICAgICAgaWYgKF9PdXRwdXRVc2VzWmlwNjQuVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVmVyc2lvbk5lZWRlZFRvRXh0cmFjdCAtIHNldCB0byA0NSB0byBpbmRpY2F0ZSB6aXA2NAorICAgICAgICAgICAgICAgIF9FbnRyeUhlYWRlcls0XSA9IChieXRlKSg0NSAmIDB4MDBGRik7CisgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyWzVdID0gMHgwMDsKKworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc5MjQgLSBkb24ndCBuZWVkIGJpdCAzCisgICAgICAgICAgICAgICAgLy8gLy8gd29ya2l0ZW0gNzkxNworICAgICAgICAgICAgICAgIC8vIC8vIHNldCBiaXQgMyBmb3IgWklQNjQgY29tcGF0aWJpbGl0eSB3aXRoIFdpblppcDEyCisgICAgICAgICAgICAgICAgLy8gX0JpdEZpZWxkIHw9IDB4MDAwODsKKyAgICAgICAgICAgICAgICAvLyBfRW50cnlIZWFkZXJbNl0gPSAoYnl0ZSkoX0JpdEZpZWxkICYgMHgwMEZGKTsKKworICAgICAgICAgICAgICAgIC8vIENvbXByZXNzZWRTaXplIGFuZCBVbmNvbXByZXNzZWRTaXplIC0gMHhGRgorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IDB4ZmY7CisKKyAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIG5lZWQgdG8gZmluZCB0aGUgIkV4dHJhIGZpZWxkIiB0aGF0IGZvbGxvd3MgdGhlCisgICAgICAgICAgICAgICAgLy8gZmlsZW5hbWUuICBXZSBoYWQgYWxyZWFkeSBlbWl0dGVkIGl0LCBidXQgdGhlIGRhdGEgKHVuY29tcCwgY29tcCwKKyAgICAgICAgICAgICAgICAvLyBST0xIKSB3YXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB3ZSBkaWQgc28uICBIZXJlLCB3ZSBlbWl0IGl0CisgICAgICAgICAgICAgICAgLy8gYWdhaW4sIHdpdGggZmluYWwgdmFsdWVzLgorCisgICAgICAgICAgICAgICAgaSA9IDMwICsgZmlsZW5hbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAweDAxOyAgLy8gemlwNjQKKyAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IDB4MDA7CisKKyAgICAgICAgICAgICAgICBpICs9IDI7IC8vIHNraXAgb3ZlciBkYXRhIHNpemUsIHdoaWNoIGlzIDE2KzQKKworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKF9VbmNvbXByZXNzZWRTaXplKSwgMCwgX0VudHJ5SGVhZGVyLCBpLCA4KTsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoX0NvbXByZXNzZWRTaXplKSwgMCwgX0VudHJ5SGVhZGVyLCBpLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBWZXJzaW9uTmVlZGVkVG9FeHRyYWN0IC0gcmVzZXQgdG8gMjAgc2luY2Ugbm8gemlwNjQKKyAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbNF0gPSAoYnl0ZSkoMjAgJiAweDAwRkYpOworICAgICAgICAgICAgICAgIF9FbnRyeUhlYWRlcls1XSA9IDB4MDA7CisKKyAgICAgICAgICAgICAgICAvLyBDb21wcmVzc2VkU2l6ZSAtIHRoZSBjb3JyZWN0IHZhbHVlIG5vdworICAgICAgICAgICAgICAgIGkgPSAxODsKKyAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IChieXRlKShfQ29tcHJlc3NlZFNpemUgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IChieXRlKSgoX0NvbXByZXNzZWRTaXplICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoKF9Db21wcmVzc2VkU2l6ZSAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IChieXRlKSgoX0NvbXByZXNzZWRTaXplICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCisgICAgICAgICAgICAgICAgLy8gVW5jb21wcmVzc2VkU2l6ZSAtIHRoZSBjb3JyZWN0IHZhbHVlIG5vdworICAgICAgICAgICAgICAgIF9FbnRyeUhlYWRlcltpKytdID0gKGJ5dGUpKF9VbmNvbXByZXNzZWRTaXplICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoKF9VbmNvbXByZXNzZWRTaXplICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoKF9VbmNvbXByZXNzZWRTaXplICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgICAgIF9FbnRyeUhlYWRlcltpKytdID0gKGJ5dGUpKChfVW5jb21wcmVzc2VkU2l6ZSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBIZWFkZXJJZCBpbiB0aGUgZXh0cmEgZmllbGQgaGVhZGVyLCBpcyBhbHJlYWR5IGR1bW1pZWQgb3V0LgorICAgICAgICAgICAgICAgIGlmIChleHRyYUZpZWxkTGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpID0gMzAgKyBmaWxlbmFtZUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHppcCBhcmNoaXZlcyB3cml0dGVuIGJ5IHRoaXMgbGlicmFyeSwgaWYgdGhlIHppcDY0CisgICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlciBleGlzdHMsIGl0IGlzIHRoZSBmaXJzdCBoZWFkZXIuIEJlY2F1c2Ugb2YgdGhlIGxvZ2ljCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgd2hlbiBmaXJzdCB3cml0aW5nIHRoZSBfRW50cnlIZWFkZXIgYnl0ZXMsIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXJJZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBhbnkgcGFydGljdWxhciB2YWx1ZS4gIFNvCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRldGVybWluZSBpZiB0aGUgZmlyc3QgaGVhZGVyIGlzIGEgcHV0YXRpdmUgemlwNjQgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGV4YW1pbmluZyB0aGUgZGF0YXNpemUuICBVSW50MTYgSGVhZGVySWQgPQorICAgICAgICAgICAgICAgICAgICAvLyAoVUludDE2KShfRW50cnlIZWFkZXJbaV0gKyBfRW50cnlIZWFkZXJbaSArIDFdICogMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgSW50MTYgRGF0YVNpemUgPSAoc2hvcnQpKF9FbnRyeUhlYWRlcltpICsgMl0gKyBfRW50cnlIZWFkZXJbaSArIDNdICogMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERhdGFTaXplID09IDE2KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0byBIZWFkZXIgSWQgdG8gZHVtbXkgdmFsdWUsIGVmZmVjdGl2ZWx5IGR1bW15LWluZyBvdXQgdGhlIHppcDY0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IDB4OTk7CisgICAgICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IDB4OTk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworI2lmIEFFU0NSWVBUTworCisgICAgICAgICAgICBpZiAoRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCB8fAorICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTXVzdCBzZXQgY29tcHJlc3Npb25tZXRob2QgdG8gMHgwMDYzIChkZWNpbWFsIDk5KQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gc2V0IHRoZSBjb21wcmVzc2lvbiBtZXRob2QgYnl0ZXMgaW5zaWRlIHRoZSBleHRyYQorICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRvIHRoZSBhY3R1YWwgY29tcHJlc3Npb24gbWV0aG9kIHZhbHVlLgorCisgICAgICAgICAgICAgICAgaSA9IDg7CisgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAweDYzOworICAgICAgICAgICAgICAgIF9FbnRyeUhlYWRlcltpKytdID0gMDsKKworICAgICAgICAgICAgICAgIGkgPSAzMCArIGZpbGVuYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVSW50MTYgSGVhZGVySWQgPSAoVUludDE2KShfRW50cnlIZWFkZXJbaV0gKyBfRW50cnlIZWFkZXJbaSArIDFdICogMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgSW50MTYgRGF0YVNpemUgPSAoc2hvcnQpKF9FbnRyeUhlYWRlcltpICsgMl0gKyBfRW50cnlIZWFkZXJbaSArIDNdICogMjU2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEhlYWRlcklkICE9IDB4OTkwMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBEYXRhU2l6ZSArIDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWwgY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICBfRW50cnlIZWFkZXJbaSsrXSA9IChieXRlKShfQ29tcHJlc3Npb25NZXRob2QgJiAweDAwRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgX0VudHJ5SGVhZGVyW2krK10gPSAoYnl0ZSkoX0NvbXByZXNzaW9uTWV0aG9kICYgMHhGRjAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCAoZXh0cmFGaWVsZExlbmd0aCAtIDMwIC0gZmlsZW5hbWVMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgZGF0YS4KKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzIxNiAtIHNvbWV0aW1lcyB3ZSBkb24ndCBzZWVrIGV2ZW4gaWYgd2UgQ0FOLiAgQVNQLk5FVAorICAgICAgICAgICAgLy8gUmVzcG9uc2UuT3V0cHV0U3RyZWFtLCBvciBzdGRvdXQgYXJlIG5vbi1zZWVrYWJsZS4gIEJ1dCB3ZSBtYXkgYWxzbyB3YW50CisgICAgICAgICAgICAvLyB0byBOT1Qgc2VlayBpbiBvdGhlciBjYXNlcywgZWcgemlwNjQuICBGb3IgYWxsIGNhc2VzLCB3ZSBqdXN0IGNoZWNrIGJpdCAzCisgICAgICAgICAgICAvLyB0byBzZWUgaWYgd2Ugd2FudCB0byBzZWVrLiAgVGhlcmUncyBvbmUgZXhjZXB0aW9uIC0gaWYgdXNpbmcgYQorICAgICAgICAgICAgLy8gWmlwT3V0cHV0U3RyZWFtLCBhbmQgUEtaaXAgZW5jcnlwdGlvbiBpcyBpbiB1c2UsIHRoZW4gd2Ugc2V0IGJpdCAzIGV2ZW4KKyAgICAgICAgICAgIC8vIGlmIHRoZSBvdXQgaXMgc2Vla2FibGUuIFRoaXMgaXMgc28gdGhlIGNoZWNrIG9uIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCisgICAgICAgICAgICAvLyBQS1ppcCBFbmNyeXB0aW9uIEhlYWRlciBjYW4gYmUgZG9uZSBvbiB0aGUgY3VycmVudCB0aW1lLCBhcyBvcHBvc2VkIHRvCisgICAgICAgICAgICAvLyB0aGUgQ1JDLCB0byBwcmV2ZW50IHN0cmVhbWluZyB0aGUgZmlsZSB0d2ljZS4gIFNvLCB0ZXN0IGZvcgorICAgICAgICAgICAgLy8gWmlwT3V0cHV0U3RyZWFtIGFuZCBzZWVrYWJsZSwgYW5kIGlmIHNvLCBzZWVrIGJhY2ssIGV2ZW4gaWYgYml0IDMgaXMgc2V0LgorCisgICAgICAgICAgICBpZiAoKF9CaXRGaWVsZCAmIDB4MDAwOCkgIT0gMHgwMDA4IHx8CisgICAgICAgICAgICAgICAgICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwT3V0cHV0U3RyZWFtICYmIHMuQ2FuU2VlaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2VlayBiYWNrIGFuZCByZXdyaXRlIHRoZSBlbnRyeSBoZWFkZXIKKyAgICAgICAgICAgICAgICB2YXIgenNzID0gcyBhcyBaaXBTZWdtZW50ZWRTdHJlYW07CisgICAgICAgICAgICAgICAgaWYgKHpzcyAhPSBudWxsICYmIF9kaXNrTnVtYmVyICE9IHpzcy5DdXJyZW50U2VnbWVudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgZW50cnkgaGVhZGVyIGlzIGluIGEgZGlmZmVyZW50IGZpbGUsCisgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLiBOZWVkIHRvIHJlLW9wZW4gaXQuCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gaHNlZyA9IFppcFNlZ21lbnRlZFN0cmVhbS5Gb3JVcGRhdGUodGhpcy5fY29udGFpbmVyLlppcEZpbGUuTmFtZSwgX2Rpc2tOdW1iZXIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoc2VnLlNlZWsodGhpcy5fUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhzZWcuV3JpdGUoX0VudHJ5SGVhZGVyLCAwLCBfRW50cnlIZWFkZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBzZWVrIGluIHRoZSByYXcgb3V0cHV0IHN0cmVhbSwgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyIGZvcgorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MDk4OiBvayAob3V0cHV0KQorICAgICAgICAgICAgICAgICAgICBzLlNlZWsodGhpcy5fUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgdXBkYXRlZCBoZWFkZXIgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgcy5Xcml0ZShfRW50cnlIZWFkZXIsIDAsIF9FbnRyeUhlYWRlci5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgY291bnQgb24gdGhlIENvdW50aW5nU3RyZWFtIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICBpZiAoczEgIT0gbnVsbCkgczEuQWRqdXN0KF9FbnRyeUhlYWRlci5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlZWsgaW4gdGhlIHJhdyBvdXRwdXQgc3RyZWFtLCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgcy5TZWVrKF9Db21wcmVzc2VkU2l6ZSwgU2Vla09yaWdpbi5DdXJyZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVtaXQgdGhlIGRlc2NyaXB0b3IgLSBvbmx5IGlmIG5vdCBhIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIGlmICgoKF9CaXRGaWVsZCAmIDB4MDAwOCkgPT0gMHgwMDA4KSAmJiAhSXNEaXJlY3RvcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIERlc2NyaXB0b3IgPSBuZXcgYnl0ZVsxNiArIChfT3V0cHV0VXNlc1ppcDY0LlZhbHVlID8gOCA6IDApXTsKKyAgICAgICAgICAgICAgICBpID0gMDsKKworICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZQorICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKFppcENvbnN0YW50cy5aaXBFbnRyeURhdGFEZXNjcmlwdG9yU2lnbmF0dXJlKSwgMCwgRGVzY3JpcHRvciwgaSwgNCk7CisgICAgICAgICAgICAgICAgaSArPSA0OworCisgICAgICAgICAgICAgICAgLy8gQ1JDIC0gdGhlIGNvcnJlY3QgdmFsdWUgbm93CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoX0NyYzMyKSwgMCwgRGVzY3JpcHRvciwgaSwgNCk7CisgICAgICAgICAgICAgICAgaSArPSA0OworCisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzkxNworICAgICAgICAgICAgICAgIGlmIChfT3V0cHV0VXNlc1ppcDY0LlZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHJlc3NlZFNpemUgLSB0aGUgY29ycmVjdCB2YWx1ZSBub3cKKyAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoX0NvbXByZXNzZWRTaXplKSwgMCwgRGVzY3JpcHRvciwgaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gODsKKworICAgICAgICAgICAgICAgICAgICAvLyBVbmNvbXByZXNzZWRTaXplIC0gdGhlIGNvcnJlY3QgdmFsdWUgbm93CisgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKF9VbmNvbXByZXNzZWRTaXplKSwgMCwgRGVzY3JpcHRvciwgaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHJlc3NlZFNpemUgLSAobG93ZXIgMzIgYml0cykgdGhlIGNvcnJlY3QgdmFsdWUgbm93CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JbaSsrXSA9IChieXRlKShfQ29tcHJlc3NlZFNpemUgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcltpKytdID0gKGJ5dGUpKChfQ29tcHJlc3NlZFNpemUgJiAweDAwMDBGRjAwKSA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcltpKytdID0gKGJ5dGUpKChfQ29tcHJlc3NlZFNpemUgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JbaSsrXSA9IChieXRlKSgoX0NvbXByZXNzZWRTaXplICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFVuY29tcHJlc3NlZFNpemUgLSAobG93ZXIgMzIgYml0cykgdGhlIGNvcnJlY3QgdmFsdWUgbm93CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JbaSsrXSA9IChieXRlKShfVW5jb21wcmVzc2VkU2l6ZSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yW2krK10gPSAoYnl0ZSkoKF9VbmNvbXByZXNzZWRTaXplICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JbaSsrXSA9IChieXRlKSgoX1VuY29tcHJlc3NlZFNpemUgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JbaSsrXSA9IChieXRlKSgoX1VuY29tcHJlc3NlZFNpemUgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIHRyYWlsaW5nIGRlc2NyaXB0b3IgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICBzLldyaXRlKERlc2NyaXB0b3IsIDAsIERlc2NyaXB0b3IuTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIF9MZW5ndGhPZlRyYWlsZXIgKz0gRGVzY3JpcHRvci5MZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFppcDY0RmxhZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB6aXA2NCBob3VzZWtlZXBpbmcKKyAgICAgICAgICAgIF9lbnRyeVJlcXVpcmVzWmlwNjQgPSBuZXcgTnVsbGFibGU8Ym9vbD4KKyAgICAgICAgICAgICAgICAoX0NvbXByZXNzZWRTaXplID49IDB4RkZGRkZGRkYgfHwgX1VuY29tcHJlc3NlZFNpemUgPj0gMHhGRkZGRkZGRiB8fCBfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID49IDB4RkZGRkZGRkYpOworCisgICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgWklQNjQgdXNhZ2UKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcDY0ID09IFppcDY0T3B0aW9uLk5ldmVyICYmIF9lbnRyeVJlcXVpcmVzWmlwNjQuVmFsdWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiQ29tcHJlc3NlZCBvciBVbmNvbXByZXNzZWQgc2l6ZSwgb3Igb2Zmc2V0IGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUuIENvbnNpZGVyIHNldHRpbmcgdGhlIFVzZVppcDY0V2hlblNhdmluZyBwcm9wZXJ0eSBvbiB0aGUgWmlwRmlsZSBpbnN0YW5jZS4iKTsKKworICAgICAgICAgICAgX091dHB1dFVzZXNaaXA2NCA9IG5ldyBOdWxsYWJsZTxib29sPihfY29udGFpbmVyLlppcDY0ID09IFppcDY0T3B0aW9uLkFsd2F5cyB8fCBfZW50cnlSZXF1aXJlc1ppcDY0LlZhbHVlKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFByZXBhcmUgdGhlIGdpdmVuIHN0cmVhbSBmb3Igb3V0cHV0IC0gd3JhcCBpdCBpbiBhIENvdW50aW5nU3RyZWFtLCBhbmQKKyAgICAgICAgLy8vICAgdGhlbiBpbiBhIENSQyBzdHJlYW0sIGFuZCBhbiBlbmNyeXB0b3IgYW5kIGRlZmxhdG9yIGFzIGFwcHJvcHJpYXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFByZXZpb3VzbHkgdGhpcyB3YXMgdXNlZCBpbiBaaXBFbnRyeS5Xcml0ZSgpLCBidXQgaW4gYW4gZWZmb3J0IHRvCisgICAgICAgIC8vLyAgICAgaW50cm9kdWNlIHNvbWUgZWZmaWNpZW5jaWVzIGluIHRoYXQgbWV0aG9kIEkndmUgcmVmYWN0b3JlZCB0byBwdXQgdGhlCisgICAgICAgIC8vLyAgICAgY29kZSBpbmxpbmUuICBUaGlzIG1ldGhvZCBzdGlsbCBnZXRzIGNhbGxlZCBieSBaaXBPdXRwdXRTdHJlYW0uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBQcmVwT3V0cHV0U3RyZWFtKFN0cmVhbSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdHJlYW1MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQ291bnRpbmdTdHJlYW0gb3V0cHV0Q291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBTdHJlYW0gZW5jcnlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IFN0cmVhbSBjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IElvbmljLkNyYy5DcmNDYWxjdWxhdG9yU3RyZWFtIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhY2VXcml0ZUxpbmUoIlByZXBPdXRwdXRTdHJlYW06IGUoezB9KSBjb21wKHsxfSkgY3J5cHRvKHsyfSkgemYoezN9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lci5OYW1lKTsKKworICAgICAgICAgICAgLy8gV3JhcCBhIGNvdW50aW5nIHN0cmVhbSBhcm91bmQgdGhlIHJhdyBvdXRwdXQgc3RyZWFtOgorICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCB0aGluZyB0aGF0IGhhcHBlbnMgYmVmb3JlIHRoZSBiaXRzIGdvIHRvIHRoZQorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24tcHJvdmlkZWQgc3RyZWFtLgorICAgICAgICAgICAgb3V0cHV0Q291bnRlciA9IG5ldyBDb3VudGluZ1N0cmVhbShzKTsKKworICAgICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBpbmNvbWluZyAicmF3IiBvdXRwdXQgc3RyZWFtIGlzIGFscmVhZHkgYSBDb3VudGluZ1N0cmVhbS4KKyAgICAgICAgICAgIC8vIERvZXNuJ3QgbWF0dGVyLiBXcmFwIGl0IHdpdGggYSBjb3VudGVyIGFueXdheS4gV2UgbmVlZCB0byBjb3VudCBhdCBib3RoCisgICAgICAgICAgICAvLyBsZXZlbHMuCisKKyAgICAgICAgICAgIGlmIChzdHJlYW1MZW5ndGggIT0gMEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTWF5YmUgd3JhcCBhbiBlbmNyeXB0aW5nIHN0cmVhbSBhcm91bmQgdGhhdDoKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIEJFRk9SRSBvdXRwdXQgY291bnRpbmcsIGFuZCBBRlRFUiBkZWZsYXRpb24sIGlmIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAvLyBpcyB1c2VkLgorICAgICAgICAgICAgICAgIGVuY3J5cHRvciA9IE1heWJlQXBwbHlFbmNyeXB0aW9uKG91dHB1dENvdW50ZXIpOworCisgICAgICAgICAgICAgICAgLy8gTWF5YmUgd3JhcCBhIGNvbXByZXNzaW5nIFN0cmVhbSBhcm91bmQgdGhhdC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIEJFRk9SRSBlbmNyeXB0aW9uIChpZiBhbnkpIGFzIHdlIHdyaXRlIGRhdGEgb3V0LgorICAgICAgICAgICAgICAgIGNvbXByZXNzb3IgPSBNYXliZUFwcGx5Q29tcHJlc3Npb24oZW5jcnlwdG9yLCBzdHJlYW1MZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3J5cHRvciA9IGNvbXByZXNzb3IgPSBvdXRwdXRDb3VudGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gV3JhcCBhIENyY0NhbGN1bGF0b3JTdHJlYW0gYXJvdW5kIHRoYXQuCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIEJFRk9SRSBjb21wcmVzc2lvbiAoaWYgYW55KSBhcyB3ZSB3cml0ZSBkYXRhIG91dC4KKyAgICAgICAgICAgIG91dHB1dCA9IG5ldyBJb25pYy5DcmMuQ3JjQ2FsY3VsYXRvclN0cmVhbShjb21wcmVzc29yLCB0cnVlKTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIFN0cmVhbSBNYXliZUFwcGx5Q29tcHJlc3Npb24oU3RyZWFtIHMsIGxvbmcgc3RyZWFtTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0NvbXByZXNzaW9uTWV0aG9kID09IDB4MDggJiYgQ29tcHJlc3Npb25MZXZlbCAhPSBJb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwuTm9uZSkKKyAgICAgICAgICAgIHsKKyNpZiAhTkVUQ0YKKyAgICAgICAgICAgICAgICAvLyBQYXJhbGxlbERlZmxhdGVUaHJlc2hvbGQgPT0gMCAgICBtZWFucyBBTFdBWVMgdXNlIHBhcmFsbGVsIGRlZmxhdGUKKyAgICAgICAgICAgICAgICAvLyBQYXJhbGxlbERlZmxhdGVUaHJlc2hvbGQgPT0gLTFMICBtZWFucyBORVZFUiB1c2UgcGFyYWxsZWwgZGVmbGF0ZQorICAgICAgICAgICAgICAgIC8vIE90aGVyIHZhbHVlcyBzcGVjaWZ5IHRoZSBhY3R1YWwgdGhyZXNob2xkLgorICAgICAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZCA9PSAwTCB8fAorICAgICAgICAgICAgICAgICAgICAoc3RyZWFtTGVuZ3RoID4gX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVUaHJlc2hvbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgIF9jb250YWluZXIuUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkID4gMEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBzb3J0IG9mIGhhY2t5LgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGV4cGVuc2l2ZSB0byBjcmVhdGUgYSBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0sIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGxhcmdlIG1lbW9yeSBidWZmZXJzLiAgQnV0IHRoZSBjbGFzcyBpcyB1bmxpa2UgbW9zdCBTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NlcyBpbiB0aGF0IGl0IGNhbiBiZSByZS11c2VkLCBzbyB0aGUgY2FsbGVyIGNhbiBjb21wcmVzcworICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBmaWxlcyB3aXRoIGl0LCBvbmUgZmlsZSBhdCBhIHRpbWUuICBUaGUga2V5IGlzIHRvIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQoKSBvbiBpdCwgaW4gYmV0d2VlbiB1c2VzLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIGlzIGF0dGFjaGVkIHRvIHRoZSBjb250YWluZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRzZWxmIC0gdGhlcmUgaXMganVzdCBvbmUgZm9yIHRoZSBlbnRpcmUgWmlwRmlsZSBvcgorICAgICAgICAgICAgICAgICAgICAvLyBaaXBPdXRwdXRTdHJlYW0uIFNvIGl0IGdldHMgY3JlYXRlZCBvbmNlLCBwZXIgc2F2ZSwgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gcmUtdXNlZCBtYW55IHRpbWVzLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFwcHJvYWNoIHdpbGwgYnJlYWsgd2hlbiB3ZSBnbyB0byBhICJwYXJhbGxlbCBzYXZlIgorICAgICAgICAgICAgICAgICAgICAvLyBhcHByb2FjaCwgd2hlcmUgbXVsdGlwbGUgZW50cmllcyB3aXRoaW4gdGhlIHppcCBmaWxlIGFyZSBiZWluZworICAgICAgICAgICAgICAgICAgICAvLyBjb21wcmVzc2VkIGFuZCBzYXZlZCBhdCB0aGUgc2FtZSB0aW1lLiAgQnV0IGZvciBub3cgaXQncyBvay4KKyAgICAgICAgICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW50aWF0ZSB0aGUgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlBhcmFsbGVsRGVmbGF0ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGFpbmVyLlN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBzZXQgdGhlIGNvZGVjIGJ1ZmZlciBzaXplIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIFdyaXRlKCkuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5Db2RlY0J1ZmZlclNpemUgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250YWluZXIuUGFyYWxsZWxEZWZsYXRlci5CdWZmZXJTaXplID0gX2NvbnRhaW5lci5Db2RlY0J1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVNYXhCdWZmZXJQYWlycyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVyLk1heEJ1ZmZlclBhaXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVNYXhCdWZmZXJQYWlyczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBpdCB3aXRoIHRoZSBuZXcgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIElvbmljLlpsaWIuUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIG8xID0gX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVyOworICAgICAgICAgICAgICAgICAgICBvMS5SZXNldChzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IERlZmxhdGVTdHJlYW0ocywgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYi5Db21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIGlmIChfY29udGFpbmVyLkNvZGVjQnVmZmVyU2l6ZSA+IDApCisgICAgICAgICAgICAgICAgICAgIG8uQnVmZmVyU2l6ZSA9IF9jb250YWluZXIuQ29kZWNCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIG8uU3RyYXRlZ3kgPSBfY29udGFpbmVyLlN0cmF0ZWd5OworICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICAgICAgfQorCisKKyNpZiBCWklQCisgICAgICAgICAgICBpZiAoX0NvbXByZXNzaW9uTWV0aG9kID09IDB4MGMpCisgICAgICAgICAgICB7CisjaWYgIU5FVENGCisgICAgICAgICAgICAgICAgaWYgKF9jb250YWluZXIuUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkID09IDBMIHx8CisgICAgICAgICAgICAgICAgICAgIChzdHJlYW1MZW5ndGggPiBfY29udGFpbmVyLlBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZCAmJgorICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lci5QYXJhbGxlbERlZmxhdGVUaHJlc2hvbGQgPiAwTCkpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHZhciBvMSA9IG5ldyBJb25pYy5CWmlwMi5QYXJhbGxlbEJaaXAyT3V0cHV0U3RyZWFtKHMsIHRydWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzE7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgdmFyIG8gPSBuZXcgSW9uaWMuQlppcDIuQlppcDJPdXRwdXRTdHJlYW0ocywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gTWF5YmVBcHBseUVuY3J5cHRpb24oU3RyZWFtIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyYWNlV3JpdGVMaW5lKCJNYXliZUFwcGx5RW5jcnlwdGlvbjogZSh7MH0pIFBLWklQIiwgRmlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBaaXBDaXBoZXJTdHJlYW0ocywgX3ppcENyeXB0b19mb3JXcml0ZSwgQ3J5cHRvTW9kZS5FbmNyeXB0KTsKKyAgICAgICAgICAgIH0KKyNpZiBBRVNDUllQVE8KKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMTI4IHx8CisgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyYWNlV3JpdGVMaW5lKCJNYXliZUFwcGx5RW5jcnlwdGlvbjogZSh7MH0pIEFFUyIsIEZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2luWmlwQWVzQ2lwaGVyU3RyZWFtKHMsIF9hZXNDcnlwdG9fZm9yV3JpdGUsIENyeXB0b01vZGUuRW5jcnlwdCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNlV3JpdGVMaW5lKCJNYXliZUFwcGx5RW5jcnlwdGlvbjogZSh7MH0pIE5vbmUiLCBGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgdm9pZCBPblppcEVycm9yV2hpbGVTYXZpbmcoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaW9PcGVyYXRpb25DYW5jZWxlZCA9IF9jb250YWluZXIuWmlwRmlsZS5PblppcEVycm9yU2F2aW5nKHRoaXMsIGUpOworICAgICAgICB9CisKKworCisgICAgICAgIGludGVybmFsIHZvaWQgV3JpdGUoU3RyZWFtIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjczEgPSBzIGFzIENvdW50aW5nU3RyZWFtOworICAgICAgICAgICAgdmFyIHpzczEgPSBzIGFzIFppcFNlZ21lbnRlZFN0cmVhbTsKKworICAgICAgICAgICAgYm9vbCBkb25lID0gZmFsc2U7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYXBwIGlzIHVwZGF0aW5nIGEgemlwIGZpbGUsIGl0IG1heSBiZSBwb3NzaWJsZSB0bworICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGNvcHkgZGF0YSBmb3IgYSBaaXBFbnRyeSBmcm9tIHRoZSBzb3VyY2UgemlwZmlsZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24sIGFzIGEgYmxvY2ssIHdpdGhvdXQgZGVjb21wcmVzc2luZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wcmVzc2luZywgZXRjLiAgQnV0LCBpbiBzb21lIGNhc2VzIHRoZSBhcHAgbW9kaWZpZXMgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgb24gYSBaaXBFbnRyeSBwcmlvciB0byBjYWxsaW5nIFNhdmUoKS4gQSBjaGFuZ2UgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYW55IG9mIHRoZSBtZXRhZGF0YSAtIHRoZSBGaWxlTmFtZSwgQ29tcHJlc3Npb0xldmUgYW5kIHNvIG9uLAorICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyBEb3ROZXRaaXAgY2Fubm90IHNpbXBseSBjb3B5IHRocm91Z2ggdGhlIGV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFppcEVudHJ5IGRhdGEgdW5jaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIGNhc2VzOgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAgMS4gQ2hhbmdlcyB0byBvbmx5IG1ldGFkYXRhLCB3aGljaCBtZWFucyB0aGUgaGVhZGVyIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgY2VudHJhbCBkaXJlY3RvcnkgbXVzdCBiZSBjaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyAgMi4gQ2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyB0aGF0IGFmZmVjdCB0aGUgY29tcHJlc3NlZAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RyZWFtLCBzdWNoIGFzIENvbXByZXNzaW9uTWV0aG9kLCBDb21wcmVzc2lvbkxldmVsLCBvcgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgRW5jcnlwdGlvbkFsZ29yaXRobS4gSW4gdGhpcyBjYXNlLCBEb3ROZXRaaXAgbXVzdAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgInJlLXN0cmVhbSIgdGhlIGRhdGE6IHRoZSBvbGQgZW50cnkgZGF0YSBtdXN0IGJlIG1heWJlCisgICAgICAgICAgICAgICAgICAgIC8vICAgICBkZWNyeXB0ZWQsIG1heWJlIGRlY29tcHJlc3NlZCwgdGhlbiBtYXliZSByZS1jb21wcmVzc2VkCisgICAgICAgICAgICAgICAgICAgIC8vICAgICBhbmQgbWF5YmUgcmUtZW5jcnlwdGVkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgY2hlY2tzIGlmIHRoZSBzb3VyY2UgZm9yIHRoZSBlbnRyeSBkYXRhIGlzIGEgemlwIGZpbGUsIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIHJlc3RyZWFtIGlzIG5lY2Vzc2FyeS4gIElmIE5PVCwgdGhlbiBpdCBqdXN0IGNvcGllcyB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBlbnRyeSwgcG90ZW50aWFsbHkgY2hhbmdpbmcgdGhlIG1ldGFkYXRhLgorCisgICAgICAgICAgICAgICAgICAgIGlmIChfU291cmNlID09IFppcEVudHJ5U291cmNlLlppcEZpbGUgJiYgIV9yZXN0cmVhbVJlcXVpcmVkT25TYXZlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb3B5VGhyb3VnaE9uZUVudHJ5KHMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIGVudHJ5IGEgZGlyZWN0b3J5PyAgSWYgc28sIHRoZSB3cml0ZSBpcyByZWxhdGl2ZWx5IHNpbXBsZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKElzRGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZUhlYWRlcihzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlUmVsYXRpdmVPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9lbnRyeVJlcXVpcmVzWmlwNjQgPSBuZXcgTnVsbGFibGU8Ym9vbD4oX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA+PSAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRVc2VzWmlwNjQgPSBuZXcgTnVsbGFibGU8Ym9vbD4oX2NvbnRhaW5lci5aaXA2NCA9PSBaaXA2NE9wdGlvbi5BbHdheXMgfHwgX2VudHJ5UmVxdWlyZXNaaXA2NC5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgY2FzZSBmb3Igc3BsaXQgYXJjaGl2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6c3MxICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rpc2tOdW1iZXIgPSB6c3MxLkN1cnJlbnRTZWdtZW50OworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgc291cmNlIGZvciB0aGlzIGVudHJ5IGlzIG5vdCBhIGRpcmVjdG9yeSwgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIHByZXZpb3VzbHkgY3JlYXRlZCB6aXAgZmlsZSwgb3IgdGhlIHNvdXJjZSBmb3IgdGhlIGVudHJ5IElTCisgICAgICAgICAgICAgICAgICAgIC8vIGEgcHJldmlvdXNseSBjcmVhdGVkIHppcCBidXQgdGhlIHNldHRpbmdzIHdoYXZlIGNoYW5nZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0YW50IHdheXMgYW5kIHRoZXJlZm9yZSB3ZSB3aWxsIG5lZWQgdG8gcHJvY2VzcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXN0cmVhbSAoY29tcHV0ZSBjcmMsIG1heWJlIGNvbXByZXNzLCBtYXliZSBlbmNyeXB0KSBpbiBvcmRlcgorICAgICAgICAgICAgICAgICAgICAvLyB0byB3cml0ZSB0aGUgY29udGVudCBpbnRvIHRoZSBuZXcgemlwLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyB0aGlzIGluIHBvdGVudGlhbGx5IDIgcGFzc2VzOiBUaGUgZmlyc3QgdGltZSB3ZSBkbyBpdCBhcworICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQsIG1heWJlIHdpdGggY29tcHJlc3Npb24gYW5kIG1heWJlIGVuY3J5cHRpb24uICBJZiB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlcyB0aGUgYnl0ZXN0cmVhbSB0byBpbmZsYXRlIGluIHNpemUsIGFuZCBpZiBjb21wcmVzc2lvbiB3YXMKKyAgICAgICAgICAgICAgICAgICAgLy8gb24sIHRoZW4gd2UgdHVybiBvZmYgY29tcHJlc3Npb24gYW5kIGRvIGl0IGFnYWluLgorCisKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkQWdhaW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpbnQgbkN5Y2xlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5DeWNsZXMrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVIZWFkZXIocywgbkN5Y2xlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBlbmNyeXB0ZWQgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVNlY3VyaXR5TWV0YWRhdGEocyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSAocG90ZW50aWFsbHkgY29tcHJlc3NlZCwgcG90ZW50aWFsbHkgZW5jcnlwdGVkKSBmaWxlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIF9Xcml0ZUVudHJ5RGF0YShzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgdG90YWwgZW50cnkgc2l6ZSAoaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBkZXNjcmlwdG9yIGFuZCBNQUMpCisgICAgICAgICAgICAgICAgICAgICAgICBfVG90YWxFbnRyeVNpemUgPSBfTGVuZ3RoT2ZIZWFkZXIgKyBfQ29tcHJlc3NlZEZpbGVEYXRhU2l6ZSArIF9MZW5ndGhPZlRyYWlsZXI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlIGRhdGEgaGFzIG5vdyBiZWVuIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlsZSBwb2ludGVyIGlzIHBvc2l0aW9uZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsZSBkYXRhLgorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobkN5Y2xlcyA+IDEpIHJlYWRBZ2FpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXMuQ2FuU2VlaykgcmVhZEFnYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJlYWRBZ2FpbiA9IFdhbnRSZWFkQWdhaW4oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVrIGJhY2sgaW4gdGhlIHJhdyBvdXRwdXQgc3RyZWFtLCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBmb3IgdGhpcyBlbnRyeS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBjYXNlIGZvciBzcGxpdCBhcmNoaXZlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6c3MxICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiKioqX2Rpc2tOdW1iZXIvZmlyc3Q6IHswfSIsIF9kaXNrTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIioqKl9kaXNrTnVtYmVyL2N1cnJlbnQ6IHswfSIsIHpzcy5DdXJyZW50U2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpzczEuVHJ1bmNhdGVCYWNrd2FyZChfZGlza051bWJlciwgX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gODA5ODogb2sgKG91dHB1dCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuU2VlayhfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGVudHJ5IGV4cGFuZHMsIHdlIHJlYWQgYWdhaW47IGJ1dCBoZXJlLCB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGhlIHN0cmVhbSB0byBwcmV2ZW50IGdhcmJhZ2UgZGF0YSBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQtb2YtY2VudHJhbC1kaXJlY3RvcnkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MDk4OiBvayAob3V0cHV0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLlNldExlbmd0aChzLlBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgY291bnQgb24gdGhlIENvdW50aW5nU3RyZWFtIGFzIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3MxICE9IG51bGwpIGNzMS5BZGp1c3QoX1RvdGFsRW50cnlTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZEFnYWluKTsKKyAgICAgICAgICAgICAgICAgICAgX3NraXBwZWREdXJpbmdTYXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLkV4Y2VwdGlvbiBleGMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWmlwRXJyb3JBY3Rpb24gb3JpZyA9IHRoaXMuWmlwRXJyb3JBY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGludCBsb29wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFppcEVycm9yQWN0aW9uID09IFppcEVycm9yQWN0aW9uLlRocm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWmlwRXJyb3JBY3Rpb24gPT0gWmlwRXJyb3JBY3Rpb24uU2tpcCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcEVycm9yQWN0aW9uID09IFppcEVycm9yQWN0aW9uLlJldHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgcmVzZXQgZmlsZSBwb2ludGVyIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTM5MDMgLSBzZWVrIGJhY2sgb25seSB3aGVuIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcDEgPSAoY3MxICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3MxLkNvbXB1dGVkUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzLlBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBwMSAtIF9mdXR1cmVfUk9MSDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5TZWVrKGRlbHRhLCBTZWVrT3JpZ2luLkN1cnJlbnQpOyAvLyBtYXkgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwMiA9IHMuUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuU2V0TGVuZ3RoKHMuUG9zaXRpb24pOyAgLy8gdG8gcHJldmVudCBnYXJiYWdlIGlmIHRoaXMgaXMgdGhlIGxhc3QgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzMSAhPSBudWxsKSBjczEuQWRqdXN0KHAxIC0gcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWmlwRXJyb3JBY3Rpb24gPT0gWmlwRXJyb3JBY3Rpb24uU2tpcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RhdHVzKCJTa2lwcGluZyBmaWxlIHswfSAoZXhjZXB0aW9uOiB7MX0pIiwgTG9jYWxGaWxlTmFtZSwgZXhjMS5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2tpcHBlZER1cmluZ1NhdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlppcEVycm9yQWN0aW9uID0gb3JpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvb3AgPiAwKSB0aHJvdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFppcEVycm9yQWN0aW9uID09IFppcEVycm9yQWN0aW9uLkludm9rZUVycm9yRXZlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25aaXBFcnJvcldoaWxlU2F2aW5nKGV4YzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW9PcGVyYXRpb25DYW5jZWxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsb29wKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICghZG9uZSk7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHZvaWQgU3RvcmVSZWxhdGl2ZU9mZnNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPSBfZnV0dXJlX1JPTEg7CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBOb3RpZnlTYXZlQ29tcGxldGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaGVuIHVwZGF0aW5nIGEgemlwIGZpbGUsIHRoZXJlIGFyZSB0d28gY29udGV4dHMgZm9yIHByb3BlcnRpZXMKKyAgICAgICAgICAgIC8vIGxpa2UgRW5jcnlwdGlvbiBvciBDb21wcmVzc2lvbk1ldGhvZCAtIHRoZSB2YWx1ZXMgcmVhZCBmcm9tIHRoZQorICAgICAgICAgICAgLy8gb3JpZ2luYWwgemlwIGZpbGUsIGFuZCB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIHVwZGF0ZWQgemlwIGZpbGUuCisgICAgICAgICAgICAvLyBUaGUgX0Zyb21aaXBGaWxlIHZlcnNpb25zIGFyZSB0aGUgb3JpZ2luYWxzLiAgQXQgdGhlIGVuZCBvZiBhIHNhdmUsCisgICAgICAgICAgICAvLyB0aGVzZSB2YWx1ZXMgYXJlIHRoZSBzYW1lLiAgU28gd2UgbmVlZCB0byB1cGRhdGUgdGhlbS4gIFRoaXMgdGFrZXMKKyAgICAgICAgICAgIC8vIGNhcmUgb2YgdGhlIGJvdW5kYXJ5IGNhc2Ugd2hlcmUgYSBzaW5nbGUgemlwZmlsZSBpbnN0YW5jZSBjYW4gYmUKKyAgICAgICAgICAgIC8vIHNhdmVkIG11bHRpcGxlIHRpbWVzLCB3aXRoIGRpc3RpbmN0IGNoYW5nZXMgdG8gdGhlIHByb3BlcnRpZXMgb24KKyAgICAgICAgICAgIC8vIHRoZSBlbnRyaWVzLCBpbiBiZXR3ZWVuIGVhY2ggU2F2ZSgpLgorICAgICAgICAgICAgX0VuY3J5cHRpb25fRnJvbVppcEZpbGUgPSBfRW5jcnlwdGlvbjsKKyAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZF9Gcm9tWmlwRmlsZSA9IF9Db21wcmVzc2lvbk1ldGhvZDsKKyAgICAgICAgICAgIF9yZXN0cmVhbVJlcXVpcmVkT25TYXZlID0gZmFsc2U7CisgICAgICAgICAgICBfbWV0YWRhdGFDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAvL19Tb3VyY2UgPSBaaXBFbnRyeVNvdXJjZS5Ob25lOworICAgICAgICAgICAgX1NvdXJjZSA9IFppcEVudHJ5U291cmNlLlppcEZpbGU7IC8vIHdvcmtpdGVtIDEwNjk0CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVTZWN1cml0eU1ldGFkYXRhKFN0cmVhbSBvdXRzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uTm9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHN0cmluZyBwd2QgPSB0aGlzLl9QYXNzd29yZDsKKworICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyBmb3Igc291cmNlID09IFppcEZpbGUuCisgICAgICAgICAgICAvLyBXYW50IHRvIHN1cHBvcnQgdGhlIGNhc2Ugd2hlcmUgd2UgcmUtc3RyZWFtIGFuIGVuY3J5cHRlZCBlbnRyeS4gVGhpcyB3aWxsIGludm9sdmUsCisgICAgICAgICAgICAvLyBhdCBydW50aW1lLCByZWFkaW5nLCBkZWNyeXB0aW5nLCBhbmQgZGVjb21wcmVzc2luZyBmcm9tIHRoZSBvcmlnaW5hbCB6aXAgZmlsZSwgdGhlbgorICAgICAgICAgICAgLy8gY29tcHJlc3NpbmcsIGVuY3J5cHRpbmcsIGFuZCB3cml0aW5nIHRvIHRoZSBvdXRwdXQgemlwIGZpbGUuCisKKyAgICAgICAgICAgIC8vIElmIHRoYXQncyB3aGF0IHdlJ3JlIGRvaW5nLCBhbmQgdGhlIHBhc3N3b3JkIGhhc24ndCBiZWVuIHNldCBvbiB0aGUgZW50cnksCisgICAgICAgICAgICAvLyB3ZSB1c2UgdGhlIGNvbnRhaW5lciAoWmlwRmlsZS9aaXBPdXRwdXRTdHJlYW0pIHBhc3N3b3JkIHRvIGRlY3J5cHQuCisgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGVyZSBzYXlzIHRvIHVzZSB0aGUgY29udGFpbmVyIHBhc3N3b3JkIHRvIHJlLWVuY3J5cHQsIGFzIHdlbGwsCisgICAgICAgICAgICAvLyB3aXRoIHRoYXQgcGFzc3dvcmQsIGlmIHRoZSBlbnRyeSBwYXNzd29yZCBpcyBudWxsLgorCisgICAgICAgICAgICBpZiAodGhpcy5fU291cmNlID09IFppcEVudHJ5U291cmNlLlppcEZpbGUgJiYgcHdkID09IG51bGwpCisgICAgICAgICAgICAgICAgcHdkID0gdGhpcy5fY29udGFpbmVyLlBhc3N3b3JkOworCisgICAgICAgICAgICBpZiAocHdkID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3ppcENyeXB0b19mb3JXcml0ZSA9IG51bGw7CisjaWYgQUVTQ1JZUFRPCisgICAgICAgICAgICAgICAgX2Flc0NyeXB0b19mb3JXcml0ZSA9IG51bGw7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRyYWNlV3JpdGVMaW5lKCJXcml0ZVNlY3VyaXR5TWV0YWRhdGE6IGUoezB9KSBjcnlwdG8oezF9KSBwdyh7Mn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lLCBFbmNyeXB0aW9uLlRvU3RyaW5nKCksIHB3ZCk7CisKKyAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElmIFBLWmlwICh3ZWFrKSBlbmNyeXB0aW9uIGlzIGluIHVzZSwgdGhlbiB0aGUgZW5jcnlwdGVkIGVudHJ5IGRhdGEKKyAgICAgICAgICAgICAgICAvLyBpcyBwcmVjZWRlZCBieSAxMi1ieXRlICJlbmNyeXB0aW9uIGhlYWRlciIgZm9yIHRoZSBlbnRyeS4KKworICAgICAgICAgICAgICAgIF96aXBDcnlwdG9fZm9yV3JpdGUgPSBaaXBDcnlwdG8uRm9yV3JpdGUocHdkKTsKKworICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSByYW5kb20gMTItYnl0ZSBoZWFkZXI6CisgICAgICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBTeXN0ZW0uUmFuZG9tKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGVuY3J5cHRpb25IZWFkZXIgPSBuZXcgYnl0ZVsxMl07CisgICAgICAgICAgICAgICAgcm5kLk5leHRCeXRlcyhlbmNyeXB0aW9uSGVhZGVyKTsKKworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDgyNzEKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX0JpdEZpZWxkICYgMHgwMDA4KSA9PSAweDAwMDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGJpdCAzIG9mIHRoZSBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgaXMgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiBhICdkYXRhIGRlc2NyaXB0b3InIChzaWduYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gMHgwODA3NGI1MCksIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlY3J5cHRlZCBoZWFkZXIgaXMgc29tZXRpbWVzCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmVkIHdpdGggdGhlIGhpZ2gtb3JkZXIgYnl0ZSBvZiB0aGUgbGFzdG1vZGlmaWVkIHRpbWUsCisgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHRoZSBoaWdoLW9yZGVyIGJ5dGUgb2YgdGhlIENSQywgdG8gdmVyaWZ5IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXNzd29yZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgZG9jdW1lbnRlZCBpbiB0aGUgUEtXYXJlIEFwcG5vdGUudHh0LgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdhcyBkaXNjb3ZlcmVkIHRoaXMgYnkgYW5hbHlzaXMgb2YgdGhlIENyeXB0LmMgc291cmNlIGZpbGUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIEluZm9aaXAgbGlicmFyeQorICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC8KKworICAgICAgICAgICAgICAgICAgICAvLyBBbHNvLCB3aW56aXAgaW5zaXN0cyBvbiB0aGlzIQorICAgICAgICAgICAgICAgICAgICBfVGltZUJsb2IgPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLkRhdGVUaW1lVG9QYWNrZWQoTGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbkhlYWRlclsxMV0gPSAoYnl0ZSkoKHRoaXMuX1RpbWVCbG9iID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYml0IDMgaXMgbm90IHNldCwgdGhlIENSQyB2YWx1ZSBpcyByZXF1aXJlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5jcnlwdGlvbiBvZiB0aGUgZmlsZSBkYXRhIGJlZ2lucy4gSW4gdGhpcyBjYXNlIHRoZXJlIGlzIG5vIHdheQorICAgICAgICAgICAgICAgICAgICAvLyBhcm91bmQgaXQ6IG11c3QgcmVhZCB0aGUgc3RyZWFtIGluIGl0cyBlbnRpcmV0eSB0byBjb21wdXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWwgQ1JDIGJlZm9yZSBwcm9jZWVkaW5nLgorICAgICAgICAgICAgICAgICAgICBGaWd1cmVDcmMzMigpOworICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uSGVhZGVyWzExXSA9IChieXRlKSgodGhpcy5fQ3JjMzIgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgcmFuZG9tIGhlYWRlciwgSU5DTFVESU5HIHRoZSBmaW5hbCBieXRlIHdoaWNoIGlzIGVpdGhlcgorICAgICAgICAgICAgICAgIC8vIHRoZSBoaWdoLW9yZGVyIGJ5dGUgb2YgdGhlIENSQzMyLCBvciB0aGUgaGlnaC1vcmRlciBieXRlIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIF9UaW1lQmxvYi4gIE11c3QgZG8gdGhpcyBCRUZPUkUgZW5jcnlwdGluZyB0aGUgZmlsZSBkYXRhLiAgVGhpcworICAgICAgICAgICAgICAgIC8vIHN0ZXAgY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIGNpcGhlciwgb3IgaW4gdGhlIHdvcmRzIG9mIHRoZSBQS1pJUAorICAgICAgICAgICAgICAgIC8vIHNwZWMsIGl0ICJmdXJ0aGVyIGluaXRpYWxpemVzIiB0aGUgY2lwaGVyIGtleXMuCisKKyAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyVGV4dCA9IF96aXBDcnlwdG9fZm9yV3JpdGUuRW5jcnlwdE1lc3NhZ2UoZW5jcnlwdGlvbkhlYWRlciwgZW5jcnlwdGlvbkhlYWRlci5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGNpcGhlcmVkIGJvbmFmaWRlIGVuY3J5cHRpb24gaGVhZGVyLgorICAgICAgICAgICAgICAgIG91dHN0cmVhbS5Xcml0ZShjaXBoZXJUZXh0LCAwLCBjaXBoZXJUZXh0Lkxlbmd0aCk7CisgICAgICAgICAgICAgICAgX0xlbmd0aE9mSGVhZGVyICs9IGNpcGhlclRleHQuTGVuZ3RoOyAgLy8gMTIgYnl0ZXMKKyAgICAgICAgICAgIH0KKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgZWxzZSBpZiAoRW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCB8fAorICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWYgV2luWmlwIEFFUyBlbmNyeXB0aW9uIGlzIGluIHVzZSwgdGhlbiB0aGUgZW5jcnlwdGVkIGVudHJ5IGRhdGEgaXMKKyAgICAgICAgICAgICAgICAvLyBwcmVjZWRlZCBieSBhIHZhcmlhYmxlLXNpemVkIFNhbHQgYW5kIGEgMi1ieXRlICJwYXNzd29yZAorICAgICAgICAgICAgICAgIC8vIHZlcmlmaWNhdGlvbiIgdmFsdWUgZm9yIHRoZSBlbnRyeS4KKworICAgICAgICAgICAgICAgIGludCBrZXlzdHJlbmd0aCA9IEdldEtleVN0cmVuZ3RoSW5CaXRzKEVuY3J5cHRpb24pOworICAgICAgICAgICAgICAgIF9hZXNDcnlwdG9fZm9yV3JpdGUgPSBXaW5aaXBBZXNDcnlwdG8uR2VuZXJhdGUocHdkLCBrZXlzdHJlbmd0aCk7CisgICAgICAgICAgICAgICAgb3V0c3RyZWFtLldyaXRlKF9hZXNDcnlwdG9fZm9yV3JpdGUuU2FsdCwgMCwgX2Flc0NyeXB0b19mb3JXcml0ZS5fU2FsdC5MZW5ndGgpOworICAgICAgICAgICAgICAgIG91dHN0cmVhbS5Xcml0ZShfYWVzQ3J5cHRvX2ZvcldyaXRlLkdlbmVyYXRlZFBWLCAwLCBfYWVzQ3J5cHRvX2ZvcldyaXRlLkdlbmVyYXRlZFBWLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgX0xlbmd0aE9mSGVhZGVyICs9IF9hZXNDcnlwdG9fZm9yV3JpdGUuX1NhbHQuTGVuZ3RoICsgX2Flc0NyeXB0b19mb3JXcml0ZS5HZW5lcmF0ZWRQVi5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICBUcmFjZVdyaXRlTGluZSgiV3JpdGVTZWN1cml0eU1ldGFkYXRhOiBBRVMgZSh7MH0pIGtleWJpdHMoezF9KSBfTE9IKHsyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lLCBrZXlzdHJlbmd0aCwgX0xlbmd0aE9mSGVhZGVyKTsKKworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHZvaWQgQ29weVRocm91Z2hPbmVFbnRyeShTdHJlYW0gb3V0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBKdXN0IHJlYWQgdGhlIGVudHJ5IGZyb20gdGhlIGV4aXN0aW5nIGlucHV0IHppcGZpbGUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQuCisgICAgICAgICAgICAvLyBCdXQsIGlmIG1ldGFkYXRhIGhhcyBjaGFuZ2VkIChsaWtlIGZpbGUgdGltZXMgb3IgYXR0cmlidXRlcyksIG9yIGlmIHRoZSBaSVA2NAorICAgICAgICAgICAgLy8gb3B0aW9uIGhhcyBjaGFuZ2VkLCB3ZSBjYW4gcmUtc3RyZWFtIHRoZSBlbnRyeSBkYXRhIGJ1dCBtdXN0IHJlY29tcHV0ZSB0aGUKKyAgICAgICAgICAgIC8vIG1ldGFkYXRhLgorICAgICAgICAgICAgaWYgKHRoaXMuTGVuZ3RoT2ZIZWFkZXIgPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkU3RhdGVFeGNlcHRpb24oIkJhZCBoZWFkZXIgbGVuZ3RoLiIpOworCisgICAgICAgICAgICAvLyBpcyBpdCBuZWNlc3NhcnkgdG8gcmUtY29uc3RpdHV0ZSBuZXcgbWV0YWRhdGEgZm9yIHRoaXMgZW50cnk/CisgICAgICAgICAgICBib29sIG5lZWRSZWNvbXB1dGUgPSBfbWV0YWRhdGFDaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgKHRoaXMuQXJjaGl2ZVN0cmVhbSBpcyBaaXBTZWdtZW50ZWRTdHJlYW0pIHx8CisgICAgICAgICAgICAgICAgKG91dFN0cmVhbSBpcyBaaXBTZWdtZW50ZWRTdHJlYW0pIHx8CisgICAgICAgICAgICAgICAgKF9JbnB1dFVzZXNaaXA2NCAmJiBfY29udGFpbmVyLlVzZVppcDY0V2hlblNhdmluZyA9PSBaaXA2NE9wdGlvbi5OZXZlcikgfHwKKyAgICAgICAgICAgICAgICAoIV9JbnB1dFVzZXNaaXA2NCAmJiBfY29udGFpbmVyLlVzZVppcDY0V2hlblNhdmluZyA9PSBaaXA2NE9wdGlvbi5BbHdheXMpOworCisgICAgICAgICAgICBpZiAobmVlZFJlY29tcHV0ZSkKKyAgICAgICAgICAgICAgICBDb3B5VGhyb3VnaFdpdGhSZWNvbXB1dGUob3V0U3RyZWFtKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBDb3B5VGhyb3VnaFdpdGhOb0NoYW5nZShvdXRTdHJlYW0pOworCisgICAgICAgICAgICAvLyB6aXA2NCBob3VzZWtlZXBpbmcKKyAgICAgICAgICAgIF9lbnRyeVJlcXVpcmVzWmlwNjQgPSBuZXcgTnVsbGFibGU8Ym9vbD4KKyAgICAgICAgICAgICAgICAoX0NvbXByZXNzZWRTaXplID49IDB4RkZGRkZGRkYgfHwgX1VuY29tcHJlc3NlZFNpemUgPj0gMHhGRkZGRkZGRiB8fAorICAgICAgICAgICAgICAgIF9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPj0gMHhGRkZGRkZGRgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIF9PdXRwdXRVc2VzWmlwNjQgPSBuZXcgTnVsbGFibGU8Ym9vbD4oX2NvbnRhaW5lci5aaXA2NCA9PSBaaXA2NE9wdGlvbi5BbHdheXMgfHwgX2VudHJ5UmVxdWlyZXNaaXA2NC5WYWx1ZSk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlUaHJvdWdoV2l0aFJlY29tcHV0ZShTdHJlYW0gb3V0c3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW0J1ZmZlclNpemVdOworICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IENvdW50aW5nU3RyZWFtKHRoaXMuQXJjaGl2ZVN0cmVhbSk7CisKKyAgICAgICAgICAgIGxvbmcgb3JpZ1JlbGF0aXZlT2Zmc2V0T2ZIZWFkZXIgPSBfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyOworCisgICAgICAgICAgICAvLyBUaGUgaGVhZGVyIGxlbmd0aCBtYXkgY2hhbmdlIGR1ZSB0byByZW5hbWUgb2YgZmlsZSwgYWRkIGEgY29tbWVudCwgZXRjLgorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZXRhaW4gdGhlIG9yaWdpbmFsLgorICAgICAgICAgICAgaW50IG9yaWdMZW5ndGhPZkhlYWRlciA9IExlbmd0aE9mSGVhZGVyOyAvLyBpbmNsdWRpbmcgY3J5cHRvIGJ5dGVzIQorCisgICAgICAgICAgICAvLyBXcml0ZUhlYWRlcigpIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY2hhbmdpbmcgX1JlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlcgorICAgICAgICAgICAgLy8gYW5kIHNldHRpbmcgX0xlbmd0aE9mSGVhZGVyLiAgV2hpbGUgUmVhZEhlYWRlcigpIHJlYWRzIHRoZSBjcnlwdG8gaGVhZGVyIGlmCisgICAgICAgICAgICAvLyBwcmVzZW50LCBXcml0ZUhlYWRlcigpIGRvZXMgbm90IHdyaXRlIHRoZSBjcnlwdG8gaGVhZGVyLgorICAgICAgICAgICAgV3JpdGVIZWFkZXIob3V0c3RyZWFtLCAwKTsKKyAgICAgICAgICAgIFN0b3JlUmVsYXRpdmVPZmZzZXQoKTsKKworICAgICAgICAgICAgaWYgKCF0aGlzLkZpbGVOYW1lLkVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTm90IGEgZGlyZWN0b3J5OyB0aGVyZSBpcyBmaWxlIGRhdGEuCisgICAgICAgICAgICAgICAgLy8gU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlbnRyeSBkYXRhIGluIHRoZSBpbnB1dCBzdHJlYW0uCisKKyAgICAgICAgICAgICAgICBsb25nIHBvcyA9IG9yaWdSZWxhdGl2ZU9mZnNldE9mSGVhZGVyICsgb3JpZ0xlbmd0aE9mSGVhZGVyOworICAgICAgICAgICAgICAgIGludCBsZW4gPSBHZXRMZW5ndGhPZkNyeXB0b0hlYWRlckJ5dGVzKF9FbmNyeXB0aW9uX0Zyb21aaXBGaWxlKTsKKyAgICAgICAgICAgICAgICBwb3MgLT0gbGVuOyAvLyB3YW50IHRvIGtlZXAgdGhlIGNyeXB0byBoZWFkZXIKKyAgICAgICAgICAgICAgICBfTGVuZ3RoT2ZIZWFkZXIgKz0gbGVuOworCisgICAgICAgICAgICAgICAgaW5wdXQuU2Vlayhwb3MsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgLy8gY29weSB0aHJvdWdoIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGhlYWRlciB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgICAgIGxvbmcgcmVtYWluaW5nID0gdGhpcy5fQ29tcHJlc3NlZFNpemU7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IChyZW1haW5pbmcgPiBieXRlcy5MZW5ndGgpID8gYnl0ZXMuTGVuZ3RoIDogKGludClyZW1haW5pbmc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZAorICAgICAgICAgICAgICAgICAgICBuID0gaW5wdXQuUmVhZChieXRlcywgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgLy9fQ2hlY2tSZWFkKG4pOworCisgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlCisgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS5Xcml0ZShieXRlcywgMCwgbik7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSBuOworICAgICAgICAgICAgICAgICAgICBPbldyaXRlQmxvY2soaW5wdXQuQnl0ZXNSZWFkLCB0aGlzLl9Db21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfaW9PcGVyYXRpb25DYW5jZWxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGJpdCAzIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX0JpdEZpZWxkICYgMHgwMDA4KSA9PSAweDAwMDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDE2OworICAgICAgICAgICAgICAgICAgICBpZiAoX0lucHV0VXNlc1ppcDY0KSBzaXplICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBEZXNjcmlwdG9yID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICAgICAgICAgIGlucHV0LlJlYWQoRGVzY3JpcHRvciwgMCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9JbnB1dFVzZXNaaXA2NCAmJiBfY29udGFpbmVyLlVzZVppcDY0V2hlblNhdmluZyA9PSBaaXA2NE9wdGlvbi5OZXZlcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgZGVzY3JpcHRvciB3YXMgMjQgYnl0ZXMsIG5vdyB3ZSBuZWVkIDE2LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBjaGVjayBmb3IgdW5kZXJmbG93IGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduYXR1cmUgKyBDUkMuCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uV3JpdGUoRGVzY3JpcHRvciwgMCwgOCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXByZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfQ29tcHJlc3NlZFNpemUgPiAweEZGRkZGRkZGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJaSVA2NCBpcyByZXF1aXJlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLldyaXRlKERlc2NyaXB0b3IsIDgsIDQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbkNvbXByZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfVW5jb21wcmVzc2VkU2l6ZSA+IDB4RkZGRkZGRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlpJUDY0IGlzIHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uV3JpdGUoRGVzY3JpcHRvciwgMTYsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgX0xlbmd0aE9mVHJhaWxlciAtPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFfSW5wdXRVc2VzWmlwNjQgJiYgX2NvbnRhaW5lci5Vc2VaaXA2NFdoZW5TYXZpbmcgPT0gWmlwNjRPcHRpb24uQWx3YXlzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBkZXNjcmlwdG9yIHdhcyAxNiBieXRlcywgbm93IHdlIG5lZWQgMjQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZSArIENSQworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBhZCA9IG5ldyBieXRlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLldyaXRlKERlc2NyaXB0b3IsIDAsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHJlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLldyaXRlKERlc2NyaXB0b3IsIDgsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLldyaXRlKHBhZCwgMCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbkNvbXByZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS5Xcml0ZShEZXNjcmlwdG9yLCAxMiwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uV3JpdGUocGFkLCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9MZW5ndGhPZlRyYWlsZXIgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgZGVzY3JpcHRvciBvbiBpbnB1dCBhbmQgb3V0cHV0LiBDb3B5IGl0IHRocm91Z2guCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uV3JpdGUoRGVzY3JpcHRvciwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL19MZW5ndGhPZlRyYWlsZXIgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX1RvdGFsRW50cnlTaXplID0gX0xlbmd0aE9mSGVhZGVyICsgX0NvbXByZXNzZWRGaWxlRGF0YVNpemUgKyBfTGVuZ3RoT2ZUcmFpbGVyOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgQ29weVRocm91Z2hXaXRoTm9DaGFuZ2UoU3RyZWFtIG91dHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtCdWZmZXJTaXplXTsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb3VudGluZ1N0cmVhbSh0aGlzLkFyY2hpdmVTdHJlYW0pOworCisgICAgICAgICAgICAvLyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVudHJ5IGRhdGEgaW4gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgaW5wdXQuU2Vlayh0aGlzLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICBpZiAodGhpcy5fVG90YWxFbnRyeVNpemUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSd2ZSBuZXZlciBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgZW50cnkuCisgICAgICAgICAgICAgICAgLy8gU2V0IGl0IGhlcmUuCisgICAgICAgICAgICAgICAgdGhpcy5fVG90YWxFbnRyeVNpemUgPSB0aGlzLl9MZW5ndGhPZkhlYWRlciArIHRoaXMuX0NvbXByZXNzZWRGaWxlRGF0YVNpemUgKyBfTGVuZ3RoT2ZUcmFpbGVyOworCisgICAgICAgICAgICAgICAgLy8gVGhlIENvbXByZXNzZWRTaXplIGluY2x1ZGVzIGFsbCB0aGUgbGVhZGluZyBtZXRhZGF0YSBhc3NvY2lhdGVkCisgICAgICAgICAgICAgICAgLy8gdG8gZW5jcnlwdGlvbiwgaWYgYW55LCBhcyB3ZWxsIGFzIHRoZSBjb21wcmVzc2VkIGRhdGEsIG9yCisgICAgICAgICAgICAgICAgLy8gY29tcHJlc3NlZC10aGVuLWVuY3J5cHRlZCBkYXRhLCBhbmQgdGhlIHRyYWlsZXIgaW4gY2FzZSBvZiBBRVMuCisKKyAgICAgICAgICAgICAgICAvLyBUaGUgQ29tcHJlc3NlZEZpbGVEYXRhIHNpemUgaXMgdGhlIHNhbWUsIGxlc3MgdGhlIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAvLyBmcmFtaW5nIGRhdGEgKDEyIGJ5dGVzIGhlYWRlciBmb3IgUEtaaXA7IDEwLzE4IGJ5dGVzIGhlYWRlciBhbmQKKyAgICAgICAgICAgICAgICAvLyAxMCBieXRlIHRyYWlsZXIgZm9yIEFFUykuCisKKyAgICAgICAgICAgICAgICAvLyBUaGUgX0xlbmd0aE9mSGVhZGVyIGluY2x1ZGVzIGFsbCB0aGUgemlwIGVudHJ5IGhlYWRlciBwbHVzIHRoZQorICAgICAgICAgICAgICAgIC8vIGNyeXB0byBoZWFkZXIsIGlmIGFueS4gIFRoZSBfTGVuZ3RoT2ZUcmFpbGVyIGluY2x1ZGVzIHRoZQorICAgICAgICAgICAgICAgIC8vIDEwLWJ5dGUgTUFDIGZvciBBRVMsIHdoZXJlIGFwcHJvcHJpYXRlLCBhbmQgdGhlIGJpdC0zCisgICAgICAgICAgICAgICAgLy8gRGVzY3JpcHRvciwgd2hlcmUgYXBwbGljYWJsZS4KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA1NjE2CisgICAgICAgICAgICAvLyByZW1lbWJlciB0aGUgb2Zmc2V0LCB3aXRoaW4gdGhlIG91dHB1dCBzdHJlYW0sIG9mIHRoaXMgcGFydGljdWxhciBlbnRyeSBoZWFkZXIuCisgICAgICAgICAgICAvLyBUaGlzIG1heSBoYXZlIGNoYW5nZWQgaWYgYW55IG9mIHRoZSBvdGhlciBlbnRyaWVzIGNoYW5nZWQgKGVnLCBpZiBhIGRpZmZlcmVudAorICAgICAgICAgICAgLy8gZW50cnkgd2FzIHJlbW92ZWQgb3IgYWRkZWQuKQorICAgICAgICAgICAgdmFyIGNvdW50ZXIgPSBvdXRzdHJlYW0gYXMgQ291bnRpbmdTdHJlYW07CisgICAgICAgICAgICBfUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID0gKGNvdW50ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IGNvdW50ZXIuQ29tcHV0ZWRQb3NpdGlvbgorICAgICAgICAgICAgICAgIDogb3V0c3RyZWFtLlBvc2l0aW9uOyAgLy8gQnl0ZXNXcml0dGVuCisKKyAgICAgICAgICAgIC8vIGNvcHkgdGhyb3VnaCB0aGUgaGVhZGVyLCBmaWxlZGF0YSwgdHJhaWxlciwgZXZlcnl0aGluZy4uLgorICAgICAgICAgICAgbG9uZyByZW1haW5pbmcgPSB0aGlzLl9Ub3RhbEVudHJ5U2l6ZTsKKyAgICAgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSAocmVtYWluaW5nID4gYnl0ZXMuTGVuZ3RoKSA/IGJ5dGVzLkxlbmd0aCA6IChpbnQpcmVtYWluaW5nOworCisgICAgICAgICAgICAgICAgLy8gcmVhZAorICAgICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ5dGVzLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIC8vX0NoZWNrUmVhZChuKTsKKworICAgICAgICAgICAgICAgIC8vIHdyaXRlCisgICAgICAgICAgICAgICAgb3V0c3RyZWFtLldyaXRlKGJ5dGVzLCAwLCBuKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gbjsKKyAgICAgICAgICAgICAgICBPbldyaXRlQmxvY2soaW5wdXQuQnl0ZXNSZWFkLCB0aGlzLl9Ub3RhbEVudHJ5U2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKF9pb09wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworCisgICAgICAgIFtTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGUoIlRyYWNlIildCisgICAgICAgIHByaXZhdGUgdm9pZCBUcmFjZVdyaXRlTGluZShzdHJpbmcgZm9ybWF0LCBwYXJhbXMgb2JqZWN0W10gdmFyUGFyYW1zKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrIChfb3V0cHV0TG9jaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGlkID0gU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuQ3VycmVudFRocmVhZC5HZXRIYXNoQ29kZSgpOworI2lmICEgKE5FVENGIHx8IFNJTFZFUkxJR0hUKQorICAgICAgICAgICAgICAgIENvbnNvbGUuRm9yZWdyb3VuZENvbG9yID0gKENvbnNvbGVDb2xvcikodGlkICUgOCArIDgpOworI2VuZGlmCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiezA6MDAwfSBaaXBFbnRyeS5Xcml0ZSAiLCB0aWQpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZvcm1hdCwgdmFyUGFyYW1zKTsKKyNpZiAhIChORVRDRiB8fCBTSUxWRVJMSUdIVCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlc2V0Q29sb3IoKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgX291dHB1dExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnkuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBFbnRyeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdiNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnkuY3MKQEAgLTAsMCArMSwyOTY4IEBACisvLyBaaXBFbnRyeS5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgRGlubyBDaGllc2EuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKToKKy8vIFRpbWUtc3RhbXA6IDwyMDExLUF1Z3VzdC0wNiAxNzoyNTo1Mz4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBaaXBFbnRyeSBjbGFzcywgd2hpY2ggbW9kZWxzIHRoZSBlbnRyaWVzIHdpdGhpbiBhIHppcCBmaWxlLgorLy8KKy8vIENyZWF0ZWQ6IFR1ZSwgMjcgTWFyIDIwMDcgIDE1OjMwCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgSW50ZXJvcCA9IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBlbnRyeSBpbiBhIFppcEZpbGUuIFR5cGljYWxseSwgYXBwbGljYXRpb25zIGdldCBhIFppcEVudHJ5CisgICAgLy8vIGJ5IGVudW1lcmF0aW5nIHRoZSBlbnRyaWVzIHdpdGhpbiBhIFppcEZpbGUsIG9yIGJ5IGFkZGluZyBhbiBlbnRyeSB0byBhIFppcEZpbGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKworICAgIFtJbnRlcm9wLkd1aWRBdHRyaWJ1dGUoImViYzI1Y2Y2LTkxMjAtNDI4My1iOTcyLTBlNTUyMGQwMDAwNCIpXQorICAgIFtJbnRlcm9wLkNvbVZpc2libGUodHJ1ZSldCisjaWYgIU5FVENGCisgICAgW0ludGVyb3AuQ2xhc3NJbnRlcmZhY2UoSW50ZXJvcC5DbGFzc0ludGVyZmFjZVR5cGUuQXV0b0Rpc3BhdGNoKV0gIC8vIEF1dG9EdWFsCisjZW5kaWYKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFppcEVudHJ5CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBBcHBsaWNhdGlvbnMgc2hvdWxkIG5ldmVyIG5lZWQgdG8gY2FsbCB0aGlzIGRpcmVjdGx5LiAgSXQgaXMgZXhwb3NlZCB0bworICAgICAgICAvLy8gc3VwcG9ydCBDT00gQXV0b21hdGlvbiBlbnZpcm9ubWVudHMuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZCA9IChJbnQxNilDb21wcmVzc2lvbk1ldGhvZC5EZWZsYXRlOworICAgICAgICAgICAgX0NvbXByZXNzaW9uTGV2ZWwgPSBJb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdDsKKyAgICAgICAgICAgIF9FbmNyeXB0aW9uID0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lOworICAgICAgICAgICAgX1NvdXJjZSA9IFppcEVudHJ5U291cmNlLk5vbmU7CisgICAgICAgICAgICBBbHRlcm5hdGVFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJJQk00MzciKTsKKyAgICAgICAgICAgIEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPSBaaXBPcHRpb24uTmV2ZXI7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSB0aW1lIGFuZCBkYXRlIGF0IHdoaWNoIHRoZSBmaWxlIGluZGljYXRlZCBieSB0aGUgPGM+WmlwRW50cnk8L2M+IHdhcworICAgICAgICAvLy8gICBsYXN0IG1vZGlmaWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBEb3ROZXRaaXAgbGlicmFyeSBzZXRzIHRoZSBMYXN0TW9kaWZpZWQgdmFsdWUgZm9yIGFuIGVudHJ5LCBlcXVhbCB0bworICAgICAgICAvLy8gICB0aGUgTGFzdCBNb2RpZmllZCB0aW1lIG9mIHRoZSBmaWxlIGluIHRoZSBmaWxlc3lzdGVtLiAgSWYgYW4gZW50cnkgaXMKKyAgICAgICAgLy8vICAgYWRkZWQgZnJvbSBhIHN0cmVhbSwgdGhlIGxpYnJhcnkgdXNlcyA8Yz5TeXN0ZW0uRGF0ZVRpbWUuTm93PC9jPiBmb3IgdGhpcworICAgICAgICAvLy8gICB2YWx1ZSwgZm9yIHRoZSBnaXZlbiBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIGFuZCBwb3NzaWJseSBzZXQgdGhlCisgICAgICAgIC8vLyAgIExhc3RNb2RpZmllZCB2YWx1ZSBvbiBhbiBlbnRyeSwgdG8gYW4gYXJiaXRyYXJ5IHZhbHVlLiAgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTeXN0ZW0uRGF0ZVRpbWUiLz4gdmFsdWVzIHdpdGggYSA8c2VlIGNyZWY9IlN5c3RlbS5EYXRlVGltZUtpbmQiIC8+CisgICAgICAgIC8vLyAgIHNldHRpbmcgb2YgPGM+RGF0ZVRpbWVLaW5kLlVuc3BlY2lmaWVkPC9jPiBhcmUgdGFrZW4gdG8gYmUgZXhwcmVzc2VkIGFzCisgICAgICAgIC8vLyAgIDxjPkRhdGVUaW1lS2luZC5Mb2NhbDwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEJlIGF3YXJlIHRoYXQgYmVjYXVzZSBvZiB0aGUgd2F5IDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXYXJlJ3MKKyAgICAgICAgLy8vICAgWmlwIHNwZWNpZmljYXRpb248L3NlZT4gZGVzY3JpYmVzIGhvdyB0aW1lcyBhcmUgc3RvcmVkIGluIHRoZSB6aXAgZmlsZSwKKyAgICAgICAgLy8vICAgdGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSA8Yz5TeXN0ZW0uRGF0ZVRpbWU8L2M+IGRhdGF0eXBlIGlzIG5vdCBzdG9yZWQKKyAgICAgICAgLy8vICAgZm9yIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgd2hlbiBzYXZpbmcgemlwIGZpbGVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAgICAgLy8vICAgaG93IHRpbWVzIGFyZSBmb3JtYXR0ZWQsIHNlZSB0aGUgUEtaaXAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGFjdHVhbCBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgYSBmaWxlIGNhbiBiZSBzdG9yZWQgaW4gbXVsdGlwbGUgd2F5cyBpbgorICAgICAgICAvLy8gICB0aGUgemlwIGZpbGUsIGFuZCB0aGV5IGFyZSBub3QgbXV0dWFsbHkgZXhjbHVzaXZlOgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxsaXN0IHR5cGU9ImJ1bGxldCI+CisgICAgICAgIC8vLyAgIDxpdGVtPgorICAgICAgICAvLy8gICAgIEluIHRoZSBzby1jYWxsZWQgIkRPUyIgZm9ybWF0LCB3aGljaCBoYXMgYSAyLXNlY29uZCBwcmVjaXNpb24uIFZhbHVlcworICAgICAgICAvLy8gICAgIGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGV2ZW4gc2Vjb25kLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRpbWUgb24gdGhlCisgICAgICAgIC8vLyAgICAgZmlsZSBpcyAxMjozNDo0MywgdGhlbiBpdCB3aWxsIGJlIHN0b3JlZCBhcyAxMjozNDo0NC4gVGhpcyBmaXJzdCB2YWx1ZQorICAgICAgICAvLy8gICAgIGlzIGFjY2Vzc2libGUgdmlhIHRoZSA8Yz5MYXN0TW9kaWZpZWQ8L2M+IHByb3BlcnR5LiBUaGlzIHZhbHVlIGlzIGFsd2F5cworICAgICAgICAvLy8gICAgIHByZXNlbnQgaW4gdGhlIG1ldGFkYXRhIGZvciBlYWNoIHppcCBlbnRyeS4gIEluIHNvbWUgY2FzZXMgdGhlIHZhbHVlIGlzCisgICAgICAgIC8vLyAgICAgaW52YWxpZCwgb3IgemVyby4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPGl0ZW0+CisgICAgICAgIC8vLyAgICAgSW4gdGhlIHNvLWNhbGxlZCAiV2luZG93cyIgb3IgIk5URlMiIGZvcm1hdCwgYXMgYW4gOC1ieXRlIGludGVnZXIKKyAgICAgICAgLy8vICAgICBxdWFudGl0eSBleHByZXNzZWQgYXMgdGhlIG51bWJlciBvZiAxLzEwIG1pbGxpc2Vjb25kcyAoaW4gb3RoZXIgd29yZHMKKyAgICAgICAgLy8vICAgICB0aGUgbnVtYmVyIG9mIDEwMCBuYW5vc2Vjb25kIHVuaXRzKSBzaW5jZSBKYW51YXJ5IDEsIDE2MDEgKFVUQykuICBUaGlzCisgICAgICAgIC8vLyAgICAgZm9ybWF0IGlzIGhvdyBXaW5kb3dzIHJlcHJlc2VudHMgZmlsZSB0aW1lcy4gIFRoaXMgdGltZSBpcyBhY2Nlc3NpYmxlCisgICAgICAgIC8vLyAgICAgdmlhIHRoZSA8Yz5Nb2RpZmllZFRpbWU8L2M+IHByb3BlcnR5LgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICBJbiB0aGUgIlVuaXgiIGZvcm1hdCwgYSA0LWJ5dGUgcXVhbnRpdHkgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UKKyAgICAgICAgLy8vICAgICBKYW51YXJ5IDEsIDE5NzAgVVRDLgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICBJbiBhbiBvbGRlciBmb3JtYXQsIG5vdyBkZXByZWNhdGVkIGJ1dCBzdGlsbCB1c2VkIGJ5IHNvbWUgY3VycmVudAorICAgICAgICAvLy8gICAgIHRvb2xzLiBUaGlzIGZvcm1hdCBpcyBhbHNvIGEgNC1ieXRlIHF1YW50aXR5IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZgorICAgICAgICAvLy8gICAgIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIFVUQy4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgWmlwIHRvb2xzIGFuZCBsaWJyYXJpZXMgd2lsbCBhbHdheXMgYXQgbGVhc3QgaGFuZGxlIChyZWFkIG9yIHdyaXRlKSB0aGUKKyAgICAgICAgLy8vICAgRE9TIHRpbWUsIGFuZCBtYXkgYWxzbyBoYW5kbGUgdGhlIG90aGVyIHRpbWUgZm9ybWF0cy4gIEtlZXAgaW4gbWluZCB0aGF0CisgICAgICAgIC8vLyAgIHdoaWxlIHRoZSBuYW1lcyByZWZlciB0byBwYXJ0aWN1bGFyIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVyZSBpcyBub3RoaW5nIGluCisgICAgICAgIC8vLyAgIHRoZSB0aW1lIGZvcm1hdHMgdGhlbXNlbHZlcyB0aGF0IHByZXZlbnRzIHRoZWlyIHVzZSBvbiBvdGhlciBvcGVyYXRpbmcKKyAgICAgICAgLy8vICAgc3lzdGVtcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIFpJUCBmaWxlcywgdGhlIERvdE5ldFppcCBsaWJyYXJ5IHJlYWRzIHRoZSBXaW5kb3dzLWZvcm1hdHRlZAorICAgICAgICAvLy8gICB0aW1lLCBpZiBpdCBpcyBzdG9yZWQgaW4gdGhlIGVudHJ5LCBhbmQgc2V0cyBib3RoIDxjPkxhc3RNb2RpZmllZDwvYz4gYW5kCisgICAgICAgIC8vLyAgIDxjPk1vZGlmaWVkVGltZTwvYz4gdG8gdGhhdCB2YWx1ZS4gV2hlbiB3cml0aW5nIFpJUCBmaWxlcywgdGhlIERvdE5ldFppcAorICAgICAgICAvLy8gICBsaWJyYXJ5IGJ5IGRlZmF1bHQgd2lsbCB3cml0ZSBib3RoIHRpbWUgcXVhbnRpdGllcy4gSXQgY2FuIGFsc28gZW1pdCB0aGUKKyAgICAgICAgLy8vICAgVW5peC1mb3JtYXR0ZWQgdGltZSBpZiBkZXNpcmVkIChTZWUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJFbWl0VGltZXNJblVuaXhGb3JtYXRXaGVuU2F2aW5nIi8+LikKKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgZmlsZSBjcmVhdGVkIHVwb24gYSBjYWxsIHRvCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5LkV4dHJhY3QoKTwvYz4gbWF5IGJlIGFkanVzdGVkIGR1cmluZyBleHRyYWN0aW9uIHRvIGNvbXBlbnNhdGUKKyAgICAgICAgLy8vICAgZm9yIGRpZmZlcmVuY2VzIGluIGhvdyB0aGUgLk5FVCBCYXNlIENsYXNzIExpYnJhcnkgZGVhbHMgd2l0aCBkYXlsaWdodAorICAgICAgICAvLy8gICBzYXZpbmcgdGltZSAoRFNUKSB2ZXJzdXMgaG93IHRoZSBXaW5kb3dzIGZpbGVzeXN0ZW0gZGVhbHMgd2l0aCBkYXlsaWdodAorICAgICAgICAvLy8gICBzYXZpbmcgdGltZS4gIFJheW1vbmQgQ2hlbiA8c2VlCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDMvMTAvMjQvNTU0MTMuYXNweCI+cHJvdmlkZXMKKyAgICAgICAgLy8vICAgc29tZSBnb29kIGNvbnRleHQ8L3NlZT4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluIGEgbnV0c2hlbGw6IERheWxpZ2h0IHNhdmluZ3MgdGltZSBydWxlcyBjaGFuZ2UgcmVndWxhcmx5LiAgSW4gMjAwNywgZm9yCisgICAgICAgIC8vLyAgIGV4YW1wbGUsIHRoZSBpbmNlcHRpb24gd2VlayBvZiBEU1QgY2hhbmdlZC4gIEluIDE5NzcsIERTVCB3YXMgaW4gcGxhY2UgYWxsCisgICAgICAgIC8vLyAgIHllYXIgcm91bmQuIEluIDE5NDUsIGxpa2V3aXNlLiAgQW5kIHNvIG9uLiAgV2luMzIgZG9lcyBub3QgYXR0ZW1wdCB0bworICAgICAgICAvLy8gICBndWVzcyB3aGljaCB0aW1lIHpvbmUgcnVsZXMgd2VyZSBpbiBlZmZlY3QgYXQgdGhlIHRpbWUgaW4gcXVlc3Rpb24uICBJdAorICAgICAgICAvLy8gICB3aWxsIHJlbmRlciBhIHRpbWUgYXMgInN0YW5kYXJkIHRpbWUiIGFuZCBhbGxvdyB0aGUgYXBwIHRvIGNoYW5nZSB0byBEU1QKKyAgICAgICAgLy8vICAgYXMgbmVjZXNzYXJ5LiAgLk5FVCBtYWtlcyBhIGRpZmZlcmVudCBjaG9pY2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIENvbXBhcmUgdGhlIG91dHB1dCBvZiBGaWxlSW5mby5MYXN0V3JpdGVUaW1lLlRvU3RyaW5nKCJmIikgd2l0aCB3aGF0IHlvdQorICAgICAgICAvLy8gICBzZWUgaW4gdGhlIFdpbmRvd3MgRXhwbG9yZXIgcHJvcGVydHkgc2hlZXQgZm9yIGEgZmlsZSB0aGF0IHdhcyBsYXN0CisgICAgICAgIC8vLyAgIHdyaXR0ZW4gdG8gb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIERTVCB0cmFuc2l0aW9uLiBGb3IgZXhhbXBsZSwgc3VwcG9zZQorICAgICAgICAvLy8gICB0aGUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCBvbiBPY3RvYmVyIDE3LCAyMDAzLCBkdXJpbmcgRFNUIGJ1dCBEU1QgaXMgbm90CisgICAgICAgIC8vLyAgIGN1cnJlbnRseSBpbiBlZmZlY3QuIEV4cGxvcmVyJ3MgZmlsZSBwcm9wZXJ0aWVzIHJlcG9ydHMgVGh1cnNkYXksIE9jdG9iZXIKKyAgICAgICAgLy8vICAgMTcsIDIwMDMsIDg6NDU6MzggQU0sIGJ1dCAuTkVUcyBGaWxlSW5mbyByZXBvcnRzIFRodXJzZGF5LCBPY3RvYmVyIDE3LAorICAgICAgICAvLy8gICAyMDAzLCA5OjQ1IEFNLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaW4zMiBzYXlzLCAiVGh1cnNkYXksIE9jdG9iZXIgMTcsIDIwMDIgODo0NTozOCBBTSBQU1QiLiBOb3RlOiBQYWNpZmljCisgICAgICAgIC8vLyAgIFNUQU5EQVJEIFRpbWUuIEV2ZW4gdGhvdWdoIE9jdG9iZXIgMTcgb2YgdGhhdCB5ZWFyIG9jY3VycmVkIGR1cmluZyBQYWNpZmljCisgICAgICAgIC8vLyAgIERheWxpZ2h0IFRpbWUsIFdpbjMyIGRpc3BsYXlzIHRoZSB0aW1lIGFzIHN0YW5kYXJkIHRpbWUgYmVjYXVzZSB0aGF0J3MKKyAgICAgICAgLy8vICAgd2hhdCB0aW1lIGl0IGlzIE5PVy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgLk5FVCBCQ0wgYXNzdW1lcyB0aGF0IHRoZSBjdXJyZW50IERTVCBydWxlcyB3ZXJlIGluIHBsYWNlIGF0IHRoZSB0aW1lIGluCisgICAgICAgIC8vLyAgIHF1ZXN0aW9uLiAgU28sIC5ORVQgc2F5cywgIldlbGwsIGlmIHRoZSBydWxlcyBpbiBlZmZlY3Qgbm93IHdlcmUgYWxzbyBpbgorICAgICAgICAvLy8gICBlZmZlY3Qgb24gT2N0b2JlciAxNywgMjAwMywgdGhlbiB0aGF0IHdvdWxkIGJlIGRheWxpZ2h0IHRpbWUiIHNvIGl0CisgICAgICAgIC8vLyAgIGRpc3BsYXlzICJUaHVyc2RheSwgT2N0b2JlciAxNywgMjAwMywgOTo0NSBBTSBQRFQiIC0gZGF5bGlnaHQgdGltZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU28gLk5FVCBnaXZlcyBhIHZhbHVlIHdoaWNoIGlzIG1vcmUgaW50dWl0aXZlbHkgY29ycmVjdCwgYnV0IGlzIGFsc28KKyAgICAgICAgLy8vICAgcG90ZW50aWFsbHkgaW5jb3JyZWN0LCBhbmQgd2hpY2ggaXMgbm90IGludmVydGlibGUuIFdpbjMyIGdpdmVzIGEgdmFsdWUKKyAgICAgICAgLy8vICAgd2hpY2ggaXMgaW50dWl0aXZlbHkgaW5jb3JyZWN0LCBidXQgaXMgc3RyaWN0bHkgY29ycmVjdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQmVjYXVzZSBvZiB0aGlzIGZ1bmtpbmVzcywgdGhpcyBsaWJyYXJ5IGFkZHMgb25lIGhvdXIgdG8gdGhlIExhc3RNb2RpZmllZAorICAgICAgICAvLy8gICB0aW1lIG9uIHRoZSBleHRyYWN0ZWQgZmlsZSwgaWYgbmVjZXNzYXJ5LiAgVGhhdCBpcyB0byBzYXksIGlmIHRoZSB0aW1lIGluCisgICAgICAgIC8vLyAgIHF1ZXN0aW9uIGhhZCBvY2N1cnJlZCBpbiB3aGF0IHRoZSAuTkVUIEJhc2UgQ2xhc3MgTGlicmFyeSBhc3N1bWVkIHRvIGJlCisgICAgICAgIC8vLyAgIERTVC4gVGhpcyBhc3N1bXB0aW9uIG1heSBiZSB3cm9uZyBnaXZlbiB0aGUgY29uc3RhbnRseSBjaGFuZ2luZyBEU1QgcnVsZXMsCisgICAgICAgIC8vLyAgIGJ1dCBpdCBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIERhdGVUaW1lIExhc3RNb2RpZmllZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0xhc3RNb2RpZmllZC5Ub0xvY2FsVGltZSgpOyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfTGFzdE1vZGlmaWVkID0gKHZhbHVlLktpbmQgPT0gRGF0ZVRpbWVLaW5kLlVuc3BlY2lmaWVkKQorICAgICAgICAgICAgICAgICAgICA/IERhdGVUaW1lLlNwZWNpZnlLaW5kKHZhbHVlLCBEYXRlVGltZUtpbmQuTG9jYWwpCisgICAgICAgICAgICAgICAgICAgIDogdmFsdWUuVG9Mb2NhbFRpbWUoKTsKKyAgICAgICAgICAgICAgICBfTXRpbWUgPSBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLkFkanVzdFRpbWVfUmV2ZXJzZShfTGFzdE1vZGlmaWVkKS5Ub1VuaXZlcnNhbFRpbWUoKTsKKyAgICAgICAgICAgICAgICBfbWV0YWRhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBpbnQgQnVmZmVyU2l6ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyLkJ1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMYXN0IE1vZGlmaWVkIHRpbWUgZm9yIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgImxhc3QgbW9kaWZpZWQiIHRpbWUgaW4gdGhlIE5URlMgZmlsZSB0aW1lcworICAgICAgICAvLy8gICBhcyBkZXNjcmliZWQgaW4gPHNlZQorICAgICAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj50aGUgWmlwCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb248L3NlZT4uICBXaGVuIGdldHRpbmcgdGhpcyBwcm9wZXJ0eSwgdGhlIHZhbHVlIG1heSBiZQorICAgICAgICAvLy8gICBkaWZmZXJlbnQgZnJvbSA8c2VlIGNyZWY9Ikxhc3RNb2RpZmllZCIgLz4uICBXaGVuIHNldHRpbmcgdGhlIHByb3BlcnR5LAorICAgICAgICAvLy8gICB0aGUgPHNlZSBjcmVmPSJMYXN0TW9kaWZpZWQiLz4gcHJvcGVydHkgYWxzbyBnZXRzIHNldCwgYnV0IHdpdGggYSBsb3dlcgorICAgICAgICAvLy8gICBwcmVjaXNpb24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIExldCBtZSBleHBsYWluLiBJdCdzIGdvaW5nIHRvIHRha2UgYSB3aGlsZSwgc28gZ2V0CisgICAgICAgIC8vLyAgIGNvbWZvcnRhYmxlLiBPcmlnaW5hbGx5LCB3YWFhYWF5IGJhY2sgaW4gMTk4OSB3aGVuIHRoZSBaSVAgc3BlY2lmaWNhdGlvbgorICAgICAgICAvLy8gICB3YXMgb3JpZ2luYWxseSBkZXNjcmliZWQgYnkgdGhlIGVzdGVlbWVkIE1yLiBQaGlsIEthdHosIHRoZSBkb21pbmFudAorICAgICAgICAvLy8gICBvcGVyYXRpbmcgc3lzdGVtIG9mIHRoZSB0aW1lIHdhcyBNUy1ET1MuIE1TRE9TIHN0b3JlZCBmaWxlIHRpbWVzIHdpdGggYQorICAgICAgICAvLy8gICAyLXNlY29uZCBwcmVjaXNpb24sIGJlY2F1c2UsIGMnbW9uLCA8ZW0+d2hvIGlzIGV2ZXIgZ29pbmcgdG8gbmVlZCBiZXR0ZXIKKyAgICAgICAgLy8vICAgcmVzb2x1dGlvbiB0aGFuIFRIQVQ/PC9lbT4gQW5kIHNvIFpJUCBmaWxlcywgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gb24KKyAgICAgICAgLy8vICAgd2hpY2ggdGhlIHppcCBmaWxlIHdhcyBjcmVhdGVkLCBzdG9yZSBmaWxlIHRpbWVzIGluIGV4YWN0bHkgPHNlZQorICAgICAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnZzZnQuY29tL2hhbC9kb3N0aW1lLmh0bSI+dGhlIHNhbWUgZm9ybWF0IHRoYXQgRE9TIHVzZWQKKyAgICAgICAgLy8vICAgaW4gMTk4OTwvc2VlPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2luY2UgdGhlbiwgdGhlIFpJUCBzcGVjIGhhcyBldm9sdmVkLCBidXQgdGhlIGludGVybmFsIGZvcm1hdCBmb3IgZmlsZQorICAgICAgICAvLy8gICB0aW1lc3RhbXBzIHJlbWFpbnMgdGhlIHNhbWUuICBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIHdheSB0aW1lcyBhcmUKKyAgICAgICAgLy8vICAgc3RvcmVkIGluIGEgemlwIGZpbGUgaXMgcm9vdGVkIGluIERPUyBoZXJpdGFnZSwgYW55IHByb2dyYW0gb24gYW55CisgICAgICAgIC8vLyAgIG9wZXJhdGluZyBzeXN0ZW0gY2FuIGZvcm1hdCBhIHRpbWUgaW4gdGhpcyB3YXksIGFuZCBtb3N0IHppcCB0b29scyBhbmQKKyAgICAgICAgLy8vICAgbGlicmFyaWVzIERPIC0gdGhleSByb3VuZCBmaWxlIHRpbWVzIHRvIHRoZSBuZWFyZXN0IGV2ZW4gc2Vjb25kIGFuZCBzdG9yZQorICAgICAgICAvLy8gICBpdCBqdXN0IGxpa2UgRE9TIGRpZCAyNSsgeWVhcnMgYWdvLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBQS1dhcmUgZXh0ZW5kZWQgdGhlIFpJUCBzcGVjaWZpY2F0aW9uIHRvIGFsbG93IGEgemlwIGZpbGUgdG8gc3RvcmUgd2hhdAorICAgICAgICAvLy8gICBhcmUgY2FsbGVkICJOVEZTIFRpbWVzIiBhbmQgIlVuaXgodG0pIHRpbWVzIiBmb3IgYSBmaWxlLiAgVGhlc2UgYXJlIHRoZQorICAgICAgICAvLy8gICA8ZW0+bGFzdCB3cml0ZTwvZW0+LCA8ZW0+bGFzdCBhY2Nlc3M8L2VtPiwgYW5kIDxlbT5maWxlIGNyZWF0aW9uPC9lbT4KKyAgICAgICAgLy8vICAgdGltZXMgb2YgYSBwYXJ0aWN1bGFyIGZpbGUuIFRoZXNlIG1ldGFkYXRhIGFyZSBub3QgYWN0dWFsbHkgc3BlY2lmaWMKKyAgICAgICAgLy8vICAgdG8gTlRGUyBvciBVbml4LiBUaGV5IGFyZSB0cmFja2VkIGZvciBlYWNoIGZpbGUgYnkgTlRGUyBhbmQgYnkgdmFyaW91cworICAgICAgICAvLy8gICBVbml4IGZpbGVzeXN0ZW1zLCBidXQgdGhleSBhcmUgYWxzbyB0cmFja2VkIGJ5IG90aGVyIGZpbGVzeXN0ZW1zLCB0b28uCisgICAgICAgIC8vLyAgIFRoZSBrZXkgcG9pbnQgaXMgdGhhdCB0aGUgdGltZXMgYXJlIDxlbT5mb3JtYXR0ZWQgaW4gdGhlIHppcCBmaWxlPC9lbT4KKyAgICAgICAgLy8vICAgaW4gdGhlIHNhbWUgd2F5IHRoYXQgTlRGUyBmb3JtYXRzIHRoZSB0aW1lICh0aWNrcyBzaW5jZSB3aW4zMiBlcG9jaCksCisgICAgICAgIC8vLyAgIG9yIGluIHRoZSBzYW1lIHdheSB0aGF0IFVuaXggZm9ybWF0cyB0aGUgdGltZSAoc2Vjb25kcyBzaW5jZSBVbml4CisgICAgICAgIC8vLyAgIGVwb2NoKS4gQXMgd2l0aCB0aGUgRE9TIHRpbWUsIGFueSB0b29sIG9yIGxpYnJhcnkgcnVubmluZyBvbiBhbnkKKyAgICAgICAgLy8vICAgb3BlcmF0aW5nIHN5c3RlbSBpcyBjYXBhYmxlIG9mIGZvcm1hdHRpbmcgYSB0aW1lIGluIG9uZSBvZiB0aGVzZSB3YXlzCisgICAgICAgIC8vLyAgIGFuZCBlbWJlZGRpbmcgaXQgaW50byB0aGUgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZXNlIGV4dGVuZGVkIHRpbWVzIGFyZSBoaWdoZXIgcHJlY2lzaW9uIHF1YW50aXRpZXMgdGhhbiB0aGUgRE9TIHRpbWUuCisgICAgICAgIC8vLyAgIEFzIGRlc2NyaWJlZCBhYm92ZSwgdGhlIChET1MpIExhc3RNb2RpZmllZCBoYXMgYSBwcmVjaXNpb24gb2YgMiBzZWNvbmRzLgorICAgICAgICAvLy8gICBUaGUgVW5peCB0aW1lIGlzIHN0b3JlZCB3aXRoIGEgcHJlY2lzaW9uIG9mIDEgc2Vjb25kLiBUaGUgTlRGUyB0aW1lIGlzCisgICAgICAgIC8vLyAgIHN0b3JlZCB3aXRoIGEgcHJlY2lzaW9uIG9mIDAuMDAwMDAwMSBzZWNvbmRzLiBUaGUgcXVhbnRpdGllcyBhcmUgZWFzaWx5CisgICAgICAgIC8vLyAgIGNvbnZlcnRpYmxlLCBleGNlcHQgZm9yIHRoZSBsb3NzIG9mIHByZWNpc2lvbiB5b3UgbWF5IGluY3VyLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBIHppcCBhcmNoaXZlIGNhbiBzdG9yZSB0aGUge0MsQSxNfSB0aW1lcyBpbiBOVEZTIGZvcm1hdCwgaW4gVW5peCBmb3JtYXQsCisgICAgICAgIC8vLyAgIG9yIG5vdCBhdCBhbGwuICBPZnRlbiBhIHRvb2wgcnVubmluZyBvbiBVbml4IG9yIE1hYyB3aWxsIGVtYmVkIHRoZSB0aW1lcworICAgICAgICAvLy8gICBpbiBVbml4IGZvcm1hdCAoMSBzZWNvbmQgcHJlY2lzaW9uKSwgd2hpbGUgV2luWmlwIHJ1bm5pbmcgb24gV2luZG93cyBtaWdodAorICAgICAgICAvLy8gICBlbWJlZCB0aGUgdGltZXMgaW4gTlRGUyBmb3JtYXQgKHByZWNpc2lvbiBvZiBvZiAwLjAwMDAwMDEgc2Vjb25kcykuICBXaGVuCisgICAgICAgIC8vLyAgIHJlYWRpbmcgYSB6aXAgZmlsZSB3aXRoIHRoZXNlICJleHRlbmRlZCIgdGltZXMsIGluIGVpdGhlciBmb3JtYXQsCisgICAgICAgIC8vLyAgIERvdE5ldFppcCByZXByZXNlbnRzIHRoZSB2YWx1ZXMgd2l0aCB0aGUKKyAgICAgICAgLy8vICAgPGM+TW9kaWZpZWRUaW1lPC9jPiwgPGM+QWNjZXNzZWRUaW1lPC9jPiBhbmQgPGM+Q3JlYXRpb25UaW1lPC9jPgorICAgICAgICAvLy8gICBwcm9wZXJ0aWVzIG9uIHRoZSA8Yz5aaXBFbnRyeTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoaWxlIGFueSB6aXAgYXBwbGljYXRpb24gb3IgbGlicmFyeSwgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaXQKKyAgICAgICAgLy8vICAgcnVucyBvbiwgY291bGQgdXNlIGFueSBvZiB0aGUgdGltZSBmb3JtYXRzIGFsbG93ZWQgYnkgdGhlIFpJUAorICAgICAgICAvLy8gICBzcGVjaWZpY2F0aW9uLCBub3QgYWxsIHppcCB0b29scyBvciBsaWJyYXJpZXMgZG8gc3VwcG9ydCBhbGwgdGhlc2UKKyAgICAgICAgLy8vICAgZm9ybWF0cy4gIFN0b3JpbmcgdGhlIGhpZ2hlci1wcmVjaXNpb24gdGltZXMgZm9yIGVhY2ggZW50cnkgaXMKKyAgICAgICAgLy8vICAgb3B0aW9uYWwgZm9yIHppcCBmaWxlcywgYW5kIG1hbnkgdG9vbHMgYW5kIGxpYnJhcmllcyBkb24ndCB1c2UgdGhlCisgICAgICAgIC8vLyAgIGhpZ2hlciBwcmVjaXNpb24gcXVhbnRpdGllcyBhdCBhbGwuIFRoZSBvbGQgRE9TIHRpbWUsIHJlcHJlc2VudGVkIGJ5CisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iTGFzdE1vZGlmaWVkIi8+LCBpcyBndWFyYW50ZWVkIHRvIGJlIHByZXNlbnQsIHRob3VnaCBpdAorICAgICAgICAvLy8gICBzb21ldGltZXMgdW5zZXQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIE9rLCBnZXR0aW5nIGJhY2sgdG8gdGhlIHF1ZXN0aW9uIGFib3V0IGhvdyB0aGUgPGM+TGFzdE1vZGlmaWVkPC9jPgorICAgICAgICAvLy8gICBwcm9wZXJ0eSByZWxhdGVzIHRvIHRoaXMgPGM+TW9kaWZpZWRUaW1lPC9jPgorICAgICAgICAvLy8gICBwcm9wZXJ0eS4uLiA8Yz5MYXN0TW9kaWZpZWQ8L2M+IGlzIGFsd2F5cyBzZXQsIHdoaWxlCisgICAgICAgIC8vLyAgIDxjPk1vZGlmaWVkVGltZTwvYz4gaXMgbm90LiAoVGhlIG90aGVyIHRpbWVzIHN0b3JlZCBpbiB0aGUgPGVtPk5URlMKKyAgICAgICAgLy8vICAgdGltZXMgZXh0ZW5zaW9uPC9lbT4sIDxjPkNyZWF0aW9uVGltZTwvYz4gYW5kIDxjPkFjY2Vzc2VkVGltZTwvYz4gYWxzbworICAgICAgICAvLy8gICBtYXkgbm90IGJlIHNldCBvbiBhbiBlbnRyeSB0aGF0IGlzIHJlYWQgZnJvbSBhbiBleGlzdGluZyB6aXAgZmlsZS4pCisgICAgICAgIC8vLyAgIFdoZW4gcmVhZGluZyBhIHppcCBmaWxlLCB0aGVuIDxjPkxhc3RNb2RpZmllZDwvYz4gdGFrZXMgdGhlIERPUyB0aW1lCisgICAgICAgIC8vLyAgIHRoYXQgaXMgc3RvcmVkIHdpdGggdGhlIGZpbGUuIElmIHRoZSBET1MgdGltZSBoYXMgYmVlbiBzdG9yZWQgYXMgemVybworICAgICAgICAvLy8gICBpbiB0aGUgemlwZmlsZSwgdGhlbiB0aGlzIGxpYnJhcnkgd2lsbCB1c2UgPGM+RGF0ZVRpbWUuTm93PC9jPiBmb3IgdGhlCisgICAgICAgIC8vLyAgIDxjPkxhc3RNb2RpZmllZDwvYz4gdmFsdWUuICBJZiB0aGUgWklQIGZpbGUgd2FzIGNyZWF0ZWQgYnkgYW4gZXZvbHZlZAorICAgICAgICAvLy8gICB0b29sLCB0aGVuIHRoZXJlIHdpbGwgYWxzbyBiZSBoaWdoZXIgcHJlY2lzaW9uIE5URlMgb3IgVW5peCB0aW1lcyBpbgorICAgICAgICAvLy8gICB0aGUgemlwIGZpbGUuICBJbiB0aGF0IGNhc2UsIHRoaXMgbGlicmFyeSB3aWxsIHJlYWQgdGhvc2UgdGltZXMsIGFuZAorICAgICAgICAvLy8gICBzZXQgPGM+TGFzdE1vZGlmaWVkPC9jPiBhbmQgPGM+TW9kaWZpZWRUaW1lPC9jPiB0byB0aGUgc2FtZSB2YWx1ZSwgdGhlCisgICAgICAgIC8vLyAgIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IHdyaXRlIHRpbWUgb2YgdGhlIGZpbGUuICBJZiB0aGVyZSBhcmUgbm8KKyAgICAgICAgLy8vICAgaGlnaGVyIHByZWNpc2lvbiB0aW1lcyBzdG9yZWQgZm9yIHRoZSBlbnRyeSwgdGhlbiA8Yz5Nb2RpZmllZFRpbWU8L2M+CisgICAgICAgIC8vLyAgIHJlbWFpbnMgdW5zZXQgKGxpa2V3aXNlIDxjPkFjY2Vzc2VkVGltZTwvYz4gYW5kIDxjPkNyZWF0aW9uVGltZTwvYz4pLAorICAgICAgICAvLy8gICBhbmQgPGM+TGFzdE1vZGlmaWVkPC9jPiBrZWVwcyBpdHMgRE9TIHRpbWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gY3JlYXRpbmcgemlwIGZpbGVzIHdpdGggdGhpcyBsaWJyYXJ5LCBieSBkZWZhdWx0IHRoZSBleHRlbmRlZCB0aW1lCisgICAgICAgIC8vLyAgIHByb3BlcnRpZXMgKDxjPk1vZGlmaWVkVGltZTwvYz4sIDxjPkFjY2Vzc2VkVGltZTwvYz4sIGFuZAorICAgICAgICAvLy8gICA8Yz5DcmVhdGlvblRpbWU8L2M+KSBhcmUgc2V0IG9uIHRoZSBaaXBFbnRyeSBpbnN0YW5jZSwgYW5kIHRoZXNlIGRhdGEgYXJlCisgICAgICAgIC8vLyAgIHN0b3JlZCBpbiB0aGUgemlwIGFyY2hpdmUgZm9yIGVhY2ggZW50cnksIGluIE5URlMgZm9ybWF0LiBJZiB5b3UgYWRkIGFuCisgICAgICAgIC8vLyAgIGVudHJ5IGZyb20gYW4gYWN0dWFsIGZpbGVzeXN0ZW0gZmlsZSwgdGhlbiB0aGUgZW50cnkgZ2V0cyB0aGUgYWN0dWFsIGZpbGUKKyAgICAgICAgLy8vICAgdGltZXMgZm9yIHRoYXQgZmlsZSwgdG8gTlRGUy1sZXZlbCBwcmVjaXNpb24uICBJZiB5b3UgYWRkIGFuIGVudHJ5IGZyb20gYQorICAgICAgICAvLy8gICBzdHJlYW0sIG9yIGEgc3RyaW5nLCB0aGVuIHRoZSB0aW1lcyBnZXQgdGhlIHZhbHVlIDxjPkRhdGVUaW1lLk5vdzwvYz4uICBJbgorICAgICAgICAvLy8gICB0aGlzIGNhc2UgPGM+TGFzdE1vZGlmaWVkPC9jPiBhbmQgPGM+TW9kaWZpZWRUaW1lPC9jPiB3aWxsIGJlIGlkZW50aWNhbCwKKyAgICAgICAgLy8vICAgdG8gMiBzZWNvbmRzIG9mIHByZWNpc2lvbi4gIFlvdSBjYW4gZXhwbGljaXRseSBzZXQgdGhlCisgICAgICAgIC8vLyAgIDxjPkNyZWF0aW9uVGltZTwvYz4sIDxjPkFjY2Vzc2VkVGltZTwvYz4sIGFuZCA8Yz5Nb2RpZmllZFRpbWU8L2M+IG9mIGFuCisgICAgICAgIC8vLyAgIGVudHJ5IHVzaW5nIHRoZSBwcm9wZXJ0eSBzZXR0ZXJzLiAgSWYgeW91IHdhbnQgdG8gc2V0IGFsbCBvZiB0aG9zZQorICAgICAgICAvLy8gICBxdWFudGl0aWVzLCBpdCdzIG1vcmUgZWZmaWNpZW50IHRvIHVzZSB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTZXRFbnRyeVRpbWVzKERhdGVUaW1lLCBEYXRlVGltZSwgRGF0ZVRpbWUpIi8+IG1ldGhvZC4gIFRob3NlCisgICAgICAgIC8vLyAgIGNoYW5nZXMgYXJlIG5vdCBtYWRlIHBlcm1hbmVudCBpbiB0aGUgemlwIGZpbGUgdW50aWwgeW91IGNhbGwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBGaWxlLlNhdmUoKSIvPiBvciBvbmUgb2YgaXRzIGNvdXNpbnMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gY3JlYXRpbmcgYSB6aXAgZmlsZSwgeW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZgorICAgICAgICAvLy8gICB0aGlzIGxpYnJhcnkgZm9yIGZvcm1hdHRpbmcgdGltZXMgaW4gdGhlIHppcCBmaWxlLCBkaXNhYmxpbmcgdGhlCisgICAgICAgIC8vLyAgIGVtYmVkZGluZyBvZiBmaWxlIHRpbWVzIGluIE5URlMgZm9ybWF0IG9yIGVuYWJsaW5nIHRoZSBzdG9yYWdlIG9mIGZpbGUKKyAgICAgICAgLy8vICAgdGltZXMgaW4gVW5peCBmb3JtYXQsIG9yIGJvdGguICBZb3UgbWF5IHdhbnQgdG8gZG8gdGhpcywgZm9yIGV4YW1wbGUsCisgICAgICAgIC8vLyAgIHdoZW4gY3JlYXRpbmcgYSB6aXAgZmlsZSBvbiBXaW5kb3dzLCB0aGF0IHdpbGwgYmUgY29uc3VtZWQgb24gYSBNYWMsCisgICAgICAgIC8vLyAgIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgbm90IGhpcCB0byB0aGUgIk5URlMgdGltZXMiIGZvcm1hdC4gVG8gZG8KKyAgICAgICAgLy8vICAgdGhpcywgdXNlIHRoZSA8c2VlIGNyZWY9IkVtaXRUaW1lc0luV2luZG93c0Zvcm1hdFdoZW5TYXZpbmciLz4gYW5kCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyIvPiBwcm9wZXJ0aWVzLiAgQSB2YWxpZCB6aXAKKyAgICAgICAgLy8vICAgZmlsZSBtYXkgc3RvcmUgdGhlIGZpbGUgdGltZXMgaW4gYm90aCBmb3JtYXRzLiAgQnV0LCB0aGVyZSBhcmUgbm8KKyAgICAgICAgLy8vICAgZ3VhcmFudGVlcyB0aGF0IGEgcHJvZ3JhbSBydW5uaW5nIG9uIE1hYyBvciBMaW51eCB3aWxsIGdyYWNlZnVsbHkKKyAgICAgICAgLy8vICAgaGFuZGxlIHRoZSBOVEZTLWZvcm1hdHRlZCB0aW1lcyB3aGVuIFVuaXggdGltZXMgYXJlIHByZXNlbnQsIG9yIHRoYXQgYQorICAgICAgICAvLy8gICBub24tRG90TmV0WmlwLXBvd2VyZWQgYXBwbGljYXRpb24gcnVubmluZyBvbiBXaW5kb3dzIHdpbGwgYmUgYWJsZSB0bworICAgICAgICAvLy8gICBoYW5kbGUgZmlsZSB0aW1lcyBpbiBVbml4IGZvcm1hdC4gRG90TmV0WmlwIHdpbGwgYWx3YXlzIGRvIHNvbWV0aGluZworICAgICAgICAvLy8gICByZWFzb25hYmxlOyBvdGhlciBsaWJyYXJpZXMgb3IgdG9vbHMgbWF5IG5vdC4gV2hlbiBpbiBkb3VidCwgdGVzdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSSdsbCBiZXQgeW91IGRpZG4ndCB0aGluayBvbmUgcGVyc29uIGNvdWxkIHR5cGUgc28gbXVjaCBhYm91dCB0aW1lLCBlaD8KKyAgICAgICAgLy8vICAgQW5kIHJlYWRpbmcgaXQgd2FzIHNvIGVuam95YWJsZSwgdG9vISAgV2VsbCwgaW4gYXBwcmVjaWF0aW9uLCA8c2VlCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly9jaGVlc28ubWVtYmVycy53aW5pc3AubmV0L0RvdE5ldFppcERvbmF0ZS5hc3B4Ij5tYXliZSB5b3UKKyAgICAgICAgLy8vICAgc2hvdWxkIGRvbmF0ZTwvc2VlPj8KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJBY2Nlc3NlZFRpbWUiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkNyZWF0aW9uVGltZSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEVudHJ5Lkxhc3RNb2RpZmllZCIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iU2V0RW50cnlUaW1lcyIvPgorICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgTW9kaWZpZWRUaW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfTXRpbWU7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldEVudHJ5VGltZXMoX0N0aW1lLCBfQXRpbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExhc3QgQWNjZXNzIHRpbWUgZm9yIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhpcyB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZSBtZWFuaW5nZnVsLiAgSWYgdGhlIDxjPlppcEVudHJ5PC9jPiB3YXMgcmVhZCBmcm9tIGFuIGV4aXN0aW5nCisgICAgICAgIC8vLyBaaXAgYXJjaGl2ZSwgdGhpcyBpbmZvcm1hdGlvbiBtYXkgbm90IGJlIGF2YWlsYWJsZS4gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSwgc2VlCisgICAgICAgIC8vLyA8c2VlIGNyZWY9Ik1vZGlmaWVkVGltZSIvPi4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9Ik1vZGlmaWVkVGltZSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQ3JlYXRpb25UaW1lIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJTZXRFbnRyeVRpbWVzIi8+CisgICAgICAgIHB1YmxpYyBEYXRlVGltZSBBY2Nlc3NlZFRpbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9BdGltZTsgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0RW50cnlUaW1lcyhfQ3RpbWUsIHZhbHVlLCBfTXRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZpbGUgY3JlYXRpb24gdGltZSBmb3IgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhpcyB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZSBtZWFuaW5nZnVsLiAgSWYgdGhlIDxjPlppcEVudHJ5PC9jPiB3YXMgcmVhZAorICAgICAgICAvLy8gZnJvbSBhbiBleGlzdGluZyB6aXAgYXJjaGl2ZSwgYW5kIHRoZSBjcmVhdGlvbiB0aW1lIHdhcyBub3Qgc2V0IG9uIHRoZSBlbnRyeQorICAgICAgICAvLy8gd2hlbiB0aGUgemlwIGZpbGUgd2FzIGNyZWF0ZWQsIHRoZW4gdGhpcyBwcm9wZXJ0eSBtYXkgYmUgbWVhbmluZ2xlc3MuIEZvciBhbgorICAgICAgICAvLy8gZXhwbGFuYXRpb24gb2Ygd2h5LCBzZWUgPHNlZSBjcmVmPSJNb2RpZmllZFRpbWUiLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJNb2RpZmllZFRpbWUiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkFjY2Vzc2VkVGltZSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iU2V0RW50cnlUaW1lcyIvPgorICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgQ3JlYXRpb25UaW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfQ3RpbWU7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldEVudHJ5VGltZXModmFsdWUsIF9BdGltZSwgX010aW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgU2V0cyB0aGUgTlRGUyBDcmVhdGlvbiwgQWNjZXNzLCBhbmQgTW9kaWZpZWQgdGltZXMgZm9yIHRoZSBnaXZlbiBlbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIGFkZGluZyBhbiBlbnRyeSBmcm9tIGEgZmlsZSBvciBkaXJlY3RvcnksIHRoZSBDcmVhdGlvbiwgQWNjZXNzLCBhbmQKKyAgICAgICAgLy8vICAgTW9kaWZpZWQgdGltZXMgZm9yIHRoZSBnaXZlbiBlbnRyeSBhcmUgYXV0b21hdGljYWxseSBzZXQgZnJvbSB0aGUKKyAgICAgICAgLy8vICAgZmlsZXN5c3RlbSB2YWx1ZXMuIFdoZW4gYWRkaW5nIGFuIGVudHJ5IGZyb20gYSBzdHJlYW0gb3Igc3RyaW5nLCB0aGUKKyAgICAgICAgLy8vICAgdmFsdWVzIGFyZSBpbXBsaWNpdGx5IHNldCB0byBEYXRlVGltZS5Ob3cuICBUaGUgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8KKyAgICAgICAgLy8vICAgc2V0IHRoZXNlIHZhbHVlcyB0byBzb21lIGFyYml0cmFyeSB2YWx1ZSwgYmVmb3JlIHNhdmluZyB0aGUgYXJjaGl2ZSwgYW5kCisgICAgICAgIC8vLyAgIGNhbiBkbyBzbyB1c2luZyB0aGUgdmFyaW91cyBzZXR0ZXJzLiAgSWYgeW91IHdhbnQgdG8gc2V0IGFsbCBvZiB0aGUgdGltZXMsCisgICAgICAgIC8vLyAgIHRoaXMgbWV0aG9kIGlzIG1vcmUgZWZmaWNpZW50LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgdmFsdWVzIHlvdSBzZXQgaGVyZSB3aWxsIGJlIHJldHJpZXZhYmxlIHdpdGggdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iTW9kaWZpZWRUaW1lIi8+LCA8c2VlIGNyZWY9IkNyZWF0aW9uVGltZSIvPiBhbmQgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBY2Nlc3NlZFRpbWUiLz4gcHJvcGVydGllcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGlmIGJvdGggPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJFbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIi8+IGFuZCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmciLz4gYXJlIGZhbHNlLCB0aGVuIHRoZQorICAgICAgICAvLy8gICA8Yz5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nPC9jPiBmbGFnIGlzIGF1dG9tYXRpY2FsbHkgc2V0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBEYXRlVGltZSB2YWx1ZXMgcHJvdmlkZWQgaGVyZSB3aXRob3V0IGEgRGF0ZVRpbWVLaW5kIGFyZSBhc3N1bWVkIHRvIGJlIExvY2FsIFRpbWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNyZWF0ZWQiPnRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBlbnRyeS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFjY2Vzc2VkIj50aGUgbGFzdCBhY2Nlc3MgdGltZSBvZiB0aGUgZW50cnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2RpZmllZCI+dGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgZW50cnkuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIiAvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyIgLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkFjY2Vzc2VkVGltZSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQ3JlYXRpb25UaW1lIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJNb2RpZmllZFRpbWUiLz4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0RW50cnlUaW1lcyhEYXRlVGltZSBjcmVhdGVkLCBEYXRlVGltZSBhY2Nlc3NlZCwgRGF0ZVRpbWUgbW9kaWZpZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9udGZzVGltZXNBcmVTZXQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGNyZWF0ZWQgPT0gX3plcm9Ib3VyICYmIGNyZWF0ZWQuS2luZCA9PSBfemVyb0hvdXIuS2luZCkgY3JlYXRlZCA9IF93aW4zMkVwb2NoOworICAgICAgICAgICAgaWYgKGFjY2Vzc2VkID09IF96ZXJvSG91ciAmJiBhY2Nlc3NlZC5LaW5kID09IF96ZXJvSG91ci5LaW5kKSBhY2Nlc3NlZCA9IF93aW4zMkVwb2NoOworICAgICAgICAgICAgaWYgKG1vZGlmaWVkID09IF96ZXJvSG91ciAmJiBtb2RpZmllZC5LaW5kID09IF96ZXJvSG91ci5LaW5kKSBtb2RpZmllZCA9IF93aW4zMkVwb2NoOworICAgICAgICAgICAgX0N0aW1lID0gY3JlYXRlZC5Ub1VuaXZlcnNhbFRpbWUoKTsKKyAgICAgICAgICAgIF9BdGltZSA9IGFjY2Vzc2VkLlRvVW5pdmVyc2FsVGltZSgpOworICAgICAgICAgICAgX010aW1lID0gbW9kaWZpZWQuVG9Vbml2ZXJzYWxUaW1lKCk7CisgICAgICAgICAgICBfTGFzdE1vZGlmaWVkID0gX010aW1lOworICAgICAgICAgICAgaWYgKCFfZW1pdFVuaXhUaW1lcyAmJiAhX2VtaXROdGZzVGltZXMpCisgICAgICAgICAgICAgICAgX2VtaXROdGZzVGltZXMgPSB0cnVlOworICAgICAgICAgICAgX21ldGFkYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTcGVjaWZpZXMgd2hldGhlciB0aGUgQ3JlYXRpb24sIEFjY2VzcywgYW5kIE1vZGlmaWVkIHRpbWVzIGZvciB0aGUgZ2l2ZW4KKyAgICAgICAgLy8vICAgZW50cnkgd2lsbCBiZSBlbWl0dGVkIGluICJXaW5kb3dzIGZvcm1hdCIgd2hlbiB0aGUgemlwIGFyY2hpdmUgaXMgc2F2ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQW4gYXBwbGljYXRpb24gY3JlYXRpbmcgYSB6aXAgYXJjaGl2ZSBjYW4gdXNlIHRoaXMgZmxhZyB0byBleHBsaWNpdGx5CisgICAgICAgIC8vLyAgIHNwZWNpZnkgdGhhdCB0aGUgZmlsZSB0aW1lcyBmb3IgdGhlIGVudHJ5IHNob3VsZCBvciBzaG91bGQgbm90IGJlIHN0b3JlZAorICAgICAgICAvLy8gICBpbiB0aGUgemlwIGFyY2hpdmUgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IFdpbmRvd3MuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAgIC8vLyAgIHRoaXMgcHJvcGVydHkgaXMgPGM+dHJ1ZTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gYWRkaW5nIGFuIGVudHJ5IGZyb20gYSBmaWxlIG9yIGRpcmVjdG9yeSwgdGhlIENyZWF0aW9uICg8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkNyZWF0aW9uVGltZSIvPiksIEFjY2VzcyAoPHNlZSBjcmVmPSJBY2Nlc3NlZFRpbWUiLz4pLCBhbmQgTW9kaWZpZWQKKyAgICAgICAgLy8vICAgKDxzZWUgY3JlZj0iTW9kaWZpZWRUaW1lIi8+KSB0aW1lcyBmb3IgdGhlIGdpdmVuIGVudHJ5IGFyZSBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vLyAgIHNldCBmcm9tIHRoZSBmaWxlc3lzdGVtIHZhbHVlcy4gV2hlbiBhZGRpbmcgYW4gZW50cnkgZnJvbSBhIHN0cmVhbSBvcgorICAgICAgICAvLy8gICBzdHJpbmcsIGFsbCB0aHJlZSB2YWx1ZXMgYXJlIGltcGxpY2l0bHkgc2V0IHRvIERhdGVUaW1lLk5vdy4gIEFwcGxpY2F0aW9ucworICAgICAgICAvLy8gICBjYW4gYWxzbyBleHBsaWNpdGx5IHNldCB0aG9zZSB0aW1lcyBieSBjYWxsaW5nIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU2V0RW50cnlUaW1lcyhEYXRlVGltZSwgRGF0ZVRpbWUsIERhdGVUaW1lKSIgLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXQVJFJ3MKKyAgICAgICAgLy8vICAgemlwIHNwZWNpZmljYXRpb248L3NlZT4gZGVzY3JpYmVzIG11bHRpcGxlIHdheXMgdG8gZm9ybWF0IHRoZXNlIHRpbWVzIGluIGEKKyAgICAgICAgLy8vICAgemlwIGZpbGUuIE9uZSBpcyB0aGUgZm9ybWF0IFdpbmRvd3MgYXBwbGljYXRpb25zIG5vcm1hbGx5IHVzZTogMTAwbnMgdGlja3MKKyAgICAgICAgLy8vICAgc2luY2UgSmFuIDEsIDE2MDEgVVRDLiAgVGhlIG90aGVyIGlzIGEgZm9ybWF0IFVuaXggYXBwbGljYXRpb25zIHR5cGljYWxseQorICAgICAgICAvLy8gICB1c2U6IHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIFVUQy4gIEVhY2ggZm9ybWF0IGNhbiBiZSBzdG9yZWQgaW4gYW4KKyAgICAgICAgLy8vICAgImV4dHJhIGZpZWxkIiBpbiB0aGUgemlwIGVudHJ5IHdoZW4gc2F2aW5nIHRoZSB6aXAgYXJjaGl2ZS4gVGhlIGZvcm1lcgorICAgICAgICAvLy8gICB1c2VzIGFuIGV4dHJhIGZpZWxkIHdpdGggYSBIZWFkZXIgSWQgb2YgMHgwMDBBLCB3aGlsZSB0aGUgbGF0dGVyIHVzZXMgYQorICAgICAgICAvLy8gICBoZWFkZXIgSUQgb2YgMHg1NDU1LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBOb3QgYWxsIHppcCB0b29scyBhbmQgbGlicmFyaWVzIGNhbiBpbnRlcnByZXQgdGhlc2UgZmllbGRzLiAgV2luZG93cworICAgICAgICAvLy8gICBjb21wcmVzc2VkIGZvbGRlcnMgaXMgb25lIHRoYXQgY2FuIHJlYWQgdGhlIFdpbmRvd3MgRm9ybWF0IHRpbWVzdGFtcHMsCisgICAgICAgIC8vLyAgIHdoaWxlIEkgYmVsaWV2ZSB0aGUgPHNlZSBocmVmPSJodHRwOi8vd3d3LmluZm8temlwLm9yZy8iPkluZm96aXA8L3NlZT4KKyAgICAgICAgLy8vICAgdG9vbHMgY2FuIHJlYWQgdGhlIFVuaXggZm9ybWF0IHRpbWVzdGFtcHMuIEFsdGhvdWdoIHRoZSB0aW1lIHZhbHVlcyBhcmUKKyAgICAgICAgLy8vICAgZWFzaWx5IGNvbnZlcnRpYmxlLCBzdWJqZWN0IHRvIGEgbG9zcyBvZiBwcmVjaXNpb24sIHNvbWUgdG9vbHMgYW5kCisgICAgICAgIC8vLyAgIGxpYnJhcmllcyBtYXkgYmUgYWJsZSB0byByZWFkIG9ubHkgb25lIG9yIHRoZSBvdGhlci4gRG90TmV0WmlwIGNhbiByZWFkIG9yCisgICAgICAgIC8vLyAgIHdyaXRlIHRpbWVzIGluIGVpdGhlciBvciBib3RoIGZvcm1hdHMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSB0aW1lcyBzdG9yZWQgYXJlIHRha2VuIGZyb20gPHNlZSBjcmVmPSJNb2RpZmllZFRpbWUiLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iQWNjZXNzZWRUaW1lIi8+LCBhbmQgPHNlZSBjcmVmPSJDcmVhdGlvblRpbWUiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgaXMgbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSBmcm9tIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5LkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmciLz4gcHJvcGVydHkuICBJdCBpcworICAgICAgICAvLy8gICBwb3NzaWJsZSB0aGF0IGEgemlwIGVudHJ5IGNhbiBlbWJlZCB0aGUgdGltZXN0YW1wcyBpbiBib3RoIGZvcm1zLCBvbmUKKyAgICAgICAgLy8vICAgZm9ybSwgb3IgbmVpdGhlci4gIEJ1dCwgdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgdGhhdCBhIHByb2dyYW0gcnVubmluZyBvbgorICAgICAgICAvLy8gICBNYWMgb3IgTGludXggd2lsbCBncmFjZWZ1bGx5IGhhbmRsZSBOVEZTIEZvcm1hdHRlZCB0aW1lcywgb3IgdGhhdCBhCisgICAgICAgIC8vLyAgIG5vbi1Eb3ROZXRaaXAtcG93ZXJlZCBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIFdpbmRvd3Mgd2lsbCBiZSBhYmxlIHRvCisgICAgICAgIC8vLyAgIGhhbmRsZSBmaWxlIHRpbWVzIGluIFVuaXggZm9ybWF0LiBXaGVuIGluIGRvdWJ0LCB0ZXN0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBOb3JtYWxseSB5b3Ugd2lsbCB1c2UgdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRmlsZS5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIj5aaXBGaWxlLkVtaXRUaW1lc0luV2luZG93c0Zvcm1hdFdoZW5TYXZpbmc8L3NlZT4KKyAgICAgICAgLy8vICAgcHJvcGVydHksIHRvIHNwZWNpZnkgdGhlIGJlaGF2aW9yIGZvciBhbGwgZW50cmllcyBpbiBhIHppcCwgcmF0aGVyIHRoYW4KKyAgICAgICAgLy8vICAgdGhlIHByb3BlcnR5IG9uIGVhY2ggaW5kaXZpZHVhbCBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iU2V0RW50cnlUaW1lcyhEYXRlVGltZSwgRGF0ZVRpbWUsIERhdGVUaW1lKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQ3JlYXRpb25UaW1lIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJBY2Nlc3NlZFRpbWUiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9Ik1vZGlmaWVkVGltZSIvPgorICAgICAgICBwdWJsaWMgYm9vbCBFbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZW1pdE50ZnNUaW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9lbWl0TnRmc1RpbWVzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX21ldGFkYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBDcmVhdGlvbiwgQWNjZXNzLCBhbmQgTW9kaWZpZWQgdGltZXMgZm9yIHRoZSBnaXZlbgorICAgICAgICAvLy8gICBlbnRyeSB3aWxsIGJlIGVtaXR0ZWQgaW4gJnF1b3Q7VW5peCh0bSkgZm9ybWF0JnF1b3Q7IHdoZW4gdGhlIHppcCBhcmNoaXZlIGlzIHNhdmVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFuIGFwcGxpY2F0aW9uIGNyZWF0aW5nIGEgemlwIGFyY2hpdmUgY2FuIHVzZSB0aGlzIGZsYWcgdG8gZXhwbGljaXRseQorICAgICAgICAvLy8gICBzcGVjaWZ5IHRoYXQgdGhlIGZpbGUgdGltZXMgZm9yIHRoZSBlbnRyeSBzaG91bGQgb3Igc2hvdWxkIG5vdCBiZSBzdG9yZWQKKyAgICAgICAgLy8vICAgaW4gdGhlIHppcCBhcmNoaXZlIGluIHRoZSBmb3JtYXQgdXNlZCBieSBVbml4LiBCeSBkZWZhdWx0IHRoaXMgZmxhZyBpcworICAgICAgICAvLy8gICA8Yz5mYWxzZTwvYz4sIG1lYW5pbmcgdGhlIFVuaXgtZm9ybWF0IHRpbWVzIGFyZSBub3Qgc3RvcmVkIGluIHRoZSB6aXAKKyAgICAgICAgLy8vICAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBhZGRpbmcgYW4gZW50cnkgZnJvbSBhIGZpbGUgb3IgZGlyZWN0b3J5LCB0aGUgQ3JlYXRpb24gKDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iQ3JlYXRpb25UaW1lIi8+KSwgQWNjZXNzICg8c2VlIGNyZWY9IkFjY2Vzc2VkVGltZSIvPiksIGFuZCBNb2RpZmllZAorICAgICAgICAvLy8gICAoPHNlZSBjcmVmPSJNb2RpZmllZFRpbWUiLz4pIHRpbWVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8vICAgc2V0IGZyb20gdGhlIGZpbGVzeXN0ZW0gdmFsdWVzLiBXaGVuIGFkZGluZyBhbiBlbnRyeSBmcm9tIGEgc3RyZWFtIG9yCisgICAgICAgIC8vLyAgIHN0cmluZywgYWxsIHRocmVlIHZhbHVlcyBhcmUgaW1wbGljaXRseSBzZXQgdG8gRGF0ZVRpbWUuTm93LiAgQXBwbGljYXRpb25zCisgICAgICAgIC8vLyAgIGNhbiBhbHNvIGV4cGxpY2l0bHkgc2V0IHRob3NlIHRpbWVzIGJ5IGNhbGxpbmcgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTZXRFbnRyeVRpbWVzKERhdGVUaW1lLCBEYXRlVGltZSwgRGF0ZVRpbWUpIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICA8c2VlCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPlBLV0FSRSdzCisgICAgICAgIC8vLyAgIHppcCBzcGVjaWZpY2F0aW9uPC9zZWU+IGRlc2NyaWJlcyBtdWx0aXBsZSB3YXlzIHRvIGZvcm1hdCB0aGVzZSB0aW1lcyBpbiBhCisgICAgICAgIC8vLyAgIHppcCBmaWxlLiBPbmUgaXMgdGhlIGZvcm1hdCBXaW5kb3dzIGFwcGxpY2F0aW9ucyBub3JtYWxseSB1c2U6IDEwMG5zIHRpY2tzCisgICAgICAgIC8vLyAgIHNpbmNlIEphbiAxLCAxNjAxIFVUQy4gIFRoZSBvdGhlciBpcyBhIGZvcm1hdCBVbml4IGFwcGxpY2F0aW9ucyB0eXBpY2FsbHkKKyAgICAgICAgLy8vICAgdXNlOiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwIFVUQy4gIEVhY2ggZm9ybWF0IGNhbiBiZSBzdG9yZWQgaW4gYW4KKyAgICAgICAgLy8vICAgImV4dHJhIGZpZWxkIiBpbiB0aGUgemlwIGVudHJ5IHdoZW4gc2F2aW5nIHRoZSB6aXAgYXJjaGl2ZS4gVGhlIGZvcm1lcgorICAgICAgICAvLy8gICB1c2VzIGFuIGV4dHJhIGZpZWxkIHdpdGggYSBIZWFkZXIgSWQgb2YgMHgwMDBBLCB3aGlsZSB0aGUgbGF0dGVyIHVzZXMgYQorICAgICAgICAvLy8gICBoZWFkZXIgSUQgb2YgMHg1NDU1LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBOb3QgYWxsIHRvb2xzIGFuZCBsaWJyYXJpZXMgY2FuIGludGVycHJldCB0aGVzZSBmaWVsZHMuICBXaW5kb3dzCisgICAgICAgIC8vLyAgIGNvbXByZXNzZWQgZm9sZGVycyBpcyBvbmUgdGhhdCBjYW4gcmVhZCB0aGUgV2luZG93cyBGb3JtYXQgdGltZXN0YW1wcywKKyAgICAgICAgLy8vICAgd2hpbGUgSSBiZWxpZXZlIHRoZSA8c2VlIGhyZWY9Imh0dHA6Ly93d3cuaW5mby16aXAub3JnLyI+SW5mb3ppcDwvc2VlPgorICAgICAgICAvLy8gICB0b29scyBjYW4gcmVhZCB0aGUgVW5peCBmb3JtYXQgdGltZXN0YW1wcy4gQWx0aG91Z2ggdGhlIHRpbWUgdmFsdWVzIGFyZQorICAgICAgICAvLy8gICBlYXNpbHkgY29udmVydGlibGUsIHN1YmplY3QgdG8gYSBsb3NzIG9mIHByZWNpc2lvbiwgc29tZSB0b29scyBhbmQKKyAgICAgICAgLy8vICAgbGlicmFyaWVzIG1heSBiZSBhYmxlIHRvIHJlYWQgb25seSBvbmUgb3IgdGhlIG90aGVyLiBEb3ROZXRaaXAgY2FuIHJlYWQgb3IKKyAgICAgICAgLy8vICAgd3JpdGUgdGltZXMgaW4gZWl0aGVyIG9yIGJvdGggZm9ybWF0cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHRpbWVzIHN0b3JlZCBhcmUgdGFrZW4gZnJvbSA8c2VlIGNyZWY9Ik1vZGlmaWVkVGltZSIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBY2Nlc3NlZFRpbWUiLz4sIGFuZCA8c2VlIGNyZWY9IkNyZWF0aW9uVGltZSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBpcyBub3QgbXV0dWFsbHkgZXhjbHVzaXZlIGZyb20gdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuRW1pdFRpbWVzSW5XaW5kb3dzRm9ybWF0V2hlblNhdmluZyIvPiBwcm9wZXJ0eS4gIEl0IGlzCisgICAgICAgIC8vLyAgIHBvc3NpYmxlIHRoYXQgYSB6aXAgZW50cnkgY2FuIGVtYmVkIHRoZSB0aW1lc3RhbXBzIGluIGJvdGggZm9ybXMsIG9uZQorICAgICAgICAvLy8gICBmb3JtLCBvciBuZWl0aGVyLiAgQnV0LCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyB0aGF0IGEgcHJvZ3JhbSBydW5uaW5nIG9uCisgICAgICAgIC8vLyAgIE1hYyBvciBMaW51eCB3aWxsIGdyYWNlZnVsbHkgaGFuZGxlIE5URlMgRm9ybWF0dGVkIHRpbWVzLCBvciB0aGF0IGEKKyAgICAgICAgLy8vICAgbm9uLURvdE5ldFppcC1wb3dlcmVkIGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gV2luZG93cyB3aWxsIGJlIGFibGUgdG8KKyAgICAgICAgLy8vICAgaGFuZGxlIGZpbGUgdGltZXMgaW4gVW5peCBmb3JtYXQuIFdoZW4gaW4gZG91YnQsIHRlc3QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIE5vcm1hbGx5IHlvdSB3aWxsIHVzZSB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBGaWxlLkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmciPlppcEZpbGUuRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZzwvc2VlPgorICAgICAgICAvLy8gICBwcm9wZXJ0eSwgdG8gc3BlY2lmeSB0aGUgYmVoYXZpb3IgZm9yIGFsbCBlbnRyaWVzLCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAgLy8vICAgcHJvcGVydHkgb24gZWFjaCBpbmRpdmlkdWFsIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlNldEVudHJ5VGltZXMoRGF0ZVRpbWUsIERhdGVUaW1lLCBEYXRlVGltZSkiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkVtaXRUaW1lc0luV2luZG93c0Zvcm1hdFdoZW5TYXZpbmciLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEZpbGUuRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQ3JlYXRpb25UaW1lIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJBY2Nlc3NlZFRpbWUiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9Ik1vZGlmaWVkVGltZSIvPgorICAgICAgICBwdWJsaWMgYm9vbCBFbWl0VGltZXNJblVuaXhGb3JtYXRXaGVuU2F2aW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZW1pdFVuaXhUaW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9lbWl0VW5peFRpbWVzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX21ldGFkYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0eXBlIG9mIHRpbWVzdGFtcCBhdHRhY2hlZCB0byB0aGUgWmlwRW50cnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGlzIHByb3BlcnR5IGlzIHZhbGlkIG9ubHkgZm9yIGEgWmlwRW50cnkgdGhhdCB3YXMgcmVhZCBmcm9tIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyBJdCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGltZXN0YW1wIGF0dGFjaGVkIHRvIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFbWl0VGltZXNJblVuaXhGb3JtYXRXaGVuU2F2aW5nIi8+CisgICAgICAgIGludGVybmFsIFppcEVudHJ5VGltZXN0YW1wIFRpbWVzdGFtcAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RpbWVzdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgPHNlZSBjcmVmPSJTeXN0ZW0uSU8uRmlsZUF0dHJpYnV0ZXMiPmF0dHJpYnV0ZXM8L3NlZT4gaW4gTlRGUyBpbmNsdWRlCisgICAgICAgIC8vLyAgIFJlYWRPbmx5LCBBcmNoaXZlLCBIaWRkZW4sIFN5c3RlbSwgYW5kIEluZGV4ZWQuICBXaGVuIGFkZGluZyBhCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiB0byBhIFppcEZpbGUsIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHNldCBpbXBsaWNpdGx5IHdoZW4KKyAgICAgICAgLy8vICAgYWRkaW5nIGFuIGVudHJ5IGZyb20gdGhlIGZpbGVzeXN0ZW0uICBXaGVuIGFkZGluZyBhbiBlbnRyeSBmcm9tIGEgc3RyZWFtCisgICAgICAgIC8vLyAgIG9yIHN0cmluZywgdGhlIEF0dHJpYnV0ZXMgYXJlIG5vdCBzZXQgaW1wbGljaXRseS4gIFJlZ2FyZGxlc3Mgb2YgdGhlIHdheQorICAgICAgICAvLy8gICBhbiBlbnRyeSB3YXMgYWRkZWQgdG8gYSA8Yz5aaXBGaWxlPC9jPiwgeW91IGNhbiBzZXQgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgLy8vICAgZXhwbGljaXRseSBpZiB5b3UgbGlrZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGEgPGM+WmlwRW50cnk8L2M+IGZyb20gYSA8Yz5aaXBGaWxlPC9jPiwgdGhlIGF0dHJpYnV0ZXMgYXJlCisgICAgICAgIC8vLyAgIHNldCBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgc3RvcmVkIGluIHRoZSA8Yz5aaXBGaWxlPC9jPi4gSWYgeW91IGV4dHJhY3QgdGhlCisgICAgICAgIC8vLyAgIGVudHJ5IGZyb20gdGhlIGFyY2hpdmUgdG8gYSBmaWxlc3lzdGVtIGZpbGUsIERvdE5ldFppcCB3aWxsIHNldCB0aGUKKyAgICAgICAgLy8vICAgYXR0cmlidXRlcyBvbiB0aGUgcmVzdWx0aW5nIGZpbGUgYWNjb3JkaW5nbHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgZXhwbGljaXRseSBieSB0aGUgYXBwbGljYXRpb24uICBGb3IgZXhhbXBsZSB0aGUKKyAgICAgICAgLy8vICAgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gc2V0IHRoZSA8Yz5GaWxlQXR0cmlidXRlcy5SZWFkT25seTwvYz4gYml0IGZvciBhbGwKKyAgICAgICAgLy8vICAgZW50cmllcyBhZGRlZCB0byBhbiBhcmNoaXZlLCBzbyB0aGF0IG9uIHVucGFjaywgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQKKyAgICAgICAgLy8vICAgb24gdGhlIGV4dHJhY3RlZCBmaWxlLiAgQW55IGNoYW5nZXMgeW91IG1ha2UgdG8gdGhpcyBwcm9wZXJ0eSBhcmUgbWFkZQorICAgICAgICAvLy8gICBwZXJtYW5lbnQgb25seSB3aGVuIHlvdSBjYWxsIGEgPGM+U2F2ZSgpPC9jPiBtZXRob2Qgb24gdGhlIDxjPlppcEZpbGU8L2M+CisgICAgICAgIC8vLyAgIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIFppcEVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gemlwIHVwIGEgZGlyZWN0b3J5IGFuZCBzZXQgdGhlCisgICAgICAgIC8vLyAgIFJlYWRPbmx5IGJpdCBvbiBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlLCBzbyB0aGF0IHVwb24gbGF0ZXIgZXh0cmFjdGlvbiwKKyAgICAgICAgLy8vICAgdGhlIHJlc3VsdGluZyBmaWxlcyB3aWxsIGJlIG1hcmtlZCBhcyBSZWFkT25seS4gIE5vdCBldmVyeSBleHRyYWN0aW9uIHRvb2wKKyAgICAgICAgLy8vICAgcmVzcGVjdHMgdGhlc2UgYXR0cmlidXRlcywgYnV0IGlmIHlvdSB1bnBhY2sgd2l0aCBEb3ROZXRaaXAsIGFzIGZvcgorICAgICAgICAvLy8gICBleGFtcGxlIGluIGEgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUsIHRoZW4gdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBzZXQgYXMKKyAgICAgICAgLy8vICAgdGhleSBhcmUgc3RvcmVkIGluIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlc2UgYXR0cmlidXRlcyBtYXkgbm90IGJlIGludGVyZXN0aW5nIG9yIHVzZWZ1bCBpZiB0aGUgcmVzdWx0aW5nIGFyY2hpdmUKKyAgICAgICAgLy8vICAgaXMgZXh0cmFjdGVkIG9uIGEgbm9uLVdpbmRvd3MgcGxhdGZvcm0uICBIb3cgdGhlc2UgYXR0cmlidXRlcyBnZXQgdXNlZAorICAgICAgICAvLy8gICB1cG9uIGV4dHJhY3Rpb24gZGVwZW5kcyBvbiB0aGUgcGxhdGZvcm0gYW5kIHRvb2wgdXNlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHBhcnRpYWxseSBzdXBwb3J0ZWQgaW4gdGhlIFNpbHZlcmxpZ2h0IHZlcnNpb24KKyAgICAgICAgLy8vICAgb2YgdGhlIGxpYnJhcnk6IGFwcGxpY2F0aW9ucyBjYW4gcmVhZCBhdHRyaWJ1dGVzIG9uIGVudHJpZXMgd2l0aGluCisgICAgICAgIC8vLyAgIFppcEZpbGVzLiBCdXQgZXh0cmFjdGluZyBlbnRyaWVzIHdpdGhpbiBTaWx2ZXJsaWdodCB3aWxsIG5vdCBzZXQgdGhlCisgICAgICAgIC8vLyAgIGF0dHJpYnV0ZXMgb24gdGhlIGV4dHJhY3RlZCBmaWxlcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBTeXN0ZW0uSU8uRmlsZUF0dHJpYnV0ZXMgQXR0cmlidXRlcworICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA3MDcxCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKFN5c3RlbS5JTy5GaWxlQXR0cmlidXRlcylfRXh0ZXJuYWxGaWxlQXR0cnM7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9FeHRlcm5hbEZpbGVBdHRycyA9IChpbnQpdmFsdWU7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIGFwcGxpY2F0aW9uIGlzIGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgYXR0cmlidXRlcywgb3ZlcndyaXRpbmcKKyAgICAgICAgICAgICAgICAvLyB3aGF0ZXZlciB3YXMgdGhlcmUsIHdlIHdpbGwgZXhwbGljaXRseSBzZXQgdGhlIFZlcnNpb24gbWFkZSBieSBmaWVsZC4KKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3OTI2IC0gInZlcnNpb24gbWFkZSBieSIgT1Mgc2hvdWxkIGJlIHplcm8gZm9yIGNvbXBhdCB3aXRoIFdpblppcAorICAgICAgICAgICAgICAgIF9WZXJzaW9uTWFkZUJ5ID0gKDAgPDwgOCkgKyA0NTsgIC8vIHY0LjUgb2YgdGhlIHNwZWMKKyAgICAgICAgICAgICAgICBfbWV0YWRhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZmlsZXN5c3RlbSBmaWxlLCByZWZlcnJlZCB0byBieSB0aGUgWmlwRW50cnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyB0aGUgdGhpbmctdG8tYmUtemlwcGVkIG9uIGRpc2ssIGFuZCBpcyBzZXQgb25seQorICAgICAgICAvLy8gICAgd2hlbiB0aGUgPGM+WmlwRW50cnk8L2M+IGlzIGJlaW5nIGNyZWF0ZWQgZnJvbSBhIGZpbGVzeXN0ZW0gZmlsZS4gIElmIHRoZQorICAgICAgICAvLy8gICAgPGM+WmlwRmlsZTwvYz4gaXMgaW5zdGFudGlhdGVkIGJ5IHJlYWRpbmcgYW4gZXhpc3RpbmcgLnppcCBhcmNoaXZlLCB0aGVuCisgICAgICAgIC8vLyAgICB0aGUgTG9jYWxGaWxlTmFtZSB3aWxsIGJlIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbiBWQikuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIFdoZW4gaXQgaXMgc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBtYXkgYmUgZGlmZmVyZW50IHRoYW4gPHNlZQorICAgICAgICAvLy8gICAgY3JlZj0iRmlsZU5hbWUiLz4sIHdoaWNoIGlzIHRoZSBwYXRoIHVzZWQgaW4gdGhlIGFyY2hpdmUgaXRzZWxmLiAgSWYgeW91CisgICAgICAgIC8vLyAgICBjYWxsIDxjPlppcC5BZGRGaWxlKCJmb29wLnR4dCIsIEFsdGVybmF0aXZlRGlyZWN0b3J5KTwvYz4sIHRoZW4gdGhlIHBhdGgKKyAgICAgICAgLy8vICAgIHVzZWQgZm9yIHRoZSA8Yz5aaXBFbnRyeTwvYz4gd2l0aGluIHRoZSB6aXAgYXJjaGl2ZSB3aWxsIGJlIGRpZmZlcmVudAorICAgICAgICAvLy8gICAgdGhhbiB0aGlzIHBhdGguCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgdGhlIGVudHJ5IGlzIGJlaW5nIGFkZGVkIGZyb20gYSBzdHJlYW0sIHRoZW4gdGhpcyBpcyBudWxsIChOb3RoaW5nIGluIFZCKS4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRmlsZU5hbWUiLz4KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIExvY2FsRmlsZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9Mb2NhbEZpbGVOYW1lOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5lZCBpbiB0aGUgWmlwRW50cnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IGluIHRoZSA8Yz5aaXBGaWxlPC9jPiBpdHNlbGYuICBXaGVuIGNyZWF0aW5nCisgICAgICAgIC8vLyAgIGEgemlwIGFyY2hpdmUsIGlmIHRoZSA8Yz5aaXBFbnRyeTwvYz4gaGFzIGJlZW4gY3JlYXRlZCBmcm9tIGEgZmlsZXN5c3RlbQorICAgICAgICAvLy8gICBmaWxlLCB2aWEgYSBjYWxsIHRvIDxzZWUgY3JlZj0iWmlwRmlsZS5BZGRGaWxlKFN0cmluZyxTdHJpbmcpIi8+IG9yIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRmlsZS5BZGRJdGVtKFN0cmluZyxTdHJpbmcpIi8+LCBvciBhIHJlbGF0ZWQgb3ZlcmxvYWQsIHRoZSB2YWx1ZQorICAgICAgICAvLy8gICBvZiB0aGlzIHByb3BlcnR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGF0IGZpbGUuIFRoZQorICAgICAgICAvLy8gICA8Yz5GaWxlTmFtZTwvYz4gcHJvcGVydHkgZG9lcyBub3QgaW5jbHVkZSBkcml2ZSBsZXR0ZXJzLCBhbmQgbWF5IGluY2x1ZGUgYQorICAgICAgICAvLy8gICBkaWZmZXJlbnQgZGlyZWN0b3J5IHBhdGgsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlCisgICAgICAgIC8vLyAgIDxjPmRpcmVjdG9yeVBhdGhJbkFyY2hpdmU8L2M+IHBhcmFtZXRlciB1c2VkIHdoZW4gYWRkaW5nIHRoZSBlbnRyeSBpbnRvCisgICAgICAgIC8vLyAgIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gc29tZSBjYXNlcyB0aGVyZSBpcyBubyByZWxhdGVkIGZpbGVzeXN0ZW0gZmlsZSAtIGZvciBleGFtcGxlIHdoZW4gYQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gaXMgY3JlYXRlZCB1c2luZyA8c2VlIGNyZWY9IlppcEZpbGUuQWRkRW50cnkoc3RyaW5nLAorICAgICAgICAvLy8gICBzdHJpbmcpIi8+IG9yIG9uZSBvZiB0aGUgc2ltaWxhciBvdmVybG9hZHMuICBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSBvZgorICAgICAgICAvLy8gICB0aGlzIHByb3BlcnR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZU5hbWUgYW5kIHRoZSBkaXJlY3RvcnkgcGF0aCBwYXNzZWQKKyAgICAgICAgLy8vICAgdG8gdGhhdCBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gcmVhZGluZyBhIHppcCBmaWxlLCB0aGlzIHByb3BlcnR5IHRha2VzIHRoZSB2YWx1ZSBvZiB0aGUgZW50cnkgbmFtZQorICAgICAgICAvLy8gICBhcyBzdG9yZWQgaW4gdGhlIHppcCBmaWxlLiBJZiB5b3UgZXh0cmFjdCBzdWNoIGFuIGVudHJ5LCB0aGUgZXh0cmFjdGVkCisgICAgICAgIC8vLyAgIGZpbGUgd2lsbCB0YWtlIHRoZSBuYW1lIGdpdmVuIGJ5IHRoaXMgcHJvcGVydHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFwcGxpY2F0aW9ucyBjYW4gc2V0IHRoaXMgcHJvcGVydHkgd2hlbiBjcmVhdGluZyBuZXcgemlwIGFyY2hpdmVzIG9yIHdoZW4KKyAgICAgICAgLy8vICAgcmVhZGluZyBleGlzdGluZyBhcmNoaXZlcy4gV2hlbiBzZXR0aW5nIHRoaXMgcHJvcGVydHksIHRoZSBhY3R1YWwgdmFsdWUKKyAgICAgICAgLy8vICAgdGhhdCBpcyBzZXQgd2lsbCByZXBsYWNlIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzLCBpbiBhY2NvcmRhbmNlCisgICAgICAgIC8vLyAgIHdpdGggPHNlZQorICAgICAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj50aGUgWmlwCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb248L3NlZT4sIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCh0bSkgYW5kIC4uLiBnZXQKKyAgICAgICAgLy8vICAgdGhpcy4uLi4gQW1pZ2EhCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIGFuIGFwcGxpY2F0aW9uIHJlYWRzIGEgPGM+WmlwRmlsZTwvYz4gdmlhIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRmlsZS5SZWFkKFN0cmluZykiLz4gb3IgYSByZWxhdGVkIG92ZXJsb2FkLCBhbmQgdGhlbiBleHBsaWNpdGx5CisgICAgICAgIC8vLyAgIHNldHMgdGhlIEZpbGVOYW1lIG9uIGFuIGVudHJ5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIDxjPlppcEZpbGU8L2M+LCBhbmQKKyAgICAgICAgLy8vICAgdGhlbiBjYWxscyA8c2VlIGNyZWY9IlppcEZpbGUuU2F2ZSgpIi8+LCB0aGUgYXBwbGljYXRpb24gd2lsbCBlZmZlY3RpdmVseQorICAgICAgICAvLy8gICByZW5hbWUgdGhlIGVudHJ5IHdpdGhpbiB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIGFuIGFwcGxpY2F0aW9uIHNldHMgdGhlIHZhbHVlIG9mIDxjPkZpbGVOYW1lPC9jPiwgdGhlbiBjYWxscworICAgICAgICAvLy8gICA8Yz5FeHRyYWN0KCk8L2M+IG9uIHRoZSBlbnRyeSwgdGhlIGVudHJ5IGlzIGV4dHJhY3RlZCB0byBhIGZpbGUgdXNpbmcgdGhlCisgICAgICAgIC8vLyAgIG5ld2x5IHNldCB2YWx1ZSBhcyB0aGUgZmlsZW5hbWUuICBUaGUgPGM+RmlsZU5hbWU8L2M+IHZhbHVlIGlzIG1hZGUKKyAgICAgICAgLy8vICAgcGVybWFuZW50IGluIHRoZSB6aXAgYXJjaGl2ZSBvbmx5IDxlbT5hZnRlcjwvZW0+IGEgY2FsbCB0byBvbmUgb2YgdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGUuU2F2ZSgpPC9jPiBtZXRob2RzIG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICAvLy8gICBaaXBFbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgYW4gYXBwbGljYXRpb24gYXR0ZW1wdHMgdG8gc2V0IHRoZSA8Yz5GaWxlTmFtZTwvYz4gdG8gYSB2YWx1ZSB0aGF0CisgICAgICAgIC8vLyAgIHdvdWxkIHJlc3VsdCBpbiBhIGR1cGxpY2F0ZSBlbnRyeSBpbiB0aGUgPGM+WmlwRmlsZTwvYz4sIGFuIGV4Y2VwdGlvbiBpcworICAgICAgICAvLy8gICB0aHJvd24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gYSA8Yz5aaXBFbnRyeTwvYz4gaXMgY29udGFpbmVkIHdpdGhpbiBhIDxjPlppcEZpbGU8L2M+LCBhcHBsaWNhdGlvbnMKKyAgICAgICAgLy8vICAgY2Fubm90IHJlbmFtZSB0aGUgZW50cnkgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgPGM+Zm9yZWFjaDwvYz4gKDxjPkZvcgorICAgICAgICAvLy8gICBFYWNoPC9jPiBpbiBWQikgbG9vcCwgYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSA8Yz5aaXBGaWxlPC9jPiBzdG9yZXMKKyAgICAgICAgLy8vICAgZW50cmllcy4gIElmIHlvdSBuZWVkIHRvIGVudW1lcmF0ZSB0aHJvdWdoIGFsbCB0aGUgZW50cmllcyBhbmQgcmVuYW1lIG9uZQorICAgICAgICAvLy8gICBvciBtb3JlIG9mIHRoZW0sIHVzZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEZpbGUuRW50cmllc1NvcnRlZCI+WmlwRmlsZS5FbnRyaWVzU29ydGVkPC9zZWU+IGFzIHRoZQorICAgICAgICAvLy8gICBjb2xsZWN0aW9uLiAgU2VlIGFsc28sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRmlsZS5HZXRFbnVtZXJhdG9yKCkiPlppcEZpbGUuR2V0RW51bWVyYXRvcigpPC9zZWU+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIHN0cmluZyBGaWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0ZpbGVOYW1lSW5BcmNoaXZlOyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NvbnRhaW5lci5aaXBGaWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIkNhbm5vdCByZW5hbWU7IHRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBaaXBPdXRwdXRTdHJlYW0vWmlwSW5wdXRTdHJlYW0uIik7CisKKyAgICAgICAgICAgICAgICAvLyByZW5hbWUgdGhlIGVudHJ5IQorICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHRocm93IG5ldyBaaXBFeGNlcHRpb24oIlRoZSBGaWxlTmFtZSBtdXN0IGJlIG5vbiBlbXB0eSBhbmQgbm9uLW51bGwuIik7CisKKyAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBaaXBFbnRyeS5OYW1lSW5BcmNoaXZlKHZhbHVlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MTgwCisgICAgICAgICAgICAgICAgaWYgKF9GaWxlTmFtZUluQXJjaGl2ZSA9PSBmaWxlbmFtZSkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCisKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4MDQ3IC0gd2hlbiByZW5hbWluZywgbXVzdCByZW1vdmUgb2xkIGFuZCB0aGVuIGFkZCBhIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5aaXBGaWxlLlJlbW92ZUVudHJ5KHRoaXMpOworICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5aaXBGaWxlLkludGVybmFsQWRkRW50cnkoZmlsZW5hbWUsIHRoaXMpOworCisgICAgICAgICAgICAgICAgX0ZpbGVOYW1lSW5BcmNoaXZlID0gZmlsZW5hbWU7CisgICAgICAgICAgICAgICAgX2NvbnRhaW5lci5aaXBGaWxlLk5vdGlmeUVudHJ5Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgIF9tZXRhZGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgc3RyZWFtIHRoYXQgcHJvdmlkZXMgY29udGVudCBmb3IgdGhlIFppcEVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgaW5wdXQgc3RyZWFtIGZvciBhbgorICAgICAgICAvLy8gICBlbnRyeSBvbiBhIGp1c3QtaW4tdGltZSBiYXNpcy4gSW1hZ2luZSBhIHNjZW5hcmlvIHdoZXJlIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAvLy8gICBjcmVhdGVzIGEgPGM+WmlwRmlsZTwvYz4gY29tcHJpc2VkIG9mIGNvbnRlbnQgb2J0YWluZWQgZnJvbSBodW5kcmVkcyBvZgorICAgICAgICAvLy8gICBmaWxlcywgdmlhIGNhbGxzIHRvIDxjPkFkZEZpbGUoKTwvYz4uIFRoZSBEb3ROZXRaaXAgbGlicmFyeSBvcGVucyBzdHJlYW1zCisgICAgICAgIC8vLyAgIG9uIHRoZXNlIGZpbGVzIG9uIGEganVzdC1pbi10aW1lIGJhc2lzLCBvbmx5IHdoZW4gd3JpdGluZyB0aGUgZW50cnkgb3V0IHRvCisgICAgICAgIC8vLyAgIGFuIGV4dGVybmFsIHN0b3JlIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSA8Yz5aaXBGaWxlLlNhdmUoKTwvYz4gY2FsbC4gIE9ubHkKKyAgICAgICAgLy8vICAgb25lIGlucHV0IHN0cmVhbSBpcyBvcGVuZWQgYXQgYSB0aW1lLCBhcyBlYWNoIGVudHJ5IGlzIGJlaW5nIHdyaXR0ZW4gb3V0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBOb3cgaW1hZ2luZSBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgYSA8Yz5aaXBGaWxlPC9jPgorICAgICAgICAvLy8gICB3aXRoIGNvbnRlbnQgb2J0YWluZWQgZnJvbSBodW5kcmVkcyBvZiBzdHJlYW1zLCBhZGRlZCB0aHJvdWdoIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsIFN5c3RlbS5JTy5TdHJlYW0pIi8+LiAgTm9ybWFsbHkgdGhlCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uIHdvdWxkIHN1cHBseSBhbiBvcGVuIHN0cmVhbSB0byB0aGF0IGNhbGwuICBCdXQgd2hlbiBsYXJnZQorICAgICAgICAvLy8gICBudW1iZXJzIG9mIHN0cmVhbXMgYXJlIGJlaW5nIGFkZGVkLCB0aGlzIGNhbiBtZWFuIG1hbnkgb3BlbiBzdHJlYW1zIGF0IG9uZQorICAgICAgICAvLy8gICB0aW1lLCB1bm5lY2Vzc2FyaWx5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUbyBhdm9pZCB0aGlzLCBjYWxsIDxzZWUgY3JlZj0iWmlwRmlsZS5BZGRFbnRyeShTdHJpbmcsIE9wZW5EZWxlZ2F0ZSwKKyAgICAgICAgLy8vICAgQ2xvc2VEZWxlZ2F0ZSkiLz4gYW5kIHNwZWNpZnkgZGVsZWdhdGVzIHRoYXQgb3BlbiBhbmQgY2xvc2UgdGhlIHN0cmVhbSBhdAorICAgICAgICAvLy8gICB0aGUgdGltZSBvZiBTYXZlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2V0dGluZyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSB3aGVuIHRoZSBlbnRyeSB3YXMgbm90IGFkZGVkIGZyb20gYQorICAgICAgICAvLy8gICBzdHJlYW0gKGZvciBleGFtcGxlLCB3aGVuIHRoZSA8Yz5aaXBFbnRyeTwvYz4gd2FzIGFkZGVkIHdpdGggPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBGaWxlLkFkZEZpbGUoU3RyaW5nKSIvPiBvciA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEZpbGUuQWRkRGlyZWN0b3J5KFN0cmluZykiLz4sIG9yIHdoZW4gdGhlIGVudHJ5IHdhcyBhZGRlZCBieQorICAgICAgICAvLy8gICByZWFkaW5nIGFuIGV4aXN0aW5nIHppcCBhcmNoaXZlKSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgU3RyZWFtIElucHV0U3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfc291cmNlU3RyZWFtOyB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgIT0gWmlwRW50cnlTb3VyY2UuU3RyZWFtKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJZb3UgbXVzdCBub3Qgc2V0IHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgZW50cnkuIik7CisKKyAgICAgICAgICAgICAgICBfc291cmNlV2FzSml0UHJvdmlkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIF9zb3VyY2VTdHJlYW0gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBJbnB1dFN0cmVhbSB3YXMgcHJvdmlkZWQgSnVzdC1pbi10aW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIGNyZWF0aW5nIGEgemlwIGFyY2hpdmUsIGFuIGFwcGxpY2F0aW9uIGNhbiBvYnRhaW4gY29udGVudCBmb3Igb25lIG9yCisgICAgICAgIC8vLyAgIG1vcmUgb2YgdGhlIDxjPlppcEVudHJ5PC9jPiBpbnN0YW5jZXMgZnJvbSBzdHJlYW1zLCB1c2luZyB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBGaWxlLkFkZEVudHJ5KHN0cmluZywgU3lzdGVtLklPLlN0cmVhbSkiLz4gbWV0aG9kLiAgQXQgdGhlIHRpbWUKKyAgICAgICAgLy8vICAgb2YgY2FsbGluZyB0aGF0IG1ldGhvZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBzdXBwbHkgbnVsbCBhcyB0aGUgdmFsdWUgb2YKKyAgICAgICAgLy8vICAgdGhlIHN0cmVhbSBwYXJhbWV0ZXIuICBCeSBkb2luZyBzbywgdGhlIGFwcGxpY2F0aW9uIGluZGljYXRlcyB0byB0aGUKKyAgICAgICAgLy8vICAgbGlicmFyeSB0aGF0IGl0IHdpbGwgcHJvdmlkZSBhIHN0cmVhbSBmb3IgdGhlIGVudHJ5IG9uIGEganVzdC1pbi10aW1lCisgICAgICAgIC8vLyAgIGJhc2lzLCBhdCB0aGUgdGltZSBvbmUgb2YgdGhlIDxjPlppcEZpbGUuU2F2ZSgpPC9jPiBtZXRob2RzIGlzIGNhbGxlZCBhbmQKKyAgICAgICAgLy8vICAgdGhlIGRhdGEgZm9yIHRoZSB2YXJpb3VzIGVudHJpZXMgYXJlIGJlaW5nIGNvbXByZXNzZWQgYW5kIHdyaXR0ZW4gb3V0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbiB0aGlzIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBjYW4gc2V0IHRoZSA8c2VlIGNyZWY9IklucHV0U3RyZWFtIi8+CisgICAgICAgIC8vLyAgIHByb3BlcnR5LCB0eXBpY2FsbHkgd2l0aGluIHRoZSBTYXZlUHJvZ3Jlc3MgZXZlbnQgKGV2ZW50IHR5cGU6IDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0JlZm9yZVdyaXRlRW50cnkiLz4pIGZvciB0aGF0IGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgYXBwbGljYXRpb24gd2lsbCBsYXRlciB3YW50IHRvIGNhbGwgQ2xvc2UoKSBhbmQgRGlzcG9zZSgpIG9uIHRoYXQKKyAgICAgICAgLy8vICAgc3RyZWFtLiAgSW4gdGhlIFNhdmVQcm9ncmVzcyBldmVudCwgd2hlbiB0aGUgZXZlbnQgdHlwZSBpcyA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlcldyaXRlRW50cnkiLz4sIHRoZSBhcHBsaWNhdGlvbiBjYW4KKyAgICAgICAgLy8vICAgZG8gc28uICBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSBoYXMgYmVlbiBwcm92aWRlZCBieSB0aGUKKyAgICAgICAgLy8vICAgYXBwbGljYXRpb24gb24gYSBqdXN0LWluLXRpbWUgYmFzaXMgYW5kIHRoYXQgaXQgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKKyAgICAgICAgLy8vICAgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCBDbG9zZS9EaXNwb3NlIG9uIHRoYXQgc3RyZWFtLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklucHV0U3RyZWFtIi8+CisgICAgICAgIHB1YmxpYyBib29sIElucHV0U3RyZWFtV2FzSml0UHJvdmlkZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zb3VyY2VXYXNKaXRQcm92aWRlZDsgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuIGVudW0gaW5kaWNhdGluZyB0aGUgc291cmNlIG9mIHRoZSBaaXBFbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgWmlwRW50cnlTb3VyY2UgU291cmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfU291cmNlOyB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2ZXJzaW9uIG9mIHRoZSB6aXAgZW5naW5lIG5lZWRlZCB0byByZWFkIHRoZSBaaXBFbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGlzIGEgcmVhZG9ubHkgcHJvcGVydHksIGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgPGEKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+dGhlIFppcAorICAgICAgICAvLy8gICBzcGVjaWZpY2F0aW9uPC9hPiB0aGF0IHRoZSBleHRyYWN0aW5nIHRvb2wgb3IgbGlicmFyeSBtdXN0IHN1cHBvcnQgdG8KKyAgICAgICAgLy8vICAgZXh0cmFjdCB0aGUgZ2l2ZW4gZW50cnkuICBHZW5lcmFsbHkgaGlnaGVyIHZlcnNpb25zIGluZGljYXRlIG5ld2VyCisgICAgICAgIC8vLyAgIGZlYXR1cmVzLiAgT2xkZXIgemlwIGVuZ2luZXMgb2J2aW91c2x5IHdvbid0IGtub3cgYWJvdXQgbmV3IGZlYXR1cmVzLCBhbmQKKyAgICAgICAgLy8vICAgd29uJ3QgYmUgYWJsZSB0byBleHRyYWN0IGVudHJpZXMgdGhhdCBkZXBlbmQgb24gdGhvc2UgbmV3ZXIgZmVhdHVyZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgorICAgICAgICAvLy8gPGxpc3RoZWFkZXI+CisgICAgICAgIC8vLyA8dGVybT52YWx1ZTwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5GZWF0dXJlczwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2xpc3RoZWFkZXI+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT4yMDwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5hIGJhc2ljIFppcCBFbnRyeSwgcG90ZW50aWFsbHkgdXNpbmcgUEtaSVAgZW5jcnlwdGlvbi4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT40NTwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5UaGUgWklQNjQgZXh0ZW5zaW9uIGlzIHVzZWQgb24gdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjQ2PC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPiBGaWxlIGlzIGNvbXByZXNzZWQgdXNpbmcgQlpJUDIgY29tcHJlc3Npb24qPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjUwPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPiBGaWxlIGlzIGVuY3J5cHRlZCB1c2luZyBQa1dhcmUncyBERVMsIDNERVMsIChicm9rZW4pIFJDMiBvciBSQzQ8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+NTE8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+IEZpbGUgaXMgZW5jcnlwdGVkIHVzaW5nIFBLV2FyZSdzIEFFUyBlbmNyeXB0aW9uIG9yIGNvcnJlY3RlZCBSQzIgZW5jcnlwdGlvbi48L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+NTI8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+IEZpbGUgaXMgZW5jcnlwdGVkIHVzaW5nIGNvcnJlY3RlZCBSQzItNjQgZW5jcnlwdGlvbioqPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjYxPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPiBGaWxlIGlzIGVuY3J5cHRlZCB1c2luZyBub24tT0FFUCBrZXkgd3JhcHBpbmcqKio8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+NjM8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+IEZpbGUgaXMgY29tcHJlc3NlZCB1c2luZyBMWk1BLCBQUE1kKywgQmxvd2Zpc2gsIG9yIFR3b2Zpc2g8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlcmUgYXJlIG90aGVyIHZhbHVlcyBwb3NzaWJsZSwgbm90IGxpc3RlZCBoZXJlLiBEb3ROZXRaaXAgc3VwcG9ydHMKKyAgICAgICAgLy8vICAgcmVndWxhciBQS1ppcCBlbmNyeXB0aW9uLCBhbmQgWklQNjQgZXh0ZW5zaW9ucy4gIERvdE5ldFppcCBjYW5ub3QgZXh0cmFjdAorICAgICAgICAvLy8gICBlbnRyaWVzIHRoYXQgcmVxdWlyZSBhIHppcCBlbmdpbmUgaGlnaGVyIHRoYW4gNDUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgdmFsdWUgaXMgc2V0IHVwb24gcmVhZGluZyBhbiBleGlzdGluZyB6aXAgZmlsZSwgb3IgYWZ0ZXIgc2F2aW5nIGEgemlwCisgICAgICAgIC8vLyAgIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBJbnQxNiBWZXJzaW9uTmVlZGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfVmVyc2lvbk5lZWRlZDsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvbW1lbnQgYXR0YWNoZWQgdG8gdGhlIFppcEVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEVhY2ggZW50cnkgaW4gYSB6aXAgZmlsZSBjYW4gb3B0aW9uYWxseSBoYXZlIGEgY29tbWVudCBhc3NvY2lhdGVkIHRvCisgICAgICAgIC8vLyAgIGl0LiBUaGUgY29tbWVudCBtaWdodCBiZSBkaXNwbGF5ZWQgYnkgYSB6aXAgdG9vbCBkdXJpbmcgZXh0cmFjdGlvbiwgZm9yCisgICAgICAgIC8vLyAgIGV4YW1wbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEJ5IGRlZmF1bHQsIHRoZSA8Yz5Db21tZW50PC9jPiBpcyBlbmNvZGVkIGluIElCTTQzNyBjb2RlIHBhZ2UuIFlvdSBjYW4KKyAgICAgICAgLy8vICAgc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSB3aXRoIDxzZWUgY3JlZj0iQWx0ZXJuYXRlRW5jb2RpbmciLz4gYW5kCisgICAgICAgIC8vLyAgPHNlZSBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQWx0ZXJuYXRlRW5jb2RpbmciLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkFsdGVybmF0ZUVuY29kaW5nVXNhZ2UiLz4KKyAgICAgICAgcHVibGljIHN0cmluZyBDb21tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfQ29tbWVudDsgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NvbW1lbnQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBfbWV0YWRhdGFDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudHJ5IHJlcXVpcmVzIFpJUDY0IGV4dGVuc2lvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgaXMgbnVsbCAoTm90aGluZyBpbiBWQikgdW50aWwgYSA8Yz5TYXZlKCk8L2M+IG1ldGhvZCBvbiB0aGUKKyAgICAgICAgLy8vICAgY29udGFpbmluZyA8c2VlIGNyZWY9IlppcEZpbGUiLz4gaW5zdGFuY2UgaGFzIGJlZW4gY2FsbGVkLiBUaGUgcHJvcGVydHkgaXMKKyAgICAgICAgLy8vICAgbm9uLW51bGwgKDxjPkhhc1ZhbHVlPC9jPiBpcyB0cnVlKSBvbmx5IGFmdGVyIGEgPGM+U2F2ZSgpPC9jPiBtZXRob2QgaGFzCisgICAgICAgIC8vLyAgIGJlZW4gY2FsbGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBZnRlciB0aGUgY29udGFpbmluZyA8Yz5aaXBGaWxlPC9jPiBoYXMgYmVlbiBzYXZlZCwgdGhlIFZhbHVlIG9mIHRoaXMKKyAgICAgICAgLy8vICAgcHJvcGVydHkgaXMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBjb25kaXRpb25zIGhvbGRzOiB0aGUKKyAgICAgICAgLy8vICAgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGVudHJ5IGlzIGxhcmdlciB0aGFuIDB4RkZGRkZGRkY7IHRoZSBjb21wcmVzc2VkCisgICAgICAgIC8vLyAgIHNpemUgb2YgdGhlIGVudHJ5IGlzIGxhcmdlciB0aGFuIDB4RkZGRkZGRkY7IHRoZSByZWxhdGl2ZSBvZmZzZXQgb2YgdGhlCisgICAgICAgIC8vLyAgIGVudHJ5IHdpdGhpbiB0aGUgemlwIGFyY2hpdmUgaXMgbGFyZ2VyIHRoYW4gMHhGRkZGRkZGRi4gIFRoZXNlIHF1YW50aXRpZXMKKyAgICAgICAgLy8vICAgYXJlIG5vdCBrbm93biB1bnRpbCBhIDxjPlNhdmUoKTwvYz4gaXMgYXR0ZW1wdGVkIG9uIHRoZSB6aXAgYXJjaGl2ZSBhbmQKKyAgICAgICAgLy8vICAgdGhlIGNvbXByZXNzaW9uIGlzIGFwcGxpZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIG5vbmUgb2YgdGhlIHRocmVlIGNvbmRpdGlvbnMgaG9sZHMsIHRoZW4gdGhlIDxjPlZhbHVlPC9jPiBpcyBmYWxzZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQSA8Yz5WYWx1ZTwvYz4gb2YgZmFsc2UgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgZW50cnksIGFzIHNhdmVkIGluIHRoZQorICAgICAgICAvLy8gICB6aXAgYXJjaGl2ZSwgZG9lcyBub3QgdXNlIFpJUDY0LiAgSXQgbWVyZWx5IGluZGljYXRlcyB0aGF0IFpJUDY0IGlzCisgICAgICAgIC8vLyAgIDxlbT5ub3QgcmVxdWlyZWQ8L2VtPi4gIEFuIGVudHJ5IG1heSB1c2UgWklQNjQgZXZlbiB3aGVuIG5vdCByZXF1aXJlZCBpZgorICAgICAgICAvLy8gICB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlLlVzZVppcDY0V2hlblNhdmluZyIvPiBwcm9wZXJ0eSBvbiB0aGUgY29udGFpbmluZworICAgICAgICAvLy8gICA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSBpcyBzZXQgdG8gPHNlZSBjcmVmPSJaaXA2NE9wdGlvbi5BbHdheXMiLz4sIG9yIGlmCisgICAgICAgIC8vLyAgIHRoZSA8c2VlIGNyZWY9IlppcEZpbGUuVXNlWmlwNjRXaGVuU2F2aW5nIi8+IHByb3BlcnR5IG9uIHRoZSBjb250YWluaW5nCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+IGluc3RhbmNlIGlzIHNldCB0byA8c2VlIGNyZWY9IlppcDY0T3B0aW9uLkFzTmVjZXNzYXJ5Ii8+CisgICAgICAgIC8vLyAgIGFuZCB0aGUgb3V0cHV0IHN0cmVhbSB3YXMgbm90IHNlZWthYmxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9Ik91dHB1dFVzZWRaaXA2NCIvPgorICAgICAgICBwdWJsaWMgTnVsbGFibGU8Ym9vbD4gUmVxdWlyZXNaaXA2NAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2VudHJ5UmVxdWlyZXNaaXA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudHJ5IGFjdHVhbGx5IHVzZWQgWklQNjQgZXh0ZW5zaW9ucywgYXMgaXQgd2FzIG1vc3QKKyAgICAgICAgLy8vICAgcmVjZW50bHkgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGZpbGUgb3Igc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIE51bGxhYmxlIHByb3BlcnR5IGlzIG51bGwgKE5vdGhpbmcgaW4gVkIpIHVudGlsIGEgPGM+U2F2ZSgpPC9jPgorICAgICAgICAvLy8gICBtZXRob2Qgb24gdGhlIGNvbnRhaW5pbmcgPHNlZSBjcmVmPSJaaXBGaWxlIi8+IGluc3RhbmNlIGhhcyBiZWVuCisgICAgICAgIC8vLyAgIGNhbGxlZC4gPGM+SGFzVmFsdWU8L2M+IGlzIHRydWUgb25seSBhZnRlciBhIDxjPlNhdmUoKTwvYz4gbWV0aG9kIGhhcyBiZWVuCisgICAgICAgIC8vLyAgIGNhbGxlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgZm9yIGEgcGFydGljdWxhciA8Yz5aaXBFbnRyeTwvYz4gbWF5IGNoYW5nZQorICAgICAgICAvLy8gICBvdmVyIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gPGM+U2F2ZSgpPC9jPiBtZXRob2RzIG9uIHRoZSBjb250YWluaW5nIFppcEZpbGUsCisgICAgICAgIC8vLyAgIGV2ZW4gaWYgdGhlIGZpbGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgPGM+WmlwRW50cnk8L2M+IGRvZXMgbm90LiBUaGlzCisgICAgICAgIC8vLyAgIG1heSBoYXBwZW4gaWYgb3RoZXIgZW50cmllcyBjb250YWluZWQgaW4gdGhlIDxjPlppcEZpbGU8L2M+IGV4cGFuZCwKKyAgICAgICAgLy8vICAgY2F1c2luZyB0aGUgb2Zmc2V0IGZvciB0aGlzIHBhcnRpY3VsYXIgZW50cnkgdG8gZXhjZWVkIDB4RkZGRkZGRkYuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJSZXF1aXJlc1ppcDY0Ii8+CisgICAgICAgIHB1YmxpYyBOdWxsYWJsZTxib29sPiBPdXRwdXRVc2VkWmlwNjQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9PdXRwdXRVc2VzWmlwNjQ7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgYml0ZmllbGQgZm9yIHRoZSBlbnRyeSBhcyBkZWZpbmVkIGluIHRoZSB6aXAgc3BlYy4gWW91IHByb2JhYmx5CisgICAgICAgIC8vLyAgIG5ldmVyIG5lZWQgdG8gbG9vayBhdCB0aGlzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFlvdSBwcm9iYWJseSBkbyBub3QgbmVlZCB0byBjb25jZXJuIHlvdXJzZWxmIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyAgICAgICAgLy8vICAgcHJvcGVydHksIGJ1dCBpbiBjYXNlIHlvdSBkbzoKKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8bGlzdCB0eXBlPSJ0YWJsZSI+CisgICAgICAgIC8vLyA8bGlzdGhlYWRlcj4KKyAgICAgICAgLy8vIDx0ZXJtPmJpdDwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5tZWFuaW5nPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvbGlzdGhlYWRlcj4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjA8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+c2V0IGlmIGVuY3J5cHRpb24gaXMgdXNlZC48L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+MS0yPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gc2V0IHRvIGRldGVybWluZSB3aGV0aGVyIG5vcm1hbCwgbWF4LCBmYXN0IGRlZmxhdGlvbi4gIERvdE5ldFppcCBsaWJyYXJ5CisgICAgICAgIC8vLyBhbHdheXMgbGVhdmVzIHRoZXNlIGJpdHMgdW5zZXQgd2hlbiB3cml0aW5nIChpbmRpY2F0aW5nICJub3JtYWwiCisgICAgICAgIC8vLyBkZWZsYXRpb24iKSwgYnV0IGNhbiByZWFkIGFuIGVudHJ5IHdpdGggYW55IHZhbHVlIGhlcmUuCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+MzwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBDcmMzMiwgQ29tcHJlc3NlZCBhbmQgVW5jb21wcmVzc2VkIHNpemVzIGFyZSB6ZXJvIGluIHRoZQorICAgICAgICAvLy8gbG9jYWwgaGVhZGVyLiAgVGhpcyBiaXQgZ2V0cyBzZXQgb24gYW4gZW50cnkgZHVyaW5nIHdyaXRpbmcgYSB6aXAgZmlsZSwgd2hlbgorICAgICAgICAvLy8gaXQgaXMgc2F2ZWQgdG8gYSBub24tc2Vla2FibGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+NDwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5yZXNlcnZlZCBmb3IgImVuaGFuY2VkIGRlZmxhdGluZyIuIFRoaXMgbGlicmFyeSBkb2Vzbid0IGRvIGVuaGFuY2VkIGRlZmxhdGluZy48L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+NTwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5zZXQgdG8gaW5kaWNhdGUgdGhlIHppcCBpcyBjb21wcmVzc2VkIHBhdGNoZWQgZGF0YS4gIFRoaXMgbGlicmFyeSBkb2Vzbid0IGRvIHRoYXQuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjY8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyBzZXQgaWYgUEtXYXJlJ3Mgc3Ryb25nIGVuY3J5cHRpb24gaXMgdXNlZCAobXVzdCBhbHNvIHNldCBiaXQgMSBpZiBiaXQgNiBpcworICAgICAgICAvLy8gc2V0KS4gVGhpcyBiaXQgaXMgbm90IHNldCBpZiBXaW5aaXAncyBBRVMgZW5jcnlwdGlvbiBpcyBzZXQuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjc8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+bm90IHVzZWQ8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+ODwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5ub3QgdXNlZDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT45PC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPm5vdCB1c2VkPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjEwPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPm5vdCB1c2VkPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjExPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gTGFuZ3VhZ2UgZW5jb2RpbmcgZmxhZyAoRUZTKS4gIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGZpbGVuYW1lIGFuZCBjb21tZW50CisgICAgICAgIC8vLyBmaWVsZHMgZm9yIHRoaXMgZmlsZSBtdXN0IGJlIGVuY29kZWQgdXNpbmcgVVRGLTguIFRoaXMgbGlicmFyeSBjdXJyZW50bHkKKyAgICAgICAgLy8vIGRvZXMgbm90IHN1cHBvcnQgVVRGLTguCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+MTI8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+UmVzZXJ2ZWQgYnkgUEtXQVJFIGZvciBlbmhhbmNlZCBjb21wcmVzc2lvbi48L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+MTM8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIFVzZWQgd2hlbiBlbmNyeXB0aW5nIHRoZSBDZW50cmFsIERpcmVjdG9yeSB0byBpbmRpY2F0ZSBzZWxlY3RlZCBkYXRhCisgICAgICAgIC8vLyAgIHZhbHVlcyBpbiB0aGUgTG9jYWwgSGVhZGVyIGFyZSBtYXNrZWQgdG8gaGlkZSB0aGVpciBhY3R1YWwgdmFsdWVzLiAgU2VlCisgICAgICAgIC8vLyAgIHRoZSBzZWN0aW9uIGluIDxhCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPnRoZSBaaXAKKyAgICAgICAgLy8vICAgc3BlY2lmaWNhdGlvbjwvYT4gZGVzY3JpYmluZyB0aGUgU3Ryb25nIEVuY3J5cHRpb24gU3BlY2lmaWNhdGlvbiBmb3IKKyAgICAgICAgLy8vICAgZGV0YWlscy4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT4xNDwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5SZXNlcnZlZCBieSBQS1dBUkUuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPjE1PC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlJlc2VydmVkIGJ5IFBLV0FSRS48L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBJbnQxNiBCaXRGaWVsZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0JpdEZpZWxkOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBjb21wcmVzc2lvbiBtZXRob2QgZW1wbG95ZWQgZm9yIHRoaXMgWmlwRW50cnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIDxzZWUgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+VGhlCisgICAgICAgIC8vLyAgIFppcCBzcGVjaWZpY2F0aW9uPC9zZWU+IGFsbG93cyBhIHZhcmlldHkgb2YgY29tcHJlc3Npb24gbWV0aG9kcy4gIFRoaXMKKyAgICAgICAgLy8vICAgbGlicmFyeSBzdXBwb3J0cyBqdXN0IHR3bzogMHgwOCA9IERlZmxhdGUuICAweDAwID0gU3RvcmUgKG5vIGNvbXByZXNzaW9uKSwKKyAgICAgICAgLy8vICAgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGFuIGVudHJ5IGZyb20gYW4gZXhpc3RpbmcgemlwZmlsZSwgdGhlIHZhbHVlIHlvdSByZXRyaWV2ZQorICAgICAgICAvLy8gICBoZXJlIGluZGljYXRlcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHVzZWQgb24gdGhlIGVudHJ5IGJ5IHRoZSBvcmlnaW5hbAorICAgICAgICAvLy8gICBjcmVhdG9yIG9mIHRoZSB6aXAuICBXaGVuIHdyaXRpbmcgYSB6aXBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgZWl0aGVyIDB4MDgKKyAgICAgICAgLy8vICAgKERlZmxhdGUpIG9yIDB4MDAgKE5vbmUpLiAgSWYgeW91IHRyeSBzZXR0aW5nIHNvbWV0aGluZyBlbHNlLCB5b3Ugd2lsbCBnZXQKKyAgICAgICAgLy8vICAgYW4gZXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBZb3UgbWF5IHdpc2ggdG8gc2V0IDxjPkNvbXByZXNzaW9uTWV0aG9kPC9jPiB0byA8Yz5Db21wcmVzc2lvbk1ldGhvZC5Ob25lPC9jPiAoMCkKKyAgICAgICAgLy8vICAgd2hlbiB6aXBwaW5nIGFscmVhZHktY29tcHJlc3NlZCBkYXRhIGxpa2UgYSBqcGcsIHBuZywgb3IgbXAzIGZpbGUuCisgICAgICAgIC8vLyAgIFRoaXMgY2FuIHNhdmUgdGltZSBhbmQgY3B1IGN5Y2xlcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb24gYSA8Yz5aaXBFbnRyeTwvYz4gdGhhdCBpcyByZWFkIGZyb20gYW4KKyAgICAgICAgLy8vICAgZXhpc3RpbmcgemlwIGZpbGUsIGNhbGxpbmcgPGM+WmlwRmlsZS5TYXZlKCk8L2M+IHdpbGwgY2F1c2UgdGhlIG5ldworICAgICAgICAvLy8gICBDb21wcmVzc2lvbk1ldGhvZCB0byBiZSB1c2VkIG9uIHRoZSBlbnRyeSBpbiB0aGUgbmV3bHkgc2F2ZWQgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBtYXkgaGF2ZSB0aGUgc2lkZSBlZmZlY3Qgb2YgbW9kaWZ5aW5nIHRoZQorICAgICAgICAvLy8gICA8Yz5Db21wcmVzc2lvbkxldmVsPC9jPiBwcm9wZXJ0eS4gSWYgeW91IHNldCB0aGUgPGM+Q29tcHJlc3Npb25NZXRob2Q8L2M+IHRvIGEKKyAgICAgICAgLy8vICAgdmFsdWUgb3RoZXIgdGhhbiA8Yz5Ob25lPC9jPiwgYW5kIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+IGlzIHByZXZpb3VzbHkKKyAgICAgICAgLy8vICAgc2V0IHRvIDxjPk5vbmU8L2M+LCB0aGVuIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+IHdpbGwgYmUgc2V0IHRvCisgICAgICAgIC8vLyAgIDxjPkRlZmF1bHQ8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkNvbXByZXNzaW9uTWV0aG9kIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGZpcnN0IGVudHJ5IGFkZGVkIHRvIHRoZSB6aXAgYXJjaGl2ZSB1c2VzIHRoZSBkZWZhdWx0CisgICAgICAgIC8vLyAgIGJlaGF2aW9yIC0gY29tcHJlc3Npb24gaXMgdXNlZCB3aGVyZSBpdCBtYWtlcyBzZW5zZS4gIFRoZSBzZWNvbmQgZW50cnksCisgICAgICAgIC8vLyAgIHRoZSBNUDMgZmlsZSwgaXMgYWRkZWQgdG8gdGhlIGFyY2hpdmUgd2l0aG91dCBiZWluZyBjb21wcmVzc2VkLgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZShaaXBGaWxlVG9DcmVhdGUpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICBaaXBFbnRyeSBlMT0gemlwLkFkZEZpbGUoQCJub3Rlc1xSZWFkbWUudHh0Iik7CisgICAgICAgIC8vLyAgIFppcEVudHJ5IGUyPSB6aXAuQWRkRmlsZShAIm11c2ljXFN0b3BUaGlzVHJhaW4ubXAzIik7CisgICAgICAgIC8vLyAgIGUyLkNvbXByZXNzaW9uTWV0aG9kID0gQ29tcHJlc3Npb25NZXRob2QuTm9uZTsKKyAgICAgICAgLy8vICAgemlwLlNhdmUoKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgTmV3IFppcEZpbGUoWmlwRmlsZVRvQ3JlYXRlKQorICAgICAgICAvLy8gICB6aXAuQWRkRmlsZSgibm90ZXNcUmVhZG1lLnR4dCIpCisgICAgICAgIC8vLyAgIERpbSBlMiBhcyBaaXBFbnRyeSA9IHppcC5BZGRGaWxlKCJtdXNpY1xTdG9wVGhpc1RyYWluLm1wMyIpCisgICAgICAgIC8vLyAgIGUyLkNvbXByZXNzaW9uTWV0aG9kID0gQ29tcHJlc3Npb25NZXRob2QuTm9uZQorICAgICAgICAvLy8gICB6aXAuU2F2ZQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIGludGVybmFsIENvbXByZXNzaW9uTWV0aG9kIENvbXByZXNzaW9uTWV0aG9kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiAoQ29tcHJlc3Npb25NZXRob2QpX0NvbXByZXNzaW9uTWV0aG9kOyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gKENvbXByZXNzaW9uTWV0aG9kKV9Db21wcmVzc2lvbk1ldGhvZCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvLgorCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IENvbXByZXNzaW9uTWV0aG9kLk5vbmUgJiYgdmFsdWUgIT0gQ29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZQorI2lmIEJaSVAKKyAgICAgICAgICAgICAgICAgICAgJiYgdmFsdWUgIT0gQ29tcHJlc3Npb25NZXRob2QuQlppcDIKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2QuIik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGEgemlwIGFyY2hpdmUgYW5kIHRoZXJlIHdhcyBlbmNyeXB0aW9uIG9uIHRoZQorICAgICAgICAgICAgICAgIC8vIGVudHJ5LCBjaGFuZ2luZyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwRmlsZSAmJiBfc291cmNlSXNFbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGNoYW5nZSBjb21wcmVzc2lvbiBtZXRob2Qgb24gZW5jcnlwdGVkIGVudHJpZXMgcmVhZCBmcm9tIGFyY2hpdmVzLiIpOworCisgICAgICAgICAgICAgICAgX0NvbXByZXNzaW9uTWV0aG9kID0gKEludDE2KXZhbHVlOworCisgICAgICAgICAgICAgICAgaWYgKF9Db21wcmVzc2lvbk1ldGhvZCA9PSAoSW50MTYpSW9uaWMuWmlwLkNvbXByZXNzaW9uTWV0aG9kLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIF9Db21wcmVzc2lvbkxldmVsID0gSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsLk5vbmU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ29tcHJlc3Npb25MZXZlbCA9PSBJb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwuTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgX0NvbXByZXNzaW9uTGV2ZWwgPSBJb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdDsKKworICAgICAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUgIT0gbnVsbCkgX2NvbnRhaW5lci5aaXBGaWxlLk5vdGlmeUVudHJ5Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgIF9yZXN0cmVhbVJlcXVpcmVkT25TYXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTZXRzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byBiZSB1c2VkIGZvciB0aGUgZW50cnkgd2hlbiBzYXZpbmcgdGhlIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlLiBUaGlzIGFwcGxpZXMgb25seSBmb3IgQ29tcHJlc3Npb25NZXRob2QgPSBERUZMQVRFLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgV2hlbiB1c2luZyB0aGUgREVGTEFURSBjb21wcmVzc2lvbiBtZXRob2QsIFZhcnlpbmcgdGhlIGNvbXByZXNzaW9uCisgICAgICAgIC8vLyAgICBsZXZlbCB1c2VkIG9uIGVudHJpZXMgY2FuIGFmZmVjdCB0aGUgc2l6ZS12cy1zcGVlZCB0cmFkZW9mZiB3aGVuCisgICAgICAgIC8vLyAgICBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2luZyBkYXRhIHN0cmVhbXMgb3IgZmlsZXMuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIElmIHlvdSBkbyBub3Qgc2V0IHRoaXMgcHJvcGVydHksIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIGlzIHVzZWQsCisgICAgICAgIC8vLyAgICB3aGljaCBub3JtYWxseSBnaXZlcyBhIGdvb2QgYmFsYW5jZSBvZiBjb21wcmVzc2lvbiBlZmZpY2llbmN5IGFuZAorICAgICAgICAvLy8gICAgY29tcHJlc3Npb24gc3BlZWQuICBJbiBzb21lIHRlc3RzLCB1c2luZyA8Yz5CZXN0Q29tcHJlc3Npb248L2M+IGNhbgorICAgICAgICAvLy8gICAgZG91YmxlIHRoZSB0aW1lIGl0IHRha2VzIHRvIGNvbXByZXNzLCB3aGlsZSBkZWxpdmVyaW5nIGp1c3QgYSBzbWFsbAorICAgICAgICAvLy8gICAgaW5jcmVhc2UgaW4gY29tcHJlc3Npb24gZWZmaWNpZW5jeS4gIFRoaXMgYmVoYXZpb3Igd2lsbCB2YXJ5IHdpdGggdGhlCisgICAgICAgIC8vLyAgICB0eXBlIG9mIGRhdGEgeW91IGNvbXByZXNzLiAgSWYgeW91IGFyZSBpbiBkb3VidCwganVzdCBsZWF2ZSB0aGlzIHNldHRpbmcKKyAgICAgICAgLy8vICAgIGFsb25lLCBhbmQgYWNjZXB0IHRoZSBkZWZhdWx0LgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBXaGVuIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSBvbiBhIDxjPlppcEVudHJ5PC9jPiB0aGF0IGlzIHJlYWQgZnJvbSBhbgorICAgICAgICAvLy8gICAgZXhpc3RpbmcgemlwIGZpbGUsIGNhbGxpbmcgPGM+WmlwRmlsZS5TYXZlKCk8L2M+IHdpbGwgY2F1c2UgdGhlIG5ldworICAgICAgICAvLy8gICAgPGM+Q29tcHJlc3Npb25MZXZlbDwvYz4gdG8gYmUgdXNlZCBvbiB0aGUgZW50cnkgaW4gdGhlIG5ld2x5IHNhdmVkIHppcCBmaWxlLgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBTZXR0aW5nIHRoaXMgcHJvcGVydHkgbWF5IGhhdmUgdGhlIHNpZGUgZWZmZWN0IG9mIG1vZGlmeWluZyB0aGUKKyAgICAgICAgLy8vICAgIDxjPkNvbXByZXNzaW9uTWV0aG9kPC9jPiBwcm9wZXJ0eS4gSWYgeW91IHNldCB0aGUgPGM+Q29tcHJlc3Npb25MZXZlbDwvYz4KKyAgICAgICAgLy8vICAgIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiA8Yz5Ob25lPC9jPiwgPGM+Q29tcHJlc3Npb25NZXRob2Q8L2M+IHdpbGwgYmUgc2V0CisgICAgICAgIC8vLyAgICB0byA8Yz5EZWZsYXRlPC9jPiwgaWYgaXQgd2FzIHByZXZpb3VzbHkgPGM+Tm9uZTwvYz4uCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IGlmIHRoZSA8Yz5Db21wcmVzc2lvbk1ldGhvZDwvYz4gaXMgc29tZXRoaW5nCisgICAgICAgIC8vLyAgICBvdGhlciB0aGFuIDxjPkRlZmxhdGU8L2M+IG9yIDxjPk5vbmU8L2M+LgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJDb21wcmVzc2lvbk1ldGhvZCIvPgorICAgICAgICBwdWJsaWMgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uTGV2ZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9Db21wcmVzc2lvbkxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9Db21wcmVzc2lvbk1ldGhvZCAhPSAoc2hvcnQpQ29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZSAmJgorICAgICAgICAgICAgICAgICAgICBfQ29tcHJlc3Npb25NZXRob2QgIT0gKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7IC8vIG5vIGVmZmVjdAorCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0ICYmCisgICAgICAgICAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZCA9PSAoc2hvcnQpQ29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZSkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgX0NvbXByZXNzaW9uTGV2ZWwgPSB2YWx1ZTsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwuTm9uZSAmJgorICAgICAgICAgICAgICAgICAgICBfQ29tcHJlc3Npb25NZXRob2QgPT0gKHNob3J0KUNvbXByZXNzaW9uTWV0aG9kLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm90aGluZyBtb3JlIHRvIGRvCisKKyAgICAgICAgICAgICAgICBpZiAoX0NvbXByZXNzaW9uTGV2ZWwgPT0gT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZCA9IChzaG9ydClPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAuQ29tcHJlc3Npb25NZXRob2QuTm9uZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9Db21wcmVzc2lvbk1ldGhvZCA9IChzaG9ydClPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAuQ29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUgIT0gbnVsbCkgX2NvbnRhaW5lci5aaXBGaWxlLk5vdGlmeUVudHJ5Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgIF9yZXN0cmVhbVJlcXVpcmVkT25TYXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUsIGluIGJ5dGVzLCB3aXRoaW4gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBXaGVuIHJlYWRpbmcgYSA8Yz5aaXBGaWxlPC9jPiwgdGhpcyB2YWx1ZSBpcyByZWFkIGluIGZyb20gdGhlIGV4aXN0aW5nCisgICAgICAgIC8vLyAgIHppcCBmaWxlLiBXaGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgPGM+WmlwRmlsZTwvYz4sIHRoZSBjb21wcmVzc2VkCisgICAgICAgIC8vLyAgIHNpemUgaXMgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uLiAgVGhlcmVmb3JlIHRoZSB2YWx1ZSBvbiBhCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBpcyB2YWxpZCBhZnRlciBhIGNhbGwgdG8gPGM+U2F2ZSgpPC9jPiAob3Igb25lIG9mIGl0cworICAgICAgICAvLy8gICBvdmVybG9hZHMpIGluIHRoYXQgY2FzZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBFbnRyeS5VbmNvbXByZXNzZWRTaXplIi8+CisgICAgICAgIHB1YmxpYyBJbnQ2NCBDb21wcmVzc2VkU2l6ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0NvbXByZXNzZWRTaXplOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBzaXplIG9mIHRoZSBmaWxlLCBpbiBieXRlcywgYmVmb3JlIGNvbXByZXNzaW9uLCBvciBhZnRlciBleHRyYWN0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBXaGVuIHJlYWRpbmcgYSA8Yz5aaXBGaWxlPC9jPiwgdGhpcyB2YWx1ZSBpcyByZWFkIGluIGZyb20gdGhlIGV4aXN0aW5nCisgICAgICAgIC8vLyAgIHppcCBmaWxlLiBXaGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgPGM+WmlwRmlsZTwvYz4sIHRoZSB1bmNvbXByZXNzZWQKKyAgICAgICAgLy8vICAgc2l6ZSBpcyBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24uICBUaGVyZWZvcmUgdGhlIHZhbHVlIG9uIGEKKyAgICAgICAgLy8vICAgPGM+WmlwRW50cnk8L2M+IGlzIHZhbGlkIGFmdGVyIGEgY2FsbCB0byA8Yz5TYXZlKCk8L2M+IChvciBvbmUgb2YgaXRzCisgICAgICAgIC8vLyAgIG92ZXJsb2FkcykgaW4gdGhhdCBjYXNlLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBFbnRyeS5Db21wcmVzc2VkU2l6ZSIvPgorICAgICAgICBwdWJsaWMgSW50NjQgVW5jb21wcmVzc2VkU2l6ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX1VuY29tcHJlc3NlZFNpemU7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSByYXRpbyBvZiBjb21wcmVzc2VkIHNpemUgdG8gdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIFppcEVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgaXMgYSByYXRpbyBvZiB0aGUgY29tcHJlc3NlZCBzaXplIHRvIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUKKyAgICAgICAgLy8vICAgZW50cnksIGV4cHJlc3NlZCBhcyBhIGRvdWJsZSBpbiB0aGUgcmFuZ2Ugb2YgMCB0byAxMDArLiBBIHZhbHVlIG9mIDEwMAorICAgICAgICAvLy8gICBpbmRpY2F0ZXMgbm8gY29tcHJlc3Npb24gYXQgYWxsLiAgSXQgY291bGQgYmUgaGlnaGVyIHRoYW4gMTAwIHdoZW4gdGhlCisgICAgICAgIC8vLyAgIGNvbXByZXNzaW9uIGFsZ29yaXRobSBhY3R1YWxseSBpbmZsYXRlcyB0aGUgZGF0YSwgYXMgbWF5IG9jY3VyIGZvciBzbWFsbAorICAgICAgICAvLy8gICBmaWxlcywgb3IgdW5jb21wcmVzc2libGUgZGF0YSB0aGF0IGlzIGVuY3J5cHRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgWW91IGNvdWxkIGZvcm1hdCBpdCBmb3IgcHJlc2VudGF0aW9uIHRvIGEgdXNlciB2aWEgYSBmb3JtYXQgc3RyaW5nIG9mCisgICAgICAgIC8vLyAgICJ7Myw1OkYwfSUiIHRvIHNlZSBpdCBhcyBhIHBlcmNlbnRhZ2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCB1bmNvbXByZXNzZWQgZmlsZSBpcyAwLCBpbXBseWluZyBhCisgICAgICAgIC8vLyAgIGRlbm9taW5hdG9yIG9mIDAsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB6ZXJvLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IGlzIHZhbGlkIGFmdGVyIHJlYWRpbmcgaW4gYW4gZXhpc3RpbmcgemlwIGZpbGUsIG9yIGFmdGVyCisgICAgICAgIC8vLyAgIHNhdmluZyB0aGUgPGM+WmlwRmlsZTwvYz4gdGhhdCBjb250YWlucyB0aGUgWmlwRW50cnkuIFlvdSBjYW5ub3Qga25vdyB0aGUKKyAgICAgICAgLy8vICAgZWZmZWN0IG9mIGEgY29tcHJlc3Npb24gdHJhbnNmb3JtIHVudGlsIHlvdSB0cnkgaXQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgRG91YmxlIENvbXByZXNzaW9uUmF0aW8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFVuY29tcHJlc3NlZFNpemUgPT0gMCkgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwMCAqICgxLjAgLSAoMS4wICogQ29tcHJlc3NlZFNpemUpIC8gKDEuMCAqIFVuY29tcHJlc3NlZFNpemUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSAzMi1iaXQgQ1JDIChDeWNsaWMgUmVkdW5kYW5jeSBDaGVjaykgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBaaXBFbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4gWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY29uY2VybiB5b3Vyc2VsZiB3aXRoIHRoaXMuIEl0IGlzIHVzZWQKKyAgICAgICAgLy8vIGludGVybmFsbHkgYnkgRG90TmV0WmlwIHRvIHZlcmlmeSBmaWxlcyBvciBzdHJlYW1zIHVwb24gZXh0cmFjdGlvbi4gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4gVGhlIHZhbHVlIGlzIGEgPHNlZSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NSQzMyIj4zMi1iaXQKKyAgICAgICAgLy8vIENSQzwvc2VlPiB1c2luZyAweEVEQjg4MzIwIGZvciB0aGUgcG9seW5vbWlhbC4gVGhpcyBpcyB0aGUgc2FtZSBDUkMtMzIgdXNlZCBpbgorICAgICAgICAvLy8gUE5HLCBNUEVHLTIsIGFuZCBvdGhlciBwcm90b2NvbHMgYW5kIGZvcm1hdHMuICBJdCBpcyBhIHJlYWQtb25seSBwcm9wZXJ0eTsgd2hlbgorICAgICAgICAvLy8gY3JlYXRpbmcgYSBaaXAgYXJjaGl2ZSwgdGhlIENSQyBmb3IgZWFjaCBlbnRyeSBpcyBzZXQgb25seSBhZnRlciBhIGNhbGwgdG8KKyAgICAgICAgLy8vIDxjPlNhdmUoKTwvYz4gb24gdGhlIGNvbnRhaW5pbmcgWmlwRmlsZS4gV2hlbiByZWFkaW5nIGFuIGV4aXN0aW5nIHppcCBmaWxlLCB0aGUgdmFsdWUKKyAgICAgICAgLy8vIG9mIHRoaXMgcHJvcGVydHkgcmVmbGVjdHMgdGhlIHN0b3JlZCBDUkMgZm9yIHRoZSBlbnRyeS4gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBJbnQzMiBDcmMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9DcmMzMjsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnkgKG5vdCBhIGZpbGUpLgorICAgICAgICAvLy8gVGhpcyBpcyBhIHJlYWRvbmx5IHByb3BlcnR5IG9uIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgSXNEaXJlY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9Jc0RpcmVjdG9yeTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBkZXJpdmVkIHByb3BlcnR5IHRoYXQgaXMgPGM+dHJ1ZTwvYz4gaWYgdGhlIGVudHJ5IHVzZXMgZW5jcnlwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGlzIGEgcmVhZG9ubHkgcHJvcGVydHkgb24gdGhlIGVudHJ5LiAgV2hlbiByZWFkaW5nIGEgemlwIGZpbGUsCisgICAgICAgIC8vLyAgIHRoZSB2YWx1ZSBmb3IgdGhlIDxjPlppcEVudHJ5PC9jPiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhIHJlYWQKKyAgICAgICAgLy8vICAgZnJvbSB0aGUgemlwIGZpbGUuICBBZnRlciBzYXZpbmcgYSBaaXBGaWxlLCB0aGUgdmFsdWUgb2YgdGhpcworICAgICAgICAvLy8gICBwcm9wZXJ0eSBmb3IgZWFjaCA8Yz5aaXBFbnRyeTwvYz4gaW5kaWNhdGVzIHdoZXRoZXIgZW5jcnlwdGlvbiB3YXMKKyAgICAgICAgLy8vICAgYWN0dWFsbHkgdXNlZCAod2hpY2ggd2lsbCBoYXZlIGJlZW4gdHJ1ZSBpZiB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiB3YXMgc2V0IGFuZCB0aGUgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+IHByb3BlcnR5CisgICAgICAgIC8vLyAgIHdhcyBzb21ldGhpbmcgb3RoZXIgdGhhbiA8c2VlIGNyZWY9IkVuY3J5cHRpb25BbGdvcml0aG0uTm9uZSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGJvb2wgVXNlc0VuY3J5cHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIChfRW5jcnlwdGlvbl9Gcm9tWmlwRmlsZSAhPSBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmUpOyB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgU2V0IHRoaXMgdG8gc3BlY2lmeSB3aGljaCBlbmNyeXB0aW9uIGFsZ29yaXRobSB0byB1c2UgZm9yIHRoZSBlbnRyeSB3aGVuCisgICAgICAgIC8vLyAgIHNhdmluZyBpdCB0byBhIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZXQgdGhpcyBwcm9wZXJ0eSBpbiBvcmRlciB0byBlbmNyeXB0IHRoZSBlbnRyeSB3aGVuIHRoZSA8Yz5aaXBGaWxlPC9jPiBpcworICAgICAgICAvLy8gICBzYXZlZC4gV2hlbiBzZXR0aW5nIHRoaXMgcHJvcGVydHksIHlvdSBtdXN0IGFsc28gc2V0IGEgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiBvbiB0aGUgZW50cnkuICBJZiB5b3Ugc2V0IGEgdmFsdWUgb3RoZXIgdGhhbiA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkVuY3J5cHRpb25BbGdvcml0aG0uTm9uZSIvPiBvbiB0aGlzIHByb3BlcnR5IGFuZCBkbyBub3Qgc2V0IGEKKyAgICAgICAgLy8vICAgPGM+UGFzc3dvcmQ8L2M+IHRoZW4gdGhlIGVudHJ5IHdpbGwgbm90IGJlIGVuY3J5cHRlZC4gVGhlIDxjPlppcEVudHJ5PC9jPgorICAgICAgICAvLy8gICBkYXRhIGlzIGVuY3J5cHRlZCBhcyB0aGUgPGM+WmlwRmlsZTwvYz4gaXMgc2F2ZWQsIHdoZW4geW91IGNhbGwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBGaWxlLlNhdmUoKSIvPiBvciBvbmUgb2YgaXRzIGNvdXNpbnMgb24gdGhlIGNvbnRhaW5pbmcKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UuIFlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IHRoZSA8Yz5FbmNyeXB0aW9uPC9jPgorICAgICAgICAvLy8gICB3aGVuIGV4dHJhY3RpbmcgZW50cmllcyBmcm9tIGFuIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBaaXAgc3BlY2lmaWNhdGlvbiBmcm9tIFBLV2FyZSBkZWZpbmVzIGEgc2V0IG9mIGVuY3J5cHRpb24gYWxnb3JpdGhtcywKKyAgICAgICAgLy8vICAgYW5kIHRoZSBkYXRhIGZvcm1hdHMgZm9yIHRoZSB6aXAgYXJjaGl2ZSB0aGF0IHN1cHBvcnQgdGhlbSwgYW5kIFBLV2FyZQorICAgICAgICAvLy8gICBzdXBwb3J0cyB0aG9zZSBhbGdvcml0aG1zIGluIHRoZSB0b29scyBpdCBwcm9kdWNlcy4gT3RoZXIgdmVuZG9ycyBvZiB0b29scworICAgICAgICAvLy8gICBhbmQgbGlicmFyaWVzLCBzdWNoIGFzIFdpblppcCBvciBYY2VlZCwgdHlwaWNhbGx5IHN1cHBvcnQgPGVtPmEKKyAgICAgICAgLy8vICAgc3Vic2V0PC9lbT4gb2YgdGhlIGFsZ29yaXRobXMgc3BlY2lmaWVkIGJ5IFBLV2FyZS4gVGhlc2UgdG9vbHMgY2FuCisgICAgICAgIC8vLyAgIHNvbWV0aW1lcyBzdXBwb3J0IGFkZGl0aW9uYWwgZGlmZmVyZW50IGVuY3J5cHRpb24gYWxnb3JpdGhtcyBhbmQgZGF0YQorICAgICAgICAvLy8gICBmb3JtYXRzLCBub3Qgc3BlY2lmaWVkIGJ5IFBLV2FyZS4gVGhlIEFFUyBFbmNyeXB0aW9uIHNwZWNpZmllZCBhbmQKKyAgICAgICAgLy8vICAgc3VwcG9ydGVkIGJ5IFdpblppcCBpcyB0aGUgbW9zdCBwb3B1bGFyIGV4YW1wbGUuIFRoaXMgbGlicmFyeSBzdXBwb3J0cyBhCisgICAgICAgIC8vLyAgIHN1YnNldCBvZiB0aGUgY29tcGxldGUgc2V0IG9mIGFsZ29yaXRobXMgc3BlY2lmaWVkIGJ5IFBLV2FyZSBhbmQgb3RoZXIKKyAgICAgICAgLy8vICAgdmVuZG9ycy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlcmUgaXMgbm8gY29tbW9uLCB1YmlxdWl0b3VzIG11bHRpLXZlbmRvciBzdGFuZGFyZCBmb3Igc3Ryb25nIGVuY3J5cHRpb24KKyAgICAgICAgLy8vICAgd2l0aGluIHppcCBmaWxlcy4gVGhlcmUgaXMgYnJvYWQgc3VwcG9ydCBmb3Igc28tY2FsbGVkICJ0cmFkaXRpb25hbCIgWmlwCisgICAgICAgIC8vLyAgIGVuY3J5cHRpb24sIHNvbWV0aW1lcyBjYWxsZWQgWmlwIDIuMCBlbmNyeXB0aW9uLCBhcyA8c2VlCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPnNwZWNpZmllZAorICAgICAgICAvLy8gICBieSBQS1dhcmU8L3NlZT4sIGJ1dCB0aGlzIGVuY3J5cHRpb24gaXMgY29uc2lkZXJlZCB3ZWFrIGFuZAorICAgICAgICAvLy8gICBicmVha2FibGUuIFRoaXMgbGlicmFyeSBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIFppcCAyLjAgIndlYWsiIGVuY3J5cHRpb24sCisgICAgICAgIC8vLyAgIGFuZCBhbHNvIGEgc3Ryb25nZXIgV2luWmlwLWNvbXBhdGlibGUgQUVTIGVuY3J5cHRpb24sIHVzaW5nIGVpdGhlciAxMjgtYml0CisgICAgICAgIC8vLyAgIG9yIDI1Ni1iaXQga2V5IHN0cmVuZ3RoLiBJZiB5b3Ugd2FudCBEb3ROZXRaaXAgdG8gc3VwcG9ydCBhbiBhbGdvcml0aG0KKyAgICAgICAgLy8vICAgdGhhdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgY2FsbCB0aGUgYXV0aG9yIG9mIHRoaXMgbGlicmFyeSBhbmQgbWF5YmUKKyAgICAgICAgLy8vICAgd2UgY2FuIHRhbGsgYnVzaW5lc3MuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSA8c2VlIGNyZWY9IlppcEZpbGUiLz4gY2xhc3MgYWxzbyBoYXMgYSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEZpbGUuRW5jcnlwdGlvbiIvPiBwcm9wZXJ0eS4gIEluIG1vc3QgY2FzZXMgeW91IHdpbGwgdXNlCisgICAgICAgIC8vLyAgIDxlbT50aGF0PC9lbT4gcHJvcGVydHkgd2hlbiBzZXR0aW5nIGVuY3J5cHRpb24uIFRoaXMgcHJvcGVydHkgdGFrZXMKKyAgICAgICAgLy8vICAgcHJlY2VkZW5jZSBvdmVyIGFueSA8Yz5FbmNyeXB0aW9uPC9jPiBzZXQgb24gdGhlIDxjPlppcEZpbGU8L2M+IGl0c2VsZi4KKyAgICAgICAgLy8vICAgVHlwaWNhbGx5LCB5b3Ugd291bGQgdXNlIHRoZSBwZXItZW50cnkgRW5jcnlwdGlvbiB3aGVuIG1vc3QgZW50cmllcyBpbiB0aGUKKyAgICAgICAgLy8vICAgemlwIGFyY2hpdmUgdXNlIG9uZSBlbmNyeXB0aW9uIGFsZ29yaXRobSwgYW5kIGEgZmV3IGVudHJpZXMgdXNlIGEKKyAgICAgICAgLy8vICAgZGlmZmVyZW50IG9uZS4gIElmIGFsbCBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZSB1c2UgdGhlIHNhbWUgRW5jcnlwdGlvbiwKKyAgICAgICAgLy8vICAgdGhlbiBpdCBpcyBzaW1wbGVyIHRvIGp1c3Qgc2V0IHRoaXMgcHJvcGVydHkgb24gdGhlIFppcEZpbGUgaXRzZWxmLCB3aGVuCisgICAgICAgIC8vLyAgIGNyZWF0aW5nIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNvbWUgY29tbWVudHMgb24gdXBkYXRpbmcgYXJjaGl2ZXM6IElmIHlvdSByZWFkIGEgPGM+WmlwRmlsZTwvYz4sIHlvdSBjYW4KKyAgICAgICAgLy8vICAgbW9kaWZ5IHRoZSBFbmNyeXB0aW9uIG9uIGFuIGVuY3J5cHRlZCBlbnRyeTogeW91IGNhbiByZW1vdmUgZW5jcnlwdGlvbgorICAgICAgICAvLy8gICBmcm9tIGFuIGVudHJ5IHRoYXQgd2FzIGVuY3J5cHRlZDsgeW91IGNhbiBlbmNyeXB0IGFuIGVudHJ5IHRoYXQgd2FzIG5vdAorICAgICAgICAvLy8gICBlbmNyeXB0ZWQgcHJldmlvdXNseTsgb3IsIHlvdSBjYW4gY2hhbmdlIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4gIFRoZQorICAgICAgICAvLy8gICBjaGFuZ2VzIGluIGVuY3J5cHRpb24gYXJlIG5vdCBtYWRlIHBlcm1hbmVudCB1bnRpbCB5b3UgY2FsbCBTYXZlKCkgb24gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+LiAgVG8gZWZmZWN0IGNoYW5nZXMgaW4gZW5jcnlwdGlvbiwgdGhlIGVudHJ5IGNvbnRlbnQgaXMKKyAgICAgICAgLy8vICAgc3RyZWFtZWQgdGhyb3VnaCBzZXZlcmFsIHRyYW5zZm9ybWF0aW9ucywgZGVwZW5kaW5nIG9uIHRoZSBtb2RpZmljYXRpb24KKyAgICAgICAgLy8vICAgdGhlIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQuIEZvciBleGFtcGxlIGlmIHRoZSBlbnRyeSBpcyBub3QgZW5jcnlwdGVkCisgICAgICAgIC8vLyAgIGFuZCB0aGUgYXBwbGljYXRpb24gc2V0cyA8Yz5FbmNyeXB0aW9uPC9jPiB0byA8Yz5Qa3ppcFdlYWs8L2M+LCB0aGVuIGF0CisgICAgICAgIC8vLyAgIHRoZSB0aW1lIG9mIDxjPlNhdmUoKTwvYz4sIHRoZSBvcmlnaW5hbCBlbnRyeSBpcyByZWFkIGFuZCBkZWNvbXByZXNzZWQsCisgICAgICAgIC8vLyAgIHRoZW4gcmUtY29tcHJlc3NlZCBhbmQgZW5jcnlwdGVkLiAgQ29udmVyc2VseSwgaWYgdGhlIG9yaWdpbmFsIGVudHJ5IGlzCisgICAgICAgIC8vLyAgIGVuY3J5cHRlZCB3aXRoIDxjPlBremlwV2VhazwvYz4gZW5jcnlwdGlvbiwgYW5kIHRoZSBhcHBsaWNhdGlvbiBzZXRzIHRoZQorICAgICAgICAvLy8gICA8Yz5FbmNyeXB0aW9uPC9jPiBwcm9wZXJ0eSB0byA8Yz5XaW5aaXBBZXMxMjg8L2M+LCB0aGVuIGF0IHRoZSB0aW1lIG9mCisgICAgICAgIC8vLyAgIDxjPlNhdmUoKTwvYz4sIHRoZSBvcmlnaW5hbCBlbnRyeSBpcyBkZWNyeXB0ZWQgdmlhIFBLWklQIGVuY3J5cHRpb24gYW5kCisgICAgICAgIC8vLyAgIGRlY29tcHJlc3NlZCwgdGhlbiByZS1jb21wcmVzc2VkIGFuZCByZS1lbmNyeXB0ZWQgd2l0aCBBRVMuICBUaGlzIGFsbAorICAgICAgICAvLy8gICBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2l0aGluIHRoZSBsaWJyYXJ5LCBidXQgaXQgY2FuIGJlIHRpbWUtY29uc3VtaW5nIGZvcgorICAgICAgICAvLy8gICBsYXJnZSBlbnRyaWVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBZGRpdGlvbmFsbHksIHdoZW4gdXBkYXRpbmcgYXJjaGl2ZXMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlCisgICAgICAgIC8vLyAgIHBhc3N3b3JkIHdoZW4gY2hhbmdpbmcgdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtLiAgVG8gY2hhbmdlIGJvdGggdGhlCisgICAgICAgIC8vLyAgIGFsZ29yaXRobSBhbmQgdGhlIHBhc3N3b3JkLCB5b3UgbmVlZCB0byBTYXZlKCkgdGhlIHppcGZpbGUgdHdpY2UuICBGaXJzdAorICAgICAgICAvLy8gICBzZXQgdGhlIDxjPkVuY3J5cHRpb248L2M+IHRvIE5vbmUsIHRoZW4gY2FsbCA8Yz5TYXZlKCk8L2M+LiAgVGhlbiBzZXQgdGhlCisgICAgICAgIC8vLyAgIDxjPkVuY3J5cHRpb248L2M+IHRvIHRoZSBuZXcgdmFsdWUgKG5vdCAiTm9uZSIpLCB0aGVuIGNhbGwgPGM+U2F2ZSgpPC9jPgorICAgICAgICAvLy8gICBvbmNlIGFnYWluLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgV2luWmlwIEFFUyBlbmNyeXB0aW9uIGFsZ29yaXRobXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIC5ORVQgQ29tcGFjdAorICAgICAgICAvLy8gICBGcmFtZXdvcmsuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSB6aXAgYXJjaGl2ZSB0aGF0IHVzZXMgZW5jcnlwdGlvbiwgYW5kIHRoZW4gZXh0cmFjdHMKKyAgICAgICAgLy8vICAgZW50cmllcyBmcm9tIHRoZSBhcmNoaXZlLiAgV2hlbiBjcmVhdGluZyB0aGUgemlwIGFyY2hpdmUsIHRoZSBSZWFkTWUudHh0CisgICAgICAgIC8vLyAgIGZpbGUgaXMgemlwcGVkIHdpdGhvdXQgdXNpbmcgYSBwYXNzd29yZCBvciBlbmNyeXB0aW9uLiAgVGhlIG90aGVyIGZpbGUKKyAgICAgICAgLy8vICAgdXNlcyBlbmNyeXB0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyAvLyBDcmVhdGUgYSB6aXAgYXJjaGl2ZSB3aXRoIEFFUyBFbmNyeXB0aW9uLgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZSgiUmVhZE1lLnR4dCIpCisgICAgICAgIC8vLyAgICAgWmlwRW50cnkgZTE9IHppcC5BZGRGaWxlKCIyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiKTsKKyAgICAgICAgLy8vICAgICBlMS5FbmNyeXB0aW9uPSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NjsKKyAgICAgICAgLy8vICAgICBlMS5QYXNzd29yZD0gIlRvcC5TZWNyZXQuTm8uUGVla2luZyEiOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIC8vIEV4dHJhY3QgYSB6aXAgYXJjaGl2ZSB0aGF0IHVzZXMgQUVTIEVuY3J5cHRpb24uCisgICAgICAgIC8vLyAvLyBZb3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSB0aGUgYWxnb3JpdGhtIGR1cmluZyBleHRyYWN0aW9uLgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gWmlwRmlsZS5SZWFkKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIC8vIFNwZWNpZnkgdGhlIHBhc3N3b3JkIHRoYXQgaXMgdXNlZCBkdXJpbmcgZXh0cmFjdGlvbiwgZm9yCisgICAgICAgIC8vLyAgICAgLy8gYWxsIGVudHJpZXMgdGhhdCByZXF1aXJlIGEgcGFzc3dvcmQ6CisgICAgICAgIC8vLyAgICAgemlwLlBhc3N3b3JkPSAiVG9wLlNlY3JldC5Oby5QZWVraW5nISI7CisgICAgICAgIC8vLyAgICAgemlwLkV4dHJhY3RBbGwoImV4dHJhY3REaXJlY3RvcnkiKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyAnIENyZWF0ZSBhIHppcCB0aGF0IHVzZXMgRW5jcnlwdGlvbi4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBOZXcgWmlwRmlsZSgpCisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoIlJlYWRNZS50eHQiKQorICAgICAgICAvLy8gICAgIERpbSBlMSBhcyBaaXBFbnRyeQorICAgICAgICAvLy8gICAgIGUxPSB6aXAuQWRkRmlsZSgiMjAwOC1SZWdpb25hbC1TYWxlcy1SZXBvcnQucGRmIikKKyAgICAgICAgLy8vICAgICBlMS5FbmNyeXB0aW9uPSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NgorICAgICAgICAvLy8gICAgIGUxLlBhc3N3b3JkPSAiVG9wLlNlY3JldC5Oby5QZWVraW5nISIKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSgiRW5jcnlwdGVkQXJjaGl2ZS56aXAiKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLworICAgICAgICAvLy8gJyBFeHRyYWN0IGEgemlwIGFyY2hpdmUgdGhhdCB1c2VzIEFFUyBFbmNyeXB0aW9uLgorICAgICAgICAvLy8gJyBZb3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSB0aGUgYWxnb3JpdGhtIGR1cmluZyBleHRyYWN0aW9uLgorICAgICAgICAvLy8gVXNpbmcgKHppcCBhcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpKQorICAgICAgICAvLy8gICAgICcgU3BlY2lmeSB0aGUgcGFzc3dvcmQgdGhhdCBpcyB1c2VkIGR1cmluZyBleHRyYWN0aW9uLCBmb3IKKyAgICAgICAgLy8vICAgICAnIGFsbCBlbnRyaWVzIHRoYXQgcmVxdWlyZSBhIHBhc3N3b3JkOgorICAgICAgICAvLy8gICAgIHppcC5QYXNzd29yZD0gIlRvcC5TZWNyZXQuTm8uUGVla2luZyEiCisgICAgICAgIC8vLyAgICAgemlwLkV4dHJhY3RBbGwoImV4dHJhY3REaXJlY3RvcnkiKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPgorICAgICAgICAvLy8gVGhyb3duIGluIHRoZSBzZXR0ZXIgaWYgRW5jcnlwdGlvbkFsZ29yaXRobS5VbnN1cHBvcnRlZCBpcyBzcGVjaWZpZWQuCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRW50cnkuUGFzc3dvcmQiPlppcEVudHJ5LlBhc3N3b3JkPC9zZWVhbHNvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuRW5jcnlwdGlvbiI+WmlwRmlsZS5FbmNyeXB0aW9uPC9zZWVhbHNvPgorICAgICAgICBpbnRlcm5hbCBFbmNyeXB0aW9uQWxnb3JpdGhtIEVuY3J5cHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9FbmNyeXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IF9FbmNyeXB0aW9uKSByZXR1cm47IC8vIG5vIGNoYW5nZQorCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IEVuY3J5cHRpb25BbGdvcml0aG0uVW5zdXBwb3J0ZWQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbWF5IG5vdCBzZXQgRW5jcnlwdGlvbiB0byB0aGF0IHZhbHVlLiIpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBpcyBhIHppcCBhcmNoaXZlIGFuZCB0aGVyZSB3YXMgZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBlbnRyeSwgdGhpcyB3aWxsIG5vdCB3b3JrLiA8WFhYPgorICAgICAgICAgICAgICAgIC8vaWYgKHRoaXMuX1NvdXJjZSA9PSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlICYmIF9zb3VyY2VJc0VuY3J5cHRlZCkKKyAgICAgICAgICAgICAgICAvLyAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IGNhbm5vdCBjaGFuZ2UgdGhlIGVuY3J5cHRpb24gbWV0aG9kIG9uIGVuY3J5cHRlZCBlbnRyaWVzIHJlYWQgZnJvbSBhcmNoaXZlcy4iKTsKKworICAgICAgICAgICAgICAgIF9FbmNyeXB0aW9uID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX3Jlc3RyZWFtUmVxdWlyZWRPblNhdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChfY29udGFpbmVyLlppcEZpbGUhPW51bGwpCisgICAgICAgICAgICAgICAgICAgIF9jb250YWluZXIuWmlwRmlsZS5Ob3RpZnlFbnRyeUNoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFBhc3N3b3JkIHRvIGJlIHVzZWQgd2hlbiBlbmNyeXB0aW5nIGEgPGM+WmlwRW50cnk8L2M+IHVwb24KKyAgICAgICAgLy8vIDxjPlppcEZpbGUuU2F2ZSgpPC9jPiwgb3Igd2hlbiBkZWNyeXB0aW5nIGFuIGVudHJ5IHVwb24gRXh0cmFjdCgpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgaXMgYSB3cml0ZS1vbmx5IHByb3BlcnR5IG9uIHRoZSBlbnRyeS4gU2V0IHRoaXMgdG8gcmVxdWVzdCB0aGF0IHRoZQorICAgICAgICAvLy8gICBlbnRyeSBiZSBlbmNyeXB0ZWQgd2hlbiB3cml0aW5nIHRoZSB6aXAgYXJjaGl2ZSwgb3Igc2V0IGl0IHRvIHNwZWNpZnkgdGhlCisgICAgICAgIC8vLyAgIHBhc3N3b3JkIHRvIGJlIHVzZWQgd2hlbiBleHRyYWN0aW5nIGFuIGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgZW5jcnlwdGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgcGFzc3dvcmQgc2V0IGhlcmUgaXMgaW1wbGljaXRseSB1c2VkIHRvIGVuY3J5cHQgdGhlIGVudHJ5IGR1cmluZyB0aGUKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBGaWxlLlNhdmUoKSIvPiBvcGVyYXRpb24sIG9yIHRvIGRlY3J5cHQgZHVyaW5nIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkV4dHJhY3QoKSIvPiBvciA8c2VlIGNyZWY9Ik9wZW5SZWFkZXIoKSIvPiBvcGVyYXRpb24uICBJZiB5b3Ugc2V0CisgICAgICAgIC8vLyAgIHRoZSBQYXNzd29yZCBvbiBhIDxjPlppcEVudHJ5PC9jPiBhZnRlciBjYWxsaW5nIDxjPlNhdmUoKTwvYz4sIHRoZXJlIGlzIG5vCisgICAgICAgIC8vLyAgIGVmZmVjdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQ29uc2lkZXIgc2V0dGluZyB0aGUgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+IHByb3BlcnR5IHdoZW4gdXNpbmcgYQorICAgICAgICAvLy8gICBwYXNzd29yZC4gQW5zd2VyaW5nIGNvbmNlcm5zIHRoYXQgdGhlIHN0YW5kYXJkIHBhc3N3b3JkIHByb3RlY3Rpb24KKyAgICAgICAgLy8vICAgc3VwcG9ydGVkIGJ5IGFsbCB6aXAgdG9vbHMgaXMgd2VhaywgV2luWmlwIGhhcyBleHRlbmRlZCB0aGUgWklQCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gd2l0aCBhIHdheSB0byB1c2UgQUVTIEVuY3J5cHRpb24gdG8gcHJvdGVjdCBlbnRyaWVzIGluIHRoZQorICAgICAgICAvLy8gICBaaXAgZmlsZS4gVW5saWtlIHRoZSAiUEtaSVAgMi4wIiBlbmNyeXB0aW9uIHNwZWNpZmllZCBpbiB0aGUgUEtaSVAKKyAgICAgICAgLy8vICAgc3BlY2lmaWNhdGlvbiwgPHNlZSBocmVmPQorICAgICAgICAvLy8gICAiaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BZHZhbmNlZF9FbmNyeXB0aW9uX1N0YW5kYXJkIj5BRVMKKyAgICAgICAgLy8vICAgRW5jcnlwdGlvbjwvc2VlPiB1c2VzIGEgc3RhbmRhcmQsIHN0cm9uZywgdGVzdGVkLCBlbmNyeXB0aW9uCisgICAgICAgIC8vLyAgIGFsZ29yaXRobS4gRG90TmV0WmlwIGNhbiBjcmVhdGUgemlwIGFyY2hpdmVzIHRoYXQgdXNlIFdpblppcC1jb21wYXRpYmxlCisgICAgICAgIC8vLyAgIEFFUyBlbmNyeXB0aW9uLCBpZiB5b3Ugc2V0IHRoZSA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4gcHJvcGVydHkuIEJ1dCwKKyAgICAgICAgLy8vICAgYXJjaGl2ZXMgY3JlYXRlZCB0aGF0IHVzZSBBRVMgZW5jcnlwdGlvbiBtYXkgbm90IGJlIHJlYWRhYmxlIGJ5IGFsbCBvdGhlcgorICAgICAgICAvLy8gICB0b29scyBhbmQgbGlicmFyaWVzLiBGb3IgZXhhbXBsZSwgV2luZG93cyBFeHBsb3JlciBjYW5ub3QgcmVhZCBhCisgICAgICAgIC8vLyAgICJjb21wcmVzc2VkIGZvbGRlciIgKGEgemlwIGZpbGUpIHRoYXQgdXNlcyBBRVMgZW5jcnlwdGlvbiwgdGhvdWdoIGl0IGNhbgorICAgICAgICAvLy8gICByZWFkIGEgemlwIGZpbGUgdGhhdCB1c2VzICJQS1pJUCBlbmNyeXB0aW9uLiIKKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIDxzZWUgY3JlZj0iWmlwRmlsZSIvPiBjbGFzcyBhbHNvIGhhcyBhIDxzZWUgY3JlZj0iWmlwRmlsZS5QYXNzd29yZCIvPgorICAgICAgICAvLy8gICBwcm9wZXJ0eS4gIFRoaXMgcHJvcGVydHkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGFueSBwYXNzd29yZCBzZXQgb24gdGhlCisgICAgICAgIC8vLyAgIFppcEZpbGUgaXRzZWxmLiAgVHlwaWNhbGx5LCB5b3Ugd291bGQgdXNlIHRoZSBwZXItZW50cnkgUGFzc3dvcmQgd2hlbiBtb3N0CisgICAgICAgIC8vLyAgIGVudHJpZXMgaW4gdGhlIHppcCBhcmNoaXZlIHVzZSBvbmUgcGFzc3dvcmQsIGFuZCBhIGZldyBlbnRyaWVzIHVzZSBhCisgICAgICAgIC8vLyAgIGRpZmZlcmVudCBwYXNzd29yZC4gIElmIGFsbCBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZSB1c2UgdGhlIHNhbWUgcGFzc3dvcmQsCisgICAgICAgIC8vLyAgIHRoZW4gaXQgaXMgc2ltcGxlciB0byBqdXN0IHNldCB0aGlzIHByb3BlcnR5IG9uIHRoZSBaaXBGaWxlIGl0c2VsZiwKKyAgICAgICAgLy8vICAgd2hldGhlciBjcmVhdGluZyBhIHppcCBhcmNoaXZlIG9yIGV4dHJhY3RpbmcgYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU29tZSBjb21tZW50cyBvbiB1cGRhdGluZyBhcmNoaXZlczogSWYgeW91IHJlYWQgYSA8Yz5aaXBGaWxlPC9jPiwgeW91CisgICAgICAgIC8vLyAgIGNhbm5vdCBtb2RpZnkgdGhlIHBhc3N3b3JkIG9uIGFueSBlbmNyeXB0ZWQgZW50cnksIGV4Y2VwdCBieSBleHRyYWN0aW5nCisgICAgICAgIC8vLyAgIHRoZSBlbnRyeSB3aXRoIHRoZSBvcmlnaW5hbCBwYXNzd29yZCAoaWYgYW55KSwgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsIGVudHJ5CisgICAgICAgIC8vLyAgIHZpYSA8c2VlIGNyZWY9IlppcEZpbGUuUmVtb3ZlRW50cnkoWmlwRW50cnkpIi8+LCBhbmQgdGhlbiBhZGRpbmcgYSBuZXcKKyAgICAgICAgLy8vICAgZW50cnkgd2l0aCBhIG5ldyBQYXNzd29yZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IHJlYWQgYSA8Yz5aaXBGaWxlPC9jPiwgYW5kIHRoZXJlIGlzIGFuIGVuY3J5cHRlZAorICAgICAgICAvLy8gICBlbnRyeS4gIFNldHRpbmcgdGhlIFBhc3N3b3JkIHByb3BlcnR5IG9uIHRoYXQgPGM+WmlwRW50cnk8L2M+IGFuZCB0aGVuCisgICAgICAgIC8vLyAgIGNhbGxpbmcgPGM+U2F2ZSgpPC9jPiBvbiB0aGUgPGM+WmlwRmlsZTwvYz4gZG9lcyBub3QgdXBkYXRlIHRoZSBwYXNzd29yZAorICAgICAgICAvLy8gICBvbiB0aGF0IGVudHJ5IGluIHRoZSBhcmNoaXZlLiAgTmVpdGhlciBpcyBhbiBleGNlcHRpb24gdGhyb3duLiBJbnN0ZWFkLAorICAgICAgICAvLy8gICB3aGF0IGhhcHBlbnMgZHVyaW5nIHRoZSA8Yz5TYXZlKCk8L2M+IGlzIHRoZSBleGlzdGluZyBlbnRyeSBpcyBjb3BpZWQKKyAgICAgICAgLy8vICAgdGhyb3VnaCB0byB0aGUgbmV3IHppcCBhcmNoaXZlLCBpbiBpdHMgb3JpZ2luYWwgZW5jcnlwdGVkIGZvcm0uIFVwb24KKyAgICAgICAgLy8vICAgcmUtcmVhZGluZyB0aGF0IGFyY2hpdmUsIHRoZSBlbnRyeSBjYW4gYmUgZGVjcnlwdGVkIHdpdGggaXRzIG9yaWdpbmFsCisgICAgICAgIC8vLyAgIHBhc3N3b3JkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3UgcmVhZCBhIFppcEZpbGUsIGFuZCB0aGVyZSBpcyBhbiB1bi1lbmNyeXB0ZWQgZW50cnksIHlvdSBjYW4gc2V0IHRoZQorICAgICAgICAvLy8gICA8Yz5QYXNzd29yZDwvYz4gb24gdGhlIGVudHJ5IGFuZCB0aGVuIGNhbGwgU2F2ZSgpIG9uIHRoZSBaaXBGaWxlLCBhbmQgZ2V0CisgICAgICAgIC8vLyAgIGVuY3J5cHRpb24gb24gdGhhdCBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSB6aXAgZmlsZSB3aXRoIHR3byBlbnRyaWVzLCBhbmQgdGhlbiBleHRyYWN0cyB0aGUKKyAgICAgICAgLy8vICAgZW50cmllcyBmcm9tIHRoZSB6aXAgZmlsZS4gIFdoZW4gY3JlYXRpbmcgdGhlIHppcCBmaWxlLCB0aGUgdHdvIGZpbGVzIGFyZQorICAgICAgICAvLy8gICBhZGRlZCB0byB0aGUgemlwIGZpbGUgdXNpbmcgcGFzc3dvcmQgcHJvdGVjdGlvbi4gRWFjaCBlbnRyeSB1c2VzIGEKKyAgICAgICAgLy8vICAgZGlmZmVyZW50IHBhc3N3b3JkLiAgRHVyaW5nIGV4dHJhY3Rpb24sIGVhY2ggZmlsZSBpcyBleHRyYWN0ZWQgd2l0aCB0aGUKKyAgICAgICAgLy8vICAgYXBwcm9wcmlhdGUgcGFzc3dvcmQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIC8vIGNyZWF0ZSBhIGZpbGUgd2l0aCBlbmNyeXB0aW9uCisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIFppcEVudHJ5IGVudHJ5OworICAgICAgICAvLy8gICAgIGVudHJ5PSB6aXAuQWRkRmlsZSgiRGVjbGFyYXRpb24udHh0Iik7CisgICAgICAgIC8vLyAgICAgZW50cnkuUGFzc3dvcmQ9ICIxMjM0NTYhIjsKKyAgICAgICAgLy8vICAgICBlbnRyeSA9IHppcC5BZGRGaWxlKCJSZXBvcnQueGxzIik7CisgICAgICAgIC8vLyAgICAgZW50cnkuUGFzc3dvcmQ9ICIxU2VjcmV0ISI7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoIkVuY3J5cHRlZEFyY2hpdmUuemlwIik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gLy8gZXh0cmFjdCBlbnRyaWVzIHRoYXQgdXNlIGVuY3J5cHRpb24KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCgiRW5jcnlwdGVkQXJjaGl2ZS56aXAiKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICBaaXBFbnRyeSBlbnRyeTsKKyAgICAgICAgLy8vICAgICBlbnRyeSA9IHppcFsiRGVjbGFyYXRpb24udHh0Il07CisgICAgICAgIC8vLyAgICAgZW50cnkuUGFzc3dvcmQgPSAiMTIzNDU2ISI7CisgICAgICAgIC8vLyAgICAgZW50cnkuRXh0cmFjdCgiZXh0cmFjdERpciIpOworICAgICAgICAvLy8gICAgIGVudHJ5ID0gemlwWyJSZXBvcnQueGxzIl07CisgICAgICAgIC8vLyAgICAgZW50cnkuUGFzc3dvcmQgPSAiMVNlY3JldCEiOworICAgICAgICAvLy8gICAgIGVudHJ5LkV4dHJhY3QoImV4dHJhY3REaXIiKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIE5ldyBaaXBGaWxlCisgICAgICAgIC8vLyAgICAgRGltIGVudHJ5IGFzIFppcEVudHJ5CisgICAgICAgIC8vLyAgICAgZW50cnk9IHppcC5BZGRGaWxlKCJEZWNsYXJhdGlvbi50eHQiKQorICAgICAgICAvLy8gICAgIGVudHJ5LlBhc3N3b3JkPSAiMTIzNDU2ISIKKyAgICAgICAgLy8vICAgICBlbnRyeSA9IHppcC5BZGRGaWxlKCJSZXBvcnQueGxzIikKKyAgICAgICAgLy8vICAgICBlbnRyeS5QYXNzd29yZD0gIjFTZWNyZXQhIgorICAgICAgICAvLy8gICAgIHppcC5TYXZlKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8gJyBleHRyYWN0IGVudHJpZXMgdGhhdCB1c2UgZW5jcnlwdGlvbgorICAgICAgICAvLy8gVXNpbmcgKHppcCBhcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpKQorICAgICAgICAvLy8gICAgIERpbSBlbnRyeSBhcyBaaXBFbnRyeQorICAgICAgICAvLy8gICAgIGVudHJ5ID0gemlwKCJEZWNsYXJhdGlvbi50eHQiKQorICAgICAgICAvLy8gICAgIGVudHJ5LlBhc3N3b3JkID0gIjEyMzQ1NiEiCisgICAgICAgIC8vLyAgICAgZW50cnkuRXh0cmFjdCgiZXh0cmFjdERpciIpCisgICAgICAgIC8vLyAgICAgZW50cnkgPSB6aXAoIlJlcG9ydC54bHMiKQorICAgICAgICAvLy8gICAgIGVudHJ5LlBhc3N3b3JkID0gIjFTZWNyZXQhIgorICAgICAgICAvLy8gICAgIGVudHJ5LkV4dHJhY3QoImV4dHJhY3REaXIiKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRW50cnkuRW5jcnlwdGlvbiIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuUGFzc3dvcmQiPlppcEZpbGUuUGFzc3dvcmQ8L3NlZWFsc28+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgUGFzc3dvcmQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX1Bhc3N3b3JkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKF9QYXNzd29yZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0VuY3J5cHRpb24gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHNldHRpbmcgYSBub24tbnVsbCBwYXNzd29yZC4KKworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZW50cmllcyBvYnRhaW5lZCBmcm9tIGEgemlwIGZpbGUgdGhhdCBhcmUgZW5jcnlwdGVkLCB3ZSBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGx5IHJlc3RyZWFtIChyZWNvbXByZXNzLCByZS1lbmNyeXB0KSB0aGUgZmlsZSBkYXRhLCBiZWNhdXNlIHdlCisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdGhlIG9sZCBwYXNzd29yZCBpbiBvcmRlciB0byBkZWNyeXB0IHRoZSBkYXRhLCBhbmQgdGhlbiB3ZQorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRoZSBuZXcgcGFzc3dvcmQgdG8gZW5jcnlwdC4gIFNvLCBzZXR0aW5nIHRoZSBwYXNzd29yZCBpcworICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBnb2luZyB0byB3b3JrIG9uIGFuIGVudHJ5IHRoYXQgaXMgc3RvcmVkIGVuY3J5cHRlZCBpbiBhIHppcGZpbGUuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGl0IGlzIG5vdCBlbiBlcnJvciB0byBzZXQgdGhlIHBhc3N3b3JkLCBvYnZpb3VzbHk6IGNhbGxlcnMgd2lsbAorICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHBhc3N3b3JkIGluIG9yZGVyIHRvIEV4dHJhY3QgZW5jcnlwdGVkIGFyY2hpdmVzLgorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgaXMgYSB6aXAgYXJjaGl2ZSBhbmQgdGhlcmUgd2FzIHByZXZpb3VzbHkgbm8gZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBvbiB0aGUgZW50cnksIHRoZW4gd2UgbXVzdCByZS1zdHJlYW0gdGhlIGVudHJ5IGluIG9yZGVyIHRvIGVuY3J5cHQgaXQuCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Tb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwRmlsZSAmJiAhX3NvdXJjZUlzRW5jcnlwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3RyZWFtUmVxdWlyZWRPblNhdmUgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChFbmNyeXB0aW9uID09IEVuY3J5cHRpb25BbGdvcml0aG0uTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX0VuY3J5cHRpb24gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLlBremlwV2VhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgZ2V0IHsgcmV0dXJuIF9QYXNzd29yZDsgfQorICAgICAgICB9CisKKworCisgICAgICAgIGludGVybmFsIGJvb2wgSXNDaGFuZ2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcmVzdHJlYW1SZXF1aXJlZE9uU2F2ZSB8IF9tZXRhZGF0YUNoYW5nZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBhY3Rpb24gdGhlIGxpYnJhcnkgc2hvdWxkIHRha2Ugd2hlbiBleHRyYWN0aW5nIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGlzIHByb3BlcnR5IGFmZmVjdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBFeHRyYWN0IG1ldGhvZHMgKG9uZSBvZiB0aGUKKyAgICAgICAgLy8vICAgICA8Yz5FeHRyYWN0KCk8L2M+IG9yIDxjPkV4dHJhY3RXaXRoUGFzc3dvcmQoKTwvYz4gb3ZlcmxvYWRzKSwgd2hlbgorICAgICAgICAvLy8gICAgIGV4dHJhY3Rpb24gd291bGQgd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGVzeXN0ZW0gZmlsZS4gSWYgeW91IGRvCisgICAgICAgIC8vLyAgICAgbm90IHNldCB0aGlzIHByb3BlcnR5LCB0aGUgbGlicmFyeSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gZXh0cmFjdGluZworICAgICAgICAvLy8gICAgIGFuIGVudHJ5IHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGlzIHByb3BlcnR5IGhhcyBubyBlZmZlY3Qgd2hlbiBleHRyYWN0aW5nIHRvIGEgc3RyZWFtLCBvciB3aGVuIHRoZSBmaWxlIHRvIGJlCisgICAgICAgIC8vLyAgICAgZXh0cmFjdGVkIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5FeHRyYWN0RXhpc3RpbmdGaWxlIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gc2V0IHRoZSA8Yz5FeHRyYWN0RXhpc3RpbmdGaWxlPC9jPiBwcm9wZXJ0eSBpbgorICAgICAgICAvLy8gICBhbiA8Yz5FeHRyYWN0UHJvZ3Jlc3M8L2M+IGV2ZW50LCBpbiByZXNwb25zZSB0byB1c2VyIGlucHV0LiBUaGUKKyAgICAgICAgLy8vICAgPGM+RXh0cmFjdFByb2dyZXNzPC9jPiBldmVudCBpcyBpbnZva2VkIGlmIGFuZCBvbmx5IGlmIHRoZQorICAgICAgICAvLy8gICA8Yz5FeHRyYWN0RXhpc3RpbmdGaWxlPC9jPiBwcm9wZXJ0eSB3YXMgcHJldmlvdXNseSBzZXQgdG8KKyAgICAgICAgLy8vICAgPGM+RXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5JbnZva2VFeHRyYWN0UHJvZ3Jlc3NFdmVudDwvYz4uCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyBwdWJsaWMgc3RhdGljIHZvaWQgRXh0cmFjdFByb2dyZXNzKG9iamVjdCBzZW5kZXIsIEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyBlKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGlmIChlLkV2ZW50VHlwZSA9PSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0JlZm9yZUV4dHJhY3RFbnRyeSkKKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImV4dHJhY3QgezB9ICIsIGUuQ3VycmVudEVudHJ5LkZpbGVOYW1lKTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgZWxzZSBpZiAoZS5FdmVudFR5cGUgPT0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19FeHRyYWN0RW50cnlXb3VsZE92ZXJ3cml0ZSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gZS5DdXJyZW50RW50cnk7CisgICAgICAgIC8vLyAgICAgICAgIHN0cmluZyByZXNwb25zZSA9IG51bGw7CisgICAgICAgIC8vLyAgICAgICAgIC8vIEFzayB0aGUgdXNlciBpZiBoZSB3YW50cyBvdmVyd3JpdGUgdGhlIGZpbGUKKyAgICAgICAgLy8vICAgICAgICAgZG8KKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiT3ZlcndyaXRlIHswfSBpbiB7MX0gPyAoeS9uL0MpICIsIGVudHJ5LkZpbGVOYW1lLCBlLkV4dHJhY3RMb2NhdGlvbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICByZXNwb25zZSA9IENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICB9IHdoaWxlIChyZXNwb25zZSAhPSBudWxsICZhbXA7JmFtcDsgcmVzcG9uc2VbMF0hPSdZJyAmYW1wOyZhbXA7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgIHJlc3BvbnNlWzBdIT0nTicgJmFtcDsmYW1wOyByZXNwb25zZVswXSE9J0MnKTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgICAgIGlmICAocmVzcG9uc2VbMF09PSdDJykKKyAgICAgICAgLy8vICAgICAgICAgICAgIGUuQ2FuY2VsID0gdHJ1ZTsKKyAgICAgICAgLy8vICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VbMF09PSdZJykKKyAgICAgICAgLy8vICAgICAgICAgICAgIGVudHJ5LkV4dHJhY3RFeGlzdGluZ0ZpbGUgPSBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLk92ZXJ3cml0ZVNpbGVudGx5OworICAgICAgICAvLy8gICAgICAgICBlbHNlCisgICAgICAgIC8vLyAgICAgICAgICAgICBlbnRyeS5FeHRyYWN0RXhpc3RpbmdGaWxlPSBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLkRvTm90T3ZlcndyaXRlOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgaW50ZXJuYWwgRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbiBFeHRyYWN0RXhpc3RpbmdGaWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgYWN0aW9uIHRvIHRha2Ugd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGlsZQorICAgICAgICAvLy8gICBvcGVuaW5nIG9yIHJlYWRpbmcgZmlsZXMgYXMgdGhleSBhcmUgc2F2ZWQgaW50byBhIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgIEVycm9ycyBjYW4gb2NjdXIgd2l0aGluIGEgY2FsbCB0byA8c2VlCisgICAgICAgIC8vLyAgICAgY3JlZj0iWmlwRmlsZS5TYXZlKCkiPlppcEZpbGUuU2F2ZTwvc2VlPiwgYXMgdGhlIHZhcmlvdXMgZmlsZXMgY29udGFpbmVkCisgICAgICAgIC8vLyAgICAgaW4gYSBaaXBGaWxlIGFyZSBiZWluZyBzYXZlZCBpbnRvIHRoZSB6aXAgYXJjaGl2ZS4gIER1cmluZyB0aGUKKyAgICAgICAgLy8vICAgICA8Yz5TYXZlPC9jPiwgRG90TmV0WmlwIHdpbGwgcGVyZm9ybSBhIDxjPkZpbGUuT3BlbjwvYz4gb24gdGhlIGZpbGUKKyAgICAgICAgLy8vICAgICBhc3NvY2lhdGVkIHRvIHRoZSBaaXBFbnRyeSwgYW5kIHRoZW4gd2lsbCByZWFkIHRoZSBlbnRpcmUgY29udGVudHMgb2YKKyAgICAgICAgLy8vICAgICB0aGUgZmlsZSBhcyBpdCBpcyB6aXBwZWQuIEVpdGhlciB0aGUgb3BlbiBvciB0aGUgUmVhZCBtYXkgZmFpbCwgYmVjYXVzZQorICAgICAgICAvLy8gICAgIG9mIGxvY2sgY29uZmxpY3RzIG9yIG90aGVyIHJlYXNvbnMuICBVc2luZyB0aGlzIHByb3BlcnR5LCB5b3UgY2FuCisgICAgICAgIC8vLyAgICAgc3BlY2lmeSB0aGUgYWN0aW9uIHRvIHRha2Ugd2hlbiBzdWNoIGVycm9ycyBvY2N1ci4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgIFR5cGljYWxseSB5b3Ugd2lsbCBOT1Qgc2V0IHRoaXMgcHJvcGVydHkgb24gaW5kaXZpZHVhbCBaaXBFbnRyeQorICAgICAgICAvLy8gICAgIGluc3RhbmNlcy4gIEluc3RlYWQsIHlvdSB3aWxsIHNldCB0aGUgPHNlZQorICAgICAgICAvLy8gICAgIGNyZWY9IlppcEZpbGUuWmlwRXJyb3JBY3Rpb24iPlppcEZpbGUuWmlwRXJyb3JBY3Rpb248L3NlZT4gcHJvcGVydHkgb24KKyAgICAgICAgLy8vICAgICB0aGUgWmlwRmlsZSBpbnN0YW5jZSwgYmVmb3JlIGFkZGluZyBhbnkgZW50cmllcyB0byB0aGUKKyAgICAgICAgLy8vICAgICA8Yz5aaXBGaWxlPC9jPi4gSWYgeW91IGRvIHRoaXMsIGVycm9ycyBlbmNvdW50ZXJlZCBvbiBiZWhhbGYgb2YgYW55IG9mCisgICAgICAgIC8vLyAgICAgdGhlIGVudHJpZXMgaW4gdGhlIFppcEZpbGUgd2lsbCBiZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgIEJ1dCwgaWYgeW91IHVzZSBhIDxzZWUgY3JlZj0iWmlwRmlsZS5aaXBFcnJvciIvPiBoYW5kbGVyLCB5b3Ugd2lsbCB3YW50CisgICAgICAgIC8vLyAgICAgdG8gc2V0IHRoaXMgcHJvcGVydHkgb24gdGhlIDxjPlppcEVudHJ5PC9jPiB3aXRoaW4gdGhlIGhhbmRsZXIsIHRvCisgICAgICAgIC8vLyAgICAgY29tbXVuaWNhdGUgYmFjayB0byBEb3ROZXRaaXAgd2hhdCB5b3Ugd291bGQgbGlrZSB0byBkbyB3aXRoIHRoZQorICAgICAgICAvLy8gICAgIHBhcnRpY3VsYXIgZXJyb3IuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlppcEVycm9yQWN0aW9uIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5aaXBFcnJvciIvPgorICAgICAgICBpbnRlcm5hbCBaaXBFcnJvckFjdGlvbiBaaXBFcnJvckFjdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyeSB3YXMgaW5jbHVkZWQgaW4gdGhlIG1vc3QgcmVjZW50IHNhdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIEFuIGVudHJ5IGNhbiBiZSBleGNsdWRlZCBvciBza2lwcGVkIGZyb20gYSBzYXZlIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICAgIC8vLyBvcGVuaW5nIG9yIHJlYWRpbmcgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBJbmNsdWRlZEluTW9zdFJlY2VudFNhdmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfc2tpcHBlZER1cmluZ1NhdmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQSBjYWxsYmFjayB0aGF0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc3BlY2lmeSB0aGUgY29tcHJlc3Npb24gdG8gdXNlCisgICAgICAgIC8vLyAgIGZvciBhIGdpdmVuIGVudHJ5IHRoYXQgaXMgYWJvdXQgdG8gYmUgYWRkZWQgdG8gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSA8c2VlIGNyZWY9IlppcEZpbGUuU2V0Q29tcHJlc3Npb24iIC8+CisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBTZXRDb21wcmVzc2lvbkNhbGxiYWNrIFNldENvbXByZXNzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNldCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHVzZSBVVEYtOCBlbmNvZGluZyBmb3IgZmlsZW5hbWVzIGFuZCBjb21tZW50cy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIGNvbW1lbnQgYW5kIGZpbGVuYW1lIGZvciB0aGUgZW50cnkgd2lsbCBiZQorICAgICAgICAvLy8gICBlbmNvZGVkIHdpdGggVVRGLTgsIGFzIGRlc2NyaWJlZCBpbiA8c2VlCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPnRoZSBaaXAKKyAgICAgICAgLy8vICAgc3BlY2lmaWNhdGlvbjwvc2VlPiwgaWYgbmVjZXNzYXJ5LiAiTmVjZXNzYXJ5IiBtZWFucywgdGhlIGZpbGVuYW1lIG9yCisgICAgICAgIC8vLyAgIGVudHJ5IGNvbW1lbnQgKGlmIGFueSkgY2Fubm90IGJlIHJlZmxleGl2ZWx5IGVuY29kZWQgYW5kIGRlY29kZWQgdXNpbmcgdGhlCisgICAgICAgIC8vLyAgIGRlZmF1bHQgY29kZSBwYWdlLCBJQk00MzcuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiB0byA8Yz5TeXN0ZW0uVGV4dC5FbmNvZGluZy5VVEY4PC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBmbGFnIGhhcyBubyBlZmZlY3Qgb3IgcmVsYXRpb24gdG8gdGhlIHRleHQgZW5jb2RpbmcgdXNlZCB3aXRoaW4gdGhlCisgICAgICAgIC8vLyAgIGZpbGUgaXRzZWxmLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgW09ic29sZXRlKCJCZWdpbm5pbmcgd2l0aCB2MS45LjEuNiBvZiBEb3ROZXRaaXAsIHRoaXMgcHJvcGVydHkgaXMgb2Jzb2xldGUuICBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gWW91ciBhcHBsaWNhdGlvbnMgc2hvdWxkICB1c2UgQWx0ZXJuYXRlRW5jb2RpbmcgYW5kIEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgaW5zdGVhZC4iKV0KKyAgICAgICAgcHVibGljIGJvb2wgVXNlVW5pY29kZUFzTmVjZXNzYXJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoQWx0ZXJuYXRlRW5jb2RpbmcgPT0gU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoIlVURi04IikpICYmCisgICAgICAgICAgICAgICAgICAgIChBbHRlcm5hdGVFbmNvZGluZ1VzYWdlID09IFppcE9wdGlvbi5Bc05lY2Vzc2FyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGVFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gWmlwT3B0aW9uLkFzTmVjZXNzYXJ5OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFsdGVybmF0ZUVuY29kaW5nID0gSW9uaWMuWmlwLlppcEZpbGUuRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gWmlwT3B0aW9uLk5ldmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIHRleHQgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgRmlsZU5hbWUgYW5kIENvbW1lbnQgb24gdGhpcyBaaXBFbnRyeSwKKyAgICAgICAgLy8vICAgd2hlbiB0aGUgZGVmYXVsdCBlbmNvZGluZyBpcyBpbnN1ZmZpY2llbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIERvbid0IHVzZSB0aGlzIHByb3BlcnR5LiAgU2VlIDxzZWUgY3JlZj0nQWx0ZXJuYXRlRW5jb2RpbmcnLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBbT2Jzb2xldGUoIlRoaXMgcHJvcGVydHkgaXMgb2Jzb2xldGUgc2luY2UgdjEuOS4xLjYuIFVzZSBBbHRlcm5hdGVFbmNvZGluZyBhbmQgQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSBpbnN0ZWFkLiIsIHRydWUpXQorICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7IHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgU3BlY2lmaWVzIHRoZSBhbHRlcm5hdGUgdGV4dCBlbmNvZGluZyB1c2VkIGJ5IHRoaXMgWmlwRW50cnkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGUgZGVmYXVsdCB0ZXh0IGVuY29kaW5nIHVzZWQgaW4gWmlwIGZpbGVzIGZvciBlbmNvZGluZyBmaWxlbmFtZXMgYW5kCisgICAgICAgIC8vLyAgICAgY29tbWVudHMgaXMgSUJNNDM3LCB3aGljaCBpcyBzb21ldGhpbmcgbGlrZSBhIHN1cGVyc2V0IG9mIEFTQ0lJLiAgSW4KKyAgICAgICAgLy8vICAgICBjYXNlcyB3aGVyZSB0aGlzIGlzIGluc3VmZmljaWVudCwgYXBwbGljYXRpb25zIGNhbiBzcGVjaWZ5IGFuCisgICAgICAgIC8vLyAgICAgYWx0ZXJuYXRlIGVuY29kaW5nLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFdoZW4gY3JlYXRpbmcgYSB6aXAgZmlsZSwgdGhlIHVzYWdlIG9mIHRoZSBhbHRlcm5hdGUgZW5jb2RpbmcgaXMKKyAgICAgICAgLy8vICAgICBnb3Zlcm5lZCBieSB0aGUgPHNlZSBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+IHByb3BlcnR5LgorICAgICAgICAvLy8gICAgIFR5cGljYWxseSB5b3Ugd291bGQgc2V0IGJvdGggcHJvcGVydGllcyB0byB0ZWxsIERvdE5ldFppcCB0byBlbXBsb3kgYW4KKyAgICAgICAgLy8vICAgICBlbmNvZGluZyB0aGF0IGlzIG5vdCBJQk00MzcgaW4gdGhlIHppcGZpbGUgeW91IGFyZSBjcmVhdGluZy4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBLZWVwIGluIG1pbmQgdGhhdCBiZWNhdXNlIHRoZSBaSVAgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgb25seQorICAgICAgICAvLy8gICAgIHZhbGlkIGVuY29kaW5ncyB0byB1c2UgYXJlIElCTTQzNyBhbmQgVVRGLTgsIGlmIHlvdSB1c2Ugc29tZXRoaW5nCisgICAgICAgIC8vLyAgICAgb3RoZXIgdGhhbiB0aGF0LCB0aGVuIHppcCB0b29scyBhbmQgbGlicmFyaWVzIG1heSBub3QgYmUgYWJsZSB0bworICAgICAgICAvLy8gICAgIHN1Y2Nlc3NmdWxseSByZWFkIHRoZSB6aXAgYXJjaGl2ZSB5b3UgZ2VuZXJhdGUuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhlIHppcCBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGFwcGxpY2F0aW9ucyBzaG91bGQgcHJlc3VtZSB0aGF0CisgICAgICAgIC8vLyAgICAgSUJNNDM3IGlzIGluIHVzZSwgZXhjZXB0IHdoZW4gYSBzcGVjaWFsIGJpdCBpcyBzZXQsIHdoaWNoIGluZGljYXRlcworICAgICAgICAvLy8gICAgIFVURi04LiBUaGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBhbiBhcmJpdHJhcnkgY29kZSBwYWdlLCB3aXRoaW4gdGhlCisgICAgICAgIC8vLyAgICAgemlwIGZpbGUgaXRzZWxmLiBXaGVuIHlvdSBjcmVhdGUgYSB6aXAgZmlsZSBlbmNvZGVkIHdpdGggZ2IyMzEyIG9yCisgICAgICAgIC8vLyAgICAgaWJtODYxIG9yIGFueXRoaW5nIG90aGVyIHRoYW4gSUJNNDM3IG9yIFVURi04LCB0aGVuIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAvLy8gICAgIHRoYXQgcmVhZHMgdGhlIHppcCBmaWxlIG5lZWRzIHRvICJrbm93IiB3aGljaCBjb2RlIHBhZ2UgdG8gdXNlLiBJbgorICAgICAgICAvLy8gICAgIHNvbWUgY2FzZXMsIHRoZSBjb2RlIHBhZ2UgdXNlZCB3aGVuIHJlYWRpbmcgaXMgY2hvc2VuIGltcGxpY2l0bHkuIEZvcgorICAgICAgICAvLy8gICAgIGV4YW1wbGUsIFdpblJhciB1c2VzIHRoZSBhbWJpZW50IGNvZGUgcGFnZSBmb3IgdGhlIGhvc3QgZGVza3RvcAorICAgICAgICAvLy8gICAgIG9wZXJhdGluZyBzeXN0ZW0uIFRoZSBwaXRmYWxsIGhlcmUgaXMgdGhhdCBpZiB5b3UgY3JlYXRlIGEgemlwIGluCisgICAgICAgIC8vLyAgICAgQ29wZW5oYWdlbiBhbmQgc2VuZCBpdCB0byBUb2t5bywgdGhlIHJlYWRlciBvZiB0aGUgemlwZmlsZSBtYXkgbm90IGJlCisgICAgICAgIC8vLyAgICAgYWJsZSB0byBkZWNvZGUgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBjcmVhdGUgYSB6aXBmaWxlIGVuY29kZWQgd2l0aCBhCisgICAgICAgIC8vLyAgIGxhbmd1YWdlLXNwZWNpZmljIGVuY29kaW5nOgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyAgIHVzaW5nICh2YXIgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgICB6aXAuQWx0ZXJuYXRlRW5vZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJpYm04NjEiKTsKKyAgICAgICAgLy8vICAgICAgemlwLkFsdGVybmF0ZUVub2RpbmdVc2FnZSA9IFppcE9wdGlvbi5BbHdheXM7CisgICAgICAgIC8vLyAgICAgIHppcC5BZGRGaWxlUyhhcnJheU9mRmlsZXMpOworICAgICAgICAvLy8gICAgICB6aXAuU2F2ZSgiTXlhcmNoaXZlLUVuY29kZWQtaW4tSUJNODYxLnppcCIpOworICAgICAgICAvLy8gICB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBGaWxlLkFsdGVybmF0ZUVuY29kaW5nVXNhZ2UiIC8+CisgICAgICAgIHB1YmxpYyBTeXN0ZW0uVGV4dC5FbmNvZGluZyBBbHRlcm5hdGVFbmNvZGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7IHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBEZXNjcmliZXMgaWYgYW5kIHdoZW4gdGhpcyBpbnN0YW5jZSBzaG91bGQgYXBwbHkKKyAgICAgICAgLy8vICAgQWx0ZXJuYXRlRW5jb2RpbmcgdG8gZW5jb2RlIHRoZSBGaWxlTmFtZSBhbmQgQ29tbWVudCwgd2hlbgorICAgICAgICAvLy8gICBzYXZpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBGaWxlLkFsdGVybmF0ZUVuY29kaW5nIiAvPgorICAgICAgICBpbnRlcm5hbCBaaXBPcHRpb24gQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7IHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLyAvLy8gVGhlIHRleHQgZW5jb2RpbmcgYWN0dWFsbHkgdXNlZCBmb3IgdGhpcyBaaXBFbnRyeS4KKyAgICAgICAgLy8gLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8gLy8vCisgICAgICAgIC8vIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8gLy8vCisgICAgICAgIC8vIC8vLyA8cGFyYT4KKyAgICAgICAgLy8gLy8vICAgVGhpcyByZWFkLW9ubHkgcHJvcGVydHkgZGVzY3JpYmVzIHRoZSBlbmNvZGluZyB1c2VkIGJ5IHRoZQorICAgICAgICAvLyAvLy8gICA8Yz5aaXBFbnRyeTwvYz4uICBJZiB0aGUgZW50cnkgaGFzIGJlZW4gcmVhZCBpbiBmcm9tIGFuIGV4aXN0aW5nIFppcEZpbGUsCisgICAgICAgIC8vIC8vLyAgIHRoZW4gaXQgbWF5IHRha2UgdGhlIHZhbHVlIFVURi04LCBpZiB0aGUgZW50cnkgaXMgY29kZWQgdG8gc3BlY2lmeSBVVEYtOC4KKyAgICAgICAgLy8gLy8vICAgSWYgdGhlIGVudHJ5IGRvZXMgbm90IHNwZWNpZnkgVVRGLTgsIHRoZSB0eXBpY2FsIGNhc2UsIHRoZW4gdGhlIGVuY29kaW5nCisgICAgICAgIC8vIC8vLyAgIHVzZWQgaXMgd2hhdGV2ZXIgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0bworICAgICAgICAvLyAvLy8gICA8Yz5aaXBGaWxlLlJlYWQoKTwvYz4uIElmIHRoZSBhcHBsaWNhdGlvbiBoYXMgdXNlZCBvbmUgb2YgdGhlIG92ZXJsb2FkcyBvZgorICAgICAgICAvLyAvLy8gICA8Yz5aaXBGaWxlLlJlYWQoKTwvYz4gdGhhdCBkb2VzIG5vdCBhY2NlcHQgYW4gZW5jb2RpbmcgcGFyYW1ldGVyLCB0aGVuIHRoZQorICAgICAgICAvLyAvLy8gICBlbmNvZGluZyB1c2VkIGlzIElCTTQzNywgd2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAvLyAvLy8gICBaSVAgc3BlY2lmaWNhdGlvbi4gIDwvcGFyYT4KKyAgICAgICAgLy8gLy8vCisgICAgICAgIC8vIC8vLyA8cGFyYT4KKyAgICAgICAgLy8gLy8vICAgSWYgdGhlIGVudHJ5IGlzIGJlaW5nIGNyZWF0ZWQsIHRoZW4gdGhlIHZhbHVlIG9mIEFjdHVhbEVuY29kaW5nIGlzIHRha2VuCisgICAgICAgIC8vIC8vLyAgIGFjY29yZGluZyB0byB0aGUgbG9naWMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciA8c2VlCisgICAgICAgIC8vIC8vLyAgIGNyZWY9IlppcEZpbGUuUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIgLz4uICA8L3BhcmE+CisgICAgICAgIC8vIC8vLworICAgICAgICAvLyAvLy8gPHBhcmE+CisgICAgICAgIC8vIC8vLyAgIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gcmV0cmlldmluZyB0aGlzIHByb3BlcnR5IHRvIHNlZSBpZgorICAgICAgICAvLyAvLy8gICBhbiBlbnRyeSByZWFkIGluIGZyb20gYSBmaWxlIGhhcyB1c2VkIFVuaWNvZGUgKFVURi04KS4gIDwvcGFyYT4KKyAgICAgICAgLy8gLy8vCisgICAgICAgIC8vIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vIC8vLworICAgICAgICAvLyAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRmlsZS5Qcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIiAvPgorICAgICAgICAvLyBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgQWN0dWFsRW5jb2RpbmcKKyAgICAgICAgLy8geworICAgICAgICAvLyAgICAgZ2V0CisgICAgICAgIC8vICAgICB7CisgICAgICAgIC8vICAgICAgICAgcmV0dXJuIF9hY3R1YWxFbmNvZGluZzsKKyAgICAgICAgLy8gICAgIH0KKyAgICAgICAgLy8gfQorCisKKworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgTmFtZUluQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUsIHN0cmluZyBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChkaXJlY3RvcnlQYXRoSW5BcmNoaXZlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmlsZW5hbWU7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQYXRoLkdldEZpbGVOYW1lKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseSBzcGVjaWZ5IGEgcGF0aG5hbWUgZm9yIHRoaXMgZmlsZQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQYXRoLkNvbWJpbmUoZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSwgUGF0aC5HZXRGaWxlTmFtZShmaWxlbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9yZXN1bHQgPSBQYXRoLkdldEZ1bGxQYXRoKHJlc3VsdCk7CisgICAgICAgICAgICByZXN1bHQgPSBTaGFyZWRVdGlsaXRpZXMuTm9ybWFsaXplUGF0aEZvclVzZUluWmlwRmlsZShyZXN1bHQpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2l0ZW0gOTA3MworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgWmlwRW50cnkgQ3JlYXRlRnJvbU5vdGhpbmcoU3RyaW5nIG5hbWVJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGUobmFtZUluQXJjaGl2ZSwgWmlwRW50cnlTb3VyY2UuTm9uZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgWmlwRW50cnkgQ3JlYXRlRnJvbUZpbGUoU3RyaW5nIGZpbGVuYW1lLCBzdHJpbmcgbmFtZUluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZShuYW1lSW5BcmNoaXZlLCBaaXBFbnRyeVNvdXJjZS5GaWxlU3lzdGVtLCBmaWxlbmFtZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgWmlwRW50cnkgQ3JlYXRlRm9yU3RyZWFtKFN0cmluZyBlbnRyeU5hbWUsIFN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKGVudHJ5TmFtZSwgWmlwRW50cnlTb3VyY2UuU3RyZWFtLCBzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBaaXBFbnRyeSBDcmVhdGVGb3JXcml0ZXIoU3RyaW5nIGVudHJ5TmFtZSwgV3JpdGVEZWxlZ2F0ZSBkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKGVudHJ5TmFtZSwgWmlwRW50cnlTb3VyY2UuV3JpdGVEZWxlZ2F0ZSwgZCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgWmlwRW50cnkgQ3JlYXRlRm9ySml0U3RyZWFtUHJvdmlkZXIoc3RyaW5nIG5hbWVJbkFyY2hpdmUsIE9wZW5EZWxlZ2F0ZSBvcGVuZXIsIENsb3NlRGVsZWdhdGUgY2xvc2VyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKG5hbWVJbkFyY2hpdmUsIFppcEVudHJ5U291cmNlLkppdFN0cmVhbSwgb3BlbmVyLCBjbG9zZXIpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFppcEVudHJ5IENyZWF0ZUZvclppcE91dHB1dFN0cmVhbShzdHJpbmcgbmFtZUluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZShuYW1lSW5BcmNoaXZlLCBaaXBFbnRyeVNvdXJjZS5aaXBPdXRwdXRTdHJlYW0sIG51bGwsIG51bGwpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBaaXBFbnRyeSBDcmVhdGUoc3RyaW5nIG5hbWVJbkFyY2hpdmUsIFppcEVudHJ5U291cmNlIHNvdXJjZSwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZUluQXJjaGl2ZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElvbmljLlppcC5aaXBFeGNlcHRpb24oIlRoZSBlbnRyeSBuYW1lIG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1lbXB0eS4iKTsKKworICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoKTsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzA3MQorICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzkyNiAtICJ2ZXJzaW9uIG1hZGUgYnkiIE9TIHNob3VsZCBiZSB6ZXJvIGZvciBjb21wYXQgd2l0aCBXaW5aaXAKKyAgICAgICAgICAgIGVudHJ5Ll9WZXJzaW9uTWFkZUJ5ID0gKDAgPDwgOCkgKyA0NTsgLy8gaW5kaWNhdGVzIHRoZSBhdHRyaWJ1dGVzIGFyZSBGQVQgQXR0cmlidXRlcywgYW5kIHY0LjUgb2YgdGhlIHNwZWMKKyAgICAgICAgICAgIGVudHJ5Ll9Tb3VyY2UgPSBzb3VyY2U7CisgICAgICAgICAgICBlbnRyeS5fTXRpbWUgPSBlbnRyeS5fQXRpbWUgPSBlbnRyeS5fQ3RpbWUgPSBEYXRlVGltZS5VdGNOb3c7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuU3RyZWFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVudHJ5Ll9zb3VyY2VTdHJlYW0gPSAoYXJnMSBhcyBTdHJlYW0pOyAgICAgICAgIC8vIG1heSAgb3IgbWF5IG5vdCBiZSBudWxsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuV3JpdGVEZWxlZ2F0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5fV3JpdGVEZWxlZ2F0ZSA9IChhcmcxIGFzIFdyaXRlRGVsZWdhdGUpOyAvLyBtYXkgIG9yIG1heSBub3QgYmUgbnVsbAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlID09IFppcEVudHJ5U291cmNlLkppdFN0cmVhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5fT3BlbkRlbGVnYXRlID0gKGFyZzEgYXMgT3BlbkRlbGVnYXRlKTsgICAvLyBtYXkgIG9yIG1heSBub3QgYmUgbnVsbAorICAgICAgICAgICAgICAgIGVudHJ5Ll9DbG9zZURlbGVnYXRlID0gKGFyZzIgYXMgQ2xvc2VEZWxlZ2F0ZSk7IC8vIG1heSAgb3IgbWF5IG5vdCBiZSBudWxsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UgPT0gWmlwRW50cnlTb3VyY2UuWmlwT3V0cHV0U3RyZWFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd29ya2l0ZW0gOTA3MworICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlID09IFppcEVudHJ5U291cmNlLk5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSB0aGlzIGEgdmFsaWQgdmFsdWUsIGZvciBsYXRlci4KKyAgICAgICAgICAgICAgICBlbnRyeS5fU291cmNlID0gWmlwRW50cnlTb3VyY2UuRmlsZVN5c3RlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAoYXJnMSBhcyBTdHJpbmcpOyAgIC8vIG11c3Qgbm90IGJlIG51bGwKKworICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJb25pYy5aaXAuWmlwRXhjZXB0aW9uKCJUaGUgZmlsZW5hbWUgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLWVtcHR5LiIpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmFtZWQgZmlsZSBtYXkgb3IgbWF5IG5vdCBleGlzdCBhdCB0aGlzIHRpbWUuICBGb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZSwgd2hlbiBhZGRpbmcgYSBkaXJlY3RvcnkgYnkgbmFtZS4gIFdlIHRlc3QgZXhpc3RlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gbmVjZXNzYXJ5OiB3aGVuIHNhdmluZyB0aGUgWmlwRmlsZSwgb3Igd2hlbiBnZXR0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzLCBhbmQgc28gb24uCisKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA2ODc4CisgICAgICAgICAgICAgICAgICAgIC8vIElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuQWRqdXN0VGltZV9XaW4zMlRvRG90TmV0CisgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9NdGltZSA9IEZpbGUuR2V0TGFzdFdyaXRlVGltZShmaWxlbmFtZSkuVG9Vbml2ZXJzYWxUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9DdGltZSA9IEZpbGUuR2V0Q3JlYXRpb25UaW1lKGZpbGVuYW1lKS5Ub1VuaXZlcnNhbFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuX0F0aW1lID0gRmlsZS5HZXRMYXN0QWNjZXNzVGltZShmaWxlbmFtZSkuVG9Vbml2ZXJzYWxUaW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzA3MQorICAgICAgICAgICAgICAgICAgICAvLyBjYW4gb25seSBnZXQgYXR0cmlidXRlcyBvZiBmaWxlcyB0aGF0IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZmlsZW5hbWUpIHx8IERpcmVjdG9yeS5FeGlzdHMoZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuX0V4dGVybmFsRmlsZUF0dHJzID0gKGludClOZXRDZkZpbGUuR2V0QXR0cmlidXRlcyhmaWxlbmFtZSk7CisKKyNlbGlmIFNJTFZFUkxJR0hUCisgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9NdGltZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5fQ3RpbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuX0F0aW1lID0gU3lzdGVtLkRhdGVUaW1lLlV0Y05vdzsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuX0V4dGVybmFsRmlsZUF0dHJzID0gKGludCkwOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNjg3OD8/CisgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9NdGltZSA9IEZpbGUuR2V0TGFzdFdyaXRlVGltZShmaWxlbmFtZSkuVG9Vbml2ZXJzYWxUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9DdGltZSA9IEZpbGUuR2V0Q3JlYXRpb25UaW1lKGZpbGVuYW1lKS5Ub1VuaXZlcnNhbFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuX0F0aW1lID0gRmlsZS5HZXRMYXN0QWNjZXNzVGltZShmaWxlbmFtZSkuVG9Vbml2ZXJzYWxUaW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzA3MQorICAgICAgICAgICAgICAgICAgICAvLyBjYW4gb25seSBnZXQgYXR0cmlidXRlcyBvbiBmaWxlcyB0aGF0IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZmlsZW5hbWUpIHx8IERpcmVjdG9yeS5FeGlzdHMoZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuX0V4dGVybmFsRmlsZUF0dHJzID0gKGludClGaWxlLkdldEF0dHJpYnV0ZXMoZmlsZW5hbWUpOworCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuX250ZnNUaW1lc0FyZVNldCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuX0xvY2FsRmlsZU5hbWUgPSBQYXRoLkdldEZ1bGxQYXRoKGZpbGVuYW1lKTsgLy8gd29ya2l0ZW0gODgxMworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uSU8uUGF0aFRvb0xvbmdFeGNlcHRpb24gcHRsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDE0MDM1CisgICAgICAgICAgICAgICAgICAgIHZhciBtc2cgPSBTdHJpbmcuRm9ybWF0KCJUaGUgcGF0aCBpcyB0b28gbG9uZywgZmlsZW5hbWU9ezB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKG1zZywgcHRsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5Ll9MYXN0TW9kaWZpZWQgPSBlbnRyeS5fTXRpbWU7CisgICAgICAgICAgICBlbnRyeS5fRmlsZU5hbWVJbkFyY2hpdmUgPSBTaGFyZWRVdGlsaXRpZXMuTm9ybWFsaXplUGF0aEZvclVzZUluWmlwRmlsZShuYW1lSW5BcmNoaXZlKTsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IHNsdXJwIGluIHRoZSBmaWxlIGRhdGEgdW50aWwgdGhlIGNhbGxlciBpbnZva2VzIFdyaXRlIG9uIHRoaXMgZW50cnkuCisKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIGludGVybmFsIHZvaWQgTWFya0FzRGlyZWN0b3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgX0lzRGlyZWN0b3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDYyNzkKKyAgICAgICAgICAgIGlmICghX0ZpbGVOYW1lSW5BcmNoaXZlLkVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgX0ZpbGVOYW1lSW5BcmNoaXZlICs9ICIvIjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEluZGljYXRlcyB3aGV0aGVyIGFuIGVudHJ5IGlzIG1hcmtlZCBhcyBhIHRleHQgZmlsZS4gQmUgY2FyZWZ1bCB3aGVuCisgICAgICAgIC8vLyAgIHVzaW5nIG9uIHRoaXMgcHJvcGVydHkuIFVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uLCB5b3Ugc2hvdWxkCisgICAgICAgIC8vLyAgIHByb2JhYmx5IGlnbm9yZSB0aGlzIHByb3BlcnR5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBaSVAgZm9ybWF0IGluY2x1ZGVzIGEgcHJvdmlzaW9uIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgYW4gZW50cnkgaW4KKyAgICAgICAgLy8vICAgdGhlIHppcCBhcmNoaXZlIGlzIGEgdGV4dCBvciBiaW5hcnkgZmlsZS4gIFRoaXMgcHJvcGVydHkgZXhwb3NlcyB0aGF0CisgICAgICAgIC8vLyAgIG1ldGFkYXRhIGl0ZW0uIEJlIGNhcmVmdWwgd2hlbiB1c2luZyB0aGlzIHByb3BlcnR5OiBJdCdzIG5vdCBjbGVhcgorICAgICAgICAvLy8gICB0aGF0IHRoaXMgcHJvcGVydHkgYXMgYSBmaXJtIG1lYW5pbmcsIGFjcm9zcyB0b29scyBhbmQgbGlicmFyaWVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUbyBiZSBjbGVhciwgd2hlbiByZWFkaW5nIGEgemlwIGZpbGUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBtYXkgb3IgbWF5CisgICAgICAgIC8vLyAgIG5vdCBiZSBzZXQsIGFuZCBpdHMgdmFsdWUgbWF5IG9yIG1heSBub3QgYmUgdmFsaWQuICBOb3QgYWxsIGVudHJpZXMKKyAgICAgICAgLy8vICAgdGhhdCB5b3UgbWF5IHRoaW5rIG9mIGFzICJ0ZXh0IiBlbnRyaWVzIHdpbGwgYmUgc28gbWFya2VkLCBhbmQgZW50cmllcworICAgICAgICAvLy8gICBtYXJrZWQgYXMgInRleHQiIGFyZSBub3QgZ3VhcmFudGVlZCBpbiBhbnkgd2F5IHRvIGJlIHRleHQgZW50cmllcy4KKyAgICAgICAgLy8vICAgV2hldGhlciB0aGUgdmFsdWUgaXMgc2V0IGFuZCBzZXQgY29ycmVjdGx5IGRlcGVuZHMgZW50aXJlbHkgb24gdGhlCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uIHRoYXQgcHJvZHVjZWQgdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGVyZSBhcmUgbWFueSB6aXAgdG9vbHMgYXZhaWxhYmxlLCBhbmQgd2hlbiBjcmVhdGluZyB6aXAgZmlsZXMsIHNvbWUKKyAgICAgICAgLy8vICAgb2YgdGhlbSAicmVzcGVjdCIgdGhlIElzVGV4dCBtZXRhZGF0YSBmaWVsZCwgYW5kIHNvbWUgb2YgdGhlbSBkbyBub3QuCisgICAgICAgIC8vLyAgIFVuZm9ydHVuYXRlbHksIGV2ZW4gd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBkbyAidGhlIHJpZ2h0IHRoaW5nIiwKKyAgICAgICAgLy8vICAgaXQncyBub3QgYWx3YXlzIGNsZWFyIHdoYXQgInRoZSByaWdodCB0aGluZyIgaXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZXJlJ3Mgbm8gZmlybSBkZWZpbml0aW9uIG9mIGp1c3Qgd2hhdCBpdCBtZWFucyB0byBiZSAiYSB0ZXh0IGZpbGUiLAorICAgICAgICAvLy8gICBhbmQgdGhlIHppcCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhlbHAgaW4gdGhpcyByZWdhcmQuIFR3ZW50eSB5ZWFycworICAgICAgICAvLy8gICBhZ28sIHRleHQgd2FzIEFTQ0lJLCBlYWNoIGJ5dGUgd2FzIGxlc3MgdGhhbiAxMjcuIElzVGV4dCBtZWFudCwgYWxsCisgICAgICAgIC8vLyAgIGJ5dGVzIGluIHRoZSBmaWxlIHdlcmUgbGVzcyB0aGFuIDEyNy4gIFRoZXNlIGRheXMsIGl0IGlzIG5vdCB0aGUgY2FzZQorICAgICAgICAvLy8gICB0aGF0IGFsbCB0ZXh0IGZpbGVzIGhhdmUgYWxsIGJ5dGVzIGxlc3MgdGhhbiAxMjcuICBBbnkgdW5pY29kZSBmaWxlCisgICAgICAgIC8vLyAgIG1heSBoYXZlIGJ5dGVzIHRoYXQgYXJlIGFib3ZlIDB4N2YuICBUaGUgemlwIHNwZWNpZmljYXRpb24gaGFzIG5vdGhpbmcKKyAgICAgICAgLy8vICAgdG8gc2F5IG9uIHRoaXMgdG9waWMuIFRoZXJlZm9yZSwgaXQncyBub3QgY2xlYXIgd2hhdCBJc1RleHQgcmVhbGx5CisgICAgICAgIC8vLyAgIG1lYW5zLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IG1lcmVseSB0ZWxscyBhIHJlYWRpbmcgYXBwbGljYXRpb24gd2hhdCBpcyBzdG9yZWQgaW4gdGhlCisgICAgICAgIC8vLyAgIG1ldGFkYXRhIGZvciBhbiBlbnRyeSwgd2l0aG91dCBndWFyYW50ZWVpbmcgaXRzIHZhbGlkaXR5IG9yIGl0cworICAgICAgICAvLy8gICBtZWFuaW5nLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIERvdE5ldFppcCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHppcGZpbGUsIGl0IGF0dGVtcHRzIHRvIHNldCB0aGlzCisgICAgICAgIC8vLyAgIGZpZWxkICJjb3JyZWN0bHkuIiBGb3IgZXhhbXBsZSwgaWYgYSBmaWxlIGVuZHMgaW4gIi50eHQiLCB0aGlzIGZpZWxkCisgICAgICAgIC8vLyAgIHdpbGwgYmUgc2V0LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSB0aGF0IGRlZmF1bHQgc2V0dGluZy4gIFdoZW4KKyAgICAgICAgLy8vICAgd3JpdGluZyBhIHppcCBmaWxlLCB5b3UgbXVzdCBzZXQgdGhlIHByb3BlcnR5IGJlZm9yZSBjYWxsaW5nCisgICAgICAgIC8vLyAgIDxjPlNhdmUoKTwvYz4gb24gdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gcmVhZGluZyBhIHppcCBmaWxlLCBhIG1vcmUgZ2VuZXJhbCB3YXkgdG8gZGVjaWRlIGp1c3Qgd2hhdCBraW5kCisgICAgICAgIC8vLyAgIG9mIGZpbGUgaXMgY29udGFpbmVkIGluIGEgcGFydGljdWxhciBlbnRyeSBpcyB0byB1c2UgdGhlIGZpbGUgdHlwZQorICAgICAgICAvLy8gICBkYXRhYmFzZSBzdG9yZWQgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBUaGUgb3BlcmF0aW5nIHN5c3RlbSBzdG9yZXMKKyAgICAgICAgLy8vICAgYSB0YWJsZSB0aGF0IHNheXMsIGEgZmlsZSB3aXRoIC5qcGcgZXh0ZW5zaW9uIGlzIGEgSlBHIGltYWdlIGZpbGUsIGEKKyAgICAgICAgLy8vICAgZmlsZSB3aXRoIGEgLnhtbCBleHRlbnNpb24gaXMgYW4gWE1MIGRvY3VtZW50LCBhIGZpbGUgd2l0aCBhIC50eHQgaXMgYQorICAgICAgICAvLy8gICBwdXJlIEFTQ0lJIHRleHQgZG9jdW1lbnQsIGFuZCBzbyBvbi4gIFRvIGdldCB0aGlzIGluZm9ybWF0aW9uIG9uCisgICAgICAgIC8vLyAgIFdpbmRvd3MsIDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vS0IvY3MvR2V0RmlsZVR5cGVBbmRJY29uLmFzcHgiPiB5b3UKKyAgICAgICAgLy8vICAgbmVlZCB0byByZWFkIGFuZCBwYXJzZSB0aGUgcmVnaXN0cnkuPC9zZWU+IDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKHZhciB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHZhciBlID0gemlwLlVwZGF0ZUZpbGUoIkRlc2NyaXB0aW9ucy5tbWUiLCAiIik7CisgICAgICAgIC8vLyAgICAgZS5Jc1RleHQgPSB0cnVlOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKHppcFBhdGgpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgIERpbSBlMiBhcyBaaXBFbnRyeSA9IHppcC5BZGRGaWxlKCJEZXNjcmlwdGlvbnMubW1lIiwgIiIpCisgICAgICAgIC8vLyAgICAgZS5Jc1RleHQ9IFRydWUKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSh6aXBQYXRoKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIHB1YmxpYyBib29sIElzVGV4dAorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA3ODAxCisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0lzVGV4dDsgfQorICAgICAgICAgICAgc2V0IHsgX0lzVGV4dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PlByb3ZpZGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnN0YW5jZS48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoIlppcEVudHJ5Ojp7MH0iLCBGaWxlTmFtZSk7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIFN0cmVhbSBBcmNoaXZlU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfYXJjaGl2ZVN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250YWluZXIuWmlwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgemYgPSBfY29udGFpbmVyLlppcEZpbGU7CisgICAgICAgICAgICAgICAgICAgICAgICB6Zi5SZXNldChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfYXJjaGl2ZVN0cmVhbSA9IHpmLlN0cmVhbUZvckRpc2tOdW1iZXIoX2Rpc2tOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2FyY2hpdmVTdHJlYW0gPSBfY29udGFpbmVyLlppcE91dHB1dFN0cmVhbS5PdXRwdXRTdHJlYW07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hcmNoaXZlU3RyZWFtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0RmRwTG9oKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGZvciBGaWxlRGF0YVBvc2l0aW9uIGhhcyBub3QgeWV0IGJlZW4gc2V0LgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCBzZWVrIHRvIHRoZSBsb2NhbCBoZWFkZXIsIGFuZCBmaWd1cmUgdGhlIHN0YXJ0IG9mIGZpbGUgZGF0YS4KKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDgwOTg6IG9rIChyZXN0b3JlKQorICAgICAgICAgICAgbG9uZyBvcmlnUG9zaXRpb24gPSB0aGlzLkFyY2hpdmVTdHJlYW0uUG9zaXRpb247CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLkFyY2hpdmVTdHJlYW0uU2Vlayh0aGlzLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOCh0aGlzLkFyY2hpdmVTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiBleGMxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBkZXNjcmlwdGlvbiA9IFN0cmluZy5Gb3JtYXQoIkV4Y2VwdGlvbiBzZWVraW5nICBlbnRyeSh7MH0pIG9mZnNldCgweHsxOlg4fSkgbGVuKDB4ezI6WDh9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZpbGVOYW1lLCB0aGlzLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFyY2hpdmVTdHJlYW0uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkU3RhdGVFeGNlcHRpb24oZGVzY3JpcHRpb24sIGV4YzEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gYmxvY2sgPSBuZXcgYnl0ZVszMF07CisgICAgICAgICAgICB0aGlzLkFyY2hpdmVTdHJlYW0uUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjb3VsZCB2ZXJpZnkgdGhlIGNvbnRlbnRzIHJlYWQgZnJvbSB0aGUgbG9jYWwgaGVhZGVyCisgICAgICAgICAgICAvLyB3aXRoIHRoZSBjb250ZW50cyByZWFkIGZyb20gdGhlIGNlbnRyYWwgaGVhZGVyLiAgV2UgY291bGQsIGJ1dCBkb24ndCBuZWVkIHRvLgorICAgICAgICAgICAgLy8gU28gd2Ugd29uJ3QuCisKKyAgICAgICAgICAgIEludDE2IGZpbGVuYW1lTGVuZ3RoID0gKHNob3J0KShibG9ja1syNl0gKyBibG9ja1syN10gKiAyNTYpOworICAgICAgICAgICAgSW50MTYgZXh0cmFGaWVsZExlbmd0aCA9IChzaG9ydCkoYmxvY2tbMjhdICsgYmxvY2tbMjldICogMjU2KTsKKworICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIiAgcG9zICAweHswOlg4fSAoezB9KSIsIHRoaXMuQXJjaGl2ZVN0cmVhbS5Qb3NpdGlvbik7CisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiICBzZWVrIDB4ezA6WDh9ICh7MH0pIiwgZmlsZW5hbWVMZW5ndGggKyBleHRyYUZpZWxkTGVuZ3RoKTsKKworICAgICAgICAgICAgdGhpcy5BcmNoaXZlU3RyZWFtLlNlZWsoZmlsZW5hbWVMZW5ndGggKyBleHRyYUZpZWxkTGVuZ3RoLCBTZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgIElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KHRoaXMuQXJjaGl2ZVN0cmVhbSk7CisKKyAgICAgICAgICAgIHRoaXMuX0xlbmd0aE9mSGVhZGVyID0gMzAgKyBleHRyYUZpZWxkTGVuZ3RoICsgZmlsZW5hbWVMZW5ndGggKworICAgICAgICAgICAgICAgIEdldExlbmd0aE9mQ3J5cHRvSGVhZGVyQnl0ZXMoX0VuY3J5cHRpb25fRnJvbVppcEZpbGUpOworCisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiICBST0xIICAweHswOlg4fSAoezB9KSIsIF9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIpOworICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIiAgTE9IICAgMHh7MDpYOH0gKHswfSkiLCBfTGVuZ3RoT2ZIZWFkZXIpOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODA5ODogb2sgKGFyaXRobWV0aWMpCisgICAgICAgICAgICB0aGlzLl9fRmlsZURhdGFQb3NpdGlvbiA9IF9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgKyBfTGVuZ3RoT2ZIZWFkZXI7CisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiICBGRFAgICAweHswOlg4fSAoezB9KSIsIF9fRmlsZURhdGFQb3NpdGlvbik7CisKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgZmlsZSBwb3NpdGlvbjoKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDgwOTg6IG9rIChyZXN0b3JlKQorICAgICAgICAgICAgdGhpcy5BcmNoaXZlU3RyZWFtLlNlZWsob3JpZ1Bvc2l0aW9uLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOCh0aGlzLkFyY2hpdmVTdHJlYW0pOworICAgICAgICB9CisKKworCisjaWYgQUVTQ1JZUFRPCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBHZXRLZXlTdHJlbmd0aEluQml0cyhFbmNyeXB0aW9uQWxnb3JpdGhtIGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2KSByZXR1cm4gMjU2OworICAgICAgICAgICAgZWxzZSBpZiAoYSA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczEyOCkgcmV0dXJuIDEyODsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBHZXRMZW5ndGhPZkNyeXB0b0hlYWRlckJ5dGVzKEVuY3J5cHRpb25BbGdvcml0aG0gYSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAoKF9CaXRGaWVsZCAmIDB4MDEpICE9IDB4MDEpIHJldHVybiAwOworICAgICAgICAgICAgaWYgKGEgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lKSByZXR1cm4gMDsKKworI2lmIEFFU0NSWVBUTworICAgICAgICAgICAgaWYgKGEgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMxMjggfHwKKyAgICAgICAgICAgICAgICBhID09IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBLZXlTdHJlbmd0aEluQml0cyA9IEdldEtleVN0cmVuZ3RoSW5CaXRzKGEpOworICAgICAgICAgICAgICAgIGludCBzaXplT2ZTYWx0QW5kUHYgPSAoKEtleVN0cmVuZ3RoSW5CaXRzIC8gOCAvIDIpICsgMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemVPZlNhbHRBbmRQdjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKGEgPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Qa3ppcFdlYWspCisgICAgICAgICAgICAgICAgcmV0dXJuIDEyOworICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiaW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgbG9uZyBGaWxlRGF0YVBvc2l0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfX0ZpbGVEYXRhUG9zaXRpb24gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIFNldEZkcExvaCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fRmlsZURhdGFQb3NpdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IExlbmd0aE9mSGVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfTGVuZ3RoT2ZIZWFkZXIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgU2V0RmRwTG9oKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX0xlbmd0aE9mSGVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgWmlwQ3J5cHRvIF96aXBDcnlwdG9fZm9yRXh0cmFjdDsKKyAgICAgICAgcHJpdmF0ZSBaaXBDcnlwdG8gX3ppcENyeXB0b19mb3JXcml0ZTsKKyNpZiBBRVNDUllQVE8KKyAgICAgICAgcHJpdmF0ZSBXaW5aaXBBZXNDcnlwdG8gX2Flc0NyeXB0b19mb3JFeHRyYWN0OworICAgICAgICBwcml2YXRlIFdpblppcEFlc0NyeXB0byBfYWVzQ3J5cHRvX2ZvcldyaXRlOworICAgICAgICBwcml2YXRlIEludDE2IF9XaW5aaXBBZXNNZXRob2Q7CisjZW5kaWYKKworICAgICAgICBpbnRlcm5hbCBEYXRlVGltZSBfTGFzdE1vZGlmaWVkOworICAgICAgICBwcml2YXRlIERhdGVUaW1lIF9NdGltZSwgX0F0aW1lLCBfQ3RpbWU7ICAvLyB3b3JraXRlbSA2ODc4OiBOVEZTIHF1YW50aXRpZXMKKyAgICAgICAgcHJpdmF0ZSBib29sIF9udGZzVGltZXNBcmVTZXQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfZW1pdE50ZnNUaW1lcyA9IHRydWU7CisgICAgICAgIHByaXZhdGUgYm9vbCBfZW1pdFVuaXhUaW1lczsgIC8vIGJ5IGRlZmF1bHQsIGZhbHNlCisgICAgICAgIHByaXZhdGUgYm9vbCBfVHJpbVZvbHVtZUZyb21GdWxseVF1YWxpZmllZFBhdGhzID0gdHJ1ZTsgIC8vIGJ5IGRlZmF1bHQsIHRyaW0gdGhlbS4KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIF9Mb2NhbEZpbGVOYW1lOworICAgICAgICBwcml2YXRlIHN0cmluZyBfRmlsZU5hbWVJbkFyY2hpdmU7CisgICAgICAgIGludGVybmFsIEludDE2IF9WZXJzaW9uTmVlZGVkOworICAgICAgICBpbnRlcm5hbCBJbnQxNiBfQml0RmllbGQ7CisgICAgICAgIGludGVybmFsIEludDE2IF9Db21wcmVzc2lvbk1ldGhvZDsKKyAgICAgICAgcHJpdmF0ZSBJbnQxNiBfQ29tcHJlc3Npb25NZXRob2RfRnJvbVppcEZpbGU7CisgICAgICAgIHByaXZhdGUgSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsIF9Db21wcmVzc2lvbkxldmVsOworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX0NvbW1lbnQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXJlY3Rvcnk7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9Db21tZW50Qnl0ZXM7CisgICAgICAgIGludGVybmFsIEludDY0IF9Db21wcmVzc2VkU2l6ZTsKKyAgICAgICAgaW50ZXJuYWwgSW50NjQgX0NvbXByZXNzZWRGaWxlRGF0YVNpemU7IC8vIENvbXByZXNzZWRTaXplIGxlc3MgMTIgYnl0ZXMgZm9yIHRoZSBlbmNyeXB0aW9uIGhlYWRlciwgaWYgYW55CisgICAgICAgIGludGVybmFsIEludDY0IF9VbmNvbXByZXNzZWRTaXplOworICAgICAgICBpbnRlcm5hbCBJbnQzMiBfVGltZUJsb2I7CisgICAgICAgIHByaXZhdGUgYm9vbCBfY3JjQ2FsY3VsYXRlZDsKKyAgICAgICAgaW50ZXJuYWwgSW50MzIgX0NyYzMyOworICAgICAgICBpbnRlcm5hbCBieXRlW10gX0V4dHJhOworICAgICAgICBwcml2YXRlIGJvb2wgX21ldGFkYXRhQ2hhbmdlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9yZXN0cmVhbVJlcXVpcmVkT25TYXZlOworICAgICAgICBwcml2YXRlIGJvb2wgX3NvdXJjZUlzRW5jcnlwdGVkOworICAgICAgICBwcml2YXRlIGJvb2wgX3NraXBwZWREdXJpbmdTYXZlOworICAgICAgICBwcml2YXRlIFVJbnQzMiBfZGlza051bWJlcjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTeXN0ZW0uVGV4dC5FbmNvZGluZyBpYm00MzcgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZygiSUJNNDM3Iik7CisgICAgICAgIC8vcHJpdmF0ZSBTeXN0ZW0uVGV4dC5FbmNvZGluZyBfcHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJJQk00MzciKTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uVGV4dC5FbmNvZGluZyBfYWN0dWFsRW5jb2Rpbmc7CisKKyAgICAgICAgaW50ZXJuYWwgWmlwQ29udGFpbmVyIF9jb250YWluZXI7CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIF9fRmlsZURhdGFQb3NpdGlvbiA9IC0xOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBfRW50cnlIZWFkZXI7CisgICAgICAgIGludGVybmFsIEludDY0IF9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXI7CisgICAgICAgIHByaXZhdGUgSW50NjQgX2Z1dHVyZV9ST0xIOworICAgICAgICBwcml2YXRlIEludDY0IF9Ub3RhbEVudHJ5U2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX0xlbmd0aE9mSGVhZGVyOworICAgICAgICBwcml2YXRlIGludCBfTGVuZ3RoT2ZUcmFpbGVyOworICAgICAgICBpbnRlcm5hbCBib29sIF9JbnB1dFVzZXNaaXA2NDsKKyAgICAgICAgcHJpdmF0ZSBVSW50MzIgX1Vuc3VwcG9ydGVkQWxnb3JpdGhtSWQ7CisKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIF9QYXNzd29yZDsKKyAgICAgICAgaW50ZXJuYWwgWmlwRW50cnlTb3VyY2UgX1NvdXJjZTsKKyAgICAgICAgaW50ZXJuYWwgRW5jcnlwdGlvbkFsZ29yaXRobSBfRW5jcnlwdGlvbjsKKyAgICAgICAgaW50ZXJuYWwgRW5jcnlwdGlvbkFsZ29yaXRobSBfRW5jcnlwdGlvbl9Gcm9tWmlwRmlsZTsKKyAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIF9XZWFrRW5jcnlwdGlvbkhlYWRlcjsKKyAgICAgICAgaW50ZXJuYWwgU3RyZWFtIF9hcmNoaXZlU3RyZWFtOworICAgICAgICBwcml2YXRlIFN0cmVhbSBfc291cmNlU3RyZWFtOworICAgICAgICBwcml2YXRlIE51bGxhYmxlPEludDY0PiBfc291cmNlU3RyZWFtT3JpZ2luYWxQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9zb3VyY2VXYXNKaXRQcm92aWRlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pb09wZXJhdGlvbkNhbmNlbGVkOworICAgICAgICBwcml2YXRlIGJvb2wgX3ByZXN1bWVaaXA2NDsKKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxib29sPiBfZW50cnlSZXF1aXJlc1ppcDY0OworICAgICAgICBwcml2YXRlIE51bGxhYmxlPGJvb2w+IF9PdXRwdXRVc2VzWmlwNjQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNUZXh0OyAvLyB3b3JraXRlbSA3ODAxCisgICAgICAgIHByaXZhdGUgWmlwRW50cnlUaW1lc3RhbXAgX3RpbWVzdGFtcDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTeXN0ZW0uRGF0ZVRpbWUgX3VuaXhFcG9jaCA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoMTk3MCwgMSwgMSwgMCwgMCwgMCwgRGF0ZVRpbWVLaW5kLlV0Yyk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFN5c3RlbS5EYXRlVGltZSBfd2luMzJFcG9jaCA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tRmlsZVRpbWVVdGMoMEwpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBTeXN0ZW0uRGF0ZVRpbWUgX3plcm9Ib3VyID0gbmV3IFN5c3RlbS5EYXRlVGltZSgxLCAxLCAxLCAwLCAwLCAwLCBEYXRlVGltZUtpbmQuVXRjKTsKKworICAgICAgICBwcml2YXRlIFdyaXRlRGVsZWdhdGUgX1dyaXRlRGVsZWdhdGU7CisgICAgICAgIHByaXZhdGUgT3BlbkRlbGVnYXRlIF9PcGVuRGVsZWdhdGU7CisgICAgICAgIHByaXZhdGUgQ2xvc2VEZWxlZ2F0ZSBfQ2xvc2VEZWxlZ2F0ZTsKKworCisgICAgICAgIC8vIHN1bW1hcnkKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgSU8gYnVmZmVyIGZvciBaaXBFbnRyeSBpbnN0YW5jZXMuIEN1cnJlbnRseSBpdCBpcyA4MTkyIGJ5dGVzLgorICAgICAgICAvLyBzdW1tYXJ5CisgICAgICAgIC8vcHVibGljIGNvbnN0IGludCBJT19CVUZGRVJfU0laRV9ERUZBVUxUID0gODE5MjsgLy8gMHg4MDAwOyAvLyAweDQ0MDAKKworICAgIH0KKworCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgQW4gZW51bSB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aW1lc3RhbXAgYXZhaWxhYmxlIG9uIHRoZSBaaXBFbnRyeS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiBhIGZpbGUgY2FuIGJlIHN0b3JlZCBpbiBtdWx0aXBsZSB3YXlzIGluCisgICAgLy8vICAgYSB6aXAgZmlsZSwgYW5kIHRoZXkgYXJlIG5vdCBtdXR1YWxseSBleGNsdXNpdmU6CisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPGxpc3QgdHlwZT0iYnVsbGV0Ij4KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIEluIHRoZSBzby1jYWxsZWQgIkRPUyIgZm9ybWF0LCB3aGljaCBoYXMgYSAyLXNlY29uZCBwcmVjaXNpb24uIFZhbHVlcworICAgIC8vLyAgICAgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgZXZlbiBzZWNvbmQuIEZvciBleGFtcGxlLCBpZiB0aGUgdGltZSBvbiB0aGUKKyAgICAvLy8gICAgIGZpbGUgaXMgMTI6MzQ6NDMsIHRoZW4gaXQgd2lsbCBiZSBzdG9yZWQgYXMgMTI6MzQ6NDQuIFRoaXMgZmlyc3QgdmFsdWUKKyAgICAvLy8gICAgIGlzIGFjY2Vzc2libGUgdmlhIHRoZSA8Yz5MYXN0TW9kaWZpZWQ8L2M+IHByb3BlcnR5LiBUaGlzIHZhbHVlIGlzIGFsd2F5cworICAgIC8vLyAgICAgcHJlc2VudCBpbiB0aGUgbWV0YWRhdGEgZm9yIGVhY2ggemlwIGVudHJ5LiAgSW4gc29tZSBjYXNlcyB0aGUgdmFsdWUgaXMKKyAgICAvLy8gICAgIGludmFsaWQsIG9yIHplcm8uCisgICAgLy8vICAgPC9pdGVtPgorICAgIC8vLworICAgIC8vLyAgIDxpdGVtPgorICAgIC8vLyAgICAgSW4gdGhlIHNvLWNhbGxlZCAiV2luZG93cyIgb3IgIk5URlMiIGZvcm1hdCwgYXMgYW4gOC1ieXRlIGludGVnZXIKKyAgICAvLy8gICAgIHF1YW50aXR5IGV4cHJlc3NlZCBhcyB0aGUgbnVtYmVyIG9mIDEvMTAgbWlsbGlzZWNvbmRzIChpbiBvdGhlciB3b3JkcworICAgIC8vLyAgICAgdGhlIG51bWJlciBvZiAxMDAgbmFub3NlY29uZCB1bml0cykgc2luY2UgSmFudWFyeSAxLCAxNjAxIChVVEMpLiAgVGhpcworICAgIC8vLyAgICAgZm9ybWF0IGlzIGhvdyBXaW5kb3dzIHJlcHJlc2VudHMgZmlsZSB0aW1lcy4gIFRoaXMgdGltZSBpcyBhY2Nlc3NpYmxlCisgICAgLy8vICAgICB2aWEgdGhlIDxjPk1vZGlmaWVkVGltZTwvYz4gcHJvcGVydHkuCisgICAgLy8vICAgPC9pdGVtPgorICAgIC8vLworICAgIC8vLyAgIDxpdGVtPgorICAgIC8vLyAgICAgSW4gdGhlICJVbml4IiBmb3JtYXQsIGEgNC1ieXRlIHF1YW50aXR5IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlCisgICAgLy8vICAgICBKYW51YXJ5IDEsIDE5NzAgVVRDLgorICAgIC8vLyAgIDwvaXRlbT4KKyAgICAvLy8KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIEluIGFuIG9sZGVyIGZvcm1hdCwgbm93IGRlcHJlY2F0ZWQgYnV0IHN0aWxsIHVzZWQgYnkgc29tZSBjdXJyZW50CisgICAgLy8vICAgICB0b29scy4gVGhpcyBmb3JtYXQgaXMgYWxzbyBhIDQtYnl0ZSBxdWFudGl0eSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YKKyAgICAvLy8gICAgIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwIFVUQy4KKyAgICAvLy8gICA8L2l0ZW0+CisgICAgLy8vCisgICAgLy8vIDwvbGlzdD4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhpcyBiaXQgZmllbGQgZGVzY3JpYmVzIHdoaWNoIG9mIHRoZSBmb3JtYXRzIHdlcmUgZm91bmQgaW4gYSA8Yz5aaXBFbnRyeTwvYz4gdGhhdCB3YXMgcmVhZC4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8L3JlbWFya3M+CisgICAgW0ZsYWdzXQorICAgIGludGVybmFsIGVudW0gWmlwRW50cnlUaW1lc3RhbXAKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlZmF1bHQgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5vbmUgPSAwLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgRE9TIHRpbWVzdGFtcCB3aXRoIDItc2Vjb25kIHByZWNpc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRE9TID0gMSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIFdpbmRvd3MgdGltZXN0YW1wIHdpdGggMTAwLW5zIHByZWNpc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgV2luZG93cyA9IDIsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBVbml4IHRpbWVzdGFtcCB3aXRoIDEtc2Vjb25kIHByZWNpc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVW5peCA9IDQsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBVbml4IHRpbWVzdGFtcCB3aXRoIDEtc2Vjb25kIHByZWNpc2lvbiwgc3RvcmVkIGluIEluZm9aaXAgdjEgZm9ybWF0LiAgVGhpcworICAgICAgICAvLy8gZm9ybWF0IGlzIG91dGRhdGVkIGFuZCBpcyBzdXBwb3J0ZWQgZm9yIHJlYWRpbmcgYXJjaGl2ZXMgb25seS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSW5mb1ppcDEgPSA4LAorICAgIH0KKworCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgVGhlIG1ldGhvZCBvZiBjb21wcmVzc2lvbiB0byB1c2UgZm9yIGEgcGFydGljdWxhciBaaXBFbnRyeS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gICA8c2VlCisgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXYXJlJ3MKKyAgICAvLy8gICBaSVAgU3BlY2lmaWNhdGlvbjwvc2VlPiBkZXNjcmliZXMgYSBudW1iZXIgb2YgZGlzdGluY3QKKyAgICAvLy8gICBjbW9wcmVzc2lvbiBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGEgemlwCisgICAgLy8vICAgZmlsZS4gRG90TmV0WmlwIHN1cHBvcnRzIGEgc3Vic2V0IG9mIHRoZW0uCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBpbnRlcm5hbCBlbnVtIENvbXByZXNzaW9uTWV0aG9kCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBObyBjb21wcmVzc2lvbiBhdCBhbGwuIEZvciBDT00gZW52aXJvbm1lbnRzLCB0aGUgdmFsdWUgaXMgMCAoemVybykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5vbmUgPSAwLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgREVGTEFURSBjb21wcmVzc2lvbiwgYXMgZGVzY3JpYmVkIGluIDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MS50eHQiPklFVEYgUkZDCisgICAgICAgIC8vLyAgIDE5NTE8L3NlZT4uICBUaGlzIGlzIHRoZSAibm9ybWFsIiBjb21wcmVzc2lvbiB1c2VkIGluIHppcAorICAgICAgICAvLy8gICBmaWxlcy4gRm9yIENPTSBlbnZpcm9ubWVudHMsIHRoZSB2YWx1ZSBpcyA4LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBEZWZsYXRlID0gOCwKKworI2lmIEJaSVAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBCWmlwMiBjb21wcmVzc2lvbiwgYSBjb21wcmVzc2lvbiBhbGdvcml0aG0gZGV2ZWxvcGVkIGJ5IEp1bGlhbiBTZXdhcmQuCisgICAgICAgIC8vLyAgIEZvciBDT00gZW52aXJvbm1lbnRzLCB0aGUgdmFsdWUgaXMgMTIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEJaaXAyID0gMTIsCisjZW5kaWYKKyAgICB9CisKKworI2lmIE5FVENGCisgICAgaW50ZXJuYWwgY2xhc3MgTmV0Q2ZGaWxlCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTZXRUaW1lcyhzdHJpbmcgZmlsZW5hbWUsIERhdGVUaW1lIGN0aW1lLCBEYXRlVGltZSBhdGltZSwgRGF0ZVRpbWUgbXRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEludFB0ciBoRmlsZSAgPSAoSW50UHRyKSBDcmVhdGVGaWxlQ0UoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50KTB4NDAwMDAwMDBMLCAvLyAodWludClGaWxlQWNjZXNzLldyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludCkweDAwMDAwMDAyTCwgLy8gKHVpbnQpRmlsZVNoYXJlLldyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludCkgMywgIC8vID09IG9wZW4gZXhpc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQpMCwgLy8gZmxhZ3NBbmRBdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgICAgICBpZigoaW50KWhGaWxlID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc5NDQ6IGRvbid0IHRocm93IG9uIGZhaWx1cmUgdG8gc2V0IGZpbGUgdGltZXMKKyAgICAgICAgICAgICAgICAvLyB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJDcmVhdGVGaWxlQ0UgRmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVyb3AuTWFyc2hhbC5HZXRMYXN0V2luMzJFcnJvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZXRGaWxlVGltZShoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdENvbnZlcnRlci5HZXRCeXRlcyhjdGltZS5Ub0ZpbGVUaW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQml0Q29udmVydGVyLkdldEJ5dGVzKGF0aW1lLlRvRmlsZVRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMobXRpbWUuVG9GaWxlVGltZSgpKSk7CisKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTZXRMYXN0V3JpdGVUaW1lKHN0cmluZyBmaWxlbmFtZSwgRGF0ZVRpbWUgbXRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEludFB0ciBoRmlsZSAgPSAoSW50UHRyKSBDcmVhdGVGaWxlQ0UoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50KTB4NDAwMDAwMDBMLCAvLyAodWludClGaWxlQWNjZXNzLldyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludCkweDAwMDAwMDAyTCwgLy8gKHVpbnQpRmlsZVNoYXJlLldyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludCkgMywgIC8vID09IG9wZW4gZXhpc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQpMCwgLy8gZmxhZ3NBbmRBdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgICAgICBpZigoaW50KWhGaWxlID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc5NDQ6IGRvbid0IHRocm93IG9uIGZhaWx1cmUgdG8gc2V0IGZpbGUgdGltZQorICAgICAgICAgICAgICAgIC8vIHRocm93IG5ldyBaaXBFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiQ3JlYXRlRmlsZUNFIEZhaWxlZCAoezB9KSIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyb3AuTWFyc2hhbC5HZXRMYXN0V2luMzJFcnJvcigpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVyb3AuTWFyc2hhbC5HZXRMYXN0V2luMzJFcnJvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZXRGaWxlVGltZShoRmlsZSwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdENvbnZlcnRlci5HZXRCeXRlcyhtdGltZS5Ub0ZpbGVUaW1lKCkpKTsKKworICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCisgICAgICAgIFtJbnRlcm9wLkRsbEltcG9ydCgiY29yZWRsbC5kbGwiLCBFbnRyeVBvaW50PSJDcmVhdGVGaWxlIiwgU2V0TGFzdEVycm9yPXRydWUpXQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGludCBDcmVhdGVGaWxlQ0Uoc3RyaW5nIGxwRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IGR3RGVzaXJlZEFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZHdTaGFyZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHBTZWN1cml0eUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaFRlbXBsYXRlRmlsZSk7CisKKworICAgICAgICBbSW50ZXJvcC5EbGxJbXBvcnQoImNvcmVkbGwiLCBFbnRyeVBvaW50PSJHZXRGaWxlQXR0cmlidXRlcyIsIFNldExhc3RFcnJvcj10cnVlKV0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGV4dGVybiB1aW50IEdldEF0dHJpYnV0ZXMoc3RyaW5nIGxwRmlsZU5hbWUpOworCisgICAgICAgIFtJbnRlcm9wLkRsbEltcG9ydCgiY29yZWRsbCIsIEVudHJ5UG9pbnQ9IlNldEZpbGVBdHRyaWJ1dGVzIiwgU2V0TGFzdEVycm9yPXRydWUpXQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGJvb2wgU2V0QXR0cmlidXRlcyhzdHJpbmcgbHBGaWxlTmFtZSwgdWludCBkd0ZpbGVBdHRyaWJ1dGVzKTsKKworICAgICAgICBbSW50ZXJvcC5EbGxJbXBvcnQoImNvcmVkbGwiLCBFbnRyeVBvaW50PSJTZXRGaWxlVGltZSIsIFNldExhc3RFcnJvcj10cnVlKV0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGV4dGVybiBib29sIFNldEZpbGVUaW1lKEludFB0ciBoRmlsZSwgYnl0ZVtdIGxwQ3JlYXRpb25UaW1lLCBieXRlW10gbHBMYXN0QWNjZXNzVGltZSwgYnl0ZVtdIGxwTGFzdFdyaXRlVGltZSk7CisKKyAgICAgICAgW0ludGVyb3AuRGxsSW1wb3J0KCJjb3JlZGxsLmRsbCIsIFNldExhc3RFcnJvcj10cnVlKV0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGV4dGVybiBib29sIENsb3NlSGFuZGxlKEludFB0ciBoT2JqZWN0KTsKKworICAgIH0KKyNlbmRpZgorCisKKworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnlTb3VyY2UuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBFbnRyeVNvdXJjZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjkwYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRW50cnlTb3VyY2UuY3MKQEAgLTAsMCArMSw2OSBAQAorLy8gWmlwRW50cnlTb3VyY2UuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOSBEaW5vIENoaWVzYQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4gCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOiAKKy8vIFRpbWUtc3RhbXA6IDwyMDA5LU5vdmVtYmVyLTE5IDExOjE4OjQyPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gZW51bSB0aGF0IHNwZWNpZmllcyB0aGUgc291cmNlIG9mIHRoZSBaaXBFbnRyeS4gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBpbnRlcm5hbCBlbnVtIFppcEVudHJ5U291cmNlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZhdWx0IHZhbHVlLiAgSW52YWxpZCBvbiBhIGJvbmFmaWRlIFppcEVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBOb25lID0gMCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZW50cnkgd2FzIGluc3RhbnRpYXRlZCBieSBjYWxsaW5nIEFkZEZpbGUoKSBvciBhbm90aGVyIG1ldGhvZCB0aGF0IAorICAgICAgICAvLy8gYWRkZWQgYW4gZW50cnkgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRmlsZVN5c3RlbSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZW50cnkgd2FzIGluc3RhbnRpYXRlZCB2aWEgPHNlZSBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsc3RyaW5nKSIvPiBvcgorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsU3lzdGVtLklPLlN0cmVhbSkiLz4gLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTdHJlYW0sCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFppcEVudHJ5IHdhcyBpbnN0YW50aWF0ZWQgYnkgcmVhZGluZyBhIHppcGZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFppcEZpbGUsCisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29udGVudCBmb3IgdGhlIFppcEVudHJ5IHdpbGwgYmUgb3Igd2FzIHByb3ZpZGVkIGJ5IHRoZSBXcml0ZURlbGVnYXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBXcml0ZURlbGVnYXRlLAorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNvbnRlbnQgZm9yIHRoZSBaaXBFbnRyeSB3aWxsIGJlIG9idGFpbmVkIGZyb20gdGhlIHN0cmVhbSBkaXNwZW5zZWQgYnkgdGhlIDxjPk9wZW5EZWxlZ2F0ZTwvYz4uCisgICAgICAgIC8vLyBUaGUgZW50cnkgd2FzIGluc3RhbnRpYXRlZCB2aWEgPHNlZSBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShzdHJpbmcsT3BlbkRlbGVnYXRlLENsb3NlRGVsZWdhdGUpIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBKaXRTdHJlYW0sCisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29udGVudCBmb3IgdGhlIFppcEVudHJ5IHdpbGwgYmUgb3Igd2FzIG9idGFpbmVkIGZyb20gYSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBaaXBPdXRwdXRTdHJlYW0sCisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEVycm9yQWN0aW9uLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRXJyb3JBY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4OTRkZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEVycm9yQWN0aW9uLmNzCkBAIC0wLDAgKzEsOTcgQEAKKy8vIFppcEVycm9yQWN0aW9uLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpICAyMDA5IERpbm8gQ2hpZXNhCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLiAKKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6IAorLy8gVGltZS1zdGFtcDogPDIwMDktU2VwdGVtYmVyLTAxIDE4OjQzOjIwPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIFppcEVycm9yQWN0aW9uIGVudW0sIHdoaWNoIHByb3ZpZGVzCisvLyBhbiBhY3Rpb24gdG8gdGFrZSB3aGVuIGVycm9ycyBvY2N1ciB3aGVuIG9wZW5pbmcgb3IgcmVhZGluZworLy8gZmlsZXMgdG8gYmUgYWRkZWQgdG8gYSB6aXAgZmlsZS4gCisvLyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGVudW0gcHJvdmlkaW5nIHRoZSBvcHRpb25zIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBvcGVuaW5nIG9yIHJlYWRpbmcKKyAgICAvLy8gb2YgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIGJlaW5nIHNhdmVkIHRvIGEgemlwIGZpbGUuIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyAgPHBhcmE+CisgICAgLy8vICAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIGFjdGlvbnMgdGhhdCB0aGUgbGlicmFyeSBjYW4gdGFrZSB3aGVuIGFuIGVycm9yIG9jY3VycworICAgIC8vLyAgICBvcGVuaW5nIG9yIHJlYWRpbmcgYSBmaWxlLCBhcyBpdCBpcyBiZWluZyBzYXZlZCBpbnRvIGEgWmlwIGFyY2hpdmUuIAorICAgIC8vLyAgPC9wYXJhPgorICAgIC8vLworICAgIC8vLyAgPHBhcmE+CisgICAgLy8vICAgICBJbiBzb21lIGNhc2VzIGFuIGVycm9yIHdpbGwgb2NjdXIgd2hlbiBEb3ROZXRaaXAgdHJpZXMgdG8gb3BlbiBhIGZpbGUgdG8gYmUKKyAgICAvLy8gICAgIGFkZGVkIHRvIHRoZSB6aXAgYXJjaGl2ZS4gIEluIG90aGVyIGNhc2VzLCBhbiBlcnJvciBtaWdodCBvY2N1ciBhZnRlciB0aGUKKyAgICAvLy8gICAgIGZpbGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IG9wZW5lZCwgd2hpbGUgRG90TmV0WmlwIGlzIHJlYWRpbmcgdGhlIGZpbGUuCisgICAgLy8vICA8L3BhcmE+CisgICAgLy8vIAorICAgIC8vLyAgPHBhcmE+CisgICAgLy8vICAgIFRoZSBmaXJzdCBwcm9ibGVtIG1pZ2h0IG9jY3VyIHdoZW4gY2FsbGluZyBBZGREaXJlY3RvcnkoKSBvbiBhIGRpcmVjdG9yeQorICAgIC8vLyAgICB0aGF0IGNvbnRhaW5zIGEgQ2xpcHBlciAuZGJmIGZpbGU7IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBDbGlwcGVyIGFuZAorICAgIC8vLyAgICBjYW5ub3QgYmUgb3BlbmVkIGJ5IGFub3RoZXIgcHJvY2Vzcy4gQW4gZXhhbXBsZSBvZiB0aGUgc2Vjb25kIHByb2JsZW0gaXMKKyAgICAvLy8gICAgdGhlIEVSUk9SX0xPQ0tfVklPTEFUSU9OIHRoYXQgcmVzdWx0cyB3aGVuIGEgZmlsZSBpcyBvcGVuZWQgYnkgYW5vdGhlcgorICAgIC8vLyAgICBwcm9jZXNzLCBidXQgbm90IGxvY2tlZCwgYW5kIGEgcmFuZ2UgbG9jayBoYXMgYmVlbiB0YWtlbiBvbiB0aGUgZmlsZS4KKyAgICAvLy8gICAgTWljcm9zb2Z0IE91dGxvb2sgdGFrZXMgcmFuZ2UgbG9ja3Mgb24gLlBTVCBmaWxlcy4KKyAgICAvLy8gIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGludGVybmFsIGVudW0gWmlwRXJyb3JBY3Rpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSB6aXBwaW5nLiAgVGhpcyBpcyB0aGUgZGVmYXVsdAorICAgICAgICAvLy8gYmVoYXZpb3IuICAoRm9yIENPTSBjbGllbnRzLCB0aGlzIGlzIGEgMCAoemVybykuKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUaHJvdywKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgemlwcGluZywgZm9yIGV4YW1wbGUgYSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsCisgICAgICAgIC8vLyBza2lwIHRoZSBmaWxlIGNhdXNpbmcgdGhlIGVycm9yLCBhbmQgY29udGludWUgemlwcGluZy4gIChGb3IgQ09NIGNsaWVudHMsCisgICAgICAgIC8vLyB0aGlzIGlzIGEgMS4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNraXAsCisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXaGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgemlwcGluZywgZm9yIGV4YW1wbGUgYSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsCisgICAgICAgIC8vLyByZXRyeSB0aGUgb3BlcmF0aW9uIHRoYXQgY2F1c2VkIHRoZSBlcnJvci4gQmUgY2FyZWZ1bCB3aXRoIHRoaXMgb3B0aW9uLiBJZgorICAgICAgICAvLy8gdGhlIGVycm9yIGlzIG5vdCB0ZW1wb3JhcnksIHRoZSBsaWJyYXJ5IHdpbGwgcmV0cnkgZm9yZXZlci4gIChGb3IgQ09NCisgICAgICAgIC8vLyBjbGllbnRzLCB0aGlzIGlzIGEgMi4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFJldHJ5LAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZW4gYW4gZXJyb3Igb2NjdXJzLCBpbnZva2UgdGhlIHppcEVycm9yIGV2ZW50LiAgVGhlIGV2ZW50IHR5cGUgdXNlZCBpcworICAgICAgICAvLy8gPHNlZSBjcmVmPSJaaXBQcm9ncmVzc0V2ZW50VHlwZS5FcnJvcl9TYXZpbmciLz4uICBBIHR5cGljYWwgdXNlIG9mIHRoaXMgb3B0aW9uOgorICAgICAgICAvLy8gYSBHVUkgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gcG9wIHVwIGEgZGlhbG9nIHRvIGFsbG93IHRoZSB1c2VyIHRvIHZpZXcgdGhlCisgICAgICAgIC8vLyBlcnJvciB0aGF0IG9jY3VycmVkLCBhbmQgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIGFjdGlvbi4gIEFmdGVyIHlvdXIKKyAgICAgICAgLy8vIHByb2Nlc3NpbmcgaW4gdGhlIGVycm9yIGV2ZW50LCBpZiB5b3Ugd2FudCB0byBza2lwIHRoZSBmaWxlLCBzZXQgPHNlZQorICAgICAgICAvLy8gY3JlZj0iWmlwRW50cnkuWmlwRXJyb3JBY3Rpb24iLz4gb24gdGhlCisgICAgICAgIC8vLyA8Yz5aaXBQcm9ncmVzc0V2ZW50QXJncy5DdXJyZW50RW50cnk8L2M+IHRvIDxjPlNraXA8L2M+LiAgSWYgeW91IHdhbnQgdGhlCisgICAgICAgIC8vLyBleGNlcHRpb24gdG8gYmUgdGhyb3duLCBzZXQgPGM+WmlwRXJyb3JBY3Rpb248L2M+IG9uIHRoZSA8Yz5DdXJyZW50RW50cnk8L2M+CisgICAgICAgIC8vLyB0byA8Yz5UaHJvdzwvYz4uICBJZiB5b3Ugd2FudCB0byBjYW5jZWwgdGhlIHppcCwgc2V0CisgICAgICAgIC8vLyA8Yz5aaXBQcm9ncmVzc0V2ZW50QXJncy5DYW5jZWw8L2M+IHRvIHRydWUuICBDYW5jZWxsaW5nIGRpZmZlcnMgZnJvbSB1c2luZworICAgICAgICAvLy8gU2tpcCBpbiB0aGF0IGEgY2FuY2VsIHdpbGwgbm90IHNhdmUgYW55IGZ1cnRoZXIgZW50cmllcywgaWYgdGhlcmUgYXJlIGFueS4KKyAgICAgICAgLy8vIChGb3IgQ09NIGNsaWVudHMsIHRoZSB2YWx1ZSBvZiB0aGlzIGVudW0gaXMgYSAzLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSW52b2tlRXJyb3JFdmVudCwKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuQWRkVXBkYXRlLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5BZGRVcGRhdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlOTU4OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuQWRkVXBkYXRlLmNzCkBAIC0wLDAgKzEsMjE4MiBAQAorLy8gWmlwRmlsZS5BZGRVcGRhdGUuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOS0yMDExIERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1Ob3ZlbWJlci0wMSAxMzo1Njo1OD4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGZvciBBZGRpbmcgYW5kIFVwZGF0aW5nIGVudHJpZXMgaW4KKy8vIHRoZSBaaXBGaWxlLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgWmlwRmlsZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGRzIGFuIGl0ZW0sIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnksIHRvIGEgemlwIGZpbGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCBpcyBoYW5keSBpZiB5b3UgYXJlIGFkZGluZyB0aGluZ3MgdG8gemlwIGFyY2hpdmUgYW5kIGRvbid0CisgICAgICAgIC8vLyAgIHdhbnQgdG8gYm90aGVyIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gZGlyZWN0b3JpZXMgb3IgZmlsZXMuICBBbnkgZmlsZXMgYXJlCisgICAgICAgIC8vLyAgIGFkZGVkIGFzIHNpbmdsZSBlbnRyaWVzLiAgQSBkaXJlY3RvcnkgYWRkZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBpcyBhZGRlZAorICAgICAgICAvLy8gICByZWN1cnNpdmVseTogYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBjb250YWluZWQgd2l0aGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgLy8vICAgYXJlIGFkZGVkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGl0ZW0gbWF5IGJlIGEgcmVsYXRpdmUgcGF0aCBvciBhIGZ1bGx5LXF1YWxpZmllZAorICAgICAgICAvLy8gICBwYXRoLiBSZW1lbWJlciwgdGhlIGl0ZW1zIGNvbnRhaW5lZCBpbiA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSBnZXQgd3JpdHRlbgorICAgICAgICAvLy8gICB0byB0aGUgZGlzayBvbmx5IHdoZW4geW91IGNhbGwgPHNlZSBjcmVmPSJaaXBGaWxlLlNhdmUoKSIvPiBvciBhIHNpbWlsYXIKKyAgICAgICAgLy8vICAgc2F2ZSBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBkaXJlY3RvcnkgbmFtZSB1c2VkIGZvciB0aGUgZmlsZSB3aXRoaW4gdGhlIGFyY2hpdmUgaXMgdGhlIHNhbWUKKyAgICAgICAgLy8vICAgYXMgdGhlIGRpcmVjdG9yeSBuYW1lIChwb3RlbnRpYWxseSBhIHJlbGF0aXZlIHBhdGgpIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgLy8vICAgPHBhcmFtcmVmIG5hbWU9ImZpbGVPckRpcmVjdG9yeU5hbWUiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZEZpbGUoc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkRGlyZWN0b3J5KHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZUl0ZW0oc3RyaW5nKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxvdmVybG9hZHM+VGhpcyBtZXRob2QgaGFzIHR3byBvdmVybG9hZHMuPC9vdmVybG9hZHM+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU9yRGlyZWN0b3J5TmFtZSI+CisgICAgICAgIC8vLyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gYWRkLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIDxjPlppcEVudHJ5PC9jPiBhZGRlZC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBBZGRJdGVtKHN0cmluZyBmaWxlT3JEaXJlY3RvcnlOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQWRkSXRlbShmaWxlT3JEaXJlY3RvcnlOYW1lLCBudWxsKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGRzIGFuIGl0ZW0sIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnksIHRvIGEgemlwIGZpbGUgYXJjaGl2ZSwKKyAgICAgICAgLy8vICAgZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZSBkaXJlY3RvcnkgcGF0aCB0byBiZSB1c2VkIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIGFkZGluZyBhIGRpcmVjdG9yeSwgdGhlIGFkZCBpcyByZWN1cnNpdmUgb24gYWxsIGZpbGVzIGFuZAorICAgICAgICAvLy8gICBzdWJkaXJlY3RvcmllcyBjb250YWluZWQgd2l0aGluIGl0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lIG9mIHRoZSBpdGVtIG1heSBiZSBhIHJlbGF0aXZlIHBhdGggb3IgYSBmdWxseS1xdWFsaWZpZWQgcGF0aC4KKyAgICAgICAgLy8vICAgVGhlIGl0ZW0gYWRkZWQgYnkgdGhpcyBjYWxsIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiBpcyBub3QgcmVhZCBmcm9tIHRoZQorICAgICAgICAvLy8gICBkaXNrIG5vciB3cml0dGVuIHRvIHRoZSB6aXAgZmlsZSBhcmNoaXZlIHVudGlsIHRoZSBhcHBsaWNhdGlvbiBjYWxscworICAgICAgICAvLy8gICBTYXZlKCkgb24gdGhlIDxjPlppcEZpbGU8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBhbGxvd3MgdGhlIGNhbGxlciB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBwYXRoIHRvIGJlIHVzZWQgaW4gdGhlIGFyY2hpdmUsIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHRoZQorICAgICAgICAvLy8gICAibmF0dXJhbCIgcGF0aCBvZiB0aGUgZmlsZXN5c3RlbSBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBFbmNyeXB0aW9uIHdpbGwgYmUgdXNlZCBvbiB0aGUgZmlsZSBkYXRhIGlmIHRoZSA8Yz5QYXNzd29yZDwvYz4gaGFzCisgICAgICAgIC8vLyAgIGJlZW4gc2V0IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBvYmplY3QsIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLklPLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CisgICAgICAgIC8vLyAgIFRocm93biBpZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgcGFzc2VkIGluIGRvZXMgbm90IGV4aXN0LgorICAgICAgICAvLy8gPC9leGNlcHRpb24+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVPckRpcmVjdG9yeU5hbWUiPnRoZSBuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhZGQuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBwYXRoIHRvIHVzZSB3aXRoaW4gdGhlIHppcCBhcmNoaXZlLiAgVGhpcyBwYXRoCisgICAgICAgIC8vLyAgIG5lZWQgbm90IHJlZmVyIHRvIGFuIGV4dGFudCBkaXJlY3RvcnkgaW4gdGhlIGN1cnJlbnQgZmlsZXN5c3RlbS4gIElmIHRoZQorICAgICAgICAvLy8gICBmaWxlcyB3aXRoaW4gdGhlIHppcCBhcmUgbGF0ZXIgZXh0cmFjdGVkLCB0aGlzIGlzIHRoZSBwYXRoIHVzZWQgZm9yIHRoZQorICAgICAgICAvLy8gICBleHRyYWN0ZWQgZmlsZS4gIFBhc3NpbmcgPGM+bnVsbDwvYz4gKDxjPk5vdGhpbmc8L2M+IGluIFZCKSB3aWxsIHVzZSB0aGUKKyAgICAgICAgLy8vICAgcGF0aCBvbiB0aGUgZmlsZU9yRGlyZWN0b3J5TmFtZS4gIFBhc3NpbmcgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwKKyAgICAgICAgLy8vICAgaW5zZXJ0IHRoZSBpdGVtIGF0IHRoZSByb290IHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRGaWxlKHN0cmluZywgc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkRGlyZWN0b3J5KHN0cmluZywgc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlSXRlbShzdHJpbmcsIHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB6aXAgdXAgYSBzZXQgb2YgZmlsZXMgaW50byBhIGZsYXQgaGllcmFyY2h5LAorICAgICAgICAvLy8gICByZWdhcmRsZXNzIG9mIHdoZXJlIGluIHRoZSBmaWxlc3lzdGVtIHRoZSBmaWxlcyBvcmlnaW5hdGVkLiBUaGUgcmVzdWx0aW5nCisgICAgICAgIC8vLyAgIHppcCBhcmNoaXZlIHdpbGwgY29udGFpbiBhIHRvcGxldmVsIGRpcmVjdG9yeSBuYW1lZCAiZmxhdCIsIHdoaWNoIGl0c2VsZgorICAgICAgICAvLy8gICB3aWxsIGNvbnRhaW4gZmlsZXMgUmVhZG1lLnR4dCwgTXlQcm9wb3NhbC5kb2N4LCBhbmQgSW1hZ2UxLmpwZy4gIEEKKyAgICAgICAgLy8vICAgc3ViZGlyZWN0b3J5IHVuZGVyICJmbGF0IiBjYWxsZWQgU3VwcG9ydEZpbGVzIHdpbGwgY29udGFpbiBhbGwgdGhlIGZpbGVzCisgICAgICAgIC8vLyAgIGluIHRoZSAiYzpcU3VwcG9ydEZpbGVzIiBkaXJlY3Rvcnkgb24gZGlzay4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIFN0cmluZ1tdIGl0ZW1uYW1lcz0geworICAgICAgICAvLy8gICAiYzpcXGZpeGVkQ29udGVudFxcUmVhZG1lLnR4dCIsCisgICAgICAgIC8vLyAgICJNeVByb3Bvc2FsLmRvY3giLAorICAgICAgICAvLy8gICAiYzpcXFN1cHBvcnRGaWxlcyIsICAvLyBhIGRpcmVjdG9yeQorICAgICAgICAvLy8gICAiaW1hZ2VzXFxJbWFnZTEuanBnIgorICAgICAgICAvLy8gfTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyB0cnkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIGZvciAoaW50IGkgPSAxOyBpICZsdDsgaXRlbW5hbWVzLkxlbmd0aDsgaSsrKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgIC8vIHdpbGwgYWRkIEZpbGVzIG9yIERpcnMsIHJlY3Vyc2VzIGFuZCBmbGF0dGVucyBzdWJkaXJlY3RvcmllcworICAgICAgICAvLy8gICAgICAgemlwLkFkZEl0ZW0oaXRlbW5hbWVzW2ldLCJmbGF0Iik7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKFppcFRvQ3JlYXRlKTsKKyAgICAgICAgLy8vICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gY2F0Y2ggKFN5c3RlbS5FeGNlcHRpb24gZXgxKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICBTeXN0ZW0uQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImV4Y2VwdGlvbjogezB9IiwgZXgxKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyAgIERpbSBpdGVtbmFtZXMgQXMgU3RyaW5nKCkgPSBfCisgICAgICAgIC8vLyAgICAgTmV3IFN0cmluZygpIHsgImM6XGZpeGVkQ29udGVudFxSZWFkbWUudHh0IiwgXworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICJNeVByb3Bvc2FsLmRvY3giLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnRGaWxlcyIsIF8KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAiaW1hZ2VzXEltYWdlMS5qcGciIH0KKyAgICAgICAgLy8vICAgVHJ5CisgICAgICAgIC8vLyAgICAgICBVc2luZyB6aXAgQXMgTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICAgICAgICBEaW0gaSBBcyBJbnRlZ2VyCisgICAgICAgIC8vLyAgICAgICAgICAgRm9yIGkgPSAxIFRvIGl0ZW1uYW1lcy5MZW5ndGggLSAxCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICcgd2lsbCBhZGQgRmlsZXMgb3IgRGlycywgcmVjdXJzaW5nIGFuZCBmbGF0dGVuaW5nIHN1YmRpcmVjdG9yaWVzLgorICAgICAgICAvLy8gICAgICAgICAgICAgICB6aXAuQWRkSXRlbShpdGVtbmFtZXMoaSksICJmbGF0IikKKyAgICAgICAgLy8vICAgICAgICAgICBOZXh0IGkKKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuU2F2ZShaaXBUb0NyZWF0ZSkKKyAgICAgICAgLy8vICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICBDYXRjaCBleDEgQXMgRXhjZXB0aW9uCisgICAgICAgIC8vLyAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiZXhjZXB0aW9uOiB7MH0iLCBleDEuVG9TdHJpbmcoKSkKKyAgICAgICAgLy8vICAgRW5kIFRyeQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIDxjPlppcEVudHJ5PC9jPiBhZGRlZC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBBZGRJdGVtKFN0cmluZyBmaWxlT3JEaXJlY3RvcnlOYW1lLCBTdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGZpbGVPckRpcmVjdG9yeU5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBBZGRGaWxlKGZpbGVPckRpcmVjdG9yeU5hbWUsIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpOworCisgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhmaWxlT3JEaXJlY3RvcnlOYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQWRkRGlyZWN0b3J5KGZpbGVPckRpcmVjdG9yeU5hbWUsIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlRoYXQgZmlsZSBvciBkaXJlY3RvcnkgKHswfSkgZG9lcyBub3QgZXhpc3QhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlT3JEaXJlY3RvcnlOYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEFkZHMgYSBGaWxlIHRvIGEgWmlwIGZpbGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGNhbGwgY29sbGVjdHMgbWV0YWRhdGEgZm9yIHRoZSBuYW1lZCBmaWxlIGluIHRoZSBmaWxlc3lzdGVtLAorICAgICAgICAvLy8gICBpbmNsdWRpbmcgdGhlIGZpbGUgYXR0cmlidXRlcyBhbmQgdGhlIHRpbWVzdGFtcCwgYW5kIGluc2VydHMgdGhhdCBtZXRhZGF0YQorICAgICAgICAvLy8gICBpbnRvIHRoZSByZXN1bHRpbmcgWmlwRW50cnkuICBPbmx5IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGNhbGxzIFNhdmUoKSBvbgorICAgICAgICAvLy8gICB0aGUgPGM+WmlwRmlsZTwvYz4sIGRvZXMgRG90TmV0WmlwIHJlYWQgdGhlIGZpbGUgZnJvbSB0aGUgZmlsZXN5c3RlbSBhbmQKKyAgICAgICAgLy8vICAgdGhlbiB3cml0ZSB0aGUgY29udGVudCB0byB0aGUgemlwIGZpbGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZW50cnkgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkKKyAgICAgICAgLy8vICAgZXhpc3RzIGluIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIDxjPlppcEZpbGU8L2M+IHByb3BlcnRpZXMgaW5jbHVkaW5nIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiwgPHNlZSBjcmVmPSJTZXRDb21wcmVzc2lvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+LCA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4sIGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHRoZWlyCisgICAgICAgIC8vLyAgIHJlc3BlY3RpdmUgdmFsdWVzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gdGhpcyBleGFtcGxlLCB0aHJlZSBmaWxlcyBhcmUgYWRkZWQgdG8gYSBaaXAgYXJjaGl2ZS4gVGhlIFJlYWRNZS50eHQKKyAgICAgICAgLy8vICAgZmlsZSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgcm9vdCBvZiB0aGUgYXJjaGl2ZS4gVGhlIC5wbmcgZmlsZSB3aWxsIGJlCisgICAgICAgIC8vLyAgIHBsYWNlZCBpbiBhIGZvbGRlciB3aXRoaW4gdGhlIHppcCBjYWxsZWQgcGhvdG9zXHBlcnNvbmFsLiAgVGhlIHBkZiBmaWxlCisgICAgICAgIC8vLyAgIHdpbGwgYmUgaW5jbHVkZWQgaW50byBhIGZvbGRlciB3aXRoaW4gdGhlIHppcCBjYWxsZWQgRGVza3RvcC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gICAgdHJ5CisgICAgICAgIC8vLyAgICB7CisgICAgICAgIC8vLyAgICAgIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICB6aXAuQWRkRmlsZSgiYzpcXHBob3Rvc1xccGVyc29uYWxcXDc0NDAtTjQ5dGgucG5nIik7CisgICAgICAgIC8vLyAgICAgICAgemlwLkFkZEZpbGUoImM6XFxEZXNrdG9wXFwyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiKTsKKyAgICAgICAgLy8vICAgICAgICB6aXAuQWRkRmlsZSgiUmVhZE1lLnR4dCIpOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgICB6aXAuU2F2ZSgiUGFja2FnZS56aXAiKTsKKyAgICAgICAgLy8vICAgICAgfQorICAgICAgICAvLy8gICAgfQorICAgICAgICAvLy8gICAgY2F0Y2ggKFN5c3RlbS5FeGNlcHRpb24gZXgxKQorICAgICAgICAvLy8gICAgeworICAgICAgICAvLy8gICAgICBTeXN0ZW0uQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImV4Y2VwdGlvbjogIiArIGV4MSk7CisgICAgICAgIC8vLyAgICB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gIFRyeQorICAgICAgICAvLy8gICAgICAgVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgICAgICAgIHppcC5BZGRGaWxlKCJjOlxwaG90b3NccGVyc29uYWxcNzQ0MC1ONDl0aC5wbmciKQorICAgICAgICAvLy8gICAgICAgICAgIHppcC5BZGRGaWxlKCJjOlxEZXNrdG9wXDIwMDgtUmVnaW9uYWwtU2FsZXMtUmVwb3J0LnBkZiIpCisgICAgICAgIC8vLyAgICAgICAgICAgemlwLkFkZEZpbGUoIlJlYWRNZS50eHQiKQorICAgICAgICAvLy8gICAgICAgICAgIHppcC5TYXZlKCJQYWNrYWdlLnppcCIpCisgICAgICAgIC8vLyAgICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgQ2F0Y2ggZXgxIEFzIEV4Y2VwdGlvbgorICAgICAgICAvLy8gICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImV4Y2VwdGlvbjogezB9IiwgZXgxLlRvU3RyaW5nKQorICAgICAgICAvLy8gICBFbmQgVHJ5CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPG92ZXJsb2Fkcz5UaGlzIG1ldGhvZCBoYXMgdHdvIG92ZXJsb2Fkcy48L292ZXJsb2Fkcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRJdGVtKHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZERpcmVjdG9yeShzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5VcGRhdGVGaWxlKHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBhZGQuIEl0IHNob3VsZCByZWZlciB0byBhIGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0uCisgICAgICAgIC8vLyAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG1heSBiZSBhIHJlbGF0aXZlIHBhdGggb3IgYSBmdWxseS1xdWFsaWZpZWQgcGF0aC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgPGM+WmlwRW50cnk8L2M+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEZpbGUgYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgWmlwRW50cnkgQWRkRmlsZShzdHJpbmcgZmlsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRGaWxlKGZpbGVOYW1lLCBudWxsKTsKKyAgICAgICAgfQorCisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGRzIGEgRmlsZSB0byBhIFppcCBmaWxlIGFyY2hpdmUsIHBvdGVudGlhbGx5IG92ZXJyaWRpbmcgdGhlIHBhdGggdG8gYmUKKyAgICAgICAgLy8vICAgdXNlZCB3aXRoaW4gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBmaWxlIGFkZGVkIGJ5IHRoaXMgY2FsbCB0byB0aGUgPGM+WmlwRmlsZTwvYz4gaXMgbm90IHdyaXR0ZW4gdG8gdGhlCisgICAgICAgIC8vLyAgIHppcCBmaWxlIGFyY2hpdmUgdW50aWwgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIFNhdmUoKSBvbiB0aGUgPGM+WmlwRmlsZTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5CisgICAgICAgIC8vLyAgIGV4aXN0cyBpbiB0aGUgPGM+WmlwRmlsZTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGFsbG93cyB0aGUgY2FsbGVyIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IHBhdGggdG8gYmUgdXNlZCBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIDxjPlppcEZpbGU8L2M+IHByb3BlcnRpZXMgaW5jbHVkaW5nIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiwgPHNlZSBjcmVmPSJTZXRDb21wcmVzc2lvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+LCA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4sIGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHRoZWlyCisgICAgICAgIC8vLyAgIHJlc3BlY3RpdmUgdmFsdWVzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gdGhpcyBleGFtcGxlLCB0aHJlZSBmaWxlcyBhcmUgYWRkZWQgdG8gYSBaaXAgYXJjaGl2ZS4gVGhlIFJlYWRNZS50eHQKKyAgICAgICAgLy8vICAgZmlsZSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgcm9vdCBvZiB0aGUgYXJjaGl2ZS4gVGhlIC5wbmcgZmlsZSB3aWxsIGJlCisgICAgICAgIC8vLyAgIHBsYWNlZCBpbiBhIGZvbGRlciB3aXRoaW4gdGhlIHppcCBjYWxsZWQgaW1hZ2VzLiAgVGhlIHBkZiBmaWxlIHdpbGwgYmUKKyAgICAgICAgLy8vICAgaW5jbHVkZWQgaW50byBhIGZvbGRlciB3aXRoaW4gdGhlIHppcCBjYWxsZWQgZmlsZXNcZG9jcywgYW5kIHdpbGwgYmUKKyAgICAgICAgLy8vICAgZW5jcnlwdGVkIHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB0cnkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIC8vIHRoZSBmb2xsb3dpbmcgZW50cnkgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgcm9vdCBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZSgiYzpcXGRhdGFmaWxlc1xcUmVhZE1lLnR4dCIsICIiKTsKKyAgICAgICAgLy8vICAgICAvLyB0aGlzIGltYWdlIGZpbGUgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSAiaW1hZ2VzIiBkaXJlY3RvcnkgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoImM6XFxwaG90b3NcXHBlcnNvbmFsXFw3NDQwLU40OXRoLnBuZyIsICJpbWFnZXMiKTsKKyAgICAgICAgLy8vICAgICAvLyB0aGUgZm9sbG93aW5nIHdpbGwgcmVzdWx0IGluIGEgcGFzc3dvcmQtcHJvdGVjdGVkIGZpbGUgY2FsbGVkCisgICAgICAgIC8vLyAgICAgLy8gZmlsZXNcXGRvY3NcXDIwMDgtUmVnaW9uYWwtU2FsZXMtUmVwb3J0LnBkZiAgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgIC8vLyAgICAgemlwLlBhc3N3b3JkID0gIkVuY3J5cHRNZSEiOworICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCJjOlxcRGVza3RvcFxcMjAwOC1SZWdpb25hbC1TYWxlcy1SZXBvcnQucGRmIiwgImZpbGVzXFxkb2NzIik7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoIkFyY2hpdmUuemlwIik7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIGNhdGNoIChTeXN0ZW0uRXhjZXB0aW9uIGV4MSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgU3lzdGVtLkNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJleGNlcHRpb246IHswfSIsIGV4MSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gICBUcnkKKyAgICAgICAgLy8vICAgICAgIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICAgICAgICAnIHRoZSBmb2xsb3dpbmcgZW50cnkgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgcm9vdCBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuQWRkRmlsZSgiYzpcZGF0YWZpbGVzXFJlYWRNZS50eHQiLCAiIikKKyAgICAgICAgLy8vICAgICAgICAgICAnIHRoaXMgaW1hZ2UgZmlsZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlICJpbWFnZXMiIGRpcmVjdG9yeSBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuQWRkRmlsZSgiYzpccGhvdG9zXHBlcnNvbmFsXDc0NDAtTjQ5dGgucG5nIiwgImltYWdlcyIpCisgICAgICAgIC8vLyAgICAgICAgICAgJyB0aGUgZm9sbG93aW5nIHdpbGwgcmVzdWx0IGluIGEgcGFzc3dvcmQtcHJvdGVjdGVkIGZpbGUgY2FsbGVkCisgICAgICAgIC8vLyAgICAgICAgICAgJyBmaWxlc1xcZG9jc1xcMjAwOC1SZWdpb25hbC1TYWxlcy1SZXBvcnQucGRmICBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuUGFzc3dvcmQgPSAiRW5jcnlwdE1lISIKKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuQWRkRmlsZSgiYzpcRGVza3RvcFwyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiLCAiZmlsZXNcZG9jdW1lbnRzIikKKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuU2F2ZSgiQXJjaGl2ZS56aXAiKQorICAgICAgICAvLy8gICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgIENhdGNoIGV4MSBBcyBFeGNlcHRpb24KKyAgICAgICAgLy8vICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJleGNlcHRpb246IHswfSIsIGV4MSkKKyAgICAgICAgLy8vICAgRW5kIFRyeQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZEl0ZW0oc3RyaW5nLHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZERpcmVjdG9yeShzdHJpbmcsIHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZUZpbGUoc3RyaW5nLHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBhZGQuICBUaGUgbmFtZSBvZiB0aGUgZmlsZSBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoCisgICAgICAgIC8vLyAgIG9yIGEgZnVsbHktcXVhbGlmaWVkIHBhdGguCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHBhdGggdG8gdXNlIHRvIG92ZXJyaWRlIGFueSBwYXRoIGluIHRoZSBmaWxlTmFtZS4KKyAgICAgICAgLy8vICAgVGhpcyBwYXRoIG1heSwgb3IgbWF5IG5vdCwgY29ycmVzcG9uZCB0byBhIHJlYWwgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50CisgICAgICAgIC8vLyAgIGZpbGVzeXN0ZW0uICBJZiB0aGUgZmlsZXMgd2l0aGluIHRoZSB6aXAgYXJlIGxhdGVyIGV4dHJhY3RlZCwgdGhpcyBpcyB0aGUKKyAgICAgICAgLy8vICAgcGF0aCB1c2VkIGZvciB0aGUgZXh0cmFjdGVkIGZpbGUuICBQYXNzaW5nIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbgorICAgICAgICAvLy8gICBWQikgd2lsbCB1c2UgdGhlIHBhdGggb24gdGhlIGZpbGVOYW1lLCBpZiBhbnkuICBQYXNzaW5nIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgLy8vICAgKCIiKSB3aWxsIGluc2VydCB0aGUgaXRlbSBhdCB0aGUgcm9vdCBwYXRoIHdpdGhpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIDxjPlppcEVudHJ5PC9jPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlIGFkZGVkLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFppcEVudHJ5IEFkZEZpbGUoc3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG5hbWVJbkFyY2hpdmUgPSBaaXBFbnRyeS5OYW1lSW5BcmNoaXZlKGZpbGVOYW1lLCBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKTsKKyAgICAgICAgICAgIFppcEVudHJ5IHplID0gWmlwRW50cnkuQ3JlYXRlRnJvbUZpbGUoZmlsZU5hbWUsIG5hbWVJbkFyY2hpdmUpOworICAgICAgICAgICAgaWYgKFZlcmJvc2UpIFN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgiYWRkaW5nIHswfS4uLiIsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBfSW50ZXJuYWxBZGRFbnRyeSh6ZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgcmVtb3ZlcyBhIGNvbGxlY3Rpb24gb2YgZW50cmllcyBmcm9tIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cmllc1RvUmVtb3ZlIj4KKyAgICAgICAgLy8vICAgQSBjb2xsZWN0aW9uIG9mIFppcEVudHJ5IGluc3RhbmNlcyBmcm9tIHRoaXMgemlwIGZpbGUgdG8gYmUgcmVtb3ZlZC4gRm9yCisgICAgICAgIC8vLyAgIGV4YW1wbGUsIHlvdSBjYW4gcGFzcyBpbiBhbiBhcnJheSBvZiBaaXBFbnRyeSBpbnN0YW5jZXM7IG9yIHlvdSBjYW4gY2FsbAorICAgICAgICAvLy8gICBTZWxlY3RFbnRyaWVzKCksIGFuZCB0aGVuIGFkZCBvciByZW1vdmUgZW50cmllcyBmcm9tIHRoYXQKKyAgICAgICAgLy8vICAgSUNvbGxlY3Rpb24mbHQ7WmlwRW50cnkmZ3Q7IChJQ29sbGVjdGlvbihPZiBaaXBFbnRyeSkgaW4gVkIpLCBhbmQgcGFzcworICAgICAgICAvLy8gICB0aGF0IElDb2xsZWN0aW9uIHRvIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5TZWxlY3RFbnRyaWVzKFN0cmluZykiIC8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5SZW1vdmVTZWxlY3RlZEVudHJpZXMoU3RyaW5nKSIgLz4KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlRW50cmllcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29sbGVjdGlvbjxaaXBFbnRyeT4gZW50cmllc1RvUmVtb3ZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW50cmllc1RvUmVtb3ZlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiZW50cmllc1RvUmVtb3ZlIik7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gZW50cmllc1RvUmVtb3ZlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuUmVtb3ZlRW50cnkoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgcmVtb3ZlcyBhIGNvbGxlY3Rpb24gb2YgZW50cmllcyBmcm9tIHRoZSA8Yz5aaXBGaWxlPC9jPiwgYnkgbmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cmllc1RvUmVtb3ZlIj4KKyAgICAgICAgLy8vICAgQSBjb2xsZWN0aW9uIG9mIHN0cmluZ3MgdGhhdCByZWZlciB0byBuYW1lcyBvZiBlbnRyaWVzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgLy8vICAgZnJvbSB0aGUgPGM+WmlwRmlsZTwvYz4uICBGb3IgZXhhbXBsZSwgeW91IGNhbiBwYXNzIGluIGFuIGFycmF5IG9yIGEKKyAgICAgICAgLy8vICAgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcHJvdmlkZSB0aGUgbmFtZXMgb2YgZW50cmllcyB0byBiZSByZW1vdmVkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5TZWxlY3RFbnRyaWVzKFN0cmluZykiIC8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5SZW1vdmVTZWxlY3RlZEVudHJpZXMoU3RyaW5nKSIgLz4KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlRW50cmllcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29sbGVjdGlvbjxTdHJpbmc+IGVudHJpZXNUb1JlbW92ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVudHJpZXNUb1JlbW92ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImVudHJpZXNUb1JlbW92ZSIpOworCisgICAgICAgICAgICBmb3JlYWNoIChTdHJpbmcgZSBpbiBlbnRyaWVzVG9SZW1vdmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5SZW1vdmVFbnRyeShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCBhZGRzIGEgc2V0IG9mIGZpbGVzIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBVc2UgdGhpcyBtZXRob2QgdG8gYWRkIGEgc2V0IG9mIGZpbGVzIHRvIHRoZSB6aXAgYXJjaGl2ZSwgaW4gb25lIGNhbGwuCisgICAgICAgIC8vLyAgIEZvciBleGFtcGxlLCBhIGxpc3Qgb2YgZmlsZXMgcmVjZWl2ZWQgZnJvbQorICAgICAgICAvLy8gICA8Yz5TeXN0ZW0uSU8uRGlyZWN0b3J5LkdldEZpbGVzKCk8L2M+IGNhbiBiZSBhZGRlZCB0byBhIHppcCBhcmNoaXZlIGluIG9uZQorICAgICAgICAvLy8gICBjYWxsLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgPGM+WmlwRmlsZTwvYz4gcHJvcGVydGllcyBpbmNsdWRpbmcgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlBhc3N3b3JkIi8+LCA8c2VlIGNyZWY9IlNldENvbXByZXNzaW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4sIDxzZWUgY3JlZj0iRXh0cmFjdEV4aXN0aW5nRmlsZSIvPiwKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBFcnJvckFjdGlvbiIvPiwgYW5kIDxzZWUgY3JlZj0iQ29tcHJlc3Npb25MZXZlbCIvPiwgdGhlaXIKKyAgICAgICAgLy8vICAgcmVzcGVjdGl2ZSB2YWx1ZXMgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsIHdpbGwgYmUgYXBwbGllZCB0byBlYWNoCisgICAgICAgIC8vLyAgIFppcEVudHJ5IGFkZGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZXMiPgorICAgICAgICAvLy8gICBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyBvZiB0aGUgZmlsZXMgdG8gYWRkLiBFYWNoIHN0cmluZyBzaG91bGQgcmVmZXIgdG8gYQorICAgICAgICAvLy8gICBmaWxlIGluIHRoZSBmaWxlc3lzdGVtLiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoIG9yIGEKKyAgICAgICAgLy8vICAgZnVsbHktcXVhbGlmaWVkIHBhdGguCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIHppcCBmaWxlLCBhbmQgYWRkIGEgZmV3IGZpbGVzIGludG8gaXQuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIFN0cmluZyBaaXBGaWxlVG9DcmVhdGUgPSAiYXJjaGl2ZTEuemlwIjsKKyAgICAgICAgLy8vIFN0cmluZyBEaXJlY3RvcnlUb1ppcCA9ICJjOlxccmVwb3J0cyI7CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAvLyBTdG9yZSBhbGwgZmlsZXMgZm91bmQgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnksIGludG8gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gICBTdHJpbmdbXSBmaWxlbmFtZXMgPSBTeXN0ZW0uSU8uRGlyZWN0b3J5LkdldEZpbGVzKERpcmVjdG9yeVRvWmlwKTsKKyAgICAgICAgLy8vICAgemlwLkFkZEZpbGVzKGZpbGVuYW1lcyk7CisgICAgICAgIC8vLyAgIHppcC5TYXZlKFppcEZpbGVUb0NyZWF0ZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gRGltIFppcEZpbGVUb0NyZWF0ZSBBcyBTdHJpbmcgPSAiYXJjaGl2ZTEuemlwIgorICAgICAgICAvLy8gRGltIERpcmVjdG9yeVRvWmlwIEFzIFN0cmluZyA9ICJjOlxyZXBvcnRzIgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgICcgU3RvcmUgYWxsIGZpbGVzIGZvdW5kIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBpbnRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgICBEaW0gZmlsZW5hbWVzIEFzIFN0cmluZygpID0gU3lzdGVtLklPLkRpcmVjdG9yeS5HZXRGaWxlcyhEaXJlY3RvcnlUb1ppcCkKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZXMoZmlsZW5hbWVzKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKFppcEZpbGVUb0NyZWF0ZSkKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nLCBTdHJpbmcpIiAvPgorICAgICAgICBwdWJsaWMgdm9pZCBBZGRGaWxlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYWJsZTxTdHJpbmc+IGZpbGVOYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5BZGRGaWxlcyhmaWxlTmFtZXMsIG51bGwpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEFkZHMgb3IgdXBkYXRlcyBhIHNldCBvZiBmaWxlcyBpbiB0aGUgPGM+WmlwRmlsZTwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQW55IGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCBpbiB0aGUgYXJjaGl2ZSBhcmUgdXBkYXRlZC4gQW55IGZpbGVzIHRoYXQKKyAgICAgICAgLy8vICAgZG9uJ3QgeWV0IGV4aXN0IGluIHRoZSBhcmNoaXZlIGFyZSBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIDxjPlppcEZpbGU8L2M+IHByb3BlcnRpZXMgaW5jbHVkaW5nIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiwgPHNlZSBjcmVmPSJTZXRDb21wcmVzc2lvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+LCA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4sIGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHRoZWlyCisgICAgICAgIC8vLyAgIHJlc3BlY3RpdmUgdmFsdWVzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaAorICAgICAgICAvLy8gICBaaXBFbnRyeSBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWVzIj4KKyAgICAgICAgLy8vICAgVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgb2YgdGhlIGZpbGVzIHRvIHVwZGF0ZS4gRWFjaCBzdHJpbmcgc2hvdWxkIHJlZmVyIHRvIGEgZmlsZSBpbgorICAgICAgICAvLy8gICB0aGUgZmlsZXN5c3RlbS4gVGhlIG5hbWUgb2YgdGhlIGZpbGUgbWF5IGJlIGEgcmVsYXRpdmUgcGF0aCBvciBhIGZ1bGx5LXF1YWxpZmllZCBwYXRoLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZpbGVzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhYmxlPFN0cmluZz4gZmlsZU5hbWVzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLlVwZGF0ZUZpbGVzKGZpbGVOYW1lcywgbnVsbCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyBhIHNldCBvZiBmaWxlcyB0byB0aGUgPGM+WmlwRmlsZTwvYz4sIHVzaW5nIHRoZQorICAgICAgICAvLy8gICBzcGVjaWZpZWQgZGlyZWN0b3J5IHBhdGggaW4gdGhlIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQW55IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKKyAgICAgICAgLy8vICAgZmlsZW5hbWVzIGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBpcyAiZmxhdHRlbmVkIiBpbiB0aGUKKyAgICAgICAgLy8vICAgYXJjaGl2ZS4gIEVhY2ggZmlsZSBpbiB0aGUgbGlzdCBpcyBhZGRlZCB0byB0aGUgYXJjaGl2ZSBpbgorICAgICAgICAvLy8gICB0aGUgc3BlY2lmaWVkIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpciByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUKKyAgICAgICAgLy8vICAgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIGVhY2ggWmlwRW50cnkgYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lcyI+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdG8gYWRkLiBFYWNoIHN0cmluZyBzaG91bGQgcmVmZXIgdG8KKyAgICAgICAgLy8vICAgYSBmaWxlIGluIHRoZSBmaWxlc3lzdGVtLiAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgbWF5IGJlIGEKKyAgICAgICAgLy8vICAgcmVsYXRpdmUgcGF0aCBvciBhIGZ1bGx5LXF1YWxpZmllZCBwYXRoLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyAgIFNwZWNpZmllcyBhIGRpcmVjdG9yeSBwYXRoIHRvIHVzZSB0byBvdmVycmlkZSBhbnkgcGF0aCBpbiB0aGUgZmlsZSBuYW1lLgorICAgICAgICAvLy8gICBUaCBpcyBwYXRoIG1heSwgb3IgbWF5IG5vdCwgY29ycmVzcG9uZCB0byBhIHJlYWwgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50CisgICAgICAgIC8vLyAgIGZpbGVzeXN0ZW0uICBJZiB0aGUgZmlsZXMgd2l0aGluIHRoZSB6aXAgYXJlIGxhdGVyIGV4dHJhY3RlZCwgdGhpcyBpcyB0aGUKKyAgICAgICAgLy8vICAgcGF0aCB1c2VkIGZvciB0aGUgZXh0cmFjdGVkIGZpbGUuICBQYXNzaW5nIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbgorICAgICAgICAvLy8gICBWQikgd2lsbCB1c2UgdGhlIHBhdGggb24gZWFjaCBvZiB0aGUgPGM+ZmlsZU5hbWVzPC9jPiwgaWYgYW55LiAgUGFzc2luZworICAgICAgICAvLy8gICB0aGUgZW1wdHkgc3RyaW5nICgiIikgd2lsbCBpbnNlcnQgdGhlIGl0ZW0gYXQgdGhlIHJvb3QgcGF0aCB3aXRoaW4gdGhlCisgICAgICAgIC8vLyAgIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nLCBTdHJpbmcpIiAvPgorICAgICAgICBwdWJsaWMgdm9pZCBBZGRGaWxlcyhTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYWJsZTxTdHJpbmc+IGZpbGVOYW1lcywgU3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZEZpbGVzKGZpbGVOYW1lcywgZmFsc2UsIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyBhIHNldCBvZiBmaWxlcyB0byB0aGUgPGM+WmlwRmlsZTwvYz4sIHVzaW5nIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5CisgICAgICAgIC8vLyAgIHBhdGggaW4gdGhlIGFyY2hpdmUsIGFuZCBwcmVzZXJ2aW5nIHRoZSBmdWxsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW4gdGhlCisgICAgICAgIC8vLyAgIGZpbGVuYW1lcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpbmsgb2YgdGhlIDxwYXJhbXJlZiBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIi8+IGFzIGEgInJvb3QiIG9yCisgICAgICAgIC8vLyAgIGJhc2UgZGlyZWN0b3J5IHVzZWQgaW4gdGhlIGFyY2hpdmUgZm9yIHRoZSBmaWxlcyB0aGF0IGdldCBhZGRlZC4gIHdoZW4KKyAgICAgICAgLy8vICAgPHBhcmFtcmVmIG5hbWU9InByZXNlcnZlRGlySGllcmFyY2h5Ii8+IGlzIHRydWUsIHRoZSBoaWVyYXJjaHkgb2YgZmlsZXMKKyAgICAgICAgLy8vICAgZm91bmQgaW4gdGhlIGZpbGVzeXN0ZW0gd2lsbCBiZSBwbGFjZWQsIHdpdGggdGhlIGhpZXJhcmNoeSBpbnRhY3QsCisgICAgICAgIC8vLyAgIHN0YXJ0aW5nIGF0IHRoYXQgcm9vdCBpbiB0aGUgYXJjaGl2ZS4gV2hlbiA8Yz5wcmVzZXJ2ZURpckhpZXJhcmNoeTwvYz4KKyAgICAgICAgLy8vICAgaXMgZmFsc2UsIHRoZSBwYXRoIGhpZXJhcmNoeSBvZiBmaWxlcyBpcyBmbGF0dG5lZCwgYW5kIHRoZSBmbGF0dGVuZWQKKyAgICAgICAgLy8vICAgc2V0IG9mIGZpbGVzIGdldHMgcGxhY2VkIGluIHRoZSByb290IHdpdGhpbiB0aGUgYXJjaGl2ZSBhcyBzcGVjaWZpZWQgaW4KKyAgICAgICAgLy8vICAgPGM+ZGlyZWN0b3J5UGF0aEluQXJjaGl2ZTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIGVhY2gKKyAgICAgICAgLy8vICAgWmlwRW50cnkgYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZXMiPgorICAgICAgICAvLy8gICBUaGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRvIGFkZC4gRWFjaCBzdHJpbmcgc2hvdWxkIHJlZmVyIHRvIGEgZmlsZSBpbiB0aGUKKyAgICAgICAgLy8vICAgZmlsZXN5c3RlbS4gIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG1heSBiZSBhIHJlbGF0aXZlIHBhdGggb3IgYQorICAgICAgICAvLy8gICBmdWxseS1xdWFsaWZpZWQgcGF0aC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeVBhdGhJbkFyY2hpdmUiPgorICAgICAgICAvLy8gICBTcGVjaWZpZXMgYSBkaXJlY3RvcnkgcGF0aCB0byB1c2UgYXMgYSBwcmVmaXggZm9yIGVhY2ggZW50cnkgbmFtZS4KKyAgICAgICAgLy8vICAgVGhpcyBwYXRoIG1heSwgb3IgbWF5IG5vdCwgY29ycmVzcG9uZCB0byBhIHJlYWwgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50CisgICAgICAgIC8vLyAgIGZpbGVzeXN0ZW0uICBJZiB0aGUgZmlsZXMgd2l0aGluIHRoZSB6aXAgYXJlIGxhdGVyIGV4dHJhY3RlZCwgdGhpcyBpcyB0aGUKKyAgICAgICAgLy8vICAgcGF0aCB1c2VkIGZvciB0aGUgZXh0cmFjdGVkIGZpbGUuICBQYXNzaW5nIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbgorICAgICAgICAvLy8gICBWQikgd2lsbCB1c2UgdGhlIHBhdGggb24gZWFjaCBvZiB0aGUgPGM+ZmlsZU5hbWVzPC9jPiwgaWYgYW55LiAgUGFzc2luZworICAgICAgICAvLy8gICB0aGUgZW1wdHkgc3RyaW5nICgiIikgd2lsbCBpbnNlcnQgdGhlIGl0ZW0gYXQgdGhlIHJvb3QgcGF0aCB3aXRoaW4gdGhlCisgICAgICAgIC8vLyAgIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmVzZXJ2ZURpckhpZXJhcmNoeSI+CisgICAgICAgIC8vLyAgIHdoZXRoZXIgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBhcmNoaXZlIHdpbGwgcmVmbGVjdCB0aGUgZGlyZWN0b3J5CisgICAgICAgIC8vLyAgIGhpZXJhcmNoeSB0aGF0IGlzIHByZXNlbnQgaW4gdGhlIHZhcmlvdXMgZmlsZW5hbWVzLiAgRm9yIGV4YW1wbGUsIGlmCisgICAgICAgIC8vLyAgIDxwYXJhbXJlZiBuYW1lPSJmaWxlTmFtZXMiLz4gaW5jbHVkZXMgdHdvIHBhdGhzLAorICAgICAgICAvLy8gICBcQW5pbWFsaWFcQ2hvcmRhdGFcTWFtbWFsaWFcSW5mby50eHQgYW5kCisgICAgICAgIC8vLyAgIFxQbGFudGFlXE1hZ25vbGlvcGh5dGFcRGljb3R5bGVkb25cSW5mby50eHQsIHRoZW4gY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAgICAvLy8gICB3aXRoIDxwYXJhbXJlZiBuYW1lPSJwcmVzZXJ2ZURpckhpZXJhcmNoeSIvPiA9IDxjPmZhbHNlPC9jPiB3aWxsCisgICAgICAgIC8vLyAgIHJlc3VsdCBpbiBhbiBleGNlcHRpb24gYmVjYXVzZSBvZiBhIGR1cGxpY2F0ZSBlbnRyeSBuYW1lLCB3aGlsZQorICAgICAgICAvLy8gICBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggPHBhcmFtcmVmIG5hbWU9InByZXNlcnZlRGlySGllcmFyY2h5Ii8+ID0KKyAgICAgICAgLy8vICAgPGM+dHJ1ZTwvYz4gd2lsbCByZXN1bHQgaW4gdGhlIGZ1bGwgZGlyZWNvcnkgcGF0aHMgYmVpbmcgaW5jbHVkZWQgaW4KKyAgICAgICAgLy8vICAgdGhlIGVudHJpZXMgYWRkZWQgdG8gdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcsIFN0cmluZykiIC8+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZEZpbGVzKFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhYmxlPFN0cmluZz4gZmlsZU5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlRGlySGllcmFyY2h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpbGVOYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImZpbGVOYW1lcyIpOworCisgICAgICAgICAgICBfYWRkT3BlcmF0aW9uQ2FuY2VsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIE9uQWRkU3RhcnRlZCgpOworICAgICAgICAgICAgaWYgKHByZXNlcnZlRGlySGllcmFyY2h5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmIGluIGZpbGVOYW1lcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYWRkT3BlcmF0aW9uQ2FuY2VsZWQpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3N0cmluZyBzID0gU2hhcmVkVXRpbGl0aWVzLk5vcm1hbGl6ZVBhdGgoUGF0aC5Db21iaW5lKGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUsIFBhdGguR2V0RGlyZWN0b3J5TmFtZShmKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHMgPSBQYXRoLkdldEZ1bGxQYXRoKFBhdGguQ29tYmluZShkaXJlY3RvcnlQYXRoSW5BcmNoaXZlLCBQYXRoLkdldERpcmVjdG9yeU5hbWUoZikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkRmlsZShmLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEZpbGUoZiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmIGluIGZpbGVOYW1lcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYWRkT3BlcmF0aW9uQ2FuY2VsZWQpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZEZpbGUoZiwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFfYWRkT3BlcmF0aW9uQ2FuY2VsZWQpCisgICAgICAgICAgICAgICAgT25BZGRDb21wbGV0ZWQoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGRzIG9yIHVwZGF0ZXMgYSBzZXQgb2YgZmlsZXMgdG8gdGhlIDxjPlppcEZpbGU8L2M+LCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBwYXRoIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBbnkgZmlsZXMgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBhcmNoaXZlIGFyZSB1cGRhdGVkLiBBbnkgZmlsZXMgdGhhdAorICAgICAgICAvLy8gICBkb24ndCB5ZXQgZXhpc3QgaW4gdGhlIGFyY2hpdmUgYXJlIGFkZGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgPGM+WmlwRmlsZTwvYz4gcHJvcGVydGllcyBpbmNsdWRpbmcgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlBhc3N3b3JkIi8+LCA8c2VlIGNyZWY9IlNldENvbXByZXNzaW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4sIDxzZWUgY3JlZj0iRXh0cmFjdEV4aXN0aW5nRmlsZSIvPiwKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBFcnJvckFjdGlvbiIvPiwgYW5kIDxzZWUgY3JlZj0iQ29tcHJlc3Npb25MZXZlbCIvPiwgdGhlaXIKKyAgICAgICAgLy8vICAgcmVzcGVjdGl2ZSB2YWx1ZXMgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsIHdpbGwgYmUgYXBwbGllZCB0byBlYWNoCisgICAgICAgIC8vLyAgIFppcEVudHJ5IGFkZGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZXMiPgorICAgICAgICAvLy8gICBUaGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRvIGFkZCBvciB1cGRhdGUuIEVhY2ggc3RyaW5nIHNob3VsZCByZWZlciB0byBhCisgICAgICAgIC8vLyAgIGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0uICBUaGUgbmFtZSBvZiB0aGUgZmlsZSBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoIG9yIGEKKyAgICAgICAgLy8vICAgZnVsbHktcXVhbGlmaWVkIHBhdGguCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHBhdGggdG8gdXNlIHRvIG92ZXJyaWRlIGFueSBwYXRoIGluIHRoZSBmaWxlIG5hbWUuCisgICAgICAgIC8vLyAgIFRoaXMgcGF0aCBtYXksIG9yIG1heSBub3QsIGNvcnJlc3BvbmQgdG8gYSByZWFsIGRpcmVjdG9yeSBpbiB0aGUgY3VycmVudAorICAgICAgICAvLy8gICBmaWxlc3lzdGVtLiAgSWYgdGhlIGZpbGVzIHdpdGhpbiB0aGUgemlwIGFyZSBsYXRlciBleHRyYWN0ZWQsIHRoaXMgaXMgdGhlCisgICAgICAgIC8vLyAgIHBhdGggdXNlZCBmb3IgdGhlIGV4dHJhY3RlZCBmaWxlLiAgUGFzc2luZyA8Yz5udWxsPC9jPiAoPGM+Tm90aGluZzwvYz4gaW4KKyAgICAgICAgLy8vICAgVkIpIHdpbGwgdXNlIHRoZSBwYXRoIG9uIGVhY2ggb2YgdGhlIDxjPmZpbGVOYW1lczwvYz4sIGlmIGFueS4gIFBhc3NpbmcKKyAgICAgICAgLy8vICAgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwgaW5zZXJ0IHRoZSBpdGVtIGF0IHRoZSByb290IHBhdGggd2l0aGluIHRoZQorICAgICAgICAvLy8gICBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRTZWxlY3RlZEZpbGVzKFN0cmluZywgU3RyaW5nKSIgLz4KKyAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRmlsZXMoU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGU8U3RyaW5nPiBmaWxlTmFtZXMsIFN0cmluZyBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiZmlsZU5hbWVzIik7CisKKyAgICAgICAgICAgIE9uQWRkU3RhcnRlZCgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGYgaW4gZmlsZU5hbWVzKQorICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlRmlsZShmLCBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKTsKKyAgICAgICAgICAgIE9uQWRkQ29tcGxldGVkKCk7CisgICAgICAgIH0KKworCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEFkZHMgb3IgVXBkYXRlcyBhIEZpbGUgaW4gYSBaaXAgZmlsZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIGFkZHMgYSBmaWxlIHRvIGEgemlwIGFyY2hpdmUsIG9yLCBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cworICAgICAgICAvLy8gICBpbiB0aGUgemlwIGFyY2hpdmUsIHRoaXMgbWV0aG9kIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhhdCBnaXZlbiBmaWxlbmFtZQorICAgICAgICAvLy8gICBpbiB0aGUgemlwIGFyY2hpdmUuICBUaGUgPGM+VXBkYXRlRmlsZTwvYz4gbWV0aG9kIG1pZ2h0IG1vcmUgYWNjdXJhdGVseSBiZQorICAgICAgICAvLy8gICBjYWxsZWQgIkFkZE9yVXBkYXRlRmlsZSIuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFVwb24gc3VjY2VzcywgdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgYXBwbGljYXRpb24gdG8gbGVhcm4gd2hldGhlciB0aGUgZmlsZQorICAgICAgICAvLy8gICB3YXMgYWRkZWQgdmVyc3VzIHVwZGF0ZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRyeSBpbiBhIHppcGZpbGUuIFRoZSBmaXJzdAorICAgICAgICAvLy8gICBjYWxsIHRvIFVwZGF0ZUZpbGUgYWRkcyB0aGUgZmlsZSB0byB0aGUgbmV3bHktY3JlYXRlZCB6aXAgYXJjaGl2ZS4gIFRoZQorICAgICAgICAvLy8gICBzZWNvbmQgY2FsbCB0byBVcGRhdGVGaWxlIHVwZGF0ZXMgdGhlIGNvbnRlbnQgZm9yIHRoYXQgZmlsZSBpbiB0aGUgemlwCisgICAgICAgIC8vLyAgIGFyY2hpdmUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAxID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgLy8gVXBkYXRlRmlsZSBtaWdodCBtb3JlIGFjY3VyYXRlbHkgYmUgY2FsbGVkICJBZGRPclVwZGF0ZUZpbGUiCisgICAgICAgIC8vLyAgIHppcDEuVXBkYXRlRmlsZSgiTXlEb2N1bWVudHNcXFJlYWRtZS50eHQiKTsKKyAgICAgICAgLy8vICAgemlwMS5VcGRhdGVGaWxlKCJDdXN0b21lckxpc3QuY3N2Iik7CisgICAgICAgIC8vLyAgIHppcDEuQ29tbWVudCA9ICJUaGlzIHppcCBhcmNoaXZlIGhhcyBiZWVuIGNyZWF0ZWQuIjsKKyAgICAgICAgLy8vICAgemlwMS5TYXZlKCJDb250ZW50LnppcCIpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcDIgPSBaaXBGaWxlLlJlYWQoIkNvbnRlbnQuemlwIikpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcDIuVXBkYXRlRmlsZSgiVXBkYXRlc1xcUmVhZG1lLnR4dCIpOworICAgICAgICAvLy8gICB6aXAyLkNvbW1lbnQgPSAiVGhpcyB6aXAgYXJjaGl2ZSBoYXMgYmVlbiB1cGRhdGVkOiBUaGUgUmVhZG1lLnR4dCBmaWxlIGhhcyBiZWVuIGNoYW5nZWQuIjsKKyAgICAgICAgLy8vICAgemlwMi5TYXZlKCk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gICBVc2luZyB6aXAxIEFzIE5ldyBaaXBGaWxlCisgICAgICAgIC8vLyAgICAgICAnIFVwZGF0ZUZpbGUgbWlnaHQgbW9yZSBhY2N1cmF0ZWx5IGJlIGNhbGxlZCAiQWRkT3JVcGRhdGVGaWxlIgorICAgICAgICAvLy8gICAgICAgemlwMS5VcGRhdGVGaWxlKCJNeURvY3VtZW50c1xSZWFkbWUudHh0IikKKyAgICAgICAgLy8vICAgICAgIHppcDEuVXBkYXRlRmlsZSgiQ3VzdG9tZXJMaXN0LmNzdiIpCisgICAgICAgIC8vLyAgICAgICB6aXAxLkNvbW1lbnQgPSAiVGhpcyB6aXAgYXJjaGl2ZSBoYXMgYmVlbiBjcmVhdGVkLiIKKyAgICAgICAgLy8vICAgICAgIHppcDEuU2F2ZSgiQ29udGVudC56aXAiKQorICAgICAgICAvLy8gICBFbmQgVXNpbmcKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIFVzaW5nIHppcDIgQXMgWmlwRmlsZSA9IFppcEZpbGUuUmVhZCgiQ29udGVudC56aXAiKQorICAgICAgICAvLy8gICAgICAgemlwMi5VcGRhdGVGaWxlKCJVcGRhdGVzXFJlYWRtZS50eHQiKQorICAgICAgICAvLy8gICAgICAgemlwMi5Db21tZW50ID0gIlRoaXMgemlwIGFyY2hpdmUgaGFzIGJlZW4gdXBkYXRlZDogVGhlIFJlYWRtZS50eHQgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkLiIKKyAgICAgICAgLy8vICAgICAgIHppcDIuU2F2ZQorICAgICAgICAvLy8gICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRGaWxlKHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZURpcmVjdG9yeShzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5VcGRhdGVJdGVtKHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBhZGQgb3IgdXBkYXRlLiBJdCBzaG91bGQgcmVmZXIgdG8gYSBmaWxlIGluIHRoZQorICAgICAgICAvLy8gICBmaWxlc3lzdGVtLiAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgbWF5IGJlIGEgcmVsYXRpdmUgcGF0aCBvciBhCisgICAgICAgIC8vLyAgIGZ1bGx5LXF1YWxpZmllZCBwYXRoLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIDxjPlppcEVudHJ5PC9jPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBGaWxlIHRoYXQgd2FzIGFkZGVkIG9yIHVwZGF0ZWQuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBVcGRhdGVGaWxlKHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZUZpbGUoZmlsZU5hbWUsIG51bGwpOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyBvciBVcGRhdGVzIGEgRmlsZSBpbiBhIFppcCBmaWxlIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgYWRkcyBhIGZpbGUgdG8gYSB6aXAgYXJjaGl2ZSwgb3IsIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzCisgICAgICAgIC8vLyAgIGluIHRoZSB6aXAgYXJjaGl2ZSwgdGhpcyBtZXRob2QgVXBkYXRlcyB0aGUgY29udGVudCBvZiB0aGF0IGdpdmVuIGZpbGVuYW1lCisgICAgICAgIC8vLyAgIGluIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgYWxsb3dzIHRoZSBjYWxsZXIgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZQorICAgICAgICAvLy8gICBkaXJlY3RvcnkgcGF0aCB0byBiZSB1c2VkIGluIHRoZSBhcmNoaXZlLiAgVGhlIGVudHJ5IHRvIGJlIGFkZGVkIG9yCisgICAgICAgIC8vLyAgIHVwZGF0ZWQgaXMgZm91bmQgYnkgdXNpbmcgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgcGF0aCwgY29tYmluZWQgd2l0aCB0aGUKKyAgICAgICAgLy8vICAgYmFzZW5hbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlbmFtZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVXBvbiBzdWNjZXNzLCB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBsZWFybiBpZiB0aGUgZmlsZSB3YXMKKyAgICAgICAgLy8vICAgYWRkZWQgdmVyc3VzIHVwZGF0ZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkRmlsZShzdHJpbmcsc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlRGlyZWN0b3J5KHN0cmluZyxzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5VcGRhdGVJdGVtKHN0cmluZyxzdHJpbmcpIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYWRkIG9yIHVwZGF0ZS4gSXQgc2hvdWxkIHJlZmVyIHRvIGEgZmlsZSBpbiB0aGUKKyAgICAgICAgLy8vICAgZmlsZXN5c3RlbS4gIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG1heSBiZSBhIHJlbGF0aXZlIHBhdGggb3IgYQorICAgICAgICAvLy8gICBmdWxseS1xdWFsaWZpZWQgcGF0aC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeVBhdGhJbkFyY2hpdmUiPgorICAgICAgICAvLy8gICBTcGVjaWZpZXMgYSBkaXJlY3RvcnkgcGF0aCB0byB1c2UgdG8gb3ZlcnJpZGUgYW55IHBhdGggaW4gdGhlCisgICAgICAgIC8vLyAgIDxjPmZpbGVOYW1lPC9jPi4gIFRoaXMgcGF0aCBtYXksIG9yIG1heSBub3QsIGNvcnJlc3BvbmQgdG8gYSByZWFsCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBpbiB0aGUgY3VycmVudCBmaWxlc3lzdGVtLiAgSWYgdGhlIGZpbGVzIHdpdGhpbiB0aGUgemlwIGFyZQorICAgICAgICAvLy8gICBsYXRlciBleHRyYWN0ZWQsIHRoaXMgaXMgdGhlIHBhdGggdXNlZCBmb3IgdGhlIGV4dHJhY3RlZCBmaWxlLiAgUGFzc2luZworICAgICAgICAvLy8gICA8Yz5udWxsPC9jPiAoPGM+Tm90aGluZzwvYz4gaW4gVkIpIHdpbGwgdXNlIHRoZSBwYXRoIG9uIHRoZQorICAgICAgICAvLy8gICA8Yz5maWxlTmFtZTwvYz4sIGlmIGFueS4gIFBhc3NpbmcgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwgaW5zZXJ0IHRoZQorICAgICAgICAvLy8gICBpdGVtIGF0IHRoZSByb290IHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIDxjPlppcEVudHJ5PC9jPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBGaWxlIHRoYXQgd2FzIGFkZGVkIG9yIHVwZGF0ZWQuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBVcGRhdGVGaWxlKHN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlkZWFsbHkgdGhpcyB3b3VsZCBhbGwgYmUgdHJhbnNhY3Rpb25hbCEKKyAgICAgICAgICAgIHZhciBrZXkgPSBaaXBFbnRyeS5OYW1lSW5BcmNoaXZlKGZpbGVOYW1lLCBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKTsKKyAgICAgICAgICAgIGlmICh0aGlzW2tleV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGlzLlJlbW92ZUVudHJ5KGtleSk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5BZGRGaWxlKGZpbGVOYW1lLCBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKTsKKyAgICAgICAgfQorCisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGQgb3IgdXBkYXRlIGEgZGlyZWN0b3J5IGluIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIElmIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlLCB0aGVuIHRoaXMgbWV0aG9kCisgICAgICAgIC8vLyAgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8Yz5BZGREaXJlY3RvcnkoKTwvYz4uICBJZiB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZSwgdGhlbiB0aGlzIG1ldGhvZCB1cGRhdGVzIGFueQorICAgICAgICAvLy8gICBleGlzdGluZyBlbnRyaWVzLCBhbmQgYWRkcyBhbnkgbmV3IGVudHJpZXMuIEFueSBlbnRyaWVzIHRoYXQgYXJlIGluIHRoZQorICAgICAgICAvLy8gICB6aXAgYXJjaGl2ZSBidXQgbm90IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBhcmUgbGVmdCBhbG9uZS4gIEluIG90aGVyCisgICAgICAgIC8vLyAgIHdvcmRzLCB0aGUgY29udGVudHMgb2YgdGhlIHppcCBmaWxlIHdpbGwgYmUgYSB1bmlvbiBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8vICAgY29udGVudHMgYW5kIHRoZSBuZXcgZmlsZXMuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlRmlsZShzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGREaXJlY3Rvcnkoc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlSXRlbShzdHJpbmcpIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeU5hbWUiPgorICAgICAgICAvLy8gICBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGJlIGFkZGVkIHRvIHRoZSB6aXAgYXJjaGl2ZSwgb3IgdXBkYXRlZCBpbgorICAgICAgICAvLy8gICB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPgorICAgICAgICAvLy8gVGhlIDxjPlppcEVudHJ5PC9jPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBEaXJlY3RvcnkgdGhhdCB3YXMgYWRkZWQgb3IgdXBkYXRlZC4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFppcEVudHJ5IFVwZGF0ZURpcmVjdG9yeShzdHJpbmcgZGlyZWN0b3J5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lLCBudWxsKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGQgb3IgdXBkYXRlIGEgZGlyZWN0b3J5IGluIHRoZSB6aXAgYXJjaGl2ZSBhdCB0aGUgc3BlY2lmaWVkIHJvb3QKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBJZiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZSwgdGhlbiB0aGlzIG1ldGhvZAorICAgICAgICAvLy8gICBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgPGM+QWRkRGlyZWN0b3J5KCk8L2M+LiAgSWYgdGhlIHNwZWNpZmllZAorICAgICAgICAvLy8gICBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUsIHRoZW4gdGhpcyBtZXRob2QgdXBkYXRlcyBhbnkKKyAgICAgICAgLy8vICAgZXhpc3RpbmcgZW50cmllcywgYW5kIGFkZHMgYW55IG5ldyBlbnRyaWVzLiBBbnkgZW50cmllcyB0aGF0IGFyZSBpbiB0aGUKKyAgICAgICAgLy8vICAgemlwIGFyY2hpdmUgYnV0IG5vdCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgYXJlIGxlZnQgYWxvbmUuICBJbiBvdGhlcgorICAgICAgICAvLy8gICB3b3JkcywgdGhlIGNvbnRlbnRzIG9mIHRoZSB6aXAgZmlsZSB3aWxsIGJlIGEgdW5pb24gb2YgdGhlIHByZXZpb3VzCisgICAgICAgIC8vLyAgIGNvbnRlbnRzIGFuZCB0aGUgbmV3IGZpbGVzLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZUZpbGUoc3RyaW5nLHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZERpcmVjdG9yeShzdHJpbmcsc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlSXRlbShzdHJpbmcsc3RyaW5nKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byBiZSBhZGRlZCB0byB0aGUgemlwIGFyY2hpdmUsIG9yIHVwZGF0ZWQKKyAgICAgICAgLy8vICAgaW4gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyAgIFNwZWNpZmllcyBhIGRpcmVjdG9yeSBwYXRoIHRvIHVzZSB0byBvdmVycmlkZSBhbnkgcGF0aCBpbiB0aGUKKyAgICAgICAgLy8vICAgPGM+ZGlyZWN0b3J5TmFtZTwvYz4uICBUaGlzIHBhdGggbWF5LCBvciBtYXkgbm90LCBjb3JyZXNwb25kIHRvIGEgcmVhbAorICAgICAgICAvLy8gICBkaXJlY3RvcnkgaW4gdGhlIGN1cnJlbnQgZmlsZXN5c3RlbS4gIElmIHRoZSBmaWxlcyB3aXRoaW4gdGhlIHppcCBhcmUKKyAgICAgICAgLy8vICAgbGF0ZXIgZXh0cmFjdGVkLCB0aGlzIGlzIHRoZSBwYXRoIHVzZWQgZm9yIHRoZSBleHRyYWN0ZWQgZmlsZS4gIFBhc3NpbmcKKyAgICAgICAgLy8vICAgPGM+bnVsbDwvYz4gKDxjPk5vdGhpbmc8L2M+IGluIFZCKSB3aWxsIHVzZSB0aGUgcGF0aCBvbiB0aGUKKyAgICAgICAgLy8vICAgPGM+ZGlyZWN0b3J5TmFtZTwvYz4sIGlmIGFueS4gIFBhc3NpbmcgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwgaW5zZXJ0CisgICAgICAgIC8vLyAgIHRoZSBpdGVtIGF0IHRoZSByb290IHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIDxjPlppcEVudHJ5PC9jPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBEaXJlY3RvcnkgdGhhdCB3YXMgYWRkZWQgb3IgdXBkYXRlZC4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFppcEVudHJ5IFVwZGF0ZURpcmVjdG9yeShzdHJpbmcgZGlyZWN0b3J5TmFtZSwgU3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLkFkZE9yVXBkYXRlRGlyZWN0b3J5SW1wbChkaXJlY3RvcnlOYW1lLCBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlLCBBZGRPclVwZGF0ZUFjdGlvbi5BZGRPclVwZGF0ZSk7CisgICAgICAgIH0KKworCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkIG9yIHVwZGF0ZSBhIGZpbGUgb3IgZGlyZWN0b3J5IGluIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBub3Qgc3VyZSBvciBkb2VzIG5vdCBjYXJlIGlmIHRoZQorICAgICAgICAvLy8gICBpdGVtIHRvIGJlIGFkZGVkIGlzIGEgZmlsZSBvciBkaXJlY3RvcnksIGFuZCBkb2VzIG5vdCBrbm93IG9yIGRvZXMgbm90CisgICAgICAgIC8vLyAgIGNhcmUgaWYgdGhlIGl0ZW0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIDxjPlppcEZpbGU8L2M+LiBDYWxsaW5nIHRoaXMgbWV0aG9kCisgICAgICAgIC8vLyAgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8Yz5SZW1vdmVFbnRyeSgpPC9jPiBpZiBhbiBlbnRyeSBieSB0aGUgc2FtZSBuYW1lCisgICAgICAgIC8vLyAgIGFscmVhZHkgZXhpc3RzLCBmb2xsb3dlZCBjYWxsaW5nIGJ5IDxjPkFkZEl0ZW0oKTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkSXRlbShzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5VcGRhdGVGaWxlKHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZURpcmVjdG9yeShzdHJpbmcpIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1OYW1lIj4KKyAgICAgICAgLy8vICB0aGUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gYmUgYWRkZWQgb3IgdXBkYXRlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUl0ZW0oc3RyaW5nIGl0ZW1OYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBVcGRhdGVJdGVtKGl0ZW1OYW1lLCBudWxsKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGQgb3IgdXBkYXRlIGEgZmlsZSBvciBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgaXMgdXNlZnVsIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBzdXJlIG9yIGRvZXMgbm90IGNhcmUgaWYKKyAgICAgICAgLy8vICAgdGhlIGl0ZW0gdG8gYmUgYWRkZWQgaXMgYSBmaWxlIG9yIGRpcmVjdG9yeSwgYW5kIGRvZXMgbm90IGtub3cgb3IgZG9lcyBub3QKKyAgICAgICAgLy8vICAgY2FyZSBpZiB0aGUgaXRlbSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgPGM+WmlwRmlsZTwvYz4uIENhbGxpbmcgdGhpcyBtZXRob2QKKyAgICAgICAgLy8vICAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDxjPlJlbW92ZUVudHJ5KCk8L2M+LCBpZiBhbiBlbnRyeSBieSB0aGF0IG5hbWUKKyAgICAgICAgLy8vICAgZXhpc3RzLCBhbmQgdGhlbiBjYWxsaW5nIDxjPkFkZEl0ZW0oKTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGFsbG93cyB0aGUgY2FsbGVyIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IHBhdGggdG8gYmUgdXNlZCBmb3IgdGhlIGl0ZW0gYmVpbmcgYWRkZWQgdG8gdGhlIGFyY2hpdmUuICBUaGUKKyAgICAgICAgLy8vICAgZW50cnkgb3IgZW50cmllcyB0aGF0IGFyZSBhZGRlZCBvciB1cGRhdGVkIHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vICAgPGM+RGlyZWN0b3J5UGF0aEluQXJjaGl2ZTwvYz4uIEV4dHJhY3RpbmcgdGhlIGVudHJ5IGZyb20gdGhlIGFyY2hpdmUgd2lsbAorICAgICAgICAvLy8gICByZXN1bHQgaW4gYSBmaWxlIHN0b3JlZCBpbiB0aGF0IGRpcmVjdG9yeSBwYXRoLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgPGM+WmlwRmlsZTwvYz4gcHJvcGVydGllcyBpbmNsdWRpbmcgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlBhc3N3b3JkIi8+LCA8c2VlIGNyZWY9IlNldENvbXByZXNzaW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4sIDxzZWUgY3JlZj0iRXh0cmFjdEV4aXN0aW5nRmlsZSIvPiwKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBFcnJvckFjdGlvbiIvPiwgYW5kIDxzZWUgY3JlZj0iQ29tcHJlc3Npb25MZXZlbCIvPiwgdGhlaXIKKyAgICAgICAgLy8vICAgcmVzcGVjdGl2ZSB2YWx1ZXMgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsIHdpbGwgYmUgYXBwbGllZCB0byB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwRW50cnk8L2M+IGFkZGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZEl0ZW0oc3RyaW5nLCBzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5VcGRhdGVGaWxlKHN0cmluZywgc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlRGlyZWN0b3J5KHN0cmluZywgc3RyaW5nKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtTmFtZSI+CisgICAgICAgIC8vLyAgIFRoZSBwYXRoIGZvciB0aGUgRmlsZSBvciBEaXJlY3RvcnkgdG8gYmUgYWRkZWQgb3IgdXBkYXRlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyAgIFNwZWNpZmllcyBhIGRpcmVjdG9yeSBwYXRoIHRvIHVzZSB0byBvdmVycmlkZSBhbnkgcGF0aCBpbiB0aGUKKyAgICAgICAgLy8vICAgPGM+aXRlbU5hbWU8L2M+LiAgVGhpcyBwYXRoIG1heSwgb3IgbWF5IG5vdCwgY29ycmVzcG9uZCB0byBhIHJlYWwKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50IGZpbGVzeXN0ZW0uICBJZiB0aGUgZmlsZXMgd2l0aGluIHRoZSB6aXAgYXJlCisgICAgICAgIC8vLyAgIGxhdGVyIGV4dHJhY3RlZCwgdGhpcyBpcyB0aGUgcGF0aCB1c2VkIGZvciB0aGUgZXh0cmFjdGVkIGZpbGUuICBQYXNzaW5nCisgICAgICAgIC8vLyAgIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbiBWQikgd2lsbCB1c2UgdGhlIHBhdGggb24gdGhlCisgICAgICAgIC8vLyAgIDxjPml0ZW1OYW1lPC9jPiwgaWYgYW55LiAgUGFzc2luZyB0aGUgZW1wdHkgc3RyaW5nICgiIikgd2lsbCBpbnNlcnQgdGhlCisgICAgICAgIC8vLyAgIGl0ZW0gYXQgdGhlIHJvb3QgcGF0aCB3aXRoaW4gdGhlIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVJdGVtKHN0cmluZyBpdGVtTmFtZSwgc3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhpdGVtTmFtZSkpCisgICAgICAgICAgICAgICAgVXBkYXRlRmlsZShpdGVtTmFtZSwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSk7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKERpcmVjdG9yeS5FeGlzdHMoaXRlbU5hbWUpKQorICAgICAgICAgICAgICAgIFVwZGF0ZURpcmVjdG9yeShpdGVtTmFtZSwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSk7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlRoYXQgZmlsZSBvciBkaXJlY3RvcnkgKHswfSkgZG9lcyBub3QgZXhpc3QhIiwgaXRlbU5hbWUpKTsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyBhIG5hbWVkIGVudHJ5IGludG8gdGhlIHppcCBhcmNoaXZlLCB0YWtpbmcgY29udGVudCBmb3IgdGhlIGVudHJ5CisgICAgICAgIC8vLyAgIGZyb20gYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIENhbGxpbmcgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBlbnRyeSB1c2luZyB0aGUgZ2l2ZW4gZmlsZU5hbWUgYW5kCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBwYXRoIHdpdGhpbiB0aGUgYXJjaGl2ZS4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgZmlsZSBieSB0aGUKKyAgICAgICAgLy8vICAgZ2l2ZW4gbmFtZSB0byBleGlzdCBpbiB0aGUgZmlsZXN5c3RlbTsgdGhlIG5hbWUgaXMgdXNlZCB3aXRoaW4gdGhlIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlIG9ubHkuIFRoZSBjb250ZW50IGZvciB0aGUgZW50cnkgaXMgZW5jb2RlZCB1c2luZyB0aGUgZGVmYXVsdCB0ZXh0CisgICAgICAgIC8vLyAgIGVuY29kaW5nIGZvciB0aGUgbWFjaGluZSwgb3Igb24gU2lsdmVybGlnaHQsIHVzaW5nIFVURi04LgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZW50Ij4KKyAgICAgICAgLy8vICAgVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUsIHNob3VsZCBpdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgemlwLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUsIGluY2x1ZGluZyBhbnkgcGF0aCwgdG8gdXNlIGZvciB0aGUgZW50cnkgd2l0aGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgPGM+WmlwRW50cnk8L2M+IGFkZGVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhbiBlbnRyeSB0byB0aGUgemlwZmlsZSwgdXNpbmcgYSBzdHJpbmcgYXMKKyAgICAgICAgLy8vIGNvbnRlbnQgZm9yIHRoYXQgZW50cnkuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gc3RyaW5nIENvbnRlbnQgPSAiVGhpcyBzdHJpbmcgd2lsbCBiZSB0aGUgY29udGVudCBvZiB0aGUgUmVhZG1lLnR4dCBmaWxlIGluIHRoZSB6aXAgYXJjaGl2ZS4iOworICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwMSA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcDEuQWRkRmlsZSgiTXlEb2N1bWVudHNcXFJlc3VtZS5kb2MiLCAiZmlsZXMiKTsKKyAgICAgICAgLy8vICAgemlwMS5BZGRFbnRyeSgiUmVhZG1lLnR4dCIsIENvbnRlbnQpOworICAgICAgICAvLy8gICB6aXAxLkNvbW1lbnQgPSAiVGhpcyB6aXAgZmlsZSB3YXMgY3JlYXRlZCBhdCAiICsgU3lzdGVtLkRhdGVUaW1lLk5vdy5Ub1N0cmluZygiRyIpOworICAgICAgICAvLy8gICB6aXAxLlNhdmUoIkNvbnRlbnQuemlwIik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gUHVibGljIFN1YiBSdW4oKQorICAgICAgICAvLy8gICBEaW0gQ29udGVudCBBcyBTdHJpbmcgPSAiVGhpcyBzdHJpbmcgd2lsbCBiZSB0aGUgY29udGVudCBvZiB0aGUgUmVhZG1lLnR4dCBmaWxlIGluIHRoZSB6aXAgYXJjaGl2ZS4iCisgICAgICAgIC8vLyAgIFVzaW5nIHppcDEgQXMgWmlwRmlsZSA9IE5ldyBaaXBGaWxlCisgICAgICAgIC8vLyAgICAgemlwMS5BZGRFbnRyeSgiUmVhZG1lLnR4dCIsIENvbnRlbnQpCisgICAgICAgIC8vLyAgICAgemlwMS5BZGRGaWxlKCJNeURvY3VtZW50c1xSZXN1bWUuZG9jIiwgImZpbGVzIikKKyAgICAgICAgLy8vICAgICB6aXAxLkNvbW1lbnQgPSAoIlRoaXMgemlwIGZpbGUgd2FzIGNyZWF0ZWQgYXQgIiAmYW1wOyBEYXRlVGltZS5Ob3cuVG9TdHJpbmcoIkciKSkKKyAgICAgICAgLy8vICAgICB6aXAxLlNhdmUoIkNvbnRlbnQuemlwIikKKyAgICAgICAgLy8vICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyBFbmQgU3ViCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBBZGRFbnRyeShzdHJpbmcgZW50cnlOYW1lLCBzdHJpbmcgY29udGVudCkKKyAgICAgICAgeworI2lmIFNJTFZFUkxJR0hUCisgICAgICAgICAgICByZXR1cm4gQWRkRW50cnkoZW50cnlOYW1lLCBjb250ZW50LCBTeXN0ZW0uVGV4dC5FbmNvZGluZy5VVEY4KTsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4gQWRkRW50cnkoZW50cnlOYW1lLCBjb250ZW50LCBTeXN0ZW0uVGV4dC5FbmNvZGluZy5EZWZhdWx0KTsKKyNlbmRpZgorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyBhIG5hbWVkIGVudHJ5IGludG8gdGhlIHppcCBhcmNoaXZlLCB0YWtpbmcgY29udGVudCBmb3IgdGhlIGVudHJ5CisgICAgICAgIC8vLyAgIGZyb20gYSBzdHJpbmcsIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIHRleHQgZW5jb2RpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIENhbGxpbmcgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBlbnRyeSB1c2luZyB0aGUgZ2l2ZW4gZmlsZU5hbWUgYW5kCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBwYXRoIHdpdGhpbiB0aGUgYXJjaGl2ZS4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgZmlsZSBieSB0aGUKKyAgICAgICAgLy8vICAgZ2l2ZW4gbmFtZSB0byBleGlzdCBpbiB0aGUgZmlsZXN5c3RlbTsgdGhlIG5hbWUgaXMgdXNlZCB3aXRoaW4gdGhlIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlIG9ubHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBjb250ZW50IGZvciB0aGUgZW50cnksIGEgc3RyaW5nIHZhbHVlLCBpcyBlbmNvZGVkIHVzaW5nIHRoZSBnaXZlbgorICAgICAgICAvLy8gICB0ZXh0IGVuY29kaW5nLiBBIEJPTSAoYnl0ZS1vcmRlci1tYXJrKSBpcyBlbWl0dGVkIGludG8gdGhlIGZpbGUsIGlmIHRoZQorICAgICAgICAvLy8gICBFbmNvZGluZyBwYXJhbWV0ZXIgaXMgc2V0IGZvciB0aGF0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBNb3N0IEVuY29kaW5nIGNsYXNzZXMgc3VwcG9ydCBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyBhIGJvb2xlYW4sCisgICAgICAgIC8vLyAgIGluZGljYXRpbmcgd2hldGhlciB0byBlbWl0IGEgQk9NIG9yIG5vdC4gRm9yIGV4YW1wbGUgc2VlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKGJvb2wpIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUsIGluY2x1ZGluZyBhbnkgcGF0aCwgdG8gdXNlIHdpdGhpbiB0aGUgYXJjaGl2ZSBmb3IgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGVudCI+CisgICAgICAgIC8vLyAgIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLCBzaG91bGQgaXQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIHppcC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj4KKyAgICAgICAgLy8vICAgVGhlIHRleHQgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZW5jb2RpbmcgdGhlIHN0cmluZy4gQmUgYXdhcmU6IFRoaXMgaXMKKyAgICAgICAgLy8vICAgZGlzdGluY3QgZnJvbSB0aGUgdGV4dCBlbmNvZGluZyB1c2VkIHRvIGVuY29kZSB0aGUgZmlsZU5hbWUsIGFzIHNwZWNpZmllZAorICAgICAgICAvLy8gICBpbiA8c2VlIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciIC8+LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgPGM+WmlwRW50cnk8L2M+IGFkZGVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBBZGRFbnRyeShzdHJpbmcgZW50cnlOYW1lLCBzdHJpbmcgY29udGVudCwgU3lzdGVtLlRleHQuRW5jb2RpbmcgZW5jb2RpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNhbm5vdCBlbXBsb3kgYSB1c2luZyBjbGF1c2UgaGVyZS4gIFdlIG5lZWQgdGhlIHN0cmVhbSB0bworICAgICAgICAgICAgLy8gcGVyc2lzdCBhZnRlciBleGl0IGZyb20gdGhpcyBtZXRob2QuCisgICAgICAgICAgICB2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgICAgIC8vIGNhbm5vdCB1c2UgYSB1c2luZyBjbGF1c2UgaGVyZTsgU3RyZWFtV3JpdGVyIHRha2VzCisgICAgICAgICAgICAvLyBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbSBhbmQgRGlzcG9zZXMgaXQgYmVmb3JlIHdlIGFyZSByZWFkeS4KKyAgICAgICAgICAgIHZhciBzdyA9IG5ldyBTdHJlYW1Xcml0ZXIobXMsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIHN3LldyaXRlKGNvbnRlbnQpOworICAgICAgICAgICAgc3cuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gcmVzZXQgdG8gYWxsb3cgcmVhZGluZyBsYXRlcgorICAgICAgICAgICAgbXMuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgcmV0dXJuIEFkZEVudHJ5KGVudHJ5TmFtZSwgbXMpOworCisgICAgICAgICAgICAvLyBtdXN0IG5vdCBkaXNwb3NlIHRoZSBNZW1vcnlTdHJlYW0gLSBpdCB3aWxsIGJlIHVzZWQgbGF0ZXIuCisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGFuIGVudHJ5IGluIHRoZSA8Yz5aaXBGaWxlPC9jPiB1c2luZyB0aGUgZ2l2ZW4gPGM+U3RyZWFtPC9jPgorICAgICAgICAvLy8gICBhcyBpbnB1dC4gIFRoZSBlbnRyeSB3aWxsIGhhdmUgdGhlIGdpdmVuIGZpbGVuYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHByb3ZpZGUgYW4gb3BlbiwgcmVhZGFibGUgc3RyZWFtOyBpbiB0aGlzIGNhc2UgaXQKKyAgICAgICAgLy8vICAgd2lsbCBiZSByZWFkIGR1cmluZyB0aGUgY2FsbCB0byA8c2VlIGNyZWY9IlppcEZpbGUuU2F2ZSgpIi8+IG9yIG9uZSBvZgorICAgICAgICAvLy8gICBpdHMgb3ZlcmxvYWRzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgcGFzc2VkIHN0cmVhbSB3aWxsIGJlIHJlYWQgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbi4gSWYKKyAgICAgICAgLy8vICAgbmVjZXNzYXJ5LCBjYWxsZXJzIHNob3VsZCBzZXQgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gYmVmb3JlCisgICAgICAgIC8vLyAgIGNhbGxpbmcgQWRkRW50cnkoKS4gVGhpcyBtaWdodCBiZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIHRoaXMgbWV0aG9kCisgICAgICAgIC8vLyAgIHdpdGggYSBNZW1vcnlTdHJlYW0sIGZvciBleGFtcGxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbiBjYXNlcyB3aGVyZSBhIGxhcmdlIG51bWJlciBvZiBzdHJlYW1zIHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+LCB0aGUgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gYXZvaWQgbWFpbnRhaW5pbmcgYWxsIG9mIHRoZQorICAgICAgICAvLy8gICBzdHJlYW1zIG9wZW4gc2ltdWx0YW5lb3VzbHkuICBUbyBoYW5kbGUgdGhpcyBzaXR1YXRpb24sIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAvLy8gICBzaG91bGQgdXNlIHRoZSA8c2VlIGNyZWY9IkFkZEVudHJ5KHN0cmluZywgT3BlbkRlbGVnYXRlLCBDbG9zZURlbGVnYXRlKSIvPgorICAgICAgICAvLy8gICBvdmVybG9hZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIDxjPlppcEZpbGU8L2M+IHByb3BlcnRpZXMgaW5jbHVkaW5nIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiwgPHNlZSBjcmVmPSJTZXRDb21wcmVzc2lvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+LCA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4sIGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHRoZWlyCisgICAgICAgIC8vLyAgIHJlc3BlY3RpdmUgdmFsdWVzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIGFkZHMgYSBzaW5nbGUgZW50cnkgdG8gYSA8Yz5aaXBGaWxlPC9jPiB2aWEgYSA8Yz5TdHJlYW08L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIFN0cmluZyB6aXBUb0NyZWF0ZSA9ICJDb250ZW50LnppcCI7CisgICAgICAgIC8vLyBTdHJpbmcgZmlsZU5hbWVJbkFyY2hpdmUgPSAiQ29udGVudC1Gcm9tLVN0cmVhbS5iaW4iOworICAgICAgICAvLy8gdXNpbmcgKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtVG9SZWFkID0gTXlTdHJlYW1PcGVuZXIoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIFppcEVudHJ5IGVudHJ5PSB6aXAuQWRkRW50cnkoZmlsZU5hbWVJbkFyY2hpdmUsIHN0cmVhbVRvUmVhZCk7CisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoIlJlYWRtZS50eHQiKTsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSh6aXBUb0NyZWF0ZSk7ICAvLyB0aGUgc3RyZWFtIGlzIHJlYWQgaW1wbGljaXRseSBoZXJlCisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBEaW0gemlwVG9DcmVhdGUgQXMgU3RyaW5nID0gIkNvbnRlbnQuemlwIgorICAgICAgICAvLy8gRGltIGZpbGVOYW1lSW5BcmNoaXZlIEFzIFN0cmluZyA9ICJDb250ZW50LUZyb20tU3RyZWFtLmJpbiIKKyAgICAgICAgLy8vIFVzaW5nIHN0cmVhbVRvUmVhZCBhcyBTeXN0ZW0uSU8uU3RyZWFtID0gTXlTdHJlYW1PcGVuZXIoKQorICAgICAgICAvLy8gICBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IE5ldyBaaXBGaWxlKCkKKyAgICAgICAgLy8vICAgICBEaW0gZW50cnkgYXMgWmlwRW50cnkgPSB6aXAuQWRkRW50cnkoZmlsZU5hbWVJbkFyY2hpdmUsIHN0cmVhbVRvUmVhZCkKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZSgiUmVhZG1lLnR4dCIpCisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoemlwVG9DcmVhdGUpICAnJyB0aGUgc3RyZWFtIGlzIHJlYWQgaW1wbGljaXRseSwgaGVyZQorICAgICAgICAvLy8gICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZUVudHJ5KHN0cmluZywgU3lzdGVtLklPLlN0cmVhbSkiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUsIGluY2x1ZGluZyBhbnkgcGF0aCwgd2hpY2ggaXMgc2hvd24gaW4gdGhlIHppcCBmaWxlIGZvciB0aGUgYWRkZWQKKyAgICAgICAgLy8vICAgZW50cnkuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+CisgICAgICAgIC8vLyAgIFRoZSBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0byBncmFiIGNvbnRlbnQgZm9yIHRoZSBmaWxlCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIDxjPlppcEVudHJ5PC9jPiBhZGRlZC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBBZGRFbnRyeShzdHJpbmcgZW50cnlOYW1lLCBTdHJlYW0gc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IFppcEVudHJ5LkNyZWF0ZUZvclN0cmVhbShlbnRyeU5hbWUsIHN0cmVhbSk7CisgICAgICAgICAgICB6ZS5TZXRFbnRyeVRpbWVzKERhdGVUaW1lLk5vdyxEYXRlVGltZS5Ob3csRGF0ZVRpbWUuTm93KTsKKyAgICAgICAgICAgIGlmIChWZXJib3NlKSBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoImFkZGluZyB7MH0uLi4iLCBlbnRyeU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIF9JbnRlcm5hbEFkZEVudHJ5KHplKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEFkZCBhIFppcEVudHJ5IGZvciB3aGljaCBjb250ZW50IGlzIHdyaXR0ZW4gZGlyZWN0bHkgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHdyaXRlIHRoZSB6aXAgZW50cnkgZGF0YSwgdXNlIHRoaXMKKyAgICAgICAgLy8vICAgbWV0aG9kIHRvIGFkZCB0aGUgWmlwRW50cnkuIEZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSB0aGF0IHRoZQorICAgICAgICAvLy8gICBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gd3JpdGUgdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiBhIERhdGFTZXQgaW50bworICAgICAgICAvLy8gICBhIFppcEVudHJ5LCB0aGUgYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBkbyBzby4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIDxjPlppcEZpbGU8L2M+IHByb3BlcnRpZXMgaW5jbHVkaW5nIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiwgPHNlZSBjcmVmPSJTZXRDb21wcmVzc2lvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+LCA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4sIGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHRoZWlyCisgICAgICAgIC8vLyAgIHJlc3BlY3RpdmUgdmFsdWVzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQWJvdXQgcHJvZ3Jlc3MgZXZlbnRzOiBXaGVuIHVzaW5nIHRoZSBXcml0ZURlbGVnYXRlLCBEb3ROZXRaaXAgZG9lcworICAgICAgICAvLy8gICBub3QgaXNzdWUgYW55IFNhdmVQcm9ncmVzcyBldmVudHMgd2l0aCA8Yz5FdmVudFR5cGU8L2M+ID0gPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfRW50cnlCeXRlc1JlYWQiPgorICAgICAgICAvLy8gICBTYXZpbmdfRW50cnlCeXRlc1JlYWQ8L3NlZT4uIChUaGlzIGlzIGJlY2F1c2UgaXQgaXMgdGhlCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uJ3MgY29kZSB0aGF0IHJ1bnMgaW4gV3JpdGVEZWxlZ2F0ZSAtIHRoZXJlJ3Mgbm8gd2F5IGZvcgorICAgICAgICAvLy8gICBEb3ROZXRaaXAgdG8ga25vdyB3aGVuIHRvIGlzc3VlIGEgRW50cnlCeXRlc1JlYWQgZXZlbnQuKQorICAgICAgICAvLy8gICBBcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHVwZGF0ZSBhIHByb2dyZXNzIGJhciBvciBzaW1pbGFyIHN0YXR1cworICAgICAgICAvLy8gICBpbmRpY2F0b3Igc2hvdWxkIGRvIHNvIGZyb20gd2l0aGluIHRoZSBXcml0ZURlbGVnYXRlCisgICAgICAgIC8vLyAgIGl0c2VsZi4gRG90TmV0WmlwIHdpbGwgaXNzdWUgdGhlIG90aGVyIFNhdmVQcm9ncmVzcyBldmVudHMsCisgICAgICAgIC8vLyAgIGluY2x1ZGluZyA8c2VlIGNyZWY9IlppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19TdGFydGVkIj4KKyAgICAgICAgLy8vICAgU2F2aW5nX1N0YXJ0ZWQ8L3NlZT4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0JlZm9yZVdyaXRlRW50cnkiPgorICAgICAgICAvLy8gICBTYXZpbmdfQmVmb3JlV3JpdGVFbnRyeTwvc2VlPiwgYW5kIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0FmdGVyV3JpdGVFbnRyeSI+CisgICAgICAgIC8vLyAgIFNhdmluZ19BZnRlcldyaXRlRW50cnk8L3NlZT4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIE5vdGU6IFdoZW4geW91IHVzZSBQS1ppcCBlbmNyeXB0aW9uLCBpdCdzIG5vcm1hbGx5IG5lY2Vzc2FyeSB0bworICAgICAgICAvLy8gICBjb21wdXRlIHRoZSBDUkMgb2YgdGhlIGNvbnRlbnQgdG8gYmUgZW5jcnlwdGVkLCBiZWZvcmUgY29tcHJlc3Npbmcgb3IKKyAgICAgICAgLy8vICAgZW5jcnlwdGluZyBpdC4gVGhlcmVmb3JlLCB3aGVuIHVzaW5nIFBLWmlwIGVuY3J5cHRpb24gd2l0aCBhCisgICAgICAgIC8vLyAgIFdyaXRlRGVsZWdhdGUsIHRoZSBXcml0ZURlbGVnYXRlIENBTiBCRSBjYWxsZWQgdHdpY2U6IG9uY2UgdG8gY29tcHV0ZQorICAgICAgICAvLy8gICB0aGUgQ1JDLCBhbmQgdGhlIHNlY29uZCB0aW1lIHRvIHBvdGVudGlhbGx5IGNvbXByZXNzIGFuZAorICAgICAgICAvLy8gICBlbmNyeXB0LiBTdXJwcmlzaW5nLCBidXQgdHJ1ZS4gVGhpcyBpcyBiZWNhdXNlIFBLV0FSRSBzcGVjaWZpZWQgdGhhdAorICAgICAgICAvLy8gICB0aGUgZW5jcnlwdGlvbiBpbml0aWFsaXphdGlvbiBkYXRhIGRlcGVuZHMgb24gdGhlIENSQy4KKyAgICAgICAgLy8vICAgSWYgdGhpcyBoYXBwZW5zLCBmb3IgZWFjaCBjYWxsIG9mIHRoZSBkZWxlZ2F0ZSwgeW91cgorICAgICAgICAvLy8gICBhcHBsaWNhdGlvbiBtdXN0IHN0cmVhbSB0aGUgc2FtZSBlbnRyeSBkYXRhIGluIGl0cyBlbnRpcmV0eS4gSWYgeW91cgorICAgICAgICAvLy8gICBhcHBsaWNhdGlvbiB3cml0ZXMgZGlmZmVyZW50IGRhdGEgZHVyaW5nIHRoZSBzZWNvbmQgY2FsbCwgaXQgd2lsbAorICAgICAgICAvLy8gICByZXN1bHQgaW4gYSBjb3JydXB0IHppcCBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgZG91YmxlLXJlYWQgYmVoYXZpb3IgaGFwcGVucyB3aXRoIGFsbCB0eXBlcyBvZiBlbnRyaWVzLCBub3Qgb25seQorICAgICAgICAvLy8gICB0aG9zZSB0aGF0IHVzZSBXcml0ZURlbGVnYXRlLiBJdCBoYXBwZW5zIGlmIHlvdSBhZGQgYW4gZW50cnkgZnJvbSBhCisgICAgICAgIC8vLyAgIGZpbGVzeXN0ZW0gZmlsZSwgb3IgdXNpbmcgYSBzdHJpbmcsIG9yIGEgc3RyZWFtLCBvciBhbiBvcGVuZXIvY2xvc2VyCisgICAgICAgIC8vLyAgIHBhaXIuIEJ1dCBpbiB0aG9zZSBjYXNlcywgRG90TmV0WmlwIHRha2VzIGNhcmUgb2YgcmVhZGluZyB0d2ljZTsgaW4KKyAgICAgICAgLy8vICAgdGhlIGNhc2Ugb2YgdGhlIFdyaXRlRGVsZWdhdGUsIHRoZSBhcHBsaWNhdGlvbiBjb2RlIGdldHMgaW52b2tlZAorICAgICAgICAvLy8gICB0d2ljZS4gQmUgYXdhcmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFzIHlvdSBjYW4gaW1hZ2luZSwgdGhpcyBjYW4gY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIGxhcmdlCisgICAgICAgIC8vLyAgIHN0cmVhbXMsIGFuZCBpdCBjYW4gbGVhZCB0byBjb3JyZWN0bmVzcyBwcm9ibGVtcyB3aGVuIHlvdSB1c2UgYQorICAgICAgICAvLy8gICA8Yz5Xcml0ZURlbGVnYXRlPC9jPi4gVGhpcyBpcyBhIHByZXR0eSBiaWcgcGl0ZmFsbC4gIFRoZXJlIGFyZSB0d28KKyAgICAgICAgLy8vICAgd2F5cyB0byBhdm9pZCBpdC4gIEZpcnN0LCBhbmQgbW9zdCBwcmVmZXJyZWQ6IGRvbid0IHVzZSBQS1pJUAorICAgICAgICAvLy8gICBlbmNyeXB0aW9uLiAgSWYgeW91IHVzZSB0aGUgV2luWmlwIEFFUyBlbmNyeXB0aW9uLCB0aGlzIHByb2JsZW0KKyAgICAgICAgLy8vICAgZG9lc24ndCBvY2N1ciwgYmVjYXVzZSB0aGUgZW5jcnlwdGlvbiBwcm90b2NvbCBkb2Vzbid0IHJlcXVpcmUgdGhlIENSQworICAgICAgICAvLy8gICB1cCBmcm9udC4gU2Vjb25kOiBpZiB5b3UgZG8gY2hvb3NlIHRvIHVzZSBQS1pJUCBlbmNyeXB0aW9uLCB3cml0ZSBvdXQKKyAgICAgICAgLy8vICAgdG8gYSBub24tc2Vla2FibGUgc3RyZWFtIChsaWtlIHN0YW5kYXJkIG91dHB1dCwgb3IgdGhlCisgICAgICAgIC8vLyAgIFJlc3BvbnNlLk91dHB1dFN0cmVhbSBpbiBhbiBBU1AuTkVUIGFwcGxpY2F0aW9uKS4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgLy8vICAgRG90TmV0WmlwIHdpbGwgdXNlIGFuIGFsdGVybmF0aXZlIGVuY3J5cHRpb24gcHJvdG9jb2wgdGhhdCBkb2VzIG5vdAorICAgICAgICAvLy8gICByZWx5IG9uIHRoZSBDUkMgb2YgdGhlIGNvbnRlbnQuICBUaGlzIGFsc28gaW1wbGllcyBzZXR0aW5nIGJpdCAzIGluCisgICAgICAgIC8vLyAgIHRoZSB6aXAgZW50cnksIHdoaWNoIHN0aWxsIHByZXNlbnRzIHByb2JsZW1zIGZvciBzb21lIHppcCB0b29scy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gdGhlIGZ1dHVyZSBJIG1heSBtb2RpZnkgRG90TmV0WmlwIHRvICphbHdheXMqIHVzZSBiaXQgMyB3aGVuIFBLWklQCisgICAgICAgIC8vLyAgIGVuY3J5cHRpb24gaXMgaW4gdXNlLiAgVGhpcyBzZWVtcyBsaWtlIGEgd2luIG92ZXJhbGwsIGJ1dCB0aGVyZSB3aWxsCisgICAgICAgIC8vLyAgIGJlIHNvbWUgd29yayBpbnZvbHZlZC4gIElmIHlvdSBmZWVsIHN0cm9uZ2x5IGFib3V0IGl0LCB2aXNpdCB0aGUKKyAgICAgICAgLy8vICAgRG90TmV0WmlwIGZvcnVtcyBhbmQgdm90ZSB1cCA8c2VlCisgICAgICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tL3dvcmtpdGVtLzEzNjg2Ij50aGUgV29ya2l0ZW0KKyAgICAgICAgLy8vICAgdHJhY2tpbmcgdGhpcyBpc3N1ZTwvc2VlPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+dGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIGFkZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3JpdGVyIj50aGUgZGVsZWdhdGUgd2hpY2ggd2lsbCB3cml0ZSB0aGUgZW50cnkgY29udGVudDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgWmlwRW50cnkgYWRkZWQ8L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgYW4gYXBwbGljYXRpb24gZmlsbGluZyBhIERhdGFTZXQsIHRoZW4gc2F2aW5nIHRoZQorICAgICAgICAvLy8gICBjb250ZW50cyBvZiB0aGF0IERhdGFTZXQgYXMgWE1MLCBpbnRvIGEgWmlwRW50cnkgaW4gYSBaaXBGaWxlLCB1c2luZyBhbgorICAgICAgICAvLy8gICBhbm9ueW1vdXMgZGVsZWdhdGUgaW4gQyMuIFRoZSBEYXRhU2V0IFhNTCBpcyBuZXZlciBzYXZlZCB0byBhIGRpc2sgZmlsZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB2YXIgYzE9IG5ldyBTeXN0ZW0uRGF0YS5TcWxDbGllbnQuU3FsQ29ubmVjdGlvbihjb25uc3RyaW5nMSk7CisgICAgICAgIC8vLyB2YXIgZGEgPSBuZXcgU3lzdGVtLkRhdGEuU3FsQ2xpZW50LlNxbERhdGFBZGFwdGVyKCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIFNlbGVjdENvbW1hbmQ9ICBuZXcgU3lzdGVtLkRhdGEuU3FsQ2xpZW50LlNxbENvbW1hbmQoc3RyU2VsZWN0LCBjMSkKKyAgICAgICAgLy8vICAgICB9OworICAgICAgICAvLy8KKyAgICAgICAgLy8vIERhdGFTZXQgZHMxID0gbmV3IERhdGFTZXQoKTsKKyAgICAgICAgLy8vIGRhLkZpbGwoZHMxLCAiSW52b2ljZXMiKTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyB1c2luZyhJb25pYy5aaXAuWmlwRmlsZSB6aXAgPSBuZXcgSW9uaWMuWmlwLlppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRW50cnkoemlwRW50cnlOYW1lLCAobmFtZSxzdHJlYW0pID0+IGRzMS5Xcml0ZVhtbChzdHJlYW0pICk7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoemlwRmlsZU5hbWUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSB1c2VzIGFuIGFub255bW91cyBtZXRob2QgaW4gQyMgYXMgdGhlIFdyaXRlRGVsZWdhdGUgdG8gcHJvdmlkZQorICAgICAgICAvLy8gdGhlIGRhdGEgZm9yIHRoZSBaaXBFbnRyeS4gVGhlIGV4YW1wbGUgaXMgYSBiaXQgY29udHJpdmVkIC0gdGhlCisgICAgICAgIC8vLyA8Yz5BZGRGaWxlKCk8L2M+IG1ldGhvZCBpcyBhIHNpbXBsZXIgd2F5IHRvIGluc2VydCB0aGUgY29udGVudHMgb2YgYSBmaWxlCisgICAgICAgIC8vLyBpbnRvIGFuIGVudHJ5IGluIGEgemlwIGZpbGUuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSBpcyBzb21lIHNvcnQgb2YKKyAgICAgICAgLy8vIHByb2Nlc3Npbmcgb3IgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGZpbGUgY29udGVudHMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcsCisgICAgICAgIC8vLyB0aGUgYXBwbGljYXRpb24gY291bGQgdXNlIHRoZSA8Yz5Xcml0ZURlbGVnYXRlPC9jPiB0byBkbyBpdCwgaW4gdGhpcyB3YXkuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdXNpbmcgKHZhciBpbnB1dCA9IEZpbGUuT3BlbihmaWxlbmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkLCBGaWxlU2hhcmUuUmVhZFdyaXRlICkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgdXNpbmcoSW9uaWMuWmlwLlppcEZpbGUgemlwID0gbmV3IElvbmljLlppcC5aaXBGaWxlKCkpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB6aXAuQWRkRW50cnkoemlwRW50cnlOYW1lLCAobmFtZSxvdXRwdXQpID0+CisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0J1ZmZlclNpemVdOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgIT0gMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIHRyYW5zZm9ybSB0aGUgZGF0YSBoZXJlLi4uCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCB1cGRhdGUgYSBwcm9ncmVzcyBiYXIgaGVyZQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgICAgIH0pOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgICAgemlwLlNhdmUoemlwRmlsZU5hbWUpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgdXNlcyBhIG5hbWVkIGRlbGVnYXRlIGluIFZCIHRvIHdyaXRlIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgICAgICAvLy8gWmlwRW50cnkgKFZCOSBkb2VzIG5vdCBoYXZlIGFub255bW91cyBkZWxlZ2F0ZXMpLiBUaGUgZXhhbXBsZSBoZXJlIGlzIGEgYml0CisgICAgICAgIC8vLyBjb250cml2ZWQgLSBhIHNpbXBsZXIgd2F5IHRvIGFkZCB0aGUgY29udGVudHMgb2YgYSBmaWxlIHRvIGEgWmlwRW50cnkgaXMgdG8KKyAgICAgICAgLy8vIHNpbXBseSB1c2UgdGhlIGFwcHJvcHJpYXRlIDxjPkFkZEZpbGUoKTwvYz4gbWV0aG9kLiAgVGhlIGtleSBzY2VuYXJpbyBmb3IKKyAgICAgICAgLy8vIHdoaWNoIHRoZSA8Yz5Xcml0ZURlbGVnYXRlPC9jPiBtYWtlcyBzZW5zZSBpcyBzYXZpbmcgYSBEYXRhU2V0LCBpbiBYTUwKKyAgICAgICAgLy8vIGZvcm1hdCwgdG8gdGhlIHppcCBmaWxlLiBUaGUgRGF0YVNldCBjYW4gd3JpdGUgWE1MIHRvIGEgc3RyZWFtLCBhbmQgdGhlCisgICAgICAgIC8vLyBXcml0ZURlbGVnYXRlIGlzIHRoZSBwZXJmZWN0IHBsYWNlIHRvIHdyaXRlIGludG8gdGhlIHppcCBmaWxlLiAgVGhlcmUgbWF5IGJlCisgICAgICAgIC8vLyBvdGhlciBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjYW4gd3JpdGUgdG8gYSBzdHJlYW0sIGJ1dCBjYW5ub3QgYmUgcmVhZCBhcyBhCisgICAgICAgIC8vLyBzdHJlYW0uICBUaGUgPGM+V3JpdGVEZWxlZ2F0ZTwvYz4gd291bGQgYmUgYXBwcm9wcmlhdGUgZm9yIHRob3NlIGNhc2VzIGFzCisgICAgICAgIC8vLyB3ZWxsLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFByaXZhdGUgU3ViIFdyaXRlRW50cnkgKEJ5VmFsIG5hbWUgQXMgU3RyaW5nLCBCeVZhbCBvdXRwdXQgQXMgU3RyZWFtKQorICAgICAgICAvLy8gICAgIFVzaW5nIGlucHV0IEFzIEZpbGVTdHJlYW0gPSBGaWxlLk9wZW4oZmlsZW5hbWUsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCwgRmlsZVNoYXJlLlJlYWRXcml0ZSkKKyAgICAgICAgLy8vICAgICAgICAgRGltIG4gQXMgSW50ZWdlciA9IC0xCisgICAgICAgIC8vLyAgICAgICAgIERpbSBidWZmZXIgQXMgQnl0ZSgpID0gTmV3IEJ5dGUoQnVmZmVyU2l6ZSl7fQorICAgICAgICAvLy8gICAgICAgICBEbyBXaGlsZSBuICZsdDsmZ3Q7IDAKKyAgICAgICAgLy8vICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgIExvb3AKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBQdWJsaWMgU3ViIFJ1bigpCisgICAgICAgIC8vLyAgICAgVXNpbmcgemlwID0gTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICAgICAgemlwLkFkZEVudHJ5KHppcEVudHJ5TmFtZSwgTmV3IFdyaXRlRGVsZWdhdGUoQWRkcmVzc09mIFdyaXRlRW50cnkpKQorICAgICAgICAvLy8gICAgICAgICB6aXAuU2F2ZSh6aXBGaWxlTmFtZSkKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgcHVibGljIFppcEVudHJ5IEFkZEVudHJ5KHN0cmluZyBlbnRyeU5hbWUsIFdyaXRlRGVsZWdhdGUgd3JpdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IFppcEVudHJ5LkNyZWF0ZUZvcldyaXRlcihlbnRyeU5hbWUsIHdyaXRlcik7CisgICAgICAgICAgICBpZiAoVmVyYm9zZSkgU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJhZGRpbmcgezB9Li4uIiwgZW50cnlOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBfSW50ZXJuYWxBZGRFbnRyeSh6ZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkIGFuIGVudHJ5LCBmb3Igd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHdpbGwgcHJvdmlkZSBhIHN0cmVhbQorICAgICAgICAvLy8gICBjb250YWluaW5nIHRoZSBlbnRyeSBkYXRhLCBvbiBhIGp1c3QtaW4tdGltZSBiYXNpcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbiBjYXNlcyB3aGVyZSB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIG9wZW4gdGhlIHN0cmVhbSB0aGF0CisgICAgICAgIC8vLyAgIGhvbGRzIHRoZSBjb250ZW50IGZvciB0aGUgWmlwRW50cnksIG9uIGEganVzdC1pbi10aW1lIGJhc2lzLCB0aGUKKyAgICAgICAgLy8vICAgYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIG1ldGhvZC4gIFRoZSBhcHBsaWNhdGlvbiBwcm92aWRlcyBhbgorICAgICAgICAvLy8gICBvcGVuZXIgZGVsZWdhdGUgdGhhdCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgRG90TmV0WmlwIGxpYnJhcnkgdG8KKyAgICAgICAgLy8vICAgb2J0YWluIGEgcmVhZGFibGUgc3RyZWFtIHRoYXQgY2FuIGJlIHJlYWQgdG8gZ2V0IHRoZSBieXRlcyBmb3IKKyAgICAgICAgLy8vICAgdGhlIGdpdmVuIGVudHJ5LiAgVHlwaWNhbGx5LCB0aGlzIGRlbGVnYXRlIG9wZW5zIGEgc3RyZWFtLgorICAgICAgICAvLy8gICBPcHRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gY2FuIHByb3ZpZGUgYSBjbG9zZXIgZGVsZWdhdGUgYXMKKyAgICAgICAgLy8vICAgd2VsbCwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYnkgRG90TmV0WmlwIHdoZW4gYWxsIGJ5dGVzIGhhdmUgYmVlbgorICAgICAgICAvLy8gICByZWFkIGZyb20gdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGVzZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGNhbGwgdG8KKyAgICAgICAgLy8vICAgWmlwRmlsZS5TYXZlKCkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHVzZXMgYW5vbnltb3VzIG1ldGhvZHMgaW4gQyMgdG8gb3BlbiBhbmQgY2xvc2UgdGhlCisgICAgICAgIC8vLyAgIHNvdXJjZSBzdHJlYW0gZm9yIHRoZSBjb250ZW50IGZvciBhIHppcCBlbnRyeS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB1c2luZyhJb25pYy5aaXAuWmlwRmlsZSB6aXAgPSBuZXcgSW9uaWMuWmlwLlppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRW50cnkoemlwRW50cnlOYW1lLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAobmFtZSkgPT4gIEZpbGUuT3BlbihmaWxlbmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkLCBGaWxlU2hhcmUuUmVhZFdyaXRlICksCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgIChuYW1lLCBzdHJlYW0pID0+ICBzdHJlYW0uQ2xvc2UoKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICApOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSh6aXBGaWxlTmFtZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHVzZXMgZGVsZWdhdGVzIGluIFZCLk5FVCB0byBvcGVuIGFuZCBjbG9zZSB0aGUKKyAgICAgICAgLy8vICAgdGhlIHNvdXJjZSBzdHJlYW0gZm9yIHRoZSBjb250ZW50IGZvciBhIHppcCBlbnRyeS4gIFZCIDkuMCBsYWNrcworICAgICAgICAvLy8gICBzdXBwb3J0IGZvciAiU3ViIiBsYW1iZGEgZXhwcmVzc2lvbnMsIGFuZCBzbyB0aGUgQ2xvc2VEZWxlZ2F0ZSBtdXN0CisgICAgICAgIC8vLyAgIGJlIGFuIGFjdHVhbCwgbmFtZWQgU3ViLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBGdW5jdGlvbiBNeVN0cmVhbU9wZW5lcihCeVZhbCBlbnRyeU5hbWUgQXMgU3RyaW5nKSBBcyBTdHJlYW0KKyAgICAgICAgLy8vICAgICAnJyBUaGlzIHNpbXBseSBvcGVucyBhIGZpbGUuICBZb3UgcHJvYmFibHkgd2FudCB0byBkbyBzb21ldGhpbmlnCisgICAgICAgIC8vLyAgICAgJycgbW9yZSBpbnZvbHZlZCBoZXJlOiBvcGVuIGEgc3RyZWFtIHRvIHJlYWQgZnJvbSBhIGRhdGFiYXNlLAorICAgICAgICAvLy8gICAgICcnIG9wZW4gYSBzdHJlYW0gb24gYW4gSFRUUCBjb25uZWN0aW9uLCBhbmQgc28gb24uCisgICAgICAgIC8vLyAgICAgUmV0dXJuIEZpbGUuT3BlblJlYWQoZW50cnlOYW1lKQorICAgICAgICAvLy8gRW5kIEZ1bmN0aW9uCisgICAgICAgIC8vLworICAgICAgICAvLy8gU3ViIE15U3RyZWFtQ2xvc2VyKGVudHJ5TmFtZSBBcyBTdHJpbmcsIHN0cmVhbSBBcyBTdHJlYW0pCisgICAgICAgIC8vLyAgICAgc3RyZWFtLkNsb3NlKCkKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBQdWJsaWMgU3ViIFJ1bigpCisgICAgICAgIC8vLyAgICAgRGltIGRpclRvWmlwIEFzIFN0cmluZyA9ICJmb2RkZXIiCisgICAgICAgIC8vLyAgICAgRGltIHppcEZpbGVUb0NyZWF0ZSBBcyBTdHJpbmcgPSAiQXJjaGl2ZS56aXAiCisgICAgICAgIC8vLyAgICAgRGltIG9wZW5lciBBcyBPcGVuRGVsZWdhdGUgPSBBZGRyZXNzT2YgTXlTdHJlYW1PcGVuZXIKKyAgICAgICAgLy8vICAgICBEaW0gY2xvc2VyIEFzIENsb3NlRGVsZWdhdGUgPSBBZGRyZXNzT2YgTXlTdHJlYW1DbG9zZXIKKyAgICAgICAgLy8vICAgICBEaW0gbnVtRmlsZXN0b0FkZCBBcyBJbnQzMiA9IDQKKyAgICAgICAgLy8vICAgICBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IE5ldyBaaXBGaWxlCisgICAgICAgIC8vLyAgICAgICAgIERpbSBpIEFzIEludGVnZXIKKyAgICAgICAgLy8vICAgICAgICAgRm9yIGkgPSAwIFRvIG51bUZpbGVzVG9BZGQgLSAxCisgICAgICAgIC8vLyAgICAgICAgICAgICB6aXAuQWRkRW50cnkoU3RyaW5nLkZvcm1hdCgiY29udGVudC17MDowMDB9LnR4dCIpLCBvcGVuZXIsIGNsb3NlcikKKyAgICAgICAgLy8vICAgICAgICAgTmV4dCBpCisgICAgICAgIC8vLyAgICAgICAgIHppcC5TYXZlKHppcEZpbGVUb0NyZWF0ZSkKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+dGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIGFkZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3BlbmVyIj4KKyAgICAgICAgLy8vICB0aGUgZGVsZWdhdGUgdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgWmlwRmlsZS5TYXZlKCkgdG8gZ2V0IHRoZQorICAgICAgICAvLy8gIHJlYWRhYmxlIHN0cmVhbSBmb3IgdGhlIGdpdmVuIGVudHJ5LiBaaXBGaWxlLlNhdmUoKSB3aWxsIGNhbGwKKyAgICAgICAgLy8vICByZWFkIG9uIHRoaXMgc3RyZWFtIHRvIG9idGFpbiB0aGUgZGF0YSBmb3IgdGhlIGVudHJ5LiBUaGlzIGRhdGEKKyAgICAgICAgLy8vICB3aWxsIHRoZW4gYmUgY29tcHJlc3NlZCBhbmQgd3JpdHRlbiB0byB0aGUgbmV3bHkgY3JlYXRlZCB6aXAKKyAgICAgICAgLy8vICBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbG9zZXIiPgorICAgICAgICAvLy8gIHRoZSBkZWxlZ2F0ZSB0aGF0IHdpbGwgYmUgaW52b2tlZCB0byBjbG9zZSB0aGUgc3RyZWFtLiBUaGlzIG1heQorICAgICAgICAvLy8gIGJlIG51bGwgKE5vdGhpbmcgaW4gVkIpLCBpbiB3aGljaCBjYXNlIG5vIGNhbGwgaXMgbWFrZGUgdG8gY2xvc2UKKyAgICAgICAgLy8vICB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBaaXBFbnRyeSBhZGRlZDwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBBZGRFbnRyeShzdHJpbmcgZW50cnlOYW1lLCBPcGVuRGVsZWdhdGUgb3BlbmVyLCBDbG9zZURlbGVnYXRlIGNsb3NlcikKKyAgICAgICAgeworICAgICAgICAgICAgWmlwRW50cnkgemUgPSBaaXBFbnRyeS5DcmVhdGVGb3JKaXRTdHJlYW1Qcm92aWRlcihlbnRyeU5hbWUsIG9wZW5lciwgY2xvc2VyKTsKKyAgICAgICAgICAgIHplLlNldEVudHJ5VGltZXMoRGF0ZVRpbWUuTm93LERhdGVUaW1lLk5vdyxEYXRlVGltZS5Ob3cpOworICAgICAgICAgICAgaWYgKFZlcmJvc2UpIFN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgiYWRkaW5nIHswfS4uLiIsIGVudHJ5TmFtZSk7CisgICAgICAgICAgICByZXR1cm4gX0ludGVybmFsQWRkRW50cnkoemUpOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgWmlwRW50cnkgX0ludGVybmFsQWRkRW50cnkoWmlwRW50cnkgemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHN0YW1wIGFsbCB0aGUgcHJvcHMgb250byB0aGUgZW50cnkKKyAgICAgICAgICAgIHplLl9jb250YWluZXIgPSBuZXcgWmlwQ29udGFpbmVyKHRoaXMpOworICAgICAgICAgICAgemUuQ29tcHJlc3Npb25NZXRob2QgPSB0aGlzLkNvbXByZXNzaW9uTWV0aG9kOworICAgICAgICAgICAgemUuQ29tcHJlc3Npb25MZXZlbCA9IHRoaXMuQ29tcHJlc3Npb25MZXZlbDsKKyAgICAgICAgICAgIHplLkV4dHJhY3RFeGlzdGluZ0ZpbGUgPSB0aGlzLkV4dHJhY3RFeGlzdGluZ0ZpbGU7CisgICAgICAgICAgICB6ZS5aaXBFcnJvckFjdGlvbiA9IHRoaXMuWmlwRXJyb3JBY3Rpb247CisgICAgICAgICAgICB6ZS5TZXRDb21wcmVzc2lvbiA9IHRoaXMuU2V0Q29tcHJlc3Npb247CisgICAgICAgICAgICB6ZS5BbHRlcm5hdGVFbmNvZGluZyA9IHRoaXMuQWx0ZXJuYXRlRW5jb2Rpbmc7CisgICAgICAgICAgICB6ZS5BbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gdGhpcy5BbHRlcm5hdGVFbmNvZGluZ1VzYWdlOworICAgICAgICAgICAgemUuUGFzc3dvcmQgPSB0aGlzLl9QYXNzd29yZDsKKyAgICAgICAgICAgIHplLkVuY3J5cHRpb24gPSB0aGlzLkVuY3J5cHRpb247CisgICAgICAgICAgICB6ZS5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nID0gdGhpcy5fZW1pdE50ZnNUaW1lczsKKyAgICAgICAgICAgIHplLkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmcgPSB0aGlzLl9lbWl0VW5peFRpbWVzOworICAgICAgICAgICAgLy9zdHJpbmcga2V5ID0gRGljdGlvbmFyeUtleUZvckVudHJ5KHplKTsKKyAgICAgICAgICAgIEludGVybmFsQWRkRW50cnkoemUuRmlsZU5hbWUsemUpOworICAgICAgICAgICAgQWZ0ZXJBZGRFbnRyeSh6ZSk7CisgICAgICAgICAgICByZXR1cm4gemU7CisgICAgICAgIH0KKworCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFVwZGF0ZXMgdGhlIGdpdmVuIGVudHJ5IGluIHRoZSA8Yz5aaXBGaWxlPC9jPiwgdXNpbmcgdGhlIGdpdmVuCisgICAgICAgIC8vLyAgIHN0cmluZyBhcyBjb250ZW50IGZvciB0aGUgPGM+WmlwRW50cnk8L2M+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIDxjPlppcEVudHJ5PC9jPiBmb3IKKyAgICAgICAgLy8vICAgdGhlIGdpdmVuIGZpbGUgbmFtZSBhbmQgZGlyZWN0b3J5IHBhdGgsIGlmIGl0IGV4aXN0cywgYW5kIHRoZW4gY2FsbGluZworICAgICAgICAvLy8gICA8c2VlIGNyZWY9IkFkZEVudHJ5KFN0cmluZyxTdHJpbmcpIiAvPi4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgICAgICAgLy8vICAgdGhhdCBtZXRob2QgZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb24uIFRoZSBzdHJpbmcgY29udGVudCBpcyBlbmNvZGVkCisgICAgICAgIC8vLyAgIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgbWFjaGluZSwgb3Igb24gU2lsdmVybGlnaHQsIHVzaW5nCisgICAgICAgIC8vLyAgIFVURi04LiBUaGlzIGVuY29kaW5nIGlzIGRpc3RpbmN0IGZyb20gdGhlIGVuY29kaW5nIHVzZWQgZm9yIHRoZQorICAgICAgICAvLy8gICBmaWxlbmFtZSBpdHNlbGYuICBTZWUgPHNlZSBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZyIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lLCBpbmNsdWRpbmcgYW55IHBhdGgsIHRvIHVzZSB3aXRoaW4gdGhlIGFyY2hpdmUgZm9yIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRlbnQiPgorICAgICAgICAvLy8gICBUaGUgY29udGVudCBvZiB0aGUgZmlsZSwgc2hvdWxkIGl0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSB6aXAuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFppcEVudHJ5IFVwZGF0ZUVudHJ5KHN0cmluZyBlbnRyeU5hbWUsIHN0cmluZyBjb250ZW50KQorICAgICAgICB7CisjaWYgU0lMVkVSTElHSFQKKyAgICAgICAgICAgIHJldHVybiBVcGRhdGVFbnRyeShlbnRyeU5hbWUsIGNvbnRlbnQsIFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjgpOworI2Vsc2UKKyAgICAgICAgICAgIHJldHVybiBVcGRhdGVFbnRyeShlbnRyeU5hbWUsIGNvbnRlbnQsIFN5c3RlbS5UZXh0LkVuY29kaW5nLkRlZmF1bHQpOworI2VuZGlmCisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVXBkYXRlcyB0aGUgZ2l2ZW4gZW50cnkgaW4gdGhlIDxjPlppcEZpbGU8L2M+LCB1c2luZyB0aGUgZ2l2ZW4gc3RyaW5nIGFzCisgICAgICAgIC8vLyAgIGNvbnRlbnQgZm9yIHRoZSA8Yz5aaXBFbnRyeTwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgPGM+WmlwRW50cnk8L2M+IGZvciB0aGUKKyAgICAgICAgLy8vICAgZ2l2ZW4gZmlsZSBuYW1lIGFuZCBkaXJlY3RvcnkgcGF0aCwgaWYgaXQgZXhpc3RzLCBhbmQgdGhlbiBjYWxsaW5nIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iQWRkRW50cnkoU3RyaW5nLFN0cmluZywgU3lzdGVtLlRleHQuRW5jb2RpbmcpIiAvPi4gIFNlZSB0aGUKKyAgICAgICAgLy8vICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtZXRob2QgZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb24uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lLCBpbmNsdWRpbmcgYW55IHBhdGgsIHRvIHVzZSB3aXRoaW4gdGhlIGFyY2hpdmUgZm9yIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRlbnQiPgorICAgICAgICAvLy8gICBUaGUgY29udGVudCBvZiB0aGUgZmlsZSwgc2hvdWxkIGl0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSB6aXAuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNvZGluZyI+CisgICAgICAgIC8vLyAgIFRoZSB0ZXh0IGVuY29kaW5nIHRvIHVzZSB3aGVuIGVuY29kaW5nIHRoZSBzdHJpbmcuIEJlIGF3YXJlOiBUaGlzIGlzCisgICAgICAgIC8vLyAgIGRpc3RpbmN0IGZyb20gdGhlIHRleHQgZW5jb2RpbmcgdXNlZCB0byBlbmNvZGUgdGhlIGZpbGVuYW1lLiBTZWUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZyIgLz4uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFppcEVudHJ5IFVwZGF0ZUVudHJ5KHN0cmluZyBlbnRyeU5hbWUsIHN0cmluZyBjb250ZW50LCBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZykKKyAgICAgICAgeworICAgICAgICAgICAgUmVtb3ZlRW50cnlGb3JVcGRhdGUoZW50cnlOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBZGRFbnRyeShlbnRyeU5hbWUsIGNvbnRlbnQsIGVuY29kaW5nKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFVwZGF0ZXMgdGhlIGdpdmVuIGVudHJ5IGluIHRoZSA8Yz5aaXBGaWxlPC9jPiwgdXNpbmcgdGhlIGdpdmVuIGRlbGVnYXRlCisgICAgICAgIC8vLyAgIGFzIHRoZSBzb3VyY2UgZm9yIGNvbnRlbnQgZm9yIHRoZSA8Yz5aaXBFbnRyeTwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgPGM+WmlwRW50cnk8L2M+IGZvciB0aGUKKyAgICAgICAgLy8vICAgZ2l2ZW4gZmlsZSBuYW1lIGFuZCBkaXJlY3RvcnkgcGF0aCwgaWYgaXQgZXhpc3RzLCBhbmQgdGhlbiBjYWxsaW5nIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iQWRkRW50cnkoU3RyaW5nLFdyaXRlRGVsZWdhdGUpIiAvPi4gIFNlZSB0aGUKKyAgICAgICAgLy8vICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtZXRob2QgZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb24uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lLCBpbmNsdWRpbmcgYW55IHBhdGgsIHRvIHVzZSB3aXRoaW4gdGhlIGFyY2hpdmUgZm9yIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndyaXRlciI+dGhlIGRlbGVnYXRlIHdoaWNoIHdpbGwgd3JpdGUgdGhlIGVudHJ5IGNvbnRlbnQuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgPGM+WmlwRW50cnk8L2M+IGFkZGVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBaaXBFbnRyeSBVcGRhdGVFbnRyeShzdHJpbmcgZW50cnlOYW1lLCBXcml0ZURlbGVnYXRlIHdyaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgUmVtb3ZlRW50cnlGb3JVcGRhdGUoZW50cnlOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBZGRFbnRyeShlbnRyeU5hbWUsIHdyaXRlcik7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBVcGRhdGVzIHRoZSBnaXZlbiBlbnRyeSBpbiB0aGUgPGM+WmlwRmlsZTwvYz4sIHVzaW5nIHRoZSBnaXZlbiBkZWxlZ2F0ZXMKKyAgICAgICAgLy8vICAgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIHN0cmVhbSB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZW50IGZvciB0aGUgPGM+WmlwRW50cnk8L2M+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIDxjPlppcEVudHJ5PC9jPiBmb3IgdGhlCisgICAgICAgIC8vLyAgIGdpdmVuIGZpbGUgbmFtZSBhbmQgZGlyZWN0b3J5IHBhdGgsIGlmIGl0IGV4aXN0cywgYW5kIHRoZW4gY2FsbGluZyA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkFkZEVudHJ5KFN0cmluZyxPcGVuRGVsZWdhdGUsIENsb3NlRGVsZWdhdGUpIiAvPi4gIFNlZSB0aGUKKyAgICAgICAgLy8vICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtZXRob2QgZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb24uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5TmFtZSI+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lLCBpbmNsdWRpbmcgYW55IHBhdGgsIHRvIHVzZSB3aXRoaW4gdGhlIGFyY2hpdmUgZm9yIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9wZW5lciI+CisgICAgICAgIC8vLyAgdGhlIGRlbGVnYXRlIHRoYXQgd2lsbCBiZSBpbnZva2VkIHRvIG9wZW4gdGhlIHN0cmVhbQorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbG9zZXIiPgorICAgICAgICAvLy8gIHRoZSBkZWxlZ2F0ZSB0aGF0IHdpbGwgYmUgaW52b2tlZCB0byBjbG9zZSB0aGUgc3RyZWFtCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQgb3IgdXBkYXRlZC48L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgWmlwRW50cnkgVXBkYXRlRW50cnkoc3RyaW5nIGVudHJ5TmFtZSwgT3BlbkRlbGVnYXRlIG9wZW5lciwgQ2xvc2VEZWxlZ2F0ZSBjbG9zZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlbW92ZUVudHJ5Rm9yVXBkYXRlKGVudHJ5TmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQWRkRW50cnkoZW50cnlOYW1lLCBvcGVuZXIsIGNsb3Nlcik7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVXBkYXRlcyB0aGUgZ2l2ZW4gZW50cnkgaW4gdGhlIDxjPlppcEZpbGU8L2M+LCB1c2luZyB0aGUgZ2l2ZW4gc3RyZWFtIGFzCisgICAgICAgIC8vLyAgIGlucHV0LCBhbmQgdGhlIGdpdmVuIGZpbGVuYW1lIGFuZCBnaXZlbiBkaXJlY3RvcnkgUGF0aC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBDYWxsaW5nIHRoZSBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDxjPlJlbW92ZUVudHJ5KCk8L2M+IGlmIGFuCisgICAgICAgIC8vLyAgIGVudHJ5IGJ5IHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIGFuZCB0aGVuIGNhbGxpbmcgPGM+QWRkRW50cnkoKTwvYz4KKyAgICAgICAgLy8vICAgd2l0aCB0aGUgZ2l2ZW4gPGM+ZmlsZU5hbWU8L2M+IGFuZCBzdHJlYW0uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBzdHJlYW0gbXVzdCBiZSBvcGVuIGFuZCByZWFkYWJsZSBkdXJpbmcgdGhlIGNhbGwgdG8KKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZS5TYXZlPC9jPi4gIFlvdSBjYW4gZGlzcGVuc2UgdGhlIHN0cmVhbSBvbiBhIGp1c3QtaW4tdGltZSBiYXNpcworICAgICAgICAvLy8gICB1c2luZyB0aGUgPHNlZSBjcmVmPSJaaXBFbnRyeS5JbnB1dFN0cmVhbSIvPiBwcm9wZXJ0eS4gQ2hlY2sgdGhlCisgICAgICAgIC8vLyAgIGRvY3VtZW50YXRpb24gb2YgdGhhdCBwcm9wZXJ0eSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIDxjPlppcEZpbGU8L2M+IHByb3BlcnRpZXMgaW5jbHVkaW5nIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQYXNzd29yZCIvPiwgPHNlZSBjcmVmPSJTZXRDb21wcmVzc2lvbiIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+LCA8c2VlIGNyZWY9IkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4sCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRXJyb3JBY3Rpb24iLz4sIGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHRoZWlyCisgICAgICAgIC8vLyAgIHJlc3BlY3RpdmUgdmFsdWVzIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBhZGRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkRW50cnkoc3RyaW5nLCBTeXN0ZW0uSU8uU3RyZWFtKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRW50cnkuSW5wdXRTdHJlYW0iLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUsIGluY2x1ZGluZyBhbnkgcGF0aCwgdG8gdXNlIHdpdGhpbiB0aGUgYXJjaGl2ZSBmb3IgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZCBmaWxlIGRhdGEuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgWmlwRW50cnkgVXBkYXRlRW50cnkoc3RyaW5nIGVudHJ5TmFtZSwgU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVtb3ZlRW50cnlGb3JVcGRhdGUoZW50cnlOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBZGRFbnRyeShlbnRyeU5hbWUsIHN0cmVhbSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBSZW1vdmVFbnRyeUZvclVwZGF0ZShzdHJpbmcgZW50cnlOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoZW50cnlOYW1lKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJlbnRyeU5hbWUiKTsKKworICAgICAgICAgICAgc3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUgPSBudWxsOworICAgICAgICAgICAgaWYgKGVudHJ5TmFtZS5JbmRleE9mKCdcXCcpICE9IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUgPSBQYXRoLkdldERpcmVjdG9yeU5hbWUoZW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBQYXRoLkdldEZpbGVOYW1lKGVudHJ5TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIga2V5ID0gWmlwRW50cnkuTmFtZUluQXJjaGl2ZShlbnRyeU5hbWUsIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpOworICAgICAgICAgICAgaWYgKHRoaXNba2V5XSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuUmVtb3ZlRW50cnkoa2V5KTsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkIGFuIGVudHJ5IGludG8gdGhlIHppcCBhcmNoaXZlIHVzaW5nIHRoZSBnaXZlbiBmaWxlbmFtZSBhbmQKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLCBhbmQgdGhlIGdpdmVuIGNvbnRlbnQgZm9yIHRoZQorICAgICAgICAvLy8gICBmaWxlLiBObyBmaWxlIGlzIGNyZWF0ZWQgaW4gdGhlIGZpbGVzeXN0ZW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ5dGVDb250ZW50Ij5UaGUgZGF0YSB0byB1c2UgZm9yIHRoZSBlbnRyeS48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbnRyeU5hbWUiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSwgaW5jbHVkaW5nIGFueSBwYXRoLCB0byB1c2Ugd2l0aGluIHRoZSBhcmNoaXZlIGZvciB0aGUgZW50cnkuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgWmlwRW50cnkgQWRkRW50cnkoc3RyaW5nIGVudHJ5TmFtZSwgYnl0ZVtdIGJ5dGVDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnl0ZUNvbnRlbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgYXJndW1lbnQiLCAiYnl0ZUNvbnRlbnQiKTsKKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oYnl0ZUNvbnRlbnQpOworICAgICAgICAgICAgcmV0dXJuIEFkZEVudHJ5KGVudHJ5TmFtZSwgbXMpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFVwZGF0ZXMgdGhlIGdpdmVuIGVudHJ5IGluIHRoZSA8Yz5aaXBGaWxlPC9jPiwgdXNpbmcgdGhlIGdpdmVuIGJ5dGUKKyAgICAgICAgLy8vICAgYXJyYXkgYXMgY29udGVudCBmb3IgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIDxjPlppcEVudHJ5PC9jPgorICAgICAgICAvLy8gICBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lIGFuZCBkaXJlY3RvcnkgcGF0aCwgaWYgaXQgZXhpc3RzLCBhbmQgdGhlbgorICAgICAgICAvLy8gICBjYWxsaW5nIDxzZWUgY3JlZj0iQWRkRW50cnkoU3RyaW5nLGJ5dGVbXSkiIC8+LiAgU2VlIHRoZQorICAgICAgICAvLy8gICBkb2N1bWVudGF0aW9uIGZvciB0aGF0IG1ldGhvZCBmb3IgZnVydGhlciBleHBsYW5hdGlvbi4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUsIGluY2x1ZGluZyBhbnkgcGF0aCwgdG8gdXNlIHdpdGhpbiB0aGUgYXJjaGl2ZSBmb3IgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnl0ZUNvbnRlbnQiPlRoZSBjb250ZW50IHRvIHVzZSBmb3IgdGhlIDxjPlppcEVudHJ5PC9jPi48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFppcEVudHJ5IFVwZGF0ZUVudHJ5KHN0cmluZyBlbnRyeU5hbWUsIGJ5dGVbXSBieXRlQ29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVtb3ZlRW50cnlGb3JVcGRhdGUoZW50cnlOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBZGRFbnRyeShlbnRyeU5hbWUsIGJ5dGVDb250ZW50KTsKKyAgICAgICAgfQorCisKKy8vICAgICAgICAgcHJpdmF0ZSBzdHJpbmcgRGljdGlvbmFyeUtleUZvckVudHJ5KFppcEVudHJ5IHplMSkKKy8vICAgICAgICAgeworLy8gICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gU2hhcmVkVXRpbGl0aWVzLk5vcm1hbGl6ZVBhdGhGb3JVc2VJblppcEZpbGUoemUxLkZpbGVOYW1lKTsKKy8vICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKy8vICAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IHRvIGEgWmlwIGZpbGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoIG9yIGEgZnVsbHktcXVhbGlmaWVkCisgICAgICAgIC8vLyAgIHBhdGguIEFueSBmaWxlcyB3aXRoaW4gdGhlIG5hbWVkIGRpcmVjdG9yeSBhcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUuICBBbnkKKyAgICAgICAgLy8vICAgc3ViZGlyZWN0b3JpZXMgd2l0aGluIHRoZSBuYW1lZCBkaXJlY3RvcnkgYXJlIGFsc28gYWRkZWQgdG8gdGhlIGFyY2hpdmUsCisgICAgICAgIC8vLyAgIHJlY3Vyc2l2ZWx5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUb3AtbGV2ZWwgZW50cmllcyBpbiB0aGUgbmFtZWQgZGlyZWN0b3J5IHdpbGwgYXBwZWFyIGFzIHRvcC1sZXZlbCBlbnRyaWVzCisgICAgICAgIC8vLyAgIGluIHRoZSB6aXAgYXJjaGl2ZS4gIEVudHJpZXMgaW4gc3ViZGlyZWN0b3JpZXMgaW4gdGhlIG5hbWVkIGRpcmVjdG9yeSB3aWxsCisgICAgICAgIC8vLyAgIHJlc3VsdCBpbiBlbnRyaWVzIGluIHN1YmRpcmVjdG9yaWVzIGluIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgeW91IHdhbnQgdGhlIGVudHJpZXMgdG8gYXBwZWFyIGluIGEgY29udGFpbmluZyBkaXJlY3RvcnkgaW4gdGhlIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlIGl0c2VsZiwgdGhlbiB5b3Ugc2hvdWxkIGNhbGwgdGhlIEFkZERpcmVjdG9yeSgpIG92ZXJsb2FkIHRoYXQKKyAgICAgICAgLy8vICAgYWxsb3dzIHlvdSB0byBleHBsaWNpdGx5IHNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgdXNlIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgPGM+WmlwRmlsZTwvYz4gcHJvcGVydGllcyBpbmNsdWRpbmcgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlBhc3N3b3JkIi8+LCA8c2VlIGNyZWY9IlNldENvbXByZXNzaW9uIi8+LCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4sIDxzZWUgY3JlZj0iRXh0cmFjdEV4aXN0aW5nRmlsZSIvPiwKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBFcnJvckFjdGlvbiIvPiwgYW5kIDxzZWUgY3JlZj0iQ29tcHJlc3Npb25MZXZlbCIvPiwgdGhlaXIKKyAgICAgICAgLy8vICAgcmVzcGVjdGl2ZSB2YWx1ZXMgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsIHdpbGwgYmUgYXBwbGllZCB0byBlYWNoCisgICAgICAgIC8vLyAgIFppcEVudHJ5IGFkZGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRJdGVtKHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZEZpbGUoc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuVXBkYXRlRGlyZWN0b3J5KHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkFkZERpcmVjdG9yeShzdHJpbmcsIHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8b3ZlcmxvYWRzPlRoaXMgbWV0aG9kIGhhcyAyIG92ZXJsb2Fkcy48L292ZXJsb2Fkcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5TmFtZSI+VGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSA8Yz5aaXBFbnRyeTwvYz4gYWRkZWQuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgWmlwRW50cnkgQWRkRGlyZWN0b3J5KHN0cmluZyBkaXJlY3RvcnlOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQWRkRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUsIG51bGwpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZXN5c3RlbSBkaXJlY3RvcnkgdG8gYSBaaXAgZmlsZSBhcmNoaXZlLAorICAgICAgICAvLy8gICBvdmVycmlkaW5nIHRoZSBwYXRoIHRvIGJlIHVzZWQgZm9yIGVudHJpZXMgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBtYXkgYmUgYSByZWxhdGl2ZSBwYXRoIG9yIGEgZnVsbHktcXVhbGlmaWVkCisgICAgICAgIC8vLyAgIHBhdGguIFRoZSBhZGQgb3BlcmF0aW9uIGlzIHJlY3Vyc2l2ZSwgc28gdGhhdCBhbnkgZmlsZXMgb3Igc3ViZGlyZWN0b3JpZXMKKyAgICAgICAgLy8vICAgd2l0aGluIHRoZSBuYW1lIGRpcmVjdG9yeSBhcmUgYWxzbyBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG9wLWxldmVsIGVudHJpZXMgaW4gdGhlIG5hbWVkIGRpcmVjdG9yeSB3aWxsIGFwcGVhciBhcyB0b3AtbGV2ZWwgZW50cmllcworICAgICAgICAvLy8gICBpbiB0aGUgemlwIGFyY2hpdmUuICBFbnRyaWVzIGluIHN1YmRpcmVjdG9yaWVzIGluIHRoZSBuYW1lZCBkaXJlY3Rvcnkgd2lsbAorICAgICAgICAvLy8gICByZXN1bHQgaW4gZW50cmllcyBpbiBzdWJkaXJlY3RvcmllcyBpbiB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciA8Yz5aaXBGaWxlPC9jPiBwcm9wZXJ0aWVzIGluY2x1ZGluZyA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iU2V0Q29tcHJlc3Npb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPiwgPHNlZSBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+LAorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBhbmQgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCB0aGVpcgorICAgICAgICAvLy8gICByZXNwZWN0aXZlIHZhbHVlcyBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgd2lsbCBiZSBhcHBsaWVkIHRvIGVhY2gKKyAgICAgICAgLy8vICAgWmlwRW50cnkgYWRkZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluIHRoaXMgY29kZSwgY2FsbGluZyB0aGUgWmlwVXAoKSBtZXRob2Qgd2l0aCBhIHZhbHVlIG9mICJjOlxyZXBvcnRzIiBmb3IKKyAgICAgICAgLy8vICAgdGhlIGRpcmVjdG9yeSBwYXJhbWV0ZXIgd2lsbCByZXN1bHQgaW4gYSB6aXAgZmlsZSBzdHJ1Y3R1cmUgaW4gd2hpY2ggYWxsCisgICAgICAgIC8vLyAgIGVudHJpZXMgYXJlIGNvbnRhaW5lZCBpbiBhIHRvcGxldmVsICJyZXBvcnRzIiBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gcHVibGljIHZvaWQgWmlwVXAoc3RyaW5nIHRhcmdldFppcCwgc3RyaW5nIGRpcmVjdG9yeSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdXNpbmcgKHZhciB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8gICB7CisgICAgICAgIC8vLyAgICAgemlwLkFkZERpcmVjdG9yeShkaXJlY3RvcnksIFN5c3RlbS5JTy5QYXRoLkdldEZpbGVOYW1lKGRpcmVjdG9yeSkpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKHRhcmdldFppcCk7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRJdGVtKHN0cmluZywgc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkRmlsZShzdHJpbmcsIHN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlVwZGF0ZURpcmVjdG9yeShzdHJpbmcsIHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5TmFtZSI+VGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyAgIFNwZWNpZmllcyBhIGRpcmVjdG9yeSBwYXRoIHRvIHVzZSB0byBvdmVycmlkZSBhbnkgcGF0aCBpbiB0aGUKKyAgICAgICAgLy8vICAgRGlyZWN0b3J5TmFtZS4gIFRoaXMgcGF0aCBtYXksIG9yIG1heSBub3QsIGNvcnJlc3BvbmQgdG8gYSByZWFsIGRpcmVjdG9yeQorICAgICAgICAvLy8gICBpbiB0aGUgY3VycmVudCBmaWxlc3lzdGVtLiAgSWYgdGhlIHppcCBpcyBsYXRlciBleHRyYWN0ZWQsIHRoaXMgaXMgdGhlCisgICAgICAgIC8vLyAgIHBhdGggdXNlZCBmb3IgdGhlIGV4dHJhY3RlZCBmaWxlIG9yIGRpcmVjdG9yeS4gIFBhc3NpbmcgPGM+bnVsbDwvYz4KKyAgICAgICAgLy8vICAgKDxjPk5vdGhpbmc8L2M+IGluIFZCKSBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikgd2lsbCBpbnNlcnQgdGhlIGl0ZW1zIGF0CisgICAgICAgIC8vLyAgIHRoZSByb290IHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgPGM+WmlwRW50cnk8L2M+IGFkZGVkLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFppcEVudHJ5IEFkZERpcmVjdG9yeShzdHJpbmcgZGlyZWN0b3J5TmFtZSwgc3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRPclVwZGF0ZURpcmVjdG9yeUltcGwoZGlyZWN0b3J5TmFtZSwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSwgQWRkT3JVcGRhdGVBY3Rpb24uQWRkT25seSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlcyBhIGRpcmVjdG9yeSBpbiB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlIGJ1dCB0aGVyZSBpcworICAgICAgICAvLy8gICBubyBjb3JyZXNwb25kaW5nIGZpbGVzeXN0ZW0gcmVwcmVzZW50YXRpb24gZm9yIHRoYXQgZGlyZWN0b3J5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBZb3Ugd2lsbCBwcm9iYWJseSBub3QgbmVlZCB0byBkbyB0aGlzIGluIHlvdXIgY29kZS4gT25lIG9mIHRoZSBvbmx5IHRpbWVzCisgICAgICAgIC8vLyAgIHlvdSB3aWxsIHdhbnQgdG8gZG8gdGhpcyBpcyBpZiB5b3Ugd2FudCBhbiBlbXB0eSBkaXJlY3RvcnkgaW4gdGhlIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlLiAgVGhlIHJlYXNvbjogaWYgeW91IGFkZCBhIGZpbGUgdG8gYSB6aXAgYXJjaGl2ZSB0aGF0IGlzIHN0b3JlZAorICAgICAgICAvLy8gICB3aXRoaW4gYSBtdWx0aS1sZXZlbCBkaXJlY3RvcnksIGFsbCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUgaXMgaW1wbGljaXRseQorICAgICAgICAvLy8gICBjcmVhdGVkIGluIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeU5hbWVJbkFyY2hpdmUiPgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZSBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgPGM+WmlwRW50cnk8L2M+IGFkZGVkLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIFppcEVudHJ5IEFkZERpcmVjdG9yeUJ5TmFtZShzdHJpbmcgZGlyZWN0b3J5TmFtZUluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd29ya2l0ZW0gOTA3MworICAgICAgICAgICAgWmlwRW50cnkgZGlyID0gWmlwRW50cnkuQ3JlYXRlRnJvbU5vdGhpbmcoZGlyZWN0b3J5TmFtZUluQXJjaGl2ZSk7CisgICAgICAgICAgICBkaXIuX2NvbnRhaW5lciA9IG5ldyBaaXBDb250YWluZXIodGhpcyk7CisgICAgICAgICAgICBkaXIuTWFya0FzRGlyZWN0b3J5KCk7CisgICAgICAgICAgICBkaXIuQWx0ZXJuYXRlRW5jb2RpbmcgPSB0aGlzLkFsdGVybmF0ZUVuY29kaW5nOyAgLy8gd29ya2l0ZW0gODk4NAorICAgICAgICAgICAgZGlyLkFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPSB0aGlzLkFsdGVybmF0ZUVuY29kaW5nVXNhZ2U7CisgICAgICAgICAgICBkaXIuU2V0RW50cnlUaW1lcyhEYXRlVGltZS5Ob3csRGF0ZVRpbWUuTm93LERhdGVUaW1lLk5vdyk7CisgICAgICAgICAgICBkaXIuRW1pdFRpbWVzSW5XaW5kb3dzRm9ybWF0V2hlblNhdmluZyA9IF9lbWl0TnRmc1RpbWVzOworICAgICAgICAgICAgZGlyLkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmcgPSBfZW1pdFVuaXhUaW1lczsKKyAgICAgICAgICAgIGRpci5fU291cmNlID0gWmlwRW50cnlTb3VyY2UuU3RyZWFtOworICAgICAgICAgICAgLy9zdHJpbmcga2V5ID0gRGljdGlvbmFyeUtleUZvckVudHJ5KGRpcik7CisgICAgICAgICAgICBJbnRlcm5hbEFkZEVudHJ5KGRpci5GaWxlTmFtZSxkaXIpOworICAgICAgICAgICAgQWZ0ZXJBZGRFbnRyeShkaXIpOworICAgICAgICAgICAgcmV0dXJuIGRpcjsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIFppcEVudHJ5IEFkZE9yVXBkYXRlRGlyZWN0b3J5SW1wbChzdHJpbmcgZGlyZWN0b3J5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJvb3REaXJlY3RvcnlQYXRoSW5BcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRPclVwZGF0ZUFjdGlvbiBhY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb290RGlyZWN0b3J5UGF0aEluQXJjaGl2ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3REaXJlY3RvcnlQYXRoSW5BcmNoaXZlID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBBZGRPclVwZGF0ZURpcmVjdG9yeUltcGwoZGlyZWN0b3J5TmFtZSwgcm9vdERpcmVjdG9yeVBhdGhJbkFyY2hpdmUsIGFjdGlvbiwgdHJ1ZSwgMCk7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHZvaWQgSW50ZXJuYWxBZGRFbnRyeShTdHJpbmcgbmFtZSwgWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9lbnRyaWVzLkFkZChuYW1lLCBlbnRyeSk7CisgICAgICAgICAgICBfemlwRW50cmllc0FzTGlzdCA9IG51bGw7CisgICAgICAgICAgICBfY29udGVudHNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIFppcEVudHJ5IEFkZE9yVXBkYXRlRGlyZWN0b3J5SW1wbChzdHJpbmcgZGlyZWN0b3J5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJvb3REaXJlY3RvcnlQYXRoSW5BcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRPclVwZGF0ZUFjdGlvbiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVmVyYm9zZSkKKyAgICAgICAgICAgICAgICBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoInswfSB7MX0uLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uID09IEFkZE9yVXBkYXRlQWN0aW9uLkFkZE9ubHkpID8gImFkZGluZyIgOiAiQWRkaW5nIG9yIHVwZGF0aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZSk7CisKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hZGRPcGVyYXRpb25DYW5jZWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIE9uQWRkU3RhcnRlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMzM3MQorICAgICAgICAgICAgaWYgKF9hZGRPcGVyYXRpb25DYW5jZWxlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgc3RyaW5nIGRpckZvckVudHJpZXMgPSByb290RGlyZWN0b3J5UGF0aEluQXJjaGl2ZTsKKyAgICAgICAgICAgIFppcEVudHJ5IGJhc2VEaXIgPSBudWxsOworCisgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmID0gZGlyZWN0b3J5TmFtZS5MZW5ndGg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxldmVsOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgICAgICAgICBmID0gZGlyZWN0b3J5TmFtZS5MYXN0SW5kZXhPZkFueSgiL1xcIi5Ub0NoYXJBcnJheSgpLCBmIC0gMSwgZiAtIDEpOworCisgICAgICAgICAgICAgICAgZGlyRm9yRW50cmllcyA9IGRpcmVjdG9yeU5hbWUuU3Vic3RyaW5nKGYgKyAxKTsKKyAgICAgICAgICAgICAgICBkaXJGb3JFbnRyaWVzID0gUGF0aC5Db21iaW5lKHJvb3REaXJlY3RvcnlQYXRoSW5BcmNoaXZlLCBkaXJGb3JFbnRyaWVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgbm90IHRvcCBsZXZlbCwgb3IgaWYgdGhlIHJvb3QgaXMgbm9uLWVtcHR5LCB0aGVuIGV4cGxpY2l0bHkgYWRkIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIGlmIChsZXZlbCA+IDAgfHwgcm9vdERpcmVjdG9yeVBhdGhJbkFyY2hpdmUgIT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZURpciA9IFppcEVudHJ5LkNyZWF0ZUZyb21GaWxlKGRpcmVjdG9yeU5hbWUsIGRpckZvckVudHJpZXMpOworICAgICAgICAgICAgICAgIGJhc2VEaXIuX2NvbnRhaW5lciA9IG5ldyBaaXBDb250YWluZXIodGhpcyk7CisgICAgICAgICAgICAgICAgYmFzZURpci5BbHRlcm5hdGVFbmNvZGluZyA9IHRoaXMuQWx0ZXJuYXRlRW5jb2Rpbmc7ICAvLyB3b3JraXRlbSA2NDEwCisgICAgICAgICAgICAgICAgYmFzZURpci5BbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gdGhpcy5BbHRlcm5hdGVFbmNvZGluZ1VzYWdlOworICAgICAgICAgICAgICAgIGJhc2VEaXIuTWFya0FzRGlyZWN0b3J5KCk7CisgICAgICAgICAgICAgICAgYmFzZURpci5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nID0gX2VtaXROdGZzVGltZXM7CisgICAgICAgICAgICAgICAgYmFzZURpci5FbWl0VGltZXNJblVuaXhGb3JtYXRXaGVuU2F2aW5nID0gX2VtaXRVbml4VGltZXM7CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGRpcmVjdG9yeSBvbmx5IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IGFuIGVycm9yIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgICAgICAgICAgICAgIGlmICghX2VudHJpZXMuQ29udGFpbnNLZXkoYmFzZURpci5GaWxlTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEFkZEVudHJ5KGJhc2VEaXIuRmlsZU5hbWUsYmFzZURpcik7CisgICAgICAgICAgICAgICAgICAgIEFmdGVyQWRkRW50cnkoYmFzZURpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpckZvckVudHJpZXMgPSBiYXNlRGlyLkZpbGVOYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIV9hZGRPcGVyYXRpb25DYW5jZWxlZCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhkaXJlY3RvcnlOYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoU3RyaW5nIGZpbGVuYW1lIGluIGZpbGVuYW1lcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hZGRPcGVyYXRpb25DYW5jZWxlZCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IEFkZE9yVXBkYXRlQWN0aW9uLkFkZE9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRmlsZShmaWxlbmFtZSwgZGlyRm9yRW50cmllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRmlsZShmaWxlbmFtZSwgZGlyRm9yRW50cmllcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIV9hZGRPcGVyYXRpb25DYW5jZWxlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBzdWJkaXJlY3RvcmllczoKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRpcm5hbWVzID0gRGlyZWN0b3J5LkdldERpcmVjdG9yaWVzKGRpcmVjdG9yeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoU3RyaW5nIGRpciBpbiBkaXJuYW1lcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4NjE3OiBPcHRpb25hbGx5IHRyYXZlcnNlIHJlcGFyc2UgcG9pbnRzCisjaWYgU0lMVkVSTElHSFQKKyNlbGlmIE5FVENGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUF0dHJpYnV0ZXMgZmlsZUF0dHJzID0gKEZpbGVBdHRyaWJ1dGVzKSBOZXRDZkZpbGUuR2V0QXR0cmlidXRlcyhkaXIpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQXR0cmlidXRlcyBmaWxlQXR0cnMgPSBTeXN0ZW0uSU8uRmlsZS5HZXRBdHRyaWJ1dGVzKGRpcik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5BZGREaXJlY3RvcnlXaWxsVHJhdmVyc2VSZXBhcnNlUG9pbnRzCisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoZmlsZUF0dHJzICYgRmlsZUF0dHJpYnV0ZXMuUmVwYXJzZVBvaW50KSA9PSAwKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkT3JVcGRhdGVEaXJlY3RvcnlJbXBsKGRpciwgcm9vdERpcmVjdG9yeVBhdGhJbkFyY2hpdmUsIGFjdGlvbiwgcmVjdXJzZSwgbGV2ZWwgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIE9uQWRkQ29tcGxldGVkKCk7CisKKyAgICAgICAgICAgIHJldHVybiBiYXNlRGlyOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuQ2hlY2suY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLkNoZWNrLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NzA1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLkNoZWNrLmNzCkBAIC0wLDAgKzEsMzUyIEBACisvLyBaaXBGaWxlLkNoZWNrLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBEaW5vIENoaWVzYS4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtSnVseS0zMSAxNDo0MDo1MD4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGZvciBkb2luZyBDaGVja3Mgb24gemlwIGZpbGVzLgorLy8gVGhlc2UgYXJlIG5vdCBuZWNlc3NhcnkgdG8gaW5jbHVkZSBpbiB0aGUgUmVkdWNlZCBvciBDRgorLy8gdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFppcEZpbGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ2hlY2tzIGEgemlwIGZpbGUgdG8gc2VlIGlmIGl0cyBkaXJlY3RvcnkgaXMgY29uc2lzdGVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gY2FzZXMgb2YgZGF0YSBlcnJvciwgdGhlIGRpcmVjdG9yeSB3aXRoaW4gYSB6aXAgZmlsZSBjYW4gZ2V0IG91dAorICAgICAgICAvLy8gICBvZiBzeW5jaCB3aXRoIHRoZSBlbnRyaWVzIGluIHRoZSB6aXAgZmlsZS4gIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGUKKyAgICAgICAgLy8vICAgZ2l2ZW4gemlwIGZpbGUgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhcyBvY2N1cnJlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4gVGhpcyBtZXRob2QgbWF5IHRha2UgYSBsb25nIHRpbWUgdG8gcnVuIGZvciBsYXJnZSB6aXAgZmlsZXMuICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFJlZHVjZWQgb3IgQ29tcGFjdCBGcmFtZXdvcmsKKyAgICAgICAgLy8vICAgdmVyc2lvbnMgb2YgRG90TmV0WmlwLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBEZXZlbG9wZXJzIHVzaW5nIENPTSBjYW4gdXNlIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkNvbUhlbHBlci5DaGVja1ppcChTdHJpbmcpIj5Db21IZWxwZXIuQ2hlY2taaXAoU3RyaW5nKTwvc2VlPgorICAgICAgICAvLy8gICBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ6aXBGaWxlTmFtZSI+VGhlIGZpbGVuYW1lIHRvIG9mIHRoZSB6aXAgZmlsZSB0byBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIG5hbWVkIHppcCBmaWxlIGNoZWNrcyBPSy4gT3RoZXJ3aXNlLCBmYWxzZS4gPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkZpeFppcERpcmVjdG9yeShzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJDaGVja1ppcChzdHJpbmcsYm9vbCxTeXN0ZW0uSU8uVGV4dFdyaXRlcikiLz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIENoZWNrWmlwKHN0cmluZyB6aXBGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENoZWNrWmlwKHppcEZpbGVOYW1lLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ2hlY2tzIGEgemlwIGZpbGUgdG8gc2VlIGlmIGl0cyBkaXJlY3RvcnkgaXMgY29uc2lzdGVudCwKKyAgICAgICAgLy8vICAgYW5kIG9wdGlvbmFsbHkgZml4ZXMgdGhlIGRpcmVjdG9yeSBpZiBuZWNlc3NhcnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluIGNhc2VzIG9mIGRhdGEgZXJyb3IsIHRoZSBkaXJlY3Rvcnkgd2l0aGluIGEgemlwIGZpbGUgY2FuIGdldCBvdXQgb2YKKyAgICAgICAgLy8vICAgc3luY2ggd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgemlwIGZpbGUuICBUaGlzIG1ldGhvZCBjaGVja3MgdGhlIGdpdmVuCisgICAgICAgIC8vLyAgIHppcCBmaWxlLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoaXMgaGFzIG9jY3VycmVkLiBJdCBhbHNvIG9wdGlvbmFsbHkKKyAgICAgICAgLy8vICAgZml4ZXMgdGhlIHppcGZpbGUsIHNhdmluZyB0aGUgZml4ZWQgY29weSBpbiA8ZW0+TmFtZTwvZW0+X0ZpeGVkLnppcC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgbWF5IHRha2UgYSBsb25nIHRpbWUgdG8gcnVuIGZvciBsYXJnZSB6aXAgZmlsZXMuICBJdAorICAgICAgICAvLy8gICB3aWxsIHRha2UgZXZlbiBsb25nZXIgaWYgdGhlIGZpbGUgYWN0dWFsbHkgbmVlZHMgdG8gYmUgZml4ZWQsIGFuZCBpZgorICAgICAgICAvLy8gICA8Yz5maXhJZk5lY2Vzc2FyeTwvYz4gaXMgdHJ1ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgUmVkdWNlZCBvciBDb21wYWN0CisgICAgICAgIC8vLyAgIEZyYW1ld29yayB2ZXJzaW9ucyBvZiBEb3ROZXRaaXAuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ6aXBGaWxlTmFtZSI+VGhlIGZpbGVuYW1lIHRvIG9mIHRoZSB6aXAgZmlsZSB0byBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaXhJZk5lY2Vzc2FyeSI+SWYgdHJ1ZSwgdGhlIG1ldGhvZCB3aWxsIGZpeCB0aGUgemlwIGZpbGUgaWYKKyAgICAgICAgLy8vICAgICBuZWNlc3NhcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3JpdGVyIj4KKyAgICAgICAgLy8vIGEgVGV4dFdyaXRlciBpbiB3aGljaCBtZXNzYWdlcyBnZW5lcmF0ZWQgd2hpbGUgY2hlY2tpbmcgd2lsbCBiZSB3cml0dGVuLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBuYW1lZCB6aXAgaXMgT0s7IGZhbHNlIGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGZpeGVkLjwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJDaGVja1ppcChzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJGaXhaaXBEaXJlY3Rvcnkoc3RyaW5nKSIvPgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgQ2hlY2taaXAoc3RyaW5nIHppcEZpbGVOYW1lLCBib29sIGZpeElmTmVjZXNzYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFdyaXRlciB3cml0ZXIpCisKKyAgICAgICAgeworICAgICAgICAgICAgWmlwRmlsZSB6aXAxID0gbnVsbCwgemlwMiA9IG51bGw7CisgICAgICAgICAgICBib29sIGlzT2sgPSB0cnVlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemlwMSA9IG5ldyBaaXBGaWxlKCk7CisgICAgICAgICAgICAgICAgemlwMS5GdWxsU2NhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgemlwMS5Jbml0aWFsaXplKHppcEZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgIHppcDIgPSBaaXBGaWxlLlJlYWQoemlwRmlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGUxIGluIHppcDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZTIgaW4gemlwMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUxLkZpbGVOYW1lID09IGUyLkZpbGVOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlMS5fUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyICE9IGUyLl9SZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9OiBtaXNtYXRjaCBpbiBSZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgICgweHsxOlgxNn0gIT0gMHh7MjpYMTZ9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxLkZpbGVOYW1lLCBlMS5fUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMi5fUmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUxLl9Db21wcmVzc2VkU2l6ZSAhPSBlMi5fQ29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgiezB9OiBtaXNtYXRjaCBpbiBDb21wcmVzc2VkU2l6ZSAgKDB4ezE6WDE2fSAhPSAweHsyOlgxNn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEuRmlsZU5hbWUsIGUxLl9Db21wcmVzc2VkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIuX0NvbXByZXNzZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUxLl9VbmNvbXByZXNzZWRTaXplICE9IGUyLl9VbmNvbXByZXNzZWRTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfTogbWlzbWF0Y2ggaW4gVW5jb21wcmVzc2VkU2l6ZSAgKDB4ezE6WDE2fSAhPSAweHsyOlgxNn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEuRmlsZU5hbWUsIGUxLl9VbmNvbXByZXNzZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMi5fVW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlMS5Db21wcmVzc2lvbk1ldGhvZCAhPSBlMi5Db21wcmVzc2lvbk1ldGhvZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCJ7MH06IG1pc21hdGNoIGluIENvbXByZXNzaW9uTWV0aG9kICAoMHh7MTpYNH0gIT0gMHh7MjpYNH0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEuRmlsZU5hbWUsIGUxLkNvbXByZXNzaW9uTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMi5Db21wcmVzc2lvbk1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlMS5DcmMgIT0gZTIuQ3JjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoInswfTogbWlzbWF0Y2ggaW4gQ3JjMzIgICgweHsxOlg0fSAhPSAweHsyOlg0fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMS5GaWxlTmFtZSwgZTEuQ3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMi5DcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGEgbWF0Y2gsIHNvIHN0b3AgdGhlIGluc2lkZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB6aXAyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB6aXAyID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmICghaXNPayAmJiBmaXhJZk5lY2Vzc2FyeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuZXdGaWxlTmFtZSA9IFBhdGguR2V0RmlsZU5hbWVXaXRob3V0RXh0ZW5zaW9uKHppcEZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3RmlsZU5hbWUgPSBTeXN0ZW0uU3RyaW5nLkZvcm1hdCgiezB9X2ZpeGVkLnppcCIsIG5ld0ZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgemlwMS5TYXZlKG5ld0ZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHppcDEgIT0gbnVsbCkgemlwMS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgaWYgKHppcDIgIT0gbnVsbCkgemlwMi5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXNPazsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJld3JpdGUgdGhlIGRpcmVjdG9yeSB3aXRoaW4gYSB6aXBmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbiBjYXNlcyBvZiBkYXRhIGVycm9yLCB0aGUgZGlyZWN0b3J5IGluIGEgemlwIGZpbGUgY2FuIGdldCBvdXQgb2YKKyAgICAgICAgLy8vICAgc3luY2ggd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgemlwIGZpbGUuICBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBmaXgKKyAgICAgICAgLy8vICAgdGhlIHppcCBmaWxlIGlmIHRoaXMgaGFzIG9jY3VycmVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPiBUaGlzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGZvciBsYXJnZSB6aXAgZmlsZXMuIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4gVGhpcyB3b24ndCB3b3JrIGlmIHRoZSB6aXAgZmlsZSB1c2VzIGEgbm9uLXN0YW5kYXJkCisgICAgICAgIC8vLyBjb2RlIHBhZ2UgLSBuZWl0aGVyIElCTTQzNyBub3IgVVRGLTguIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgUmVkdWNlZCBvciBDb21wYWN0IEZyYW1ld29yaworICAgICAgICAvLy8gICB2ZXJzaW9ucyBvZiBEb3ROZXRaaXAuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIERldmVsb3BlcnMgdXNpbmcgQ09NIGNhbiB1c2UgdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iQ29tSGVscGVyLkZpeFppcERpcmVjdG9yeShTdHJpbmcpIj5Db21IZWxwZXIuRml4WmlwRGlyZWN0b3J5KFN0cmluZyk8L3NlZT4KKyAgICAgICAgLy8vICAgbWV0aG9kLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iemlwRmlsZU5hbWUiPlRoZSBmaWxlbmFtZSB0byBvZiB0aGUgemlwIGZpbGUgdG8gZml4LjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQ2hlY2taaXAoc3RyaW5nKSIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iQ2hlY2taaXAoc3RyaW5nLGJvb2wsU3lzdGVtLklPLlRleHRXcml0ZXIpIi8+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBGaXhaaXBEaXJlY3Rvcnkoc3RyaW5nIHppcEZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemlwLkZ1bGxTY2FuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB6aXAuSW5pdGlhbGl6ZSh6aXBGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgemlwLlNhdmUoemlwRmlsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVmVyaWZ5IHRoZSBwYXNzd29yZCBvbiBhIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBLZWVwIGluIG1pbmQgdGhhdCBwYXNzd29yZHMgaW4gemlwZmlsZXMgYXJlIGFwcGxpZWQgdG8KKyAgICAgICAgLy8vICAgICB6aXAgZW50cmllcywgbm90IHRvIHRoZSBlbnRpcmUgemlwIGZpbGUuIFNvIHRlc3RpbmcgYQorICAgICAgICAvLy8gICAgIHppcGZpbGUgZm9yIGEgcGFydGljdWxhciBwYXNzd29yZCBkb2Vzbid0IHdvcmsgaW4gdGhlCisgICAgICAgIC8vLyAgICAgZ2VuZXJhbCBjYXNlLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQncyBvZnRlbiB0aGUgY2FzZQorICAgICAgICAvLy8gICAgIHRoYXQgYSBzaW5nbGUgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIG9uIGFsbCBlbnRyaWVzIGluIGEKKyAgICAgICAgLy8vICAgICB6aXAgZmlsZS4gVGhpcyBtZXRob2Qgd29ya3MgZm9yIHRoYXQgY2FzZS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgYSBwYXNzd29yZCB3aXRob3V0IGRvaW5nIHRoZQorICAgICAgICAvLy8gICAgIGRlY3J5cHRpb24uIFNvIHRoaXMgY29kZSBkZWNyeXB0cyBhbmQgZXh0cmFjdHMgdGhlIGdpdmVuCisgICAgICAgIC8vLyAgICAgemlwZmlsZSBpbnRvIDxzZWUgY3JlZj0iU3lzdGVtLklPLlN0cmVhbS5OdWxsIi8+CisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iemlwRmlsZU5hbWUiPlRoZSBmaWxlbmFtZSB0byBvZiB0aGUgemlwIGZpbGUgdG8gZml4LjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5UaGUgcGFzc3dvcmQgdG8gY2hlY2suPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5hIGJvb2wgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXNzd29yZCBtYXRjaGVzLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIENoZWNrWmlwUGFzc3dvcmQoc3RyaW5nIHppcEZpbGVOYW1lLCBzdHJpbmcgcGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEzNjY0CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChaaXBGaWxlIHppcDEgPSBaaXBGaWxlLlJlYWQoemlwRmlsZU5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGUgaW4gemlwMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLklzRGlyZWN0b3J5ICYmIGUuVXNlc0VuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5FeHRyYWN0V2l0aFBhc3N3b3JkKFN5c3RlbS5JTy5TdHJlYW0uTnVsbCwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goSW9uaWMuWmlwLkJhZFBhc3N3b3JkRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoZSBpbmZvcm1hdGlvbiBzdHJpbmcgY29udGFpbnMgMTAgbGluZXMgb3Igc28sIGFib3V0IGVhY2ggWmlwRW50cnksCisgICAgICAgIC8vLyAgICAgZGVzY3JpYmluZyB3aGV0aGVyIGVuY3J5cHRpb24gaXMgaW4gdXNlLCB0aGUgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkCisgICAgICAgIC8vLyAgICAgbGVuZ3RoIG9mIHRoZSBlbnRyeSwgdGhlIG9mZnNldCBvZiB0aGUgZW50cnksIGFuZCBzbyBvbi4gQXMgYSByZXN1bHQgdGhlCisgICAgICAgIC8vLyAgICAgaW5mb3JtYXRpb24gc3RyaW5nIGNhbiBiZSB2ZXJ5IGxvbmcgZm9yIHppcCBmaWxlcyB0aGF0IGNvbnRhaW4gbWFueQorICAgICAgICAvLy8gICAgIGVudHJpZXMuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBtb3N0bHkgdXNlZnVsIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSW5mbworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgICAgIFppcEZpbGU6IHswfVxuIiwgdGhpcy5OYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9Db21tZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICAgICBDb21tZW50OiB7MH1cbiIsIHRoaXMuX0NvbW1lbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZlcnNpb25NYWRlQnkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgdmVyc2lvbiBtYWRlIGJ5OiAweHswOlg0fVxuIiwgdGhpcy5fdmVyc2lvbk1hZGVCeSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmVyc2lvbk5lZWRlZFRvRXh0cmFjdCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc3RyaW5nLkZvcm1hdCgibmVlZGVkIHRvIGV4dHJhY3Q6IDB4ezA6WDR9XG4iLCB0aGlzLl92ZXJzaW9uTmVlZGVkVG9FeHRyYWN0KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgIHVzZXMgWklQNjQ6IHswfVxuIiwgdGhpcy5JbnB1dFVzZXNaaXA2NCkpOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICBkaXNrIHdpdGggQ0Q6IHswfVxuIiwgdGhpcy5fZGlza051bWJlcldpdGhDZCkpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9PZmZzZXRPZkNlbnRyYWxEaXJlY3RvcnkgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiICAgICAgQ0Q2NCBvZmZzZXQ6IDB4ezA6WDE2fVxuIiwgdGhpcy5fT2Zmc2V0T2ZDZW50cmFsRGlyZWN0b3J5NjQpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKHN0cmluZy5Gb3JtYXQoIiAgICAgICAgQ0Qgb2Zmc2V0OiAweHswOlg4fVxuIiwgdGhpcy5fT2Zmc2V0T2ZDZW50cmFsRGlyZWN0b3J5KSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZW50cnkgaW4gdGhpcy5fZW50cmllcy5WYWx1ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZChlbnRyeS5JbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLkV2ZW50cy5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuRXZlbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2UwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLkV2ZW50cy5jcwpAQCAtMCwwICsxLDEyMTkgQEAKKy8vIFppcEZpbGUuRXZlbnRzLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDksIDIwMTEgRGlubyBDaGllc2EgLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTA5IDA4OjQyOjM1PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgZm9yIGlzc3VpbmcgZXZlbnRzIGZyb20gdGhlIFppcEZpbGUgY2xhc3MuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFppcEZpbGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIEFyY2hpdmVOYW1lRm9yRXZlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChfbmFtZSAhPSBudWxsKSA/IF9uYW1lIDogIihzdHJlYW0pIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gU2F2ZQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQW4gZXZlbnQgaGFuZGxlciBpbnZva2VkIHdoZW4gYSBTYXZlKCkgc3RhcnRzLCBiZWZvcmUgYW5kIGFmdGVyIGVhY2gKKyAgICAgICAgLy8vICAgZW50cnkgaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgYXJjaGl2ZSwgd2hlbiBhIFNhdmUoKSBjb21wbGV0ZXMsIGFuZAorICAgICAgICAvLy8gICBkdXJpbmcgb3RoZXIgU2F2ZSBldmVudHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRGVwZW5kaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIGV2ZW50LCBkaWZmZXJlbnQgcHJvcGVydGllcyBvbiB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MiLz4gcGFyYW1ldGVyIGFyZSBzZXQuICBUaGUgZm9sbG93aW5nCisgICAgICAgIC8vLyAgIHRhYmxlIHN1bW1hcml6ZXMgdGhlIGF2YWlsYWJsZSBFdmVudFR5cGVzIGFuZCB0aGUgY29uZGl0aW9ucyB1bmRlcgorICAgICAgICAvLy8gICB3aGljaCB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgaW52b2tlZCB3aXRoIGEKKyAgICAgICAgLy8vICAgPGM+U2F2ZVByb2dyZXNzRXZlbnRBcmdzPC9jPiB3aXRoIHRoZSBnaXZlbiBFdmVudFR5cGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgorICAgICAgICAvLy8gPGxpc3RoZWFkZXI+CisgICAgICAgIC8vLyA8dGVybT52YWx1ZSBvZiBFbnRyeVR5cGU8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+TWVhbmluZyBhbmQgY29uZGl0aW9uczwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2xpc3RoZWFkZXI+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfU3RhcnRlZDwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5GaXJlZCB3aGVuIFppcEZpbGUuU2F2ZSgpIGJlZ2lucy4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQmVmb3JlU2F2ZUVudHJ5PC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBGaXJlZCB3aXRoaW4gWmlwRmlsZS5TYXZlKCksIGp1c3QgYmVmb3JlIHdyaXRpbmcgZGF0YSBmb3IgZWFjaAorICAgICAgICAvLy8gICBwYXJ0aWN1bGFyIGVudHJ5LgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPlppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlclNhdmVFbnRyeTwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgRmlyZWQgd2l0aGluIFppcEZpbGUuU2F2ZSgpLCBqdXN0IGFmdGVyIGhhdmluZyBmaW5pc2hlZCB3cml0aW5nIGRhdGEKKyAgICAgICAgLy8vICAgZm9yIGVhY2ggcGFydGljdWxhciBlbnRyeS4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQ29tcGxldGVkPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPkZpcmVkIHdoZW4gWmlwRmlsZS5TYXZlKCkgaGFzIGNvbXBsZXRlZC4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQWZ0ZXJTYXZlVGVtcEFyY2hpdmU8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIEZpcmVkIGFmdGVyIHRoZSB0ZW1wb3JhcnkgZmlsZSBoYXMgYmVlbiBjcmVhdGVkLiAgVGhpcyBoYXBwZW5zIG9ubHkKKyAgICAgICAgLy8vICAgd2hlbiBzYXZpbmcgdG8gYSBkaXNrIGZpbGUuICBUaGlzIGV2ZW50IHdpbGwgbm90IGJlIGludm9rZWQgd2hlbgorICAgICAgICAvLy8gICBzYXZpbmcgdG8gYSBzdHJlYW0uCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+WmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0JlZm9yZVJlbmFtZVRlbXBBcmNoaXZlPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBGaXJlZCBqdXN0IGJlZm9yZSByZW5hbWluZyB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8gdGhlIHBlcm1hbmVudAorICAgICAgICAvLy8gICBsb2NhdGlvbi4gIFRoaXMgaGFwcGVucyBvbmx5IHdoZW4gc2F2aW5nIHRvIGEgZGlzayBmaWxlLiAgVGhpcyBldmVudAorICAgICAgICAvLy8gICB3aWxsIG5vdCBiZSBpbnZva2VkIHdoZW4gc2F2aW5nIHRvIGEgc3RyZWFtLgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPlppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlclJlbmFtZVRlbXBBcmNoaXZlPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBGaXJlZCBqdXN0IGFmdGVyIHJlbmFtaW5nIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byB0aGUgcGVybWFuZW50CisgICAgICAgIC8vLyAgIGxvY2F0aW9uLiAgVGhpcyBoYXBwZW5zIG9ubHkgd2hlbiBzYXZpbmcgdG8gYSBkaXNrIGZpbGUuICBUaGlzIGV2ZW50CisgICAgICAgIC8vLyAgIHdpbGwgbm90IGJlIGludm9rZWQgd2hlbiBzYXZpbmcgdG8gYSBzdHJlYW0uCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+WmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0FmdGVyQ29tcGlsZVNlbGZFeHRyYWN0b3I8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIEZpcmVkIGFmdGVyIGEgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUgaGFzIGZpbmlzaGVkIGNvbXBpbGluZy4gIFRoaXMKKyAgICAgICAgLy8vICAgRXZlbnRUeXBlIGlzIHVzZWQgb25seSB3aXRoaW4gU2F2ZVNlbGZFeHRyYWN0b3IoKS4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQnl0ZXNSZWFkPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBTZXQgZHVyaW5nIHRoZSBzYXZlIG9mIGEgcGFydGljdWxhciBlbnRyeSwgdG8gdXBkYXRlIHByb2dyZXNzIG9mIHRoZQorICAgICAgICAvLy8gICBTYXZlKCkuICBXaGVuIHRoaXMgRXZlbnRUeXBlIGlzIHNldCwgdGhlIEJ5dGVzVHJhbnNmZXJyZWQgaXMgdGhlCisgICAgICAgIC8vLyAgIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0uICBUaGUKKyAgICAgICAgLy8vICAgVG90YWxCeXRlc1RvVHJhbnNmZXIgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdW5jb21wcmVzc2VkCisgICAgICAgIC8vLyAgIGZpbGUuCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICBUaGlzIGV4YW1wbGUgdXNlcyBhbiBhbm9ueW1vdXMgbWV0aG9kIHRvIGhhbmRsZSB0aGUKKyAgICAgICAgLy8vICAgIFNhdmVQcm9ncmVzcyBldmVudCwgYnkgdXBkYXRpbmcgYSBwcm9ncmVzcyBiYXIuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gcHJvZ3Jlc3NCYXIxLlZhbHVlID0gMDsKKyAgICAgICAgLy8vIHByb2dyZXNzQmFyMS5NYXggPSBsaXN0Ym94MS5JdGVtcy5Db3VudDsKKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAvLyBsaXN0Ym94MSBjb250YWlucyBhIGxpc3Qgb2YgZmlsZW5hbWVzCisgICAgICAgIC8vLyAgICB6aXAuQWRkRmlsZXMobGlzdGJveDEuSXRlbXMpOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgIC8vIGRvIHRoZSBwcm9ncmVzcyBiYXI6CisgICAgICAgIC8vLyAgICB6aXAuU2F2ZVByb2dyZXNzICs9IChzZW5kZXIsIGUpID0+IHsKKyAgICAgICAgLy8vICAgICAgIGlmIChlLkV2ZW50VHlwZSA9PSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQmVmb3JlV3JpdGVFbnRyeSkgeworICAgICAgICAvLy8gICAgICAgICAgcHJvZ3Jlc3NCYXIxLlBlcmZvcm1TdGVwKCk7CisgICAgICAgIC8vLyAgICAgICB9CisgICAgICAgIC8vLyAgICB9OworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgIHppcC5TYXZlKGZzKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHVzZXMgYSBuYW1lZCBtZXRob2QgYXMgdGhlCisgICAgICAgIC8vLyAgIDxjPlNhdmVQcm9ncmVzczwvYz4gZXZlbnQgaGFuZGxlciwgdG8gdXBkYXRlIHRoZSB1c2VyLCBpbiBhCisgICAgICAgIC8vLyAgIGNvbnNvbGUtYmFzZWQgYXBwbGljYXRpb24uCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gc3RhdGljIGJvb2wganVzdEhhZEJ5dGVVcGRhdGU9IGZhbHNlOworICAgICAgICAvLy8gcHVibGljIHN0YXRpYyB2b2lkIFNhdmVQcm9ncmVzcyhvYmplY3Qgc2VuZGVyLCBTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MgZSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICBpZiAoZS5FdmVudFR5cGUgPT0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX1N0YXJ0ZWQpCisgICAgICAgIC8vLyAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTYXZpbmc6IHswfSIsIGUuQXJjaGl2ZU5hbWUpOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBlbHNlIGlmIChlLkV2ZW50VHlwZSA9PSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQ29tcGxldGVkKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAganVzdEhhZEJ5dGVVcGRhdGU9IGZhbHNlOworICAgICAgICAvLy8gICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAvLy8gICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRG9uZTogezB9IiwgZS5BcmNoaXZlTmFtZSk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBlbHNlIGlmIChlLkV2ZW50VHlwZSA9PSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQmVmb3JlV3JpdGVFbnRyeSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGlmIChqdXN0SGFkQnl0ZVVwZGF0ZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIC8vLyAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFdyaXRpbmc6IHswfSAoezF9L3syfSkiLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBlLkN1cnJlbnRFbnRyeS5GaWxlTmFtZSwgZS5FbnRyaWVzU2F2ZWQsIGUuRW50cmllc1RvdGFsKTsKKyAgICAgICAgLy8vICAgICAgICAganVzdEhhZEJ5dGVVcGRhdGU9IGZhbHNlOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgZWxzZSBpZiAoZS5FdmVudFR5cGUgPT0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0VudHJ5Qnl0ZXNSZWFkKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgaWYgKGp1c3RIYWRCeXRlVXBkYXRlKQorICAgICAgICAvLy8gICAgICAgICAgICAgQ29uc29sZS5TZXRDdXJzb3JQb3NpdGlvbigwLCBDb25zb2xlLkN1cnNvclRvcCk7CisgICAgICAgIC8vLyAgICAgICAgICBDb25zb2xlLldyaXRlKCIgICAgIHswfS97MX0gKHsyOk4wfSUpIiwgZS5CeXRlc1RyYW5zZmVycmVkLCBlLlRvdGFsQnl0ZXNUb1RyYW5zZmVyLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgIGUuQnl0ZXNUcmFuc2ZlcnJlZCAvICgwLjAxICogZS5Ub3RhbEJ5dGVzVG9UcmFuc2ZlciApKTsKKyAgICAgICAgLy8vICAgICAgICAganVzdEhhZEJ5dGVVcGRhdGU9IHRydWU7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIHB1YmxpYyBzdGF0aWMgWmlwVXAoc3RyaW5nIHRhcmdldFppcCwgc3RyaW5nIGRpcmVjdG9yeSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdXNpbmcgKHZhciB6aXAgPSBuZXcgWmlwRmlsZSgpKSB7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmVQcm9ncmVzcyArPSBTYXZlUHJvZ3Jlc3M7CisgICAgICAgIC8vLyAgICAgemlwLkFkZERpcmVjdG9yeShkaXJlY3RvcnkpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKHRhcmdldFppcCk7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gUHVibGljIFN1YiBaaXBVcChCeVZhbCB0YXJnZXRaaXAgQXMgU3RyaW5nLCBCeVZhbCBkaXJlY3RvcnkgQXMgU3RyaW5nKQorICAgICAgICAvLy8gICAgIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICAgICAgQWRkSGFuZGxlciB6aXAuU2F2ZVByb2dyZXNzLCBBZGRyZXNzT2YgTXlTYXZlUHJvZ3Jlc3MKKyAgICAgICAgLy8vICAgICAgICAgemlwLkFkZERpcmVjdG9yeShkaXJlY3RvcnkpCisgICAgICAgIC8vLyAgICAgICAgIHppcC5TYXZlKHRhcmdldFppcCkKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBQcml2YXRlIFNoYXJlZCBqdXN0SGFkQnl0ZVVwZGF0ZSBBcyBCb29sZWFuID0gRmFsc2UKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBQdWJsaWMgU2hhcmVkIFN1YiBNeVNhdmVQcm9ncmVzcyhCeVZhbCBzZW5kZXIgQXMgT2JqZWN0LCBCeVZhbCBlIEFzIFNhdmVQcm9ncmVzc0V2ZW50QXJncykKKyAgICAgICAgLy8vICAgICBJZiAoZS5FdmVudFR5cGUgSXMgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX1N0YXJ0ZWQpIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhdmluZzogezB9IiwgZS5BcmNoaXZlTmFtZSkKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgRWxzZUlmIChlLkV2ZW50VHlwZSBJcyBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQ29tcGxldGVkKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgIGp1c3RIYWRCeXRlVXBkYXRlID0gRmFsc2UKKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUKKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkRvbmU6IHswfSIsIGUuQXJjaGl2ZU5hbWUpCisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIEVsc2VJZiAoZS5FdmVudFR5cGUgSXMgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0JlZm9yZVdyaXRlRW50cnkpIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgSWYganVzdEhhZEJ5dGVVcGRhdGUgVGhlbgorICAgICAgICAvLy8gICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUKKyAgICAgICAgLy8vICAgICAgICAgRW5kIElmCisgICAgICAgIC8vLyAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFdyaXRpbmc6IHswfSAoezF9L3syfSkiLCBlLkN1cnJlbnRFbnRyeS5GaWxlTmFtZSwgZS5FbnRyaWVzU2F2ZWQsIGUuRW50cmllc1RvdGFsKQorICAgICAgICAvLy8gICAgICAgICBqdXN0SGFkQnl0ZVVwZGF0ZSA9IEZhbHNlCisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIEVsc2VJZiAoZS5FdmVudFR5cGUgSXMgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0VudHJ5Qnl0ZXNSZWFkKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgIElmIGp1c3RIYWRCeXRlVXBkYXRlIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgIENvbnNvbGUuU2V0Q3Vyc29yUG9zaXRpb24oMCwgQ29uc29sZS5DdXJzb3JUb3ApCisgICAgICAgIC8vLyAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgICBDb25zb2xlLldyaXRlKCIgICAgIHswfS97MX0gKHsyOk4wfSUpIiwgZS5CeXRlc1RyYW5zZmVycmVkLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgZS5Ub3RhbEJ5dGVzVG9UcmFuc2ZlciwgXworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgIChDRGJsKGUuQnl0ZXNUcmFuc2ZlcnJlZCkgLyAoMC4wMSAqIGUuVG90YWxCeXRlc1RvVHJhbnNmZXIpKSkKKyAgICAgICAgLy8vICAgICAgICAganVzdEhhZEJ5dGVVcGRhdGUgPSBUcnVlCisgICAgICAgIC8vLyAgICAgRW5kIElmCisgICAgICAgIC8vLyBFbmQgU3ViCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gVGhpcyBpcyBhIG1vcmUgY29tcGxldGUgZXhhbXBsZSBvZiB1c2luZyB0aGUgU2F2ZVByb2dyZXNzCisgICAgICAgIC8vLyBldmVudHMgaW4gYSBXaW5kb3dzIEZvcm1zIGFwcGxpY2F0aW9uLCB3aXRoIGEKKyAgICAgICAgLy8vIFRocmVhZCBvYmplY3QuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gZGVsZWdhdGUgdm9pZCBTYXZlRW50cnlQcm9ncmVzcyhTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MgZSk7CisgICAgICAgIC8vLyBkZWxlZ2F0ZSB2b2lkIEJ1dHRvbkNsaWNrKG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBpbnRlcm5hbCBjbGFzcyBXb3JrZXJPcHRpb25zCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgcHVibGljIHN0cmluZyBaaXBOYW1lOworICAgICAgICAvLy8gICAgIHB1YmxpYyBzdHJpbmcgRm9sZGVyOworICAgICAgICAvLy8gICAgIHB1YmxpYyBzdHJpbmcgRW5jb2Rpbmc7CisgICAgICAgIC8vLyAgICAgcHVibGljIHN0cmluZyBDb21tZW50OworICAgICAgICAvLy8gICAgIHB1YmxpYyBpbnQgWmlwRmxhdm9yOworICAgICAgICAvLy8gICAgIHB1YmxpYyBaaXA2NE9wdGlvbiBaaXA2NDsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBwcml2YXRlIGludCBfcHJvZ3Jlc3MyTWF4RmFjdG9yOworICAgICAgICAvLy8gcHJpdmF0ZSBib29sIF9zYXZlQ2FuY2VsZWQ7CisgICAgICAgIC8vLyBwcml2YXRlIGxvbmcgX3RvdGFsQnl0ZXNCZWZvcmVDb21wcmVzczsKKyAgICAgICAgLy8vIHByaXZhdGUgbG9uZyBfdG90YWxCeXRlc0FmdGVyQ29tcHJlc3M7CisgICAgICAgIC8vLyBwcml2YXRlIFRocmVhZCBfd29ya2VyVGhyZWFkOworICAgICAgICAvLy8KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBwcml2YXRlIHZvaWQgYnRuWmlwdXBfQ2xpY2sob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgS2lja29mZlppcHVwKCk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIGJ0bkNhbmNlbF9DbGljayhvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICBpZiAodGhpcy5sYmxTdGF0dXMuSW52b2tlUmVxdWlyZWQpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB0aGlzLmxibFN0YXR1cy5JbnZva2UobmV3IEJ1dHRvbkNsaWNrKHRoaXMuYnRuQ2FuY2VsX0NsaWNrKSwgbmV3IG9iamVjdFtdIHsgc2VuZGVyLCBlIH0pOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgICBlbHNlCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICBfc2F2ZUNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgLy8vICAgICAgICAgbGJsU3RhdHVzLlRleHQgPSAiQ2FuY2VsZWQuLi4iOworICAgICAgICAvLy8gICAgICAgICBSZXNldFN0YXRlKCk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBLaWNrb2ZmWmlwdXAoKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIF9mb2xkZXJOYW1lID0gdGJEaXJOYW1lLlRleHQ7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIGlmIChfZm9sZGVyTmFtZSA9PSBudWxsIHx8IF9mb2xkZXJOYW1lID09ICIiKSByZXR1cm47CisgICAgICAgIC8vLyAgICAgaWYgKHRoaXMudGJaaXBOYW1lLlRleHQgPT0gbnVsbCB8fCB0aGlzLnRiWmlwTmFtZS5UZXh0ID09ICIiKSByZXR1cm47CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIC8vIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgdGhlIHppcCBmaWxlOgorICAgICAgICAvLy8gICAgIGlmIChTeXN0ZW0uSU8uRmlsZS5FeGlzdHModGhpcy50YlppcE5hbWUuVGV4dCkpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB2YXIgZGxnUmVzdWx0ID0gTWVzc2FnZUJveC5TaG93KFN0cmluZy5Gb3JtYXQoIlRoZSBmaWxlIHlvdSBoYXZlIHNwZWNpZmllZCAoezB9KSBhbHJlYWR5IGV4aXN0cy4iICsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGlzIGZpbGU/IiwgdGhpcy50YlppcE5hbWUuVGV4dCksCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZpcm1hdGlvbiBpcyBSZXF1aXJlZCIsIE1lc3NhZ2VCb3hCdXR0b25zLlllc05vLCBNZXNzYWdlQm94SWNvbi5RdWVzdGlvbik7CisgICAgICAgIC8vLyAgICAgICAgIGlmIChkbGdSZXN1bHQgIT0gRGlhbG9nUmVzdWx0LlllcykgcmV0dXJuOworICAgICAgICAvLy8gICAgICAgICBTeXN0ZW0uSU8uRmlsZS5EZWxldGUodGhpcy50YlppcE5hbWUuVGV4dCk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgX3NhdmVDYW5jZWxlZCA9IGZhbHNlOworICAgICAgICAvLy8gICAgIF9uRmlsZXNDb21wbGV0ZWQgPSAwOworICAgICAgICAvLy8gICAgIF90b3RhbEJ5dGVzQWZ0ZXJDb21wcmVzcyA9IDA7CisgICAgICAgIC8vLyAgICAgX3RvdGFsQnl0ZXNCZWZvcmVDb21wcmVzcyA9IDA7CisgICAgICAgIC8vLyAgICAgdGhpcy5idG5Pay5FbmFibGVkID0gZmFsc2U7CisgICAgICAgIC8vLyAgICAgdGhpcy5idG5Pay5UZXh0ID0gIlppcHBpbmcuLi4iOworICAgICAgICAvLy8gICAgIHRoaXMuYnRuQ2FuY2VsLkVuYWJsZWQgPSB0cnVlOworICAgICAgICAvLy8gICAgIGxibFN0YXR1cy5UZXh0ID0gIlppcHBpbmcuLi4iOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICB2YXIgb3B0aW9ucyA9IG5ldyBXb3JrZXJPcHRpb25zCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICBaaXBOYW1lID0gdGhpcy50YlppcE5hbWUuVGV4dCwKKyAgICAgICAgLy8vICAgICAgICAgRm9sZGVyID0gX2ZvbGRlck5hbWUsCisgICAgICAgIC8vLyAgICAgICAgIEVuY29kaW5nID0gImlibTQzNyIKKyAgICAgICAgLy8vICAgICB9OworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBpZiAodGhpcy5jb21ib0JveDEuU2VsZWN0ZWRJbmRleCAhPSAwKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgb3B0aW9ucy5FbmNvZGluZyA9IHRoaXMuY29tYm9Cb3gxLlNlbGVjdGVkSXRlbS5Ub1N0cmluZygpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgaWYgKHRoaXMucmFkaW9GbGF2b3JTZnhDbWQuQ2hlY2tlZCkKKyAgICAgICAgLy8vICAgICAgICAgb3B0aW9ucy5aaXBGbGF2b3IgPSAyOworICAgICAgICAvLy8gICAgIGVsc2UgaWYgKHRoaXMucmFkaW9GbGF2b3JTZnhHdWkuQ2hlY2tlZCkKKyAgICAgICAgLy8vICAgICAgICAgb3B0aW9ucy5aaXBGbGF2b3IgPSAxOworICAgICAgICAvLy8gICAgIGVsc2Ugb3B0aW9ucy5aaXBGbGF2b3IgPSAwOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBpZiAodGhpcy5yYWRpb1ppcDY0QXNOZWNlc3NhcnkuQ2hlY2tlZCkKKyAgICAgICAgLy8vICAgICAgICAgb3B0aW9ucy5aaXA2NCA9IFppcDY0T3B0aW9uLkFzTmVjZXNzYXJ5OworICAgICAgICAvLy8gICAgIGVsc2UgaWYgKHRoaXMucmFkaW9aaXA2NEFsd2F5cy5DaGVja2VkKQorICAgICAgICAvLy8gICAgICAgICBvcHRpb25zLlppcDY0ID0gWmlwNjRPcHRpb24uQWx3YXlzOworICAgICAgICAvLy8gICAgIGVsc2Ugb3B0aW9ucy5aaXA2NCA9IFppcDY0T3B0aW9uLk5ldmVyOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBvcHRpb25zLkNvbW1lbnQgPSBTdHJpbmcuRm9ybWF0KCJFbmNvZGluZzp7MH0gfHwgRmxhdm9yOnsxfSB8fCBaSVA2NDp7Mn1cclxuQ3JlYXRlZCBhdCB7M30gfHwgezR9XHJcbiIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgb3B0aW9ucy5FbmNvZGluZywKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBGbGF2b3JUb1N0cmluZyhvcHRpb25zLlppcEZsYXZvciksCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgb3B0aW9ucy5aaXA2NC5Ub1N0cmluZygpLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZS5Ob3cuVG9TdHJpbmcoInl5eXktTU1NLWRkIEhIOm1tOnNzIiksCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgdGhpcy5UZXh0KTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgaWYgKHRoaXMudGJDb21tZW50LlRleHQgIT0gVEJfQ09NTUVOVF9OT1RFKQorICAgICAgICAvLy8gICAgICAgICBvcHRpb25zLkNvbW1lbnQgKz0gdGhpcy50YkNvbW1lbnQuVGV4dDsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgX3dvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQodGhpcy5Eb1NhdmUpOworICAgICAgICAvLy8gICAgIF93b3JrZXJUaHJlYWQuTmFtZSA9ICJaaXAgU2F2ZXIgdGhyZWFkIjsKKyAgICAgICAgLy8vICAgICBfd29ya2VyVGhyZWFkLlN0YXJ0KG9wdGlvbnMpOworICAgICAgICAvLy8gICAgIHRoaXMuQ3Vyc29yID0gQ3Vyc29ycy5XYWl0Q3Vyc29yOworICAgICAgICAvLy8gIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIERvU2F2ZShPYmplY3QgcCkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICBXb3JrZXJPcHRpb25zIG9wdGlvbnMgPSBwIGFzIFdvcmtlck9wdGlvbnM7CisgICAgICAgIC8vLyAgICAgdHJ5CisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAodmFyIHppcDEgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICB6aXAxLlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmcgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZyhvcHRpb25zLkVuY29kaW5nKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHppcDEuQ29tbWVudCA9IG9wdGlvbnMuQ29tbWVudDsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHppcDEuQWRkRGlyZWN0b3J5KG9wdGlvbnMuRm9sZGVyKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIF9lbnRyaWVzVG9aaXAgPSB6aXAxLkVudHJ5RmlsZU5hbWVzLkNvdW50OworICAgICAgICAvLy8gICAgICAgICAgICAgU2V0UHJvZ3Jlc3NCYXJzKCk7CisgICAgICAgIC8vLyAgICAgICAgICAgICB6aXAxLlNhdmVQcm9ncmVzcyArPSB0aGlzLnppcDFfU2F2ZVByb2dyZXNzOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgICAgICAgIHppcDEuVXNlWmlwNjRXaGVuU2F2aW5nID0gb3B0aW9ucy5aaXA2NDsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgICAgICAgICBpZiAob3B0aW9ucy5aaXBGbGF2b3IgPT0gMSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB6aXAxLlNhdmVTZWxmRXh0cmFjdG9yKG9wdGlvbnMuWmlwTmFtZSwgU2VsZkV4dHJhY3RvckZsYXZvci5XaW5Gb3Jtc0FwcGxpY2F0aW9uKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuWmlwRmxhdm9yID09IDIpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgemlwMS5TYXZlU2VsZkV4dHJhY3RvcihvcHRpb25zLlppcE5hbWUsIFNlbGZFeHRyYWN0b3JGbGF2b3IuQ29uc29sZUFwcGxpY2F0aW9uKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB6aXAxLlNhdmUob3B0aW9ucy5aaXBOYW1lKTsKKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgICBjYXRjaCAoU3lzdGVtLkV4Y2VwdGlvbiBleGMxKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgTWVzc2FnZUJveC5TaG93KFN0cmluZy5Gb3JtYXQoIkV4Y2VwdGlvbiB3aGlsZSB6aXBwaW5nOiB7MH0iLCBleGMxLk1lc3NhZ2UpKTsKKyAgICAgICAgLy8vICAgICAgICAgYnRuQ2FuY2VsX0NsaWNrKG51bGwsIG51bGwpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8KKyAgICAgICAgLy8vIHZvaWQgemlwMV9TYXZlUHJvZ3Jlc3Mob2JqZWN0IHNlbmRlciwgU2F2ZVByb2dyZXNzRXZlbnRBcmdzIGUpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgc3dpdGNoIChlLkV2ZW50VHlwZSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGNhc2UgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0FmdGVyV3JpdGVFbnRyeToKKyAgICAgICAgLy8vICAgICAgICAgICAgIFN0ZXBBcmNoaXZlUHJvZ3Jlc3MoZSk7CisgICAgICAgIC8vLyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8vICAgICAgICAgY2FzZSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfRW50cnlCeXRlc1JlYWQ6CisgICAgICAgIC8vLyAgICAgICAgICAgICBTdGVwRW50cnlQcm9ncmVzcyhlKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLy8gICAgICAgICBjYXNlIFppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19Db21wbGV0ZWQ6CisgICAgICAgIC8vLyAgICAgICAgICAgICBTYXZlQ29tcGxldGVkKCk7CisgICAgICAgIC8vLyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8vICAgICAgICAgY2FzZSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5TYXZpbmdfQWZ0ZXJTYXZlVGVtcEFyY2hpdmU6CisgICAgICAgIC8vLyAgICAgICAgICAgICAvLyB0aGlzIGV2ZW50IG9ubHkgb2NjdXJzIHdoZW4gc2F2aW5nIGFuIFNGWCBmaWxlCisgICAgICAgIC8vLyAgICAgICAgICAgICBUZW1wQXJjaGl2ZVNhdmVkKCk7CisgICAgICAgIC8vLyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyAgICAgaWYgKF9zYXZlQ2FuY2VsZWQpCisgICAgICAgIC8vLyAgICAgICAgIGUuQ2FuY2VsID0gdHJ1ZTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBTdGVwQXJjaGl2ZVByb2dyZXNzKFNhdmVQcm9ncmVzc0V2ZW50QXJncyBlKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGlmICh0aGlzLnByb2dyZXNzQmFyMS5JbnZva2VSZXF1aXJlZCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIxLkludm9rZShuZXcgU2F2ZUVudHJ5UHJvZ3Jlc3ModGhpcy5TdGVwQXJjaGl2ZVByb2dyZXNzKSwgbmV3IG9iamVjdFtdIHsgZSB9KTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyAgICAgZWxzZQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgaWYgKCFfc2F2ZUNhbmNlbGVkKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBfbkZpbGVzQ29tcGxldGVkKys7CisgICAgICAgIC8vLyAgICAgICAgICAgICB0aGlzLnByb2dyZXNzQmFyMS5QZXJmb3JtU3RlcCgpOworICAgICAgICAvLy8gICAgICAgICAgICAgX3RvdGFsQnl0ZXNBZnRlckNvbXByZXNzICs9IGUuQ3VycmVudEVudHJ5LkNvbXByZXNzZWRTaXplOworICAgICAgICAvLy8gICAgICAgICAgICAgX3RvdGFsQnl0ZXNCZWZvcmVDb21wcmVzcyArPSBlLkN1cnJlbnRFbnRyeS5VbmNvbXByZXNzZWRTaXplOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwcm9ncmVzcyBiYXIgZm9yIHRoZSBlbnRyeToKKyAgICAgICAgLy8vICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIyLlZhbHVlID0gdGhpcy5wcm9ncmVzc0JhcjIuTWF4aW11bSA9IDE7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgdGhpcy5VcGRhdGUoKTsKKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIFN0ZXBFbnRyeVByb2dyZXNzKFNhdmVQcm9ncmVzc0V2ZW50QXJncyBlKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGlmICh0aGlzLnByb2dyZXNzQmFyMi5JbnZva2VSZXF1aXJlZCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIyLkludm9rZShuZXcgU2F2ZUVudHJ5UHJvZ3Jlc3ModGhpcy5TdGVwRW50cnlQcm9ncmVzcyksIG5ldyBvYmplY3RbXSB7IGUgfSk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gICAgIGVsc2UKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGlmICghX3NhdmVDYW5jZWxlZCkKKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXIyLk1heGltdW0gPT0gMSkKKyAgICAgICAgLy8vICAgICAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAvLyByZXNldAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIEludDY0IG1heCA9IGUuVG90YWxCeXRlc1RvVHJhbnNmZXI7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgX3Byb2dyZXNzMk1heEZhY3RvciA9IDA7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgd2hpbGUgKG1heCA+IFN5c3RlbS5JbnQzMi5NYXhWYWx1ZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIG1heCAvPSAyOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBfcHJvZ3Jlc3MyTWF4RmFjdG9yKys7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIyLk1heGltdW0gPSAoaW50KW1heDsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBsYmxTdGF0dXMuVGV4dCA9IFN0cmluZy5Gb3JtYXQoInswfSBvZiB7MX0gZmlsZXMuLi4oezJ9KSIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIF9uRmlsZXNDb21wbGV0ZWQgKyAxLCBfZW50cmllc1RvWmlwLCBlLkN1cnJlbnRFbnRyeS5GaWxlTmFtZSk7CisgICAgICAgIC8vLyAgICAgICAgICAgICB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgIGludCB4ZmVycmVkID0gZS5CeXRlc1RyYW5zZmVycmVkID4+IF9wcm9ncmVzczJNYXhGYWN0b3I7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIyLlZhbHVlID0gKHhmZXJyZWQgPj0gdGhpcy5wcm9ncmVzc0JhcjIuTWF4aW11bSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICA/IHRoaXMucHJvZ3Jlc3NCYXIyLk1heGltdW0KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICA6IHhmZXJyZWQ7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgIHRoaXMuVXBkYXRlKCk7CisgICAgICAgIC8vLyAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIFNhdmVDb21wbGV0ZWQoKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGlmICh0aGlzLmxibFN0YXR1cy5JbnZva2VSZXF1aXJlZCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHRoaXMubGJsU3RhdHVzLkludm9rZShuZXcgTWV0aG9kSW52b2tlcih0aGlzLlNhdmVDb21wbGV0ZWQpKTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyAgICAgZWxzZQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgbGJsU3RhdHVzLlRleHQgPSBTdHJpbmcuRm9ybWF0KCJEb25lLCBDb21wcmVzc2VkIHswfSBmaWxlcywgezE6TjB9JSBvZiBvcmlnaW5hbC4iLAorICAgICAgICAvLy8gICAgICAgICAgICAgX25GaWxlc0NvbXBsZXRlZCwgKDEwMC4wMCAqIF90b3RhbEJ5dGVzQWZ0ZXJDb21wcmVzcykgLyBfdG90YWxCeXRlc0JlZm9yZUNvbXByZXNzKTsKKyAgICAgICAgLy8vICAgICAgICAgIFJlc2V0U3RhdGUoKTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIFJlc2V0U3RhdGUoKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHRoaXMuYnRuQ2FuY2VsLkVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgLy8vICAgICB0aGlzLmJ0bk9rLkVuYWJsZWQgPSB0cnVlOworICAgICAgICAvLy8gICAgIHRoaXMuYnRuT2suVGV4dCA9ICJaaXAgaXQhIjsKKyAgICAgICAgLy8vICAgICB0aGlzLnByb2dyZXNzQmFyMS5WYWx1ZSA9IDA7CisgICAgICAgIC8vLyAgICAgdGhpcy5wcm9ncmVzc0JhcjIuVmFsdWUgPSAwOworICAgICAgICAvLy8gICAgIHRoaXMuQ3Vyc29yID0gQ3Vyc29ycy5EZWZhdWx0OworICAgICAgICAvLy8gICAgIGlmICghX3dvcmtlclRocmVhZC5Jc0FsaXZlKQorICAgICAgICAvLy8gICAgICAgICBfd29ya2VyVGhyZWFkLkpvaW4oKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuUmVhZFByb2dyZXNzIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRQcm9ncmVzcyIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuRXh0cmFjdFByb2dyZXNzIi8+CisgICAgICAgIGludGVybmFsIGV2ZW50IEV2ZW50SGFuZGxlcjxTYXZlUHJvZ3Jlc3NFdmVudEFyZ3M+IFNhdmVQcm9ncmVzczsKKworCisgICAgICAgIGludGVybmFsIGJvb2wgT25TYXZlQmxvY2soWmlwRW50cnkgZW50cnksIEludDY0IGJ5dGVzWGZlcnJlZCwgSW50NjQgdG90YWxCeXRlc1RvWGZlcikKKyAgICAgICAgeworICAgICAgICAgICAgRXZlbnRIYW5kbGVyPFNhdmVQcm9ncmVzc0V2ZW50QXJncz4gc3AgPSBTYXZlUHJvZ3Jlc3M7CisgICAgICAgICAgICBpZiAoc3AgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZSA9IFNhdmVQcm9ncmVzc0V2ZW50QXJncy5CeXRlVXBkYXRlKEFyY2hpdmVOYW1lRm9yRXZlbnQsIGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNYZmVycmVkLCB0b3RhbEJ5dGVzVG9YZmVyKTsKKyAgICAgICAgICAgICAgICBzcCh0aGlzLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZS5DYW5jZWwpCisgICAgICAgICAgICAgICAgICAgIF9zYXZlT3BlcmF0aW9uQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9zYXZlT3BlcmF0aW9uQ2FuY2VsZWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgT25TYXZlRW50cnkoaW50IGN1cnJlbnQsIFppcEVudHJ5IGVudHJ5LCBib29sIGJlZm9yZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXZlbnRIYW5kbGVyPFNhdmVQcm9ncmVzc0V2ZW50QXJncz4gc3AgPSBTYXZlUHJvZ3Jlc3M7CisgICAgICAgICAgICBpZiAoc3AgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBTYXZlUHJvZ3Jlc3NFdmVudEFyZ3MoQXJjaGl2ZU5hbWVGb3JFdmVudCwgYmVmb3JlLCBfZW50cmllcy5Db3VudCwgY3VycmVudCwgZW50cnkpOworICAgICAgICAgICAgICAgIHNwKHRoaXMsIGUpOworICAgICAgICAgICAgICAgIGlmIChlLkNhbmNlbCkKKyAgICAgICAgICAgICAgICAgICAgX3NhdmVPcGVyYXRpb25DYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgT25TYXZlRXZlbnQoWmlwUHJvZ3Jlc3NFdmVudFR5cGUgZXZlbnRGbGF2b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV2ZW50SGFuZGxlcjxTYXZlUHJvZ3Jlc3NFdmVudEFyZ3M+IHNwID0gU2F2ZVByb2dyZXNzOworICAgICAgICAgICAgaWYgKHNwICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgU2F2ZVByb2dyZXNzRXZlbnRBcmdzKEFyY2hpdmVOYW1lRm9yRXZlbnQsIGV2ZW50Rmxhdm9yKTsKKyAgICAgICAgICAgICAgICBzcCh0aGlzLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZS5DYW5jZWwpCisgICAgICAgICAgICAgICAgICAgIF9zYXZlT3BlcmF0aW9uQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIE9uU2F2ZVN0YXJ0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8U2F2ZVByb2dyZXNzRXZlbnRBcmdzPiBzcCA9IFNhdmVQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChzcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlID0gU2F2ZVByb2dyZXNzRXZlbnRBcmdzLlN0YXJ0ZWQoQXJjaGl2ZU5hbWVGb3JFdmVudCk7CisgICAgICAgICAgICAgICAgc3AodGhpcywgZSk7CisgICAgICAgICAgICAgICAgaWYgKGUuQ2FuY2VsKQorICAgICAgICAgICAgICAgICAgICBfc2F2ZU9wZXJhdGlvbkNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgT25TYXZlQ29tcGxldGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXZlbnRIYW5kbGVyPFNhdmVQcm9ncmVzc0V2ZW50QXJncz4gc3AgPSBTYXZlUHJvZ3Jlc3M7CisgICAgICAgICAgICBpZiAoc3AgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZSA9IFNhdmVQcm9ncmVzc0V2ZW50QXJncy5Db21wbGV0ZWQoQXJjaGl2ZU5hbWVGb3JFdmVudCk7CisgICAgICAgICAgICAgICAgc3AodGhpcywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBSZWFkCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuIGV2ZW50IGhhbmRsZXIgaW52b2tlZCBiZWZvcmUsIGR1cmluZywgYW5kIGFmdGVyIHRoZSByZWFkaW5nIG9mIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIERlcGVuZGluZyBvbiB0aGUgcGFydGljdWxhciBldmVudCBiZWluZyBzaWduYWxlZCwgZGlmZmVyZW50IHByb3BlcnRpZXMgb24gdGhlCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IlJlYWRQcm9ncmVzc0V2ZW50QXJncyIvPiBwYXJhbWV0ZXIgYXJlIHNldC4gIFRoZSBmb2xsb3dpbmcgdGFibGUKKyAgICAgICAgLy8vIHN1bW1hcml6ZXMgdGhlIGF2YWlsYWJsZSBFdmVudFR5cGVzIGFuZCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGlzCisgICAgICAgIC8vLyBldmVudCBoYW5kbGVyIGlzIGludm9rZWQgd2l0aCBhIDxjPlJlYWRQcm9ncmVzc0V2ZW50QXJnczwvYz4gd2l0aCB0aGUgZ2l2ZW4gRXZlbnRUeXBlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxsaXN0IHR5cGU9InRhYmxlIj4KKyAgICAgICAgLy8vIDxsaXN0aGVhZGVyPgorICAgICAgICAvLy8gPHRlcm0+dmFsdWUgb2YgRW50cnlUeXBlPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPk1lYW5pbmcgYW5kIGNvbmRpdGlvbnM8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9saXN0aGVhZGVyPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+WmlwUHJvZ3Jlc3NFdmVudFR5cGUuUmVhZGluZ19TdGFydGVkPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPkZpcmVkIGp1c3QgYXMgWmlwRmlsZS5SZWFkKCkgYmVnaW5zLiBNZWFuaW5nZnVsIHByb3BlcnRpZXM6IEFyY2hpdmVOYW1lLgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPlppcFByb2dyZXNzRXZlbnRUeXBlLlJlYWRpbmdfQ29tcGxldGVkPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPkZpcmVkIHdoZW4gWmlwRmlsZS5SZWFkKCkgaGFzIGNvbXBsZXRlZC4gTWVhbmluZ2Z1bCBwcm9wZXJ0aWVzOiBBcmNoaXZlTmFtZS4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5SZWFkaW5nX0FyY2hpdmVCeXRlc1JlYWQ8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+RmlyZWQgd2hpbGUgcmVhZGluZywgdXBkYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZm9yIHRoZSBlbnRpcmUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIE1lYW5pbmdmdWwgcHJvcGVydGllczogQXJjaGl2ZU5hbWUsIEN1cnJlbnRFbnRyeSwgQnl0ZXNUcmFuc2ZlcnJlZCwgVG90YWxCeXRlc1RvVHJhbnNmZXIuCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+WmlwUHJvZ3Jlc3NFdmVudFR5cGUuUmVhZGluZ19CZWZvcmVSZWFkRW50cnk8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+SW5kaWNhdGVzIGFuIGVudHJ5IGlzIGFib3V0IHRvIGJlIHJlYWQgZnJvbSB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIE1lYW5pbmdmdWwgcHJvcGVydGllczogQXJjaGl2ZU5hbWUsIEVudHJpZXNUb3RhbC4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5SZWFkaW5nX0FmdGVyUmVhZEVudHJ5PC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPkluZGljYXRlcyBhbiBlbnRyeSBoYXMganVzdCBiZWVuIHJlYWQgZnJvbSB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIE1lYW5pbmdmdWwgcHJvcGVydGllczogQXJjaGl2ZU5hbWUsIEVudHJpZXNUb3RhbCwgQ3VycmVudEVudHJ5LgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2xpc3Q+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuU2F2ZVByb2dyZXNzIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRQcm9ncmVzcyIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuRXh0cmFjdFByb2dyZXNzIi8+CisgICAgICAgIGludGVybmFsIGV2ZW50IEV2ZW50SGFuZGxlcjxSZWFkUHJvZ3Jlc3NFdmVudEFyZ3M+IFJlYWRQcm9ncmVzczsKKworICAgICAgICBwcml2YXRlIHZvaWQgT25SZWFkU3RhcnRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV2ZW50SGFuZGxlcjxSZWFkUHJvZ3Jlc3NFdmVudEFyZ3M+IHJwID0gUmVhZFByb2dyZXNzOworICAgICAgICAgICAgaWYgKHJwICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBlID0gUmVhZFByb2dyZXNzRXZlbnRBcmdzLlN0YXJ0ZWQoQXJjaGl2ZU5hbWVGb3JFdmVudCk7CisgICAgICAgICAgICAgICAgICAgIHJwKHRoaXMsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIE9uUmVhZENvbXBsZXRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV2ZW50SGFuZGxlcjxSZWFkUHJvZ3Jlc3NFdmVudEFyZ3M+IHJwID0gUmVhZFByb2dyZXNzOworICAgICAgICAgICAgaWYgKHJwICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBlID0gUmVhZFByb2dyZXNzRXZlbnRBcmdzLkNvbXBsZXRlZChBcmNoaXZlTmFtZUZvckV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgcnAodGhpcywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIE9uUmVhZEJ5dGVzKFppcEVudHJ5IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8UmVhZFByb2dyZXNzRXZlbnRBcmdzPiBycCA9IFJlYWRQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChycCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJlYWRQcm9ncmVzc0V2ZW50QXJncy5CeXRlVXBkYXRlKEFyY2hpdmVOYW1lRm9yRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFN0cmVhbS5Qb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGhPZlJlYWRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBycCh0aGlzLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHZvaWQgT25SZWFkRW50cnkoYm9vbCBiZWZvcmUsIFppcEVudHJ5IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8UmVhZFByb2dyZXNzRXZlbnRBcmdzPiBycCA9IFJlYWRQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChycCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlYWRQcm9ncmVzc0V2ZW50QXJncyBlID0gKGJlZm9yZSkKKyAgICAgICAgICAgICAgICAgICAgPyBSZWFkUHJvZ3Jlc3NFdmVudEFyZ3MuQmVmb3JlKEFyY2hpdmVOYW1lRm9yRXZlbnQsIF9lbnRyaWVzLkNvdW50KQorICAgICAgICAgICAgICAgICAgICA6IFJlYWRQcm9ncmVzc0V2ZW50QXJncy5BZnRlcihBcmNoaXZlTmFtZUZvckV2ZW50LCBlbnRyeSwgX2VudHJpZXMuQ291bnQpOworICAgICAgICAgICAgICAgIHJwKHRoaXMsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfbGVuZ3RoT2ZSZWFkU3RyZWFtID0gLTk5OworICAgICAgICBwcml2YXRlIEludDY0IExlbmd0aE9mUmVhZFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2xlbmd0aE9mUmVhZFN0cmVhbSA9PSAtOTkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGVuZ3RoT2ZSZWFkU3RyZWFtID0gKF9SZWFkU3RyZWFtSXNPdXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBTaGFyZWRVdGlsaXRpZXMuR2V0RmlsZUxlbmd0aChfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogLTFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2xlbmd0aE9mUmVhZFN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICAjcmVnaW9uIEV4dHJhY3QKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBbiBldmVudCBoYW5kbGVyIGludm9rZWQgYmVmb3JlLCBkdXJpbmcsIGFuZCBhZnRlciBleHRyYWN0aW9uIG9mCisgICAgICAgIC8vLyAgIGVudHJpZXMgaW4gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIERlcGVuZGluZyBvbiB0aGUgcGFydGljdWxhciBldmVudCwgZGlmZmVyZW50IHByb3BlcnRpZXMgb24gdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzIi8+IHBhcmFtZXRlciBhcmUgc2V0LiAgVGhlIGZvbGxvd2luZworICAgICAgICAvLy8gICB0YWJsZSBzdW1tYXJpemVzIHRoZSBhdmFpbGFibGUgRXZlbnRUeXBlcyBhbmQgdGhlIGNvbmRpdGlvbnMgdW5kZXIKKyAgICAgICAgLy8vICAgd2hpY2ggdGhpcyBldmVudCBoYW5kbGVyIGlzIGludm9rZWQgd2l0aCBhCisgICAgICAgIC8vLyAgIDxjPkV4dHJhY3RQcm9ncmVzc0V2ZW50QXJnczwvYz4gd2l0aCB0aGUgZ2l2ZW4gRXZlbnRUeXBlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxsaXN0IHR5cGU9InRhYmxlIj4KKyAgICAgICAgLy8vIDxsaXN0aGVhZGVyPgorICAgICAgICAvLy8gPHRlcm0+dmFsdWUgb2YgRW50cnlUeXBlPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPk1lYW5pbmcgYW5kIGNvbmRpdGlvbnM8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9saXN0aGVhZGVyPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+WmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19CZWZvcmVFeHRyYWN0QWxsPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBTZXQgd2hlbiBFeHRyYWN0QWxsKCkgYmVnaW5zLiBUaGUgQXJjaGl2ZU5hbWUsIE92ZXJ3cml0ZSwgYW5kCisgICAgICAgIC8vLyAgIEV4dHJhY3RMb2NhdGlvbiBwcm9wZXJ0aWVzIGFyZSBtZWFuaW5nZnVsLjwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0FmdGVyRXh0cmFjdEFsbDwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgU2V0IHdoZW4gRXh0cmFjdEFsbCgpIGhhcyBjb21wbGV0ZWQuICBUaGUgQXJjaGl2ZU5hbWUsIE92ZXJ3cml0ZSwKKyAgICAgICAgLy8vICAgYW5kIEV4dHJhY3RMb2NhdGlvbiBwcm9wZXJ0aWVzIGFyZSBtZWFuaW5nZnVsLgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPlppcFByb2dyZXNzRXZlbnRUeXBlLkV4dHJhY3RpbmdfQmVmb3JlRXh0cmFjdEVudHJ5PC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBTZXQgd2hlbiBhbiBFeHRyYWN0KCkgb24gYW4gZW50cnkgaW4gdGhlIFppcEZpbGUgaGFzIGJlZ3VuLgorICAgICAgICAvLy8gICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG1lYW5pbmdmdWw6IEFyY2hpdmVOYW1lLCBFbnRyaWVzVG90YWwsCisgICAgICAgIC8vLyAgIEN1cnJlbnRFbnRyeSwgT3ZlcndyaXRlLCBFeHRyYWN0TG9jYXRpb24sIEVudHJpZXNFeHRyYWN0ZWQuCisgICAgICAgIC8vLyA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gPHRlcm0+WmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19BZnRlckV4dHJhY3RFbnRyeTwvdGVybT4KKyAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgU2V0IHdoZW4gYW4gRXh0cmFjdCgpIG9uIGFuIGVudHJ5IGluIHRoZSBaaXBGaWxlIGhhcyBjb21wbGV0ZWQuCisgICAgICAgIC8vLyAgIFByb3BlcnRpZXMgdGhhdCBhcmUgbWVhbmluZ2Z1bDogQXJjaGl2ZU5hbWUsIEVudHJpZXNUb3RhbCwKKyAgICAgICAgLy8vICAgQ3VycmVudEVudHJ5LCBPdmVyd3JpdGUsIEV4dHJhY3RMb2NhdGlvbiwgRW50cmllc0V4dHJhY3RlZC4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyA8dGVybT5aaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0VudHJ5Qnl0ZXNXcml0dGVuPC90ZXJtPgorICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICBTZXQgd2l0aGluIGEgY2FsbCB0byBFeHRyYWN0KCkgb24gYW4gZW50cnkgaW4gdGhlIFppcEZpbGUsIGFzIGRhdGEKKyAgICAgICAgLy8vICAgaXMgZXh0cmFjdGVkIGZvciB0aGUgZW50cnkuICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG1lYW5pbmdmdWw6CisgICAgICAgIC8vLyAgIEFyY2hpdmVOYW1lLCBDdXJyZW50RW50cnksIEJ5dGVzVHJhbnNmZXJyZWQsIFRvdGFsQnl0ZXNUb1RyYW5zZmVyLgorICAgICAgICAvLy8gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vIDx0ZXJtPlppcFByb2dyZXNzRXZlbnRUeXBlLkV4dHJhY3RpbmdfRXh0cmFjdEVudHJ5V291bGRPdmVyd3JpdGU8L3Rlcm0+CisgICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIFNldCB3aXRoaW4gYSBjYWxsIHRvIEV4dHJhY3QoKSBvbiBhbiBlbnRyeSBpbiB0aGUgWmlwRmlsZSwgd2hlbiB0aGUKKyAgICAgICAgLy8vICAgZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4gVGhpcyBldmVudCB0eXBlIGlzIHVzZWQKKyAgICAgICAgLy8vICAgb25seSB3aGVuIDxjPkV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb248L2M+IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBvcgorICAgICAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4gaXMgc2V0IHRvIDxjPkludm9rZUV4dHJhY3RQcm9ncmVzc0V2ZW50PC9jPi4KKyAgICAgICAgLy8vIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9saXN0PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gcHJpdmF0ZSBzdGF0aWMgYm9vbCBqdXN0SGFkQnl0ZVVwZGF0ZSA9IGZhbHNlOworICAgICAgICAvLy8gcHVibGljIHN0YXRpYyB2b2lkIEV4dHJhY3RQcm9ncmVzcyhvYmplY3Qgc2VuZGVyLCBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MgZSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgaWYoZS5FdmVudFR5cGUgPT0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19FbnRyeUJ5dGVzV3JpdHRlbikKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIGlmIChqdXN0SGFkQnl0ZVVwZGF0ZSkKKyAgICAgICAgLy8vICAgICAgIENvbnNvbGUuU2V0Q3Vyc29yUG9zaXRpb24oMCwgQ29uc29sZS5DdXJzb3JUb3ApOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBDb25zb2xlLldyaXRlKCIgICB7MH0vezF9ICh7MjpOMH0lKSIsIGUuQnl0ZXNUcmFuc2ZlcnJlZCwgZS5Ub3RhbEJ5dGVzVG9UcmFuc2ZlciwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgIGUuQnl0ZXNUcmFuc2ZlcnJlZCAvICgwLjAxICogZS5Ub3RhbEJ5dGVzVG9UcmFuc2ZlciApKTsKKyAgICAgICAgLy8vICAgICBqdXN0SGFkQnl0ZVVwZGF0ZSA9IHRydWU7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vICAgZWxzZSBpZihlLkV2ZW50VHlwZSA9PSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5FeHRyYWN0aW5nX0JlZm9yZUV4dHJhY3RFbnRyeSkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIGlmIChqdXN0SGFkQnl0ZVVwZGF0ZSkKKyAgICAgICAgLy8vICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIC8vLyAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4dHJhY3Rpbmc6IHswfSIsIGUuQ3VycmVudEVudHJ5LkZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgICBqdXN0SGFkQnl0ZVVwZGF0ZT0gZmFsc2U7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBwdWJsaWMgc3RhdGljIEV4dHJhY3RaaXAoc3RyaW5nIHppcFRvRXh0cmFjdCwgc3RyaW5nIGRpcmVjdG9yeSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgc3RyaW5nIFRhcmdldERpcmVjdG9yeT0gImV4dHJhY3QiOworICAgICAgICAvLy8gICB1c2luZyAodmFyIHppcCA9IFppcEZpbGUuUmVhZCh6aXBUb0V4dHJhY3QpKSB7CisgICAgICAgIC8vLyAgICAgemlwLkV4dHJhY3RQcm9ncmVzcyArPSBFeHRyYWN0UHJvZ3Jlc3M7CisgICAgICAgIC8vLyAgICAgZm9yZWFjaCAodmFyIGUgaW4gemlwMSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICBlLkV4dHJhY3QoVGFyZ2V0RGlyZWN0b3J5LCB0cnVlKTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBQdWJsaWMgU2hhcmVkIFN1YiBNYWluKEJ5VmFsIGFyZ3MgQXMgU3RyaW5nKCkpCisgICAgICAgIC8vLyAgICAgRGltIFppcFRvVW5wYWNrIEFzIFN0cmluZyA9ICJDMVAzU01MLnppcCIKKyAgICAgICAgLy8vICAgICBEaW0gVGFyZ2V0RGlyIEFzIFN0cmluZyA9ICJFeHRyYWN0VGVzdF9FeHRyYWN0IgorICAgICAgICAvLy8gICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeHRyYWN0aW5nIGZpbGUgezB9IHRvIHsxfSIsIFppcFRvVW5wYWNrLCBUYXJnZXREaXIpCisgICAgICAgIC8vLyAgICAgVXNpbmcgemlwMSBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKFppcFRvVW5wYWNrKQorICAgICAgICAvLy8gICAgICAgICBBZGRIYW5kbGVyIHppcDEuRXh0cmFjdFByb2dyZXNzLCBBZGRyZXNzT2YgTXlFeHRyYWN0UHJvZ3Jlc3MKKyAgICAgICAgLy8vICAgICAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICAgICAgRm9yIEVhY2ggZSBJbiB6aXAxCisgICAgICAgIC8vLyAgICAgICAgICAgICBlLkV4dHJhY3QoVGFyZ2V0RGlyLCBUcnVlKQorICAgICAgICAvLy8gICAgICAgICBOZXh0CisgICAgICAgIC8vLyAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyBFbmQgU3ViCisgICAgICAgIC8vLworICAgICAgICAvLy8gUHJpdmF0ZSBTaGFyZWQganVzdEhhZEJ5dGVVcGRhdGUgQXMgQm9vbGVhbiA9IEZhbHNlCisgICAgICAgIC8vLworICAgICAgICAvLy8gUHVibGljIFNoYXJlZCBTdWIgTXlFeHRyYWN0UHJvZ3Jlc3MoQnlWYWwgc2VuZGVyIEFzIE9iamVjdCwgQnlWYWwgZSBBcyBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MpCisgICAgICAgIC8vLyAgICAgSWYgKGUuRXZlbnRUeXBlID0gWmlwUHJvZ3Jlc3NFdmVudFR5cGUuRXh0cmFjdGluZ19FbnRyeUJ5dGVzV3JpdHRlbikgVGhlbgorICAgICAgICAvLy8gICAgICAgICBJZiBFeHRyYWN0VGVzdC5qdXN0SGFkQnl0ZVVwZGF0ZSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICBDb25zb2xlLlNldEN1cnNvclBvc2l0aW9uKDAsIENvbnNvbGUuQ3Vyc29yVG9wKQorICAgICAgICAvLy8gICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZSgiICAgezB9L3sxfSAoezI6TjB9JSkiLCBlLkJ5dGVzVHJhbnNmZXJyZWQsIGUuVG90YWxCeXRlc1RvVHJhbnNmZXIsIChDRGJsKGUuQnl0ZXNUcmFuc2ZlcnJlZCkgLyAoMC4wMSAqIGUuVG90YWxCeXRlc1RvVHJhbnNmZXIpKSkKKyAgICAgICAgLy8vICAgICAgICAgRXh0cmFjdFRlc3QuanVzdEhhZEJ5dGVVcGRhdGUgPSBUcnVlCisgICAgICAgIC8vLyAgICAgRWxzZUlmIChlLkV2ZW50VHlwZSA9IFppcFByb2dyZXNzRXZlbnRUeXBlLkV4dHJhY3RpbmdfQmVmb3JlRXh0cmFjdEVudHJ5KSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgIElmIEV4dHJhY3RUZXN0Lmp1c3RIYWRCeXRlVXBkYXRlIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lCisgICAgICAgIC8vLyAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXh0cmFjdGluZzogezB9IiwgZS5DdXJyZW50RW50cnkuRmlsZU5hbWUpCisgICAgICAgIC8vLyAgICAgICAgIEV4dHJhY3RUZXN0Lmp1c3RIYWRCeXRlVXBkYXRlID0gRmFsc2UKKyAgICAgICAgLy8vICAgICBFbmQgSWYKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5TYXZlUHJvZ3Jlc3MiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlJlYWRQcm9ncmVzcyIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuQWRkUHJvZ3Jlc3MiLz4KKyAgICAgICAgaW50ZXJuYWwgZXZlbnQgRXZlbnRIYW5kbGVyPEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncz4gRXh0cmFjdFByb2dyZXNzOworCisKKworICAgICAgICBwcml2YXRlIHZvaWQgT25FeHRyYWN0RW50cnkoaW50IGN1cnJlbnQsIGJvb2wgYmVmb3JlLCBaaXBFbnRyeSBjdXJyZW50RW50cnksIHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8RXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzPiBlcCA9IEV4dHJhY3RQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChlcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncyhBcmNoaXZlTmFtZUZvckV2ZW50LCBiZWZvcmUsIF9lbnRyaWVzLkNvdW50LCBjdXJyZW50LCBjdXJyZW50RW50cnksIHBhdGgpOworICAgICAgICAgICAgICAgIGVwKHRoaXMsIGUpOworICAgICAgICAgICAgICAgIGlmIChlLkNhbmNlbCkKKyAgICAgICAgICAgICAgICAgICAgX2V4dHJhY3RPcGVyYXRpb25DYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vIENhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gWmlwRW50cnkuX0V4dHJhY3RPbmUuCisgICAgICAgIGludGVybmFsIGJvb2wgT25FeHRyYWN0QmxvY2soWmlwRW50cnkgZW50cnksIEludDY0IGJ5dGVzV3JpdHRlbiwgSW50NjQgdG90YWxCeXRlc1RvV3JpdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV2ZW50SGFuZGxlcjxFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3M+IGVwID0gRXh0cmFjdFByb2dyZXNzOworICAgICAgICAgICAgaWYgKGVwICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGUgPSBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MuQnl0ZVVwZGF0ZShBcmNoaXZlTmFtZUZvckV2ZW50LCBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiwgdG90YWxCeXRlc1RvV3JpdGUpOworICAgICAgICAgICAgICAgIGVwKHRoaXMsIGUpOworICAgICAgICAgICAgICAgIGlmIChlLkNhbmNlbCkKKyAgICAgICAgICAgICAgICAgICAgX2V4dHJhY3RPcGVyYXRpb25DYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2V4dHJhY3RPcGVyYXRpb25DYW5jZWxlZDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gQ2FuIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBaaXBFbnRyeS5JbnRlcm5hbEV4dHJhY3QuCisgICAgICAgIGludGVybmFsIGJvb2wgT25TaW5nbGVFbnRyeUV4dHJhY3QoWmlwRW50cnkgZW50cnksIHN0cmluZyBwYXRoLCBib29sIGJlZm9yZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXZlbnRIYW5kbGVyPEV4dHJhY3RQcm9ncmVzc0V2ZW50QXJncz4gZXAgPSBFeHRyYWN0UHJvZ3Jlc3M7CisgICAgICAgICAgICBpZiAoZXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZSA9IChiZWZvcmUpCisgICAgICAgICAgICAgICAgICAgID8gRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzLkJlZm9yZUV4dHJhY3RFbnRyeShBcmNoaXZlTmFtZUZvckV2ZW50LCBlbnRyeSwgcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgOiBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MuQWZ0ZXJFeHRyYWN0RW50cnkoQXJjaGl2ZU5hbWVGb3JFdmVudCwgZW50cnksIHBhdGgpOworICAgICAgICAgICAgICAgIGVwKHRoaXMsIGUpOworICAgICAgICAgICAgICAgIGlmIChlLkNhbmNlbCkKKyAgICAgICAgICAgICAgICAgICAgX2V4dHJhY3RPcGVyYXRpb25DYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX2V4dHJhY3RPcGVyYXRpb25DYW5jZWxlZDsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGJvb2wgT25FeHRyYWN0RXhpc3RpbmcoWmlwRW50cnkgZW50cnksIHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8RXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzPiBlcCA9IEV4dHJhY3RQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChlcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlID0gRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzLkV4dHJhY3RFeGlzdGluZyhBcmNoaXZlTmFtZUZvckV2ZW50LCBlbnRyeSwgcGF0aCk7CisgICAgICAgICAgICAgICAgZXAodGhpcywgZSk7CisgICAgICAgICAgICAgICAgaWYgKGUuQ2FuY2VsKQorICAgICAgICAgICAgICAgICAgICBfZXh0cmFjdE9wZXJhdGlvbkNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfZXh0cmFjdE9wZXJhdGlvbkNhbmNlbGVkOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgT25FeHRyYWN0QWxsQ29tcGxldGVkKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8RXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzPiBlcCA9IEV4dHJhY3RQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChlcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlID0gRXh0cmFjdFByb2dyZXNzRXZlbnRBcmdzLkV4dHJhY3RBbGxDb21wbGV0ZWQoQXJjaGl2ZU5hbWVGb3JFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggKTsKKyAgICAgICAgICAgICAgICBlcCh0aGlzLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIE9uRXh0cmFjdEFsbFN0YXJ0ZWQoc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV2ZW50SGFuZGxlcjxFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3M+IGVwID0gRXh0cmFjdFByb2dyZXNzOworICAgICAgICAgICAgaWYgKGVwICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGUgPSBFeHRyYWN0UHJvZ3Jlc3NFdmVudEFyZ3MuRXh0cmFjdEFsbFN0YXJ0ZWQoQXJjaGl2ZU5hbWVGb3JFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoICk7CisgICAgICAgICAgICAgICAgZXAodGhpcywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgICNlbmRyZWdpb24KKworCisKKyAgICAgICAgI3JlZ2lvbiBBZGQKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQW4gZXZlbnQgaGFuZGxlciBpbnZva2VkIGJlZm9yZSwgZHVyaW5nLCBhbmQgYWZ0ZXIgQWRkaW5nIGVudHJpZXMgdG8gYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgICBBZGRpbmcgYSBsYXJnZSBudW1iZXIgb2YgZW50cmllcyB0byBhIHppcCBmaWxlIGNhbiB0YWtlIGEgbG9uZworICAgICAgICAvLy8gICAgIHRpbWUuICBGb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIDxzZWUgY3JlZj0iQWRkRGlyZWN0b3J5KHN0cmluZykiLz4gb24gYQorICAgICAgICAvLy8gICAgIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIDUwLDAwMCBmaWxlcywgaXQgY291bGQgdGFrZSAzIG1pbnV0ZXMgb3Igc28uCisgICAgICAgIC8vLyAgICAgVGhpcyBldmVudCBoYW5kbGVyIGFsbHdzIGFuIGFwcGxpY2F0aW9uIHRvIHRyYWNrIHRoZSBwcm9ncmVzcyBvZiB0aGUgQWRkCisgICAgICAgIC8vLyAgICAgb3BlcmF0aW9uLCBhbmQgdG8gb3B0aW9uYWxseSBjYW5jZWwgYSBsZW5ndGh5IEFkZCBvcGVyYXRpb24uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLworICAgICAgICAvLy8gaW50IF9udW1FbnRyaWVzVG9BZGQ9IDA7CisgICAgICAgIC8vLyBpbnQgX251bUVudHJpZXNBZGRlZD0gMDsKKyAgICAgICAgLy8vIHZvaWQgQWRkUHJvZ3Jlc3NIYW5kbGVyKG9iamVjdCBzZW5kZXIsIEFkZFByb2dyZXNzRXZlbnRBcmdzIGUpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgc3dpdGNoIChlLkV2ZW50VHlwZSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGNhc2UgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuQWRkaW5nX1N0YXJ0ZWQ6CisgICAgICAgIC8vLyAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQWRkaW5nIGZpbGVzIHRvIHRoZSB6aXAuLi4iKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLy8gICAgICAgICBjYXNlIFppcFByb2dyZXNzRXZlbnRUeXBlLkFkZGluZ19BZnRlckFkZEVudHJ5OgorICAgICAgICAvLy8gICAgICAgICAgICAgX251bUVudHJpZXNBZGRlZCsrOworICAgICAgICAvLy8gICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoU3RyaW5nLkZvcm1hdCgiQWRkaW5nIGZpbGUgezB9L3sxfSA6OiB7Mn0iLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9udW1FbnRyaWVzQWRkZWQsIF9udW1FbnRyaWVzVG9BZGQsIGUuQ3VycmVudEVudHJ5LkZpbGVOYW1lKSk7CisgICAgICAgIC8vLyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8vICAgICAgICAgY2FzZSBaaXBQcm9ncmVzc0V2ZW50VHlwZS5BZGRpbmdfQ29tcGxldGVkOgorICAgICAgICAvLy8gICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkFkZGVkIGFsbCBmaWxlcyIpOworICAgICAgICAvLy8gICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIHZvaWQgQ3JlYXRlVGhlWmlwKCkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgemlwLkFkZFByb2dyZXNzICs9IEFkZFByb2dyZXNzSGFuZGxlcjsKKyAgICAgICAgLy8vICAgICAgICAgemlwLkFkZERpcmVjdG9yeShTeXN0ZW0uSU8uUGF0aC5HZXRGaWxlTmFtZShEaXJUb1ppcCkpOworICAgICAgICAvLy8gICAgICAgICB6aXAuU2F2ZShaaXBGaWxlVG9DcmVhdGUpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIFByaXZhdGUgU3ViIEFkZFByb2dyZXNzSGFuZGxlcihCeVZhbCBzZW5kZXIgQXMgT2JqZWN0LCBCeVZhbCBlIEFzIEFkZFByb2dyZXNzRXZlbnRBcmdzKQorICAgICAgICAvLy8gICAgIFNlbGVjdCBDYXNlIGUuRXZlbnRUeXBlCisgICAgICAgIC8vLyAgICAgICAgIENhc2UgWmlwUHJvZ3Jlc3NFdmVudFR5cGUuQWRkaW5nX1N0YXJ0ZWQKKyAgICAgICAgLy8vICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJBZGRpbmcgZmlsZXMgdG8gdGhlIHppcC4uLiIpCisgICAgICAgIC8vLyAgICAgICAgICAgICBFeGl0IFNlbGVjdAorICAgICAgICAvLy8gICAgICAgICBDYXNlIFppcFByb2dyZXNzRXZlbnRUeXBlLkFkZGluZ19BZnRlckFkZEVudHJ5CisgICAgICAgIC8vLyAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShTdHJpbmcuRm9ybWF0KCJBZGRpbmcgZmlsZSB7MH0iLCBlLkN1cnJlbnRFbnRyeS5GaWxlTmFtZSkpCisgICAgICAgIC8vLyAgICAgICAgICAgICBFeGl0IFNlbGVjdAorICAgICAgICAvLy8gICAgICAgICBDYXNlIFppcFByb2dyZXNzRXZlbnRUeXBlLkFkZGluZ19Db21wbGV0ZWQKKyAgICAgICAgLy8vICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJBZGRlZCBhbGwgZmlsZXMiKQorICAgICAgICAvLy8gICAgICAgICAgICAgRXhpdCBTZWxlY3QKKyAgICAgICAgLy8vICAgICBFbmQgU2VsZWN0CisgICAgICAgIC8vLyBFbmQgU3ViCisgICAgICAgIC8vLworICAgICAgICAvLy8gU3ViIENyZWF0ZVRoZVppcCgpCisgICAgICAgIC8vLyAgICAgVXNpbmcgemlwIGFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgICAgICBBZGRIYW5kbGVyIHppcC5BZGRQcm9ncmVzcywgQWRkcmVzc09mIEFkZFByb2dyZXNzSGFuZGxlcgorICAgICAgICAvLy8gICAgICAgICB6aXAuQWRkRGlyZWN0b3J5KFN5c3RlbS5JTy5QYXRoLkdldEZpbGVOYW1lKERpclRvWmlwKSkKKyAgICAgICAgLy8vICAgICAgICAgemlwLlNhdmUoWmlwRmlsZVRvQ3JlYXRlKTsKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlNhdmVQcm9ncmVzcyIvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuUmVhZFByb2dyZXNzIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5FeHRyYWN0UHJvZ3Jlc3MiLz4KKyAgICAgICAgaW50ZXJuYWwgZXZlbnQgRXZlbnRIYW5kbGVyPEFkZFByb2dyZXNzRXZlbnRBcmdzPiBBZGRQcm9ncmVzczsKKworICAgICAgICBwcml2YXRlIHZvaWQgT25BZGRTdGFydGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXZlbnRIYW5kbGVyPEFkZFByb2dyZXNzRXZlbnRBcmdzPiBhcCA9IEFkZFByb2dyZXNzOworICAgICAgICAgICAgaWYgKGFwICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGUgPSBBZGRQcm9ncmVzc0V2ZW50QXJncy5TdGFydGVkKEFyY2hpdmVOYW1lRm9yRXZlbnQpOworICAgICAgICAgICAgICAgIGFwKHRoaXMsIGUpOworICAgICAgICAgICAgICAgIGlmIChlLkNhbmNlbCkgLy8gd29ya2l0ZW0gMTMzNzEKKyAgICAgICAgICAgICAgICAgICAgX2FkZE9wZXJhdGlvbkNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBPbkFkZENvbXBsZXRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV2ZW50SGFuZGxlcjxBZGRQcm9ncmVzc0V2ZW50QXJncz4gYXAgPSBBZGRQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChhcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlID0gQWRkUHJvZ3Jlc3NFdmVudEFyZ3MuQ29tcGxldGVkKEFyY2hpdmVOYW1lRm9yRXZlbnQpOworICAgICAgICAgICAgICAgIGFwKHRoaXMsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBBZnRlckFkZEVudHJ5KFppcEVudHJ5IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXI8QWRkUHJvZ3Jlc3NFdmVudEFyZ3M+IGFwID0gQWRkUHJvZ3Jlc3M7CisgICAgICAgICAgICBpZiAoYXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZSA9IEFkZFByb2dyZXNzRXZlbnRBcmdzLkFmdGVyRW50cnkoQXJjaGl2ZU5hbWVGb3JFdmVudCwgZW50cnksIF9lbnRyaWVzLkNvdW50KTsKKyAgICAgICAgICAgICAgICBhcCh0aGlzLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZS5DYW5jZWwpIC8vIHdvcmtpdGVtIDEzMzcxCisgICAgICAgICAgICAgICAgICAgIF9hZGRPcGVyYXRpb25DYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKworCisgICAgICAgICNyZWdpb24gRXJyb3IKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIG9wZW4gb3IgcmVhZCBvZiBmaWxlcworICAgICAgICAvLy8gd2hpbGUgc2F2aW5nIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgRXJyb3JzIGNhbiBvY2N1ciBhcyBhIGZpbGUgaXMgYmVpbmcgc2F2ZWQgdG8gdGhlIHppcCBhcmNoaXZlLiAgRm9yCisgICAgICAgIC8vLyAgICAgZXhhbXBsZSwgdGhlIEZpbGUuT3BlbiBtYXkgZmFpbCwgb3IgYSBGaWxlLlJlYWQgbWF5IGZhaWwsIGJlY2F1c2Ugb2YKKyAgICAgICAgLy8vICAgICBsb2NrIGNvbmZsaWN0cyBvciBvdGhlciByZWFzb25zLiAgSWYgeW91IGFkZCBhIGhhbmRsZXIgdG8gdGhpcyBldmVudCwKKyAgICAgICAgLy8vICAgICB5b3UgY2FuIGhhbmRsZSBzdWNoIGVycm9ycyBpbiB5b3VyIG93biBjb2RlLiAgSWYgeW91IGRvbid0IGFkZCBhCisgICAgICAgIC8vLyAgICAgaGFuZGxlciwgdGhlIGxpYnJhcnkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgZW5jb3VudGVycyBhbiBJL08KKyAgICAgICAgLy8vICAgICBlcnJvciBkdXJpbmcgYSBjYWxsIHRvIDxjPlNhdmUoKTwvYz4uCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIFNldHRpbmcgYSBoYW5kbGVyIGltcGxpY2l0bHkgc2V0cyA8c2VlIGNyZWY9IlppcEZpbGUuWmlwRXJyb3JBY3Rpb24iLz4gdG8KKyAgICAgICAgLy8vICAgIDxjPlppcEVycm9yQWN0aW9uLkludm9rZUVycm9yRXZlbnQ8L2M+LgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBUaGUgaGFuZGxlciB5b3UgYWRkIGFwcGxpZXMgdG8gYWxsIDxzZWUgY3JlZj0iWmlwRW50cnkiLz4gaXRlbXMgdGhhdCBhcmUKKyAgICAgICAgLy8vICAgIHN1YnNlcXVlbnRseSBhZGRlZCB0byB0aGUgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UuIElmIHlvdSBzZXQgdGhpcworICAgICAgICAvLy8gICAgcHJvcGVydHkgYWZ0ZXIgeW91IGhhdmUgYWRkZWQgaXRlbXMgdG8gdGhlIDxjPlppcEZpbGU8L2M+LCBidXQgYmVmb3JlIHlvdQorICAgICAgICAvLy8gICAgaGF2ZSBjYWxsZWQgPGM+U2F2ZSgpPC9jPiwgZXJyb3JzIHRoYXQgb2NjdXIgd2hpbGUgc2F2aW5nIHRob3NlIGl0ZW1zCisgICAgICAgIC8vLyAgICB3aWxsIG5vdCBjYXVzZSB0aGUgZXJyb3IgaGFuZGxlciB0byBiZSBpbnZva2VkLgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBJZiB5b3Ugd2FudCB0byBoYW5kbGUgYW55IGVycm9ycyB0aGF0IG9jY3VyIHdpdGggYW55IGVudHJ5IGluIHRoZSB6aXAKKyAgICAgICAgLy8vICAgIGZpbGUgdXNpbmcgdGhlIHNhbWUgZXJyb3IgaGFuZGxlciwgdGhlbiBhZGQgeW91ciBlcnJvciBoYW5kbGVyIG9uY2UsCisgICAgICAgIC8vLyAgICBiZWZvcmUgYWRkaW5nIGFueSBlbnRyaWVzIHRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgSW4gdGhlIGVycm9yIGhhbmRsZXIgbWV0aG9kLCB5b3UgbmVlZCB0byBzZXQgdGhlIDxzZWUKKyAgICAgICAgLy8vICAgIGNyZWY9IlppcEVudHJ5LlppcEVycm9yQWN0aW9uIi8+IHByb3BlcnR5IG9uIHRoZQorICAgICAgICAvLy8gICAgPGM+WmlwRXJyb3JFdmVudEFyZ3MuQ3VycmVudEVudHJ5PC9jPi4gIFRoaXMgY29tbXVuaWNhdGVzIGJhY2sgdG8KKyAgICAgICAgLy8vICAgIERvdE5ldFppcCB3aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGRvIHdpdGggdGhpcyBwYXJ0aWN1bGFyIGVycm9yLiAgV2l0aGluCisgICAgICAgIC8vLyAgICBhbiBlcnJvciBoYW5kbGVyLCBpZiB5b3Ugc2V0IHRoZSA8Yz5aaXBFbnRyeS5aaXBFcnJvckFjdGlvbjwvYz4gcHJvcGVydHkKKyAgICAgICAgLy8vICAgIG9uIHRoZSA8Yz5aaXBFbnRyeTwvYz4gdG8gPGM+WmlwRXJyb3JBY3Rpb24uSW52b2tlRXJyb3JFdmVudDwvYz4gb3IgaWYKKyAgICAgICAgLy8vICAgIHlvdSBkb24ndCBzZXQgaXQgYXQgYWxsLCB0aGUgbGlicmFyeSB3aWxsIHRocm93IHRoZSBleGNlcHRpb24uIChJdCBpcyB0aGUKKyAgICAgICAgLy8vICAgIHNhbWUgYXMgaWYgeW91IGhhZCBzZXQgdGhlIDxjPlppcEVudHJ5LlppcEVycm9yQWN0aW9uPC9jPiBwcm9wZXJ0eSBvbiB0aGUKKyAgICAgICAgLy8vICAgIDxjPlppcEVudHJ5PC9jPiB0byA8Yz5aaXBFcnJvckFjdGlvbi5UaHJvdzwvYz4uKSBJZiB5b3Ugc2V0IHRoZQorICAgICAgICAvLy8gICAgPGM+WmlwRXJyb3JFdmVudEFyZ3MuQ2FuY2VsPC9jPiB0byB0cnVlLCB0aGUgZW50aXJlIDxjPlNhdmUoKTwvYz4gd2lsbCBiZQorICAgICAgICAvLy8gICAgY2FuY2VsZWQuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIEluIHRoZSBjYXNlIHRoYXQgeW91IHVzZSA8Yz5aaXBFcnJvckFjdGlvbi5Ta2lwPC9jPiwgaW1wbHlpbmcgdGhhdAorICAgICAgICAvLy8gICAgeW91IHdhbnQgdG8gc2tpcCB0aGUgZW50cnkgZm9yIHdoaWNoIHRoZXJlJ3MgYmVlbiBhbiBlcnJvciwgRG90TmV0WmlwCisgICAgICAgIC8vLyAgICB0cmllcyB0byBzZWVrIGJhY2t3YXJkcyBpbiB0aGUgb3V0cHV0IHN0cmVhbSwgYW5kIHRydW5jYXRlIGFsbCBieXRlcworICAgICAgICAvLy8gICAgd3JpdHRlbiBvbiBiZWhhbGYgb2YgdGhhdCBwYXJ0aWN1bGFyIGVudHJ5LiBUaGlzIHdvcmtzIG9ubHkgaWYgdGhlCisgICAgICAgIC8vLyAgICBvdXRwdXQgc3RyZWFtIGlzIHNlZWthYmxlLiAgSXQgd2lsbCBub3Qgd29yaywgZm9yIGV4YW1wbGUsIHdoZW4gdXNpbmcKKyAgICAgICAgLy8vICAgIEFTUE5FVCdzIFJlc3BvbnNlLk91dHB1dFN0cmVhbS4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGFuIGV2ZW50IGhhbmRsZXIgdG8gaGFuZGxlCisgICAgICAgIC8vLyBlcnJvcnMgZHVyaW5nIHNhdmUgb2YgdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIHB1YmxpYyBzdGF0aWMgdm9pZCBNeVppcEVycm9yKG9iamVjdCBzZW5kZXIsIFppcEVycm9yRXZlbnRBcmdzIGUpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHNhdmluZyB7MH0uLi4iLCBlLkZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgICBDb25zb2xlLldyaXRlTGluZSgiICAgRXhjZXB0aW9uOiB7MH0iLCBlLmV4Y2VwdGlvbik7CisgICAgICAgIC8vLyAgICAgWmlwRW50cnkgZW50cnkgPSBlLkN1cnJlbnRFbnRyeTsKKyAgICAgICAgLy8vICAgICBzdHJpbmcgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAvLy8gICAgIC8vIEFzayB0aGUgdXNlciB3aGV0aGVyIGhlIHdhbnRzIHRvIHNraXAgdGhpcyBlcnJvciBvciBub3QKKyAgICAgICAgLy8vICAgICBkbworICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZSgiUmV0cnksIFNraXAsIFRocm93LCBvciBDYW5jZWwgPyAoUi9TL1QvQykgIik7CisgICAgICAgIC8vLyAgICAgICAgIHJlc3BvbnNlID0gQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAvLy8gICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICB9IHdoaWxlIChyZXNwb25zZSAhPSBudWxsICZhbXA7JmFtcDsKKyAgICAgICAgLy8vICAgICAgICAgICAgICByZXNwb25zZVswXSE9J1MnICZhbXA7JmFtcDsgcmVzcG9uc2VbMF0hPSdzJyAmYW1wOyZhbXA7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgcmVzcG9uc2VbMF0hPSdSJyAmYW1wOyZhbXA7IHJlc3BvbnNlWzBdIT0ncicgJmFtcDsmYW1wOworICAgICAgICAvLy8gICAgICAgICAgICAgIHJlc3BvbnNlWzBdIT0nVCcgJmFtcDsmYW1wOyByZXNwb25zZVswXSE9J3QnICZhbXA7JmFtcDsKKyAgICAgICAgLy8vICAgICAgICAgICAgICByZXNwb25zZVswXSE9J0MnICZhbXA7JmFtcDsgcmVzcG9uc2VbMF0hPSdjJyk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIGUuQ2FuY2VsID0gKHJlc3BvbnNlWzBdPT0nQycgfHwgcmVzcG9uc2VbMF09PSdjJyk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIGlmIChyZXNwb25zZVswXT09J1MnIHx8IHJlc3BvbnNlWzBdPT0ncycpCisgICAgICAgIC8vLyAgICAgICAgIGVudHJ5LlppcEVycm9yQWN0aW9uID0gWmlwRXJyb3JBY3Rpb24uU2tpcDsKKyAgICAgICAgLy8vICAgICBlbHNlIGlmIChyZXNwb25zZVswXT09J1InIHx8IHJlc3BvbnNlWzBdPT0ncicpCisgICAgICAgIC8vLyAgICAgICAgIGVudHJ5LlppcEVycm9yQWN0aW9uID0gWmlwRXJyb3JBY3Rpb24uUmV0cnk7CisgICAgICAgIC8vLyAgICAgZWxzZSBpZiAocmVzcG9uc2VbMF09PSdUJyB8fCByZXNwb25zZVswXT09J3QnKQorICAgICAgICAvLy8gICAgICAgICBlbnRyeS5aaXBFcnJvckFjdGlvbiA9IFppcEVycm9yQWN0aW9uLlRocm93OworICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIHB1YmxpYyB2b2lkIFNhdmVUaGVGaWxlKCkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgc3RyaW5nIGRpcmVjdG9yeVRvWmlwID0gImZvZGRlciI7CisgICAgICAgIC8vLyAgIHN0cmluZyBkaXJlY3RvcnlJbkFyY2hpdmUgPSAiZmlsZXMiOworICAgICAgICAvLy8gICBzdHJpbmcgemlwRmlsZVRvQ3JlYXRlID0gIkFyY2hpdmUuemlwIjsKKyAgICAgICAgLy8vICAgdXNpbmcgKHZhciB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8gICB7CisgICAgICAgIC8vLyAgICAgLy8gc2V0IHRoZSBldmVudCBoYW5kbGVyIGJlZm9yZSBhZGRpbmcgYW55IGVudHJpZXMKKyAgICAgICAgLy8vICAgICB6aXAuWmlwRXJyb3IgKz0gTXlaaXBFcnJvcjsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRGlyZWN0b3J5KGRpcmVjdG9yeVRvWmlwLCBkaXJlY3RvcnlJbkFyY2hpdmUpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKHppcEZpbGVUb0NyZWF0ZSk7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBQcml2YXRlIFN1YiBNeVppcEVycm9yKEJ5VmFsIHNlbmRlciBBcyBPYmplY3QsIEJ5VmFsIGUgQXMgSW9uaWMuWmlwLlppcEVycm9yRXZlbnRBcmdzKQorICAgICAgICAvLy8gICAgICcgQXQgdGhpcyBwb2ludCwgdGhlIGFwcGxpY2F0aW9uIGNvdWxkIHByb21wdCB0aGUgdXNlciBmb3IgYW4gYWN0aW9uIHRvIHRha2UuCisgICAgICAgIC8vLyAgICAgJyBCdXQgaW4gdGhpcyBjYXNlLCB0aGlzIGFwcGxpY2F0aW9uIHdpbGwgc2ltcGx5IGF1dG9tYXRpY2FsbHkgc2tpcCB0aGUgZmlsZSwgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgICAgLy8vICAgICBDb25zb2xlLldyaXRlTGluZSgiWmlwIEVycm9yLCAgZW50cnkgezB9IiwgZS5DdXJyZW50RW50cnkuRmlsZU5hbWUpCisgICAgICAgIC8vLyAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgIEV4Y2VwdGlvbjogezB9IiwgZS5leGNlcHRpb24pCisgICAgICAgIC8vLyAgICAgJyBzZXQgdGhlIGRlc2lyZWQgWmlwRXJyb3JBY3Rpb24gb24gdGhlIEN1cnJlbnRFbnRyeSB0byBjb21tdW5pY2F0ZSB0aGF0IHRvIERvdE5ldFppcAorICAgICAgICAvLy8gICAgIGUuQ3VycmVudEVudHJ5LlppcEVycm9yQWN0aW9uID0gWmlwLlppcEVycm9yQWN0aW9uLlNraXAKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBQdWJsaWMgU3ViIFNhdmVUaGVGaWxlKCkKKyAgICAgICAgLy8vICAgICBEaW0gZGlyZWN0b3J5VG9aaXAgQXMgU3RyaW5nID0gImZvZGRlciIKKyAgICAgICAgLy8vICAgICBEaW0gZGlyZWN0b3J5SW5BcmNoaXZlIEFzIFN0cmluZyA9ICJmaWxlcyIKKyAgICAgICAgLy8vICAgICBEaW0gemlwRmlsZVRvQ3JlYXRlIGFzIFN0cmluZyA9ICJBcmNoaXZlLnppcCIKKyAgICAgICAgLy8vICAgICBVc2luZyB6aXBBcmNoaXZlIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgICAgICAnIHNldCB0aGUgZXZlbnQgaGFuZGxlciBiZWZvcmUgYWRkaW5nIGFueSBlbnRyaWVzCisgICAgICAgIC8vLyAgICAgICAgIEFkZEhhbmRsZXIgemlwQXJjaGl2ZS5aaXBFcnJvciwgQWRkcmVzc09mIE15WmlwRXJyb3IKKyAgICAgICAgLy8vICAgICAgICAgemlwQXJjaGl2ZS5BZGREaXJlY3RvcnkoZGlyZWN0b3J5VG9aaXAsIGRpcmVjdG9yeUluQXJjaGl2ZSkKKyAgICAgICAgLy8vICAgICAgICAgemlwQXJjaGl2ZS5TYXZlKHppcEZpbGVUb0NyZWF0ZSkKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuWmlwRXJyb3JBY3Rpb24iLz4KKyAgICAgICAgaW50ZXJuYWwgZXZlbnQgRXZlbnRIYW5kbGVyPFppcEVycm9yRXZlbnRBcmdzPiBaaXBFcnJvcjsKKworICAgICAgICBpbnRlcm5hbCBib29sIE9uWmlwRXJyb3JTYXZpbmcoWmlwRW50cnkgZW50cnksIEV4Y2VwdGlvbiBleGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChaaXBFcnJvciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2sgKExPQ0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFppcEVycm9yRXZlbnRBcmdzLlNhdmluZyh0aGlzLk5hbWUsIGVudHJ5LCBleGMpOworICAgICAgICAgICAgICAgICAgICBaaXBFcnJvcih0aGlzLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuQ2FuY2VsKQorICAgICAgICAgICAgICAgICAgICAgICAgX3NhdmVPcGVyYXRpb25DYW5jZWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9zYXZlT3BlcmF0aW9uQ2FuY2VsZWQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5FeHRyYWN0LmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5FeHRyYWN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDg2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLkV4dHJhY3QuY3MKQEAgLTAsMCArMSwyOTggQEAKKy8vIFppcEZpbGUuRXh0cmFjdC5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5IERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTMxIDE0OjQ1OjE4PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgZm9yIEV4dHJhY3Qgb3BlcmF0aW9ucyBvbiB6aXAgZmlsZXMuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFppcEZpbGUKKyAgICB7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRXh0cmFjdHMgYWxsIG9mIHRoZSBpdGVtcyBpbiB0aGUgemlwIGFyY2hpdmUsIHRvIHRoZSBzcGVjaWZpZWQgcGF0aCBpbiB0aGUKKyAgICAgICAgLy8vIGZpbGVzeXN0ZW0uICBUaGUgcGF0aCBjYW4gYmUgcmVsYXRpdmUgb3IgZnVsbHktcXVhbGlmaWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIHdpbGwgZXh0cmFjdCBhbGwgZW50cmllcyBpbiB0aGUgPGM+WmlwRmlsZTwvYz4gdG8gdGhlCisgICAgICAgIC8vLyAgIHNwZWNpZmllZCBwYXRoLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiBhbiBleHRyYWN0aW9uIG9mIGEgZmlsZSBmcm9tIHRoZSB6aXAgYXJjaGl2ZSB3b3VsZCBvdmVyd3JpdGUgYW4KKyAgICAgICAgLy8vICAgZXhpc3RpbmcgZmlsZSBpbiB0aGUgZmlsZXN5c3RlbSwgdGhlIGFjdGlvbiB0YWtlbiBpcyBkaWN0YXRlZCBieSB0aGUKKyAgICAgICAgLy8vICAgRXh0cmFjdEV4aXN0aW5nRmlsZSBwcm9wZXJ0eSwgd2hpY2ggb3ZlcnJpZGVzIGFueSBzZXR0aW5nIHlvdSBtYXkgaGF2ZQorICAgICAgICAvLy8gICBtYWRlIG9uIGluZGl2aWR1YWwgWmlwRW50cnkgaW5zdGFuY2VzLiAgQnkgZGVmYXVsdCwgaWYgeW91IGhhdmUgbm90CisgICAgICAgIC8vLyAgIHNldCB0aGF0IHByb3BlcnR5IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSwgdGhlIGVudHJ5IHdpbGwgbm90CisgICAgICAgIC8vLyAgIGJlIGV4dHJhY3RlZCwgdGhlIGV4aXN0aW5nIGZpbGUgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYW5kIGFuCisgICAgICAgIC8vLyAgIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gVG8gY2hhbmdlIHRoaXMsIHNldCB0aGUgcHJvcGVydHksIG9yIHVzZSB0aGUKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBGaWxlLkV4dHJhY3RBbGwoc3RyaW5nLAorICAgICAgICAvLy8gICBJb25pYy5aaXAuRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbikiIC8+IG92ZXJsb2FkIHRoYXQgYWxsb3dzIHlvdSB0bworICAgICAgICAvLy8gICBzcGVjaWZ5IGFuIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24gcGFyYW1ldGVyLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgYWN0aW9uIHRvIHRha2Ugd2hlbiBhbiBleHRyYWN0IHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlCisgICAgICAgIC8vLyAgIGFwcGxpZXMgdG8gYWxsIGVudHJpZXMuICBJZiB5b3Ugd2FudCB0byBzZXQgdGhpcyBvbiBhIHBlci1lbnRyeSBiYXNpcywKKyAgICAgICAgLy8vICAgdGhlbiB5b3UgbXVzdCB1c2Ugb25lIG9mIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5LkV4dHJhY3QoKSI+WmlwRW50cnkuRXh0cmFjdDwvc2VlPiBtZXRob2RzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCB3aWxsIHNlbmQgdmVyYm9zZSBvdXRwdXQgbWVzc2FnZXMgdG8gdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIiLz4sIGlmIGl0IGlzIHNldCBvbiB0aGUgPGM+WmlwRmlsZTwvYz4KKyAgICAgICAgLy8vICAgaW5zdGFuY2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBZb3UgbWF5IHdpc2ggdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIDxjPkV4dHJhY3RQcm9ncmVzczwvYz4gZXZlbnQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFib3V0IHRpbWVzdGFtcHM6IFdoZW4gZXh0cmFjdGluZyBhIGZpbGUgZW50cnkgZnJvbSBhIHppcCBhcmNoaXZlLCB0aGUKKyAgICAgICAgLy8vICAgZXh0cmFjdGVkIGZpbGUgZ2V0cyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSBlbnRyeSBhcyBzdG9yZWQgaW4KKyAgICAgICAgLy8vICAgdGhlIGFyY2hpdmUuIFRoZSBhcmNoaXZlIG1heSBhbHNvIHN0b3JlIGV4dGVuZGVkIGZpbGUgdGltZXN0YW1wCisgICAgICAgIC8vLyAgIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgbGFzdCBhY2Nlc3NlZCBhbmQgY3JlYXRlZCB0aW1lcy4gSWYgdGhlc2UgYXJlCisgICAgICAgIC8vLyAgIHByZXNlbnQgaW4gdGhlIDxjPlppcEVudHJ5PC9jPiwgdGhlbiB0aGUgZXh0cmFjdGVkIGZpbGUgd2lsbCBhbHNvIGdldAorICAgICAgICAvLy8gICB0aGVzZSB0aW1lcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQSBEaXJlY3RvcnkgZW50cnkgaXMgc29tZXdoYXQgZGlmZmVyZW50LiBJdCB3aWxsIGdldCB0aGUgdGltZXMgYXMKKyAgICAgICAgLy8vICAgZGVzY3JpYmVkIGZvciBhIGZpbGUgZW50cnksIGJ1dCwgaWYgdGhlcmUgYXJlIGZpbGUgZW50cmllcyBpbiB0aGUgemlwCisgICAgICAgIC8vLyAgIGFyY2hpdmUgdGhhdCwgd2hlbiBleHRyYWN0ZWQsIGFwcGVhciBpbiB0aGUganVzdC1jcmVhdGVkIGRpcmVjdG9yeSwKKyAgICAgICAgLy8vICAgdGhlbiB3aGVuIHRob3NlIGZpbGUgZW50cmllcyBhcmUgZXh0cmFjdGVkLCB0aGUgbGFzdCBtb2RpZmllZCBhbmQgbGFzdAorICAgICAgICAvLy8gICBhY2Nlc3NlZCB0aW1lcyBvZiB0aGUgZGlyZWN0b3J5IHdpbGwgY2hhbmdlLCBhcyBhIHNpZGUgZWZmZWN0LiAgVGhlCisgICAgICAgIC8vLyAgIHJlc3VsdCBpcyB0aGF0IGFmdGVyIGFuIGV4dHJhY3Rpb24gb2YgYSBkaXJlY3RvcnkgYW5kIGEgbnVtYmVyIG9mCisgICAgICAgIC8vLyAgIGZpbGVzIHdpdGhpbiB0aGUgZGlyZWN0b3J5LCB0aGUgbGFzdCBtb2RpZmllZCBhbmQgbGFzdCBhY2Nlc3NlZAorICAgICAgICAvLy8gICB0aW1lc3RhbXBzIG9uIHRoZSBkaXJlY3Rvcnkgd2lsbCByZWZsZWN0IHRoZSB0aW1lIHRoYXQgdGhlIGxhc3QgZmlsZQorICAgICAgICAvLy8gICB3YXMgZXh0cmFjdGVkIGludG8gdGhlIGRpcmVjdG9yeSwgcmF0aGVyIHRoYW4gdGhlIHRpbWUgc3RvcmVkIGluIHRoZQorICAgICAgICAvLy8gICB6aXAgYXJjaGl2ZSBmb3IgdGhlIGRpcmVjdG9yeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG8gY29tcGVuc2F0ZSwgd2hlbiBleHRyYWN0aW5nIGFuIGFyY2hpdmUgd2l0aCA8Yz5FeHRyYWN0QWxsPC9jPiwKKyAgICAgICAgLy8vICAgRG90TmV0WmlwIHdpbGwgZXh0cmFjdCBhbGwgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBlbnRyaWVzIGFzIGRlc2NyaWJlZAorICAgICAgICAvLy8gICBhYm92ZSwgYnV0IGl0IHdpbGwgdGhlbiBtYWtlIGEgc2Vjb25kIHBhc3Mgb24gdGhlIGRpcmVjdG9yaWVzLCBhbmQKKyAgICAgICAgLy8vICAgcmVzZXQgdGhlIHRpbWVzIG9uIHRoZSBkaXJlY3RvcmllcyB0byByZWZsZWN0IHdoYXQgaXMgc3RvcmVkIGluIHRoZQorICAgICAgICAvLy8gICB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBjb21wZW5zYXRpb24gaXMgcGVyZm9ybWVkIG9ubHkgd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuCisgICAgICAgIC8vLyAgIDxjPkV4dHJhY3RBbGw8L2M+LiBJZiB5b3UgY2FsbCA8Yz5aaXBFbnRyeS5FeHRyYWN0PC9jPiBvbiBhIGRpcmVjdG9yeQorICAgICAgICAvLy8gICBlbnRyeSwgdGhlIHRpbWVzdGFtcHMgb24gZGlyZWN0b3J5IGluIHRoZSBmaWxlc3lzdGVtIHdpbGwgcmVmbGVjdCB0aGUKKyAgICAgICAgLy8vICAgdGltZXMgc3RvcmVkIGluIHRoZSB6aXAuICBJZiB5b3UgdGhlbiBjYWxsIDxjPlppcEVudHJ5LkV4dHJhY3Q8L2M+IG9uCisgICAgICAgIC8vLyAgIGEgZmlsZSBlbnRyeSwgd2hpY2ggaXMgZXh0cmFjdGVkIGludG8gdGhlIGRpcmVjdG9yeSwgdGhlIHRpbWVzdGFtcHMgb24KKyAgICAgICAgLy8vICAgdGhlIGRpcmVjdG9yeSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIGV4dHJhY3RzIGFsbCB0aGUgZW50cmllcyBpbiBhIHppcCBhcmNoaXZlIGZpbGUsIHRvIHRoZQorICAgICAgICAvLy8gICBzcGVjaWZpZWQgdGFyZ2V0IGRpcmVjdG9yeS4gIFRoZSBleHRyYWN0aW9uIHdpbGwgb3ZlcndyaXRlIGFueQorICAgICAgICAvLy8gICBleGlzdGluZyBmaWxlcyBzaWxlbnRseS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIFN0cmluZyBUYXJnZXREaXJlY3Rvcnk9ICJ1bnBhY2siOworICAgICAgICAvLy8gdXNpbmcoWmlwRmlsZSB6aXA9IFppcEZpbGUuUmVhZChaaXBGaWxlVG9FeHRyYWN0KSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuRXh0cmFjdEV4aXN0aW5nRmlsZT0gRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5PdmVyd3JpdGVTaWxlbnRseTsKKyAgICAgICAgLy8vICAgICB6aXAuRXh0cmFjdEFsbChUYXJnZXREaXJlY3RvcnkpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIERpbSBUYXJnZXREaXJlY3RvcnkgQXMgU3RyaW5nID0gInVucGFjayIKKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKFppcEZpbGVUb0V4dHJhY3QpCisgICAgICAgIC8vLyAgICAgemlwLkV4dHJhY3RFeGlzdGluZ0ZpbGU9IEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uT3ZlcndyaXRlU2lsZW50bHkKKyAgICAgICAgLy8vICAgICB6aXAuRXh0cmFjdEFsbChUYXJnZXREaXJlY3RvcnkpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5FeHRyYWN0UHJvZ3Jlc3MiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGF0aCI+CisgICAgICAgIC8vLyAgIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiB0aGUgemlwZmlsZSB3aWxsIGJlIGV4dHJhY3RlZC4KKyAgICAgICAgLy8vICAgVGhlIHBhdGggY2FuIGJlIHJlbGF0aXZlIG9yIGZ1bGx5LXF1YWxpZmllZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgdm9pZCBFeHRyYWN0QWxsKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBfSW50ZXJuYWxFeHRyYWN0QWxsKHBhdGgsIHRydWUpOworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEV4dHJhY3RzIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIHppcCBhcmNoaXZlLCB0byB0aGUgc3BlY2lmaWVkIHBhdGggaW4gdGhlCisgICAgICAgIC8vLyBmaWxlc3lzdGVtLCB1c2luZyB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIHdoZW4gZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4KKyAgICAgICAgLy8vIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIGV4dHJhY3QgYWxsIGVudHJpZXMgaW4gdGhlIDxjPlppcEZpbGU8L2M+IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vIHBhdGguICBGb3IgYW4gZXh0cmFjdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLCB0aGUgYmVoYXZpb3IKKyAgICAgICAgLy8vIGlzIGRpY3RhdGVkIGJ5IDxwYXJhbXJlZiBuYW1lPSJleHRyYWN0RXhpc3RpbmdGaWxlIi8+LCB3aGljaCBvdmVycmlkZXMgYW55CisgICAgICAgIC8vLyBzZXR0aW5nIHlvdSBtYXkgaGF2ZSBtYWRlIG9uIGluZGl2aWR1YWwgWmlwRW50cnkgaW5zdGFuY2VzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhlIGFjdGlvbiB0byB0YWtlIHdoZW4gYW4gZXh0cmFjdCB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZQorICAgICAgICAvLy8gYXBwbGllcyB0byBhbGwgZW50cmllcy4gIElmIHlvdSB3YW50IHRvIHNldCB0aGlzIG9uIGEgcGVyLWVudHJ5IGJhc2lzLAorICAgICAgICAvLy8gdGhlbiB5b3UgbXVzdCB1c2UgPHNlZSBjcmVmPSJaaXBFbnRyeS5FeHRyYWN0KFN0cmluZywKKyAgICAgICAgLy8vIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24pIiAvPiBvciBvbmUgb2YgdGhlIHNpbWlsYXIgbWV0aG9kcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSA8c2VlCisgICAgICAgIC8vLyBjcmVmPSJFeHRyYWN0RXhpc3RpbmdGaWxlIi8+IHByb3BlcnR5IGFuZCB0aGVuIGNhbGxpbmcgPHNlZQorICAgICAgICAvLy8gY3JlZj0iRXh0cmFjdEFsbChTdHJpbmcpIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2Qgd2lsbCBzZW5kIHZlcmJvc2Ugb3V0cHV0IG1lc3NhZ2VzIHRvIHRoZQorICAgICAgICAvLy8gPHNlZSBjcmVmPSJTdGF0dXNNZXNzYWdlVGV4dFdyaXRlciIvPiwgaWYgaXQgaXMgc2V0IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBleHRyYWN0cyBhbGwgdGhlIGVudHJpZXMgaW4gYSB6aXAgYXJjaGl2ZSBmaWxlLCB0byB0aGUKKyAgICAgICAgLy8vIHNwZWNpZmllZCB0YXJnZXQgZGlyZWN0b3J5LiAgSXQgZG9lcyBub3Qgb3ZlcndyaXRlIGFueSBleGlzdGluZyBmaWxlcy4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gU3RyaW5nIFRhcmdldERpcmVjdG9yeT0gImM6XFx1bnBhY2siOworICAgICAgICAvLy8gdXNpbmcoWmlwRmlsZSB6aXA9IFppcEZpbGUuUmVhZChaaXBGaWxlVG9FeHRyYWN0KSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgemlwLkV4dHJhY3RBbGwoVGFyZ2V0RGlyZWN0b3J5LCBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLkRvbnRPdmVyd3JpdGUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIERpbSBUYXJnZXREaXJlY3RvcnkgQXMgU3RyaW5nID0gImM6XHVucGFjayIKKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKFppcEZpbGVUb0V4dHJhY3QpCisgICAgICAgIC8vLyAgICAgemlwLkV4dHJhY3RBbGwoVGFyZ2V0RGlyZWN0b3J5LCBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uLkRvbnRPdmVyd3JpdGUpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGF0aCI+CisgICAgICAgIC8vLyBUaGUgcGF0aCB0byB3aGljaCB0aGUgY29udGVudHMgb2YgdGhlIHppcGZpbGUgd2lsbCBiZSBleHRyYWN0ZWQuCisgICAgICAgIC8vLyBUaGUgcGF0aCBjYW4gYmUgcmVsYXRpdmUgb3IgZnVsbHktcXVhbGlmaWVkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXh0cmFjdEV4aXN0aW5nRmlsZSI+CisgICAgICAgIC8vLyBUaGUgYWN0aW9uIHRvIHRha2UgaWYgZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKFN0cmluZyxFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uKSIvPgorICAgICAgICBpbnRlcm5hbCB2b2lkIEV4dHJhY3RBbGwoc3RyaW5nIHBhdGgsIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24gZXh0cmFjdEV4aXN0aW5nRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXh0cmFjdEV4aXN0aW5nRmlsZSA9IGV4dHJhY3RFeGlzdGluZ0ZpbGU7CisgICAgICAgICAgICBfSW50ZXJuYWxFeHRyYWN0QWxsKHBhdGgsIHRydWUpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgX0ludGVybmFsRXh0cmFjdEFsbChzdHJpbmcgcGF0aCwgYm9vbCBvdmVycmlkZUV4dHJhY3RFeGlzdGluZ1Byb3BlcnR5KQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGhlYWRlciA9IFZlcmJvc2U7CisgICAgICAgICAgICBfaW5FeHRyYWN0QWxsID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9uRXh0cmFjdEFsbFN0YXJ0ZWQocGF0aCk7CisKKyAgICAgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZSBpbiBfZW50cmllcy5WYWx1ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoIlxuezEsLTIyfSB7MiwtOH0gezMsNH0gICB7NCwtOH0gIHswfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUiLCAiTW9kaWZpZWQiLCAiU2l6ZSIsICJSYXRpbyIsICJQYWNrZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZShuZXcgU3lzdGVtLlN0cmluZygnLScsIDcyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoVmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJ7MSwtMjJ9IHsyLC04fSB7Myw0OkYwfSUgICB7NCwtOH0gezB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuTGFzdE1vZGlmaWVkLlRvU3RyaW5nKCJ5eXl5LU1NLWRkIEhIOm1tOnNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5VbmNvbXByZXNzZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuQ29tcHJlc3Npb25SYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLkNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoZS5Db21tZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoIiAgQ29tbWVudDogezB9IiwgZS5Db21tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlLlBhc3N3b3JkID0gX1Bhc3N3b3JkOyAgLy8gdGhpcyBtYXkgYmUgbnVsbAorICAgICAgICAgICAgICAgICAgICBPbkV4dHJhY3RFbnRyeShuLCB0cnVlLCBlLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlRXh0cmFjdEV4aXN0aW5nUHJvcGVydHkpCisgICAgICAgICAgICAgICAgICAgICAgICBlLkV4dHJhY3RFeGlzdGluZ0ZpbGUgPSB0aGlzLkV4dHJhY3RFeGlzdGluZ0ZpbGU7CisgICAgICAgICAgICAgICAgICAgIGUuRXh0cmFjdChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgICAgICBPbkV4dHJhY3RFbnRyeShuLCBmYWxzZSwgZSwgcGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXh0cmFjdE9wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfZXh0cmFjdE9wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gODI2NDoKKyAgICAgICAgICAgICAgICAgICAgLy8gbm93LCBzZXQgdGltZXMgb24gZGlyZWN0b3J5IGVudHJpZXMsIGFnYWluLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvYmxlbSBpcywgZXh0cmFjdGluZyBhIGZpbGUgY2hhbmdlcyB0aGUgdGltZXMgb24gdGhlIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkuICBTbyBhZnRlciBhbGwgZmlsZXMgaGF2ZSBiZWVuIGV4dHJhY3RlZCwgd2UgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAvLyBydW4gdGhyb3VnaCB0aGUgZGlyZWN0b3JpZXMgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gX2VudHJpZXMuVmFsdWVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBpcyBhIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlLklzRGlyZWN0b3J5KSB8fCAoZS5GaWxlTmFtZS5FbmRzV2l0aCgiLyIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IChlLkZpbGVOYW1lLlN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQYXRoLkNvbWJpbmUocGF0aCwgZS5GaWxlTmFtZS5TdWJzdHJpbmcoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUGF0aC5Db21iaW5lKHBhdGgsIGUuRmlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fU2V0VGltZXMob3V0cHV0RmlsZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE9uRXh0cmFjdEFsbENvbXBsZXRlZChwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIF9pbkV4dHJhY3RBbGwgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLlJlYWQuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLlJlYWQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlZDBiNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuUmVhZC5jcwpAQCAtMCwwICsxLDExMTAgQEAKKy8vIFppcEZpbGUuUmVhZC5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgRGlubyBDaGllc2EuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKToKKy8vIFRpbWUtc3RhbXA6IDwyMDExLUF1Z3VzdC0wNSAxMTozODo1OT4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGZvciBSZWFkaW5nIHppcCBmaWxlcy4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgQSBjbGFzcyBmb3IgY29sbGVjdGluZyB0aGUgdmFyaW91cyBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgd2hlbgorICAgIC8vLyAgIFJlYWRpbmcgemlwIGZpbGVzIGZvciBleHRyYWN0aW9uIG9yIHVwZGF0ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gICA8cGFyYT4KKyAgICAvLy8gICAgIFdoZW4gcmVhZGluZyBhIHppcCBmaWxlLCB0aGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zIGFuCisgICAgLy8vICAgICBhcHBsaWNhdGlvbiBjYW4gc2V0LCB0byBtb2RpZnkgaG93IHRoZSBmaWxlIGlzIHJlYWQsIG9yIHdoYXQKKyAgICAvLy8gICAgIHRoZSBsaWJyYXJ5IGRvZXMgd2hpbGUgcmVhZGluZy4gIFRoaXMgY2xhc3MgY29sbGVjdHMgdGhvc2UKKyAgICAvLy8gICAgIG9wdGlvbnMgaW50byBvbmUgY29udGFpbmVyLgorICAgIC8vLyAgIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gICA8cGFyYT4KKyAgICAvLy8gICAgIFBhc3MgYW4gaW5zdGFuY2Ugb2YgdGhlIDxjPlJlYWRPcHRpb25zPC9jPiBjbGFzcyBpbnRvIHRoZQorICAgIC8vLyAgICAgPGM+WmlwRmlsZS5SZWFkKCk8L2M+IG1ldGhvZC4KKyAgICAvLy8gICA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEZpbGUuUmVhZChTdHJpbmcsIFJlYWRPcHRpb25zKSIvPi4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRmlsZS5SZWFkKFN0cmVhbSwgUmVhZE9wdGlvbnMpIi8+LgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgaW50ZXJuYWwgY2xhc3MgUmVhZE9wdGlvbnMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuIGV2ZW50IGhhbmRsZXIgZm9yIFJlYWQgb3BlcmF0aW9ucy4gIFdoZW4gb3BlbmluZyBsYXJnZSB6aXAKKyAgICAgICAgLy8vIGFyY2hpdmVzLCB5b3UgbWF5IHdhbnQgdG8gZGlzcGxheSBhIHByb2dyZXNzIGJhciBvciBvdGhlcgorICAgICAgICAvLy8gaW5kaWNhdG9yIG9mIHN0YXR1cyBwcm9ncmVzcyB3aGlsZSByZWFkaW5nLiAgVGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgLy8vIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIFJlYWRQcm9ncmVzcyBFdmVudCBIYW5kbGVyIGRpcmVjdGx5LgorICAgICAgICAvLy8gV2hlbiB5b3UgY2FsbCA8Yz5SZWFkKCk8L2M+LCB0aGUgcHJvZ3Jlc3MgZXZlbnQgaXMgaW52b2tlZCBhcworICAgICAgICAvLy8gbmVjZXNzYXJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXZlbnRIYW5kbGVyPFJlYWRQcm9ncmVzc0V2ZW50QXJncz4gUmVhZFByb2dyZXNzIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgPGM+U3lzdGVtLklPLlRleHRXcml0ZXI8L2M+IHRvIHVzZSBmb3Igd3JpdGluZyB2ZXJib3NlIHN0YXR1cyBtZXNzYWdlcworICAgICAgICAvLy8gZHVyaW5nIG9wZXJhdGlvbnMgb24gdGhlIHppcCBhcmNoaXZlLiAgQSBjb25zb2xlIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvCisgICAgICAgIC8vLyBwYXNzIDxjPlN5c3RlbS5Db25zb2xlLk91dDwvYz4gdG8gZ2V0IG1lc3NhZ2VzIG9uIHRoZSBDb25zb2xlLiBBIGdyYXBoaWNhbAorICAgICAgICAvLy8gb3IgaGVhZGxlc3MgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gY2FwdHVyZSB0aGUgbWVzc2FnZXMgaW4gYSBkaWZmZXJlbnQKKyAgICAgICAgLy8vIDxjPlRleHRXcml0ZXI8L2M+LCBzdWNoIGFzIGEgPGM+U3lzdGVtLklPLlN0cmluZ1dyaXRlcjwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUZXh0V3JpdGVyIFN0YXR1c01lc3NhZ2VXcml0ZXIgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSA8Yz5TeXN0ZW0uVGV4dC5FbmNvZGluZzwvYz4gdG8gdXNlIHdoZW4gcmVhZGluZyBpbiB0aGUgemlwIGFyY2hpdmUuIEJlCisgICAgICAgIC8vLyBjYXJlZnVsIHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nLiAgSWYgdGhlIHZhbHVlIHlvdSB1c2UgaGVyZSBpcyBub3QgdGhlIHNhbWUKKyAgICAgICAgLy8vIGFzIHRoZSBFbmNvZGluZyB1c2VkIHdoZW4gdGhlIHppcCBhcmNoaXZlIHdhcyBjcmVhdGVkIChwb3NzaWJseSBieSBhCisgICAgICAgIC8vLyBkaWZmZXJlbnQgYXJjaGl2ZXIpIHlvdSB3aWxsIGdldCB1bmV4cGVjdGVkIHJlc3VsdHMgYW5kIHBvc3NpYmx5IGV4Y2VwdGlvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRmlsZS5Qcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgQEVuY29kaW5nIHsgZ2V0OyBzZXQ7IH0KKyAgICB9CisKKworICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgWmlwRmlsZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgYSB6aXAgZmlsZSBhcmNoaXZlIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhlIHN0cmVhbSBpcyByZWFkIHVzaW5nIHRoZSBkZWZhdWx0IDxjPlN5c3RlbS5UZXh0LkVuY29kaW5nPC9jPiwgd2hpY2ggaXMgdGhlCisgICAgICAgIC8vLyA8Yz5JQk00Mzc8L2M+IGNvZGVwYWdlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkV4Y2VwdGlvbiI+CisgICAgICAgIC8vLyBUaHJvd24gaWYgdGhlIDxjPlppcEZpbGU8L2M+IGNhbm5vdCBiZSByZWFkLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QKKyAgICAgICAgLy8vIHJlbGllcyBvbiA8Yz5TeXN0ZW0uSU8uRmlsZS5PcGVuUmVhZDwvYz4sIHdoaWNoIGNhbiB0aHJvdyBhIHZhcmlldHkgb2YgZXhjZXB0aW9ucywKKyAgICAgICAgLy8vIGluY2x1ZGluZyBzcGVjaWZpYyBleGNlcHRpb25zIGlmIGEgZmlsZSBpcyBub3QgZm91bmQsIGFuIHVuYXV0aG9yaXplZCBhY2Nlc3MKKyAgICAgICAgLy8vIGV4Y2VwdGlvbiwgZXhjZXB0aW9ucyBmb3IgcG9vcmx5IGZvcm1hdHRlZCBmaWxlbmFtZXMsIGFuZCBzbyBvbi4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgemlwIGFyY2hpdmUgdG8gb3Blbi4gIFRoaXMgY2FuIGJlIGEgZnVsbHktcXVhbGlmaWVkIG9yIHJlbGF0aXZlCisgICAgICAgIC8vLyBwYXRobmFtZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRmlsZS5SZWFkKFN0cmluZywgUmVhZE9wdGlvbnMpIi8+LgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBpbnN0YW5jZSByZWFkIGZyb20gdGhlIHppcCBhcmNoaXZlLjwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWmlwRmlsZSBSZWFkKHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFppcEZpbGUuUmVhZChmaWxlTmFtZSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmVhZHMgYSB6aXAgZmlsZSBhcmNoaXZlIGZyb20gdGhlIG5hbWVkIGZpbGVzeXN0ZW0gZmlsZSB1c2luZyB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIG9wdGlvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSA8Yz5SZWFkKCk8L2M+IG1ldGhvZCBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzCisgICAgICAgIC8vLyAgIGluIGEgPGM+VGV4dFdyaXRlcjwvYz4gYW4gPGM+RW5jb2Rpbmc8L2M+LCB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhlCisgICAgICAgIC8vLyAgIDxjPlJlYWRPcHRpb25zPC9jPiBjbGFzcy4gIFRoZSA8Yz5aaXBGaWxlPC9jPiBpcyByZWFkIGluIHVzaW5nIHRoZQorICAgICAgICAvLy8gICBzcGVjaWZpZWQgZW5jb2RpbmcgZm9yIGVudHJpZXMgd2hlcmUgVVRGLTggZW5jb2RpbmcgaXMgbm90CisgICAgICAgIC8vLyAgIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHJlYWQgYSB6aXAgZmlsZSB1c2luZyB0aGUgQmlnLTUgQ2hpbmVzZQorICAgICAgICAvLy8gICBjb2RlIHBhZ2UgKDk1MCksIGFuZCBleHRyYWN0IGVhY2ggZW50cnkgaW4gdGhlIHppcCBmaWxlLCB3aGlsZQorICAgICAgICAvLy8gICBzZW5kaW5nIHN0YXR1cyBtZXNzYWdlcyBvdXQgdG8gdGhlIENvbnNvbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciB0aGlzIGNvZGUgdG8gd29yayBhcyBpbnRlbmRlZCwgdGhlIHppcGZpbGUgbXVzdCBoYXZlIGJlZW4KKyAgICAgICAgLy8vICAgY3JlYXRlZCB1c2luZyB0aGUgYmlnNSBjb2RlIHBhZ2UgKENQOTUwKS4gVGhpcyBpcyB0eXBpY2FsLCBmb3IKKyAgICAgICAgLy8vICAgZXhhbXBsZSwgd2hlbiB1c2luZyBXaW5SYXIgb24gYSBtYWNoaW5lIHdpdGggQ1A5NTAgc2V0IGFzIHRoZQorICAgICAgICAvLy8gICBkZWZhdWx0IGNvZGUgcGFnZS4gIEluIHRoYXQgY2FzZSwgdGhlIG5hbWVzIG9mIGVudHJpZXMgd2l0aGluIHRoZQorICAgICAgICAvLy8gICBaaXAgYXJjaGl2ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0IGNvZGUgcGFnZSwgYW5kIHJlYWRpbmcgdGhlIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlIG11c3QgYmUgZG9uZSB1c2luZyB0aGF0IGNvZGUgcGFnZS4gIElmIHRoZSBhcHBsaWNhdGlvbiBkaWQKKyAgICAgICAgLy8vICAgbm90IHVzZSB0aGUgY29ycmVjdCBjb2RlIHBhZ2UgaW4gWmlwRmlsZS5SZWFkKCksIHRoZW4gbmFtZXMgb2YKKyAgICAgICAgLy8vICAgZW50cmllcyB3aXRoaW4gdGhlIHppcCBhcmNoaXZlIHdvdWxkIG5vdCBiZSBjb3JyZWN0bHkgcmV0cmlldmVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHN0cmluZyB6aXBUb0V4dHJhY3QgPSAiTXlBcmNoaXZlLnppcCI7CisgICAgICAgIC8vLyBzdHJpbmcgZXh0cmFjdERpcmVjdG9yeSA9ICJleHRyYWN0IjsKKyAgICAgICAgLy8vIHZhciBvcHRpb25zID0gbmV3IFJlYWRPcHRpb25zCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIFN0YXR1c01lc3NhZ2VXcml0ZXIgPSBTeXN0ZW0uQ29uc29sZS5PdXQsCisgICAgICAgIC8vLyAgIEVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoOTUwKQorICAgICAgICAvLy8gfTsKKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBUb0V4dHJhY3QsIG9wdGlvbnMpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICBmb3JlYWNoIChaaXBFbnRyeSBlIGluIHppcCkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgICBlLkV4dHJhY3QoZXh0cmFjdERpcmVjdG9yeSk7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gRGltIHppcFRvRXh0cmFjdCBhcyBTdHJpbmcgPSAiTXlBcmNoaXZlLnppcCIKKyAgICAgICAgLy8vIERpbSBleHRyYWN0RGlyZWN0b3J5IGFzIFN0cmluZyA9ICJleHRyYWN0IgorICAgICAgICAvLy8gRGltIG9wdGlvbnMgYXMgTmV3IFJlYWRPcHRpb25zCisgICAgICAgIC8vLyBvcHRpb25zLkVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoOTUwKQorICAgICAgICAvLy8gb3B0aW9ucy5TdGF0dXNNZXNzYWdlV3JpdGVyID0gU3lzdGVtLkNvbnNvbGUuT3V0CisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IFppcEZpbGUuUmVhZCh6aXBUb0V4dHJhY3QsIG9wdGlvbnMpCisgICAgICAgIC8vLyAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICBGb3IgRWFjaCBlIEluIHppcAorICAgICAgICAvLy8gICAgICBlLkV4dHJhY3QoZXh0cmFjdERpcmVjdG9yeSkKKyAgICAgICAgLy8vICAgICBOZXh0CisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVhZCBhIHppcCBmaWxlIHVzaW5nIHRoZSBkZWZhdWx0CisgICAgICAgIC8vLyAgIGNvZGUgcGFnZSwgdG8gcmVtb3ZlIGVudHJpZXMgdGhhdCBoYXZlIGEgbW9kaWZpZWQgZGF0ZSBiZWZvcmUgYSBnaXZlbiB0aHJlc2hvbGQsCisgICAgICAgIC8vLyAgIHNlbmRpbmcgc3RhdHVzIG1lc3NhZ2VzIG91dCB0byBhIDxjPlN0cmluZ1dyaXRlcjwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdmFyIG9wdGlvbnMgPSBuZXcgUmVhZE9wdGlvbnMKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgU3RhdHVzTWVzc2FnZVdyaXRlciA9IG5ldyBTeXN0ZW0uSU8uU3RyaW5nV3JpdGVyKCkKKyAgICAgICAgLy8vIH07CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSAgWmlwRmlsZS5SZWFkKCJQYWNrZWREb2N1bWVudHMuemlwIiwgb3B0aW9ucykpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHZhciBUaHJlc2hvbGQgPSBuZXcgRGF0ZVRpbWUoMjAwNyw3LDQpOworICAgICAgICAvLy8gICAvLyBXZSBjYW5ub3QgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LCB3aXRoaW4gdGhlIGNvbnRleHQgb2YKKyAgICAgICAgLy8vICAgLy8gYW4gZW51bWVyYXRpb24gb2Ygc2FpZCBsaXN0LgorICAgICAgICAvLy8gICAvLyBTbyB3ZSBhZGQgdGhlIGRvb21lZCBlbnRyeSB0byBhIGxpc3QgdG8gYmUgcmVtb3ZlZCBsYXRlci4KKyAgICAgICAgLy8vICAgLy8gcGFzcyAxOiBtYXJrIHRoZSBlbnRyaWVzIGZvciByZW1vdmFsCisgICAgICAgIC8vLyAgIHZhciBNYXJrZWRFbnRyaWVzID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3QmbHQ7WmlwRW50cnkmZ3Q7KCk7CisgICAgICAgIC8vLyAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gemlwKQorICAgICAgICAvLy8gICB7CisgICAgICAgIC8vLyAgICAgaWYgKGUuTGFzdE1vZGlmaWVkICZsdDsgVGhyZXNob2xkKQorICAgICAgICAvLy8gICAgICAgTWFya2VkRW50cmllcy5BZGQoZSk7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vICAgLy8gcGFzcyAyOiBhY3R1YWxseSByZW1vdmUgdGhlIGVudHJ5LgorICAgICAgICAvLy8gICBmb3JlYWNoIChaaXBFbnRyeSB6b21iaWUgaW4gTWFya2VkRW50cmllcykKKyAgICAgICAgLy8vICAgICAgemlwLlJlbW92ZUVudHJ5KHpvbWJpZSk7CisgICAgICAgIC8vLyAgIHppcC5Db21tZW50ID0gIlRoaXMgYXJjaGl2ZSBoYXMgYmVlbiB1cGRhdGVkLiI7CisgICAgICAgIC8vLyAgIHppcC5TYXZlKCk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyAvLyBjYW4gbm93IHVzZSBjb250ZW50cyBvZiBzdywgZWcgc3RvcmUgaW4gYW4gYXVkaXQgbG9nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gRGltIG9wdGlvbnMgYXMgTmV3IFJlYWRPcHRpb25zCisgICAgICAgIC8vLyBvcHRpb25zLlN0YXR1c01lc3NhZ2VXcml0ZXIgPSBOZXcgU3lzdGVtLklPLlN0cmluZ1dyaXRlcgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoIlBhY2tlZERvY3VtZW50cy56aXAiLCBvcHRpb25zKQorICAgICAgICAvLy8gICAgIERpbSBUaHJlc2hvbGQgQXMgTmV3IERhdGVUaW1lKDIwMDcsIDcsIDQpCisgICAgICAgIC8vLyAgICAgJyBXZSBjYW5ub3QgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LCB3aXRoaW4gdGhlIGNvbnRleHQgb2YKKyAgICAgICAgLy8vICAgICAnIGFuIGVudW1lcmF0aW9uIG9mIHNhaWQgbGlzdC4KKyAgICAgICAgLy8vICAgICAnIFNvIHdlIGFkZCB0aGUgZG9vbWVkIGVudHJ5IHRvIGEgbGlzdCB0byBiZSByZW1vdmVkIGxhdGVyLgorICAgICAgICAvLy8gICAgICcgcGFzcyAxOiBtYXJrIHRoZSBlbnRyaWVzIGZvciByZW1vdmFsCisgICAgICAgIC8vLyAgICAgRGltIE1hcmtlZEVudHJpZXMgQXMgTmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3QoT2YgWmlwRW50cnkpCisgICAgICAgIC8vLyAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICBGb3IgRWFjaCBlIEluIHppcAorICAgICAgICAvLy8gICAgICAgICBJZiAoZS5MYXN0TW9kaWZpZWQgJmx0OyBUaHJlc2hvbGQpIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgIE1hcmtlZEVudHJpZXMuQWRkKGUpCisgICAgICAgIC8vLyAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgIE5leHQKKyAgICAgICAgLy8vICAgICAnIHBhc3MgMjogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vICAgICBEaW0gem9tYmllIEFzIFppcEVudHJ5CisgICAgICAgIC8vLyAgICAgRm9yIEVhY2ggem9tYmllIEluIE1hcmtlZEVudHJpZXMKKyAgICAgICAgLy8vICAgICAgICAgemlwLlJlbW92ZUVudHJ5KHpvbWJpZSkKKyAgICAgICAgLy8vICAgICBOZXh0CisgICAgICAgIC8vLyAgICAgemlwLkNvbW1lbnQgPSAiVGhpcyBhcmNoaXZlIGhhcyBiZWVuIHVwZGF0ZWQuIgorICAgICAgICAvLy8gICAgIHppcC5TYXZlCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vICcgY2FuIG5vdyB1c2UgY29udGVudHMgb2Ygc3csIGVnIHN0b3JlIGluIGFuIGF1ZGl0IGxvZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkV4Y2VwdGlvbiI+CisgICAgICAgIC8vLyAgIFRocm93biBpZiB0aGUgemlwZmlsZSBjYW5ub3QgYmUgcmVhZC4gVGhlIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgIC8vLyAgIHRoaXMgbWV0aG9kIHJlbGllcyBvbiA8Yz5TeXN0ZW0uSU8uRmlsZS5PcGVuUmVhZDwvYz4sIHdoaWNoCisgICAgICAgIC8vLyAgIGNhbiB0aHJvdyBhIHZhcmlldHkgb2YgZXhjZXB0aW9ucywgaW5jbHVkaW5nIHNwZWNpZmljCisgICAgICAgIC8vLyAgIGV4Y2VwdGlvbnMgaWYgYSBmaWxlIGlzIG5vdCBmb3VuZCwgYW4gdW5hdXRob3JpemVkIGFjY2VzcworICAgICAgICAvLy8gICBleGNlcHRpb24sIGV4Y2VwdGlvbnMgZm9yIHBvb3JseSBmb3JtYXR0ZWQgZmlsZW5hbWVzLCBhbmQgc28KKyAgICAgICAgLy8vICAgb24uCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPgorICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIHppcCBhcmNoaXZlIHRvIG9wZW4uCisgICAgICAgIC8vLyBUaGlzIGNhbiBiZSBhIGZ1bGx5LXF1YWxpZmllZCBvciByZWxhdGl2ZSBwYXRobmFtZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9wdGlvbnMiPgorICAgICAgICAvLy8gVGhlIHNldCBvZiBvcHRpb25zIHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgWmlwRmlsZSBpbnN0YW5jZSByZWFkIGZyb20gdGhlIHppcCBhcmNoaXZlLjwvcmV0dXJucz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBGaWxlLlJlYWQoU3RyZWFtLCBSZWFkT3B0aW9ucykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIGludGVybmFsIHN0YXRpYyBaaXBGaWxlIFJlYWQoc3RyaW5nIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIm9wdGlvbnMiKTsKKyAgICAgICAgICAgIHJldHVybiBSZWFkKGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5TdGF0dXNNZXNzYWdlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5FbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuUmVhZFByb2dyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWRzIGEgemlwIGZpbGUgYXJjaGl2ZSB1c2luZyB0aGUgc3BlY2lmaWVkIHRleHQgZW5jb2RpbmcsICB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyBUZXh0V3JpdGVyIGZvciBzdGF0dXMgbWVzc2FnZXMsIGFuZCB0aGUgc3BlY2lmaWVkIFJlYWRQcm9ncmVzcyBldmVudCBoYW5kbGVyLAorICAgICAgICAvLy8gYW5kIHJldHVybnMgdGhlIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgemlwIGFyY2hpdmUgdG8gb3Blbi4KKyAgICAgICAgLy8vIFRoaXMgY2FuIGJlIGEgZnVsbHktcXVhbGlmaWVkIG9yIHJlbGF0aXZlIHBhdGhuYW1lLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVhZFByb2dyZXNzIj4KKyAgICAgICAgLy8vIEFuIGV2ZW50IGhhbmRsZXIgZm9yIFJlYWQgb3BlcmF0aW9ucy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXR1c01lc3NhZ2VXcml0ZXIiPgorICAgICAgICAvLy8gVGhlIDxjPlN5c3RlbS5JTy5UZXh0V3JpdGVyPC9jPiB0byB1c2UgZm9yIHdyaXRpbmcgdmVyYm9zZSBzdGF0dXMgbWVzc2FnZXMKKyAgICAgICAgLy8vIGR1cmluZyBvcGVyYXRpb25zIG9uIHRoZSB6aXAgYXJjaGl2ZS4gIEEgY29uc29sZSBhcHBsaWNhdGlvbiBtYXkgd2lzaCB0bworICAgICAgICAvLy8gcGFzcyA8Yz5TeXN0ZW0uQ29uc29sZS5PdXQ8L2M+IHRvIGdldCBtZXNzYWdlcyBvbiB0aGUgQ29uc29sZS4gQSBncmFwaGljYWwKKyAgICAgICAgLy8vIG9yIGhlYWRsZXNzIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvIGNhcHR1cmUgdGhlIG1lc3NhZ2VzIGluIGEgZGlmZmVyZW50CisgICAgICAgIC8vLyA8Yz5UZXh0V3JpdGVyPC9jPiwgc3VjaCBhcyBhIDxjPlN5c3RlbS5JTy5TdHJpbmdXcml0ZXI8L2M+LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jb2RpbmciPgorICAgICAgICAvLy8gVGhlIDxjPlN5c3RlbS5UZXh0LkVuY29kaW5nPC9jPiB0byB1c2Ugd2hlbiByZWFkaW5nIGluIHRoZSB6aXAgYXJjaGl2ZS4gQmUKKyAgICAgICAgLy8vIGNhcmVmdWwgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuICBJZiB0aGUgdmFsdWUgeW91IHVzZSBoZXJlIGlzIG5vdCB0aGUgc2FtZQorICAgICAgICAvLy8gYXMgdGhlIEVuY29kaW5nIHVzZWQgd2hlbiB0aGUgemlwIGFyY2hpdmUgd2FzIGNyZWF0ZWQgKHBvc3NpYmx5IGJ5IGEKKyAgICAgICAgLy8vIGRpZmZlcmVudCBhcmNoaXZlcikgeW91IHdpbGwgZ2V0IHVuZXhwZWN0ZWQgcmVzdWx0cyBhbmQgcG9zc2libHkgZXhjZXB0aW9ucy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIGluc3RhbmNlIHJlYWQgZnJvbSB0aGUgemlwIGFyY2hpdmUuPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWmlwRmlsZSBSZWFkKHN0cmluZyBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFdyaXRlciBzdGF0dXNNZXNzYWdlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyPFJlYWRQcm9ncmVzc0V2ZW50QXJncz4gcmVhZFByb2dyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoKTsKKyAgICAgICAgICAgIHpmLkFsdGVybmF0ZUVuY29kaW5nID0gZW5jb2RpbmcgPz8gRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgemYuQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5BbHdheXM7CisgICAgICAgICAgICB6Zi5fU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIgPSBzdGF0dXNNZXNzYWdlV3JpdGVyOworICAgICAgICAgICAgemYuX25hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgIGlmIChyZWFkUHJvZ3Jlc3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB6Zi5SZWFkUHJvZ3Jlc3MgPSByZWFkUHJvZ3Jlc3M7CisKKyAgICAgICAgICAgIGlmICh6Zi5WZXJib3NlKSB6Zi5fU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJyZWFkaW5nIGZyb20gezB9Li4uIiwgZmlsZU5hbWUpOworCisgICAgICAgICAgICBSZWFkSW50b0luc3RhbmNlKHpmKTsKKyAgICAgICAgICAgIHpmLl9maWxlQWxyZWFkeUV4aXN0cyA9IHRydWU7CisKKyAgICAgICAgICAgIHJldHVybiB6ZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmVhZHMgYSB6aXAgYXJjaGl2ZSBmcm9tIGEgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHJlYWRpbmcgZnJvbSBhIGZpbGUsIGl0J3MgcHJvYmFibHkgZWFzaWVyIHRvIGp1c3QgdXNlCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRmlsZS5SZWFkKFN0cmluZywKKyAgICAgICAgLy8vICAgUmVhZE9wdGlvbnMpIj5aaXBGaWxlLlJlYWQoU3RyaW5nLCBSZWFkT3B0aW9ucyk8L3NlZT4uICBUaGlzCisgICAgICAgIC8vLyAgIG92ZXJsb2FkIGlzIHVzZWZ1bCB3aGVuIHdoZW4gdGhlIHppcCBhcmNoaXZlIGNvbnRlbnQgaXMKKyAgICAgICAgLy8vICAgYXZhaWxhYmxlIGZyb20gYW4gYWxyZWFkeS1vcGVuIHN0cmVhbS4gVGhlIHN0cmVhbSBtdXN0IGJlCisgICAgICAgIC8vLyAgIG9wZW4gYW5kIHJlYWRhYmxlIGFuZCBzZWVrYWJsZSB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuICBUaGUKKyAgICAgICAgLy8vICAgc3RyZWFtIGlzIGxlZnQgb3BlbiB3aGVuIHRoZSByZWFkaW5nIGlzIGNvbXBsZXRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVXNpbmcgdGhpcyBvdmVybG9hZCwgdGhlIHN0cmVhbSBpcyByZWFkIHVzaW5nIHRoZSBkZWZhdWx0CisgICAgICAgIC8vLyAgIDxjPlN5c3RlbS5UZXh0LkVuY29kaW5nPC9jPiwgd2hpY2ggaXMgdGhlIDxjPklCTTQzNzwvYz4KKyAgICAgICAgLy8vICAgY29kZXBhZ2UuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIGVuY29kaW5nIHRvIHVzZSB3aGVuCisgICAgICAgIC8vLyAgIHJlYWRpbmcgdGhlIHppcGZpbGUgY29udGVudCwgc2VlCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iWmlwRmlsZS5SZWFkKFN0cmVhbSwKKyAgICAgICAgLy8vICAgUmVhZE9wdGlvbnMpIj5aaXBGaWxlLlJlYWQoU3RyZWFtLCBSZWFkT3B0aW9ucyk8L3NlZT4uICBUaGlzCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFJlYWRpbmcgb2YgemlwIGNvbnRlbnQgYmVnaW5zIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZQorICAgICAgICAvLy8gICBzdHJlYW0uICBUaGlzIG1lYW5zIGlmIHlvdSBoYXZlIGEgc3RyZWFtIHRoYXQgY29uY2F0ZW5hdGVzCisgICAgICAgIC8vLyAgIHJlZ3VsYXIgZGF0YSBhbmQgemlwIGRhdGEsIGlmIHlvdSBwb3NpdGlvbiB0aGUgb3BlbiwgcmVhZGFibGUKKyAgICAgICAgLy8vICAgc3RyZWFtIGF0IHRoZSBzdGFydCBvZiB0aGUgemlwIGRhdGEsIHlvdSB3aWxsIGJlIGFibGUgdG8gcmVhZAorICAgICAgICAvLy8gICB0aGUgemlwIGFyY2hpdmUgdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvciwgb3IgYW55IG9mIHRoZSBaaXBGaWxlCisgICAgICAgIC8vLyAgIGNvbnN0cnVjdG9ycyB0aGF0IGFjY2VwdCBhIDxzZWUgY3JlZj0iU3lzdGVtLklPLlN0cmVhbSIgLz4gYXMKKyAgICAgICAgLy8vICAgaW5wdXQuIFNvbWUgZXhhbXBsZXMgb2Ygd2hlcmUgdGhpcyBtaWdodCBiZSB1c2VmdWw6IHRoZSB6aXAKKyAgICAgICAgLy8vICAgY29udGVudCBpcyBjb25jYXRlbmF0ZWQgYXQgdGhlIGVuZCBvZiBhIHJlZ3VsYXIgRVhFIGZpbGUsIGFzCisgICAgICAgIC8vLyAgIHNvbWUgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmVzIGRvLiAgKE5vdGU6IFNGWCBmaWxlcyBwcm9kdWNlZAorICAgICAgICAvLy8gICBieSBEb3ROZXRaaXAgZG8gbm90IHdvcmsgdGhpcyB3YXk7IHRoZXkgY2FuIGJlIHJlYWQgYXMgbm9ybWFsCisgICAgICAgIC8vLyAgIFpJUCBmaWxlcykuIEFub3RoZXIgZXhhbXBsZSBtaWdodCBiZSBhIHN0cmVhbSBiZWluZyByZWFkIGZyb20KKyAgICAgICAgLy8vICAgYSBkYXRhYmFzZSwgd2hlcmUgdGhlIHppcCBjb250ZW50IGlzIGVtYmVkZGVkIHdpdGhpbiBhbgorICAgICAgICAvLy8gICBhZ2dyZWdhdGUgc3RyZWFtIG9mIGRhdGEuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gUmVhZCB6aXAgY29udGVudCBmcm9tIGEgc3RyZWFtLCBhbmQKKyAgICAgICAgLy8vICAgZXh0cmFjdCBvbmUgZW50cnkgaW50byBhIGRpZmZlcmVudCBzdHJlYW0uIEluIHRoaXMgZXhhbXBsZSwKKyAgICAgICAgLy8vICAgdGhlIGZpbGVuYW1lICJOYW1lT2ZFbnRyeUluQXJjaGl2ZS5kb2MiLCByZWZlcnMgb25seSB0byB0aGUKKyAgICAgICAgLy8vICAgbmFtZSBvZiB0aGUgZW50cnkgd2l0aGluIHRoZSB6aXAgYXJjaGl2ZS4gIEEgZmlsZSBieSB0aGF0CisgICAgICAgIC8vLyAgIG5hbWUgaXMgbm90IGNyZWF0ZWQgaW4gdGhlIGZpbGVzeXN0ZW0uICBUaGUgSS9PIGlzIGRvbmUKKyAgICAgICAgLy8vICAgc3RyaWN0bHkgd2l0aCB0aGUgZ2l2ZW4gc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZChJbnB1dFN0cmVhbSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICB6aXAuRXh0cmFjdCgiTmFtZU9mRW50cnlJbkFyY2hpdmUuZG9jIiwgT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyB6aXAgYXMgWmlwRmlsZSA9IFppcEZpbGUuUmVhZChJbnB1dFN0cmVhbSkKKyAgICAgICAgLy8vICAgIHppcC5FeHRyYWN0KCJOYW1lT2ZFbnRyeUluQXJjaGl2ZS5kb2MiLCBPdXRwdXRTdHJlYW0pCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iemlwU3RyZWFtIj50aGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHppcCBkYXRhLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIFppcEZpbGUgaW5zdGFuY2UgcmVhZCBmcm9tIHRoZSBzdHJlYW08L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgc3RhdGljIFppcEZpbGUgUmVhZChTdHJlYW0gemlwU3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZCh6aXBTdHJlYW0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZWFkcyBhIHppcCBmaWxlIGFyY2hpdmUgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtIHVzaW5nIHRoZQorICAgICAgICAvLy8gICBzcGVjaWZpZWQgb3B0aW9ucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGZyb20gYSBmaWxlLCBpdCdzIHByb2JhYmx5IGVhc2llciB0byBqdXN0IHVzZQorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IlppcEZpbGUuUmVhZChTdHJpbmcsCisgICAgICAgIC8vLyAgIFJlYWRPcHRpb25zKSI+WmlwRmlsZS5SZWFkKFN0cmluZywgUmVhZE9wdGlvbnMpPC9zZWU+LiAgVGhpcworICAgICAgICAvLy8gICBvdmVybG9hZCBpcyB1c2VmdWwgd2hlbiB3aGVuIHRoZSB6aXAgYXJjaGl2ZSBjb250ZW50IGlzCisgICAgICAgIC8vLyAgIGF2YWlsYWJsZSBmcm9tIGFuIGFscmVhZHktb3BlbiBzdHJlYW0uIFRoZSBzdHJlYW0gbXVzdCBiZQorICAgICAgICAvLy8gICBvcGVuIGFuZCByZWFkYWJsZSBhbmQgc2Vla2FibGUgd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLiAgVGhlCisgICAgICAgIC8vLyAgIHN0cmVhbSBpcyBsZWZ0IG9wZW4gd2hlbiB0aGUgcmVhZGluZyBpcyBjb21wbGV0ZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFJlYWRpbmcgb2YgemlwIGNvbnRlbnQgYmVnaW5zIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZQorICAgICAgICAvLy8gICBzdHJlYW0uICBUaGlzIG1lYW5zIGlmIHlvdSBoYXZlIGEgc3RyZWFtIHRoYXQgY29uY2F0ZW5hdGVzCisgICAgICAgIC8vLyAgIHJlZ3VsYXIgZGF0YSBhbmQgemlwIGRhdGEsIGlmIHlvdSBwb3NpdGlvbiB0aGUgb3BlbiwgcmVhZGFibGUKKyAgICAgICAgLy8vICAgc3RyZWFtIGF0IHRoZSBzdGFydCBvZiB0aGUgemlwIGRhdGEsIHlvdSB3aWxsIGJlIGFibGUgdG8gcmVhZAorICAgICAgICAvLy8gICB0aGUgemlwIGFyY2hpdmUgdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvciwgb3IgYW55IG9mIHRoZSBaaXBGaWxlCisgICAgICAgIC8vLyAgIGNvbnN0cnVjdG9ycyB0aGF0IGFjY2VwdCBhIDxzZWUgY3JlZj0iU3lzdGVtLklPLlN0cmVhbSIgLz4gYXMKKyAgICAgICAgLy8vICAgaW5wdXQuIFNvbWUgZXhhbXBsZXMgb2Ygd2hlcmUgdGhpcyBtaWdodCBiZSB1c2VmdWw6IHRoZSB6aXAKKyAgICAgICAgLy8vICAgY29udGVudCBpcyBjb25jYXRlbmF0ZWQgYXQgdGhlIGVuZCBvZiBhIHJlZ3VsYXIgRVhFIGZpbGUsIGFzCisgICAgICAgIC8vLyAgIHNvbWUgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmVzIGRvLiAgKE5vdGU6IFNGWCBmaWxlcyBwcm9kdWNlZAorICAgICAgICAvLy8gICBieSBEb3ROZXRaaXAgZG8gbm90IHdvcmsgdGhpcyB3YXk7IHRoZXkgY2FuIGJlIHJlYWQgYXMgbm9ybWFsCisgICAgICAgIC8vLyAgIFpJUCBmaWxlcykuIEFub3RoZXIgZXhhbXBsZSBtaWdodCBiZSBhIHN0cmVhbSBiZWluZyByZWFkIGZyb20KKyAgICAgICAgLy8vICAgYSBkYXRhYmFzZSwgd2hlcmUgdGhlIHppcCBjb250ZW50IGlzIGVtYmVkZGVkIHdpdGhpbiBhbgorICAgICAgICAvLy8gICBhZ2dyZWdhdGUgc3RyZWFtIG9mIGRhdGEuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InppcFN0cmVhbSI+dGhlIHN0cmVhbSBjb250YWluaW5nIHRoZSB6aXAgZGF0YS48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHRpb25zIj4KKyAgICAgICAgLy8vICAgVGhlIHNldCBvZiBvcHRpb25zIHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlN5c3RlbS5FeGNlcHRpb24iPgorICAgICAgICAvLy8gICBUaHJvd24gaWYgdGhlIHppcCBhcmNoaXZlIGNhbm5vdCBiZSByZWFkLgorICAgICAgICAvLy8gPC9leGNlcHRpb24+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIFppcEZpbGUgaW5zdGFuY2UgcmVhZCBmcm9tIHRoZSBzdHJlYW0uPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEZpbGUuUmVhZChTdHJpbmcsIFJlYWRPcHRpb25zKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFppcEZpbGUgUmVhZChTdHJlYW0gemlwU3RyZWFtLCBSZWFkT3B0aW9ucyBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIm9wdGlvbnMiKTsKKworICAgICAgICAgICAgcmV0dXJuIFJlYWQoemlwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5TdGF0dXNNZXNzYWdlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5FbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuUmVhZFByb2dyZXNzKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyBhIHppcCBhcmNoaXZlIGZyb20gYSBzdHJlYW0sIHVzaW5nIHRoZSBzcGVjaWZpZWQgdGV4dCBFbmNvZGluZywgdGhlCisgICAgICAgIC8vLyBzcGVjaWZpZWQgVGV4dFdyaXRlciBmb3Igc3RhdHVzIG1lc3NhZ2VzLAorICAgICAgICAvLy8gYW5kIHRoZSBzcGVjaWZpZWQgUmVhZFByb2dyZXNzIGV2ZW50IGhhbmRsZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFJlYWRpbmcgb2YgemlwIGNvbnRlbnQgYmVnaW5zIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uICBUaGlzCisgICAgICAgIC8vLyBtZWFucyBpZiB5b3UgaGF2ZSBhIHN0cmVhbSB0aGF0IGNvbmNhdGVuYXRlcyByZWd1bGFyIGRhdGEgYW5kIHppcCBkYXRhLCBpZgorICAgICAgICAvLy8geW91IHBvc2l0aW9uIHRoZSBvcGVuLCByZWFkYWJsZSBzdHJlYW0gYXQgdGhlIHN0YXJ0IG9mIHRoZSB6aXAgZGF0YSwgeW91CisgICAgICAgIC8vLyB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgemlwIGFyY2hpdmUgdXNpbmcgdGhpcyBjb25zdHJ1Y3Rvciwgb3IgYW55IG9mIHRoZQorICAgICAgICAvLy8gWmlwRmlsZSBjb25zdHJ1Y3RvcnMgdGhhdCBhY2NlcHQgYSA8c2VlIGNyZWY9IlN5c3RlbS5JTy5TdHJlYW0iIC8+IGFzCisgICAgICAgIC8vLyBpbnB1dC4gU29tZSBleGFtcGxlcyBvZiB3aGVyZSB0aGlzIG1pZ2h0IGJlIHVzZWZ1bDogdGhlIHppcCBjb250ZW50IGlzCisgICAgICAgIC8vLyBjb25jYXRlbmF0ZWQgYXQgdGhlIGVuZCBvZiBhIHJlZ3VsYXIgRVhFIGZpbGUsIGFzIHNvbWUgc2VsZi1leHRyYWN0aW5nCisgICAgICAgIC8vLyBhcmNoaXZlcyBkby4gIChOb3RlOiBTRlggZmlsZXMgcHJvZHVjZWQgYnkgRG90TmV0WmlwIGRvIG5vdCB3b3JrIHRoaXMKKyAgICAgICAgLy8vIHdheSkuIEFub3RoZXIgZXhhbXBsZSBtaWdodCBiZSBhIHN0cmVhbSBiZWluZyByZWFkIGZyb20gYSBkYXRhYmFzZSwgd2hlcmUKKyAgICAgICAgLy8vIHRoZSB6aXAgY29udGVudCBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gYWdncmVnYXRlIHN0cmVhbSBvZiBkYXRhLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ6aXBTdHJlYW0iPnRoZSBzdHJlYW0gY29udGFpbmluZyB0aGUgemlwIGRhdGEuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhdHVzTWVzc2FnZVdyaXRlciI+CisgICAgICAgIC8vLyBUaGUgPGM+U3lzdGVtLklPLlRleHRXcml0ZXI8L2M+IHRvIHdoaWNoIHZlcmJvc2Ugc3RhdHVzIG1lc3NhZ2VzIGFyZSB3cml0dGVuCisgICAgICAgIC8vLyBkdXJpbmcgb3BlcmF0aW9ucyBvbiB0aGUgPGM+WmlwRmlsZTwvYz4uICBGb3IgZXhhbXBsZSwgaW4gYSBjb25zb2xlCisgICAgICAgIC8vLyBhcHBsaWNhdGlvbiwgU3lzdGVtLkNvbnNvbGUuT3V0IHdvcmtzLCBhbmQgd2lsbCBnZXQgYSBtZXNzYWdlIGZvciBlYWNoIGVudHJ5CisgICAgICAgIC8vLyBhZGRlZCB0byB0aGUgWmlwRmlsZS4gIElmIHRoZSBUZXh0V3JpdGVyIGlzIDxjPm51bGw8L2M+LCBubyB2ZXJib3NlIG1lc3NhZ2VzCisgICAgICAgIC8vLyBhcmUgd3JpdHRlbi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj4KKyAgICAgICAgLy8vIFRoZSB0ZXh0IGVuY29kaW5nIHRvIHVzZSB3aGVuIHJlYWRpbmcgZW50cmllcyB0aGF0IGRvIG5vdCBoYXZlIHRoZSBVVEYtOAorICAgICAgICAvLy8gZW5jb2RpbmcgYml0IHNldC4gIEJlIGNhcmVmdWwgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuICBJZiB0aGUgdmFsdWUgeW91IHVzZQorICAgICAgICAvLy8gaGVyZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIEVuY29kaW5nIHVzZWQgd2hlbiB0aGUgemlwIGFyY2hpdmUgd2FzIGNyZWF0ZWQKKyAgICAgICAgLy8vIChwb3NzaWJseSBieSBhIGRpZmZlcmVudCBhcmNoaXZlcikgeW91IHdpbGwgZ2V0IHVuZXhwZWN0ZWQgcmVzdWx0cyBhbmQKKyAgICAgICAgLy8vIHBvc3NpYmx5IGV4Y2VwdGlvbnMuICBTZWUgdGhlIDxzZWUgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPgorICAgICAgICAvLy8gcHJvcGVydHkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWFkUHJvZ3Jlc3MiPgorICAgICAgICAvLy8gQW4gZXZlbnQgaGFuZGxlciBmb3IgUmVhZCBvcGVyYXRpb25zLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5hbiBpbnN0YW5jZSBvZiBaaXBGaWxlPC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIHN0YXRpYyBaaXBGaWxlIFJlYWQoU3RyZWFtIHppcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFdyaXRlciBzdGF0dXNNZXNzYWdlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGV4dC5FbmNvZGluZyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyPFJlYWRQcm9ncmVzc0V2ZW50QXJncz4gcmVhZFByb2dyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoemlwU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiemlwU3RyZWFtIik7CisKKyAgICAgICAgICAgIFppcEZpbGUgemYgPSBuZXcgWmlwRmlsZSgpOworICAgICAgICAgICAgemYuX1N0YXR1c01lc3NhZ2VUZXh0V3JpdGVyID0gc3RhdHVzTWVzc2FnZVdyaXRlcjsKKyAgICAgICAgICAgIHpmLl9hbHRlcm5hdGVFbmNvZGluZyA9IGVuY29kaW5nID8/IFppcEZpbGUuRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgemYuX2FsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPSBaaXBPcHRpb24uQWx3YXlzOworICAgICAgICAgICAgaWYgKHJlYWRQcm9ncmVzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHpmLlJlYWRQcm9ncmVzcyArPSByZWFkUHJvZ3Jlc3M7CisgICAgICAgICAgICB6Zi5fcmVhZHN0cmVhbSA9ICh6aXBTdHJlYW0uUG9zaXRpb24gPT0gMEwpCisgICAgICAgICAgICAgICAgPyB6aXBTdHJlYW0KKyAgICAgICAgICAgICAgICA6IG5ldyBPZmZzZXRTdHJlYW0oemlwU3RyZWFtKTsKKyAgICAgICAgICAgIHpmLl9SZWFkU3RyZWFtSXNPdXJzID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoemYuVmVyYm9zZSkgemYuX1N0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgicmVhZGluZyBmcm9tIHN0cmVhbS4uLiIpOworCisgICAgICAgICAgICBSZWFkSW50b0luc3RhbmNlKHpmKTsKKyAgICAgICAgICAgIHJldHVybiB6ZjsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlYWRJbnRvSW5zdGFuY2UoWmlwRmlsZSB6ZikKKyAgICAgICAgeworICAgICAgICAgICAgU3RyZWFtIHMgPSB6Zi5SZWFkU3RyZWFtOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemYuX3JlYWROYW1lID0gemYuX25hbWU7IC8vIHdvcmtpdGVtIDEzOTE1CisgICAgICAgICAgICAgICAgaWYgKCFzLkNhblNlZWspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZWFkSW50b0luc3RhbmNlX09yaWcoemYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgemYuT25SZWFkU3RhcnRlZCgpOworCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGZvciB3b3JraXRlbSA4MDk4CisgICAgICAgICAgICAgICAgLy96Zi5fb3JpZ2luUG9zaXRpb24gPSBzLlBvc2l0aW9uOworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHJlYWRpbmcgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LCByYXRoZXIgdGhhbiBzY2FubmluZyB0aGUgZmlsZS4KKworICAgICAgICAgICAgICAgIHVpbnQgZGF0dW0gPSBSZWFkRmlyc3RGb3VyQnl0ZXMocyk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGF0dW0gPT0gWmlwQ29uc3RhbnRzLkVuZE9mQ2VudHJhbERpcmVjdG9yeVNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLi4uCisgICAgICAgICAgICAgICAgLy8gc2VlayBiYWNrd2FyZHMgYSBiaXQsIHRoZW4gbG9vayBmb3IgdGhlIEVvQ0Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgIGludCBuVHJpZXMgPSAwOworICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIGVuZC1vZi1jZW50cmFsLWRpcmVjdG9yeS1mb290ZXIgcGx1cyAyIGJ5dGVzIGlzIDE4LgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaW1wbGllcyBhbiBhcmNoaXZlIGNvbW1lbnQgbGVuZ3RoIG9mIDAuICBXZSdsbCBhZGQgYSBtYXJnaW4gb2YKKyAgICAgICAgICAgICAgICAvLyBzYWZldHkgYW5kIHN0YXJ0ICJpbiBmcm9udCIgb2YgdGhhdCwgd2hlbiBsb29raW5nIGZvciB0aGUKKyAgICAgICAgICAgICAgICAvLyBFbmRPZkNlbnRyYWxEaXJlY3RvcnlTaWduYXR1cmUKKyAgICAgICAgICAgICAgICBsb25nIHBvc24gPSBzLkxlbmd0aCAtIDY0OworICAgICAgICAgICAgICAgIGxvbmcgbWF4U2Vla2JhY2sgPSBNYXRoLk1heChzLkxlbmd0aCAtIDB4NDAwMCwgMTApOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9zbiA8IDApIHBvc24gPSAwOyAgLy8gQk9GCisgICAgICAgICAgICAgICAgICAgIHMuU2Vlayhwb3NuLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBieXRlc1JlYWQgPSBTaGFyZWRVdGlsaXRpZXMuRmluZFNpZ25hdHVyZShzLCAoaW50KVppcENvbnN0YW50cy5FbmRPZkNlbnRyYWxEaXJlY3RvcnlTaWduYXR1cmUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc249PTApIGJyZWFrOyAvLyBzdGFydGVkIGF0IHRoZSBCT0YgYW5kIGZvdW5kIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG5UcmllcysrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2VpcmQ6IHdpdGggTkVUQ0YsIG5lZ2F0aXZlIG9mZnNldHMgZnJvbSBTZWVrT3JpZ2luLkVuZCBETworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9UIFdPUksuIFNvIHJhdGhlciB0aGFuIHNlZWsgYSBuZWdhdGl2ZSBvZmZzZXQsIHdlIHNlZWsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2Vla09yaWdpbi5CZWdpbiB1c2luZyBhIHNtYWxsZXIgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zbiAtPSAoMzIgKiAoblRyaWVzICsgMSkgKiBuVHJpZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICghc3VjY2VzcyAmJiBwb3NuID4gbWF4U2Vla2JhY2spOworCisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4Mjk5CisgICAgICAgICAgICAgICAgICAgIHpmLl9sb2NFbmRPZkNEUyA9IHMuUG9zaXRpb24gLSA0OworCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgICAgICAgICAgICAgcy5SZWFkKGJsb2NrLCAwLCBibG9jay5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHpmLl9kaXNrTnVtYmVyV2l0aENkID0gQml0Q29udmVydGVyLlRvVUludDE2KGJsb2NrLCAyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoemYuX2Rpc2tOdW1iZXJXaXRoQ2QgPT0gMHhGRkZGKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiU3Bhbm5lZCBhcmNoaXZlcyB3aXRoIG1vcmUgdGhhbiA2NTUzNCBzZWdtZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuIik7CisKKyAgICAgICAgICAgICAgICAgICAgemYuX2Rpc2tOdW1iZXJXaXRoQ2QrKzsgLy8gSSB0aGluayB0aGUgbnVtYmVyIGluIHRoZSBmaWxlIGRpZmZlcnMgZnJvbSByZWFsaXR5IGJ5IDEKKworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDEyOworCisgICAgICAgICAgICAgICAgICAgIHVpbnQgb2Zmc2V0MzIgPSAodWludCkgQml0Q29udmVydGVyLlRvVUludDMyKGJsb2NrLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldDMyID09IDB4RkZGRkZGRkYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFppcDY0U2Vla1RvQ2VudHJhbERpcmVjdG9yeSh6Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6Zi5fT2Zmc2V0T2ZDZW50cmFsRGlyZWN0b3J5ID0gb2Zmc2V0MzI7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZm9yIHdvcmtpdGVtIDgwOTgKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuU2VlayhvZmZzZXQzMiwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBSZWFkQ2VudHJhbERpcmVjdG9yeSh6Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdGhlIG9sZCBtZXRob2QuCisgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDgwOTg6IG9rCisgICAgICAgICAgICAgICAgICAgIC8vcy5TZWVrKHpmLl9vcmlnaW5Qb3NpdGlvbiwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgIHMuU2VlaygwTCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgIFJlYWRJbnRvSW5zdGFuY2VfT3JpZyh6Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHpmLl9SZWFkU3RyZWFtSXNPdXJzICYmIHpmLl9yZWFkc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmIE5FVENGCisgICAgICAgICAgICAgICAgICAgICAgICB6Zi5fcmVhZHN0cmVhbS5DbG9zZSgpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmLl9yZWFkc3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgemYuX3JlYWRzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiQ2Fubm90IHJlYWQgdGhhdCBhcyBhIFppcEZpbGUiLCBleDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gcmVhZCBpbgorICAgICAgICAgICAgemYuX2NvbnRlbnRzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgWmlwNjRTZWVrVG9DZW50cmFsRGlyZWN0b3J5KFppcEZpbGUgemYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmVhbSBzID0gemYuUmVhZFN0cmVhbTsKKyAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG5ldyBieXRlWzE2XTsKKworICAgICAgICAgICAgLy8gc2VlayBiYWNrIHRvIGZpbmQgdGhlIFpJUDY0IEVvQ0QuCisgICAgICAgICAgICAvLyBJIHRoaW5rIHRoaXMgbWlnaHQgbm90IHdvcmsgZm9yIC5ORVQgQ0YgPworICAgICAgICAgICAgcy5TZWVrKC00MCwgU2Vla09yaWdpbi5DdXJyZW50KTsKKyAgICAgICAgICAgIHMuUmVhZChibG9jaywgMCwgMTYpOworCisgICAgICAgICAgICBJbnQ2NCBvZmZzZXQ2NCA9IEJpdENvbnZlcnRlci5Ub0ludDY0KGJsb2NrLCA4KTsKKyAgICAgICAgICAgIHpmLl9PZmZzZXRPZkNlbnRyYWxEaXJlY3RvcnkgPSAweEZGRkZGRkZGOworICAgICAgICAgICAgemYuX09mZnNldE9mQ2VudHJhbERpcmVjdG9yeTY0ID0gb2Zmc2V0NjQ7CisgICAgICAgICAgICAvLyBjaGFuZ2UgZm9yIHdvcmtpdGVtIDgwOTgKKyAgICAgICAgICAgIHMuU2VlayhvZmZzZXQ2NCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAvL3pmLlNlZWtGcm9tT3JpZ2luKE9mZnNldDY0KTsKKworICAgICAgICAgICAgdWludCBkYXR1bSA9ICh1aW50KUlvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuUmVhZEludChzKTsKKyAgICAgICAgICAgIGlmIChkYXR1bSAhPSBaaXBDb25zdGFudHMuWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmRTaWduYXR1cmUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlYWRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiICBCYWQgc2lnbmF0dXJlICgweHswOlg4fSkgbG9va2luZyBmb3IgWklQNjQgRW9DRCBSZWNvcmQgYXQgcG9zaXRpb24gMHh7MTpYOH0iLCBkYXR1bSwgcy5Qb3NpdGlvbikpOworCisgICAgICAgICAgICBzLlJlYWQoYmxvY2ssIDAsIDgpOworICAgICAgICAgICAgSW50NjQgU2l6ZSA9IEJpdENvbnZlcnRlci5Ub0ludDY0KGJsb2NrLCAwKTsKKworICAgICAgICAgICAgYmxvY2sgPSBuZXcgYnl0ZVtTaXplXTsKKyAgICAgICAgICAgIHMuUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKworICAgICAgICAgICAgb2Zmc2V0NjQgPSBCaXRDb252ZXJ0ZXIuVG9JbnQ2NChibG9jaywgMzYpOworICAgICAgICAgICAgLy8gY2hhbmdlIGZvciB3b3JraXRlbSA4MDk4CisgICAgICAgICAgICBzLlNlZWsob2Zmc2V0NjQsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgLy96Zi5TZWVrRnJvbU9yaWdpbihPZmZzZXQ2NCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVpbnQgUmVhZEZpcnN0Rm91ckJ5dGVzKFN0cmVhbSBzKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50IGRhdHVtID0gKHVpbnQpSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5SZWFkSW50KHMpOworICAgICAgICAgICAgcmV0dXJuIGRhdHVtOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUmVhZENlbnRyYWxEaXJlY3RvcnkoWmlwRmlsZSB6ZikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBmb290ZXIgcmVjb3JkLCBpbiBvcmRlciB0byBwcm9wZXJseQorICAgICAgICAgICAgLy8gcmVhZCB6aXAgZGlyIGVudHJpZXMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkuICBUaGlzIGJlY2F1c2UgdGhlIGxvZ2ljCisgICAgICAgICAgICAvLyBrbm93cyB3aGVuIHRvIG9wZW4gYSBzcGFubmVkIGZpbGUgd2hlbiB0aGUgdm9sdW1lIG51bWJlciBmb3IgdGhlIGNlbnRyYWwKKyAgICAgICAgICAgIC8vIGRpcmVjdG9yeSBkaWZmZXJzIGZyb20gdGhlIHZvbHVtZSBudW1iZXIgZm9yIHRoZSB6aXAgZW50cnkuICBUaGUKKyAgICAgICAgICAgIC8vIF9kaXNrTnVtYmVyV2l0aENkIHdhcyBzZXQgd2hlbiBvcmlnaW5hbGx5IGZpbmRpbmcgdGhlIG9mZnNldCBmb3IgdGhlCisgICAgICAgICAgICAvLyBzdGFydCBvZiB0aGUgQ2VudHJhbCBEaXJlY3RvcnkuCisKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDkyMTQKKyAgICAgICAgICAgIGJvb2wgaW5wdXRVc2VzWmlwNjQgPSBmYWxzZTsKKyAgICAgICAgICAgIFppcEVudHJ5IGRlOworICAgICAgICAgICAgLy8gaW4gbGlldSBvZiBoYXNoc2V0LCB1c2UgYSBkaWN0aW9uYXJ5CisgICAgICAgICAgICB2YXIgcHJldmlvdXNseVNlZW4gPSBuZXcgRGljdGlvbmFyeTxTdHJpbmcsb2JqZWN0PigpOworICAgICAgICAgICAgd2hpbGUgKChkZSA9IFppcEVudHJ5LlJlYWREaXJFbnRyeSh6ZiwgcHJldmlvdXNseVNlZW4pKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlLlJlc2V0RGlyRW50cnkoKTsKKyAgICAgICAgICAgICAgICB6Zi5PblJlYWRFbnRyeSh0cnVlLCBudWxsKTsKKworICAgICAgICAgICAgICAgIGlmICh6Zi5WZXJib3NlKQorICAgICAgICAgICAgICAgICAgICB6Zi5TdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoImVudHJ5IHswfSIsIGRlLkZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgIHpmLl9lbnRyaWVzLkFkZChkZS5GaWxlTmFtZSxkZSk7CisKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA5MjE0CisgICAgICAgICAgICAgICAgaWYgKGRlLl9JbnB1dFVzZXNaaXA2NCkgaW5wdXRVc2VzWmlwNjQgPSB0cnVlOworICAgICAgICAgICAgICAgIHByZXZpb3VzbHlTZWVuLkFkZChkZS5GaWxlTmFtZSwgbnVsbCk7IC8vIHRvIHByZXZlbnQgZHVwZXMKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gOTIxNDsgYXV0by1zZXQgdGhlIHppcDY0IGZsYWcKKyAgICAgICAgICAgIGlmIChpbnB1dFVzZXNaaXA2NCkgemYuVXNlWmlwNjRXaGVuU2F2aW5nID0gWmlwNjRPcHRpb24uQWx3YXlzOworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA4Mjk5CisgICAgICAgICAgICBpZiAoemYuX2xvY0VuZE9mQ0RTID4gMCkKKyAgICAgICAgICAgICAgICB6Zi5SZWFkU3RyZWFtLlNlZWsoemYuX2xvY0VuZE9mQ0RTLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgUmVhZENlbnRyYWxEaXJlY3RvcnlGb290ZXIoemYpOworCisgICAgICAgICAgICBpZiAoemYuVmVyYm9zZSAmJiAhU3RyaW5nLklzTnVsbE9yRW1wdHkoemYuQ29tbWVudCkpCisgICAgICAgICAgICAgICAgemYuU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJaaXAgZmlsZSBDb21tZW50OiB7MH0iLCB6Zi5Db21tZW50KTsKKworICAgICAgICAgICAgLy8gV2Uga2VlcCB0aGUgcmVhZCBzdHJlYW0gb3BlbiBhZnRlciByZWFkaW5nLgorCisgICAgICAgICAgICBpZiAoemYuVmVyYm9zZSkKKyAgICAgICAgICAgICAgICB6Zi5TdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoInJlYWQgaW4gezB9IGVudHJpZXMuIiwgemYuX2VudHJpZXMuQ291bnQpOworCisgICAgICAgICAgICB6Zi5PblJlYWRDb21wbGV0ZWQoKTsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBUT0MgYnkgcmVhZGluZyBlYWNoIGVudHJ5IGluIHRoZSBmaWxlLgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlYWRJbnRvSW5zdGFuY2VfT3JpZyhaaXBGaWxlIHpmKQorICAgICAgICB7CisgICAgICAgICAgICB6Zi5PblJlYWRTdGFydGVkKCk7CisgICAgICAgICAgICAvL3pmLl9lbnRyaWVzID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8WmlwRW50cnk+KCk7CisgICAgICAgICAgICB6Zi5fZW50cmllcyA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5PFN0cmluZyxaaXBFbnRyeT4oKTsKKworICAgICAgICAgICAgWmlwRW50cnkgZTsKKyAgICAgICAgICAgIGlmICh6Zi5WZXJib3NlKQorICAgICAgICAgICAgICAgIGlmICh6Zi5OYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHpmLlN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgiUmVhZGluZyB6aXAgZnJvbSBzdHJlYW0uLi4iKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHpmLlN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgiUmVhZGluZyB6aXAgezB9Li4uIiwgemYuTmFtZSk7CisKKyAgICAgICAgICAgIC8vIHdvcmsgaXRlbSA2NjQ3OiAgUEswMCAocGFja2VkIHRvIHJlbW92YWJsZSBkaXNrKQorICAgICAgICAgICAgYm9vbCBmaXJzdEVudHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIFppcENvbnRhaW5lciB6YyA9IG5ldyBaaXBDb250YWluZXIoemYpOworICAgICAgICAgICAgd2hpbGUgKChlID0gWmlwRW50cnkuUmVhZEVudHJ5KHpjLCBmaXJzdEVudHJ5KSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemYuVmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgemYuU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCIgIHswfSIsIGUuRmlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgemYuX2VudHJpZXMuQWRkKGUuRmlsZU5hbWUsZSk7CisgICAgICAgICAgICAgICAgZmlyc3RFbnRyeSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWFkIHRoZSB6aXBmaWxlJ3MgY2VudHJhbCBkaXJlY3Rvcnkgc3RydWN0dXJlIGhlcmUuCisgICAgICAgICAgICAvLyB3b3JraXRlbSA5OTEyCisgICAgICAgICAgICAvLyBCdXQsIGJlY2F1c2UgaXQgbWF5IGJlIGNvcnJ1cHRlZCwgaWdub3JlIGVycm9ycy4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFppcEVudHJ5IGRlOworICAgICAgICAgICAgICAgIC8vIGluIGxpZXUgb2YgaGFzaHNldCwgdXNlIGEgZGljdGlvbmFyeQorICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c2x5U2VlbiA9IG5ldyBEaWN0aW9uYXJ5PFN0cmluZyxPYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKChkZSA9IFppcEVudHJ5LlJlYWREaXJFbnRyeSh6ZiwgcHJldmlvdXNseVNlZW4pKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSG91c2VrZWVwaW5nOiBTaW5jZSBaaXBGaWxlIGV4cG9zZXMgWmlwRW50cnkgZWxlbWVudHMgaW4gdGhlIGVudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY29weSB0aGUgY29tbWVudCB0aGF0IHdlIGdyYWIgZnJvbSB0aGUgWmlwRGlyRW50cnkKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgWmlwRW50cnksIHNvIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWNjZXNzIHRoZSBjb21tZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHNpbmNlIFppcEVudHJ5IGlzIHVzZWQgdG8gV3JpdGUgemlwIGZpbGVzLCB3ZSBuZWVkIHRvIGNvcHkgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgYXR0cmlidXRlcyB0byB0aGUgWmlwRW50cnkgYXMgYXBwcm9wcmlhdGUuCisgICAgICAgICAgICAgICAgICAgIFppcEVudHJ5IGUxID0gemYuX2VudHJpZXNbZGUuRmlsZU5hbWVdOworICAgICAgICAgICAgICAgICAgICBpZiAoZTEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZTEuX0NvbW1lbnQgPSBkZS5Db21tZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlLklzRGlyZWN0b3J5KSBlMS5NYXJrQXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5U2Vlbi5BZGQoZGUuRmlsZU5hbWUsbnVsbCk7IC8vIHRvIHByZXZlbnQgZHVwZXMKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4Mjk5CisgICAgICAgICAgICAgICAgaWYgKHpmLl9sb2NFbmRPZkNEUyA+IDApCisgICAgICAgICAgICAgICAgICAgIHpmLlJlYWRTdHJlYW0uU2Vlayh6Zi5fbG9jRW5kT2ZDRFMsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgUmVhZENlbnRyYWxEaXJlY3RvcnlGb290ZXIoemYpOworCisgICAgICAgICAgICAgICAgaWYgKHpmLlZlcmJvc2UgJiYgIVN0cmluZy5Jc051bGxPckVtcHR5KHpmLkNvbW1lbnQpKQorICAgICAgICAgICAgICAgICAgICB6Zi5TdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoIlppcCBmaWxlIENvbW1lbnQ6IHswfSIsIHpmLkNvbW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFppcEV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pIHsgfQorCisgICAgICAgICAgICB6Zi5PblJlYWRDb21wbGV0ZWQoKTsKKyAgICAgICAgfQorCisKKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUmVhZENlbnRyYWxEaXJlY3RvcnlGb290ZXIoWmlwRmlsZSB6ZikKKyAgICAgICAgeworICAgICAgICAgICAgU3RyZWFtIHMgPSB6Zi5SZWFkU3RyZWFtOworICAgICAgICAgICAgaW50IHNpZ25hdHVyZSA9IElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuUmVhZFNpZ25hdHVyZShzKTsKKworICAgICAgICAgICAgYnl0ZVtdIGJsb2NrID0gbnVsbDsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGlmIChzaWduYXR1cmUgPT0gWmlwQ29uc3RhbnRzLlppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkU2lnbmF0dXJlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBaSVA2NCBFT0NECisgICAgICAgICAgICAgICAgLy8gVGhpcyBkYXRhIGJsb2NrIGlzIDQgYnl0ZXMgc2lnLCA4IGJ5dGVzIHNpemUsIDQ0IGJ5dGVzIGZpeGVkIGRhdGEsCisgICAgICAgICAgICAgICAgLy8gZm9sbG93ZWQgYnkgYSB2YXJpYWJsZS1zaXplZCBleHRlbnNpb24gYmxvY2suICBXZSBoYXZlIHJlYWQgdGhlIHNpZyBhbHJlYWR5LgorICAgICAgICAgICAgICAgIC8vIDggLSBkYXRhc2l6ZSAoNjQgYml0cykKKyAgICAgICAgICAgICAgICAvLyAyIC0gdmVyc2lvbiBtYWRlIGJ5CisgICAgICAgICAgICAgICAgLy8gMiAtIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QKKyAgICAgICAgICAgICAgICAvLyA0IC0gbnVtYmVyIG9mIHRoaXMgZGlzaworICAgICAgICAgICAgICAgIC8vIDQgLSBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIENECisgICAgICAgICAgICAgICAgLy8gOCAtIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBDRCBvbiB0aGlzIGRpc2sKKyAgICAgICAgICAgICAgICAvLyA4IC0gdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIENECisgICAgICAgICAgICAgICAgLy8gOCAtIHNpemUgb2YgdGhlIENECisgICAgICAgICAgICAgICAgLy8gOCAtIG9mZnNldCBvZiB0aGUgQ0QKKyAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIC8vIDUyIGJ5dGVzCisKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlWzggKyA0NF07CisgICAgICAgICAgICAgICAgcy5SZWFkKGJsb2NrLCAwLCBibG9jay5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgSW50NjQgRGF0YVNpemUgPSBCaXRDb252ZXJ0ZXIuVG9JbnQ2NChibG9jaywgMCk7ICAvLyA9PSA0NCArIHRoZSB2YXJpYWJsZSBsZW5ndGgKKworICAgICAgICAgICAgICAgIGlmIChEYXRhU2l6ZSA8IDQ0KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJCYWQgc2l6ZSBpbiB0aGUgWklQNjQgQ2VudHJhbCBEaXJlY3RvcnkuIik7CisKKyAgICAgICAgICAgICAgICB6Zi5fdmVyc2lvbk1hZGVCeSA9IEJpdENvbnZlcnRlci5Ub1VJbnQxNihibG9jaywgaik7CisgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICAgIHpmLl92ZXJzaW9uTmVlZGVkVG9FeHRyYWN0ID0gQml0Q29udmVydGVyLlRvVUludDE2KGJsb2NrLCBqKTsKKyAgICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgICAgemYuX2Rpc2tOdW1iZXJXaXRoQ2QgPSBCaXRDb252ZXJ0ZXIuVG9VSW50MzIoYmxvY2ssIGopOworICAgICAgICAgICAgICAgIGogKz0gMjsKKworICAgICAgICAgICAgICAgIC8vemYuX2Rpc2tOdW1iZXJXaXRoQ2QrKzsgLy8gaGFjayEhCisKKyAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSBleHRlbmRlZCBibG9jaworICAgICAgICAgICAgICAgIGJsb2NrID0gbmV3IGJ5dGVbRGF0YVNpemUgLSA0NF07CisgICAgICAgICAgICAgICAgcy5SZWFkKGJsb2NrLCAwLCBibG9jay5MZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgdGhlIHJlc3VsdAorCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5SZWFkU2lnbmF0dXJlKHMpOworICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmUgIT0gWmlwQ29uc3RhbnRzLlppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5TG9jYXRvclNpZ25hdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiSW5jb25zaXN0ZW50IG1ldGFkYXRhIGluIHRoZSBaSVA2NCBDZW50cmFsIERpcmVjdG9yeS4iKTsKKworICAgICAgICAgICAgICAgIGJsb2NrID0gbmV3IGJ5dGVbMTZdOworICAgICAgICAgICAgICAgIHMuUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIHRoZSByZXN1bHQKKworICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IElvbmljLlppcC5TaGFyZWRVdGlsaXRpZXMuUmVhZFNpZ25hdHVyZShzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhyb3cgaWYgdGhpcyBpcyBub3QgYSBzaWduYXR1cmUgZm9yICJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIgorICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNhbml0eSBjaGVjay4KKyAgICAgICAgICAgIGlmIChzaWduYXR1cmUgIT0gWmlwQ29uc3RhbnRzLkVuZE9mQ2VudHJhbERpcmVjdG9yeVNpZ25hdHVyZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLlNlZWsoLTQsIFNlZWtPcmlnaW4uQ3VycmVudCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlYWRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiQmFkIHNpZ25hdHVyZSAoezA6WDh9KSBhdCBwb3NpdGlvbiAweHsxOlg4fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsIHMuUG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVhZCB0aGUgRW5kLW9mLUNlbnRyYWwtRGlyZWN0b3J5LVJlY29yZAorICAgICAgICAgICAgYmxvY2sgPSBuZXcgYnl0ZVsxNl07CisgICAgICAgICAgICB6Zi5SZWFkU3RyZWFtLlJlYWQoYmxvY2ssIDAsIGJsb2NrLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIG9mZiBzeiAgZGF0YQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgLy8gIDAgICA0ICBlbmQgb2YgY2VudHJhbCBkaXIgc2lnbmF0dXJlICgweDA2MDU0YjUwKQorICAgICAgICAgICAgLy8gIDQgICAyICBudW1iZXIgb2YgdGhpcyBkaXNrCisgICAgICAgICAgICAvLyAgNiAgIDIgIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgLy8gIDggICAyICB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgIGNlbnRyYWwgZGlyZWN0b3J5IG9uIHRoaXMgZGlzaworICAgICAgICAgICAgLy8gMTAgICAyICB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiAgdGhlIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICAgICAgICAvLyAxMiAgIDQgIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICAgICAgICAvLyAxNiAgIDQgIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyCisgICAgICAgICAgICAvLyAyMCAgIDIgIFpJUCBmaWxlIGNvbW1lbnQgbGVuZ3RoCisgICAgICAgICAgICAvLyAyMiAgPz8gIFpJUCBmaWxlIGNvbW1lbnQKKworICAgICAgICAgICAgaWYgKHpmLl9kaXNrTnVtYmVyV2l0aENkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemYuX2Rpc2tOdW1iZXJXaXRoQ2QgPSBCaXRDb252ZXJ0ZXIuVG9VSW50MTYoYmxvY2ssIDIpOworICAgICAgICAgICAgICAgIC8vemYuX2Rpc2tOdW1iZXJXaXRoQ2QrKzsgLy8gaGFjayEhCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIGNvbW1lbnQgaGVyZQorICAgICAgICAgICAgUmVhZFppcEZpbGVDb21tZW50KHpmKTsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlYWRaaXBGaWxlQ29tbWVudChaaXBGaWxlIHpmKQorICAgICAgICB7CisgICAgICAgICAgICAvLyByZWFkIHRoZSBjb21tZW50IGhlcmUKKyAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG5ldyBieXRlWzJdOworICAgICAgICAgICAgemYuUmVhZFN0cmVhbS5SZWFkKGJsb2NrLCAwLCBibG9jay5MZW5ndGgpOworCisgICAgICAgICAgICBJbnQxNiBjb21tZW50TGVuZ3RoID0gKHNob3J0KShibG9ja1swXSArIGJsb2NrWzFdICogMjU2KTsKKyAgICAgICAgICAgIGlmIChjb21tZW50TGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBieXRlW2NvbW1lbnRMZW5ndGhdOworICAgICAgICAgICAgICAgIHpmLlJlYWRTdHJlYW0uUmVhZChibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMzkyIC0gcHJlZmVyIFByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgLy8gZmlyc3QuICBUaGUgZml4IGZvciB3b3JraXRlbSA2NTEzIHRyaWVkIHRvIHVzZSBVVEY4CisgICAgICAgICAgICAgICAgLy8gb25seSBhcyBuZWNlc3NhcnksIGJ1dCB0aGF0IGlzIGltcG9zc2libGUgdG8gdGVzdAorICAgICAgICAgICAgICAgIC8vIGZvciwgaW4gdGhpcyBkaXJlY3Rpb24uIFRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgd2hhdAorICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgdGhlIGFscmVhZHktZW5jb2RlZCBieXRlcyByZWZlcgorICAgICAgICAgICAgICAgIC8vIHRvLiBUaGVyZWZvcmUsIG11c3QgZG8gd2hhdCB0aGUgdXNlciB0ZWxscyB1cy4KKworICAgICAgICAgICAgICAgIHN0cmluZyBzMSA9IHpmLkFsdGVybmF0ZUVuY29kaW5nLkdldFN0cmluZyhibG9jaywgMCwgYmxvY2suTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB6Zi5Db21tZW50ID0gczE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHByaXZhdGUgc3RhdGljIGJvb2wgQmxvY2tzQXJlRXF1YWwoYnl0ZVtdIGEsIGJ5dGVbXSBiKQorICAgICAgICAvLyB7CisgICAgICAgIC8vICAgICBpZiAoYS5MZW5ndGggIT0gYi5MZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5MZW5ndGg7IGkrKykKKyAgICAgICAgLy8gICAgIHsKKyAgICAgICAgLy8gICAgICAgICBpZiAoYVtpXSAhPSBiW2ldKSByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vICAgICB9CisgICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDaGVja3MgdGhlIGdpdmVuIGZpbGUgdG8gc2VlIGlmIGl0IGFwcGVhcnMgdG8gYmUgYSB2YWxpZCB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8c2VlIGNyZWY9IklzWmlwRmlsZShzdHJpbmcsCisgICAgICAgIC8vLyAgIGJvb2wpIi8+IHdpdGggdGhlIHRlc3RFeHRyYWN0IHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj5UaGUgZmlsZSB0byBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgZmlsZSBhcHBlYXJzIHRvIGJlIGEgemlwIGZpbGUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNaaXBGaWxlKHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIElzWmlwRmlsZShmaWxlTmFtZSwgZmFsc2UpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDaGVja3MgYSBmaWxlIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIG9wZW5zIHRoZSBzcGVjaWZpZWQgemlwIGZpbGUsIHJlYWRzIGluIHRoZSB6aXAgYXJjaGl2ZSwKKyAgICAgICAgLy8vICAgdmVyaWZ5aW5nIHRoZSBaSVAgbWV0YWRhdGEgYXMgaXQgcmVhZHMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIGV2ZXJ5dGhpbmcgc3VjY2VlZHMsIHRoZW4gdGhlIG1ldGhvZCByZXR1cm5zIHRydWUuICBJZiBhbnl0aGluZyBmYWlscyAtCisgICAgICAgIC8vLyAgIGZvciBleGFtcGxlIGlmIGFuIGluY29ycmVjdCBzaWduYXR1cmUgb3IgQ1JDIGlzIGZvdW5kLCBpbmRpY2F0aW5nIGEKKyAgICAgICAgLy8vICAgY29ycnVwdCBmaWxlLCB0aGUgdGhlIG1ldGhvZCByZXR1cm5zIGZhbHNlLiAgVGhpcyBtZXRob2QgYWxzbyByZXR1cm5zCisgICAgICAgIC8vLyAgIGZhbHNlIGZvciBhIGZpbGUgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgPHBhcmFtcmVmIG5hbWU9InRlc3RFeHRyYWN0Ii8+IGlzIHRydWUsIGFzIHBhcnQgb2YgaXRzIGNoZWNrLCB0aGlzCisgICAgICAgIC8vLyAgIG1ldGhvZCByZWFkcyBpbiB0aGUgY29udGVudCBmb3IgZWFjaCBlbnRyeSwgZXhwYW5kcyBpdCwgYW5kIGNoZWNrcyBDUkNzLgorICAgICAgICAvLy8gICBUaGlzIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgY2hlY2sgYmV5b25kIHZlcmlmeWluZyB0aGUgemlwIGhlYWRlciBhbmQKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IGRhdGEuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIDxwYXJhbXJlZiBuYW1lPSJ0ZXN0RXh0cmFjdCIvPiBpcyB0cnVlLCBhbmQgaWYgYW55IG9mIHRoZSB6aXAgZW50cmllcworICAgICAgICAvLy8gICBhcmUgcHJvdGVjdGVkIHdpdGggYSBwYXNzd29yZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UuICBJZiB5b3Ugd2FudAorICAgICAgICAvLy8gICB0byB2ZXJpZnkgYSA8Yz5aaXBGaWxlPC9jPiB0aGF0IGhhcyBlbnRyaWVzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgd2l0aCBhCisgICAgICAgIC8vLyAgIHBhc3N3b3JkLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIHRoYXQgbWFudWFsbHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIHppcCBmaWxlIHRvIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGVzdEV4dHJhY3QiPnRydWUgaWYgdGhlIGNhbGxlciB3YW50cyB0byBleHRyYWN0IGVhY2ggZW50cnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlIGZpbGUgY29udGFpbnMgYSB2YWxpZCB6aXAgZmlsZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc1ppcEZpbGUoc3RyaW5nIGZpbGVOYW1lLCBib29sIHRlc3RFeHRyYWN0KQorICAgICAgICB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFGaWxlLkV4aXN0cyhmaWxlTmFtZSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcyA9IEZpbGUuT3BlbihmaWxlTmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkLCBGaWxlU2hhcmUuUmVhZFdyaXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IElzWmlwRmlsZShzLCB0ZXN0RXh0cmFjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgIGNhdGNoIChaaXBFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2hlY2tzIGEgc3RyZWFtIHRvIHNlZSBpZiBpdCBjb250YWlucyBhIHZhbGlkIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCByZWFkcyB0aGUgemlwIGFyY2hpdmUgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgc3RyZWFtLCB2ZXJpZnlpbmcKKyAgICAgICAgLy8vIHRoZSBaSVAgbWV0YWRhdGEgYXMgaXQgcmVhZHMuICBJZiB0ZXN0RXh0cmFjdCBpcyB0cnVlLCB0aGlzIG1ldGhvZCBhbHNvIGV4dHJhY3RzCisgICAgICAgIC8vLyBlYWNoIGVudHJ5IGluIHRoZSBhcmNoaXZlLCBkdW1waW5nIGFsbCB0aGUgYml0cyBpbnRvIDxzZWUgY3JlZj0iU3RyZWFtLk51bGwiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBJZiBldmVyeXRoaW5nIHN1Y2NlZWRzLCB0aGVuIHRoZSBtZXRob2QgcmV0dXJucyB0cnVlLiAgSWYgYW55dGhpbmcgZmFpbHMgLQorICAgICAgICAvLy8gZm9yIGV4YW1wbGUgaWYgYW4gaW5jb3JyZWN0IHNpZ25hdHVyZSBvciBDUkMgaXMgZm91bmQsIGluZGljYXRpbmcgYSBjb3JydXB0CisgICAgICAgIC8vLyBmaWxlLCB0aGUgdGhlIG1ldGhvZCByZXR1cm5zIGZhbHNlLiAgVGhpcyBtZXRob2QgYWxzbyByZXR1cm5zIGZhbHNlIGZvciBhCisgICAgICAgIC8vLyBmaWxlIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBJZiA8Yz50ZXN0RXh0cmFjdDwvYz4gaXMgdHJ1ZSwgdGhpcyBtZXRob2QgcmVhZHMgaW4gdGhlIGNvbnRlbnQgZm9yIGVhY2gKKyAgICAgICAgLy8vIGVudHJ5LCBleHBhbmRzIGl0LCBhbmQgY2hlY2tzIENSQ3MuICBUaGlzIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgY2hlY2sKKyAgICAgICAgLy8vIGJleW9uZCB2ZXJpZnlpbmcgdGhlIHppcCBoZWFkZXIgZGF0YS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIElmIDxjPnRlc3RFeHRyYWN0PC9jPiBpcyB0cnVlLCBhbmQgaWYgYW55IG9mIHRoZSB6aXAgZW50cmllcyBhcmUgcHJvdGVjdGVkCisgICAgICAgIC8vLyB3aXRoIGEgcGFzc3dvcmQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlLiAgSWYgeW91IHdhbnQgdG8gdmVyaWZ5IGEKKyAgICAgICAgLy8vIFppcEZpbGUgdGhhdCBoYXMgZW50cmllcyB3aGljaCBhcmUgcHJvdGVjdGVkIHdpdGggYSBwYXNzd29yZCwgeW91IHdpbGwgbmVlZAorICAgICAgICAvLy8gdG8gZG8gdGhhdCBtYW51YWxseS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJc1ppcEZpbGUoc3RyaW5nLCBib29sKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gdG8gY2hlY2suPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0ZXN0RXh0cmFjdCI+dHJ1ZSBpZiB0aGUgY2FsbGVyIHdhbnRzIHRvIGV4dHJhY3QgZWFjaCBlbnRyeS48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUgc3RyZWFtIGNvbnRhaW5zIGEgdmFsaWQgemlwIGFyY2hpdmUuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNaaXBGaWxlKFN0cmVhbSBzdHJlYW0sIGJvb2wgdGVzdEV4dHJhY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJzdHJlYW0iKTsKKworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3RyZWFtLkNhblJlYWQpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIHZhciBiaXRCdWNrZXQgPSBTdHJlYW0uTnVsbDsKKworICAgICAgICAgICAgICAgIHVzaW5nIChaaXBGaWxlIHppcDEgPSBaaXBGaWxlLlJlYWQoc3RyZWFtLCBudWxsLCBudWxsLCBudWxsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0RXh0cmFjdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGUgaW4gemlwMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuSXNEaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLkV4dHJhY3QoYml0QnVja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICBjYXRjaCAoWmlwRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5TYXZlLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5TYXZlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLlNhdmUuY3MKQEAgLTAsMCArMSw5NjQgQEAKKy8vIFppcEZpbGUuU2F2ZS5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5IERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1BdWd1c3QtMDUgMTM6MzE6MjM+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBmb3IgU2F2ZSBvcGVyYXRpb25zIG9uIHppcCBmaWxlcy4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAKK3sKKworICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgWmlwRmlsZQorICAgIHsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIERlbGV0ZSBmaWxlIHdpdGggcmV0cnkgb24gVW5hdXRob3JpemVkQWNjZXNzRXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBXaGVuIGNhbGxpbmcgRmlsZS5EZWxldGUoKSBvbiBhIGZpbGUgdGhhdCBoYXMgYmVlbiAicmVjZW50bHkiCisgICAgICAgIC8vLyAgICAgY3JlYXRlZCwgdGhlIGNhbGwgc29tZXRpbWVzIGZhaWxzIHdpdGgKKyAgICAgICAgLy8vICAgICBVbmF1dGhvcml6ZWRBY2Nlc3NFeGNlcHRpb24uIFRoaXMgbWV0aG9kIHNpbXBseSByZXRyaWVzIHRoZSBEZWxldGUgMworICAgICAgICAvLy8gICAgIHRpbWVzIHdpdGggYSBzbGVlcCBiZXR3ZWVuIHRyaWVzLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9J2ZpbGVuYW1lJz50aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBkZWxldGVkPC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlbGV0ZUZpbGVXaXRoUmV0cnkoc3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGludCBuUmV0cmllcyA9IDM7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBuUmV0cmllcyAmJiAhZG9uZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5VbmF1dGhvcml6ZWRBY2Nlc3NFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUmV0cnkgZGVsZXRlLiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCgyMDAraSoyMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTYXZlcyB0aGUgWmlwIGFyY2hpdmUgdG8gYSBmaWxlLCBzcGVjaWZpZWQgYnkgdGhlIE5hbWUgcHJvcGVydHkgb2YgdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSBpcyB3cml0dGVuIHRvIHN0b3JhZ2UsIHR5cGljYWxseSBhIHppcCBmaWxlCisgICAgICAgIC8vLyAgIGluIGEgZmlsZXN5c3RlbSwgb25seSB3aGVuIHRoZSBjYWxsZXIgY2FsbHMgPGM+U2F2ZTwvYz4uICBJbiB0aGUgdHlwaWNhbAorICAgICAgICAvLy8gICBjYXNlLCB0aGUgU2F2ZSBvcGVyYXRpb24gd3JpdGVzIHRoZSB6aXAgY29udGVudCB0byBhIHRlbXBvcmFyeSBmaWxlLCBhbmQKKyAgICAgICAgLy8vICAgdGhlbiByZW5hbWVzIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byB0aGUgZGVzaXJlZCBuYW1lLiBJZiBuZWNlc3NhcnksIHRoaXMKKyAgICAgICAgLy8vICAgbWV0aG9kIHdpbGwgZGVsZXRlIGEgcHJlLWV4aXN0aW5nIGZpbGUgYmVmb3JlIHRoZSByZW5hbWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSA8c2VlIGNyZWY9IlppcEZpbGUuTmFtZSIvPiBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgZWl0aGVyIGV4cGxpY2l0bHksCisgICAgICAgIC8vLyAgIG9yIGltcGxpY2l0bHkgdXNpbmcgb25lIG9mIHRoZSBwYXJhbWV0ZXJpemVkIFppcEZpbGUgY29uc3RydWN0b3JzLiAgRm9yCisgICAgICAgIC8vLyAgIENPTSBBdXRvbWF0aW9uIGNsaWVudHMsIHRoZSA8Yz5OYW1lPC9jPiBwcm9wZXJ0eSBtdXN0IGJlIHNldCBleHBsaWNpdGx5LAorICAgICAgICAvLy8gICBiZWNhdXNlIENPTSBBdXRvbWF0aW9uIGNsaWVudHMgY2Fubm90IGNhbGwgcGFyYW1ldGVyaXplZCBjb25zdHJ1Y3RvcnMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gdXNpbmcgYSBmaWxlc3lzdGVtIGZpbGUgZm9yIHRoZSBaaXAgb3V0cHV0LCBpdCBpcyBwb3NzaWJsZSB0byBjYWxsCisgICAgICAgIC8vLyAgIDxjPlNhdmU8L2M+IG11bHRpcGxlIHRpbWVzIG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4gV2l0aCBlYWNoCisgICAgICAgIC8vLyAgIGNhbGwgdGhlIHppcCBjb250ZW50IGlzIHJlLXdyaXR0ZW4gdG8gdGhlIHNhbWUgb3V0cHV0IGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIERhdGEgZm9yIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIDxjPlppcEZpbGU8L2M+IGluc3RhbmNlIGlzCisgICAgICAgIC8vLyAgIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCB3aGVuIHRoZSA8Yz5TYXZlPC9jPiBtZXRob2QgaXMgY2FsbGVkLiBUaGlzIG1lYW5zCisgICAgICAgIC8vLyAgIHRoYXQgdGhlIGlucHV0IHN0cmVhbXMgZm9yIHRob3NlIGVudHJpZXMgbXVzdCBiZSBhdmFpbGFibGUgYXQgdGhlIHRpbWUKKyAgICAgICAgLy8vICAgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIDxjPlNhdmU8L2M+LiAgSWYsIGZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgLy8vICAgYWRkcyBlbnRyaWVzIHdpdGggPGM+QWRkRW50cnk8L2M+IHVzaW5nIGEgZHluYW1pY2FsbHktYWxsb2NhdGVkCisgICAgICAgIC8vLyAgIDxjPk1lbW9yeVN0cmVhbTwvYz4sIHRoZSBtZW1vcnkgc3RyZWFtIG11c3Qgbm90IGhhdmUgYmVlbiBkaXNwb3NlZAorICAgICAgICAvLy8gICBiZWZvcmUgdGhlIGNhbGwgdG8gPGM+U2F2ZTwvYz4uIFNlZSB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5JbnB1dFN0cmVhbSIvPiBwcm9wZXJ0eSBmb3IgbW9yZSBkaXNjdXNzaW9uIG9mIHRoZQorICAgICAgICAvLy8gICBhdmFpbGFiaWxpdHkgcmVxdWlyZW1lbnRzIG9mIHRoZSBpbnB1dCBzdHJlYW0gZm9yIGFuIGVudHJ5LCBhbmQgYW4KKyAgICAgICAgLy8vICAgYXBwcm9hY2ggZm9yIHByb3ZpZGluZyBqdXN0LWluLXRpbWUgc3RyZWFtIGxpZmVjeWNsZSBtYW5hZ2VtZW50LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5BZGRFbnRyeShTdHJpbmcsIFN5c3RlbS5JTy5TdHJlYW0pIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJb25pYy5aaXAuQmFkU3RhdGVFeGNlcHRpb24iPgorICAgICAgICAvLy8gICBUaHJvd24gaWYgeW91IGhhdmVuJ3Qgc3BlY2lmaWVkIGEgbG9jYXRpb24gb3Igc3RyZWFtIGZvciBzYXZpbmcgdGhlIHppcCwKKyAgICAgICAgLy8vICAgZWl0aGVyIGluIHRoZSBjb25zdHJ1Y3RvciBvciBieSBzZXR0aW5nIHRoZSBOYW1lIHByb3BlcnR5LCBvciBpZiB5b3UgdHJ5CisgICAgICAgIC8vLyAgIHRvIHNhdmUgYSByZWd1bGFyIHppcCBhcmNoaXZlIHRvIGEgZmlsZW5hbWUgd2l0aCBhIC5leGUgZXh0ZW5zaW9uLgorICAgICAgICAvLy8gPC9leGNlcHRpb24+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJTeXN0ZW0uT3ZlcmZsb3dFeGNlcHRpb24iPgorICAgICAgICAvLy8gICBUaHJvd24gaWYgPHNlZSBjcmVmPSJNYXhPdXRwdXRTZWdtZW50U2l6ZSIvPiBpcyBub24temVybywgYW5kIHRoZSBudW1iZXIKKyAgICAgICAgLy8vICAgb2Ygc2VnbWVudHMgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBzcGFubmVkIHppcCBmaWxlIGR1cmluZyB0aGUKKyAgICAgICAgLy8vICAgc2F2ZSBvcGVyYXRpb24gZXhjZWVkcyA5OS4gIElmIHRoaXMgaGFwcGVucywgeW91IG5lZWQgdG8gaW5jcmVhc2UgdGhlCisgICAgICAgIC8vLyAgIHNlZ21lbnQgc2l6ZS4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIHZvaWQgU2F2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgdGhpc1NhdmVVc2VkWmlwNjQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBfc2F2ZU9wZXJhdGlvbkNhbmNlbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgX251bWJlck9mU2VnbWVudHNGb3JNb3N0UmVjZW50U2F2ZSA9IDA7CisgICAgICAgICAgICAgICAgT25TYXZlU3RhcnRlZCgpOworCisgICAgICAgICAgICAgICAgaWYgKFdyaXRlU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRTdGF0ZUV4Y2VwdGlvbigiWW91IGhhdmVuJ3Qgc3BlY2lmaWVkIHdoZXJlIHRvIHNhdmUgdGhlIHppcC4iKTsKKworICAgICAgICAgICAgICAgIGlmIChfbmFtZSAhPSBudWxsICYmIF9uYW1lLkVuZHNXaXRoKCIuZXhlIikgJiYgIV9TYXZpbmdTZngpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRTdGF0ZUV4Y2VwdGlvbigiWW91IHNwZWNpZmllZCBhbiBFWEUgZm9yIGEgcGxhaW4gemlwIGZpbGUuIik7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBtb2RpZmllZCwgYmVmb3JlIHNhdmluZy4KKyAgICAgICAgICAgICAgICBpZiAoIV9jb250ZW50c0NoYW5nZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPblNhdmVDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZlcmJvc2UpIFN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgiTm8gc2F2ZSBpcyBuZWNlc3NhcnkuLi4uIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBSZXNldCh0cnVlKTsKKworICAgICAgICAgICAgICAgIGlmIChWZXJib3NlKSBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoInNhdmluZy4uLi4iKTsKKworICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBudW1iZXIgb2YgZW50cmllcworICAgICAgICAgICAgICAgIGlmIChfZW50cmllcy5Db3VudCA+PSAweEZGRkYgJiYgX3ppcDY0ID09IFppcDY0T3B0aW9uLk5ldmVyKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJUaGUgbnVtYmVyIG9mIGVudHJpZXMgaXMgNjU1MzUgb3IgZ3JlYXRlci4gQ29uc2lkZXIgc2V0dGluZyB0aGUgVXNlWmlwNjRXaGVuU2F2aW5nIHByb3BlcnR5IG9uIHRoZSBaaXBGaWxlIGluc3RhbmNlLiIpOworCisKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBhbiBlbnRyeSBpbiB0aGUgemlwIGZvciBlYWNoIGZpbGUKKyAgICAgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gOTgzMQorICAgICAgICAgICAgICAgIElDb2xsZWN0aW9uPFppcEVudHJ5PiBjID0gKFNvcnRFbnRyaWVzQmVmb3JlU2F2aW5nKSA/IEVudHJpZXNTb3J0ZWQgOiBFbnRyaWVzOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gYykgLy8gX2VudHJpZXMuVmFsdWVzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPblNhdmVFbnRyeShuLCBlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZS5Xcml0ZShXcml0ZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfc2F2ZU9wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgICAgICBPblNhdmVFbnRyeShuLCBlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfc2F2ZU9wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBlbnRyaWVzIGNhbiBiZSBza2lwcGVkIGR1cmluZyB0aGUgc2F2ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuSW5jbHVkZWRJbk1vc3RSZWNlbnRTYXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1NhdmVVc2VkWmlwNjQgfD0gZS5PdXRwdXRVc2VkWmlwNjQuVmFsdWU7CisgICAgICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgICAgIGlmIChfc2F2ZU9wZXJhdGlvbkNhbmNlbGVkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICB2YXIgenNzID0gV3JpdGVTdHJlYW0gYXMgWmlwU2VnbWVudGVkU3RyZWFtOworCisgICAgICAgICAgICAgICAgX251bWJlck9mU2VnbWVudHNGb3JNb3N0UmVjZW50U2F2ZSA9ICh6c3MhPW51bGwpCisgICAgICAgICAgICAgICAgICAgID8genNzLkN1cnJlbnRTZWdtZW50CisgICAgICAgICAgICAgICAgICAgIDogMTsKKworICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0b3J5TmVlZGVkWmlwNjQgPQorICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXQuV3JpdGVDZW50cmFsRGlyZWN0b3J5U3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgIChXcml0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICBfbnVtYmVyT2ZTZWdtZW50c0Zvck1vc3RSZWNlbnRTYXZlLAorICAgICAgICAgICAgICAgICAgICAgX3ppcDY0LAorICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBaaXBDb250YWluZXIodGhpcykpOworCisgICAgICAgICAgICAgICAgT25TYXZlRXZlbnQoWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0FmdGVyU2F2ZVRlbXBBcmNoaXZlKTsKKworICAgICAgICAgICAgICAgIF9oYXNCZWVuU2F2ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIF9jb250ZW50c0NoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHRoaXNTYXZlVXNlZFppcDY0IHw9IGRpcmVjdG9yeU5lZWRlZFppcDY0OworICAgICAgICAgICAgICAgIF9PdXRwdXRVc2VzWmlwNjQgPSBuZXcgTnVsbGFibGU8Ym9vbD4odGhpc1NhdmVVc2VkWmlwNjQpOworCisKKyAgICAgICAgICAgICAgICAvLyBkbyB0aGUgcmVuYW1lIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmIChfbmFtZSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIChfdGVtcG9yYXJ5RmlsZU5hbWUhPW51bGwgfHwgenNzICE9IG51bGwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gX3RlbXBvcmFyeUZpbGVOYW1lIG1heSByZW1haW4gbnVsbCBpZiB3ZSBhcmUgd3JpdGluZyB0byBhIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjbG9zZSB0aGUgc3RyZWFtIGlmIHRoZXJlIGlzIGEgZmlsZSBiZWhpbmQgaXQuCisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0uQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAoX3NhdmVPcGVyYXRpb25DYW5jZWxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX2ZpbGVBbHJlYWR5RXhpc3RzICYmIHRoaXMuX3JlYWRzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBvcGVuZWQgYW5kIHJlYWQgYSB6aXAgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3cgc2F2aW5nIHRvIHRoZSBzYW1lIGZpbGUsIHdlIG5lZWQgdG8gY2xvc2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnIGZpbGUsIGZpcnN0LgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXJjaGl2ZVN0cmVhbSBmb3IgZWFjaCBlbnRyeSBuZWVkcyB0byBiZSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZSBpbiBjKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB6c3MxID0gZS5fYXJjaGl2ZVN0cmVhbSBhcyBaaXBTZWdtZW50ZWRTdHJlYW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpzczEgIT0gbnVsbCkKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c3MxLkNsb3NlKCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c3MxLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX2FyY2hpdmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRtcE5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoX25hbWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcHM6CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gRGVsZXRlIHRtcE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIG1vdmUgZXhpc3RpbmcgemlwIHRvIHRtcE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIHJlbmFtZSAoRmlsZS5Nb3ZlKSB3b3JraW5nIGZpbGUgdG8gbmFtZSBvZiBleGlzdGluZyB6aXAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQuIGRlbGV0ZSB0bXBOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzZXJpZXMgb2Ygc3RlcHMgYXZvaWRzIHRoZSBleGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0uSU8uSU9FeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICJDYW5ub3QgY3JlYXRlIGEgZmlsZSB3aGVuIHRoYXQgZmlsZSBhbHJlYWR5IGV4aXN0cy4iCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGp1c3QgY2FsbCBGaWxlLlJlcGxhY2UoKSBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgVEVNUCB2b2x1bWUgaXMgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB2b2x1bWUgZm9yIHRoZSBmaW5hbCBmaWxlIChjOlwgdnMgZDpcKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvIHdlIG5lZWQgdG8gZG8gYSBEZWxldGUrTW92ZSBwYWlyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCwgd2hlbiBkb2luZyB0aGUgZGVsZXRlLCBXaW5kb3dzIGFsbG93cyBhIHByb2Nlc3MgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgZmlsZSwgZXZlbiB0aG91Z2ggaXQgaXMgaGVsZCBvcGVuIGJ5LCBzYXksIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpcnVzIHNjYW5uZXIuIEl0IGdldHMgaW50ZXJuYWxseSBtYXJrZWQgYXMgImRlbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyIuIFRoZSBmaWxlIGRvZXMgbm90IGFjdHVhbGx5IGdldCByZW1vdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHN5c3RlbSwgaXQgaXMgc3RpbGwgdGhlcmUgYWZ0ZXIgdGhlIEZpbGUuRGVsZXRlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBtb3ZlIHRoZSBleGlzdGluZyB6aXAsIHdoaWNoIG1heSBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVsZCBvcGVuLCB0byBzb21lIG90aGVyIG5hbWUuIFRoZW4gcmVuYW1lIG91ciB3b3JraW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHRvIHRoZSBkZXNpcmVkIG5hbWUsIHRoZW4gZGVsZXRlIChwb3NzaWJseSBkZWxldGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcpIHRoZSAib3RoZXIgbmFtZSIuCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHdvdWxkIGJlIHRyYW5zYWN0aW9uYWwuIEl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBzdWNjZWVkcyBhbmQgdGhlIG1vdmUgZmFpbHMuIExhY2tpbmcgdHJhbnNhY3Rpb25zLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBraW5kIG9mIGZhaWx1cmUgaGFwcGVucywgd2UncmUgaG9zZWQsIGFuZCB0aGlzIGxvZ2ljIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IG9uIHRoZSBuZXh0IEZpbGUuTW92ZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZS5EZWxldGUoX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTA0NDcKKyNpZiBORVRDRiB8fCBTSUxWRVJMSUdIVAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wTmFtZSA9IF9uYW1lICsgIi4iICsgU2hhcmVkVXRpbGl0aWVzLkdlbmVyYXRlUmFuZG9tU3RyaW5nSW1wbCg4LDApICsgIi50bXAiOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcE5hbWUgPSBfbmFtZSArICIuIiArIFBhdGguR2V0UmFuZG9tRmlsZU5hbWUoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHRtcE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZUZpbGVXaXRoUmV0cnkodG1wTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLk1vdmUoX25hbWUsIHRtcE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgT25TYXZlRXZlbnQoWmlwUHJvZ3Jlc3NFdmVudFR5cGUuU2F2aW5nX0JlZm9yZVJlbmFtZVRlbXBBcmNoaXZlKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5Nb3ZlKCh6c3MgIT0gbnVsbCkgPyB6c3MuQ3VycmVudFRlbXBOYW1lIDogX3RlbXBvcmFyeUZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWUpOworCisgICAgICAgICAgICAgICAgICAgIE9uU2F2ZUV2ZW50KFppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlclJlbmFtZVRlbXBBcmNoaXZlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodG1wTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgY3JpdGljYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHModG1wTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKHRtcE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjYXJlIGFib3V0IGV4Y2VwdGlvbnMgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9maWxlQWxyZWFkeUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTm90aWZ5RW50cmllc1NhdmVDb21wbGV0ZShjKTsKKyAgICAgICAgICAgICAgICBPblNhdmVDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBfSnVzdFNhdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNTA0MworICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsZWFudXBBZnRlclNhdmVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTm90aWZ5RW50cmllc1NhdmVDb21wbGV0ZShJQ29sbGVjdGlvbjxaaXBFbnRyeT4gYykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZSBpbiAgYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlLk5vdGlmeVNhdmVDb21wbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgUmVtb3ZlVGVtcEZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoX3RlbXBvcmFyeUZpbGVOYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKF90ZW1wb3JhcnlGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4MSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJaaXBGaWxlOjpTYXZlOiBjb3VsZCBub3QgZGVsZXRlIHRlbXAgZmlsZTogezB9LiIsIGV4MS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENsZWFudXBBZnRlclNhdmVPcGVyYXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSB0aGUgc3RyZWFtIGlmIHRoZXJlIGlzIGEgZmlsZSBiZWhpbmQgaXQuCisgICAgICAgICAgICAgICAgaWYgKF93cml0ZXN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDc3MDQKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICAgICAgX3dyaXRlc3RyZWFtLkNsb3NlKCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX3dyaXRlc3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uSU8uSU9FeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfd3JpdGVzdHJlYW0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKF90ZW1wb3JhcnlGaWxlTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3ZlVGVtcEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RlbXBvcmFyeUZpbGVOYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhdmUgdGhlIGZpbGUgdG8gYSBuZXcgemlwZmlsZSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHppcAorICAgICAgICAvLy8gZmlsZSB3aGVuIHNhdmluZy4gVXNlIHRoaXMgd2hlbiBjcmVhdGluZyBhIG5ldyB6aXAgZmlsZSwgb3Igd2hlbgorICAgICAgICAvLy8gdXBkYXRpbmcgYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIEFuIGFwcGxpY2F0aW9uIGNhbiBhbHNvIHNhdmUgYSB6aXAgYXJjaGl2ZSBpbiBzZXZlcmFsIHBsYWNlcyBieSBjYWxsaW5nIHRoaXMKKyAgICAgICAgLy8vIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyBpbiBzdWNjZXNzaW9uLCB3aXRoIGRpZmZlcmVudCBmaWxlbmFtZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGUgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UgaXMgd3JpdHRlbiB0byBzdG9yYWdlLCB0eXBpY2FsbHkgYSB6aXAgZmlsZSBpbiBhCisgICAgICAgIC8vLyBmaWxlc3lzdGVtLCBvbmx5IHdoZW4gdGhlIGNhbGxlciBjYWxscyA8Yz5TYXZlPC9jPi4gIFRoZSBTYXZlIG9wZXJhdGlvbiB3cml0ZXMKKyAgICAgICAgLy8vIHRoZSB6aXAgY29udGVudCB0byBhIHRlbXBvcmFyeSBmaWxlLCBhbmQgdGhlbiByZW5hbWVzIHRoZSB0ZW1wb3JhcnkgZmlsZQorICAgICAgICAvLy8gdG8gdGhlIGRlc2lyZWQgbmFtZS4gSWYgbmVjZXNzYXJ5LCB0aGlzIG1ldGhvZCB3aWxsIGRlbGV0ZSBhIHByZS1leGlzdGluZyBmaWxlCisgICAgICAgIC8vLyBiZWZvcmUgdGhlIHJlbmFtZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iPgorICAgICAgICAvLy8gVGhyb3duIGlmIHlvdSBzcGVjaWZ5IGEgZGlyZWN0b3J5IGZvciB0aGUgZmlsZW5hbWUuCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPgorICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIHppcCBhcmNoaXZlIHRvIHNhdmUgdG8uIEV4aXN0aW5nIGZpbGVzIHdpbGwKKyAgICAgICAgLy8vIGJlIG92ZXJ3cml0dGVuIHdpdGggZ3JlYXQgcHJlanVkaWNlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY3JlYXRlIGFuZCBTYXZlIGEgemlwIGZpbGUuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcC5BZGREaXJlY3RvcnkoQCJjOlxyZXBvcnRzXEphbnVhcnkiKTsKKyAgICAgICAgLy8vICAgemlwLlNhdmUoIkphbnVhcnkuemlwIik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIE5ldyBaaXBGaWxlKCkKKyAgICAgICAgLy8vICAgemlwLkFkZERpcmVjdG9yeSgiYzpccmVwb3J0c1xKYW51YXJ5IikKKyAgICAgICAgLy8vICAgemlwLlNhdmUoIkphbnVhcnkuemlwIikKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXBkYXRlIGEgemlwIGZpbGUuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCgiRXhpc3RpbmdBcmNoaXZlLnppcCIpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICB6aXAuQWRkRmlsZSgiTmV3RGF0YS5jc3YiKTsKKyAgICAgICAgLy8vICAgemlwLlNhdmUoIlVwZGF0ZWRBcmNoaXZlLnppcCIpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKCJFeGlzdGluZ0FyY2hpdmUuemlwIikKKyAgICAgICAgLy8vICAgemlwLkFkZEZpbGUoIk5ld0RhdGEuY3N2IikKKyAgICAgICAgLy8vICAgemlwLlNhdmUoIlVwZGF0ZWRBcmNoaXZlLnppcCIpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmUoU3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgYXJlIHJlLXNhdmluZyBhIHppcCBhcmNoaXZlCisgICAgICAgICAgICAvLyB0aGF0IHdhcyBvcmlnaW5hbGx5IGluc3RhbnRpYXRlZCB3aXRoIGEgc3RyZWFtLiAgSW4gdGhhdCBjYXNlLAorICAgICAgICAgICAgLy8gdGhlIF9uYW1lIHdpbGwgYmUgbnVsbC4gSWYgc28sIHdlIHNldCBfd3JpdGVzdHJlYW0gdG8gbnVsbCwKKyAgICAgICAgICAgIC8vIHdoaWNoIGluc3VyZXMgdGhhdCB3ZSdsbCBjb25zIHVwIGEgbmV3IFdyaXRlU3RyZWFtICh3aXRoIGEgZmlsZXN5c3RlbQorICAgICAgICAgICAgLy8gZmlsZSBiYWNraW5nIGl0KSBpbiB0aGUgU2F2ZSgpIG1ldGhvZC4KKyAgICAgICAgICAgIGlmIChfbmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIF93cml0ZXN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgICAgIGVsc2UgX3JlYWROYW1lID0gX25hbWU7IC8vIHdvcmtpdGVtIDEzOTE1CisKKyAgICAgICAgICAgIF9uYW1lID0gZmlsZU5hbWU7CisgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhfbmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiQmFkIERpcmVjdG9yeSIsIG5ldyBTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24oIlRoYXQgbmFtZSBzcGVjaWZpZXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiBQbGVhc2Ugc3BlY2lmeSBhIGZpbGVuYW1lLiIsICJmaWxlTmFtZSIpKTsKKyAgICAgICAgICAgIF9jb250ZW50c0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgX2ZpbGVBbHJlYWR5RXhpc3RzID0gRmlsZS5FeGlzdHMoX25hbWUpOworICAgICAgICAgICAgU2F2ZSgpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNhdmUgdGhlIHppcCBhcmNoaXZlIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSBpcyB3cml0dGVuIHRvIHN0b3JhZ2UgLSB0eXBpY2FsbHkgYSB6aXAgZmlsZQorICAgICAgICAvLy8gICBpbiBhIGZpbGVzeXN0ZW0sIGJ1dCB1c2luZyB0aGlzIG92ZXJsb2FkLCB0aGUgc3RvcmFnZSBjYW4gYmUgYW55dGhpbmcKKyAgICAgICAgLy8vICAgYWNjZXNzaWJsZSB2aWEgYSB3cml0YWJsZSBzdHJlYW0gLSBvbmx5IHdoZW4gdGhlIGNhbGxlciBjYWxscyA8Yz5TYXZlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVXNlIHRoaXMgbWV0aG9kIHRvIHNhdmUgdGhlIHppcCBjb250ZW50IHRvIGEgc3RyZWFtIGRpcmVjdGx5LiAgQSBjb21tb24KKyAgICAgICAgLy8vICAgc2NlbmFyaW8gaXMgYW4gQVNQLk5FVCBhcHBsaWNhdGlvbiB0aGF0IGR5bmFtaWNhbGx5IGdlbmVyYXRlcyBhIHppcCBmaWxlCisgICAgICAgIC8vLyAgIGFuZCBhbGxvd3MgdGhlIGJyb3dzZXIgdG8gZG93bmxvYWQgaXQuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY2FsbAorICAgICAgICAvLy8gICA8Yz5TYXZlKFJlc3BvbnNlLk91dHB1dFN0cmVhbSk8L2M+IHRvIHdyaXRlIGEgemlwZmlsZSBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgLy8vICAgb3V0cHV0IHN0cmVhbSwgd2l0aG91dCBjcmVhdGluZyBhIHppcCBmaWxlIG9uIHRoZSBkaXNrIG9uIHRoZSBBU1AuTkVUCisgICAgICAgIC8vLyAgIHNlcnZlci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQmUgY2FyZWZ1bCB3aGVuIHNhdmluZyBhIGZpbGUgdG8gYSBub24tc2Vla2FibGUgc3RyZWFtLCBpbmNsdWRpbmcKKyAgICAgICAgLy8vICAgPGM+UmVzcG9uc2UuT3V0cHV0U3RyZWFtPC9jPi4gV2hlbiBEb3ROZXRaaXAgd3JpdGVzIHRvIGEgbm9uLXNlZWthYmxlCisgICAgICAgIC8vLyAgIHN0cmVhbSwgdGhlIHppcCBhcmNoaXZlIGlzIGZvcm1hdHRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgbWF5IG5vdCBiZQorICAgICAgICAvLy8gICBjb21wYXRpYmxlIHdpdGggYWxsIHppcCB0b29scyBvbiBhbGwgcGxhdGZvcm1zLiAgSXQncyBhIHBlcmZlY3RseSBsZWdhbAorICAgICAgICAvLy8gICBhbmQgY29tcGxpYW50IHppcCBmaWxlLCBidXQgc29tZSBwZW9wbGUgaGF2ZSByZXBvcnRlZCBwcm9ibGVtcyBvcGVuaW5nCisgICAgICAgIC8vLyAgIGZpbGVzIHByb2R1Y2VkIHRoaXMgd2F5IHVzaW5nIHRoZSBNYWMgT1MgYXJjaGl2ZSB1dGlsaXR5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzYXZlcyB0aGUgemlwZmlsZSBjb250ZW50IGludG8gYSBNZW1vcnlTdHJlYW0sIGFuZAorICAgICAgICAvLy8gICB0aGVuIGdldHMgdGhlIGFycmF5IG9mIGJ5dGVzIGZyb20gdGhhdCBNZW1vcnlTdHJlYW0uCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdXNpbmcgKHZhciB6aXAgPSBuZXcgSW9uaWMuWmlwLlppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQ29tcHJlc3Npb25MZXZlbD0gSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsLkJlc3RDb21wcmVzc2lvbjsKKyAgICAgICAgLy8vICAgICB6aXAuUGFzc3dvcmQgPSAiVmVyeVNlY3JldC4iOworICAgICAgICAvLy8gICAgIHppcC5FbmNyeXB0aW9uID0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMxMjg7CisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoc291cmNlRmlsZU5hbWUpOworICAgICAgICAvLy8gICAgIE1lbW9yeVN0cmVhbSBvdXRwdXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUob3V0cHV0KTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgYnl0ZVtdIHppcGJ5dGVzID0gb3V0cHV0LlRvQXJyYXkoKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgYSBwaXRmYWxsIHlvdSBzaG91bGQgYXZvaWQuIERPIE5PVCByZWFkCisgICAgICAgIC8vLyAgIGZyb20gYSBzdHJlYW0sIHRoZW4gdHJ5IHRvIHNhdmUgdG8gdGhlIHNhbWUgc3RyZWFtLiAgRE8KKyAgICAgICAgLy8vICAgTk9UIERPIFRISVM6CisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdXNpbmcgKHZhciBmcyA9IG5ldyBGaWxlU3RlZWFtKGZpbGVuYW1lLCBGaWxlTW9kZS5PcGVuKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdXNpbmcgKHZhciB6aXAgPSBJb25pYy5aaXAuWmlwRmlsZS5SZWFkKGlucHV0U3RyZWFtKSkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIHppcC5BZGRFbnRyeSgiTmFtZTEudHh0IiwgInRoaXMgaXMgdGhlIGNvbnRlbnQiKTsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZShpbnB1dFN0cmVhbSk7ICAvLyBOTyBOTyBOTyEhCisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQmV0dGVyIGxpa2UgdGhpczoKKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB1c2luZyAodmFyIHppcCA9IElvbmljLlppcC5aaXBGaWxlLlJlYWQoZmlsZW5hbWUpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHppcC5BZGRFbnRyeSgiTmFtZTEudHh0IiwgInRoaXMgaXMgdGhlIGNvbnRlbnQiKTsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSgpOyAgLy8gWUVTIQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0U3RyZWFtIj4KKyAgICAgICAgLy8vICAgVGhlIDxjPlN5c3RlbS5JTy5TdHJlYW08L2M+IHRvIHdyaXRlIHRvLiBJdCBtdXN0IGJlCisgICAgICAgIC8vLyAgIHdyaXRhYmxlLiBJZiB5b3UgY3JlYXRlZCB0aGUgWmlwRmlsZSBpbnN0YW5jdCBieSBjYWxsaW5nCisgICAgICAgIC8vLyAgIFppcEZpbGUuUmVhZCgpLCB0aGlzIHN0cmVhbSBtdXN0IG5vdCBiZSB0aGUgc2FtZSBzdHJlYW0KKyAgICAgICAgLy8vICAgeW91IHBhc3NlZCB0byBaaXBGaWxlLlJlYWQoKS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmUoU3RyZWFtIG91dHB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIm91dHB1dFN0cmVhbSIpOworICAgICAgICAgICAgaWYgKCFvdXRwdXRTdHJlYW0uQ2FuV3JpdGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IGJlIGEgd3JpdGFibGUgc3RyZWFtLiIsICJvdXRwdXRTdHJlYW0iKTsKKworICAgICAgICAgICAgLy8gaWYgd2UgaGFkIGEgZmlsZW5hbWUgdG8gc2F2ZSB0bywgd2UgYXJlIG5vdyBvYmxpdGVyYXRpbmcgaXQuCisgICAgICAgICAgICBfbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIF93cml0ZXN0cmVhbSA9IG5ldyBDb3VudGluZ1N0cmVhbShvdXRwdXRTdHJlYW0pOworCisgICAgICAgICAgICBfY29udGVudHNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9maWxlQWxyZWFkeUV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgU2F2ZSgpOworICAgICAgICB9CisKKworICAgIH0KKworCisKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgWmlwT3V0cHV0CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgV3JpdGVDZW50cmFsRGlyZWN0b3J5U3RydWN0dXJlKFN0cmVhbSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb2xsZWN0aW9uPFppcEVudHJ5PiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgbnVtU2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmlwNjRPcHRpb24gemlwNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmlwQ29udGFpbmVyIGNvbnRhaW5lcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHpzcyA9IHMgYXMgWmlwU2VnbWVudGVkU3RyZWFtOworICAgICAgICAgICAgaWYgKHpzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHpzcy5Db250aWd1b3VzV3JpdGUgPSB0cnVlOworCisgICAgICAgICAgICAvLyB3cml0ZSB0byBhIG1lbW9yeSBzdHJlYW0gaW4gb3JkZXIgdG8ga2VlcCB0aGUKKyAgICAgICAgICAgIC8vIENEUiBjb250aWd1b3VzCisgICAgICAgICAgICBJbnQ2NCBhTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZSBpbiBlbnRyaWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuSW5jbHVkZWRJbk1vc3RSZWNlbnRTYXZlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdyaXRlcyBhIFppcERpckVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFppcEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICBlLldyaXRlQ2VudHJhbERpcmVjdG9yeUVudHJ5KG1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgYSA9IG1zLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBzLldyaXRlKGEsIDAsIGEuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhTGVuZ3RoID0gYS5MZW5ndGg7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdGFydCBhbmQKKyAgICAgICAgICAgIC8vIEZpbmlzaCBvZiB0aGUgQ2VudHJhbCBEaXJlY3RvcnkgU3RydWN0dXJlLgorCisgICAgICAgICAgICAvLyBDYW5ub3QgYWx3YXlzIHVzZSBXcml0ZVN0cmVhbS5MZW5ndGggb3IgUG9zaXRpb247IHNvbWUgc3RyZWFtcyBkbworICAgICAgICAgICAgLy8gbm90IHN1cHBvcnQgdGhlc2UuIChlZywgQVNQLk5FVCBSZXNwb25zZS5PdXRwdXRTdHJlYW0pIEluIHRob3NlCisgICAgICAgICAgICAvLyBjYXNlcyB3ZSBoYXZlIGEgQ291bnRpbmdTdHJlYW0uCisKKyAgICAgICAgICAgIC8vIEFsc28sIHdlIGNhbm5vdCBqdXN0IHNldCBTdGFydCBhcyBzLlBvc2l0aW9uIGJmb3JlIHRoZSB3cml0ZSwgYW5kIEZpbmlzaAorICAgICAgICAgICAgLy8gYXMgcy5Qb3NpdGlvbiBhZnRlciB0aGUgd3JpdGUuICBJbiBhIHNwbGl0IHppcCwgdGhlIHdyaXRlIG1heSBhY3R1YWxseQorICAgICAgICAgICAgLy8gZmxpcCB0byB0aGUgbmV4dCBzZWdtZW50LiAgSW4gdGhhdCBjYXNlLCBTdGFydCB3aWxsIGJlIHplcm8uICBCdXQgd2UKKyAgICAgICAgICAgIC8vIGRvbid0IGtub3cgdGhhdCB0aWwgYWZ0ZXIgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgdGhpbmcgdG8gd3JpdGUuICBTbyB0aGUKKyAgICAgICAgICAgIC8vIGFuc3dlciBpcyB0byBjb21wdXRlIHRoZSBkaXJlY3RvcnksIHRoZW4gYXNrIHRoZSBaaXBTZWdtZW50ZWRTdHJlYW0gd2hpY2gKKyAgICAgICAgICAgIC8vIHNlZ21lbnQgdGhhdCBkaXJlY3Rvcnkgd291bGQgZmFsbCBpbiwgaXQgaXQgd2VyZSB3cml0dGVuLiAgVGhlbiwgaW5jbHVkZQorICAgICAgICAgICAgLy8gdGhhdCBkYXRhIGludG8gdGhlIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHksIHdyaXRlIHRoZSBkaXJlY3RvcnkgdG8gdGhlCisgICAgICAgICAgICAvLyBvdXRwdXQgc3RyZWFtLgorCisgICAgICAgICAgICB2YXIgb3V0cHV0ID0gcyBhcyBDb3VudGluZ1N0cmVhbTsKKyAgICAgICAgICAgIGxvbmcgRmluaXNoID0gKG91dHB1dCAhPSBudWxsKSA/IG91dHB1dC5Db21wdXRlZFBvc2l0aW9uIDogcy5Qb3NpdGlvbjsgIC8vIEJ5dGVzV3JpdHRlbgorICAgICAgICAgICAgbG9uZyBTdGFydCA9IEZpbmlzaCAtIGFMZW5ndGg7CisKKyAgICAgICAgICAgIC8vIG5lZWQgdG8ga25vdyB3aGljaCBzZWdtZW50IHRoZSBFT0NEIHJlY29yZCBzdGFydHMgaW4KKyAgICAgICAgICAgIFVJbnQzMiBzdGFydFNlZ21lbnQgPSAoenNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgPyB6c3MuQ3VycmVudFNlZ21lbnQKKyAgICAgICAgICAgICAgICA6IDA7CisKKyAgICAgICAgICAgIEludDY0IFNpemVPZkNlbnRyYWxEaXJlY3RvcnkgPSBGaW5pc2ggLSBTdGFydDsKKworICAgICAgICAgICAgaW50IGNvdW50T2ZFbnRyaWVzID0gQ291bnRFbnRyaWVzKGVudHJpZXMpOworCisgICAgICAgICAgICBib29sIG5lZWRaaXA2NENlbnRyYWxEaXJlY3RvcnkgPQorICAgICAgICAgICAgICAgIHppcDY0ID09IFppcDY0T3B0aW9uLkFsd2F5cyB8fAorICAgICAgICAgICAgICAgIGNvdW50T2ZFbnRyaWVzID49IDB4RkZGRiB8fAorICAgICAgICAgICAgICAgIFNpemVPZkNlbnRyYWxEaXJlY3RvcnkgPiAweEZGRkZGRkZGIHx8CisgICAgICAgICAgICAgICAgU3RhcnQgPiAweEZGRkZGRkZGOworCisgICAgICAgICAgICBieXRlW10gYTIgPSBudWxsOworCisgICAgICAgICAgICAvLyBlbWl0IFpJUDY0IGV4dGVuc2lvbnMgYXMgcmVxdWlyZWQKKyAgICAgICAgICAgIGlmIChuZWVkWmlwNjRDZW50cmFsRGlyZWN0b3J5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh6aXA2NCA9PSBaaXA2NE9wdGlvbi5OZXZlcikKKyAgICAgICAgICAgICAgICB7CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiVGhlIGFyY2hpdmUgcmVxdWlyZXMgYSBaSVA2NCBDZW50cmFsIERpcmVjdG9yeS4gQ29uc2lkZXIgZW5hYmxpbmcgWklQNjQgZXh0ZW5zaW9ucy4iKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5EaWFnbm9zdGljcy5TdGFja0ZyYW1lIHNmID0gbmV3IFN5c3RlbS5EaWFnbm9zdGljcy5TdGFja0ZyYW1lKDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2YuR2V0TWV0aG9kKCkuRGVjbGFyaW5nVHlwZSA9PSB0eXBlb2YoWmlwRmlsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJUaGUgYXJjaGl2ZSByZXF1aXJlcyBhIFpJUDY0IENlbnRyYWwgRGlyZWN0b3J5LiBDb25zaWRlciBzZXR0aW5nIHRoZSBaaXBGaWxlLlVzZVppcDY0V2hlblNhdmluZyBwcm9wZXJ0eS4iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiVGhlIGFyY2hpdmUgcmVxdWlyZXMgYSBaSVA2NCBDZW50cmFsIERpcmVjdG9yeS4gQ29uc2lkZXIgc2V0dGluZyB0aGUgWmlwT3V0cHV0U3RyZWFtLkVuYWJsZVppcDY0IHByb3BlcnR5LiIpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgYSA9IEdlblppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5KFN0YXJ0LCBGaW5pc2gsIGNvdW50T2ZFbnRyaWVzLCBudW1TZWdtZW50cyk7CisgICAgICAgICAgICAgICAgYTIgPSBHZW5DZW50cmFsRGlyZWN0b3J5Rm9vdGVyKFN0YXJ0LCBGaW5pc2gsIHppcDY0LCBjb3VudE9mRW50cmllcywgY29tbWVudCwgY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRTZWdtZW50ICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVSW50MzIgdGhpc1NlZ21lbnQgPSB6c3MuQ29tcHV0ZVNlZ21lbnQoYS5MZW5ndGggKyBhMi5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDE2OworICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdGhpcyBkaXNrCisgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKHRoaXNTZWdtZW50KSwgMCwgYSwgaSwgNCk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAvL0FycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKHN0YXJ0U2VnbWVudCksIDAsIGEsIGksIDQpOworICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh0aGlzU2VnbWVudCksIDAsIGEsIGksIDQpOworCisgICAgICAgICAgICAgICAgICAgIGkgPSA2MDsKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IDYwCisgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgemlwNjQgZW9jZAorICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh0aGlzU2VnbWVudCksIDAsIGEsIGksIDQpOworICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gODsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgNzIKKyAgICAgICAgICAgICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGRpc2tzCisgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKHRoaXNTZWdtZW50KSwgMCwgYSwgaSwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMuV3JpdGUoYSwgMCwgYS5MZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGEyID0gR2VuQ2VudHJhbERpcmVjdG9yeUZvb3RlcihTdGFydCwgRmluaXNoLCB6aXA2NCwgY291bnRPZkVudHJpZXMsIGNvbW1lbnQsIGNvbnRhaW5lcik7CisKKworICAgICAgICAgICAgLy8gbm93LCB0aGUgcmVndWxhciBmb290ZXIKKyAgICAgICAgICAgIGlmIChzdGFydFNlZ21lbnQgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgbmV2ZXIgc3BsaXQgYWNyb3NzCisgICAgICAgICAgICAgICAgLy8gc2VnbWVudCBib3VuZGFyaWVzLgorCisgICAgICAgICAgICAgICAgVUludDE2IHRoaXNTZWdtZW50ID0gKFVJbnQxNikgenNzLkNvbXB1dGVTZWdtZW50KGEyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaW50IGkgPSA0OworICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiB0aGlzIGRpc2sKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh0aGlzU2VnbWVudCksIDAsIGEyLCBpLCAyKTsKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIC8vQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoKFVJbnQxNilzdGFydFNlZ21lbnQpLCAwLCBhMiwgaSwgMik7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXModGhpc1NlZ21lbnQpLCAwLCBhMiwgaSwgMik7CisgICAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLldyaXRlKGEyLCAwLCBhMi5MZW5ndGgpOworCisgICAgICAgICAgICAvLyByZXNldCB0aGUgY29udGlndW91cyB3cml0ZSBwcm9wZXJ0eSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmICh6c3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB6c3MuQ29udGlndW91c1dyaXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiBuZWVkWmlwNjRDZW50cmFsRGlyZWN0b3J5OworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTeXN0ZW0uVGV4dC5FbmNvZGluZyBHZXRFbmNvZGluZyhaaXBDb250YWluZXIgY29udGFpbmVyLCBzdHJpbmcgdCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjb250YWluZXIuQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFppcE9wdGlvbi5BbHdheXM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuQWx0ZXJuYXRlRW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBaaXBPcHRpb24uTmV2ZXI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBc05lY2Vzc2FyeSBpcyBpbiBmb3JjZQorICAgICAgICAgICAgdmFyIGUgPSBjb250YWluZXIuRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgcmV0dXJuIGU7CisKKyAgICAgICAgICAgIHZhciBieXRlcyA9IGUuR2V0Qnl0ZXModCk7CisgICAgICAgICAgICB2YXIgdDIgPSBlLkdldFN0cmluZyhieXRlcywwLGJ5dGVzLkxlbmd0aCk7CisgICAgICAgICAgICBpZiAodDIuRXF1YWxzKHQpKSByZXR1cm4gZTsKKyAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuQWx0ZXJuYXRlRW5jb2Rpbmc7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEdlbkNlbnRyYWxEaXJlY3RvcnlGb290ZXIobG9uZyBTdGFydE9mQ2VudHJhbERpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBFbmRPZkNlbnRyYWxEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcDY0T3B0aW9uIHppcDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcENvbnRhaW5lciBjb250YWluZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5UZXh0LkVuY29kaW5nIGVuY29kaW5nID0gR2V0RW5jb2RpbmcoY29udGFpbmVyLCBjb21tZW50KTsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGludCBidWZmZXJMZW5ndGggPSAyMjsKKyAgICAgICAgICAgIGJ5dGVbXSBibG9jayA9IG51bGw7CisgICAgICAgICAgICBJbnQxNiBjb21tZW50TGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICgoY29tbWVudCAhPSBudWxsKSAmJiAoY29tbWVudC5MZW5ndGggIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBlbmNvZGluZy5HZXRCeXRlcyhjb21tZW50KTsKKyAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoID0gKEludDE2KWJsb2NrLkxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCArPSBjb21tZW50TGVuZ3RoOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnVmZmVyTGVuZ3RoXTsKKworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgLy8gc2lnbmF0dXJlCisgICAgICAgICAgICBieXRlW10gc2lnID0gQml0Q29udmVydGVyLkdldEJ5dGVzKFppcENvbnN0YW50cy5FbmRPZkNlbnRyYWxEaXJlY3RvcnlTaWduYXR1cmUpOworICAgICAgICAgICAgQXJyYXkuQ29weShzaWcsIDAsIGJ5dGVzLCBpLCA0KTsKKyAgICAgICAgICAgIGkrPTQ7CisKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiB0aGlzIGRpc2sKKyAgICAgICAgICAgIC8vICh0aGlzIG51bWJlciBtYXkgY2hhbmdlIGxhdGVyKQorICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDA7CisgICAgICAgICAgICBieXRlc1tpKytdID0gMDsKKworICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgLy8gKHRoaXMgbnVtYmVyIG1heSBjaGFuZ2UgbGF0ZXIpCisgICAgICAgICAgICBieXRlc1tpKytdID0gMDsKKyAgICAgICAgICAgIGJ5dGVzW2krK10gPSAwOworCisgICAgICAgICAgICAvLyBoYW5kbGUgWklQNjQgZXh0ZW5zaW9ucyBmb3IgdGhlIGVuZC1vZi1jZW50cmFsLWRpcmVjdG9yeQorICAgICAgICAgICAgaWYgKGVudHJ5Q291bnQgPj0gMHhGRkZGIHx8IHppcDY0ID09IFppcDY0T3B0aW9uLkFsd2F5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgWklQNjQgdmVyc2lvbi4KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gMHhGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbmRhcmQgdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrCisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShlbnRyeUNvdW50ICYgMHgwMEZGKTsKKyAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChlbnRyeUNvdW50ICYgMHhGRjAwKSA+PiA4KTsKKworICAgICAgICAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoZW50cnlDb3VudCAmIDB4MDBGRik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoZW50cnlDb3VudCAmIDB4RkYwMCkgPj4gOCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICAgICAgICBJbnQ2NCBTaXplT2ZDZW50cmFsRGlyZWN0b3J5ID0gRW5kT2ZDZW50cmFsRGlyZWN0b3J5IC0gU3RhcnRPZkNlbnRyYWxEaXJlY3Rvcnk7CisKKyAgICAgICAgICAgIGlmIChTaXplT2ZDZW50cmFsRGlyZWN0b3J5ID49IDB4RkZGRkZGRkYgfHwgU3RhcnRPZkNlbnRyYWxEaXJlY3RvcnkgPj0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIGRhdGEgaXMgaW4gdGhlIFpJUDY0IGNlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAweEZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICh3ZSBqdXN0IGdldCB0aGUgbG93IDQgYnl0ZXMpCisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShTaXplT2ZDZW50cmFsRGlyZWN0b3J5ICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoU2l6ZU9mQ2VudHJhbERpcmVjdG9yeSAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKFNpemVPZkNlbnRyYWxEaXJlY3RvcnkgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoU2l6ZU9mQ2VudHJhbERpcmVjdG9yeSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKworICAgICAgICAgICAgICAgIC8vIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICh3ZSBqdXN0IGdldCB0aGUgbG93IDQgYnl0ZXMpCisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShTdGFydE9mQ2VudHJhbERpcmVjdG9yeSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkoKFN0YXJ0T2ZDZW50cmFsRGlyZWN0b3J5ICYgMHgwMDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoU3RhcnRPZkNlbnRyYWxEaXJlY3RvcnkgJiAweDAwRkYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKSgoU3RhcnRPZkNlbnRyYWxEaXJlY3RvcnkgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gemlwIGFyY2hpdmUgY29tbWVudAorICAgICAgICAgICAgaWYgKChjb21tZW50ID09IG51bGwpIHx8IChjb21tZW50Lkxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBubyBjb21tZW50IQorICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkwOworICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIG9mIG91ciBidWZmZXIgZGVmaW5lcyB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgY29tbWVudCB3ZSBjYW4gd3JpdGUKKyAgICAgICAgICAgICAgICBpZiAoY29tbWVudExlbmd0aCArIGkgKyAyID4gYnl0ZXMuTGVuZ3RoKSBjb21tZW50TGVuZ3RoID0gKEludDE2KShieXRlcy5MZW5ndGggLSBpIC0gMik7CisgICAgICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IChieXRlKShjb21tZW50TGVuZ3RoICYgMHgwMEZGKTsKKyAgICAgICAgICAgICAgICBieXRlc1tpKytdID0gKGJ5dGUpKChjb21tZW50TGVuZ3RoICYgMHhGRjAwKSA+PiA4KTsKKworICAgICAgICAgICAgICAgIGlmIChjb21tZW50TGVuZ3RoICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3cgYWN0dWFsbHkgd3JpdGUgdGhlIGNvbW1lbnQgaXRzZWxmIGludG8gdGhlIGJ5dGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IChqIDwgY29tbWVudExlbmd0aCkgJiYgKGkgKyBqIDwgYnl0ZXMuTGVuZ3RoKTsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1tpICsgal0gPSBibG9ja1tqXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpICs9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAgIHMuV3JpdGUoYnl0ZXMsIDAsIGkpOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBHZW5aaXA2NEVuZE9mQ2VudHJhbERpcmVjdG9yeShsb25nIFN0YXJ0T2ZDZW50cmFsRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBFbmRPZkNlbnRyYWxEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgbnVtU2VnbWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSAxMiArIDQ0ICsgMjA7CisKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J1ZmZlckxlbmd0aF07CisKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIC8vIHNpZ25hdHVyZQorICAgICAgICAgICAgYnl0ZVtdIHNpZyA9IEJpdENvbnZlcnRlci5HZXRCeXRlcyhaaXBDb25zdGFudHMuWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmRTaWduYXR1cmUpOworICAgICAgICAgICAgQXJyYXkuQ29weShzaWcsIDAsIGJ5dGVzLCBpLCA0KTsKKyAgICAgICAgICAgIGkrPTQ7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdG8gaW5jbHVkZSAiRXh0ZW5zaWJsZSIgZGF0YSBpbiB0aGUgemlwNjQKKyAgICAgICAgICAgIC8vIGVuZC1vZi1jZW50cmFsLWRpciByZWNvcmQuICBJIGNhbm5vdCBmaWd1cmUgb3V0IHdoYXQgaXQgbWlnaHQgYmUgdXNlZCB0bworICAgICAgICAgICAgLy8gc3RvcmUsIHNvIHRoZSBzaXplIG9mIHRoaXMgcmVjb3JkIGlzIGFsd2F5cyBmaXhlZC4gIE1heWJlIGl0IGlzIHVzZWQgZm9yCisgICAgICAgICAgICAvLyBzdHJvbmcgZW5jcnlwdGlvbiBkYXRhPyAgVGhhdCBpcyBmb3IgYW5vdGhlciBkYXkuCisgICAgICAgICAgICBsb25nIERhdGFTaXplID0gNDQ7CisgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyhEYXRhU2l6ZSksIDAsIGJ5dGVzLCBpLCA4KTsKKyAgICAgICAgICAgIGkgKz0gODsKKworICAgICAgICAgICAgLy8gb2Zmc2V0IDEyCisgICAgICAgICAgICAvLyBWZXJzaW9uTWFkZUJ5ID0gNDU7CisgICAgICAgICAgICBieXRlc1tpKytdID0gNDU7CisgICAgICAgICAgICBieXRlc1tpKytdID0gMHgwMDsKKworICAgICAgICAgICAgLy8gVmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IDQ1OworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDQ1OworICAgICAgICAgICAgYnl0ZXNbaSsrXSA9IDB4MDA7CisKKyAgICAgICAgICAgIC8vIG9mZnNldCAxNgorICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrLCBhbmQgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyLgorICAgICAgICAgICAgLy8gKHRoaXMgbWF5IGNoYW5nZSBsYXRlcikKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgICAgIGJ5dGVzW2krK10gPSAweDAwOworCisgICAgICAgICAgICAvLyBvZmZzZXQgMjQKKyAgICAgICAgICAgIGxvbmcgbnVtYmVyT2ZFbnRyaWVzID0gZW50cnlDb3VudDsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKG51bWJlck9mRW50cmllcyksIDAsIGJ5dGVzLCBpLCA4KTsKKyAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKG51bWJlck9mRW50cmllcyksIDAsIGJ5dGVzLCBpLCA4KTsKKyAgICAgICAgICAgIGkgKz0gODsKKworICAgICAgICAgICAgLy8gb2Zmc2V0IDQwCisgICAgICAgICAgICBJbnQ2NCBTaXplb2ZDZW50cmFsZGlyZWN0b3J5ID0gRW5kT2ZDZW50cmFsRGlyZWN0b3J5IC0gU3RhcnRPZkNlbnRyYWxEaXJlY3Rvcnk7CisgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyhTaXplb2ZDZW50cmFsZGlyZWN0b3J5KSwgMCwgYnl0ZXMsIGksIDgpOworICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgICAgQXJyYXkuQ29weShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoU3RhcnRPZkNlbnRyYWxEaXJlY3RvcnkpLCAwLCBieXRlcywgaSwgOCk7CisgICAgICAgICAgICBpICs9IDg7CisKKyAgICAgICAgICAgIC8vIG9mZnNldCA1NgorICAgICAgICAgICAgLy8gbm93LCB0aGUgbG9jYXRvcgorICAgICAgICAgICAgLy8gc2lnbmF0dXJlCisgICAgICAgICAgICBzaWcgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoWmlwQ29uc3RhbnRzLlppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5TG9jYXRvclNpZ25hdHVyZSk7CisgICAgICAgICAgICBBcnJheS5Db3B5KHNpZywgMCwgYnl0ZXMsIGksIDQpOworICAgICAgICAgICAgaSs9NDsKKworICAgICAgICAgICAgLy8gb2Zmc2V0IDYwCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVvY2QKKyAgICAgICAgICAgIC8vICh0aGlzIHdpbGwgY2hhbmdlIGxhdGVyKSAgKGl0IHdpbGw/KQorICAgICAgICAgICAgdWludCB4MiA9IChudW1TZWdtZW50cz09MCk/MDoodWludCkobnVtU2VnbWVudHMtMSk7CisgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh4MiksIDAsIGJ5dGVzLCBpLCA0KTsKKyAgICAgICAgICAgIGkrPTQ7CisKKyAgICAgICAgICAgIC8vIG9mZnNldCA2NAorICAgICAgICAgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSB6aXA2NCBlb2NkCisgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyhFbmRPZkNlbnRyYWxEaXJlY3RvcnkpLCAwLCBieXRlcywgaSwgOCk7CisgICAgICAgICAgICBpICs9IDg7CisKKyAgICAgICAgICAgIC8vIG9mZnNldCA3MgorICAgICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGRpc2tzCisgICAgICAgICAgICAvLyAodGhpcyB3aWxsIGNoYW5nZSBsYXRlcikKKyAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKG51bVNlZ21lbnRzKSwgMCwgYnl0ZXMsIGksIDQpOworICAgICAgICAgICAgaSs9NDsKKworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDb3VudEVudHJpZXMoSUNvbGxlY3Rpb248WmlwRW50cnk+IF9lbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDYW5ub3QganVzdCBlbWl0IF9lbnRyaWVzLkNvdW50LCBiZWNhdXNlIHNvbWUgb2YgdGhlIGVudHJpZXMKKyAgICAgICAgICAgIC8vIG1heSBoYXZlIGJlZW4gc2tpcHBlZC4KKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW50cnkgaW4gX2VudHJpZXMpCisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LkluY2x1ZGVkSW5Nb3N0UmVjZW50U2F2ZSkgY291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5TYXZlU2VsZkV4dHJhY3Rvci5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuU2F2ZVNlbGZFeHRyYWN0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwYTA1OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuU2F2ZVNlbGZFeHRyYWN0b3IuY3MKQEAgLTAsMCArMSwxMTAxIEBACisvLyBaaXBGaWxlLnNhdmVTZWxmRXh0cmFjdG9yLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBEaW5vIENoaWVzYS4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtQXVndXN0LTEwIDE5OjIyOjQ2PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgaXMgYSB0aGUgc291cmNlIG1vZHVsZSB0aGF0IGltcGxlbWVudHMgdGhlIHN0dWZmIGZvciBzYXZpbmcgdG8gYQorLy8gc2VsZi1leHRyYWN0aW5nIFppcCBhcmNoaXZlLgorLy8KKy8vIFppcEZpbGUgaXMgc2V0IHVwIGFzIGEgInBhcnRpYWwgY2xhc3MiIC0gZGVmaW5lZCBpbiBtdWx0aXBsZSAuY3Mgc291cmNlIG1vZHVsZXMuCisvLyBUaGlzIGlzIG9uZSBvZiB0aGUgc291cmNlIG1vZHVsZXMgZm9yIHRoZSBaaXBGaWxlIGNsYXNzLgorLy8KKy8vIEhlcmUncyB0aGUgZGVzaWduOiBUaGUgc2VsZi1leHRyYWN0aW5nIHppcCBmaWxlIGlzIGp1c3QgYSByZWd1bGFyIG1hbmFnZWQgRVhFCisvLyBmaWxlLCB3aXRoIGVtYmVkZGVkIHJlc291cmNlcy4gIFRoZSBtYW5hZ2VkIGNvZGUgbG9naWMgaW5zdGFudGlhdGVzIGEgWmlwRmlsZSwgYW5kCisvLyB0aGVuIGV4dHJhY3RzIGVhY2ggZW50cnkuICBUaGUgZW1iZWRkZWQgcmVzb3VyY2VzIGluY2x1ZGUgdGhlIHppcCBhcmNoaXZlIGNvbnRlbnQsCisvLyBhcyB3ZWxsIGFzIHRoZSBaaXAgbGlicmFyeSBpdHNlbGYuICBUaGUgbGF0dGVyIGlzIHJlcXVpcmVkIHNvIHRoYXQgc2VsZi1leHRyYWN0aW5nCisvLyBjYW4gd29yayBvbiBhbnkgbWFjaGluZSwgd2hldGhlciBvciBub3QgaXQgaGFzIHRoZSBEb3ROZXRaaXAgbGlicmFyeSBpbnN0YWxsZWQgb24KKy8vIGl0LgorLy8KKy8vIFdoYXQgd2UgbmVlZCB0byBkbyBpcyBjcmVhdGUgdGhlIGFuaW1hbCBJIGp1c3QgZGVzY3JpYmVkLCB3aXRoaW4gYSBtZXRob2Qgb24gdGhlCisvLyBaaXBGaWxlIGNsYXNzLiAgVGhpcyBzb3VyY2UgbW9kdWxlIHByb3ZpZGVzIHRoYXQgY2FwYWJpbGl0eS4gVGhlIG1ldGhvZCBpcworLy8gU2F2ZVNlbGZFeHRyYWN0b3IoKS4KKy8vCisvLyBUaGUgd2F5IHRoZSBtZXRob2Qgd29ya3M6IGl0IHVzZXMgdGhlIHByb2dyYW1tYXRpYyBpbnRlcmZhY2UgdG8gdGhlIGNzYy5leGUKKy8vIGNvbXBpbGVyLCBNaWNyb3NvZnQuQ1NoYXJwLkNTaGFycENvZGVQcm92aWRlciwgdG8gY29tcGlsZSAiYm9pbGVycGxhdGUiCisvLyBleHRyYWN0aW9uIGxvZ2ljIGludG8gYSBuZXcgYXNzZW1ibHkuICBBcyBwYXJ0IG9mIHRoYXQgY29tcGlsZSwgd2UgZW1iZWQgd2l0aGluCisvLyB0aGF0IGFzc2VtYmx5IHRoZSB6aXAgYXJjaGl2ZSBpdHNlbGYsIGFzIHdlbGwgYXMgdGhlIFppcCBsaWJyYXJ5LgorLy8KKy8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZpcnN0IHNhdmUgdG8gYSB0ZW1wb3JhcnkgemlwIGZpbGUsIHRoZW4gcHJvZHVjZSB0aGUgZXhlLgorLy8KKy8vIFRoZXJlIGFyZSBhIGZldyB0d2lzdHMuCisvLworLy8gVGhlIFZpc3VhbCBTdHVkaW8gUHJvamVjdCBzdHJ1Y3R1cmUgaXMgYSBsaXR0bGUgd2VpcmQuICBUaGVyZSBhcmUgY29kZSBmaWxlcworLy8gdGhhdCBBUkUgTk9UIGNvbXBpbGVkIGR1cmluZyBhIG5vcm1hbCBidWlsZCBvZiB0aGUgVlMgU29sdXRpb24uICBUaGV5IGFyZQorLy8gbWFya2VkIGFzIGVtYmVkZGVkIHJlc291cmNlcy4gIFRoZXNlIGFyZSB0aGUgdmFyaW91cyAiYm9pbGVycGxhdGUiIG1vZHVsZXMgdGhhdAorLy8gYXJlIHVzZWQgaW4gdGhlIHNlbGYtZXh0cmFjdG9yLiBUaGVzZSBtb2R1bGVzIGFyZTogV2luRm9ybXNTZWxmRXh0cmFjdG9yU3R1Yi5jcworLy8gV2luRm9ybXNTZWxmRXh0cmFjdG9yU3R1Yi5EZXNpZ25lci5jcyBDb21tYW5kTGluZVNlbGZFeHRyYWN0b3JTdHViLmNzCisvLyBQYXNzd29yZERpYWxvZy5jcyBQYXNzd29yZERpYWxvZy5EZXNpZ25lci5jcworLy8KKy8vIEF0IGRlc2lnbiB0aW1lLCBpZiB5b3Ugd2FudCB0byBtb2RpZnkgdGhlIHdheSB0aGUgR1VJIGxvb2tzLCB5b3UgaGF2ZSB0bworLy8gbWFyayB0aG9zZSBtb2R1bGVzIHRvIGhhdmUgYSAiY29tcGlsZSIgYnVpbGQgYWN0aW9uLiAgVGhlbiB0d2VhayBlbSwgdGVzdCwKKy8vIGV0Yy4gIFRoZW4gYWdhaW4gbWFyayB0aGVtIGFzICJFbWJlZGRlZCByZXNvdXJjZSIuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworI2lmICFOT19TRlgKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGVudW0gdGhhdCBwcm92aWRlcyB0aGUgZGlmZmVyZW50IHNlbGYtZXh0cmFjdG9yIGZsYXZvcnMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGVudW0gU2VsZkV4dHJhY3RvckZsYXZvcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBzZWxmLWV4dHJhY3RpbmcgemlwIGFyY2hpdmUgdGhhdCBydW5zIGZyb20gdGhlIGNvbnNvbGUgb3IKKyAgICAgICAgLy8vIGNvbW1hbmQgbGluZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQ29uc29sZUFwcGxpY2F0aW9uID0gMCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSB0aGF0IHByZXNlbnRzIGEgZ3JhcGhpY2FsIHVzZXIKKyAgICAgICAgLy8vIGludGVyZmFjZSB3aGVuIGl0IGlzIGV4ZWN1dGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBXaW5Gb3Jtc0FwcGxpY2F0aW9uLAorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgYSBzZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIGNsYXNzIFNlbGZFeHRyYWN0b3JTYXZlT3B0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgdHlwZSBvZiBTRlggdG8gY3JlYXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgU2VsZkV4dHJhY3RvckZsYXZvciBGbGF2b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgY29tbWFuZCB0byBydW4gYWZ0ZXIgZXh0cmFjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGlzIG9wdGlvbmFsLiBMZWF2ZSBpdCBlbXB0eSAoPGM+bnVsbDwvYz4gaW4gQyMgb3IgPGM+Tm90aGluZzwvYz4gaW4KKyAgICAgICAgLy8vICAgVkIpIHRvIHJ1biBubyBjb21tYW5kIGFmdGVyIGV4dHJhY3Rpb24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIGl0IGlzIG5vbi1lbXB0eSwgdGhlIFNGWCB3aWxsIGV4ZWN1dGUgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGluIHRoaXMKKyAgICAgICAgLy8vICAgc3RyaW5nIG9uIHRoZSB1c2VyJ3MgbWFjaGluZSwgYW5kIHVzaW5nIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBhcyB0aGUKKyAgICAgICAgLy8vICAgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBwcm9jZXNzLCBhZnRlciB1bnBhY2tpbmcgdGhlIGFyY2hpdmUuIFRoZQorICAgICAgICAvLy8gICBwcm9ncmFtIHRvIGV4ZWN1dGUgY2FuIGluY2x1ZGUgYSBwYXRoLCBpZiB5b3UgbGlrZS4gSWYgeW91IHdhbnQgdG8gZXhlY3V0ZQorICAgICAgICAvLy8gICBhIHByb2dyYW0gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cywgc3BlY2lmeSB0aGUgcHJvZ3JhbSBuYW1lLCBmb2xsb3dlZCBieSBhCisgICAgICAgIC8vLyAgIHNwYWNlLCBhbmQgdGhlbiB0aGUgYXJndW1lbnRzIGZvciB0aGUgcHJvZ3JhbSwgZWFjaCBzZXBhcmF0ZWQgYnkgYSBzcGFjZSwKKyAgICAgICAgLy8vICAganVzdCBhcyB5b3Ugd291bGQgb24gYSBub3JtYWwgY29tbWFuZCBsaW5lLiBFeGFtcGxlOiA8Yz5wcm9ncmFtLmV4ZSBhcmcxCisgICAgICAgIC8vLyAgIGFyZzI8L2M+LiAgVGhlIHN0cmluZyBwcmlvciB0byB0aGUgZmlyc3Qgc3BhY2Ugd2lsbCBiZSB0YWtlbiBhcyB0aGUKKyAgICAgICAgLy8vICAgcHJvZ3JhbSBuYW1lLCBhbmQgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGZpcnN0IHNwYWNlIHNwZWNpZmllcyB0aGUKKyAgICAgICAgLy8vICAgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugd2FudCB0byBleGVjdXRlIGEgcHJvZ3JhbSB0aGF0IGhhcyBhIHNwYWNlIGluIHRoZSBuYW1lIG9yIHBhdGggb2YKKyAgICAgICAgLy8vICAgdGhlIGZpbGUsIHN1cnJvdW5kIHRoZSBwcm9ncmFtIG5hbWUgaW4gZG91YmxlLXF1b3Rlcy4gVGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgICAvLy8gICBvZiB0aGUgY29tbWFuZCBsaW5lIHNob3VsZCBiZSBhIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXIsIGFuZCB0aGVyZSBtdXN0IGJlCisgICAgICAgIC8vLyAgIGEgbWF0Y2hpbmcgZG91YmxlLXF1b3RlIGZvbGxvd2luZyB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGZpbGUgbmFtZS4gQW55CisgICAgICAgIC8vLyAgIG9wdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbSBmb2xsb3cgdGhhdCwgc2VwYXJhdGVkIGJ5CisgICAgICAgIC8vLyAgIHNwYWNlcy4gRXhhbXBsZTogPGM+ImM6XHByb2plY3QgZmlsZXNccHJvZ3JhbSBuYW1lLmV4ZSIgYXJnMSBhcmcyPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgdGhlIGZsYXZvciBvZiB0aGUgU0ZYIGlzIDxjPlNlbGZFeHRyYWN0b3JGbGF2b3IuQ29uc29sZUFwcGxpY2F0aW9uPC9jPiwKKyAgICAgICAgLy8vICAgdGhlbiB0aGUgU0ZYIHN0YXJ0cyBhIG5ldyBwcm9jZXNzLCB1c2luZyB0aGlzIHN0cmluZyBhcyB0aGUgcG9zdC1leHRyYWN0CisgICAgICAgIC8vLyAgIGNvbW1hbmQgbGluZS4gIFRoZSBTRlggd2FpdHMgZm9yIHRoZSBwcm9jZXNzIHRvIGV4aXQuICBUaGUgZXhpdCBjb2RlIG9mCisgICAgICAgIC8vLyAgIHRoZSBwb3N0LWV4dHJhY3QgY29tbWFuZCBsaW5lIGlzIHJldHVybmVkIGFzIHRoZSBleGl0IGNvZGUgb2YgdGhlCisgICAgICAgIC8vLyAgIGNvbW1hbmQtbGluZSBzZWxmLWV4dHJhY3RvciBleGUuIEEgbm9uLXplcm8gZXhpdCBjb2RlIGlzIHR5cGljYWxseSB1c2VkIHRvCisgICAgICAgIC8vLyAgIGluZGljYXRlZCBhIGZhaWx1cmUgYnkgdGhlIHByb2dyYW0uIEluIHRoZSBjYXNlIG9mIGFuIFNGWCwgYSBub24temVybyBleGl0CisgICAgICAgIC8vLyAgIGNvZGUgbWF5IGluZGljYXRlIGEgZmFpbHVyZSBkdXJpbmcgZXh0cmFjdGlvbiwgT1IsIGl0IG1heSBpbmRpY2F0ZSBhCisgICAgICAgIC8vLyAgIGZhaWx1cmUgb2YgdGhlIHJ1bi1hZnRlci1leHRyYWN0IHByb2dyYW0gaWYgc3BlY2lmaWVkLCBPUiwgaXQgbWF5IGluZGljYXRlCisgICAgICAgIC8vLyAgIHRoZSBydW4tYWZ0ZXItZXh0cmFjdCBwcm9ncmFtIGNvdWxkIG5vdCBiZSBmdW9uZC4gVGhlcmUgaXMgbm8gd2F5IHRvCisgICAgICAgIC8vLyAgIGRpc3Rpbmd1aXNoIHRoZXNlIGNvbmRpdGlvbnMgZnJvbSB0aGUgY2FsbGluZyBzaGVsbCwgYXNpZGUgZnJvbSBwYXJzaW5nCisgICAgICAgIC8vLyAgIHRoZSBvdXRwdXQgb2YgdGhlIFNGWC4gSWYgeW91IGhhdmUgUXVpZXQgc2V0IHRvIDxjPnRydWU8L2M+LCB5b3UgbWF5IG5vdAorICAgICAgICAvLy8gICBzZWUgZXJyb3IgbWVzc2FnZXMsIGlmIGEgcHJvYmxlbSBvY2N1cnMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHRoZSBmbGF2b3Igb2YgdGhlIFNGWCBpcworICAgICAgICAvLy8gICA8Yz5TZWxmRXh0cmFjdG9yRmxhdm9yLldpbkZvcm1zQXBwbGljYXRpb248L2M+LCB0aGVuIHRoZSBTRlggc3RhcnRzIGEgbmV3CisgICAgICAgIC8vLyAgIHByb2Nlc3MsIHVzaW5nIHRoaXMgc3RyaW5nIGFzIHRoZSBwb3N0LWV4dHJhY3QgY29tbWFuZCBsaW5lLCBhbmQgdXNpbmcgdGhlCisgICAgICAgIC8vLyAgIGV4dHJhY3QgZGlyZWN0b3J5IGFzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHByb2Nlc3MuIFRoZSBTRlggZG9lcworICAgICAgICAvLy8gICBub3Qgd2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUsIGFuZCBkb2VzIG5vdCBjaGVjayB0aGUgZXhpdCBjb2RlIG9mCisgICAgICAgIC8vLyAgIHRoZSBwcm9ncmFtLiBJZiB0aGUgcnVuLWFmdGVyLWV4dHJhY3QgcHJvZ3JhbSBjYW5ub3QgYmUgZnVvbmQsIGEgbWVzc2FnZQorICAgICAgICAvLy8gICBib3ggaXMgZGlzcGxheWVkIGluZGljYXRpbmcgdGhhdCBmYWN0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBZb3UgY2FuIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGhpbiB0aGlzIHN0cmluZywgd2l0aCBhIGZvcm1hdCBsaWtlCisgICAgICAgIC8vLyAgIDxjPiVOQU1FJTwvYz4uIFRoZSB2YWx1ZSBvZiB0aGVzZSB2YXJpYWJsZXMgd2lsbCBiZSBleHBhbmRlZCBhdCB0aGUgdGltZQorICAgICAgICAvLy8gICB0aGUgU0ZYIGlzIHJ1bi4gRXhhbXBsZTogPGM+JVdJTkRJUiVcc3lzdGVtMzJceGNvcHkuZXhlPC9jPiBtYXkgZXhwYW5kIGF0CisgICAgICAgIC8vLyAgIHJ1bnRpbWUgdG8gPGM+YzpcV2luZG93c1xTeXN0ZW0zMlx4Y29weS5leGU8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBCeSBjb21iaW5pbmcgdGhpcyB3aXRoIHRoZSA8Yz5SZW1vdmVVbnBhY2tlZEZpbGVzQWZ0ZXJFeGVjdXRlPC9jPgorICAgICAgICAvLy8gICBmbGFnLCB5b3UgY2FuIGNyZWF0ZSBhbiBTRlggdGhhdCBleHRyYWN0cyBpdHNlbGYsIHJ1bnMgYSBmaWxlIHRoYXQKKyAgICAgICAgLy8vICAgd2FzIGV4dHJhY3RlZCwgdGhlbiBkZWxldGVzIGFsbCB0aGUgZmlsZXMgdGhhdCB3ZXJlIGV4dHJhY3RlZC4gSWYKKyAgICAgICAgLy8vICAgeW91IHdhbnQgaXQgdG8gcnVuICJpbnZpc2libHkiIHRoZW4gc2V0IDxjPkZsYXZvcjwvYz4gdG8KKyAgICAgICAgLy8vICAgPGM+U2VsZkV4dHJhY3RvckZsYXZvci5Db25zb2xlQXBwbGljYXRpb248L2M+LCBhbmQgc2V0IDxjPlF1aWV0PC9jPgorICAgICAgICAvLy8gICB0byB0cnVlLiAgVGhlIHVzZXIgcnVubmluZyBzdWNoIGFuIEVYRSB3aWxsIHNlZSBhIGNvbnNvbGUgd2luZG93CisgICAgICAgIC8vLyAgIGFwcGVhciwgdGhlbiBkaXNhcHBlYXIgcXVpY2tseS4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHNwZWNpZnkgdGhlCisgICAgICAgIC8vLyAgIGRlZmF1bHQgZXh0cmFjdCBsb2NhdGlvbiwgd2l0aCA8Yz5EZWZhdWx0RXh0cmFjdERpcmVjdG9yeTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSBzZXQgPGM+Rmxhdm9yPC9jPiB0bworICAgICAgICAvLy8gICA8Yz5TZWxmRXh0cmFjdG9yRmxhdm9yLldpbkZvcm1zQXBwbGljYXRpb248L2M+LCBhbmQgc2V0IDxjPlF1aWV0PC9jPiB0bworICAgICAgICAvLy8gICB0cnVlLCB0aGVuIGEgR1VJIHdpdGggcHJvZ3Jlc3NiYXJzIGlzIGRpc3BsYXllZCwgYnV0IGl0IGlzCisgICAgICAgIC8vLyAgICJub24taW50ZXJhY3RpdmUiIC0gaXQgYWNjZXB0cyBubyBpbnB1dCBmcm9tIHRoZSB1c2VyLiAgSW5zdGVhZCB0aGUgU0ZYCisgICAgICAgIC8vLyAgIGp1c3QgYXV0b21hdGljYWxseSB1bnBhY2tzIGFuZCBleGl0cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBTdHJpbmcgUG9zdEV4dHJhY3RDb21tYW5kTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBkZWZhdWx0IGV4dHJhY3QgZGlyZWN0b3J5IHRoZSB1c2VyIHdpbGwgc2VlIHdoZW4KKyAgICAgICAgLy8vICAgcnVubmluZyB0aGUgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgUGFzc2luZyBudWxsIChvciBOb3RoaW5nIGluIFZCKSBoZXJlIHdpbGwgY2F1c2UgdGhlIFNlbGYgRXh0cmFjdG9yIHRvIHVzZQorICAgICAgICAvLy8gICB0aGUgdGhlIHVzZXIncyBwZXJzb25hbCBkaXJlY3RvcnkgKDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iRW52aXJvbm1lbnQuU3BlY2lhbEZvbGRlci5QZXJzb25hbCIvPikgZm9yIHRoZSBkZWZhdWx0IGV4dHJhY3QKKyAgICAgICAgLy8vICAgbG9jYXRpb24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgaXMgb25seSBhIGRlZmF1bHQgbG9jYXRpb24uICBUaGUgYWN0dWFsIGV4dHJhY3QgbG9jYXRpb24gd2lsbCBiZQorICAgICAgICAvLy8gICBzZXR0YWJsZSBvbiB0aGUgY29tbWFuZCBsaW5lIHdoZW4gdGhlIFNGWCBpcyBleGVjdXRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgWW91IGNhbiBzcGVjaWZ5IGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoaW4gdGhpcyBzdHJpbmcsCisgICAgICAgIC8vLyAgIHdpdGggPGM+JU5BTUUlPC9jPi4gVGhlIHZhbHVlIG9mIHRoZXNlIHZhcmlhYmxlcyB3aWxsIGJlCisgICAgICAgIC8vLyAgIGV4cGFuZGVkIGF0IHRoZSB0aW1lIHRoZSBTRlggaXMgcnVuLiBFeGFtcGxlOgorICAgICAgICAvLy8gICA8Yz4lVVNFUlBST0ZJTEUlXERvY3VtZW50c1x1bnBhY2s8L2M+IG1heSBleHBhbmQgYXQgcnVudGltZSB0bworICAgICAgICAvLy8gICA8Yz5jOlx1c2Vyc1xtZWx2aW5cRG9jdW1lbnRzXHVucGFjazwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBTdHJpbmcgRGVmYXVsdEV4dHJhY3REaXJlY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgbmFtZSBvZiBhbiAuaWNvIGZpbGUgaW4gdGhlIGZpbGVzeXN0ZW0gdG8gdXNlIGZvciB0aGUgYXBwbGljYXRpb24gaWNvbgorICAgICAgICAvLy8gICBmb3IgdGhlIGdlbmVyYXRlZCBTRlguCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgTm9ybWFsbHksIERvdE5ldFppcCB3aWxsIGVtYmVkIGFuICJ6aXBwZWQgZm9sZGVyIiBpY29uIGludG8gdGhlIGdlbmVyYXRlZAorICAgICAgICAvLy8gICBTRlguICBJZiB5b3UgcHJlZmVyIHRvIHVzZSBhIGRpZmZlcmVudCBpY29uLCB5b3UgY2FuIHNwZWNpZnkgaXQgaGVyZS4gSXQKKyAgICAgICAgLy8vICAgc2hvdWxkIGJlIGEgLmljbyBmaWxlLiAgVGhpcyBmaWxlIGlzIHBhc3NlZCBhcyB0aGUgPGM+L3dpbjMyaWNvbjwvYz4KKyAgICAgICAgLy8vICAgb3B0aW9uIHRvIHRoZSBjc2MuZXhlIGNvbXBpbGVyIHdoZW4gY29uc3RydWN0aW5nIHRoZSBTRlggZmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBzdHJpbmcgSWNvbkZpbGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBXaGV0aGVyIHRoZSBDb25zb2xlQXBwbGljYXRpb24gU0ZYIHdpbGwgYmUgcXVpZXQgZHVyaW5nIGV4dHJhY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBvcHRpb24gYWZmZWN0cyB0aGUgd2F5IHRoZSBnZW5lcmF0ZWQgU0ZYIHJ1bnMuIEJ5IGRlZmF1bHQgaXQgaXMKKyAgICAgICAgLy8vICAgZmFsc2UuICBXaGVuIHlvdSBzZXQgaXQgdG8gdHJ1ZSwuLi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8bGlzdCB0eXBlPSJ0YWJsZSI+CisgICAgICAgIC8vLyAgIDxsaXN0aGVhZGVyPgorICAgICAgICAvLy8gICAgIDx0ZXJtPkZsYXZvcjwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+QmVoYXZpb3I8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2xpc3RoZWFkZXI+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyAgIDx0ZXJtPjxjPkNvbnNvbGVBcHBsaWNhdGlvbjwvYz48L3Rlcm0+CisgICAgICAgIC8vLyAgIDxkZXNjcmlwdGlvbj48cGFyYT5ubyBtZXNzYWdlcyB3aWxsIGJlIGVtaXR0ZWQgZHVyaW5nIHN1Y2Nlc3NmdWwKKyAgICAgICAgLy8vICAgICBvcGVyYXRpb24uPC9wYXJhPiA8cGFyYT4gRG91YmxlLWNsaWNraW5nIHRoZSBTRlggaW4gV2luZG93cworICAgICAgICAvLy8gICAgIEV4cGxvcmVyIG9yIGFzIGFuIGF0dGFjaG1lbnQgaW4gYW4gZW1haWwgd2lsbCBjYXVzZSBhIGNvbnNvbGUKKyAgICAgICAgLy8vICAgICB3aW5kb3cgdG8gYXBwZWFyIGJyaWVmbHksIGJlZm9yZSBpdCBkaXNhcHBlYXJzLiBJZiB5b3UgcnVuIHRoZQorICAgICAgICAvLy8gICAgIENvbnNvbGVBcHBsaWNhdGlvbiBTRlggZnJvbSB0aGUgY21kLmV4ZSBwcm9tcHQsIGl0IHJ1bnMgYXMgYQorICAgICAgICAvLy8gICAgIG5vcm1hbCBjb25zb2xlIGFwcDsgYnkgZGVmYXVsdCwgYmVjYXVzZSBpdCBpcyBxdWlldCwgaXQgZGlzcGxheXMKKyAgICAgICAgLy8vICAgICBubyBtZXNzYWdlcyB0byB0aGUgY29uc29sZS4gIElmIHlvdSBwYXNzIHRoZSAtdisgY29tbWFuZCBsaW5lCisgICAgICAgIC8vLyAgICAgYXJndW1lbnQgdG8gdGhlIENvbnNvbGUgU0ZYIHdoZW4geW91IHJ1biBpdCwgeW91IHdpbGwgZ2V0IHZlcmJvc2UKKyAgICAgICAgLy8vICAgICBtZXNzYWdlcyB0byB0aGUgY29uc29sZS4gPC9wYXJhPgorICAgICAgICAvLy8gICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxpdGVtPgorICAgICAgICAvLy8gICA8dGVybT48Yz5XaW5Gb3Jtc0FwcGxpY2F0aW9uPC9jPjwvdGVybT4KKyAgICAgICAgLy8vICAgPGRlc2NyaXB0aW9uPnRoZSBTRlggZXh0cmFjdHMgYXV0b21hdGljYWxseSB3aGVuIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAvLy8gICAgICAgIGlzIGxhdW5jaGVkLCB3aXRoIG5vIGFkZGl0aW9uYWwgdXNlciBpbnB1dC4KKyAgICAgICAgLy8vICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2xpc3Q+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4geW91IHNldCBpdCB0byBmYWxzZSwuLi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8bGlzdCB0eXBlPSJ0YWJsZSI+CisgICAgICAgIC8vLyAgIDxsaXN0aGVhZGVyPgorICAgICAgICAvLy8gICAgIDx0ZXJtPkZsYXZvcjwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+QmVoYXZpb3I8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2xpc3RoZWFkZXI+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGl0ZW0+CisgICAgICAgIC8vLyAgIDx0ZXJtPjxjPkNvbnNvbGVBcHBsaWNhdGlvbjwvYz48L3Rlcm0+CisgICAgICAgIC8vLyAgIDxkZXNjcmlwdGlvbj48cGFyYT50aGUgZXh0cmFjdG9yIHdpbGwgZW1pdCBhCisgICAgICAgIC8vLyAgICAgbWVzc2FnZSB0byB0aGUgY29uc29sZSBmb3IgZWFjaCBlbnRyeSBleHRyYWN0ZWQuPC9wYXJhPgorICAgICAgICAvLy8gICAgIDxwYXJhPgorICAgICAgICAvLy8gICAgICAgV2hlbiBkb3VibGUtY2xpY2tpbmcgdG8gbGF1bmNoIHRoZSBTRlgsIHRoZSBjb25zb2xlIHdpbmRvdyB3aWxsCisgICAgICAgIC8vLyAgICAgICByZW1haW4sIGFuZCB0aGUgU0ZYIHdpbGwgZW1pdCBhIG1lc3NhZ2UgZm9yIGVhY2ggZmlsZSBhcyBpdAorICAgICAgICAvLy8gICAgICAgZXh0cmFjdHMuIFRoZSBtZXNzYWdlcyBmbHkgYnkgcXVpY2tseSwgdGhleSB3b24ndCBiZSBlYXNpbHkKKyAgICAgICAgLy8vICAgICAgIHJlYWRhYmxlLCB1bmxlc3MgdGhlIGV4dHJhY3RlZCBmaWxlcyBhcmUgZmFpcmx5IGxhcmdlLgorICAgICAgICAvLy8gICAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8aXRlbT4KKyAgICAgICAgLy8vICAgPHRlcm0+PGM+V2luRm9ybXNBcHBsaWNhdGlvbjwvYz48L3Rlcm0+CisgICAgICAgIC8vLyAgIDxkZXNjcmlwdGlvbj50aGUgU0ZYIHByZXNlbnRzIGEgZm9ybXMgVUkgYW5kIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QKKyAgICAgICAgLy8vICAgICBvcHRpb25zIGJlZm9yZSBleHRyYWN0aW5nLgorICAgICAgICAvLy8gICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBib29sIFF1aWV0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTcGVjaWZ5IHdoYXQgdGhlIHNlbGYtZXh0cmFjdG9yIHdpbGwgZG8gd2hlbiBleHRyYWN0aW5nIGFuIGVudHJ5CisgICAgICAgIC8vLyAgIHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGRlZmF1bHQgYmVoYXZ2aW9yIGlzIHRvIFRocm93LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgSW9uaWMuWmlwLkV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24gRXh0cmFjdEV4aXN0aW5nRmlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgV2hldGhlciB0byByZW1vdmUgdGhlIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHVucGFja2VkLCBhZnRlciBleGVjdXRpbmcgdGhlCisgICAgICAgIC8vLyAgIFBvc3RFeHRyYWN0Q29tbWFuZExpbmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgdHJ1ZSwgYW5kIGlmIHRoZXJlIGlzIGEgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTZWxmRXh0cmFjdG9yU2F2ZU9wdGlvbnMuUG9zdEV4dHJhY3RDb21tYW5kTGluZSI+CisgICAgICAgIC8vLyAgIFBvc3RFeHRyYWN0Q29tbWFuZExpbmU8L3NlZT4sIGFuZCBpZiB0aGUgY29tbWFuZCBydW5zIHN1Y2Nlc3NmdWxseSwKKyAgICAgICAgLy8vICAgdGhlbiB0aGUgZmlsZXMgdGhhdCB0aGUgU0ZYIHVucGFja2VkIHdpbGwgYmUgcmVtb3ZlZCwgYWZ0ZXJ3YXJkcy4gIElmCisgICAgICAgIC8vLyAgIHRoZSBjb21tYW5kIGRvZXMgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSAobm9uLXplcm8gcmV0dXJuIGNvZGUpLAorICAgICAgICAvLy8gICB0aGF0IGlzIGludGVycHJldGVkIGFzIGEgZmFpbHVyZSwgYW5kIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2lsbCBub3QgYmUKKyAgICAgICAgLy8vICAgcmVtb3ZlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2V0dGluZyB0aGlzIGZsYWcsIGFuZCBzZXR0aW5nIDxjPkZsYXZvcjwvYz4gdG8KKyAgICAgICAgLy8vICAgPGM+U2VsZkV4dHJhY3RvckZsYXZvci5Db25zb2xlQXBwbGljYXRpb248L2M+LCBhbmQgc2V0dGluZyA8Yz5RdWlldDwvYz4gdG8KKyAgICAgICAgLy8vICAgdHJ1ZSwgcmVzdWx0cyBpbiBhbiBTRlggdGhhdCBleHRyYWN0cyBpdHNlbGYsIHJ1bnMgYSBmaWxlIHRoYXQgd2FzCisgICAgICAgIC8vLyAgIGV4dHJhY3RlZCwgdGhlbiBkZWxldGVzIGFsbCB0aGUgZmlsZXMgdGhhdCB3ZXJlIGV4dHJhY3RlZCwgd2l0aCBubworICAgICAgICAvLy8gICBpbnRlcnZlbnRpb24gYnkgdGhlIHVzZXIuICBZb3UgbWF5IGFsc28gd2FudCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0CisgICAgICAgIC8vLyAgIGV4dHJhY3QgbG9jYXRpb24sIHdpdGggPGM+RGVmYXVsdEV4dHJhY3REaXJlY3Rvcnk8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGJvb2wgUmVtb3ZlVW5wYWNrZWRGaWxlc0FmdGVyRXhlY3V0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGZpbGUgdmVyc2lvbiBudW1iZXIgdG8gZW1iZWQgaW50byB0aGUgZ2VuZXJhdGVkIEVYRS4gSXQgd2lsbCBzaG93IHVwLCBmb3IKKyAgICAgICAgLy8vICAgZXhhbXBsZSwgZHVyaW5nIGEgbW91c2VvdmVyIGluIFdpbmRvd3MgRXhwbG9yZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgVmVyc2lvbiBGaWxlVmVyc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBwcm9kdWN0IHZlcnNpb24gdG8gZW1iZWQgaW50byB0aGUgZ2VuZXJhdGVkIEVYRS4gSXQgd2lsbCBzaG93IHVwLCBmb3IKKyAgICAgICAgLy8vICAgZXhhbXBsZSwgZHVyaW5nIGEgbW91c2VvdmVyIGluIFdpbmRvd3MgRXhwbG9yZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFlvdSBjYW4gdXNlIGFueSBhcmJpdHJhcnkgc3RyaW5nLCBidXQgYSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG51bWJlciBpcworICAgICAgICAvLy8gICByZWNvbW1lbmRlZC4gRm9yIGV4YW1wbGUgInYxLjIgYWxwaGEiIG9yICJ2NC4yIFJDMiIuICBJZiB5b3Ugc3BlY2lmeSBub3RoaW5nLAorICAgICAgICAvLy8gICB0aGVuIHRoZXJlIGlzIG5vIHByb2R1Y3QgdmVyc2lvbiBlbWJlZGRlZCBpbnRvIHRoZSBFWEUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgU3RyaW5nIFByb2R1Y3RWZXJzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGNvcHlyaWdodCBub3RpY2UsIGlmIGFueSwgdG8gZW1iZWQgaW50byB0aGUgZ2VuZXJhdGVkIEVYRS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgSXQgd2lsbCBzaG93IHVwLCBmb3IgZXhhbXBsZSwgd2hpbGUgdmlld2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBmaWxlIGluCisgICAgICAgIC8vLyAgIFdpbmRvd3MgRXhwbG9yZXIuICBZb3UgY2FuIHVzZSBhbnkgYXJiaXRyYXJ5IHN0cmluZywgYnV0IHR5cGljYWxseSB5b3UKKyAgICAgICAgLy8vICAgd2FudCBzb21ldGhpbmcgbGlrZSAiQ29weXJpZ2h0IO+/vSBEaW5vIENoaWVzYSAyMDExIi4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBTdHJpbmcgQ29weXJpZ2h0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgZGVzY3JpcHRpb24gdG8gZW1iZWQgaW50byB0aGUgZ2VuZXJhdGVkIEVYRS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVXNlIGFueSBhcmJpdHJhcnkgc3RyaW5nLiAgVGhpcyB0ZXh0IHdpbGwgYmUgZGlzcGxheWVkIGR1cmluZyBhCisgICAgICAgIC8vLyAgIG1vdXNlb3ZlciBpbiBXaW5kb3dzIEV4cGxvcmVyLiAgSWYgeW91IHNwZWNpZnkgbm90aGluZywgdGhlbiB0aGUgc3RyaW5nCisgICAgICAgIC8vLyAgICJEb3ROZXRaaXAgU0ZYIEFyY2hpdmUiIGlzIGVtYmVkZGVkIGludG8gdGhlIEVYRSBhcyB0aGUgZGVzY3JpcHRpb24uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgU3RyaW5nIERlc2NyaXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIHByb2R1Y3QgbmFtZSB0byBlbWJlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgRVhFLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBVc2UgYW55IGFyYml0cmFyeSBzdHJpbmcuIFRoaXMgdGV4dCB3aWxsIGJlIGRpc3BsYXllZAorICAgICAgICAvLy8gICB3aGlsZSB2aWV3aW5nIHByb3BlcnRpZXMgb2YgdGhlIEVYRSBmaWxlIGluCisgICAgICAgIC8vLyAgIFdpbmRvd3MgRXhwbG9yZXIuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgU3RyaW5nIFByb2R1Y3ROYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIHRpdGxlIHRvIGRpc3BsYXkgaW4gdGhlIFdpbmRvdyBvZiBhIEdVSSBTRlgsIHdoaWxlIGl0IGV4dHJhY3RzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBCeSBkZWZhdWx0IHRoZSB0aXRsZSBzaG93IGluIHRoZSBHVUkgd2luZG93IG9mIGEgc2VsZi1leHRyYWN0b3IKKyAgICAgICAgLy8vICAgICBpcyAiRG90TmV0WmlwIFNlbGYtZXh0cmFjdG9yIChodHRwOi8vRG90TmV0WmlwLmNvZGVwbGV4LmNvbS8pIi4KKyAgICAgICAgLy8vICAgICBZb3UgY2FuIGNoYW5nZSB0aGF0IGJ5IHNldHRpbmcgdGhpcyBwcm9wZXJ0eSBiZWZvcmUgc2F2aW5nIHRoZSBTRlguCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoaXMgcHJvcGVydHkgaGFzIGFuIGVmZmVjdCBvbmx5IHdoZW4gcHJvZHVjaW5nIGEgU2VsZi1leHRyYWN0b3IKKyAgICAgICAgLy8vICAgICBvZiBmbGF2b3IgPGM+U2VsZkV4dHJhY3RvckZsYXZvci5XaW5Gb3Jtc0FwcGxpY2F0aW9uPC9jPi4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFN0cmluZyBTZnhFeGVXaW5kb3dUaXRsZQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMjYwOAorICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBjc2MuZXhlIGNvbXBpbGVyLCB3aGVuIHByb2R1Y2luZyB0aGUgU0ZYCisgICAgICAgIC8vLyAgIEVYRS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxleGNsdWRlLz4KKyAgICAgICAgcHVibGljIHN0cmluZyBBZGRpdGlvbmFsQ29tcGlsZXJTd2l0Y2hlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7IHNldDsKKyAgICAgICAgfQorICAgIH0KKworCisKKworICAgIHBhcnRpYWwgY2xhc3MgWmlwRmlsZQorICAgIHsKKyAgICAgICAgY2xhc3MgRXh0cmFjdG9yU2V0dGluZ3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFNlbGZFeHRyYWN0b3JGbGF2b3IgRmxhdm9yOworICAgICAgICAgICAgcHVibGljIExpc3Q8c3RyaW5nPiBSZWZlcmVuY2VkQXNzZW1ibGllczsKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PHN0cmluZz4gQ29weVRocm91Z2hSZXNvdXJjZXM7CisgICAgICAgICAgICBwdWJsaWMgTGlzdDxzdHJpbmc+IFJlc291cmNlc1RvQ29tcGlsZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRXh0cmFjdG9yU2V0dGluZ3NbXSBTZXR0aW5nc0xpc3QgPSB7CisgICAgICAgICAgICBuZXcgRXh0cmFjdG9yU2V0dGluZ3MoKSB7CisgICAgICAgICAgICAgICAgRmxhdm9yID0gU2VsZkV4dHJhY3RvckZsYXZvci5XaW5Gb3Jtc0FwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZWRBc3NlbWJsaWVzPSBuZXcgTGlzdDxzdHJpbmc+eworICAgICAgICAgICAgICAgICAgICAiU3lzdGVtLmRsbCIsICJTeXN0ZW0uV2luZG93cy5Gb3Jtcy5kbGwiLCAiU3lzdGVtLkRyYXdpbmcuZGxsIn0sCisgICAgICAgICAgICAgICAgQ29weVRocm91Z2hSZXNvdXJjZXMgPSBuZXcgTGlzdDxzdHJpbmc+eworICAgICAgICAgICAgICAgICAgICAiSW9uaWMuWmlwLldpbkZvcm1zU2VsZkV4dHJhY3RvclN0dWIucmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgIklvbmljLlppcC5Gb3Jtcy5QYXNzd29yZERpYWxvZy5yZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAiSW9uaWMuWmlwLkZvcm1zLlppcENvbnRlbnRzRGlhbG9nLnJlc291cmNlcyJ9LAorICAgICAgICAgICAgICAgIFJlc291cmNlc1RvQ29tcGlsZSA9IG5ldyBMaXN0PHN0cmluZz57CisgICAgICAgICAgICAgICAgICAgICJXaW5Gb3Jtc1NlbGZFeHRyYWN0b3JTdHViLmNzIiwKKyAgICAgICAgICAgICAgICAgICAgIldpbkZvcm1zU2VsZkV4dHJhY3RvclN0dWIuRGVzaWduZXIuY3MiLCAvLyAuRGVzaWduZXIuY3M/CisgICAgICAgICAgICAgICAgICAgICJQYXNzd29yZERpYWxvZy5jcyIsCisgICAgICAgICAgICAgICAgICAgICJQYXNzd29yZERpYWxvZy5EZXNpZ25lci5jcyIsICAgICAgICAgICAgIC8vLkRlc2lnbmVyLmNzIgorICAgICAgICAgICAgICAgICAgICAiWmlwQ29udGVudHNEaWFsb2cuY3MiLAorICAgICAgICAgICAgICAgICAgICAiWmlwQ29udGVudHNEaWFsb2cuRGVzaWduZXIuY3MiLCAgICAgICAgICAgICAvLy5EZXNpZ25lci5jcyIKKyAgICAgICAgICAgICAgICAgICAgIkZvbGRlckJyb3dzZXJEaWFsb2dFeC5jcyIsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBFeHRyYWN0b3JTZXR0aW5ncygpIHsKKyAgICAgICAgICAgICAgICBGbGF2b3IgPSBTZWxmRXh0cmFjdG9yRmxhdm9yLkNvbnNvbGVBcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VkQXNzZW1ibGllcz0gbmV3IExpc3Q8c3RyaW5nPiB7ICJTeXN0ZW0uZGxsIiwgfSwKKyAgICAgICAgICAgICAgICBDb3B5VGhyb3VnaFJlc291cmNlcyA9IG51bGwsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VzVG9Db21waWxlID0gbmV3IExpc3Q8c3RyaW5nPnsiQ29tbWFuZExpbmVTZWxmRXh0cmFjdG9yU3R1Yi5jcyJ9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworCisgICAgICAgIC8vc3RyaW5nIF9kZWZhdWx0RXh0cmFjdExvY2F0aW9uOworICAgICAgICAvL3N0cmluZyBfcG9zdEV4dHJhY3RDbWRMaW5lOworICAgICAgICAvLyAgICAgICAgIHN0cmluZyBfU2V0RGVmYXVsdExvY2F0aW9uQ29kZSA9CisgICAgICAgIC8vICAgICAgICAgIm5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAgeyBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFdpbkZvcm1zU2VsZkV4dHJhY3RvclN0dWIgeyBwYXJ0aWFsIHZvaWQgX1NldERlZmF1bHRFeHRyYWN0TG9jYXRpb24oKSB7IiArCisgICAgICAgIC8vICAgICAgICAgIiB0eHRFeHRyYWN0RGlyZWN0b3J5LlRleHQgPSBcIkBAVkFMVUVcIjsgfSB9fSI7CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhdmVzIHRoZSBaaXBGaWxlIGluc3RhbmNlIHRvIGEgc2VsZi1leHRyYWN0aW5nIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhlIGdlbmVyYXRlZCBleGUgaW1hZ2Ugd2lsbCBleGVjdXRlIG9uIGFueSBtYWNoaW5lIHRoYXQgaGFzIHRoZSAuTkVUCisgICAgICAgIC8vLyBGcmFtZXdvcmsgMi4wIGluc3RhbGxlZCBvbiBpdC4gIFRoZSBnZW5lcmF0ZWQgZXhlIGltYWdlIGlzIGFsc28gYQorICAgICAgICAvLy8gdmFsaWQgWklQIGZpbGUsIHJlYWRhYmxlIHdpdGggRG90TmV0WmlwIG9yIGFub3RoZXIgWmlwIGxpYnJhcnkgb3IgdG9vbAorICAgICAgICAvLy8gc3VjaCBhcyBXaW5aaXAuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGVyZSBhcmUgdHdvICJmbGF2b3JzIiBvZiBzZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZS4gIFRoZQorICAgICAgICAvLy8gPGM+V2luRm9ybXNBcHBsaWNhdGlvbjwvYz4gdmVyc2lvbiB3aWxsIHBvcCB1cCBhIEdVSSBhbmQgYWxsb3cgdGhlCisgICAgICAgIC8vLyB1c2VyIHRvIHNlbGVjdCBhIHRhcmdldCBkaXJlY3RvcnkgaW50byB3aGljaCB0byBleHRyYWN0LiBUaGVyZSdzIGFsc28KKyAgICAgICAgLy8vIGEgY2hlY2tib3ggYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMsCisgICAgICAgIC8vLyBhbmQgYW5vdGhlciBjaGVja2JveCB0byBhbGxvdyB0aGUgdXNlciB0byByZXF1ZXN0IHRoYXQgRXhwbG9yZXIgYmUKKyAgICAgICAgLy8vIG9wZW5lZCB0byBzZWUgdGhlIGV4dHJhY3RlZCBmaWxlcyBhZnRlciBleHRyYWN0aW9uLiAgVGhlIG90aGVyIGZsYXZvcgorICAgICAgICAvLy8gaXMgPGM+Q29uc29sZUFwcGxpY2F0aW9uPC9jPi4gIEEgc2VsZi1leHRyYWN0b3IgZ2VuZXJhdGVkIHdpdGggdGhhdAorICAgICAgICAvLy8gZmxhdm9yIHNldHRpbmcgd2lsbCBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBJdCBhY2NlcHRzIGNvbW1hbmQtbGluZQorICAgICAgICAvLy8gb3B0aW9ucyB0byBzZXQgdGhlIG92ZXJ3cml0ZSBiZWhhdmlvciwgYW5kIHRvIHNwZWNpZnkgdGhlIHRhcmdldAorICAgICAgICAvLy8gZXh0cmFjdGlvbiBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGVyZSBhcmUgYSBmZXcgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgZHVyaW5nIHRoZSBzYXZpbmcgdG8gYQorICAgICAgICAvLy8gc2VsZi1leHRyYWN0aW5nIHppcC4gIFRoZXNlIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSBkaXJlY3RvcnkgcG9pbnRlZAorICAgICAgICAvLy8gdG8gYnkgPHNlZSBjcmVmPSJaaXBGaWxlLlRlbXBGaWxlRm9sZGVyIi8+LCB3aGljaCBkZWZhdWx0cyB0byA8c2VlCisgICAgICAgIC8vLyBjcmVmPSJTeXN0ZW0uSU8uUGF0aC5HZXRUZW1wUGF0aCIvPi4gIFRoZXNlIHRlbXBvcmFyeSBmaWxlcyBhcmUKKyAgICAgICAgLy8vIHJlbW92ZWQgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBXaGVuIGEgdXNlciBydW5zIHRoZSBXaW5Gb3JtcyBTRlgsIHRoZSB1c2VyJ3MgcGVyc29uYWwgZGlyZWN0b3J5ICg8c2VlCisgICAgICAgIC8vLyBjcmVmPSJFbnZpcm9ubWVudC5TcGVjaWFsRm9sZGVyLlBlcnNvbmFsIj5FbnZpcm9ubWVudC5TcGVjaWFsRm9sZGVyLlBlcnNvbmFsPC9zZWU+KQorICAgICAgICAvLy8gd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dHJhY3QgbG9jYXRpb24uICBJZiB5b3Ugd2FudCB0byBzZXQgdGhlCisgICAgICAgIC8vLyBkZWZhdWx0IGV4dHJhY3QgbG9jYXRpb24sIHlvdSBzaG91bGQgdXNlIHRoZSBvdGhlciBvdmVybG9hZCBvZgorICAgICAgICAvLy8gPGM+U2F2ZVNlbGZFeHRyYWN0b3IoKTwvYz4vIFRoZSB1c2VyIHdobyBydW5zIHRoZSBTRlggd2lsbCBoYXZlIHRoZQorICAgICAgICAvLy8gb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBiZWZvcmUgZXh0cmFjdGluZy4gV2hlbgorICAgICAgICAvLy8gdGhlIHVzZXIgcnVucyB0aGUgQ29tbWFuZC1MaW5lIFNGWCwgdGhlIHVzZXIgbXVzdCBleHBsaWNpdGx5IHNwZWNpZnkKKyAgICAgICAgLy8vIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggdG8gZXh0cmFjdC4gIFRoZSAuTkVUIEZyYW1ld29yayAyLjAgaXMgcmVxdWlyZWQKKyAgICAgICAgLy8vIG9uIHRoZSBjb21wdXRlciB3aGVuIHRoZSBzZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZSBpcyBydW4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBOQjogVGhpcyBtZXRob2QgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgdmVyc2lvbiBvZiBEb3ROZXRaaXAgYnVpbGQgZm9yCisgICAgICAgIC8vLyB0aGUgLk5FVCBDb21wYWN0IEZyYW1ld29yaywgbm9yIGluIHRoZSAiUmVkdWNlZCIgRG90TmV0WmlwIGxpYnJhcnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyBzdHJpbmcgRGlyZWN0b3J5UGF0aCA9ICJjOlxcRG9jdW1lbnRzXFxQcm9qZWN0NyI7CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHppcC5BZGREaXJlY3RvcnkoRGlyZWN0b3J5UGF0aCwgU3lzdGVtLklPLlBhdGguR2V0RmlsZU5hbWUoRGlyZWN0b3J5UGF0aCkpOworICAgICAgICAvLy8gICAgIHppcC5Db21tZW50ID0gIlRoaXMgd2lsbCBiZSBlbWJlZGRlZCBpbnRvIGEgc2VsZi1leHRyYWN0aW5nIGNvbnNvbGUtYmFzZWQgZXhlIjsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZVNlbGZFeHRyYWN0b3IoImFyY2hpdmUuZXhlIiwgU2VsZkV4dHJhY3RvckZsYXZvci5Db25zb2xlQXBwbGljYXRpb24pOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gRGltIERpcmVjdG9yeVBhdGggQXMgU3RyaW5nID0gImM6XERvY3VtZW50c1xQcm9qZWN0NyIKKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBOZXcgWmlwRmlsZSgpCisgICAgICAgIC8vLyAgICAgemlwLkFkZERpcmVjdG9yeShEaXJlY3RvcnlQYXRoLCBTeXN0ZW0uSU8uUGF0aC5HZXRGaWxlTmFtZShEaXJlY3RvcnlQYXRoKSkKKyAgICAgICAgLy8vICAgICB6aXAuQ29tbWVudCA9ICJUaGlzIHdpbGwgYmUgZW1iZWRkZWQgaW50byBhIHNlbGYtZXh0cmFjdGluZyBjb25zb2xlLWJhc2VkIGV4ZSIKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZVNlbGZFeHRyYWN0b3IoImFyY2hpdmUuZXhlIiwgU2VsZkV4dHJhY3RvckZsYXZvci5Db25zb2xlQXBwbGljYXRpb24pCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXhlVG9HZW5lcmF0ZSI+CisgICAgICAgIC8vLyAgIGEgcGF0aG5hbWUsIHBvc3NpYmx5IGZ1bGx5IHF1YWxpZmllZCwgdG8gYmUgY3JlYXRlZC4gVHlwaWNhbGx5IGl0CisgICAgICAgIC8vLyAgIHdpbGwgZW5kIGluIGFuIC5leGUgZXh0ZW5zaW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmxhdm9yIj4KKyAgICAgICAgLy8vICAgSW5kaWNhdGVzIHdoZXRoZXIgYSBXaW5mb3JtcyBvciBDb25zb2xlIHNlbGYtZXh0cmFjdG9yIGlzCisgICAgICAgIC8vLyAgIGRlc2lyZWQuIDwvcGFyYW0+CisgICAgICAgIGludGVybmFsIHZvaWQgU2F2ZVNlbGZFeHRyYWN0b3Ioc3RyaW5nIGV4ZVRvR2VuZXJhdGUsIFNlbGZFeHRyYWN0b3JGbGF2b3IgZmxhdm9yKQorICAgICAgICB7CisgICAgICAgICAgICBTZWxmRXh0cmFjdG9yU2F2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBTZWxmRXh0cmFjdG9yU2F2ZU9wdGlvbnMoKTsKKyAgICAgICAgICAgIG9wdGlvbnMuRmxhdm9yID0gZmxhdm9yOworICAgICAgICAgICAgU2F2ZVNlbGZFeHRyYWN0b3IoZXhlVG9HZW5lcmF0ZSwgb3B0aW9ucyk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTYXZlcyB0aGUgWmlwRmlsZSBpbnN0YW5jZSB0byBhIHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSwgdXNpbmcKKyAgICAgICAgLy8vICAgdGhlIHNwZWNpZmllZCBzYXZlIG9wdGlvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2Qgc2F2ZXMgYSBzZWxmIGV4dHJhY3RpbmcgYXJjaGl2ZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBzYXZlCisgICAgICAgIC8vLyAgIG9wdGlvbnMuIFRoZXNlIG9wdGlvbnMgaW5jbHVkZSB0aGUgZmxhdm9yIG9mIHRoZSBTRlgsIHRoZSBkZWZhdWx0IGV4dHJhY3QKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5LCB0aGUgaWNvbiBmaWxlLCBhbmQgc28gb24uICBTZWUgdGhlIGRvY3VtZW50YXRpb24KKyAgICAgICAgLy8vICAgZm9yIDxzZWUgY3JlZj0iU2F2ZVNlbGZFeHRyYWN0b3Ioc3RyaW5nICwgU2VsZkV4dHJhY3RvckZsYXZvcikiLz4gZm9yIG1vcmUKKyAgICAgICAgLy8vICAgZGV0YWlscy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHVzZXIgd2hvIHJ1bnMgdGhlIFNGWCB3aWxsIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIGNoYW5nZSB0aGUgZXh0cmFjdAorICAgICAgICAvLy8gICBkaXJlY3RvcnkgYmVmb3JlIGV4dHJhY3RpbmcuIElmIGF0IHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24sIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCB0aGUgU0ZYIHdpbGwgY3JlYXRlIHRoZSBkaXJlY3RvcnkgYmVmb3JlCisgICAgICAgIC8vLyAgIGV4dHJhY3RpbmcgdGhlIGZpbGVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHNhdmVzIGEgV2luRm9ybXMtYmFzZWQgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUgRVhFIHRoYXQKKyAgICAgICAgLy8vICAgd2lsbCB1c2UgYzpcRXh0cmFjdEhlcmUgYXMgdGhlIGRlZmF1bHQgZXh0cmFjdCBsb2NhdGlvbi4gVGhlIEMjIGNvZGUKKyAgICAgICAgLy8vICAgc2hvd3Mgc3ludGF4IGZvciAuTkVUIDMuMCwgd2hpY2ggdXNlcyBhbiBvYmplY3QgaW5pdGlhbGl6ZXIgZm9yCisgICAgICAgIC8vLyAgIHRoZSBTZWxmRXh0cmFjdG9yT3B0aW9ucyBvYmplY3QuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHN0cmluZyBEaXJlY3RvcnlQYXRoID0gImM6XFxEb2N1bWVudHNcXFByb2plY3Q3IjsKKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgemlwLkFkZERpcmVjdG9yeShEaXJlY3RvcnlQYXRoLCBTeXN0ZW0uSU8uUGF0aC5HZXRGaWxlTmFtZShEaXJlY3RvcnlQYXRoKSk7CisgICAgICAgIC8vLyAgICAgemlwLkNvbW1lbnQgPSAiVGhpcyB3aWxsIGJlIGVtYmVkZGVkIGludG8gYSBzZWxmLWV4dHJhY3RpbmcgV2luRm9ybXMtYmFzZWQgZXhlIjsKKyAgICAgICAgLy8vICAgICB2YXIgb3B0aW9ucyA9IG5ldyBTZWxmRXh0cmFjdG9yT3B0aW9ucworICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgIEZsYXZvciA9IFNlbGZFeHRyYWN0b3JGbGF2b3IuV2luRm9ybXNBcHBsaWNhdGlvbiwKKyAgICAgICAgLy8vICAgICAgIERlZmF1bHRFeHRyYWN0RGlyZWN0b3J5ID0gIiVVU0VSUFJPRklMRSVcXEV4dHJhY3RIZXJlIiwKKyAgICAgICAgLy8vICAgICAgIFBvc3RFeHRyYWN0Q29tbWFuZExpbmUgPSBFeGVUb1J1bkFmdGVyRXh0cmFjdCwKKyAgICAgICAgLy8vICAgICAgIFNmeEV4ZVdpbmRvd1RpdGxlID0gIk15IEN1c3RvbSBXaW5kb3cgVGl0bGUiLAorICAgICAgICAvLy8gICAgICAgUmVtb3ZlVW5wYWNrZWRGaWxlc0FmdGVyRXhlY3V0ZSA9IHRydWUKKyAgICAgICAgLy8vICAgICB9OworICAgICAgICAvLy8gICAgIHppcC5TYXZlU2VsZkV4dHJhY3RvcigiYXJjaGl2ZS5leGUiLCBvcHRpb25zKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIERpbSBEaXJlY3RvcnlQYXRoIEFzIFN0cmluZyA9ICJjOlxEb2N1bWVudHNcUHJvamVjdDciCisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgTmV3IFppcEZpbGUoKQorICAgICAgICAvLy8gICAgIHppcC5BZGREaXJlY3RvcnkoRGlyZWN0b3J5UGF0aCwgU3lzdGVtLklPLlBhdGguR2V0RmlsZU5hbWUoRGlyZWN0b3J5UGF0aCkpCisgICAgICAgIC8vLyAgICAgemlwLkNvbW1lbnQgPSAiVGhpcyB3aWxsIGJlIGVtYmVkZGVkIGludG8gYSBzZWxmLWV4dHJhY3RpbmcgY29uc29sZS1iYXNlZCBleGUiCisgICAgICAgIC8vLyAgICAgRGltIG9wdGlvbnMgQXMgTmV3IFNlbGZFeHRyYWN0b3JPcHRpb25zKCkKKyAgICAgICAgLy8vICAgICBvcHRpb25zLkZsYXZvciA9IFNlbGZFeHRyYWN0b3JGbGF2b3IuV2luRm9ybXNBcHBsaWNhdGlvbgorICAgICAgICAvLy8gICAgIG9wdGlvbnMuRGVmYXVsdEV4dHJhY3REaXJlY3RvcnkgPSAiJVVTRVJQUk9GSUxFJVxcRXh0cmFjdEhlcmUiCisgICAgICAgIC8vLyAgICAgb3B0aW9ucy5Qb3N0RXh0cmFjdENvbW1hbmRMaW5lID0gRXhlVG9SdW5BZnRlckV4dHJhY3QKKyAgICAgICAgLy8vICAgICBvcHRpb25zLlNmeEV4ZVdpbmRvd1RpdGxlID0gIk15IEN1c3RvbSBXaW5kb3cgVGl0bGUiCisgICAgICAgIC8vLyAgICAgb3B0aW9ucy5SZW1vdmVVbnBhY2tlZEZpbGVzQWZ0ZXJFeGVjdXRlID0gVHJ1ZQorICAgICAgICAvLy8gICAgIHppcC5TYXZlU2VsZkV4dHJhY3RvcigiYXJjaGl2ZS5leGUiLCBvcHRpb25zKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4ZVRvR2VuZXJhdGUiPlRoZSBuYW1lIG9mIHRoZSBFWEUgdG8gZ2VuZXJhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHRpb25zIj5wcm92aWRlcyB0aGUgb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlCisgICAgICAgIC8vLyBTZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZS48L3BhcmFtPgorICAgICAgICBpbnRlcm5hbCB2b2lkIFNhdmVTZWxmRXh0cmFjdG9yKHN0cmluZyBleGVUb0dlbmVyYXRlLCBTZWxmRXh0cmFjdG9yU2F2ZU9wdGlvbnMgb3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2F2ZSBhbiBTRlggdGhhdCBpcyBib3RoIGFuIEVYRSBhbmQgYSBaSVAuCisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgcmUtc2F2aW5nIGEgemlwIGFyY2hpdmUKKyAgICAgICAgICAgIC8vIHRoYXQgd2FzIG9yaWdpbmFsbHkgaW5zdGFudGlhdGVkIHdpdGggYSBzdHJlYW0uICBJbiB0aGF0IGNhc2UsCisgICAgICAgICAgICAvLyB0aGUgX25hbWUgd2lsbCBiZSBudWxsLiBJZiBzbywgd2Ugc2V0IF93cml0ZXN0cmVhbSB0byBudWxsLAorICAgICAgICAgICAgLy8gd2hpY2ggaW5zdXJlcyB0aGF0IHdlJ2xsIGNvbnMgdXAgYSBuZXcgV3JpdGVTdHJlYW0gKHdpdGggYSBmaWxlc3lzdGVtCisgICAgICAgICAgICAvLyBmaWxlIGJhY2tpbmcgaXQpIGluIHRoZSBTYXZlKCkgbWV0aG9kLgorICAgICAgICAgICAgaWYgKF9uYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgX3dyaXRlc3RyZWFtID0gbnVsbDsKKworICAgICAgICAgICAgX1NhdmluZ1NmeCA9IHRydWU7CisgICAgICAgICAgICBfbmFtZSA9IGV4ZVRvR2VuZXJhdGU7CisgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhfbmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiQmFkIERpcmVjdG9yeSIsIG5ldyBTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24oIlRoYXQgbmFtZSBzcGVjaWZpZXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiBQbGVhc2Ugc3BlY2lmeSBhIGZpbGVuYW1lLiIsICJleGVUb0dlbmVyYXRlIikpOworICAgICAgICAgICAgX2NvbnRlbnRzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBfZmlsZUFscmVhZHlFeGlzdHMgPSBGaWxlLkV4aXN0cyhfbmFtZSk7CisKKyAgICAgICAgICAgIF9TYXZlU2Z4U3R1YihleGVUb0dlbmVyYXRlLCBvcHRpb25zKTsKKworICAgICAgICAgICAgU2F2ZSgpOworICAgICAgICAgICAgX1NhdmluZ1NmeCA9IGZhbHNlOworICAgICAgICB9CisKKworCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBFeHRyYWN0UmVzb3VyY2VUb0ZpbGUoQXNzZW1ibHkgYSwgc3RyaW5nIHJlc291cmNlTmFtZSwgc3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gaW5zdHJlYW0gPSBhLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0ocmVzb3VyY2VOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJtaXNzaW5nIHJlc291cmNlICd7MH0nIiwgcmVzb3VyY2VOYW1lKSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyAoRmlsZVN0cmVhbSBvdXRzdHJlYW0gPSBGaWxlLk9wZW5Xcml0ZShmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gaW5zdHJlYW0uUmVhZChieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS5Xcml0ZShieXRlcywgMCwgbik7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG4gPiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBfU2F2ZVNmeFN0dWIoc3RyaW5nIGV4ZVRvR2VuZXJhdGUsIFNlbGZFeHRyYWN0b3JTYXZlT3B0aW9ucyBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbmFtZU9mSWNvbkZpbGUgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIHN0dWJFeGUgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIHVucGFja2VkUmVzb3VyY2VEaXIgPSBudWxsOworICAgICAgICAgICAgc3RyaW5nIHRtcERpciA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZXhlVG9HZW5lcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoVmVyYm9zZSkgU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJUaGUgZXhpc3RpbmcgZmlsZSAoezB9KSB3aWxsIGJlIG92ZXJ3cml0dGVuLiIsIGV4ZVRvR2VuZXJhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWV4ZVRvR2VuZXJhdGUuRW5kc1dpdGgoIi5leGUiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWZXJib3NlKSBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoIldhcm5pbmc6IFRoZSBnZW5lcmF0ZWQgc2VsZi1leHRyYWN0aW5nIGZpbGUgd2lsbCBub3QgaGF2ZSBhbiAuZXhlIGV4dGVuc2lvbi4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDU1MworICAgICAgICAgICAgICAgIHRtcERpciA9IFRlbXBGaWxlRm9sZGVyID8/IFBhdGguR2V0RGlyZWN0b3J5TmFtZShleGVUb0dlbmVyYXRlKTsKKyAgICAgICAgICAgICAgICBzdHViRXhlID0gR2VuZXJhdGVUZW1wUGF0aG5hbWUodG1wRGlyLCAiZXhlIik7CisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIElvbmljLlppcCBhc3NlbWJseQorICAgICAgICAgICAgICAgIEFzc2VtYmx5IGExID0gdHlwZW9mKFppcEZpbGUpLkFzc2VtYmx5OworCisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBjc2hhcnAgPSBuZXcgTWljcm9zb2Z0LkNTaGFycC5DU2hhcnBDb2RlUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBEaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+KCkgeyB7ICJDb21waWxlclZlcnNpb24iLCAidjIuMCIgfSB9KSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYSBwZXJmZWN0IG9wcG9ydHVuaXR5IGZvciBhIGxpbnEgcXVlcnksIGJ1dAorICAgICAgICAgICAgICAgICAgICAvLyBJIGNhbm5vdCB1c2UgaXQuICBEb3ROZXRaaXAgbmVlZHMgdG8gcnVuIG9uIC5ORVQgMi4wLAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdXNpbmcgTElOUSB3b3VsZCBicmVhayB0aGF0LiBIZXJlJ3Mgd2hhdCBpdCB3b3VsZCBsb29rCisgICAgICAgICAgICAgICAgICAgIC8vIGxpa2U6CisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vICAgdmFyIHNldHRpbmdzID0gKGZyb20geCBpbiBTZXR0aW5nc0xpc3QKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgd2hlcmUgeC5GbGF2b3IgPT0gZmxhdm9yCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIHNlbGVjdCB4KS5GaXJzdCgpOworCisgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RvclNldHRpbmdzIHNldHRpbmdzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4gU2V0dGluZ3NMaXN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5GbGF2b3IgPT0gb3B0aW9ucy5GbGF2b3IpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2FuaXR5IGNoZWNrOyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFN0YXRlRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIldoaWxlIHNhdmluZyBhIFNlbGYtRXh0cmFjdGluZyBaaXAsIENhbm5vdCBmaW5kIHRoYXQgZmxhdm9yICh7MH0pPyIsIG9wdGlvbnMuRmxhdm9yKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIGFzc2VtYmxpZXMuICBJb25pYy5aaXAgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIGhlcmUuICBBbHNvIGlmIGl0IGlzIHRoZSB3aW5mb3JtcyAoZ3VpKSBleHRyYWN0b3IsIHdlCisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgb3RoZXIgcmVmZXJlbmNlZCBhc3NlbWJsaWVzLCBsaWtlCisgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5XaW5kb3dzLkZvcm1zLmRsbCwgZXRjLgorICAgICAgICAgICAgICAgICAgICB2YXIgY3AgPSBuZXcgU3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuQ29tcGlsZXJQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIGNwLlJlZmVyZW5jZWRBc3NlbWJsaWVzLkFkZChhMS5Mb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5SZWZlcmVuY2VkQXNzZW1ibGllcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHJhIGluIHNldHRpbmdzLlJlZmVyZW5jZWRBc3NlbWJsaWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLlJlZmVyZW5jZWRBc3NlbWJsaWVzLkFkZChyYSk7CisKKyAgICAgICAgICAgICAgICAgICAgY3AuR2VuZXJhdGVJbk1lbW9yeSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjcC5HZW5lcmF0ZUV4ZWN1dGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjcC5JbmNsdWRlRGVidWdJbmZvcm1hdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjcC5Db21waWxlck9wdGlvbnMgPSAiIjsKKworICAgICAgICAgICAgICAgICAgICBBc3NlbWJseSBhMiA9IEFzc2VtYmx5LkdldEV4ZWN1dGluZ0Fzc2VtYmx5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoaXMgdG8gY29uY2F0ZW5hdGUgYWxsIHRoZSBzb3VyY2UgY29kZSByZXNvdXJjZXMgaW50byBhCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBtb2R1bGUuCisgICAgICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGVyZSBhcmUgY29tcGlsZXIgZXJyb3JzIGxhdGVyLCB3ZSBhbGxvY2F0ZSBhIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIG5hbWUgbm93LiBJZiBlcnJvcnMgYXJlIGRldGVjdGVkLCB3ZSdsbCBzcG9vbCB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgYXMgd2VsbCBhcyB0aGUgZXJyb3JzIChpbiBjb21tZW50cykgaW50byB0aGF0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGZpbGVuYW1lLiAgTWFrZXMgaXQgZWFzaWVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGRpYWdub3NlLiAgVGhpcyBzaG91bGQgYmUgcmFyZTsgbW9zdCBlcnJvcnMgaGFwcGVuIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIGRldmxwbXQgb2YgRG90TmV0WmlwIGl0c2VsZiwgYnV0IHRoZXJlIGFyZSByYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIG9jY2FzaW9ucyB3aGVuIHRoZXkgb2NjdXIgaW4gb3RoZXIgY2FzZXMuCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzb3VyY2VGaWxlID0gR2VuZXJhdGVUZW1wUGF0aG5hbWUodG1wRGlyLCAiY3MiKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8vIC8vIGRlYnVnZ2luZzogZW51bWVyYXRlIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBhc3NlbWJseQorICAgICAgICAgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiUmVzb3VyY2VzIGluIHRoaXMgYXNzZW1ibHk6Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvcmVhY2ggKHN0cmluZyByc3JjIGluIGEyLkdldE1hbmlmZXN0UmVzb3VyY2VOYW1lcygpKQorICAgICAgICAgICAgICAgICAgICAvLyAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgIENvbnNvbGUuV3JpdGVMaW5lKHJzcmMpOworICAgICAgICAgICAgICAgICAgICAvLyAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgc291cmNlIGNvZGUgaXMgZW1iZWRkZWQgaW4gdGhlIERMTCBhcyBhIHppcCBmaWxlLgorICAgICAgICAgICAgICAgICAgICB1c2luZyAoWmlwRmlsZSB6aXAgPSBaaXBGaWxlLlJlYWQoYTIuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiSW9uaWMuWmlwLlJlc291cmNlcy5aaXBwZWRSZXNvdXJjZXMuemlwIikpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAvLyBkZWJ1Z2dpbmc6IGVudW1lcmF0ZSB0aGUgZmlsZXMgaW4gdGhlIGVtYmVkZGVkIHppcAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIkVudHJpZXMgaW4gdGhlIGVtYmJlZGRlZCB6aXA6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JlYWNoIChaaXBFbnRyeSBlbnRyeSBpbiB6aXApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBDb25zb2xlLldyaXRlTGluZShlbnRyeS5GaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja2VkUmVzb3VyY2VEaXIgPSBHZW5lcmF0ZVRlbXBQYXRobmFtZSh0bXBEaXIsICJ0bXAiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KG9wdGlvbnMuSWNvbkZpbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgaWNvIGZpbGUgdGhhdCBpcyBlbWJlZGRlZCBpbnRvIHRoZSBJb25pYy5aaXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBETEwgaXRzZWxmLiAgVG8gZG8gdGhpcyB3ZSBtdXN0IHVucGFjayB0aGUgaWNvbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlc3lzdGVtLCBpbiBvcmRlciB0byBzcGVjaWZ5IGl0IG9uIHRoZSBjbWRsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgY3NjLmV4ZS4gIFRoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSB1bnBhY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLklPLkRpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkodW5wYWNrZWRSZXNvdXJjZURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmlwRW50cnkgZSA9IHppcFsiemlwcGVkRmlsZS5pY28iXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBleHRyYWN0IGEgcmVhZG9ubHkgZmlsZSAtIGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUuQXR0cmlidXRlcyAmIEZpbGVBdHRyaWJ1dGVzLlJlYWRPbmx5KSA9PSBGaWxlQXR0cmlidXRlcy5SZWFkT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5BdHRyaWJ1dGVzIF49IEZpbGVBdHRyaWJ1dGVzLlJlYWRPbmx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuRXh0cmFjdCh1bnBhY2tlZFJlc291cmNlRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT2ZJY29uRmlsZSA9IFBhdGguQ29tYmluZSh1bnBhY2tlZFJlc291cmNlRGlyLCAiemlwcGVkRmlsZS5pY28iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5Db21waWxlck9wdGlvbnMgKz0gU3RyaW5nLkZvcm1hdCgiL3dpbjMyaWNvbjpcInswfVwiIiwgbmFtZU9mSWNvbkZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLkNvbXBpbGVyT3B0aW9ucyArPSBTdHJpbmcuRm9ybWF0KCIvd2luMzJpY29uOlwiezB9XCIiLCBvcHRpb25zLkljb25GaWxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3AuT3V0cHV0QXNzZW1ibHkgPSBzdHViRXhlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5GbGF2b3IgPT0gU2VsZkV4dHJhY3RvckZsYXZvci5XaW5Gb3Jtc0FwcGxpY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLkNvbXBpbGVyT3B0aW9ucyArPSAiIC90YXJnZXQ6d2luZXhlIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShvcHRpb25zLkFkZGl0aW9uYWxDb21waWxlclN3aXRjaGVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5Db21waWxlck9wdGlvbnMgKz0gIiAiICsgb3B0aW9ucy5BZGRpdGlvbmFsQ29tcGlsZXJTd2l0Y2hlczsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGNwLkNvbXBpbGVyT3B0aW9ucykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AuQ29tcGlsZXJPcHRpb25zID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZXR0aW5ncy5Db3B5VGhyb3VnaFJlc291cmNlcyAhPSBudWxsKSAmJiAoc2V0dGluZ3MuQ29weVRocm91Z2hSZXNvdXJjZXMuQ291bnQgIT0gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKHVucGFja2VkUmVzb3VyY2VEaXIpKSBTeXN0ZW0uSU8uRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeSh1bnBhY2tlZFJlc291cmNlRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcmUgaW4gc2V0dGluZ3MuQ29weVRocm91Z2hSZXNvdXJjZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmlsZW5hbWUgPSBQYXRoLkNvbWJpbmUodW5wYWNrZWRSZXNvdXJjZURpciwgcmUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RSZXNvdXJjZVRvRmlsZShhMiwgcmUsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBmaWxlIGludG8gdGhlIHRhcmdldCBhc3NlbWJseSBhcyBhbiBlbWJlZGRlZCByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5FbWJlZGRlZFJlc291cmNlcy5BZGQoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBJb25pYy5VdGlscy5aaXAgRExMIGFzIGFuIGVtYmVkZGVkIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcC5FbWJlZGRlZFJlc291cmNlcy5BZGQoYTEuTG9jYXRpb24pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIvLyAiICsgUGF0aC5HZXRGaWxlTmFtZShzb3VyY2VGaWxlKSArICJcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZCgiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoIi8vIFRoaXMgU0ZYIHNvdXJjZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgRG90TmV0WmlwICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChaaXBGaWxlLkxpYnJhcnlWZXJzaW9uLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZCgiXG4vLyAgICAgICAgIGF0ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChTeXN0ZW0uRGF0ZVRpbWUuTm93LlRvU3RyaW5nKCJ5eXl5IE1NTU0gZGQgIEhIOm1tOnNzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZCgiXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZW1ibHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShvcHRpb25zLkRlc2NyaXB0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIlthc3NlbWJseTogU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHlUaXRsZShcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcHRpb25zLkRlc2NyaXB0aW9uLlJlcGxhY2UoIlwiIiwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKV1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiW2Fzc2VtYmx5OiBTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseVRpdGxlKFwiRG90TmV0WmlwIFNGWCBBcmNoaXZlXCIpXVxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkob3B0aW9ucy5Qcm9kdWN0VmVyc2lvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJbYXNzZW1ibHk6IFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5SW5mb3JtYXRpb25hbFZlcnNpb24oXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0aW9ucy5Qcm9kdWN0VmVyc2lvbi5SZXBsYWNlKCJcIiIsICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIildXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb3B5cmlnaHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcuSXNOdWxsT3JFbXB0eShvcHRpb25zLkNvcHlyaWdodCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiRXh0cmFjdG9yOiBDb3B5cmlnaHQg77+9IERpbm8gQ2hpZXNhIDIwMDgtMjAxMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMuQ29weXJpZ2h0LlJlcGxhY2UoIlwiIiwgIiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KG9wdGlvbnMuUHJvZHVjdE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiW2Fzc2VtYmx5OiBTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseVByb2R1Y3QoXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKG9wdGlvbnMuUHJvZHVjdE5hbWUuUmVwbGFjZSgiXCIiLCAiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoIlwiKV1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiW2Fzc2VtYmx5OiBTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseVByb2R1Y3QoXCJEb3ROZXRaaXBcIildXG4iKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIlthc3NlbWJseTogU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHlDb3B5cmlnaHQoXCIiICsgY29weXJpZ2h0ICsgIlwiKV1cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFwcGVuZChTdHJpbmcuRm9ybWF0KCJbYXNzZW1ibHk6IFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5VmVyc2lvbihcInswfVwiKV1cbiIsIFppcEZpbGUuTGlicmFyeVZlcnNpb24uVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuRmlsZVZlcnNpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoU3RyaW5nLkZvcm1hdCgiW2Fzc2VtYmx5OiBTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseUZpbGVWZXJzaW9uKFwiezB9XCIpXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLkZpbGVWZXJzaW9uLlRvU3RyaW5nKCkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJcblxuXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGV4dHJhY3QgbG9jYXRpb24gaWYgaXQgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXh0cmFjdExvYyA9IG9wdGlvbnMuRGVmYXVsdEV4dHJhY3REaXJlY3Rvcnk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdExvYyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBkb3VibGUtcXVvdGVzIGFuZCByZXBsYWNlIHNsYXNoIHdpdGggZG91YmxlLXNsYXNoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMsIGJlY2F1c2UgdGhlIHZhbHVlIGlzIGdvaW5nIHRvIGJlIGVtYmVkZGVkIGludG8gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNzIGZpbGUgYXMgYSBxdW90ZWQgc3RyaW5nLCBhbmQgaXQgbmVlZHMgdG8gYmUgZXNjYXBlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TG9jID0gZXh0cmFjdExvYy5SZXBsYWNlKCJcIiIsICIiKS5SZXBsYWNlKCJcXCIsICJcXFxcIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwb3N0RXhDbWRMaW5lID0gb3B0aW9ucy5Qb3N0RXh0cmFjdENvbW1hbmRMaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc3RFeENtZExpbmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0RXhDbWRMaW5lID0gcG9zdEV4Q21kTGluZS5SZXBsYWNlKCJcXCIsICJcXFxcIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEV4Q21kTGluZSA9IHBvc3RFeENtZExpbmUuUmVwbGFjZSgiXCIiLCAiXFxcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyByYyBpbiBzZXR0aW5ncy5SZXNvdXJjZXNUb0NvbXBpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBzID0gemlwW3JjXS5PcGVuUmVhZGVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJtaXNzaW5nIHJlc291cmNlICd7MH0nIiwgcmMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbVJlYWRlciBzciA9IG5ldyBTdHJlYW1SZWFkZXIocykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzci5QZWVrKCkgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGluZSA9IHNyLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RMb2MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuUmVwbGFjZSgiQEBFWFRSQUNUTE9DQVRJT04iLCBleHRyYWN0TG9jKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLlJlcGxhY2UoIkBAUkVNT1ZFX0FGVEVSX0VYRUNVVEUiLCBvcHRpb25zLlJlbW92ZVVucGFja2VkRmlsZXNBZnRlckV4ZWN1dGUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuUmVwbGFjZSgiQEBRVUlFVCIsIG9wdGlvbnMuUXVpZXQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTdHJpbmcuSXNOdWxsT3JFbXB0eShvcHRpb25zLlNmeEV4ZVdpbmRvd1RpdGxlKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5SZXBsYWNlKCJAQFNGWF9FWEVfV0lORE9XX1RJVExFIiwgb3B0aW9ucy5TZnhFeGVXaW5kb3dUaXRsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5SZXBsYWNlKCJAQEVYVFJBQ1RfRVhJU1RJTkdfRklMRSIsICgoaW50KW9wdGlvbnMuRXh0cmFjdEV4aXN0aW5nRmlsZSkuVG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zdEV4Q21kTGluZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5SZXBsYWNlKCJAQFBPU1RfVU5QQUNLX0NNRF9MSU5FIiwgcG9zdEV4Q21kTGluZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQobGluZSkuQXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiXG5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBMaXRlcmFsU291cmNlID0gc2IuVG9TdHJpbmcoKTsKKworI2lmIERFQlVHU0ZYCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcgb25seQorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc291cmNlTW9kdWxlID0gR2VuZXJhdGVUZW1wUGF0aG5hbWUodG1wRGlyLCAiY3MiKTsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbVdyaXRlciBzdyA9IEZpbGUuQ3JlYXRlVGV4dChzb3VyY2VNb2R1bGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZShMaXRlcmFsU291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgic291cmNlOiB7MH0iLCBzb3VyY2VNb2R1bGUpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNyID0gY3NoYXJwLkNvbXBpbGVBc3NlbWJseUZyb21Tb3VyY2UoY3AsIExpdGVyYWxTb3VyY2UpOworCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Z4R2VuZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGNvbXBpbGUgdGhlIGV4dHJhY3Rpb24gbG9naWMhIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgb3V0cHV0IGluIGNyLk91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUob3V0cHV0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3IuRXJyb3JzLkNvdW50ICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChUZXh0V3JpdGVyIHR3ID0gbmV3IFN0cmVhbVdyaXRlcihzb3VyY2VGaWxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCwgdGhlIHNvdXJjZSB3ZSBjb21waWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3LldyaXRlKExpdGVyYWxTb3VyY2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93LCBhcHBlbmQgdGhlIGNvbXBpbGUgZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHcuV3JpdGUoIlxuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHcuV3JpdGUoIi8vIEVycm9ycyBkdXJpbmcgY29tcGlsYXRpb246IFxuLy9cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwID0gUGF0aC5HZXRGaWxlTmFtZShzb3VyY2VGaWxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFN5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkNvbXBpbGVyRXJyb3IgZXJyb3IgaW4gY3IuRXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHcuV3JpdGUoU3RyaW5nLkZvcm1hdCgiLy8gICB7MH0oezF9LHsyfSk6IHszfSB7NH06IHs1fVxuLy9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5MaW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLkNvbHVtbiwgICAgICAgICAgICAgICAgICAgICAgICAvLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuSXNXYXJuaW5nID8gIldhcm5pbmciIDogImVycm9yIiwgICAvLyAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuRXJyb3JOdW1iZXIsICAgICAgICAgICAgICAgICAgIC8vIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5FcnJvclRleHQpKTsgICAgICAgICAgICAgICAgICAvLyA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNmeEdlbmVyYXRpb25FeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiRXJyb3JzIGNvbXBpbGluZyB0aGUgZXh0cmFjdGlvbiBsb2dpYyEgIHswfSIsIHNvdXJjZUZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIE9uU2F2ZUV2ZW50KFppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlckNvbXBpbGVTZWxmRXh0cmFjdG9yKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3csIGNvcHkgdGhlIHJlc3VsdGluZyBFWEUgaW1hZ2UgdG8gdGhlIF93cml0ZXN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGlzIHN0dWIgZXhlIGlzIGJlaW5nIHNhdmVkIGZpcnN0LCB0aGUgZWZmZWN0IHdpbGwgYmUgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGUgdGhlIGV4ZSBhbmQgdGhlIHppcCBkYXRhIHRvZ2V0aGVyLgorICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKHN0dWJFeGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDAwMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0uV3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE9uU2F2ZUV2ZW50KFppcFByb2dyZXNzRXZlbnRUeXBlLlNhdmluZ19BZnRlclNhdmVUZW1wQXJjaGl2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyh1bnBhY2tlZFJlc291cmNlRGlyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgRGlyZWN0b3J5LkRlbGV0ZSh1bnBhY2tlZFJlc291cmNlRGlyLCB0cnVlKTsgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiBleGMxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyLldyaXRlTGluZSgiV2FybmluZzogRXhjZXB0aW9uOiB7MH0iLCBleGMxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoc3R1YkV4ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IEZpbGUuRGVsZXRlKHN0dWJFeGUpOyB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLklPLklPRXhjZXB0aW9uIGV4YzEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJXYXJuaW5nOiBFeGNlcHRpb246IHswfSIsIGV4YzEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uSU8uSU9FeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgfQorCisKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdlbmVyYXRlVGVtcFBhdGhuYW1lKHN0cmluZyBkaXIsIHN0cmluZyBleHRlbnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBjYW5kaWRhdGUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIEFwcE5hbWUgPSBTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpLkdldE5hbWUoKS5OYW1lOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMzQ3NQorICAgICAgICAgICAgICAgIHN0cmluZyB1dWlkID0gU3lzdGVtLkd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgTmFtZSA9IFN0cmluZy5Gb3JtYXQoInswfS17MX0tezJ9LnszfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBBcHBOYW1lLCBTeXN0ZW0uRGF0ZVRpbWUuTm93LlRvU3RyaW5nKCJ5eXl5TU1NZGQtSEhtbXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQsIGV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gU3lzdGVtLklPLlBhdGguQ29tYmluZShkaXIsIE5hbWUpOworICAgICAgICAgICAgfSB3aGlsZSAoU3lzdGVtLklPLkZpbGUuRXhpc3RzKGNhbmRpZGF0ZSkgfHwgU3lzdGVtLklPLkRpcmVjdG9yeS5FeGlzdHMoY2FuZGlkYXRlKSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBjYW5kaWRhdGUgcGF0aCBkb2VzIG5vdCBleGlzdCBhcyBhIGZpbGUgb3IgZGlyZWN0b3J5LgorICAgICAgICAgICAgLy8gSXQgY2FuIG5vdyBiZSBjcmVhdGVkLCBhcyBhIGZpbGUgb3IgZGlyZWN0b3J5LgorICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsKKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLlNlbGVjdG9yLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5TZWxlY3Rvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDIzZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5TZWxlY3Rvci5jcwpAQCAtMCwwICsxLDE0NjYgQEAKKy8vIFppcEZpbGUuU2VsZWN0b3IuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1BdWd1c3QtMDYgMDk6MzU6NTg+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBtZXRob2RzIGluIHRoZSBaaXBGaWxlIGNsYXNzIGFzc29jaWF0ZWQgdG8gdGhlIEZpbGVGaWx0ZXIKKy8vIGNhcGFiaWxpdHkgLSBzZWxlY3RpbmcgZmlsZXMgdG8gYWRkIGludG8gdGhlIGFyY2hpdmUsIG9yIHNlbGVjdGluZyBlbnRyaWVzIHRvCisvLyByZXRyaWV2ZSBmcm9tIHRoZSBhcmNoaXZlIGJhc2VkIG9uIGNyaXRlcmlhIGluY2x1ZGluZyB0aGUgZmlsZW5hbWUsIHNpemUsIGRhdGUsIG9yCisvLyBhdHRyaWJ1dGVzLiAgSXQgaXMgc29tZXRoaW5nIGxpa2UgYSAicG9vciBtYW4ncyBMSU5RIi4gIEkgaW5jbHVkZWQgaXQgaW50byBEb3ROZXRaaXAKKy8vIGJlY2F1c2Ugbm90IGV2ZXJ5b25lIGhhcyAuTkVUIDMuNSB5ZXQuICBXaGVuIHVzaW5nIERvdE5ldFppcCBvbiAuTkVUIDMuNSwgdGhlIExJTlEKKy8vIHF1ZXJ5L3NlbGVjdGlvbiB3aWxsIGJlIHN1cGVyaW9yLgorLy8KKy8vIFRoZXNlIG1ldGhvZHMgYXJlIHNlZ3JlZ2F0ZWQgaW50byBhIGRpZmZlcmVudCBtb2R1bGUgdG8gZmFjaWxpdGF0ZSBlYXN5IGV4Y2x1c2lvbiBmb3IKKy8vIHRob3NlIHBlb3BsZSB3aG8gd2lzaCB0byBoYXZlIGEgc21hbGxlciBsaWJyYXJ5IHdpdGhvdXQgdGhpcyBmdW5jdGlvbi4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisKKyAgICBwYXJ0aWFsIGNsYXNzIFppcEZpbGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyB0byB0aGUgWmlwRmlsZSBhIHNldCBvZiBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9uCisgICAgICAgIC8vLyAgIGRpc2ssIHRoYXQgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIHNlbGVjdHMgZmlsZXMgZnJvbSB0aGUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgbWF0Y2hpbmcKKyAgICAgICAgLy8vICAgdGhlIHNwZWNpZmllZCBjcml0ZXJpYSwgYW5kIGFkZHMgdGhlbSB0byB0aGUgWmlwRmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU3BlY2lmeSB0aGUgY3JpdGVyaWEgaW4gc3RhdGVtZW50cyBvZiAzIGVsZW1lbnRzOiBhIG5vdW4sIGFuIG9wZXJhdG9yLCBhbmQKKyAgICAgICAgLy8vICAgYSB2YWx1ZS4gIENvbnNpZGVyIHRoZSBzdHJpbmcgIm5hbWUgIT0gKi5kb2MiIC4gIFRoZSBub3VuIGlzICJuYW1lIi4gIFRoZQorICAgICAgICAvLy8gICBvcGVyYXRvciBpcyAiIT0iLCBpbXBseWluZyAiTm90IEVxdWFsIi4gIFRoZSB2YWx1ZSBpcyAiKi5kb2MiLiAgVGhhdAorICAgICAgICAvLy8gICBjcml0ZXJpb24sIGluIEVuZ2xpc2gsIHNheXMgImFsbCBmaWxlcyB3aXRoIGEgbmFtZSB0aGF0IGRvZXMgbm90IGVuZCBpbgorICAgICAgICAvLy8gICB0aGUgLmRvYyBleHRlbnNpb24uIgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTdXBwb3J0ZWQgbm91bnMgaW5jbHVkZSAibmFtZSIgKG9yICJmaWxlbmFtZSIpIGZvciB0aGUgZmlsZW5hbWU7ICJhdGltZSIsCisgICAgICAgIC8vLyAgICJtdGltZSIsIGFuZCAiY3RpbWUiIGZvciBsYXN0IGFjY2VzcyB0aW1lLCBsYXN0IG1vZGZpZWQgdGltZSwgYW5kIGNyZWF0ZWQKKyAgICAgICAgLy8vICAgdGltZSBvZiB0aGUgZmlsZSwgcmVzcGVjdGl2ZWx5OyAiYXR0cmlidXRlcyIgKG9yICJhdHRycyIpIGZvciB0aGUgZmlsZQorICAgICAgICAvLy8gICBhdHRyaWJ1dGVzOyAic2l6ZSIgKG9yICJsZW5ndGgiKSBmb3IgdGhlIGZpbGUgbGVuZ3RoICh1bmNvbXByZXNzZWQpLCBhbmQKKyAgICAgICAgLy8vICAgInR5cGUiIGZvciB0aGUgdHlwZSBvZiBvYmplY3QsIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuICBUaGUKKyAgICAgICAgLy8vICAgImF0dHJpYnV0ZXMiLCAibmFtZSIgYW5kICJ0eXBlIiBub3VucyBib3RoIHN1cHBvcnQgPSBhbmQgIT0gYXMgb3BlcmF0b3JzLgorICAgICAgICAvLy8gICBUaGUgInNpemUiLCAiYXRpbWUiLCAibXRpbWUiLCBhbmQgImN0aW1lIiBub3VucyBzdXBwb3J0ID0gYW5kICE9LCBhbmQKKyAgICAgICAgLy8vICAgJmd0OywgJmd0Oz0sICZsdDssICZsdDs9IGFzIHdlbGwuIFRoZSB0aW1lcyBhcmUgdGFrZW4gdG8gYmUgZXhwcmVzc2VkIGluCisgICAgICAgIC8vLyAgIGxvY2FsIHRpbWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBTcGVjaWZ5IHZhbHVlcyBmb3IgdGhlIGZpbGUgYXR0cmlidXRlcyBhcyBhIHN0cmluZyB3aXRoIG9uZSBvciBtb3JlIG9mIHRoZQorICAgICAgICAvLy8gY2hhcmFjdGVycyBILFIsUyxBLEksTCBpbiBhbnkgb3JkZXIsIGltcGx5aW5nIGZpbGUgYXR0cmlidXRlcyBvZiBIaWRkZW4sCisgICAgICAgIC8vLyBSZWFkT25seSwgU3lzdGVtLCBBcmNoaXZlLCBOb3RDb250ZXh0SW5kZXhlZCwgYW5kIFJlcGFyc2VQb2ludCAoc3ltYm9saWMKKyAgICAgICAgLy8vIGxpbmspIHJlc3BlY3RpdmVseS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRvIHNwZWNpZnkgYSB0aW1lLCB1c2UgWVlZWS1NTS1ERC1ISDptbTpzcyBvciBZWVlZL01NL0RELUhIOm1tOnNzIGFzIHRoZQorICAgICAgICAvLy8gZm9ybWF0LiAgSWYgeW91IG9taXQgdGhlIEhIOm1tOnNzIHBvcnRpb24sIGl0IGlzIGFzc3VtZWQgdG8gYmUgMDA6MDA6MDAKKyAgICAgICAgLy8vIChtaWRuaWdodCkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGUgdmFsdWUgZm9yIGEgc2l6ZSBjcml0ZXJpb24gaXMgZXhwcmVzc2VkIGluIGludGVnZXIgcXVhbnRpdGllcyBvZiBieXRlcywKKyAgICAgICAgLy8vIGtpbG9ieXRlcyAodXNlIGsgb3Iga2IgYWZ0ZXIgdGhlIG51bWJlciksIG1lZ2FieXRlcyAobSBvciBtYiksIG9yIGdpZ2FieXRlcworICAgICAgICAvLy8gKGcgb3IgZ2IpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhlIHZhbHVlIGZvciBhIG5hbWUgaXMgYSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QgdGhlIGZpbGVuYW1lLCBwb3RlbnRpYWxseQorICAgICAgICAvLy8gaW5jbHVkaW5nIHdpbGRjYXJkcy4gIFRoZSBwYXR0ZXJuIGZvbGxvd3MgQ01ELmV4ZSBnbG9iIHJ1bGVzOiAqIGltcGxpZXMgb25lCisgICAgICAgIC8vLyBvciBtb3JlIG9mIGFueSBjaGFyYWN0ZXIsIHdoaWxlID8gIGltcGxpZXMgb25lIGNoYXJhY3Rlci4gIElmIHRoZSBuYW1lCisgICAgICAgIC8vLyBwYXR0ZXJuIGNvbnRhaW5zIGFueSBzbGFzaGVzLCBpdCBpcyBtYXRjaGVkIHRvIHRoZSBlbnRpcmUgZmlsZW5hbWUsCisgICAgICAgIC8vLyBpbmNsdWRpbmcgdGhlIHBhdGg7IG90aGVyd2lzZSwgaXQgaXMgbWF0Y2hlZCBhZ2FpbnN0IG9ubHkgdGhlIGZpbGVuYW1lCisgICAgICAgIC8vLyB3aXRob3V0IHRoZSBwYXRoLiAgVGhpcyBtZWFucyBhIHBhdHRlcm4gb2YgIipcKi4qIiBtYXRjaGVzIGFsbCBmaWxlcyBvbmUKKyAgICAgICAgLy8vIGRpcmVjdG9yeSBsZXZlbCBkZWVwLCB3aGlsZSBhIHBhdHRlcm4gb2YgIiouKiIgbWF0Y2hlcyBhbGwgZmlsZXMgaW4gYWxsCisgICAgICAgIC8vLyBkaXJlY3Rvcmllcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRvIHNwZWNpZnkgYSBuYW1lIHBhdHRlcm4gdGhhdCBpbmNsdWRlcyBzcGFjZXMsIHVzZSBzaW5nbGUgcXVvdGVzIGFyb3VuZCB0aGUKKyAgICAgICAgLy8vIHBhdHRlcm4uICBBIHBhdHRlcm4gb2YgIicqICouKiciIHdpbGwgbWF0Y2ggYWxsIGZpbGVzIHRoYXQgaGF2ZSBzcGFjZXMgaW4KKyAgICAgICAgLy8vIHRoZSBmaWxlbmFtZS4gIFRoZSBmdWxsIGNyaXRlcmlhIHN0cmluZyBmb3IgdGhhdCB3b3VsZCBiZSAibmFtZSA9ICcqICouKiciIC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoZSB2YWx1ZSBmb3IgYSB0eXBlIGNyaXRlcmlvbiBpcyBlaXRoZXIgRiAoaW1wbHlpbmcgYSBmaWxlKSBvciBEIChpbXBseWluZworICAgICAgICAvLy8gYSBkaXJlY3RvcnkpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gU29tZSBleGFtcGxlczoKKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8bGlzdCB0eXBlPSJ0YWJsZSI+CisgICAgICAgIC8vLyAgIDxsaXN0aGVhZGVyPgorICAgICAgICAvLy8gICAgIDx0ZXJtPmNyaXRlcmlhPC90ZXJtPgorICAgICAgICAvLy8gICAgIDxkZXNjcmlwdGlvbj5GaWxlcyByZXRyaWV2ZWQ8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2xpc3RoZWFkZXI+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT5uYW1lICE9ICoueGxzIDwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+YW55IGZpbGUgd2l0aCBhbiBleHRlbnNpb24gdGhhdCBpcyBub3QgLnhscworICAgICAgICAvLy8gICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxpdGVtPgorICAgICAgICAvLy8gICAgIDx0ZXJtPm5hbWUgPSAqLm1wMyA8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPmFueSBmaWxlIHdpdGggYSAubXAzIGV4dGVuc2lvbi4KKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT4qLm1wMzwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+KHNhbWUgYXMgYWJvdmUpIGFueSBmaWxlIHdpdGggYSAubXAzIGV4dGVuc2lvbi4KKyAgICAgICAgLy8vICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8dGVybT5hdHRyaWJ1dGVzID0gQSA8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPmFsbCBmaWxlcyB3aG9zZSBhdHRyaWJ1dGVzIGluY2x1ZGUgdGhlIEFyY2hpdmUgYml0LgorICAgICAgICAvLy8gICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxpdGVtPgorICAgICAgICAvLy8gICAgIDx0ZXJtPmF0dHJpYnV0ZXMgIT0gSCA8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPmFsbCBmaWxlcyB3aG9zZSBhdHRyaWJ1dGVzIGRvIG5vdCBpbmNsdWRlIHRoZSBIaWRkZW4gYml0LgorICAgICAgICAvLy8gICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIC8vLyAgIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxpdGVtPgorICAgICAgICAvLy8gICAgIDx0ZXJtPm10aW1lID4gMjAwOS0wMS0wMTwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+YWxsIGZpbGVzIHdpdGggYSBsYXN0IG1vZGlmaWVkIHRpbWUgYWZ0ZXIgSmFudWFyeSAxc3QsIDIwMDkuCisgICAgICAgIC8vLyAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPGl0ZW0+CisgICAgICAgIC8vLyAgICAgPHRlcm0+c2l6ZSA+IDJnYjwvdGVybT4KKyAgICAgICAgLy8vICAgICA8ZGVzY3JpcHRpb24+YWxsIGZpbGVzIHdob3NlIHVuY29tcHJlc3NlZCBzaXplIGlzIGdyZWF0ZXIgdGhhbiAyZ2IuCisgICAgICAgIC8vLyAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPGl0ZW0+CisgICAgICAgIC8vLyAgICAgPHRlcm0+dHlwZSA9IEQ8L3Rlcm0+CisgICAgICAgIC8vLyAgICAgPGRlc2NyaXB0aW9uPmFsbCBkaXJlY3RvcmllcyBpbiB0aGUgZmlsZXN5c3RlbS4gPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgLy8vICAgPC9pdGVtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvbGlzdD4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFlvdSBjYW4gY29tYmluZSBjcml0ZXJpYSB3aXRoIHRoZSBjb25qdW5jdGlvbnMgQU5EIG9yIE9SLiBVc2luZyBhIHN0cmluZworICAgICAgICAvLy8gbGlrZSAibmFtZSA9ICoudHh0IEFORCBzaXplICZndDs9IDEwMGsiIGZvciB0aGUgc2VsZWN0aW9uQ3JpdGVyaWEgcmV0cmlldmVzCisgICAgICAgIC8vLyBlbnRyaWVzIHdob3NlIG5hbWVzIGVuZCBpbiAudHh0LCBhbmQgd2hvc2UgdW5jb21wcmVzc2VkIHNpemUgaXMgZ3JlYXRlciB0aGFuCisgICAgICAgIC8vLyBvciBlcXVhbCB0byAxMDAga2lsb2J5dGVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gRm9yIG1vcmUgY29tcGxleCBjb21iaW5hdGlvbnMgb2YgY3JpdGVyaWEsIHlvdSBjYW4gdXNlIHBhcmVudGhlc2lzIHRvIGdyb3VwCisgICAgICAgIC8vLyBjbGF1c2VzIGluIHRoZSBib29sZWFuIGxvZ2ljLiAgV2l0aG91dCBwYXJlbnRoZXNpcywgdGhlIHByZWNlZGVuY2Ugb2YgdGhlCisgICAgICAgIC8vLyBjcml0ZXJpb24gYXRvbXMgaXMgZGV0ZXJtaW5lZCBieSBvcmRlciBvZiBhcHBlYXJhbmNlLiAgVW5saWtlIHRoZSBDIworICAgICAgICAvLy8gbGFuZ3VhZ2UsIHRoZSBBTkQgY29uanVuY3Rpb24gZG9lcyBub3QgdGFrZSBwcmVjZW5kZW5jZSBvdmVyIHRoZSBsb2dpY2FsIE9SLgorICAgICAgICAvLy8gVGhpcyBpcyBpbXBvcnRhbnQgb25seSBpbiBzdHJpbmdzIHRoYXQgY29udGFpbiAzIG9yIG1vcmUgY3JpdGVyaW9uIGF0b21zLgorICAgICAgICAvLy8gSW4gb3RoZXIgd29yZHMsICJuYW1lID0gKi50eHQgYW5kIHNpemUgJmd0OyAxMDAwIG9yIGF0dHJpYnV0ZXMgPSBIIiBpbXBsaWVzCisgICAgICAgIC8vLyAiKChuYW1lID0gKi50eHQgQU5EIHNpemUgJmd0OyAxMDAwKSBPUiBhdHRyaWJ1dGVzID0gSCkiIHdoaWxlICJhdHRyaWJ1dGVzID0KKyAgICAgICAgLy8vIEggT1IgbmFtZSA9ICoudHh0IGFuZCBzaXplICZndDsgMTAwMCIgZXZhbHVhdGVzIHRvICIoKGF0dHJpYnV0ZXMgPSBIIE9SIG5hbWUKKyAgICAgICAgLy8vID0gKi50eHQpIEFORCBzaXplICZndDsgMTAwMCkiLiAgV2hlbiBpbiBkb3VidCwgdXNlIHBhcmVudGhlc2lzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVXNpbmcgdGltZSBwcm9wZXJ0aWVzIHJlcXVpcmVzIHNvbWUgZXh0cmEgY2FyZS4gSWYgeW91IHdhbnQgdG8gcmV0cmlldmUgYWxsCisgICAgICAgIC8vLyBlbnRyaWVzIHRoYXQgd2VyZSBsYXN0IHVwZGF0ZWQgb24gMjAwOSBGZWJydWFyeSAxNCwgc3BlY2lmeSBhIHRpbWUgcmFuZ2UKKyAgICAgICAgLy8vIGxpa2Ugc286Im10aW1lICZndDs9IDIwMDktMDItMTQgQU5EIG10aW1lICZsdDsgMjAwOS0wMi0xNSIuICBSZWFkIHRoaXMgdG8KKyAgICAgICAgLy8vIHNheTogYWxsIGZpbGVzIHVwZGF0ZWQgYWZ0ZXIgMTI6MDBhbSBvbiBGZWJydWFyeSAxNHRoLCB1bnRpbCAxMjowMGFtIG9uCisgICAgICAgIC8vLyBGZWJydWFyeSAxNXRoLiAgWW91IGNhbiB1c2UgdGhlIHNhbWUgYnJhY2tldGluZyBhcHByb2FjaCB0byBzcGVjaWZ5IGFueSB0aW1lCisgICAgICAgIC8vLyBwZXJpb2QgLSBhIHllYXIsIGEgbW9udGgsIGEgd2VlaywgYW5kIHNvIG9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhlIHN5bnRheCBhbGxvd3Mgb25lIHNwZWNpYWwgY2FzZTogaWYgeW91IHByb3ZpZGUgYSBzdHJpbmcgd2l0aCBubyBzcGFjZXMsIGl0IGlzCisgICAgICAgIC8vLyB0cmVhdGVkIGFzIGEgcGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGZpbGVuYW1lLiAgVGhlcmVmb3JlIGEgc3RyaW5nIGxpa2UgIioueGxzIgorICAgICAgICAvLy8gd2lsbCBiZSBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgIm5hbWUgPSAqLnhscyIuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGVyZSBpcyBubyBsb2dpYyBpbiB0aGlzIG1ldGhvZCB0aGF0IGluc3VyZXMgdGhhdCB0aGUgZmlsZSBpbmNsdXNpb24KKyAgICAgICAgLy8vIGNyaXRlcmlhIGFyZSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQuICBGb3IgZXhhbXBsZSwgaXQncyBwb3NzaWJsZSB0byBzcGVjaWZ5CisgICAgICAgIC8vLyBjcml0ZXJpYSB0aGF0IHNheXMgdGhlIGZpbGUgbXVzdCBoYXZlIGEgc2l6ZSBvZiBsZXNzIHRoYW4gMTAwIGJ5dGVzLCBhcyB3ZWxsCisgICAgICAgIC8vLyBhcyBhIHNpemUgdGhhdCBpcyBncmVhdGVyIHRoYW4gMTAwMCBieXRlcy4gT2J2aW91c2x5IG5vIGZpbGUgd2lsbCBldmVyCisgICAgICAgIC8vLyBzYXRpc2Z5IHN1Y2ggY3JpdGVyaWEsIGJ1dCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXRlY3Qgc3VjaCBsb2dpY2FsCisgICAgICAgIC8vLyBpbmNvbnNpc3RlbmNpZXMuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluc3VyaW5nIHRoZSBjcml0ZXJpYSBhcmUKKyAgICAgICAgLy8vIHNlbnNpYmxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBVc2luZyB0aGlzIG1ldGhvZCwgdGhlIGZpbGUgc2VsZWN0aW9uIGRvZXMgbm90IHJlY3Vyc2UgaW50bworICAgICAgICAvLy8gICBzdWJkaXJlY3RvcmllcywgYW5kIHRoZSBmdWxsIHBhdGggb2YgdGhlIHNlbGVjdGVkIGZpbGVzIGlzIGluY2x1ZGVkIGluIHRoZQorICAgICAgICAvLy8gICBlbnRyaWVzIGFkZGVkIGludG8gdGhlIHppcCBhcmNoaXZlLiAgSWYgeW91IGRvbid0IGxpa2UgdGhlc2UgYmVoYXZpb3JzLAorICAgICAgICAvLy8gICBzZWUgdGhlIG90aGVyIG92ZXJsb2FkcyBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSB6aXBzIHVwIGFsbCAqLmNzdiBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICAvLyBUbyBqdXN0IG1hdGNoIG9uIGZpbGVuYW1lIHdpbGRjYXJkcywKKyAgICAgICAgLy8vICAgICAvLyB1c2UgdGhlIHNob3J0aGFuZCBmb3JtIG9mIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyAgICAgemlwLkFkZFNlbGVjdGVkRmlsZXMoIiouY3N2Iik7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoUGF0aFRvWmlwQXJjaGl2ZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IE5ldyBaaXBGaWxlKCkKKyAgICAgICAgLy8vICAgICB6aXAuQWRkU2VsZWN0ZWRGaWxlcygiKi5jc3YiKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKFBhdGhUb1ppcEFyY2hpdmUpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VsZWN0aW9uQ3JpdGVyaWEiPlRoZSBjcml0ZXJpYSBmb3IgZmlsZSBzZWxlY3Rpb248L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBBZGRTZWxlY3RlZEZpbGVzKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5BZGRTZWxlY3RlZEZpbGVzKHNlbGVjdGlvbkNyaXRlcmlhLCAiLiIsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyB0byB0aGUgWmlwRmlsZSBhIHNldCBvZiBmaWxlcyBmcm9tIHRoZSBkaXNrIHRoYXQgY29uZm9ybSB0byB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIGNyaXRlcmlhLCBvcHRpb25hbGx5IHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIHNlbGVjdHMgZmlsZXMgZnJvbSB0aGUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgbWF0Y2hpbmcKKyAgICAgICAgLy8vICAgdGhlIHNwZWNpZmllZCBjcml0ZXJpYSwgYW5kIGFkZHMgdGhlbSB0byB0aGUgWmlwRmlsZS4gIElmCisgICAgICAgIC8vLyAgIDxjPnJlY3Vyc2VEaXJlY3RvcmllczwvYz4gaXMgdHJ1ZSwgZmlsZXMgYXJlIGFsc28gc2VsZWN0ZWQgZnJvbQorICAgICAgICAvLy8gICBzdWJkaXJlY3RvcmllcywgYW5kIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIHRoZSBmaWxlc3lzdGVtIGlzCisgICAgICAgIC8vLyAgIHJlcHJvZHVjZWQgaW4gdGhlIHppcCBhcmNoaXZlLCByb290ZWQgYXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzZWxlY3RlZCBmaWxlcyBpcyBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgLy8vICAgZW50cmllcyBhZGRlZCBpbnRvIHRoZSB6aXAgYXJjaGl2ZS4gIElmIHlvdSBkb24ndCB3YW50IHRoaXMgYmVoYXZpb3IsIHVzZQorICAgICAgICAvLy8gICBvbmUgb2YgdGhlIG92ZXJsb2FkcyBvZiB0aGlzIG1ldGhvZCB0aGF0IGFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhCisgICAgICAgIC8vLyAgIDxjPmRpcmVjdG9yeUluQXJjaGl2ZTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciBkZXRhaWxzIG9uIHRoZSBzeW50YXggZm9yIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBwYXJhbWV0ZXIsIHNlZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgemlwcyB1cCBhbGwgKi54bWwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG9yIGFueQorICAgICAgICAvLy8gICBzdWJkaXJlY3RvcnksIHRoYXQgYXJlIGxhcmdlciB0aGFuIDFtYi4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgLy8gVXNlIGEgY29tcG91bmQgZXhwcmVzc2lvbiBpbiB0aGUgc2VsZWN0aW9uQ3JpdGVyaWEgc3RyaW5nLgorICAgICAgICAvLy8gICAgIHppcC5BZGRTZWxlY3RlZEZpbGVzKCJuYW1lID0gKi54bWwgIGFuZCAgc2l6ZSA+IDEwMjRrYiIsIHRydWUpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKFBhdGhUb1ppcEFyY2hpdmUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZSgpCisgICAgICAgIC8vLyAgICAgJyBVc2UgYSBjb21wb3VuZCBleHByZXNzaW9uIGluIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyAgICAgemlwLkFkZFNlbGVjdGVkRmlsZXMoIm5hbWUgPSAqLnhtbCAgYW5kICBzaXplID4gMTAyNGtiIiwgdHJ1ZSkKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZShQYXRoVG9aaXBBcmNoaXZlKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj5UaGUgY3JpdGVyaWEgZm9yIGZpbGUgc2VsZWN0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjdXJzZURpcmVjdG9yaWVzIj4KKyAgICAgICAgLy8vICAgSWYgdHJ1ZSwgdGhlIGZpbGUgc2VsZWN0aW9uIHdpbGwgcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yaWVzLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcgc2VsZWN0aW9uQ3JpdGVyaWEsIGJvb2wgcmVjdXJzZURpcmVjdG9yaWVzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLkFkZFNlbGVjdGVkRmlsZXMoc2VsZWN0aW9uQ3JpdGVyaWEsICIuIiwgbnVsbCwgcmVjdXJzZURpcmVjdG9yaWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyB0byB0aGUgWmlwRmlsZSBhIHNldCBvZiBmaWxlcyBmcm9tIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBpbiB0aGUKKyAgICAgICAgLy8vICAgZmlsZXN5c3RlbSwgdGhhdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2Qgc2VsZWN0cyBmaWxlcyB0aGF0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCBjcml0ZXJpYSwgZnJvbSB0aGUKKyAgICAgICAgLy8vICAgdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgb24gZGlzaywgYW5kIGFkZHMgdGhlbSB0byB0aGUgWmlwRmlsZS4gIFRoZSBzZWFyY2gKKyAgICAgICAgLy8vICAgZG9lcyBub3QgcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgZnVsbCBmaWxlc3lzdGVtIHBhdGggb2YgdGhlIGZpbGVzIG9uIGRpc2sgaXMKKyAgICAgICAgLy8vICAgcmVwcm9kdWNlZCBvbiB0aGUgZW50cmllcyBhZGRlZCB0byB0aGUgemlwIGZpbGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzCisgICAgICAgIC8vLyAgIGJlaGF2aW9yLCB1c2Ugb25lIG9mIHRoZSBvdGhlciBvdmVybG9hZHMgb2YgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciBkZXRhaWxzIG9uIHRoZSBzeW50YXggZm9yIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBwYXJhbWV0ZXIsIHNlZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgemlwcyB1cCBhbGwgKi54bWwgZmlsZXMgbGFyZ2VyIHRoYW4gMW1iIGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgLy8vICAgZ2l2ZW4gYnkgImQ6XHJhd2RhdGEiLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICAvLyBVc2UgYSBjb21wb3VuZCBleHByZXNzaW9uIGluIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyAgICAgemlwLkFkZFNlbGVjdGVkRmlsZXMoIm5hbWUgPSAqLnhtbCAgYW5kICBzaXplID4gMTAyNGtiIiwgImQ6XFxyYXdkYXRhIik7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoUGF0aFRvWmlwQXJjaGl2ZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZSgpCisgICAgICAgIC8vLyAgICAgJyBVc2UgYSBjb21wb3VuZCBleHByZXNzaW9uIGluIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyAgICAgemlwLkFkZFNlbGVjdGVkRmlsZXMoIm5hbWUgPSAqLnhtbCAgYW5kICBzaXplID4gMTAyNGtiIiwgImQ6XHJhd2RhdGEpCisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoUGF0aFRvWmlwQXJjaGl2ZSkKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZWxlY3Rpb25Dcml0ZXJpYSI+VGhlIGNyaXRlcmlhIGZvciBmaWxlIHNlbGVjdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeU9uRGlzayI+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IG9uIHRoZSBkaXNrIGZyb20gd2hpY2ggdG8gc2VsZWN0IGZpbGVzLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcgc2VsZWN0aW9uQ3JpdGVyaWEsIFN0cmluZyBkaXJlY3RvcnlPbkRpc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuQWRkU2VsZWN0ZWRGaWxlcyhzZWxlY3Rpb25Dcml0ZXJpYSwgZGlyZWN0b3J5T25EaXNrLCBudWxsLCBmYWxzZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyB0byB0aGUgWmlwRmlsZSBhIHNldCBvZiBmaWxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9uIGRpc2ssCisgICAgICAgIC8vLyAgIHRoYXQgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCBzZWxlY3RzIGZpbGVzIGZyb20gdGhlIHRoZSBzcGVjaWZpZWQgZGlzayBkaXJlY3RvcnkgbWF0Y2hpbmcKKyAgICAgICAgLy8vICAgdGhlIHNwZWNpZmllZCBzZWxlY3Rpb24gY3JpdGVyaWEsIGFuZCBhZGRzIHRoZW0gdG8gdGhlIFppcEZpbGUuICBJZgorICAgICAgICAvLy8gICA8Yz5yZWN1cnNlRGlyZWN0b3JpZXM8L2M+IGlzIHRydWUsIGZpbGVzIGFyZSBhbHNvIHNlbGVjdGVkIGZyb20KKyAgICAgICAgLy8vICAgc3ViZGlyZWN0b3JpZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBmdWxsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW4gdGhlIGZpbGVzeXN0ZW0gaXMgcmVwcm9kdWNlZCBvbiB0aGUKKyAgICAgICAgLy8vICAgZW50cmllcyBhZGRlZCB0byB0aGUgemlwIGFyY2hpdmUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzIGJlaGF2aW9yLCB1c2UKKyAgICAgICAgLy8vICAgb25lIG9mIHRoZSBvdmVybG9hZHMgb2YgdGhpcyBtZXRob2QgdGhhdCBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgYQorICAgICAgICAvLy8gICA8Yz5kaXJlY3RvcnlJbkFyY2hpdmU8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgZGV0YWlscyBvbiB0aGUgc3ludGF4IGZvciB0aGUgc2VsZWN0aW9uQ3JpdGVyaWEgcGFyYW1ldGVyLCBzZWUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBZGRTZWxlY3RlZEZpbGVzKFN0cmluZykiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgemlwcyB1cCBhbGwgKi5jc3YgZmlsZXMgaW4gdGhlICJmaWxlcyIgZGlyZWN0b3J5LCBvciBhbnkKKyAgICAgICAgLy8vICAgc3ViZGlyZWN0b3J5LCB0aGF0IGhhdmUgYmVlbiBzYXZlZCBzaW5jZSAyMDA5IEZlYnJ1YXJ5IDE0dGguCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIC8vIFVzZSBhIGNvbXBvdW5kIGV4cHJlc3Npb24gaW4gdGhlIHNlbGVjdGlvbkNyaXRlcmlhIHN0cmluZy4KKyAgICAgICAgLy8vICAgICB6aXAuQWRkU2VsZWN0ZWRGaWxlcygibmFtZSA9ICouY3N2ICBhbmQgIG10aW1lID4gMjAwOS0wMi0xNCIsICJmaWxlcyIsIHRydWUpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKFBhdGhUb1ppcEFyY2hpdmUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZSgpCisgICAgICAgIC8vLyAgICAgJyBVc2UgYSBjb21wb3VuZCBleHByZXNzaW9uIGluIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyAgICAgemlwLkFkZFNlbGVjdGVkRmlsZXMoIm5hbWUgPSAqLmNzdiAgYW5kICBtdGltZSA+IDIwMDktMDItMTQiLCAiZmlsZXMiLCB0cnVlKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKFBhdGhUb1ppcEFyY2hpdmUpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHppcHMgdXAgYWxsIGZpbGVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5LCBhbmQgYWxsIGl0cyBjaGlsZCBkaXJlY3RvcmllcywgZXhjZXB0IHRob3NlIGluCisgICAgICAgIC8vLyAgIHRoZSA8Yz5leGNsdWRldGhpczwvYz4gc3ViZGlyZWN0b3J5LgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgWmlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZSh6aXBmaWxlKQorICAgICAgICAvLy8gICBaaXAuQWRkU2VsZWN0ZWRGZmlsZXMoIm5hbWUgIT0gJ2V4Y2x1ZGV0aGlzXCouKiciLCBkYXRhcGF0aCwgVHJ1ZSkKKyAgICAgICAgLy8vICAgWmlwLlNhdmUoKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj5UaGUgY3JpdGVyaWEgZm9yIGZpbGUgc2VsZWN0aW9uPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5T25EaXNrIj4KKyAgICAgICAgLy8vICAgVGhlIGZpbGVzeXN0ZW0gcGF0aCBmcm9tIHdoaWNoIHRvIHNlbGVjdCBmaWxlcy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlY3Vyc2VEaXJlY3RvcmllcyI+CisgICAgICAgIC8vLyAgIElmIHRydWUsIHRoZSBmaWxlIHNlbGVjdGlvbiB3aWxsIHJlY3Vyc2UgaW50byBzdWJkaXJlY3Rvcmllcy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhLCBTdHJpbmcgZGlyZWN0b3J5T25EaXNrLCBib29sIHJlY3Vyc2VEaXJlY3RvcmllcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5BZGRTZWxlY3RlZEZpbGVzKHNlbGVjdGlvbkNyaXRlcmlhLCBkaXJlY3RvcnlPbkRpc2ssIG51bGwsIHJlY3Vyc2VEaXJlY3Rvcmllcyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyB0byB0aGUgWmlwRmlsZSBhIHNlbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9uCisgICAgICAgIC8vLyAgIGRpc2ssIHRoYXQgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLCBhbmQgdXNpbmcgYSBzcGVjaWZpZWQgcm9vdAorICAgICAgICAvLy8gICBwYXRoIGZvciBlbnRyaWVzIGFkZGVkIHRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIG1ldGhvZCBzZWxlY3RzIGZpbGVzIGZyb20gdGhlIHNwZWNpZmllZCBkaXNrIGRpcmVjdG9yeSBtYXRjaGluZyB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIHNlbGVjdGlvbiBjcml0ZXJpYSwgYW5kIGFkZHMgdGhvc2UgZmlsZXMgdG8gdGhlIFppcEZpbGUsIHVzaW5nCisgICAgICAgIC8vLyAgIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHBhdGggaW4gdGhlIGFyY2hpdmUuICBUaGUgc2VhcmNoIGRvZXMgbm90IHJlY3Vyc2UKKyAgICAgICAgLy8vICAgaW50byBzdWJkaXJlY3Rvcmllcy4gIEZvciBkZXRhaWxzIG9uIHRoZSBzeW50YXggZm9yIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYQorICAgICAgICAvLy8gICBwYXJhbWV0ZXIsIHNlZSA8c2VlIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIgLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHppcHMgdXAgYWxsICoucHNkIGZpbGVzIGluIHRoZSAicGhvdG9zIiBkaXJlY3RvcnkgdGhhdCBoYXZlCisgICAgICAgIC8vLyAgIGJlZW4gc2F2ZWQgc2luY2UgMjAwOSBGZWJydWFyeSAxNHRoLCBhbmQgcHV0cyB0aGVtIGFsbCBpbiBhIHppcCBmaWxlLAorICAgICAgICAvLy8gICB1c2luZyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgImNvbnRlbnQiIGluIHRoZSB6aXAgYXJjaGl2ZSBpdHNlbGYuIFdoZW4gdGhlCisgICAgICAgIC8vLyAgIHppcCBhcmNoaXZlIGlzIHVuemlwcGVkLCB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIC5wc2QgZmlsZXMgd2lsbCBiZQorICAgICAgICAvLy8gICBuYW1lZCAiY29udGVudCIuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIC8vIFVzZSBhIGNvbXBvdW5kIGV4cHJlc3Npb24gaW4gdGhlIHNlbGVjdGlvbkNyaXRlcmlhIHN0cmluZy4KKyAgICAgICAgLy8vICAgICB6aXAuQWRkU2VsZWN0ZWRGaWxlcygibmFtZSA9ICoucHNkICBhbmQgIG10aW1lID4gMjAwOS0wMi0xNCIsICJwaG90b3MiLCAiY29udGVudCIpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKFBhdGhUb1ppcEFyY2hpdmUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgIHppcC5BZGRTZWxlY3RlZEZpbGVzKCJuYW1lID0gKi5wc2QgIGFuZCAgbXRpbWUgPiAyMDA5LTAyLTE0IiwgInBob3RvcyIsICJjb250ZW50IikKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZShQYXRoVG9aaXBBcmNoaXZlKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj4KKyAgICAgICAgLy8vICAgVGhlIGNyaXRlcmlhIGZvciBzZWxlY3Rpb24gb2YgZmlsZXMgdG8gYWRkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeU9uRGlzayI+CisgICAgICAgIC8vLyAgIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0gZnJvbSB3aGljaCB0byBzZWxlY3QgZmlsZXMuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHBhdGggdG8gdXNlIHRvIGluIHBsYWNlIG9mIHRoZQorICAgICAgICAvLy8gICA8Yz5kaXJlY3RvcnlPbkRpc2s8L2M+LiAgVGhpcyBwYXRoIG1heSwgb3IgbWF5IG5vdCwgY29ycmVzcG9uZCB0byBhIHJlYWwKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50IGZpbGVzeXN0ZW0uICBJZiB0aGUgZmlsZXMgd2l0aGluIHRoZSB6aXAgYXJlCisgICAgICAgIC8vLyAgIGxhdGVyIGV4dHJhY3RlZCwgdGhpcyBpcyB0aGUgcGF0aCB1c2VkIGZvciB0aGUgZXh0cmFjdGVkIGZpbGUuICBQYXNzaW5nCisgICAgICAgIC8vLyAgIG51bGwgKG5vdGhpbmcgaW4gVkIpIHdpbGwgdXNlIHRoZSBwYXRoIG9uIHRoZSBmaWxlIG5hbWUsIGlmIGFueTsgaW4gb3RoZXIKKyAgICAgICAgLy8vICAgd29yZHMgaXQgd291bGQgdXNlIDxjPmRpcmVjdG9yeU9uRGlzazwvYz4sIHBsdXMgYW55IHN1YmRpcmVjdG9yeS4gIFBhc3NpbmcKKyAgICAgICAgLy8vICAgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwgaW5zZXJ0IHRoZSBpdGVtIGF0IHRoZSByb290IHBhdGggd2l0aGluIHRoZQorICAgICAgICAvLy8gICBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcgc2VsZWN0aW9uQ3JpdGVyaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeU9uRGlzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5BZGRTZWxlY3RlZEZpbGVzKHNlbGVjdGlvbkNyaXRlcmlhLCBkaXJlY3RvcnlPbkRpc2ssIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQWRkcyB0byB0aGUgWmlwRmlsZSBhIHNlbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9uCisgICAgICAgIC8vLyAgIGRpc2ssIHRoYXQgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLCBvcHRpb25hbGx5IHJlY3Vyc2luZyB0aHJvdWdoCisgICAgICAgIC8vLyAgIHN1YmRpcmVjdG9yaWVzLCBhbmQgdXNpbmcgYSBzcGVjaWZpZWQgcm9vdCBwYXRoIGZvciBlbnRyaWVzIGFkZGVkIHRvIHRoZQorICAgICAgICAvLy8gICB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2Qgc2VsZWN0cyBmaWxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlzayBkaXJlY3RvcnkgdGhhdCBtYXRjaCB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIHNlbGVjdGlvbiBjcml0ZXJpYSwgYW5kIGFkZHMgdGhvc2UgZmlsZXMgdG8gdGhlIFppcEZpbGUsIHVzaW5nCisgICAgICAgIC8vLyAgIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHBhdGggaW4gdGhlIGFyY2hpdmUuIElmIDxjPnJlY3Vyc2VEaXJlY3RvcmllczwvYz4KKyAgICAgICAgLy8vICAgaXMgdHJ1ZSwgZmlsZXMgYXJlIGFsc28gc2VsZWN0ZWQgZnJvbSBzdWJkaXJlY3RvcmllcywgYW5kIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgLy8vICAgc3RydWN0dXJlIGluIHRoZSBmaWxlc3lzdGVtIGlzIHJlcHJvZHVjZWQgaW4gdGhlIHppcCBhcmNoaXZlLCByb290ZWQgYXQKKyAgICAgICAgLy8vICAgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgPGM+ZGlyZWN0b3J5T25EaXNrPC9jPi4gIEZvciBkZXRhaWxzIG9uIHRoZQorICAgICAgICAvLy8gICBzeW50YXggZm9yIHRoZSBzZWxlY3Rpb25Dcml0ZXJpYSBwYXJhbWV0ZXIsIHNlZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIgLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgemlwcyB1cCBhbGwgZmlsZXMgdGhhdCBhcmUgTk9UICoucHN0IGZpbGVzLCBpbiB0aGUgY3VycmVudAorICAgICAgICAvLy8gICB3b3JraW5nIGRpcmVjdG9yeSBhbmQgYW55IHN1YmRpcmVjdG9yaWVzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkU2VsZWN0ZWRGaWxlcygibmFtZSAhPSAqLnBzdCIsIFNvdXJjZURpcmVjdG9yeSwgImJhY2t1cCIsIHRydWUpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKFBhdGhUb1ppcEFyY2hpdmUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgIHppcC5BZGRTZWxlY3RlZEZpbGVzKCJuYW1lICE9ICoucHN0IiwgU291cmNlRGlyZWN0b3J5LCAiYmFja3VwIiwgdHJ1ZSkKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZShQYXRoVG9aaXBBcmNoaXZlKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj4KKyAgICAgICAgLy8vICAgVGhlIGNyaXRlcmlhIGZvciBzZWxlY3Rpb24gb2YgZmlsZXMgdG8gYWRkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeU9uRGlzayI+CisgICAgICAgIC8vLyAgIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0gZnJvbSB3aGljaCB0byBzZWxlY3QgZmlsZXMuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHBhdGggdG8gdXNlIHRvIGluIHBsYWNlIG9mIHRoZQorICAgICAgICAvLy8gICA8Yz5kaXJlY3RvcnlPbkRpc2s8L2M+LiAgVGhpcyBwYXRoIG1heSwgb3IgbWF5IG5vdCwgY29ycmVzcG9uZCB0byBhIHJlYWwKKyAgICAgICAgLy8vICAgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50IGZpbGVzeXN0ZW0uICBJZiB0aGUgZmlsZXMgd2l0aGluIHRoZSB6aXAgYXJlCisgICAgICAgIC8vLyAgIGxhdGVyIGV4dHJhY3RlZCwgdGhpcyBpcyB0aGUgcGF0aCB1c2VkIGZvciB0aGUgZXh0cmFjdGVkIGZpbGUuICBQYXNzaW5nCisgICAgICAgIC8vLyAgIG51bGwgKG5vdGhpbmcgaW4gVkIpIHdpbGwgdXNlIHRoZSBwYXRoIG9uIHRoZSBmaWxlIG5hbWUsIGlmIGFueTsgaW4gb3RoZXIKKyAgICAgICAgLy8vICAgd29yZHMgaXQgd291bGQgdXNlIDxjPmRpcmVjdG9yeU9uRGlzazwvYz4sIHBsdXMgYW55IHN1YmRpcmVjdG9yeS4gIFBhc3NpbmcKKyAgICAgICAgLy8vICAgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwgaW5zZXJ0IHRoZSBpdGVtIGF0IHRoZSByb290IHBhdGggd2l0aGluIHRoZQorICAgICAgICAvLy8gICBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjdXJzZURpcmVjdG9yaWVzIj4KKyAgICAgICAgLy8vICAgSWYgdHJ1ZSwgdGhlIG1ldGhvZCBhbHNvIHNjYW5zIHN1YmRpcmVjdG9yaWVzIGZvciBmaWxlcyBtYXRjaGluZyB0aGUKKyAgICAgICAgLy8vICAgY3JpdGVyaWEuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBBZGRTZWxlY3RlZEZpbGVzKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5T25EaXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVjdXJzZURpcmVjdG9yaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBfQWRkT3JVcGRhdGVTZWxlY3RlZEZpbGVzKHNlbGVjdGlvbkNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnlPbkRpc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VEaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBVcGRhdGVzIHRoZSBaaXBGaWxlIHdpdGggYSBzZWxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgZGlzayB0aGF0IGNvbmZvcm0KKyAgICAgICAgLy8vICAgdG8gdGhlIHNwZWNpZmllZCBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2Qgc2VsZWN0cyBmaWxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlzayBkaXJlY3RvcnkgdGhhdCBtYXRjaCB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIHNlbGVjdGlvbiBjcml0ZXJpYSwgYW5kIFVwZGF0ZXMgdGhlIDxjPlppcEZpbGU8L2M+IHdpdGggdGhvc2UKKyAgICAgICAgLy8vICAgZmlsZXMsIHVzaW5nIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHBhdGggaW4gdGhlIGFyY2hpdmUuIElmCisgICAgICAgIC8vLyAgIDxjPnJlY3Vyc2VEaXJlY3RvcmllczwvYz4gaXMgdHJ1ZSwgZmlsZXMgYXJlIGFsc28gc2VsZWN0ZWQgZnJvbQorICAgICAgICAvLy8gICBzdWJkaXJlY3RvcmllcywgYW5kIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIHRoZSBmaWxlc3lzdGVtIGlzCisgICAgICAgIC8vLyAgIHJlcHJvZHVjZWQgaW4gdGhlIHppcCBhcmNoaXZlLCByb290ZWQgYXQgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKKyAgICAgICAgLy8vICAgPGM+ZGlyZWN0b3J5T25EaXNrPC9jPi4gIEZvciBkZXRhaWxzIG9uIHRoZSBzeW50YXggZm9yIHRoZQorICAgICAgICAvLy8gICBzZWxlY3Rpb25Dcml0ZXJpYSBwYXJhbWV0ZXIsIHNlZSA8c2VlIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIgLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj4KKyAgICAgICAgLy8vICAgVGhlIGNyaXRlcmlhIGZvciBzZWxlY3Rpb24gb2YgZmlsZXMgdG8gYWRkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeU9uRGlzayI+CisgICAgICAgIC8vLyAgIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0gZnJvbSB3aGljaCB0byBzZWxlY3QgZmlsZXMuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vICAgU3BlY2lmaWVzIGEgZGlyZWN0b3J5IHBhdGggdG8gdXNlIHRvIGluIHBsYWNlIG9mIHRoZQorICAgICAgICAvLy8gICA8Yz5kaXJlY3RvcnlPbkRpc2s8L2M+LiBUaGlzIHBhdGggbWF5LCBvciBtYXkgbm90LCBjb3JyZXNwb25kIHRvIGEKKyAgICAgICAgLy8vICAgcmVhbCBkaXJlY3RvcnkgaW4gdGhlIGN1cnJlbnQgZmlsZXN5c3RlbS4gSWYgdGhlIGZpbGVzIHdpdGhpbiB0aGUgemlwCisgICAgICAgIC8vLyAgIGFyZSBsYXRlciBleHRyYWN0ZWQsIHRoaXMgaXMgdGhlIHBhdGggdXNlZCBmb3IgdGhlIGV4dHJhY3RlZCBmaWxlLgorICAgICAgICAvLy8gICBQYXNzaW5nIG51bGwgKG5vdGhpbmcgaW4gVkIpIHdpbGwgdXNlIHRoZSBwYXRoIG9uIHRoZSBmaWxlIG5hbWUsIGlmCisgICAgICAgIC8vLyAgIGFueTsgaW4gb3RoZXIgd29yZHMgaXQgd291bGQgdXNlIDxjPmRpcmVjdG9yeU9uRGlzazwvYz4sIHBsdXMgYW55CisgICAgICAgIC8vLyAgIHN1YmRpcmVjdG9yeS4gIFBhc3NpbmcgdGhlIGVtcHR5IHN0cmluZyAoIiIpIHdpbGwgaW5zZXJ0IHRoZSBpdGVtIGF0CisgICAgICAgIC8vLyAgIHRoZSByb290IHBhdGggd2l0aGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjdXJzZURpcmVjdG9yaWVzIj4KKyAgICAgICAgLy8vICAgSWYgdHJ1ZSwgdGhlIG1ldGhvZCBhbHNvIHNjYW5zIHN1YmRpcmVjdG9yaWVzIGZvciBmaWxlcyBtYXRjaGluZyB0aGUgY3JpdGVyaWEuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgYm9vbCkiIC8+CisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZVNlbGVjdGVkRmlsZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXJlY3RvcnlPbkRpc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWN1cnNlRGlyZWN0b3JpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9BZGRPclVwZGF0ZVNlbGVjdGVkRmlsZXMoc2VsZWN0aW9uQ3JpdGVyaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU9uRGlzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZURpcmVjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgRW5zdXJlZW5kSW5TbGFzaChzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMuRW5kc1dpdGgoIlxcIikpIHJldHVybiBzOworICAgICAgICAgICAgcmV0dXJuIHMgKyAiXFwiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9BZGRPclVwZGF0ZVNlbGVjdGVkRmlsZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5T25EaXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWN1cnNlRGlyZWN0b3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FudFVwZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU9uRGlzayA9PSBudWxsICYmIChEaXJlY3RvcnkuRXhpc3RzKHNlbGVjdGlvbkNyaXRlcmlhKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5T25EaXNrID0gc2VsZWN0aW9uQ3JpdGVyaWE7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ3JpdGVyaWEgPSAiKi4qIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGRpcmVjdG9yeU9uRGlzaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5T25EaXNrID0gIi4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3b3JraXRlbSA5MTc2CisgICAgICAgICAgICB3aGlsZSAoZGlyZWN0b3J5T25EaXNrLkVuZHNXaXRoKCJcXCIpKSBkaXJlY3RvcnlPbkRpc2sgPSBkaXJlY3RvcnlPbkRpc2suU3Vic3RyaW5nKDAsIGRpcmVjdG9yeU9uRGlzay5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgIGlmIChWZXJib3NlKSBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlci5Xcml0ZUxpbmUoImFkZGluZyBzZWxlY3Rpb24gJ3swfScgZnJvbSBkaXIgJ3sxfScuLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ3JpdGVyaWEsIGRpcmVjdG9yeU9uRGlzayk7CisgICAgICAgICAgICBJb25pYy5GaWxlU2VsZWN0b3IgZmYgPSBuZXcgSW9uaWMuRmlsZVNlbGVjdG9yKHNlbGVjdGlvbkNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGREaXJlY3RvcnlXaWxsVHJhdmVyc2VSZXBhcnNlUG9pbnRzKTsKKyAgICAgICAgICAgIHZhciBpdGVtc1RvQWRkID0gZmYuU2VsZWN0RmlsZXMoZGlyZWN0b3J5T25EaXNrLCByZWN1cnNlRGlyZWN0b3JpZXMpOworCisgICAgICAgICAgICBpZiAoVmVyYm9zZSkgU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIuV3JpdGVMaW5lKCJmb3VuZCB7MH0gZmlsZXMuLi4iLCBpdGVtc1RvQWRkLkNvdW50KTsKKworICAgICAgICAgICAgT25BZGRTdGFydGVkKCk7CisKKyAgICAgICAgICAgIEFkZE9yVXBkYXRlQWN0aW9uIGFjdGlvbiA9ICh3YW50VXBkYXRlKSA/IEFkZE9yVXBkYXRlQWN0aW9uLkFkZE9yVXBkYXRlIDogQWRkT3JVcGRhdGVBY3Rpb24uQWRkT25seTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGl0ZW1zVG9BZGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNTMKKyAgICAgICAgICAgICAgICBzdHJpbmcgZGlySW5BcmNoaXZlID0gKGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEyMjYwCisgICAgICAgICAgICAgICAgICAgIDogUmVwbGFjZUxlYWRpbmdEaXJlY3RvcnkoUGF0aC5HZXREaXJlY3RvcnlOYW1lKGl0ZW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU9uRGlzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKTsKKworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhpdGVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3YW50VXBkYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVGaWxlKGl0ZW0sIGRpckluQXJjaGl2ZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkRmlsZShpdGVtLCBkaXJJbkFyY2hpdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFkZHMgImp1c3QiIHRoZSBkaXJlY3RvcnksIHdpdGhvdXQgcmVjdXJzaW5nIHRvIHRoZSBjb250YWluZWQgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgQWRkT3JVcGRhdGVEaXJlY3RvcnlJbXBsKGl0ZW0sIGRpckluQXJjaGl2ZSwgYWN0aW9uLCBmYWxzZSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPbkFkZENvbXBsZXRlZCgpOworICAgICAgICB9CisKKworICAgICAgICAvLyB3b3JraXRlbSAxMjI2MAorICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgUmVwbGFjZUxlYWRpbmdEaXJlY3Rvcnkoc3RyaW5nIG9yaWdpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVwbGFjZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB1cHBlclN0cmluZyA9IG9yaWdpbmFsLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICBzdHJpbmcgdXBwZXJQYXR0ZXJuID0gcGF0dGVybi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgaW50IHAxID0gdXBwZXJTdHJpbmcuSW5kZXhPZih1cHBlclBhdHRlcm4pOworICAgICAgICAgICAgaWYgKHAxICE9IDApIHJldHVybiBvcmlnaW5hbDsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudCArIG9yaWdpbmFsLlN1YnN0cmluZyh1cHBlclBhdHRlcm4uTGVuZ3RoKTsKKyAgICAgICAgfQorCisjaWYgTk9UCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSZXBsYWNlRXgoc3RyaW5nIG9yaWdpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVwbGFjZW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCwgcG9zaXRpb24wLCBwb3NpdGlvbjE7CisgICAgICAgICAgICBjb3VudCA9IHBvc2l0aW9uMCA9IHBvc2l0aW9uMSA9IDA7CisgICAgICAgICAgICBzdHJpbmcgdXBwZXJTdHJpbmcgPSBvcmlnaW5hbC5Ub1VwcGVyKCk7CisgICAgICAgICAgICBzdHJpbmcgdXBwZXJQYXR0ZXJuID0gcGF0dGVybi5Ub1VwcGVyKCk7CisgICAgICAgICAgICBpbnQgaW5jID0gKG9yaWdpbmFsLkxlbmd0aC9wYXR0ZXJuLkxlbmd0aCkgKgorICAgICAgICAgICAgICAgIChyZXBsYWNlbWVudC5MZW5ndGgtcGF0dGVybi5MZW5ndGgpOworICAgICAgICAgICAgY2hhciBbXSBjaGFycyA9IG5ldyBjaGFyW29yaWdpbmFsLkxlbmd0aCArIE1hdGguTWF4KDAsIGluYyldOworICAgICAgICAgICAgd2hpbGUoIChwb3NpdGlvbjEgPSB1cHBlclN0cmluZy5JbmRleE9mKHVwcGVyUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjApKSAhPSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGk9cG9zaXRpb24wIDsgaSA8IHBvc2l0aW9uMSA7ICsraSApCisgICAgICAgICAgICAgICAgICAgIGNoYXJzW2NvdW50KytdID0gb3JpZ2luYWxbaV07CisgICAgICAgICAgICAgICAgZm9yICggaW50IGk9MCA7IGkgPCByZXBsYWNlbWVudC5MZW5ndGggOyArK2kgKQorICAgICAgICAgICAgICAgICAgICBjaGFyc1tjb3VudCsrXSA9IHJlcGxhY2VtZW50W2ldOworICAgICAgICAgICAgICAgIHBvc2l0aW9uMCA9IHBvc2l0aW9uMStwYXR0ZXJuLkxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggcG9zaXRpb24wID09IDAgKSByZXR1cm4gb3JpZ2luYWw7CisgICAgICAgICAgICBmb3IgKCBpbnQgaT1wb3NpdGlvbjAgOyBpIDwgb3JpZ2luYWwuTGVuZ3RoIDsgKytpICkKKyAgICAgICAgICAgICAgICBjaGFyc1tjb3VudCsrXSA9IG9yaWdpbmFsW2ldOworICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmcoY2hhcnMsIDAsIGNvdW50KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0cmlldmUgZW50cmllcyBmcm9tIHRoZSB6aXBmaWxlIGJ5IHNwZWNpZmllZCBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWxsb3dzIGNhbGxlcnMgdG8gcmV0cmlldmUgdGhlIGNvbGxlY3Rpb24gb2YgZW50cmllcyBmcm9tIHRoZSB6aXBmaWxlCisgICAgICAgIC8vLyB0aGF0IGZpdCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLiAgVGhlIGNyaXRlcmlhIGFyZSBkZXNjcmliZWQgaW4gYSBzdHJpbmcgZm9ybWF0LCBhbmQKKyAgICAgICAgLy8vIGNhbiBpbmNsdWRlIHBhdHRlcm5zIGZvciB0aGUgZmlsZW5hbWU7IGNvbnN0cmFpbnRzIG9uIHRoZSBzaXplIG9mIHRoZSBlbnRyeTsKKyAgICAgICAgLy8vIGNvbnN0cmFpbnRzIG9uIHRoZSBsYXN0IG1vZGlmaWVkLCBjcmVhdGVkLCBvciBsYXN0IGFjY2Vzc2VkIHRpbWUgZm9yIHRoZSBmaWxlCisgICAgICAgIC8vLyBkZXNjcmliZWQgYnkgdGhlIGVudHJ5OyBvciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZW50cnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBGb3IgZGV0YWlscyBvbiB0aGUgc3ludGF4IGZvciB0aGUgc2VsZWN0aW9uQ3JpdGVyaWEgcGFyYW1ldGVyLCBzZWUgPHNlZQorICAgICAgICAvLy8gY3JlZj0iQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcpIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGEgWmlwRmlsZSB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbSBzdG9yYWdlLgorICAgICAgICAvLy8gV2hlbiBjcmVhdGluZyBhIG5ldyBaaXBGaWxlLCB0aGlzIG1ldGhvZCB3aWxsIHdvcmsgb25seSBhZnRlciB0aGUgWmlwQXJjaGl2ZSBoYXMKKyAgICAgICAgLy8vIGJlZW4gU2F2ZWQgdG8gdGhlIGRpc2sgKHRoZSBaaXBGaWxlIGNsYXNzIHN1YnNlcXVlbnRseSBhbmQgaW1wbGljaXRseSByZWFkcyB0aGUgWmlwCisgICAgICAgIC8vLyBhcmNoaXZlIGZyb20gc3RvcmFnZS4pICBDYWxsaW5nIFNlbGVjdEVudHJpZXMgb24gYSBaaXBGaWxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbgorICAgICAgICAvLy8gc2F2ZWQgd2lsbCBkZWxpdmVyIHVuZGVmaW5lZCByZXN1bHRzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkV4Y2VwdGlvbiI+CisgICAgICAgIC8vLyBUaHJvd24gaWYgc2VsZWN0aW9uQ3JpdGVyaWEgaGFzIGFuIGludmFsaWQgc3ludGF4LgorICAgICAgICAvLy8gPC9leGNlcHRpb24+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2VsZWN0cyBhbGwgdGhlIFBob3RvU2hvcCBmaWxlcyBmcm9tIHdpdGhpbiBhbiBhcmNoaXZlLCBhbmQgZXh0cmFjdHMgdGhlbQorICAgICAgICAvLy8gdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcDEgPSBaaXBGaWxlLlJlYWQoWmlwRmlsZU5hbWUpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHZhciBQaG90b1Nob3BGaWxlcyA9IHppcDEuU2VsZWN0RW50cmllcygiKi5wc2QiKTsKKyAgICAgICAgLy8vICAgICBmb3JlYWNoIChaaXBFbnRyeSBwc2QgaW4gUGhvdG9TaG9wRmlsZXMpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICBwc2QuRXh0cmFjdCgpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcDEgQXMgWmlwRmlsZSA9IFppcEZpbGUuUmVhZChaaXBGaWxlTmFtZSkKKyAgICAgICAgLy8vICAgICBEaW0gUGhvdG9TaG9wRmlsZXMgYXMgSUNvbGxlY3Rpb24oT2YgWmlwRW50cnkpCisgICAgICAgIC8vLyAgICAgUGhvdG9TaG9wRmlsZXMgPSB6aXAxLlNlbGVjdEVudHJpZXMoIioucHNkIikKKyAgICAgICAgLy8vICAgICBEaW0gcHNkIEFzIFppcEVudHJ5CisgICAgICAgIC8vLyAgICAgRm9yIEVhY2ggcHNkIEluIFBob3RvU2hvcEZpbGVzCisgICAgICAgIC8vLyAgICAgICAgIHBzZC5FeHRyYWN0CisgICAgICAgIC8vLyAgICAgTmV4dAorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VsZWN0aW9uQ3JpdGVyaWEiPnRoZSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgd2hpY2ggZW50cmllcyB0byBzZWxlY3Q8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+YSBjb2xsZWN0aW9uIG9mIFppcEVudHJ5IG9iamVjdHMgdGhhdCBjb25mb3JtIHRvIHRoZSBpbmNsdXNpb24gc3BlYzwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPFppcEVudHJ5PiBTZWxlY3RFbnRyaWVzKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSkKKyAgICAgICAgeworICAgICAgICAgICAgSW9uaWMuRmlsZVNlbGVjdG9yIGZmID0gbmV3IElvbmljLkZpbGVTZWxlY3RvcihzZWxlY3Rpb25Dcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGlyZWN0b3J5V2lsbFRyYXZlcnNlUmVwYXJzZVBvaW50cyk7CisgICAgICAgICAgICByZXR1cm4gZmYuU2VsZWN0RW50cmllcyh0aGlzKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0cmlldmUgZW50cmllcyBmcm9tIHRoZSB6aXBmaWxlIGJ5IHNwZWNpZmllZCBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWxsb3dzIGNhbGxlcnMgdG8gcmV0cmlldmUgdGhlIGNvbGxlY3Rpb24gb2YgZW50cmllcyBmcm9tIHRoZSB6aXBmaWxlCisgICAgICAgIC8vLyB0aGF0IGZpdCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLiAgVGhlIGNyaXRlcmlhIGFyZSBkZXNjcmliZWQgaW4gYSBzdHJpbmcgZm9ybWF0LCBhbmQKKyAgICAgICAgLy8vIGNhbiBpbmNsdWRlIHBhdHRlcm5zIGZvciB0aGUgZmlsZW5hbWU7IGNvbnN0cmFpbnRzIG9uIHRoZSBzaXplIG9mIHRoZSBlbnRyeTsKKyAgICAgICAgLy8vIGNvbnN0cmFpbnRzIG9uIHRoZSBsYXN0IG1vZGlmaWVkLCBjcmVhdGVkLCBvciBsYXN0IGFjY2Vzc2VkIHRpbWUgZm9yIHRoZSBmaWxlCisgICAgICAgIC8vLyBkZXNjcmliZWQgYnkgdGhlIGVudHJ5OyBvciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgZW50cnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBGb3IgZGV0YWlscyBvbiB0aGUgc3ludGF4IGZvciB0aGUgc2VsZWN0aW9uQ3JpdGVyaWEgcGFyYW1ldGVyLCBzZWUgPHNlZQorICAgICAgICAvLy8gY3JlZj0iQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcpIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGEgWmlwRmlsZSB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbSBzdG9yYWdlLgorICAgICAgICAvLy8gV2hlbiBjcmVhdGluZyBhIG5ldyBaaXBGaWxlLCB0aGlzIG1ldGhvZCB3aWxsIHdvcmsgb25seSBhZnRlciB0aGUgWmlwQXJjaGl2ZSBoYXMKKyAgICAgICAgLy8vIGJlZW4gU2F2ZWQgdG8gdGhlIGRpc2sgKHRoZSBaaXBGaWxlIGNsYXNzIHN1YnNlcXVlbnRseSBhbmQgaW1wbGljaXRseSByZWFkcyB0aGUgWmlwCisgICAgICAgIC8vLyBhcmNoaXZlIGZyb20gc3RvcmFnZS4pICBDYWxsaW5nIFNlbGVjdEVudHJpZXMgb24gYSBaaXBGaWxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbgorICAgICAgICAvLy8gc2F2ZWQgd2lsbCBkZWxpdmVyIHVuZGVmaW5lZCByZXN1bHRzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkV4Y2VwdGlvbiI+CisgICAgICAgIC8vLyBUaHJvd24gaWYgc2VsZWN0aW9uQ3JpdGVyaWEgaGFzIGFuIGludmFsaWQgc3ludGF4LgorICAgICAgICAvLy8gPC9leGNlcHRpb24+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcDEgPSBaaXBGaWxlLlJlYWQoWmlwRmlsZU5hbWUpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHZhciBVcGRhdGVkUGhvdG9TaG9wRmlsZXMgPSB6aXAxLlNlbGVjdEVudHJpZXMoIioucHNkIiwgIlVwZGF0ZWRGaWxlcyIpOworICAgICAgICAvLy8gICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gVXBkYXRlZFBob3RvU2hvcEZpbGVzKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgLy8gcHJvbXB0IGZvciBleHRyYWN0IGhlcmUKKyAgICAgICAgLy8vICAgICAgICAgaWYgKFdhbnRFeHRyYWN0KGUuRmlsZU5hbWUpKQorICAgICAgICAvLy8gICAgICAgICAgICAgZS5FeHRyYWN0KCk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwMSBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKFppcEZpbGVOYW1lKQorICAgICAgICAvLy8gICAgIERpbSBVcGRhdGVkUGhvdG9TaG9wRmlsZXMgQXMgSUNvbGxlY3Rpb24oT2YgWmlwRW50cnkpID0gemlwMS5TZWxlY3RFbnRyaWVzKCIqLnBzZCIsICJVcGRhdGVkRmlsZXMiKQorICAgICAgICAvLy8gICAgIERpbSBlIEFzIFppcEVudHJ5CisgICAgICAgIC8vLyAgICAgRm9yIEVhY2ggZSBJbiBVcGRhdGVkUGhvdG9TaG9wRmlsZXMKKyAgICAgICAgLy8vICAgICAgICAgJyBwcm9tcHQgZm9yIGV4dHJhY3QgaGVyZQorICAgICAgICAvLy8gICAgICAgICBJZiBNZS5XYW50RXh0cmFjdChlLkZpbGVOYW1lKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICBlLkV4dHJhY3QKKyAgICAgICAgLy8vICAgICAgICAgRW5kIElmCisgICAgICAgIC8vLyAgICAgTmV4dAorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VsZWN0aW9uQ3JpdGVyaWEiPnRoZSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgd2hpY2ggZW50cmllcyB0byBzZWxlY3Q8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vIHRoZSBkaXJlY3RvcnkgaW4gdGhlIGFyY2hpdmUgZnJvbSB3aGljaCB0byBzZWxlY3QgZW50cmllcy4gSWYgbnVsbCwgdGhlbgorICAgICAgICAvLy8gYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlIGFyZSB1c2VkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5hIGNvbGxlY3Rpb24gb2YgWmlwRW50cnkgb2JqZWN0cyB0aGF0IGNvbmZvcm0gdG8gdGhlIGluY2x1c2lvbiBzcGVjPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgSUNvbGxlY3Rpb248WmlwRW50cnk+IFNlbGVjdEVudHJpZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhLCBzdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgSW9uaWMuRmlsZVNlbGVjdG9yIGZmID0gbmV3IElvbmljLkZpbGVTZWxlY3RvcihzZWxlY3Rpb25Dcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGlyZWN0b3J5V2lsbFRyYXZlcnNlUmVwYXJzZVBvaW50cyk7CisgICAgICAgICAgICByZXR1cm4gZmYuU2VsZWN0RW50cmllcyh0aGlzLCBkaXJlY3RvcnlQYXRoSW5BcmNoaXZlKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmUgZW50cmllcyBmcm9tIHRoZSB6aXBmaWxlIGJ5IHNwZWNpZmllZCBjcml0ZXJpYS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWxsb3dzIGNhbGxlcnMgdG8gcmVtb3ZlIHRoZSBjb2xsZWN0aW9uIG9mIGVudHJpZXMgZnJvbSB0aGUgemlwZmlsZQorICAgICAgICAvLy8gdGhhdCBmaXQgdGhlIHNwZWNpZmllZCBjcml0ZXJpYS4gIFRoZSBjcml0ZXJpYSBhcmUgZGVzY3JpYmVkIGluIGEgc3RyaW5nIGZvcm1hdCwgYW5kCisgICAgICAgIC8vLyBjYW4gaW5jbHVkZSBwYXR0ZXJucyBmb3IgdGhlIGZpbGVuYW1lOyBjb25zdHJhaW50cyBvbiB0aGUgc2l6ZSBvZiB0aGUgZW50cnk7CisgICAgICAgIC8vLyBjb25zdHJhaW50cyBvbiB0aGUgbGFzdCBtb2RpZmllZCwgY3JlYXRlZCwgb3IgbGFzdCBhY2Nlc3NlZCB0aW1lIGZvciB0aGUgZmlsZQorICAgICAgICAvLy8gZGVzY3JpYmVkIGJ5IHRoZSBlbnRyeTsgb3IgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gRm9yIGRldGFpbHMgb24gdGhlIHN5bnRheCBmb3IgdGhlIHNlbGVjdGlvbkNyaXRlcmlhIHBhcmFtZXRlciwgc2VlIDxzZWUKKyAgICAgICAgLy8vIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhIFppcEZpbGUgdGhhdCBoYXMgYmVlbiByZWFkIGZyb20gc3RvcmFnZS4KKyAgICAgICAgLy8vIFdoZW4gY3JlYXRpbmcgYSBuZXcgWmlwRmlsZSwgdGhpcyBtZXRob2Qgd2lsbCB3b3JrIG9ubHkgYWZ0ZXIgdGhlIFppcEFyY2hpdmUgaGFzCisgICAgICAgIC8vLyBiZWVuIFNhdmVkIHRvIHRoZSBkaXNrICh0aGUgWmlwRmlsZSBjbGFzcyBzdWJzZXF1ZW50bHkgYW5kIGltcGxpY2l0bHkgcmVhZHMgdGhlIFppcAorICAgICAgICAvLy8gYXJjaGl2ZSBmcm9tIHN0b3JhZ2UuKSAgQ2FsbGluZyBTZWxlY3RFbnRyaWVzIG9uIGEgWmlwRmlsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4KKyAgICAgICAgLy8vIHNhdmVkIHdpbGwgZGVsaXZlciB1bmRlZmluZWQgcmVzdWx0cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlN5c3RlbS5FeGNlcHRpb24iPgorICAgICAgICAvLy8gVGhyb3duIGlmIHNlbGVjdGlvbkNyaXRlcmlhIGhhcyBhbiBpbnZhbGlkIHN5bnRheC4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gVGhpcyBleGFtcGxlIHJlbW92ZXMgYWxsIGVudHJpZXMgaW4gYSB6aXAgZmlsZSB0aGF0IHdlcmUgbW9kaWZpZWQgcHJpb3IgdG8gSmFudWFyeSAxc3QsIDIwMDguCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcDEgPSBaaXBGaWxlLlJlYWQoWmlwRmlsZU5hbWUpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIC8vIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHByaW9yIHRvIEphbiAxLCAyMDA4CisgICAgICAgIC8vLyAgICAgemlwMS5SZW1vdmVFbnRyaWVzKCJtdGltZSAmbHQ7IDIwMDgtMDEtMDEiKTsKKyAgICAgICAgLy8vICAgICAvLyBkb24ndCBmb3JnZXQgdG8gc2F2ZSB0aGUgYXJjaGl2ZSEKKyAgICAgICAgLy8vICAgICB6aXAxLlNhdmUoKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKFppcEZpbGVOYW1lKQorICAgICAgICAvLy8gICAgICcgcmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gcHJpb3IgdG8gSmFuIDEsIDIwMDgKKyAgICAgICAgLy8vICAgICB6aXAxLlJlbW92ZUVudHJpZXMoIm10aW1lICZsdDsgMjAwOC0wMS0wMSIpCisgICAgICAgIC8vLyAgICAgJyBkbyBub3QgZm9yZ2V0IHRvIHNhdmUgdGhlIGFyY2hpdmUhCisgICAgICAgIC8vLyAgICAgemlwMS5TYXZlCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZWxlY3Rpb25Dcml0ZXJpYSI+dGhlIHN0cmluZyB0aGF0IHNwZWNpZmllcyB3aGljaCBlbnRyaWVzIHRvIHNlbGVjdDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGVudHJpZXMgcmVtb3ZlZDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBSZW1vdmVTZWxlY3RlZEVudHJpZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5TZWxlY3RFbnRyaWVzKHNlbGVjdGlvbkNyaXRlcmlhKTsKKyAgICAgICAgICAgIHRoaXMuUmVtb3ZlRW50cmllcyhzZWxlY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5Db3VudDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlIGVudHJpZXMgZnJvbSB0aGUgemlwZmlsZSBieSBzcGVjaWZpZWQgY3JpdGVyaWEsIGFuZCB3aXRoaW4gdGhlIHNwZWNpZmllZAorICAgICAgICAvLy8gcGF0aCBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWxsb3dzIGNhbGxlcnMgdG8gcmVtb3ZlIHRoZSBjb2xsZWN0aW9uIG9mIGVudHJpZXMgZnJvbSB0aGUgemlwZmlsZQorICAgICAgICAvLy8gdGhhdCBmaXQgdGhlIHNwZWNpZmllZCBjcml0ZXJpYS4gIFRoZSBjcml0ZXJpYSBhcmUgZGVzY3JpYmVkIGluIGEgc3RyaW5nIGZvcm1hdCwgYW5kCisgICAgICAgIC8vLyBjYW4gaW5jbHVkZSBwYXR0ZXJucyBmb3IgdGhlIGZpbGVuYW1lOyBjb25zdHJhaW50cyBvbiB0aGUgc2l6ZSBvZiB0aGUgZW50cnk7CisgICAgICAgIC8vLyBjb25zdHJhaW50cyBvbiB0aGUgbGFzdCBtb2RpZmllZCwgY3JlYXRlZCwgb3IgbGFzdCBhY2Nlc3NlZCB0aW1lIGZvciB0aGUgZmlsZQorICAgICAgICAvLy8gZGVzY3JpYmVkIGJ5IHRoZSBlbnRyeTsgb3IgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGVudHJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gRm9yIGRldGFpbHMgb24gdGhlIHN5bnRheCBmb3IgdGhlIHNlbGVjdGlvbkNyaXRlcmlhIHBhcmFtZXRlciwgc2VlIDxzZWUKKyAgICAgICAgLy8vIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhIFppcEZpbGUgdGhhdCBoYXMgYmVlbiByZWFkIGZyb20gc3RvcmFnZS4KKyAgICAgICAgLy8vIFdoZW4gY3JlYXRpbmcgYSBuZXcgWmlwRmlsZSwgdGhpcyBtZXRob2Qgd2lsbCB3b3JrIG9ubHkgYWZ0ZXIgdGhlIFppcEFyY2hpdmUgaGFzCisgICAgICAgIC8vLyBiZWVuIFNhdmVkIHRvIHRoZSBkaXNrICh0aGUgWmlwRmlsZSBjbGFzcyBzdWJzZXF1ZW50bHkgYW5kIGltcGxpY2l0bHkgcmVhZHMgdGhlIFppcAorICAgICAgICAvLy8gYXJjaGl2ZSBmcm9tIHN0b3JhZ2UuKSAgQ2FsbGluZyBTZWxlY3RFbnRyaWVzIG9uIGEgWmlwRmlsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4KKyAgICAgICAgLy8vIHNhdmVkIHdpbGwgZGVsaXZlciB1bmRlZmluZWQgcmVzdWx0cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlN5c3RlbS5FeGNlcHRpb24iPgorICAgICAgICAvLy8gVGhyb3duIGlmIHNlbGVjdGlvbkNyaXRlcmlhIGhhcyBhbiBpbnZhbGlkIHN5bnRheC4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAxID0gWmlwRmlsZS5SZWFkKFppcEZpbGVOYW1lKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICAvLyByZW1vdmUgYWxsIGVudHJpZXMgZnJvbSBwcmlvciB0byBKYW4gMSwgMjAwOAorICAgICAgICAvLy8gICAgIHppcDEuUmVtb3ZlRW50cmllcygibXRpbWUgJmx0OyAyMDA4LTAxLTAxIiwgImRvY3VtZW50cyIpOworICAgICAgICAvLy8gICAgIC8vIGEgY2FsbCB0byBaaXBGaWxlLlNhdmUgd2lsbCBtYWtlIHRoZSBtb2RpZmljYXRpb25zIHBlcm1hbmVudAorICAgICAgICAvLy8gICAgIHppcDEuU2F2ZSgpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoWmlwRmlsZU5hbWUpCisgICAgICAgIC8vLyAgICAgJyByZW1vdmUgYWxsIGVudHJpZXMgZnJvbSBwcmlvciB0byBKYW4gMSwgMjAwOAorICAgICAgICAvLy8gICAgIHppcDEuUmVtb3ZlRW50cmllcygibXRpbWUgJmx0OyAyMDA4LTAxLTAxIiwgImRvY3VtZW50cyIpCisgICAgICAgIC8vLyAgICAgJyBhIGNhbGwgdG8gWmlwRmlsZS5TYXZlIHdpbGwgbWFrZSB0aGUgbW9kaWZpY2F0aW9ucyBwZXJtYW5lbnQKKyAgICAgICAgLy8vICAgICB6aXAxLlNhdmUKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZWxlY3Rpb25Dcml0ZXJpYSI+dGhlIHN0cmluZyB0aGF0IHNwZWNpZmllcyB3aGljaCBlbnRyaWVzIHRvIHNlbGVjdDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyB0aGUgZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlIGZyb20gd2hpY2ggdG8gc2VsZWN0IGVudHJpZXMuIElmIG51bGwsIHRoZW4KKyAgICAgICAgLy8vIGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZSBhcmUgdXNlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGVudHJpZXMgcmVtb3ZlZDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBSZW1vdmVTZWxlY3RlZEVudHJpZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhLCBzdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuU2VsZWN0RW50cmllcyhzZWxlY3Rpb25Dcml0ZXJpYSwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSk7CisgICAgICAgICAgICB0aGlzLlJlbW92ZUVudHJpZXMoc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uQ291bnQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNlbGVjdHMgYW5kIEV4dHJhY3RzIGEgc2V0IG9mIEVudHJpZXMgZnJvbSB0aGUgWmlwRmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhlIGVudHJpZXMgYXJlIGV4dHJhY3RlZCBpbnRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gSWYgYW55IG9mIHRoZSBmaWxlcyB0byBiZSBleHRyYWN0ZWQgYWxyZWFkeSBleGlzdCwgdGhlbiB0aGUgYWN0aW9uIHRha2VuIGlzIGFzCisgICAgICAgIC8vLyBzcGVjaWZpZWQgaW4gdGhlIDxzZWUgY3JlZj0iWmlwRW50cnkuRXh0cmFjdEV4aXN0aW5nRmlsZSIvPiBwcm9wZXJ0eSBvbiB0aGUKKyAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgWmlwRW50cnkgaW5zdGFuY2UuICBCeSBkZWZhdWx0LCB0aGUgYWN0aW9uIHRha2VuIGluIHRoaXMgY2FzZSBpcyB0bworICAgICAgICAvLy8gdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggb2YgdGhlIHNlbGVjdGlvbkNyaXRlcmlhIHN0cmluZywKKyAgICAgICAgLy8vIHNlZSA8c2VlIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIgLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IGV4dHJhY3QgYWxsIFhNTCBmaWxlcyBtb2RpZmllZCBhZnRlciAxNSBKYW51YXJ5IDIwMDkuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBBcmNoaXZlTmFtZSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcC5FeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKCJuYW1lID0gKi54bWwgIGFuZCAgbXRpbWUgJmd0OyAyMDA5LTAxLTE1Iik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VsZWN0aW9uQ3JpdGVyaWEiPnRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIGVudHJpZXMgdG8gZXh0cmFjdC48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkV4dHJhY3RTZWxlY3RlZEVudHJpZXMoU3RyaW5nLEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24pIi8+CisgICAgICAgIHB1YmxpYyB2b2lkIEV4dHJhY3RTZWxlY3RlZEVudHJpZXMoU3RyaW5nIHNlbGVjdGlvbkNyaXRlcmlhKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoIChaaXBFbnRyeSBlIGluIFNlbGVjdEVudHJpZXMoc2VsZWN0aW9uQ3JpdGVyaWEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUuUGFzc3dvcmQgPSBfUGFzc3dvcmQ7IC8vIHBvc3NpYmx5IG51bGwKKyAgICAgICAgICAgICAgICBlLkV4dHJhY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2VsZWN0cyBhbmQgRXh0cmFjdHMgYSBzZXQgb2YgRW50cmllcyBmcm9tIHRoZSBaaXBGaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBUaGUgZW50cmllcyBhcmUgZXh0cmFjdGVkIGludG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIFdoZW4gZXh0cmFjdGlvbiB3b3VsZCB3b3VsZAorICAgICAgICAvLy8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGVzeXN0ZW0gZmlsZSwgdGhlIGFjdGlvbiB0YWtlbiBpcyBhcyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZXh0cmFjdEV4aXN0aW5nRmlsZSIvPiBwYXJhbWV0ZXIuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyBGb3IgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBvZiB0aGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVudHJ5IHNlbGVjdGlvbiBjcml0ZXJpYSwKKyAgICAgICAgLy8vIHNlZSA8c2VlIGNyZWY9IkFkZFNlbGVjdGVkRmlsZXMoU3RyaW5nKSIgLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IGV4dHJhY3QgYWxsIFhNTCBmaWxlcyBtb2RpZmllZCBhZnRlciAxNSBKYW51YXJ5IDIwMDksCisgICAgICAgIC8vLyBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgZmlsZXMuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBBcmNoaXZlTmFtZSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcC5FeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKCJuYW1lID0gKi54bWwgIGFuZCAgbXRpbWUgJmd0OyAyMDA5LTAxLTE1IiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbi5PdmVyd3JpdGVTaWxlbnRseSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj50aGUgc2VsZWN0aW9uIGNyaXRlcmlhIGZvciBlbnRyaWVzIHRvIGV4dHJhY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXh0cmFjdEV4aXN0aW5nRmlsZSI+CisgICAgICAgIC8vLyBUaGUgYWN0aW9uIHRvIHRha2UgaWYgZXh0cmFjdGlvbiB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIGludGVybmFsIHZvaWQgRXh0cmFjdFNlbGVjdGVkRW50cmllcyhTdHJpbmcgc2VsZWN0aW9uQ3JpdGVyaWEsIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24gZXh0cmFjdEV4aXN0aW5nRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZSBpbiBTZWxlY3RFbnRyaWVzKHNlbGVjdGlvbkNyaXRlcmlhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlLlBhc3N3b3JkID0gX1Bhc3N3b3JkOyAvLyBwb3NzaWJseSBudWxsCisgICAgICAgICAgICAgICAgZS5FeHRyYWN0KGV4dHJhY3RFeGlzdGluZ0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZWxlY3RzIGFuZCBFeHRyYWN0cyBhIHNldCBvZiBFbnRyaWVzIGZyb20gdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoZSBlbnRyaWVzIGFyZSBzZWxlY3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXJjaGl2ZSwgYW5kIHRoZW4KKyAgICAgICAgLy8vIGV4dHJhY3RlZCBpbnRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gSWYgYW55IG9mIHRoZSBmaWxlcyB0byBiZSBleHRyYWN0ZWQgYWxyZWFkeSBleGlzdCwgdGhlbiB0aGUgYWN0aW9uIHRha2VuIGlzIGFzCisgICAgICAgIC8vLyBzcGVjaWZpZWQgaW4gdGhlIDxzZWUgY3JlZj0iWmlwRW50cnkuRXh0cmFjdEV4aXN0aW5nRmlsZSIvPiBwcm9wZXJ0eSBvbiB0aGUKKyAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgWmlwRW50cnkgaW5zdGFuY2UuICBCeSBkZWZhdWx0LCB0aGUgYWN0aW9uIHRha2VuIGluIHRoaXMgY2FzZSBpcyB0bworICAgICAgICAvLy8gdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggb2YgdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlbnRyeSBzZWxlY3Rpb24gY3JpdGVyaWEsCisgICAgICAgIC8vLyBzZWUgPHNlZSBjcmVmPSJBZGRTZWxlY3RlZEZpbGVzKFN0cmluZykiIC8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gVGhpcyBleGFtcGxlIHNob3dzIGhvdyBleHRyYWN0IGFsbCBYTUwgZmlsZXMgbW9kaWZpZWQgYWZ0ZXIgMTUgSmFudWFyeSAyMDA5LAorICAgICAgICAvLy8gYW5kIHdyaXRlcyB0aGVtIHRvIHRoZSAidW5wYWNrIiBkaXJlY3RvcnkuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBBcmNoaXZlTmFtZSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcC5FeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKCJuYW1lID0gKi54bWwgIGFuZCAgbXRpbWUgJmd0OyAyMDA5LTAxLTE1IiwidW5wYWNrIik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj50aGUgc2VsZWN0aW9uIGNyaXRlcmlhIGZvciBlbnRyaWVzIHRvIGV4dHJhY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyB0aGUgZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlIGZyb20gd2hpY2ggdG8gc2VsZWN0IGVudHJpZXMuIElmIG51bGwsIHRoZW4KKyAgICAgICAgLy8vIGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZSBhcmUgdXNlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRXh0cmFjdFNlbGVjdGVkRW50cmllcyhTdHJpbmcsU3RyaW5nLFN0cmluZyxFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uKSIvPgorICAgICAgICBwdWJsaWMgdm9pZCBFeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSwgU3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gU2VsZWN0RW50cmllcyhzZWxlY3Rpb25Dcml0ZXJpYSwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZS5QYXNzd29yZCA9IF9QYXNzd29yZDsgLy8gcG9zc2libHkgbnVsbAorICAgICAgICAgICAgICAgIGUuRXh0cmFjdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZWxlY3RzIGFuZCBFeHRyYWN0cyBhIHNldCBvZiBFbnRyaWVzIGZyb20gdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoZSBlbnRyaWVzIGFyZSBleHRyYWN0ZWQgaW50byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gSWYgYW55IG9mIHRoZSBmaWxlcyB0byBiZQorICAgICAgICAvLy8gZXh0cmFjdGVkIGFscmVhZHkgZXhpc3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggb2YgdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlbnRyeSBzZWxlY3Rpb24gY3JpdGVyaWEsCisgICAgICAgIC8vLyBzZWUgPHNlZSBjcmVmPSJBZGRTZWxlY3RlZEZpbGVzKFN0cmluZykiIC8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZWxlY3Rpb25Dcml0ZXJpYSI+dGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgZW50cmllcyB0byBleHRyYWN0LjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpcmVjdG9yeUluQXJjaGl2ZSI+CisgICAgICAgIC8vLyB0aGUgZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlIGZyb20gd2hpY2ggdG8gc2VsZWN0IGVudHJpZXMuIElmIG51bGwsIHRoZW4KKyAgICAgICAgLy8vIGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZSBhcmUgdXNlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4dHJhY3REaXJlY3RvcnkiPgorICAgICAgICAvLy8gdGhlIGRpcmVjdG9yeSBvbiB0aGUgZGlzayBpbnRvIHdoaWNoIHRvIGV4dHJhY3QuIEl0IHdpbGwgYmUgY3JlYXRlZAorICAgICAgICAvLy8gaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBFeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSwgc3RyaW5nIGRpcmVjdG9yeUluQXJjaGl2ZSwgc3RyaW5nIGV4dHJhY3REaXJlY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gU2VsZWN0RW50cmllcyhzZWxlY3Rpb25Dcml0ZXJpYSwgZGlyZWN0b3J5SW5BcmNoaXZlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlLlBhc3N3b3JkID0gX1Bhc3N3b3JkOyAvLyBwb3NzaWJseSBudWxsCisgICAgICAgICAgICAgICAgZS5FeHRyYWN0KGV4dHJhY3REaXJlY3RvcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZWxlY3RzIGFuZCBFeHRyYWN0cyBhIHNldCBvZiBFbnRyaWVzIGZyb20gdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoZSBlbnRyaWVzIGFyZSBleHRyYWN0ZWQgaW50byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4gV2hlbiBleHRyYWN0aW9uIHdvdWxkIHdvdWxkCisgICAgICAgIC8vLyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZXN5c3RlbSBmaWxlLCB0aGUgYWN0aW9uIHRha2VuIGlzIGFzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJleHRyYWN0RXhpc3RpbmdGaWxlIi8+IHBhcmFtZXRlci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIHRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZW50cnkgc2VsZWN0aW9uIGNyaXRlcmlhLAorICAgICAgICAvLy8gc2VlIDxzZWUgY3JlZj0iQWRkU2VsZWN0ZWRGaWxlcyhTdHJpbmcpIiAvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgZXh0cmFjdCBhbGwgZmlsZXMgIHdpdGggYW4gWE1MIGV4dGVuc2lvbiBvciB3aXRoICBhIHNpemUgbGFyZ2VyIHRoYW4gMTAwLDAwMCBieXRlcywKKyAgICAgICAgLy8vIGFuZCBwdXRzIHRoZW0gaW4gdGhlIHVucGFjayBkaXJlY3RvcnkuICBGb3IgYW55IGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCBpbgorICAgICAgICAvLy8gdGhhdCBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHRoZXkgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4uCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBBcmNoaXZlTmFtZSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcC5FeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKCJuYW1lID0gKi54bWwgIG9yICBzaXplICZndDsgMTAwMDAwIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucGFjayIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RFeGlzdGluZ0ZpbGVBY3Rpb24uRG9udE92ZXJ3cml0ZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbGVjdGlvbkNyaXRlcmlhIj50aGUgc2VsZWN0aW9uIGNyaXRlcmlhIGZvciBlbnRyaWVzIHRvIGV4dHJhY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXh0cmFjdERpcmVjdG9yeSI+CisgICAgICAgIC8vLyBUaGUgZGlyZWN0b3J5IG9uIHRoZSBkaXNrIGludG8gd2hpY2ggdG8gZXh0cmFjdC4gSXQgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSI+CisgICAgICAgIC8vLyBUaGUgZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlIGZyb20gd2hpY2ggdG8gc2VsZWN0IGVudHJpZXMuIElmIG51bGwsIHRoZW4KKyAgICAgICAgLy8vIGFsbCBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZSBhcmUgdXNlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4dHJhY3RFeGlzdGluZ0ZpbGUiPgorICAgICAgICAvLy8gVGhlIGFjdGlvbiB0byB0YWtlIGlmIGV4dHJhY3Rpb24gd291bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBFeHRyYWN0U2VsZWN0ZWRFbnRyaWVzKFN0cmluZyBzZWxlY3Rpb25Dcml0ZXJpYSwgc3RyaW5nIGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUsIHN0cmluZyBleHRyYWN0RGlyZWN0b3J5LCBFeHRyYWN0RXhpc3RpbmdGaWxlQWN0aW9uIGV4dHJhY3RFeGlzdGluZ0ZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gU2VsZWN0RW50cmllcyhzZWxlY3Rpb25Dcml0ZXJpYSwgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZS5QYXNzd29yZCA9IF9QYXNzd29yZDsgLy8gcG9zc2libHkgbnVsbAorICAgICAgICAgICAgICAgIGUuRXh0cmFjdChleHRyYWN0RGlyZWN0b3J5LCBleHRyYWN0RXhpc3RpbmdGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CisKKworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMKK3sKKyAgICBpbnRlcm5hbCBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzIFNlbGVjdGlvbkNyaXRlcmlvbgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgYWJzdHJhY3QgYm9vbCBFdmFsdWF0ZShaaXBFbnRyeSBlbnRyeSk7CisgICAgfQorCisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIE5hbWVDcml0ZXJpb24gOiBTZWxlY3Rpb25Dcml0ZXJpb24KKyAgICB7CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGJvb2wgRXZhbHVhdGUoWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHN3YXAgZm9yd2FyZCBzbGFzaGVzIGluIHRoZSBlbnRyeS5GaWxlTmFtZSBmb3IgYmFja3NsYXNoZXMKKyAgICAgICAgICAgIHN0cmluZyB0cmFuc2Zvcm1lZEZpbGVOYW1lID0gZW50cnkuRmlsZU5hbWUuUmVwbGFjZSgiLyIsICJcXCIpOworCisgICAgICAgICAgICByZXR1cm4gX0V2YWx1YXRlKHRyYW5zZm9ybWVkRmlsZU5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFNpemVDcml0ZXJpb24gOiBTZWxlY3Rpb25Dcml0ZXJpb24KKyAgICB7CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGJvb2wgRXZhbHVhdGUoWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfRXZhbHVhdGUoZW50cnkuVW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFRpbWVDcml0ZXJpb24gOiBTZWxlY3Rpb25Dcml0ZXJpb24KKyAgICB7CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGJvb2wgRXZhbHVhdGUoWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGVUaW1lIHg7CisgICAgICAgICAgICBzd2l0Y2ggKFdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV2hpY2hUaW1lLmF0aW1lOgorICAgICAgICAgICAgICAgICAgICB4ID0gZW50cnkuQWNjZXNzZWRUaW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdoaWNoVGltZS5tdGltZToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGVudHJ5Lk1vZGlmaWVkVGltZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBXaGljaFRpbWUuY3RpbWU6CisgICAgICAgICAgICAgICAgICAgIHggPSBlbnRyeS5DcmVhdGlvblRpbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiPz90aW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX0V2YWx1YXRlKHgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIFR5cGVDcml0ZXJpb24gOiBTZWxlY3Rpb25Dcml0ZXJpb24KKyAgICB7CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIGJvb2wgRXZhbHVhdGUoWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gKE9iamVjdFR5cGUgPT0gJ0QnKQorICAgICAgICAgICAgICAgID8gZW50cnkuSXNEaXJlY3RvcnkKKyAgICAgICAgICAgICAgICA6ICFlbnRyeS5Jc0RpcmVjdG9yeTsKKworICAgICAgICAgICAgaWYgKE9wZXJhdG9yICE9IENvbXBhcmlzb25PcGVyYXRvci5FcXVhbFRvKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICFyZXN1bHQ7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisjaWYgIVNJTFZFUkxJR0hUCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBBdHRyaWJ1dGVzQ3JpdGVyaW9uIDogU2VsZWN0aW9uQ3JpdGVyaW9uCisgICAgeworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBib29sIEV2YWx1YXRlKFppcEVudHJ5IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlQXR0cmlidXRlcyBmaWxlQXR0cnMgPSBlbnRyeS5BdHRyaWJ1dGVzOworICAgICAgICAgICAgcmV0dXJuIF9FdmFsdWF0ZShmaWxlQXR0cnMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpbnRlcm5hbCBwYXJ0aWFsIGNsYXNzIENvbXBvdW5kQ3JpdGVyaW9uIDogU2VsZWN0aW9uQ3JpdGVyaW9uCisgICAgeworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBib29sIEV2YWx1YXRlKFppcEVudHJ5IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IExlZnQuRXZhbHVhdGUoZW50cnkpOworICAgICAgICAgICAgc3dpdGNoIChDb25qdW5jdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIExvZ2ljYWxDb25qdW5jdGlvbi5BTkQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodC5FdmFsdWF0ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTG9naWNhbENvbmp1bmN0aW9uLk9SOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJpZ2h0LkV2YWx1YXRlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMb2dpY2FsQ29uanVuY3Rpb24uWE9SOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgXj0gUmlnaHQuRXZhbHVhdGUoZW50cnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBGaWxlU2VsZWN0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBFdmFsdWF0ZShaaXBFbnRyeSBlbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBfQ3JpdGVyaW9uLkV2YWx1YXRlKGVudHJ5KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXRyaWV2ZSB0aGUgWmlwRW50cnkgaXRlbXMgaW4gdGhlIFppcEZpbGUgdGhhdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFwcGxpZXMgdGhlIGNyaXRlcmlhIHNldCBpbiB0aGUgRmlsZVNlbGVjdG9yIGluc3RhbmNlIChhcyBkZXNjcmliZWQgaW4KKyAgICAgICAgLy8vIHRoZSA8c2VlIGNyZWY9IkZpbGVTZWxlY3Rvci5TZWxlY3Rpb25Dcml0ZXJpYSIvPikgdG8gdGhlIHNwZWNpZmllZCBaaXBGaWxlLiAgVXNpbmcgdGhpcworICAgICAgICAvLy8gbWV0aG9kLCBmb3IgZXhhbXBsZSwgeW91IGNhbiByZXRyaWV2ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBnaXZlbiBaaXBGaWxlIHRoYXQKKyAgICAgICAgLy8vIGhhdmUgZmlsZW5hbWVzIGVuZGluZyBpbiAudHh0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gTm9ybWFsbHksIGFwcGxpY2F0aW9ucyB3b3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFRoaXMgbWV0aG9kIGlzIHVzZWQKKyAgICAgICAgLy8vIGJ5IHRoZSBaaXBGaWxlIGNsYXNzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVXNpbmcgdGhlIGFwcHJvcHJpYXRlIFNlbGVjdGlvbkNyaXRlcmlhLCB5b3UgY2FuIHJldHJpZXZlIGVudHJpZXMgYmFzZWQgb24gc2l6ZSwKKyAgICAgICAgLy8vIHRpbWUsIGFuZCBhdHRyaWJ1dGVzLiBTZWUgPHNlZSBjcmVmPSJGaWxlU2VsZWN0b3IuU2VsZWN0aW9uQ3JpdGVyaWEiLz4gZm9yIGEKKyAgICAgICAgLy8vIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhlIFNlbGVjdGlvbkNyaXRlcmlhIHN0cmluZy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InppcCI+VGhlIFppcEZpbGUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBlbnRyaWVzLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+YSBjb2xsZWN0aW9uIG9mIFppcEVudHJ5IG9iamVjdHMgdGhhdCBjb25mb3JtIHRvIHRoZSBjcml0ZXJpYS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxaaXBFbnRyeT4gU2VsZWN0RW50cmllcyhaaXBGaWxlIHppcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHppcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInppcCIpOworCisgICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PFppcEVudHJ5PigpOworCisgICAgICAgICAgICBmb3JlYWNoIChaaXBFbnRyeSBlIGluIHppcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5FdmFsdWF0ZShlKSkKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQoZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXRyaWV2ZSB0aGUgWmlwRW50cnkgaXRlbXMgaW4gdGhlIFppcEZpbGUgdGhhdCBjb25mb3JtIHRvIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFwcGxpZXMgdGhlIGNyaXRlcmlhIHNldCBpbiB0aGUgRmlsZVNlbGVjdG9yIGluc3RhbmNlIChhcyBkZXNjcmliZWQgaW4KKyAgICAgICAgLy8vIHRoZSA8c2VlIGNyZWY9IkZpbGVTZWxlY3Rvci5TZWxlY3Rpb25Dcml0ZXJpYSIvPikgdG8gdGhlIHNwZWNpZmllZCBaaXBGaWxlLiAgVXNpbmcgdGhpcworICAgICAgICAvLy8gbWV0aG9kLCBmb3IgZXhhbXBsZSwgeW91IGNhbiByZXRyaWV2ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBnaXZlbiBaaXBGaWxlIHRoYXQKKyAgICAgICAgLy8vIGhhdmUgZmlsZW5hbWVzIGVuZGluZyBpbiAudHh0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gTm9ybWFsbHksIGFwcGxpY2F0aW9ucyB3b3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gIFRoaXMgbWV0aG9kIGlzIHVzZWQKKyAgICAgICAgLy8vIGJ5IHRoZSBaaXBGaWxlIGNsYXNzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gVGhpcyBvdmVybG9hZCBhbGxvd3MgdGhlIHNlbGVjdGlvbiBvZiBaaXBFbnRyeSBpbnN0YW5jZXMgZnJvbSB0aGUgWmlwRmlsZSB0byBiZSByZXN0cmljdGVkCisgICAgICAgIC8vLyB0byBlbnRyaWVzIGNvbnRhaW5lZCB3aXRoaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBpbiB0aGUgWmlwRmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFVzaW5nIHRoZSBhcHByb3ByaWF0ZSBTZWxlY3Rpb25Dcml0ZXJpYSwgeW91IGNhbiByZXRyaWV2ZSBlbnRyaWVzIGJhc2VkIG9uIHNpemUsCisgICAgICAgIC8vLyB0aW1lLCBhbmQgYXR0cmlidXRlcy4gU2VlIDxzZWUgY3JlZj0iRmlsZVNlbGVjdG9yLlNlbGVjdGlvbkNyaXRlcmlhIi8+IGZvciBhCisgICAgICAgIC8vLyBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoZSBTZWxlY3Rpb25Dcml0ZXJpYSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ6aXAiPlRoZSBaaXBGaWxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgZW50cmllcy48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlQYXRoSW5BcmNoaXZlIj4KKyAgICAgICAgLy8vIHRoZSBkaXJlY3RvcnkgaW4gdGhlIGFyY2hpdmUgZnJvbSB3aGljaCB0byBzZWxlY3QgZW50cmllcy4gSWYgbnVsbCwgdGhlbgorICAgICAgICAvLy8gYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlIGFyZSB1c2VkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5hIGNvbGxlY3Rpb24gb2YgWmlwRW50cnkgb2JqZWN0cyB0aGF0IGNvbmZvcm0gdG8gdGhlIGNyaXRlcmlhLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIElDb2xsZWN0aW9uPFppcEVudHJ5PiBTZWxlY3RFbnRyaWVzKFppcEZpbGUgemlwLCBzdHJpbmcgZGlyZWN0b3J5UGF0aEluQXJjaGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHppcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInppcCIpOworCisgICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PFppcEVudHJ5PigpOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODU1OQorICAgICAgICAgICAgc3RyaW5nIHNsYXNoU3dhcHBlZCA9IChkaXJlY3RvcnlQYXRoSW5BcmNoaXZlID09IG51bGwpID8gbnVsbCA6IGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUuUmVwbGFjZSgiLyIsICJcXCIpOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gOTE3NAorICAgICAgICAgICAgaWYgKHNsYXNoU3dhcHBlZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChzbGFzaFN3YXBwZWQuRW5kc1dpdGgoIlxcIikpCisgICAgICAgICAgICAgICAgICAgIHNsYXNoU3dhcHBlZCA9IHNsYXNoU3dhcHBlZC5TdWJzdHJpbmcoMCwgc2xhc2hTd2FwcGVkLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZSBpbiB6aXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUgPT0gbnVsbCB8fCAoUGF0aC5HZXREaXJlY3RvcnlOYW1lKGUuRmlsZU5hbWUpID09IGRpcmVjdG9yeVBhdGhJbkFyY2hpdmUpCisgICAgICAgICAgICAgICAgICAgIHx8IChQYXRoLkdldERpcmVjdG9yeU5hbWUoZS5GaWxlTmFtZSkgPT0gc2xhc2hTd2FwcGVkKSkgLy8gd29ya2l0ZW0gODU1OQorICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5FdmFsdWF0ZShlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwRmlsZS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhMTRmZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUuY3MKQEAgLTAsMCArMSwzOTA5IEBACisvLyBaaXBGaWxlLmNzCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMTAgRGlubyBDaGllc2EKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8gVGhlIGNsYXNzIGxpYnJhcnkgcmVhZHMgYW5kIHdyaXRlcyB6aXAgZmlsZXMsIGFjY29yZGluZyB0byB0aGUgZm9ybWF0CisvLyBkZXNjcmliZWQgYnkgUEt3YXJlLCBhdDoKKy8vIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9idXNpbmVzc19hbmRfZGV2ZWxvcGVycy9kZXZlbG9wZXIvcG9wdXBzL2FwcG5vdGUudHh0CisvLworLy8KKy8vIFRoZXJlIGFyZSBvdGhlciBaaXAgY2xhc3MgbGlicmFyaWVzIGF2YWlsYWJsZS4KKy8vCisvLyAtIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgYW5kIHdyaXRlIHppcCBmaWxlcyB3aXRoaW4gLk5FVCB2aWEgdGhlIEojIHJ1bnRpbWUuCisvLyAgIEJ1dCBzb21lIHBlb3BsZSBkb24ndCBsaWtlIHRvIGluc3RhbGwgdGhlIGV4dHJhIERMTCwgd2hpY2ggaXMgbm8gbG9uZ2VyCisvLyAgIHN1cHBvcnRlZCBieSBNUy4gQW5kIGFsc28sIHRoZSBKIyBsaWJyYXJpZXMgZG9uJ3Qgc3VwcG9ydCBhZHZhbmNlZCB6aXAKKy8vICAgZmVhdHVyZXMsIGxpa2UgWklQNjQsIHNwYW5uZWQgYXJjaGl2ZXMsIG9yIEFFUyBlbmNyeXB0aW9uLgorLy8KKy8vIC0gVGhlcmUgYXJlIHRoaXJkLXBhcnR5IEdQTCBhbmQgTEdQTCBsaWJyYXJpZXMgYXZhaWxhYmxlLiBTb21lIHBlb3BsZSBkb24ndAorLy8gICBsaWtlIHRoZSBsaWNlbnNlLCBhbmQgc29tZSBvZiB0aGVtIGRvbid0IHN1cHBvcnQgYWxsIHRoZSBaSVAgZmVhdHVyZXMsIGxpa2UgQUVTLgorLy8KKy8vIC0gRmluYWxseSwgdGhlcmUgYXJlIGNvbW1lcmNpYWwgdG9vbHMgKEZyb20gQ29tcG9uZW50T25lLCBYQ2VlZCwgZXRjKS4gIEJ1dAorLy8gICBzb21lIHBlb3BsZSBkb24ndCB3YW50IHRvIGluY3VyIHRoZSBjb3N0LgorLy8KKy8vIFRoaXMgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgKipub3QqKiBHUEwgbGljZW5zZWQuIEl0IGlzIGZyZWUgb2YgY29zdCwgYW5kCisvLyBkb2VzIG5vdCByZXF1aXJlIEojLiBJdCBkb2VzIHJlcXVpcmUgLk5FVCAyLjAuICBJdCBiYWxhbmNlcyBhIGdvb2Qgc2V0IG9mCisvLyBmZWF0dXJlcywgd2l0aCBlYXNlIG9mIHVzZSBhbmQgc3BlZWQgb2YgcGVyZm9ybWFuY2UuCisvLworLy8gVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UgLgorLy8gU2VlIHRoZSBMaWNlbnNlLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLworLy8gTkI6IFRoaXMgaW1wbGVtZW50YXRpb24gb3JpZ2luYWxseSByZWxpZWQgb24gdGhlCisvLyBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRGVmbGF0ZVN0cmVhbSBiYXNlIGNsYXNzIGluIHRoZSAuTkVUIEZyYW1ld29yaworLy8gdjIuMCBiYXNlIGNsYXNzIGxpYnJhcnksIGJ1dCBub3cgaW5jbHVkZXMgYSBtYW5hZ2VkLWNvZGUgcG9ydCBvZiBabGliLgorLy8KKy8vIFRodSwgMDggT2N0IDIwMDkgIDE3OjA0CisvLworCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgSW50ZXJvcCA9IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIFRoZSBaaXBGaWxlIHR5cGUgcmVwcmVzZW50cyBhIHppcCBhcmNoaXZlIGZpbGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFRoaXMgaXMgdGhlIG1haW4gdHlwZSBpbiB0aGUgRG90TmV0WmlwIGNsYXNzIGxpYnJhcnkuIFRoaXMgY2xhc3MgcmVhZHMgYW5kCisgICAgLy8vICAgd3JpdGVzIHppcCBmaWxlcywgYXMgZGVmaW5lZCBpbiB0aGUgPHNlZQorICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPnNwZWNpZmljYXRpb24KKyAgICAvLy8gICBmb3IgemlwIGZpbGVzIGRlc2NyaWJlZCBieSBQS1dhcmU8L3NlZT4uICBUaGUgY29tcHJlc3Npb24gZm9yIHRoaXMKKyAgICAvLy8gICBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCBieSBhIG1hbmFnZWQtY29kZSB2ZXJzaW9uIG9mIFpsaWIsIGluY2x1ZGVkIHdpdGgKKyAgICAvLy8gICBEb3ROZXRaaXAgaW4gdGhlIGNsYXNzZXMgaW4gdGhlIElvbmljLlpsaWIgbmFtZXNwYWNlLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBnZW5lcmFsIHB1cnBvc2UgemlwIGZpbGUgY2FwYWJpbGl0eS4gIFVzZSBpdCB0byByZWFkLAorICAgIC8vLyAgIGNyZWF0ZSwgb3IgdXBkYXRlIHppcCBmaWxlcy4gIFdoZW4geW91IHdhbnQgdG8gY3JlYXRlIHppcCBmaWxlcyB1c2luZyBhCisgICAgLy8vICAgPGM+U3RyZWFtPC9jPiB0eXBlIHRvIHdyaXRlIHRoZSB6aXAgZmlsZSwgeW91IG1heSB3YW50IHRvIGNvbnNpZGVyIHRoZSA8c2VlCisgICAgLy8vICAgY3JlZj0iWmlwT3V0cHV0U3RyZWFtIi8+IGNsYXNzLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIEJvdGggdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gY2xhc3MgYW5kIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyBjYW4KKyAgICAvLy8gICBiZSB1c2VkIHRvIGNyZWF0ZSB6aXAgZmlsZXMuIEJvdGggb2YgdGhlbSBzdXBwb3J0IG1hbnkgb2YgdGhlIGNvbW1vbiB6aXAKKyAgICAvLy8gICBmZWF0dXJlcywgaW5jbHVkaW5nIFVuaWNvZGUsIGRpZmZlcmVudCBjb21wcmVzc2lvbiBtZXRob2RzIGFuZCBsZXZlbHMsCisgICAgLy8vICAgYW5kIFpJUDY0LiBUaGV5IHByb3ZpZGUgdmVyeSBzaW1pbGFyIHBlcmZvcm1hbmNlIHdoZW4gY3JlYXRpbmcgemlwCisgICAgLy8vICAgZmlsZXMuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzIGlzIGdlbmVyYWxseSBlYXNpZXIgdG8gdXNlIHRoYW4KKyAgICAvLy8gICA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGhpZ2hlci1sZXZlbCBpbnRlcmZhY2UuICBGb3IKKyAgICAvLy8gICBleGFtcGxlLCB3aGVuIGNyZWF0aW5nIGEgemlwIGZpbGUgdmlhIGNhbGxzIHRvIHRoZSA8Yz5QdXROZXh0RW50cnkoKTwvYz4gYW5kCisgICAgLy8vICAgPGM+V3JpdGUoKTwvYz4gbWV0aG9kcyBvbiB0aGUgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiBjbGFzcywgdGhlIGNhbGxlciBpcworICAgIC8vLyAgIHJlc3BvbnNpYmxlIGZvciBvcGVuaW5nIHRoZSBmaWxlLCByZWFkaW5nIHRoZSBieXRlcyBmcm9tIHRoZSBmaWxlLCB3cml0aW5nCisgICAgLy8vICAgdGhvc2UgYnl0ZXMgaW50byB0aGUgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiwgc2V0dGluZyB0aGUgYXR0cmlidXRlcyBvbiB0aGUKKyAgICAvLy8gICA8Yz5aaXBFbnRyeTwvYz4sIGFuZCBzZXR0aW5nIHRoZSBjcmVhdGVkLCBsYXN0IG1vZGlmaWVkLCBhbmQgbGFzdCBhY2Nlc3NlZAorICAgIC8vLyAgIHRpbWVzdGFtcHMgb24gdGhlIHppcCBlbnRyeS4gQWxsIG9mIHRoZXNlIHRoaW5ncyBhcmUgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IGEKKyAgICAvLy8gICBjYWxsIHRvIDxzZWUgY3JlZj0iWmlwRmlsZS5BZGRGaWxlKHN0cmluZyxzdHJpbmcpIj5aaXBGaWxlLkFkZEZpbGUoKTwvc2VlPi4KKyAgICAvLy8gICBGb3IgdGhpcyByZWFzb24sIHRoZSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGlzIGdlbmVyYWxseSByZWNvbW1lbmRlZCBmb3IgdXNlCisgICAgLy8vICAgb25seSB3aGVuIHlvdXIgYXBwbGljYXRpb24gZW1pdHMgYXJiaXRyYXJ5IGRhdGEsIG5vdCBuZWNlc3NhcmlseSBkYXRhIGZyb20gYQorICAgIC8vLyAgIGZpbGVzeXN0ZW0gZmlsZSwgZGlyZWN0bHkgaW50byBhIHppcCBmaWxlLCBhbmQgZG9lcyBzbyB1c2luZyBhIDxjPlN0cmVhbTwvYz4KKyAgICAvLy8gICBtZXRhcGhvci4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBBc2lkZSBmcm9tIHRoZSBkaWZmZXJlbmNlcyBpbiBwcm9ncmFtbWluZyBtb2RlbCwgdGhlcmUgYXJlIG90aGVyCisgICAgLy8vICAgZGlmZmVyZW5jZXMgaW4gY2FwYWJpbGl0eSBiZXR3ZWVuIHRoZSB0d28gY2xhc3Nlcy4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8bGlzdCB0eXBlPSJidWxsZXQiPgorICAgIC8vLyAgIDxpdGVtPgorICAgIC8vLyAgICAgPGM+WmlwRmlsZTwvYz4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhbmQgZXh0cmFjdCB6aXAgZmlsZXMsIGluIGFkZGl0aW9uIHRvCisgICAgLy8vICAgICBjcmVhdGluZyB6aXAgZmlsZXMuIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gY2Fubm90IHJlYWQgemlwIGZpbGVzLiBJZiB5b3Ugd2FudAorICAgIC8vLyAgICAgdG8gdXNlIGEgc3RyZWFtIHRvIHJlYWQgemlwIGZpbGVzLCBjaGVjayBvdXQgdGhlIFppcElucHV0U3RyZWFtIGNsYXNzLgorICAgIC8vLyAgIDwvaXRlbT4KKyAgICAvLy8KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gZG9lcyBub3Qgc3VwcG9ydCB0aGUgY3JlYXRpb24gb2Ygc2VnbWVudGVkIG9yIHNwYW5uZWQKKyAgICAvLy8gICAgIHppcCBmaWxlcy4KKyAgICAvLy8gICA8L2l0ZW0+CisgICAgLy8vCisgICAgLy8vICAgPGl0ZW0+CisgICAgLy8vICAgICA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGNhbm5vdCBwcm9kdWNlIGEgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUuCisgICAgLy8vICAgPC9pdGVtPgorICAgIC8vLyA8L2xpc3Q+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIEJlIGF3YXJlIHRoYXQgdGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzIGltcGxlbWVudHMgdGhlIDxzZWUKKyAgICAvLy8gICBjcmVmPSJTeXN0ZW0uSURpc3Bvc2FibGUiLz4gaW50ZXJmYWNlLiAgSW4gb3JkZXIgZm9yIDxjPlppcEZpbGU8L2M+IHRvCisgICAgLy8vICAgcHJvZHVjZSBhIHZhbGlkIHppcCBmaWxlLCB5b3UgdXNlIHVzZSBpdCB3aXRoaW4gYSB1c2luZyBjbGF1c2UgKDxjPlVzaW5nPC9jPgorICAgIC8vLyAgIGluIFZCKSwgb3IgY2FsbCB0aGUgPGM+RGlzcG9zZSgpPC9jPiBtZXRob2QgZXhwbGljaXRseS4gIFNlZSB0aGUgZXhhbXBsZXMKKyAgICAvLy8gICBmb3IgaG93IHRvIGVtcGxveSBhIHVzaW5nIGNsYXVzZS4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8L3JlbWFya3M+CisgICAgW0ludGVyb3AuR3VpZEF0dHJpYnV0ZSgiZWJjMjVjZjYtOTEyMC00MjgzLWI5NzItMGU1NTIwZDAwMDA1IildCisgICAgW0ludGVyb3AuQ29tVmlzaWJsZSh0cnVlKV0KKyNpZiAhTkVUQ0YKKyAgICBbSW50ZXJvcC5DbGFzc0ludGVyZmFjZShJbnRlcm9wLkNsYXNzSW50ZXJmYWNlVHlwZS5BdXRvRGlzcGF0Y2gpXQorI2VuZGlmCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBaaXBGaWxlIDoKKyAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUsCisgICAgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUVudW1lcmFibGU8WmlwRW50cnk+LAorICAgIElEaXNwb3NhYmxlCisgICAgeworCisgICAgICAgICNyZWdpb24gcHVibGljIHByb3BlcnRpZXMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0byBwZXJmb3JtIGEgZnVsbCBzY2FuIG9mIHRoZSB6aXAgZmlsZSB3aGVuIHJlYWRpbmcgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFlvdSBhbG1vc3QgbmV2ZXIgd2FudCB0byB1c2UgdGhpcyBwcm9wZXJ0eS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGEgemlwIGZpbGUsIGlmIHRoaXMgZmxhZyBpcyA8Yz50cnVlPC9jPiAoPGM+VHJ1ZTwvYz4gaW4KKyAgICAgICAgLy8vICAgVkIpLCB0aGUgZW50aXJlIHppcCBhcmNoaXZlIHdpbGwgYmUgc2Nhbm5lZCBhbmQgc2VhcmNoZWQgZm9yIGVudHJpZXMuCisgICAgICAgIC8vLyAgIEZvciBsYXJnZSBhcmNoaXZlcywgdGhpcyBjYW4gdGFrZSBhIHZlcnksIGxvbmcgdGltZS4gVGhlIG11Y2ggbW9yZQorICAgICAgICAvLy8gICBlZmZpY2llbnQgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZWFkIHRoZSB6aXAgZGlyZWN0b3J5LCB3aGljaCBpcworICAgICAgICAvLy8gICBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgemlwIGZpbGUuIEJ1dCwgaW4gc29tZSBjYXNlcyB0aGUgZGlyZWN0b3J5IGlzCisgICAgICAgIC8vLyAgIGNvcnJ1cHRlZCBhbmQgeW91IG5lZWQgdG8gcGVyZm9ybSBhIGZ1bGwgc2NhbiBvZiB0aGUgemlwIGZpbGUgdG8KKyAgICAgICAgLy8vICAgZGV0ZXJtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgemlwIGZpbGUuIFRoaXMgcHJvcGVydHkgbGV0cyB5b3UgZG8KKyAgICAgICAgLy8vICAgdGhhdCwgd2hlbiBuZWNlc3NhcnkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgZmxhZyBpcyBlZmZlY3RpdmUgb25seSB3aGVuIGNhbGxpbmcgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJJbml0aWFsaXplKHN0cmluZykiLz4uIE5vcm1hbGx5IHlvdSB3b3VsZCByZWFkIGEgWmlwRmlsZSB3aXRoIHRoZQorICAgICAgICAvLy8gICBzdGF0aWMgPHNlZSBjcmVmPSJaaXBGaWxlLlJlYWQoU3RyaW5nKSI+WmlwRmlsZS5SZWFkPC9zZWU+CisgICAgICAgIC8vLyAgIG1ldGhvZC4gQnV0IHlvdSBjYW4ndCBzZXQgdGhlIDxjPkZ1bGxTY2FuPC9jPiBwcm9wZXJ0eSBvbiB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2Ugd2hlbiB5b3UgdXNlIGEgc3RhdGljIGZhY3RvcnkgbWV0aG9kIGxpa2UKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZS5SZWFkPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHJlYWQgYSB6aXAgZmlsZSB1c2luZyB0aGUgZnVsbCBzY2FuIGFwcHJvYWNoLAorICAgICAgICAvLy8gICBhbmQgdGhlbiBzYXZlIGl0LCB0aGVyZWJ5IHByb2R1Y2luZyBhIGNvcnJlY3RlZCB6aXAgZmlsZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB1c2luZyAodmFyIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgemlwLkZ1bGxTY2FuID0gdHJ1ZTsKKyAgICAgICAgLy8vICAgICB6aXAuSW5pdGlhbGl6ZSh6aXBGaWxlTmFtZSk7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUobmV3TmFtZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIE5ldyBaaXBGaWxlCisgICAgICAgIC8vLyAgICAgemlwLkZ1bGxTY2FuID0gVHJ1ZQorICAgICAgICAvLy8gICAgIHppcC5Jbml0aWFsaXplKHppcEZpbGVOYW1lKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKG5ld05hbWUpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBib29sIEZ1bGxTY2FuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBXaGV0aGVyIHRvIHNvcnQgdGhlIFppcEVudHJpZXMgYmVmb3JlIHNhdmluZyB0aGUgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuICBJZiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiB6aXAgZW50cmllcywgdGhlIHNvcnQKKyAgICAgICAgLy8vICAgYWxvbmUgY2FuIGNvbnN1bWUgc2lnbmlmaWNhbnQgdGltZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHVzaW5nICh2YXIgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZXMoZmlsZXNUb0FkZCk7CisgICAgICAgIC8vLyAgICAgemlwLlNvcnRFbnRyaWVzQmVmb3JlU2F2aW5nID0gdHJ1ZTsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZShuYW1lKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZXMoZmlsZXNUb0FkZCkKKyAgICAgICAgLy8vICAgICB6aXAuU29ydEVudHJpZXNCZWZvcmVTYXZpbmcgPSBUcnVlCisgICAgICAgIC8vLyAgICAgemlwLlNhdmUobmFtZSkKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIGJvb2wgU29ydEVudHJpZXNCZWZvcmVTYXZpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgSW5kaWNhdGVzIHdoZXRoZXIgTlRGUyBSZXBhcnNlIFBvaW50cywgbGlrZSBqdW5jdGlvbnMsIHNob3VsZCBiZQorICAgICAgICAvLy8gICB0cmF2ZXJzZWQgZHVyaW5nIGNhbGxzIHRvIDxjPkFkZERpcmVjdG9yeSgpPC9jPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgQnkgZGVmYXVsdCwgY2FsbHMgdG8gQWRkRGlyZWN0b3J5KCkgd2lsbCB0cmF2ZXJzZSBOVEZTIHJlcGFyc2UKKyAgICAgICAgLy8vICAgcG9pbnRzLCBsaWtlIG1vdW50ZWQgdm9sdW1lcywgYW5kIGRpcmVjdG9yeSBqdW5jdGlvbnMuICBBbiBleGFtcGxlCisgICAgICAgIC8vLyAgIG9mIGEganVuY3Rpb24gaXMgdGhlICJNeSBNdXNpYyIgZGlyZWN0b3J5IGluIFdpbmRvd3MgVmlzdGEuICBJbiBzb21lCisgICAgICAgIC8vLyAgIGNhc2VzIHlvdSBtYXkgbm90IHdhbnQgRG90TmV0WmlwIHRvIHRyYXZlcnNlIHRob3NlIGRpcmVjdG9yaWVzLiAgSW4KKyAgICAgICAgLy8vICAgdGhhdCBjYXNlLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHVzaW5nICh2YXIgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRGlyZWN0b3J5V2lsbFRyYXZlcnNlUmVwYXJzZVBvaW50cyA9IGZhbHNlOworICAgICAgICAvLy8gICAgIHppcC5BZGREaXJlY3RvcnkoZGlyVG9aaXAsImZvZGRlciIpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKHppcEZpbGVUb0NyZWF0ZSk7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIHB1YmxpYyBib29sIEFkZERpcmVjdG9yeVdpbGxUcmF2ZXJzZVJlcGFyc2VQb2ludHMgeyBnZXQ7IHNldDsgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTaXplIG9mIHRoZSBJTyBidWZmZXIgdXNlZCB3aGlsZSBzYXZpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZpcnN0LCBsZXQgbWUgc2F5IHRoYXQgeW91IHJlYWxseSBkb24ndCBuZWVkIHRvIGJvdGhlciB3aXRoIHRoaXMuICBJdCBpcworICAgICAgICAvLy8gICBoZXJlIHRvIGFsbG93IGZvciBvcHRpbWl6YXRpb25zIHRoYXQgeW91IHByb2JhYmx5IHdvbid0IG1ha2UhIEl0IHdpbGwgd29yaworICAgICAgICAvLy8gICBmaW5lIGlmIHlvdSBkb24ndCBzZXQgb3IgZ2V0IHRoaXMgcHJvcGVydHkgYXQgYWxsLiBPaz8KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgTm93IHRoYXQgd2UgaGF2ZSA8ZW0+dGhhdDwvZW0+IG91dCBvZiB0aGUgd2F5LCB0aGUgZmluZSBwcmludDogVGhpcworICAgICAgICAvLy8gICBwcm9wZXJ0eSBhZmZlY3RzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCBpcyB1c2VkIGZvciBJL08gZm9yIGVhY2gKKyAgICAgICAgLy8vICAgZW50cnkgY29udGFpbmVkIGluIHRoZSB6aXAgZmlsZS4gV2hlbiBhIGZpbGUgaXMgcmVhZCBpbiB0byBiZSBjb21wcmVzc2VkLAorICAgICAgICAvLy8gICBpdCB1c2VzIGEgYnVmZmVyIGdpdmVuIGJ5IHRoZSBzaXplIGhlcmUuICBXaGVuIHlvdSB1cGRhdGUgYSB6aXAgZmlsZSwgdGhlCisgICAgICAgIC8vLyAgIGRhdGEgZm9yIHVubW9kaWZpZWQgZW50cmllcyBpcyBjb3BpZWQgZnJvbSB0aGUgZmlyc3QgemlwIGZpbGUgdG8gdGhlCisgICAgICAgIC8vLyAgIG90aGVyLCB0aHJvdWdoIGEgYnVmZmVyIGdpdmVuIGJ5IHRoZSBzaXplIGhlcmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIENoYW5naW5nIHRoZSBidWZmZXIgc2l6ZSBhZmZlY3RzIGEgZmV3IHRoaW5nczogZmlyc3QsIGZvciBsYXJnZXIgYnVmZmVyCisgICAgICAgIC8vLyAgIHNpemVzLCB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIDxjPlppcEZpbGU8L2M+LCBvYnZpb3VzbHksIHdpbGwgYmUgbGFyZ2VyCisgICAgICAgIC8vLyAgIGR1cmluZyBJL08gb3BlcmF0aW9ucy4gIFRoaXMgbWF5IG1ha2Ugb3BlcmF0aW9ucyBmYXN0ZXIgZm9yIHZlcnkgbXVjaAorICAgICAgICAvLy8gICBsYXJnZXIgZmlsZXMuICBMYXN0LCBmb3IgYW55IGdpdmVuIGVudHJ5LCB3aGVuIHlvdSB1c2UgYSBsYXJnZXIgYnVmZmVyCisgICAgICAgIC8vLyAgIHRoZXJlIHdpbGwgYmUgZmV3ZXIgcHJvZ3Jlc3MgZXZlbnRzIGR1cmluZyBJL08gb3BlcmF0aW9ucywgYmVjYXVzZSB0aGVyZSdzCisgICAgICAgIC8vLyAgIG9uZSBwcm9ncmVzcyBldmVudCBnZW5lcmF0ZWQgZm9yIGVhY2ggdGltZSB0aGUgYnVmZmVyIGlzIGZpbGxlZCBhbmQgdGhlbgorICAgICAgICAvLy8gICBlbXB0aWVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgZGVmYXVsdCBidWZmZXIgc2l6ZSBpcyA4ay4gIEluY3JlYXNpbmcgdGhlIGJ1ZmZlciBzaXplIG1heSBzcGVlZAorICAgICAgICAvLy8gICB0aGluZ3MgdXAgYXMgeW91IGNvbXByZXNzIGxhcmdlciBmaWxlcy4gIEJ1dCB0aGVyZSBhcmUgbm8gaGFyZC1hbmQtZmFzdAorICAgICAgICAvLy8gICBydWxlcyBoZXJlLCBlaD8gIFlvdSB3b24ndCBrbm93IHRpbCB5b3UgdGVzdCBpdC4gIEFuZCB0aGVyZSB3aWxsIGJlIGEKKyAgICAgICAgLy8vICAgbGltaXQgd2hlcmUgZXZlciBsYXJnZXIgYnVmZmVycyBhY3R1YWxseSBzbG93IHRoaW5ncyBkb3duLiAgU28gYXMgSSBzYWlkCisgICAgICAgIC8vLyAgIGluIHRoZSBiZWdpbm5pbmcsIGl0J3MgcHJvYmFibHkgYmVzdCBpZiB5b3UgZG9uJ3Qgc2V0IG9yIGdldCB0aGlzIHByb3BlcnR5CisgICAgICAgIC8vLyAgIGF0IGFsbC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBtaWdodCBzZXQgYSBsYXJnZSBidWZmZXIgc2l6ZSBmb3IgZWZmaWNpZW5jeSB3aGVuCisgICAgICAgIC8vLyBkZWFsaW5nIHdpdGggemlwIGVudHJpZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gMWdiLgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZVByb2dyZXNzICs9IHRoaXMuemlwMV9TYXZlUHJvZ3Jlc3M7CisgICAgICAgIC8vLyAgICAgemlwLkFkZERpcmVjdG9yeShkaXJlY3RvcnlUb1ppcCwgIiIpOworICAgICAgICAvLy8gICAgIHppcC5Vc2VaaXA2NFdoZW5TYXZpbmcgPSBaaXA2NE9wdGlvbi5BbHdheXM7CisgICAgICAgIC8vLyAgICAgemlwLkJ1ZmZlclNpemUgPSA2NTUzNio4OyAvLyA2NTUzNiAqIDggPSA1MTJrCisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoWmlwRmlsZVRvQ3JlYXRlKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKworICAgICAgICBwdWJsaWMgaW50IEJ1ZmZlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9CdWZmZXJTaXplOyB9CisgICAgICAgICAgICBzZXQgeyBfQnVmZmVyU2l6ZSA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNpemUgb2YgdGhlIHdvcmsgYnVmZmVyIHRvIHVzZSBmb3IgdGhlIFpMSUIgY29kZWMgZHVyaW5nIGNvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBXaGVuIGRvaW5nIFpMSUIgb3IgRGVmbGF0ZSBjb21wcmVzc2lvbiwgdGhlIGxpYnJhcnkgZmlsbHMgYSBidWZmZXIsCisgICAgICAgIC8vLyAgICAgdGhlbiBwYXNzZXMgaXQgdG8gdGhlIGNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uLiBUaGVuIHRoZSBsaWJyYXJ5CisgICAgICAgIC8vLyAgICAgcmVhZHMgb3V0IHRoZSBjb21wcmVzc2VkIGJ5dGVzLiBUaGlzIGhhcHBlbnMgcmVwZWF0ZWRseSB1bnRpbCB0aGVyZQorICAgICAgICAvLy8gICAgIGlzIG5vIG1vcmUgdW5jb21wcmVzc2VkIGRhdGEgdG8gY29tcHJlc3MuIFRoaXMgcHJvcGVydHkgc2V0cyB0aGUKKyAgICAgICAgLy8vICAgICBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGNodW5rLXdpc2UgY29tcHJlc3Npb24uIEluCisgICAgICAgIC8vLyAgICAgb3JkZXIgZm9yIHRoZSBzZXR0aW5nIHRvIHRha2UgZWZmZWN0LCB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHNldAorICAgICAgICAvLy8gICAgIHRoaXMgcHJvcGVydHkgYmVmb3JlIGNhbGxpbmcgb25lIG9mIHRoZSA8Yz5aaXBGaWxlLlNhdmUoKTwvYz4KKyAgICAgICAgLy8vICAgICBvdmVybG9hZHMuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgU2V0dGluZyB0aGlzIGFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgZWZmaWNpZW5jeSBvZgorICAgICAgICAvLy8gICAgIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLiBGb3IgbGFyZ2VyIGZpbGVzLCBzZXR0aW5nIHRoaXMgdG8gYQorICAgICAgICAvLy8gICAgIGxhcmdlciBzaXplIG1heSBpbXByb3ZlIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlLCBidXQgdGhlIGV4YWN0CisgICAgICAgIC8vLyAgICAgbnVtYmVycyB2YXJ5IGRlcGVuZGluZyBvbiBhdmFpbGFibGUgbWVtb3J5LCB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtcworICAgICAgICAvLy8gICAgIHlvdSBhcmUgY29tcHJlc3NpbmcsIGFuZCBhIGJ1bmNoIG9mIG90aGVyIHZhcmlhYmxlcy4gSSBkb24ndCBoYXZlCisgICAgICAgIC8vLyAgICAgZ29vZCBmaXJtIHJlY29tbWVuZGF0aW9ucyBvbiBob3cgdG8gc2V0IGl0LiAgWW91J2xsIGhhdmUgdG8gdGVzdCBpdAorICAgICAgICAvLy8gICAgIHlvdXJzZWxmLiBPciBqdXN0IGxlYXZlIGl0IGFsb25lIGFuZCBhY2NlcHQgdGhlIGRlZmF1bHQuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGludCBDb2RlY0J1ZmZlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciBleHRyYWN0ZWQgZmlsZXMgc2hvdWxkIGtlZXAgdGhlaXIgcGF0aHMgYXMKKyAgICAgICAgLy8vICAgc3RvcmVkIGluIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIFRoaXMgcHJvcGVydHkgYWZmZWN0cyBFeHRyYWN0aW9uLiAgSXQgaXMgbm90IHVzZWQgd2hlbiBjcmVhdGluZyB6aXAKKyAgICAgICAgLy8vICAgIGFyY2hpdmVzLgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBXaXRoIHRoaXMgcHJvcGVydHkgc2V0IHRvIDxjPmZhbHNlPC9jPiwgdGhlIGRlZmF1bHQsIGV4dHJhY3RpbmcgZW50cmllcworICAgICAgICAvLy8gICAgZnJvbSBhIHppcCBmaWxlIHdpbGwgY3JlYXRlIGZpbGVzIGluIHRoZSBmaWxlc3lzdGVtIHRoYXQgaGF2ZSB0aGUgZnVsbAorICAgICAgICAvLy8gICAgcGF0aCBhc3NvY2lhdGVkIHRvIHRoZSBlbnRyeSB3aXRoaW4gdGhlIHppcCBmaWxlLiAgV2l0aCB0aGlzIHByb3BlcnR5IHNldAorICAgICAgICAvLy8gICAgdG8gPGM+dHJ1ZTwvYz4sIGV4dHJhY3RpbmcgZW50cmllcyBmcm9tIHRoZSB6aXAgZmlsZSByZXN1bHRzIGluIGZpbGVzCisgICAgICAgIC8vLyAgICB3aXRoIG5vIHBhdGg6IHRoZSBmb2xkZXJzIGFyZSAiZmxhdHRlbmVkLiIKKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgQW4gZXhhbXBsZTogc3VwcG9zZSB0aGUgemlwIGZpbGUgY29udGFpbnMgZW50cmllcyAvZGlyZWN0b3J5MS9maWxlMS50eHQgYW5kCisgICAgICAgIC8vLyAgICAvZGlyZWN0b3J5Mi9maWxlMi50eHQuICBXaXRoIDxjPkZsYXR0ZW5Gb2xkZXJzT25FeHRyYWN0PC9jPiBzZXQgdG8gZmFsc2UsCisgICAgICAgIC8vLyAgICB0aGUgZmlsZXMgY3JlYXRlZCB3aWxsIGJlIFxkaXJlY3RvcnkxXGZpbGUxLnR4dCBhbmQgXGRpcmVjdG9yeTJcZmlsZTIudHh0LgorICAgICAgICAvLy8gICAgV2l0aCB0aGUgcHJvcGVydHkgc2V0IHRvIHRydWUsIHRoZSBmaWxlcyBjcmVhdGVkIGFyZSBmaWxlMS50eHQgYW5kIGZpbGUyLnR4dC4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgYm9vbCBGbGF0dGVuRm9sZGVyc09uRXh0cmFjdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGNvbXByZXNzaW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgYWxsIGVudHJpZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFNldCB0aGUgU3RyYXRlZ3kgdXNlZCBieSB0aGUgWkxJQi1jb21wYXRpYmxlIGNvbXByZXNzb3IsIHdoZW4KKyAgICAgICAgLy8vICAgY29tcHJlc3NpbmcgZW50cmllcyB1c2luZyB0aGUgREVGTEFURSBtZXRob2QuIERpZmZlcmVudCBjb21wcmVzc2lvbgorICAgICAgICAvLy8gICBzdHJhdGVnaWVzIHdvcmsgYmV0dGVyIG9uIGRpZmZlcmVudCBzb3J0cyBvZiBkYXRhLiBUaGUgc3RyYXRlZ3kKKyAgICAgICAgLy8vICAgcGFyYW1ldGVyIGNhbiBhZmZlY3QgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGFuZCB0aGUgc3BlZWQgb2YKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzc2lvbi4gIEZvciBtb3JlCisgICAgICAgIC8vLyAgIGluZm9ybWF0aW9uIHNlZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IklvbmljLlpsaWIuQ29tcHJlc3Npb25TdHJhdGVneSI+SW9uaWMuWmxpYi5Db21wcmVzc2lvblN0cmF0ZWd5PC9zZWU+LgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25TdHJhdGVneSBTdHJhdGVneQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX1N0cmF0ZWd5OyB9CisgICAgICAgICAgICBzZXQgeyBfU3RyYXRlZ3kgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lIG9mIHRoZSA8Yz5aaXBGaWxlPC9jPiwgb24gZGlzay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiB0aGUgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgYnkgcmVhZGluZyBhbiBhcmNoaXZlIHVzaW5nCisgICAgICAgIC8vLyAgIG9uZSBvZiB0aGUgPGM+WmlwRmlsZS5SZWFkPC9jPiBtZXRob2RzLCB0aGlzIHByb3BlcnR5IHJlcHJlc2VudHMgdGhlIG5hbWUKKyAgICAgICAgLy8vICAgb2YgdGhlIHppcCBmaWxlIHRoYXQgd2FzIHJlYWQuICBXaGVuIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSB3YXMKKyAgICAgICAgLy8vICAgY3JlYXRlZCBieSB1c2luZyB0aGUgbm8tYXJndW1lbnQgY29uc3RydWN0b3IsIHRoaXMgdmFsdWUgaXMgPGM+bnVsbDwvYz4KKyAgICAgICAgLy8vICAgKDxjPk5vdGhpbmc8L2M+IGluIFZCKS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgeW91IHVzZSB0aGUgbm8tYXJndW1lbnQgY29uc3RydWN0b3IsIGFuZCB5b3UgdGhlbiBleHBsaWNpdGx5IHNldCB0aGlzCisgICAgICAgIC8vLyAgIHByb3BlcnR5LCB3aGVuIHlvdSBjYWxsIDxzZWUgY3JlZj0iWmlwRmlsZS5TYXZlKCkiLz4sIHRoaXMgbmFtZSB3aWxsCisgICAgICAgIC8vLyAgIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIGNyZWF0ZWQuICBEb2luZyBzbyBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgIC8vLyAgIGNhbGxpbmcgPHNlZSBjcmVmPSJaaXBGaWxlLlNhdmUoU3RyaW5nKSIvPi4gIFdoZW4gaW5zdGFudGlhdGluZyBhCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+IGJ5IHJlYWRpbmcgZnJvbSBhIHN0cmVhbSBvciBieXRlIGFycmF5LCB0aGUgPGM+TmFtZTwvYz4KKyAgICAgICAgLy8vICAgcHJvcGVydHkgcmVtYWlucyA8Yz5udWxsPC9jPi4gIFdoZW4gc2F2aW5nIHRvIGEgc3RyZWFtLCB0aGUgPGM+TmFtZTwvYz4KKyAgICAgICAgLy8vICAgcHJvcGVydHkgaXMgaW1wbGljaXRseSBzZXQgdG8gPGM+bnVsbDwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX25hbWU7IH0KKyAgICAgICAgICAgIHNldCB7IF9uYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTZXRzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byBiZSB1c2VkIGZvciBlbnRyaWVzIHN1YnNlcXVlbnRseSBhZGRlZCB0bworICAgICAgICAvLy8gICB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBWYXJ5aW5nIHRoZSBjb21wcmVzc2lvbiBsZXZlbCB1c2VkIG9uIGVudHJpZXMgY2FuIGFmZmVjdCB0aGUKKyAgICAgICAgLy8vICAgIHNpemUtdnMtc3BlZWQgdHJhZGVvZmYgd2hlbiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2luZyBkYXRhIHN0cmVhbXMKKyAgICAgICAgLy8vICAgIG9yIGZpbGVzLgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBBcyB3aXRoIHNvbWUgb3RoZXIgcHJvcGVydGllcyBvbiB0aGUgPGM+WmlwRmlsZTwvYz4gY2xhc3MsIGxpa2UgPHNlZQorICAgICAgICAvLy8gICAgY3JlZj0iUGFzc3dvcmQiLz4sIDxzZWUgY3JlZj0iRW5jcnlwdGlvbiIvPiwgYW5kIDxzZWUKKyAgICAgICAgLy8vICAgIGNyZWY9IlppcEVycm9yQWN0aW9uIi8+LCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb24gYSA8Yz5aaXBGaWxlPC9jPgorICAgICAgICAvLy8gICAgaW5zdGFuY2Ugd2lsbCBjYXVzZSB0aGUgc3BlY2lmaWVkIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+IHRvIGJlIHVzZWQgb24gYWxsCisgICAgICAgIC8vLyAgICA8c2VlIGNyZWY9IlppcEVudHJ5Ii8+IGl0ZW1zIHRoYXQgYXJlIHN1YnNlcXVlbnRseSBhZGRlZCB0byB0aGUKKyAgICAgICAgLy8vICAgIDxjPlppcEZpbGU8L2M+IGluc3RhbmNlLiBJZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgYWZ0ZXIgeW91IGhhdmUgYWRkZWQKKyAgICAgICAgLy8vICAgIGl0ZW1zIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiwgYnV0IGJlZm9yZSB5b3UgaGF2ZSBjYWxsZWQgPGM+U2F2ZSgpPC9jPiwKKyAgICAgICAgLy8vICAgIHRob3NlIGl0ZW1zIHdpbGwgbm90IHVzZSB0aGUgc3BlY2lmaWVkIGNvbXByZXNzaW9uIGxldmVsLgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBJZiB5b3UgZG8gbm90IHNldCB0aGlzIHByb3BlcnR5LCB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCBpcyB1c2VkLAorICAgICAgICAvLy8gICAgd2hpY2ggbm9ybWFsbHkgZ2l2ZXMgYSBnb29kIGJhbGFuY2Ugb2YgY29tcHJlc3Npb24gZWZmaWNpZW5jeSBhbmQKKyAgICAgICAgLy8vICAgIGNvbXByZXNzaW9uIHNwZWVkLiAgSW4gc29tZSB0ZXN0cywgdXNpbmcgPGM+QmVzdENvbXByZXNzaW9uPC9jPiBjYW4KKyAgICAgICAgLy8vICAgIGRvdWJsZSB0aGUgdGltZSBpdCB0YWtlcyB0byBjb21wcmVzcywgd2hpbGUgZGVsaXZlcmluZyBqdXN0IGEgc21hbGwKKyAgICAgICAgLy8vICAgIGluY3JlYXNlIGluIGNvbXByZXNzaW9uIGVmZmljaWVuY3kuICBUaGlzIGJlaGF2aW9yIHdpbGwgdmFyeSB3aXRoIHRoZQorICAgICAgICAvLy8gICAgdHlwZSBvZiBkYXRhIHlvdSBjb21wcmVzcy4gIElmIHlvdSBhcmUgaW4gZG91YnQsIGp1c3QgbGVhdmUgdGhpcyBzZXR0aW5nCisgICAgICAgIC8vLyAgICBhbG9uZSwgYW5kIGFjY2VwdCB0aGUgZGVmYXVsdC4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwgQ29tcHJlc3Npb25MZXZlbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIHRoZSB6aXBmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIEJ5IGRlZmF1bHQsIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgPGM+Q29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZS48L2M+CisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5Db21wcmVzc2lvbk1ldGhvZCIgLz4KKyAgICAgICAgaW50ZXJuYWwgSW9uaWMuWmlwLkNvbXByZXNzaW9uTWV0aG9kIENvbXByZXNzaW9uTWV0aG9kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29tcHJlc3Npb25NZXRob2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29tcHJlc3Npb25NZXRob2QgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEEgY29tbWVudCBhdHRhY2hlZCB0byB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgaXMgcmVhZC93cml0ZS4gSXQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzcGVjaWZ5IGEKKyAgICAgICAgLy8vICAgY29tbWVudCBmb3IgdGhlIDxjPlppcEZpbGU8L2M+LCBvciByZWFkIHRoZSBjb21tZW50IGZvciB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4uICBBZnRlciBzZXR0aW5nIHRoaXMgcHJvcGVydHksIGNoYW5nZXMgYXJlIG9ubHkgbWFkZQorICAgICAgICAvLy8gICBwZXJtYW5lbnQgd2hlbiB5b3UgY2FsbCBhIDxjPlNhdmUoKTwvYz4gbWV0aG9kLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBY2NvcmRpbmcgdG8gPHNlZQorICAgICAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5QS1dBUkUncworICAgICAgICAvLy8gICB6aXAgc3BlY2lmaWNhdGlvbjwvc2VlPiwgdGhlIGNvbW1lbnQgaXMgbm90IGVuY3J5cHRlZCwgZXZlbiBpZiB0aGVyZSBpcyBhCisgICAgICAgIC8vLyAgIHBhc3N3b3JkIHNldCBvbiB0aGUgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlc2NyaWJlIGhvdyB0byBpbmRpY2F0ZSB0aGUgZW5jb2RpbmcgdXNlZAorICAgICAgICAvLy8gICBvbiBhIGNvbW1lbnQgc3RyaW5nLiBNYW55ICJjb21wbGlhbnQiIHppcCB0b29scyBhbmQgbGlicmFyaWVzIHVzZQorICAgICAgICAvLy8gICBJQk00MzcgYXMgdGhlIGNvZGUgcGFnZSBmb3IgY29tbWVudHM7IERvdE5ldFppcCwgdG9vLCBmb2xsb3dzIHRoYXQKKyAgICAgICAgLy8vICAgcHJhY3RpY2UuICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgeW91IHdhbnQgYQorICAgICAgICAvLy8gICBDb21tZW50IHRvIGJlIGVuY29kZWQgd2l0aCBzb21ldGhpbmcgZWxzZSwgZm9yIGV4YW1wbGUgdXNpbmcgY29kZSBwYWdlCisgICAgICAgIC8vLyAgIDk1MCAiQmlnLTUgQ2hpbmVzZSIuIFRvIGZpbGwgdGhhdCBuZWVkLCBEb3ROZXRaaXAgd2lsbCBlbmNvZGUgdGhlCisgICAgICAgIC8vLyAgIGNvbW1lbnQgZm9sbG93aW5nIHRoZSBzYW1lIHByb2NlZHVyZSBpdCBmb2xsb3dzIGZvciBlbmNvZGluZworICAgICAgICAvLy8gICBmaWxlbmFtZXM6IChhKSBpZiA8c2VlIGNyZWY9IkFsdGVybmF0ZUVuY29kaW5nVXNhZ2UiLz4gaXMKKyAgICAgICAgLy8vICAgPGM+TmV2ZXI8L2M+LCBpdCB1c2VzIHRoZSBkZWZhdWx0IGVuY29kaW5nIChJQk00MzcpLiAoYikgaWYgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+IGlzIDxjPkFsd2F5czwvYz4sIGl0IGFsd2F5cyB1c2VzIHRoZQorICAgICAgICAvLy8gICBhbHRlcm5hdGUgZW5jb2RpbmcgKDxzZWUgY3JlZj0iQWx0ZXJuYXRlRW5jb2RpbmciLz4pLiAoYykgaWYgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+IGlzIDxjPkFzTmVjZXNzYXJ5PC9jPiwgaXQgdXNlcyB0aGUKKyAgICAgICAgLy8vICAgYWx0ZXJuYXRlIGVuY29kaW5nIG9ubHkgaWYgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgbm90IHN1ZmZpY2llbnQgZm9yCisgICAgICAgIC8vLyAgIGVuY29kaW5nIHRoZSBjb21tZW50IC0gaW4gb3RoZXIgd29yZHMgaWYgZGVjb2RpbmcgdGhlIHJlc3VsdCBkb2VzIG5vdAorICAgICAgICAvLy8gICBwcm9kdWNlIHRoZSBvcmlnaW5hbCBzdHJpbmcuICBUaGlzIGRlY2lzaW9uIGlzIHRha2VuIGF0IHRoZSB0aW1lIG9mCisgICAgICAgIC8vLyAgIHRoZSBjYWxsIHRvIDxjPlppcEZpbGUuU2F2ZSgpPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBjcmVhdGluZyBhIHppcCBhcmNoaXZlIHVzaW5nIHRoaXMgbGlicmFyeSwgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlCisgICAgICAgIC8vLyAgIHRoZSB2YWx1ZSBvZiA8c2VlIGNyZWY9IkFsdGVybmF0ZUVuY29kaW5nIiAvPiBiZXR3ZWVuIGVhY2gKKyAgICAgICAgLy8vICAgZW50cnkgeW91IGFkZCwgYW5kIGJldHdlZW4gYWRkaW5nIGVudHJpZXMgYW5kIHRoZSBjYWxsIHRvCisgICAgICAgIC8vLyAgIDxjPlNhdmUoKTwvYz4uIERvbid0IGRvIHRoaXMuICBJdCB3aWxsIGxpa2VseSByZXN1bHQgaW4gYSB6aXAgZmlsZSB0aGF0IGlzCisgICAgICAgIC8vLyAgIG5vdCByZWFkYWJsZSBieSBhbnkgdG9vbCBvciBhcHBsaWNhdGlvbi4gIEZvciBiZXN0IGludGVyb3BlcmFiaWxpdHksIGxlYXZlCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iQWx0ZXJuYXRlRW5jb2RpbmciLz4gYWxvbmUsIG9yIHNwZWNpZnkgaXQgb25seQorICAgICAgICAvLy8gICBvbmNlLCBiZWZvcmUgYWRkaW5nIGFueSBlbnRyaWVzIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29tbWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0NvbW1lbnQ7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9Db21tZW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX2NvbnRlbnRzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBDcmVhdGlvbiwgQWNjZXNzLCBhbmQgTW9kaWZpZWQgdGltZXMgZm9yIGVudHJpZXMKKyAgICAgICAgLy8vICAgYWRkZWQgdG8gdGhlIHppcCBmaWxlIHdpbGwgYmUgZW1pdHRlZCBpbiAmIzE0NztXaW5kb3dzIGZvcm1hdCYjMTQ4OworICAgICAgICAvLy8gICB3aGVuIHRoZSB6aXAgYXJjaGl2ZSBpcyBzYXZlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBbiBhcHBsaWNhdGlvbiBjcmVhdGluZyBhIHppcCBhcmNoaXZlIGNhbiB1c2UgdGhpcyBmbGFnIHRvIGV4cGxpY2l0bHkKKyAgICAgICAgLy8vICAgc3BlY2lmeSB0aGF0IHRoZSBmaWxlIHRpbWVzIGZvciB0aGUgZW50cmllcyBzaG91bGQgb3Igc2hvdWxkIG5vdCBiZSBzdG9yZWQKKyAgICAgICAgLy8vICAgaW4gdGhlIHppcCBhcmNoaXZlIGluIHRoZSBmb3JtYXQgdXNlZCBieSBXaW5kb3dzLiBCeSBkZWZhdWx0IHRoaXMgZmxhZyBpcworICAgICAgICAvLy8gICA8Yz50cnVlPC9jPiwgbWVhbmluZyB0aGUgV2luZG93cy1mb3JtYXQgdGltZXMgYXJlIHN0b3JlZCBpbiB0aGUgemlwCisgICAgICAgIC8vLyAgIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gYWRkaW5nIGFuIGVudHJ5IGZyb20gYSBmaWxlIG9yIGRpcmVjdG9yeSwgdGhlIENyZWF0aW9uICg8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5LkNyZWF0aW9uVGltZSIvPiksIEFjY2VzcyAoPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5BY2Nlc3NlZFRpbWUiLz4pLCBhbmQgTW9kaWZpZWQgKDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuTW9kaWZpZWRUaW1lIi8+KSB0aW1lcyBmb3IgdGhlIGdpdmVuIGVudHJ5IGFyZQorICAgICAgICAvLy8gICBhdXRvbWF0aWNhbGx5IHNldCBmcm9tIHRoZSBmaWxlc3lzdGVtIHZhbHVlcy4gV2hlbiBhZGRpbmcgYW4gZW50cnkgZnJvbSBhCisgICAgICAgIC8vLyAgIHN0cmVhbSBvciBzdHJpbmcsIGFsbCB0aHJlZSB2YWx1ZXMgYXJlIGltcGxpY2l0bHkgc2V0IHRvCisgICAgICAgIC8vLyAgIDxjPkRhdGVUaW1lLk5vdzwvYz4uICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gZXhwbGljaXRseSBzZXQgdGhvc2UgdGltZXMgYnkKKyAgICAgICAgLy8vICAgY2FsbGluZyA8c2VlIGNyZWY9IlppcEVudHJ5LlNldEVudHJ5VGltZXMoRGF0ZVRpbWUsIERhdGVUaW1lLAorICAgICAgICAvLy8gICBEYXRlVGltZSkiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXQVJFJ3MKKyAgICAgICAgLy8vICAgemlwIHNwZWNpZmljYXRpb248L3NlZT4gZGVzY3JpYmVzIG11bHRpcGxlIHdheXMgdG8gZm9ybWF0IHRoZXNlIHRpbWVzIGluIGEKKyAgICAgICAgLy8vICAgemlwIGZpbGUuIE9uZSBpcyB0aGUgZm9ybWF0IFdpbmRvd3MgYXBwbGljYXRpb25zIG5vcm1hbGx5IHVzZTogMTAwbnMgdGlja3MKKyAgICAgICAgLy8vICAgc2luY2UgSmFudWFyeSAxLCAxNjAxIFVUQy4gIFRoZSBvdGhlciBpcyBhIGZvcm1hdCBVbml4IGFwcGxpY2F0aW9ucyB0eXBpY2FsbHkKKyAgICAgICAgLy8vICAgdXNlOiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBVVEMuICBFYWNoIGZvcm1hdCBjYW4gYmUgc3RvcmVkIGluIGFuCisgICAgICAgIC8vLyAgICJleHRyYSBmaWVsZCIgaW4gdGhlIHppcCBlbnRyeSB3aGVuIHNhdmluZyB0aGUgemlwIGFyY2hpdmUuIFRoZSBmb3JtZXIKKyAgICAgICAgLy8vICAgdXNlcyBhbiBleHRyYSBmaWVsZCB3aXRoIGEgSGVhZGVyIElkIG9mIDB4MDAwQSwgd2hpbGUgdGhlIGxhdHRlciB1c2VzIGEKKyAgICAgICAgLy8vICAgaGVhZGVyIElEIG9mIDB4NTQ1NSwgYWx0aG91Z2ggeW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8ga25vdyB0aGF0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBOb3QgYWxsIHRvb2xzIGFuZCBsaWJyYXJpZXMgY2FuIGludGVycHJldCB0aGVzZSBmaWVsZHMuICBXaW5kb3dzCisgICAgICAgIC8vLyAgIGNvbXByZXNzZWQgZm9sZGVycyBpcyBvbmUgdGhhdCBjYW4gcmVhZCB0aGUgV2luZG93cyBGb3JtYXQgdGltZXN0YW1wcywKKyAgICAgICAgLy8vICAgd2hpbGUgSSBiZWxpZXZlIDxzZWUgaHJlZj0iaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvIj50aGUgSW5mb3ppcAorICAgICAgICAvLy8gICB0b29sczwvc2VlPiBjYW4gcmVhZCB0aGUgVW5peCBmb3JtYXQgdGltZXN0YW1wcy4gU29tZSB0b29scyBhbmQgbGlicmFyaWVzCisgICAgICAgIC8vLyAgIG1heSBiZSBhYmxlIHRvIHJlYWQgb25seSBvbmUgb3IgdGhlIG90aGVyLiBEb3ROZXRaaXAgY2FuIHJlYWQgb3Igd3JpdGUKKyAgICAgICAgLy8vICAgdGltZXMgaW4gZWl0aGVyIG9yIGJvdGggZm9ybWF0cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHRpbWVzIHN0b3JlZCBhcmUgdGFrZW4gZnJvbSA8c2VlIGNyZWY9IlppcEVudHJ5Lk1vZGlmaWVkVGltZSIvPiwgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5BY2Nlc3NlZFRpbWUiLz4sIGFuZCA8c2VlIGNyZWY9IlppcEVudHJ5LkNyZWF0aW9uVGltZSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHZhbHVlIHNldCBoZXJlIGFwcGxpZXMgdG8gYWxsIGVudHJpZXMgc3Vic2VxdWVudGx5IGFkZGVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBpcyBub3QgbXV0dWFsbHkgZXhjbHVzaXZlIG9mIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmciIC8+IHByb3BlcnR5LiBJdCBpcyBwb3NzaWJsZSBhbmQKKyAgICAgICAgLy8vICAgbGVnYWwgYW5kIHZhbGlkIHRvIHByb2R1Y2UgYSB6aXAgZmlsZSB0aGF0IGNvbnRhaW5zIHRpbWVzdGFtcHMgZW5jb2RlZCBpbgorICAgICAgICAvLy8gICB0aGUgVW5peCBmb3JtYXQgYXMgd2VsbCBhcyBpbiB0aGUgV2luZG93cyBmb3JtYXQsIGluIGFkZGl0aW9uIHRvIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5Lkxhc3RNb2RpZmllZCI+TGFzdE1vZGlmaWVkPC9zZWU+IHRpbWUgYXR0YWNoZWQgdG8gZWFjaAorICAgICAgICAvLy8gICBlbnRyeSBpbiB0aGUgYXJjaGl2ZSwgYSB0aW1lIHRoYXQgaXMgYWx3YXlzIHN0b3JlZCBpbiAiRE9TIGZvcm1hdCIuIEFuZCwKKyAgICAgICAgLy8vICAgbm90d2l0aHN0YW5kaW5nIHRoZSBuYW1lcyBQS1dhcmUgdXNlcyBmb3IgdGhlc2UgdGltZSBmb3JtYXRzLCBhbnkgb2YgdGhlbQorICAgICAgICAvLy8gICBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBieSBhbnkgY29tcHV0ZXIsIG9uIGFueSBvcGVyYXRpbmcgc3lzdGVtLiAgQnV0LAorICAgICAgICAvLy8gICB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyB0aGF0IGEgcHJvZ3JhbSBydW5uaW5nIG9uIE1hYyBvciBMaW51eCB3aWxsCisgICAgICAgIC8vLyAgIGdyYWNlZnVsbHkgaGFuZGxlIGEgemlwIGZpbGUgd2l0aCAiV2luZG93cyIgZm9ybWF0dGVkIHRpbWVzLCBvciB0aGF0IGFuCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uIHRoYXQgZG9lcyBub3QgdXNlIERvdE5ldFppcCBidXQgcnVucyBvbiBXaW5kb3dzIHdpbGwgYmUgYWJsZSB0bworICAgICAgICAvLy8gICBoYW5kbGUgZmlsZSB0aW1lcyBpbiBVbml4IGZvcm1hdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBpbiBkb3VidCwgdGVzdC4gIFNvcnJ5LCBJIGhhdmVuJ3QgZ290IGEgY29tcGxldGUgbGlzdCBvZiB0b29scyBhbmQKKyAgICAgICAgLy8vICAgd2hpY2ggc29ydCBvZiB0aW1lc3RhbXBzIHRoZXkgY2FuIHVzZSBhbmQgd2lsbCB0b2xlcmF0ZS4gIElmIHlvdSBnZXQgYW55CisgICAgICAgIC8vLyAgIGdvb2QgaW5mb3JtYXRpb24gYW5kIHdvdWxkIGxpa2UgdG8gcGFzcyBpdCBvbiwgcGxlYXNlIGRvIHNvIGFuZCBJIHdpbGwKKyAgICAgICAgLy8vICAgaW5jbHVkZSB0aGF0IGluZm9ybWF0aW9uIGluIHRoaXMgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBzYXZlIGEgemlwIGZpbGUgdGhhdCBjb250YWlucyBmaWxlIHRpbWVzdGFtcHMKKyAgICAgICAgLy8vICAgaW4gYSBmb3JtYXQgbm9ybWFsbHkgdXNlZCBieSBVbml4LgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gdXNpbmcgKHZhciB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIC8vIHByb2R1Y2UgYSB6aXAgZmlsZSB0aGUgTWFjIHdpbGwgbGlrZQorICAgICAgICAvLy8gICAgIHppcC5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nID0gZmFsc2U7CisgICAgICAgIC8vLyAgICAgemlwLkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmcgPSB0cnVlOworICAgICAgICAvLy8gICAgIHppcC5BZGREaXJlY3RvcnkoZGlyZWN0b3J5VG9aaXAsICJmaWxlcyIpOworICAgICAgICAvLy8gICAgIHppcC5TYXZlKG91dHB1dEZpbGUpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBOZXcgWmlwRmlsZQorICAgICAgICAvLy8gICAgICcnIHByb2R1Y2UgYSB6aXAgZmlsZSB0aGUgTWFjIHdpbGwgbGlrZQorICAgICAgICAvLy8gICAgIHppcC5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nID0gRmFsc2UKKyAgICAgICAgLy8vICAgICB6aXAuRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyA9IFRydWUKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRGlyZWN0b3J5KGRpcmVjdG9yeVRvWmlwLCAiZmlsZXMiKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKG91dHB1dEZpbGUpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBFbnRyeS5FbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIiAvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyIgLz4KKyAgICAgICAgcHVibGljIGJvb2wgRW1pdFRpbWVzSW5XaW5kb3dzRm9ybWF0V2hlblNhdmluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2VtaXROdGZzVGltZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZW1pdE50ZnNUaW1lcyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgQ3JlYXRpb24sIEFjY2VzcywgYW5kIE1vZGlmaWVkIHRpbWVzCisgICAgICAgIC8vLyBmb3IgZW50cmllcyBhZGRlZCB0byB0aGUgemlwIGZpbGUgd2lsbCBiZSBlbWl0dGVkIGluICJVbml4KHRtKQorICAgICAgICAvLy8gZm9ybWF0IiB3aGVuIHRoZSB6aXAgYXJjaGl2ZSBpcyBzYXZlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBbiBhcHBsaWNhdGlvbiBjcmVhdGluZyBhIHppcCBhcmNoaXZlIGNhbiB1c2UgdGhpcyBmbGFnIHRvIGV4cGxpY2l0bHkKKyAgICAgICAgLy8vICAgc3BlY2lmeSB0aGF0IHRoZSBmaWxlIHRpbWVzIGZvciB0aGUgZW50cmllcyBzaG91bGQgb3Igc2hvdWxkIG5vdCBiZSBzdG9yZWQKKyAgICAgICAgLy8vICAgaW4gdGhlIHppcCBhcmNoaXZlIGluIHRoZSBmb3JtYXQgdXNlZCBieSBVbml4LiBCeSBkZWZhdWx0IHRoaXMgZmxhZyBpcworICAgICAgICAvLy8gICA8Yz5mYWxzZTwvYz4sIG1lYW5pbmcgdGhlIFVuaXgtZm9ybWF0IHRpbWVzIGFyZSBub3Qgc3RvcmVkIGluIHRoZSB6aXAKKyAgICAgICAgLy8vICAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBhZGRpbmcgYW4gZW50cnkgZnJvbSBhIGZpbGUgb3IgZGlyZWN0b3J5LCB0aGUgQ3JlYXRpb24gKDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuQ3JlYXRpb25UaW1lIi8+KSwgQWNjZXNzICg8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5LkFjY2Vzc2VkVGltZSIvPiksIGFuZCBNb2RpZmllZCAoPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5Nb2RpZmllZFRpbWUiLz4pIHRpbWVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgYXJlCisgICAgICAgIC8vLyAgIGF1dG9tYXRpY2FsbHkgc2V0IGZyb20gdGhlIGZpbGVzeXN0ZW0gdmFsdWVzLiBXaGVuIGFkZGluZyBhbiBlbnRyeSBmcm9tIGEKKyAgICAgICAgLy8vICAgc3RyZWFtIG9yIHN0cmluZywgYWxsIHRocmVlIHZhbHVlcyBhcmUgaW1wbGljaXRseSBzZXQgdG8gRGF0ZVRpbWUuTm93LgorICAgICAgICAvLy8gICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gZXhwbGljaXRseSBzZXQgdGhvc2UgdGltZXMgYnkgY2FsbGluZyA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5LlNldEVudHJ5VGltZXMoRGF0ZVRpbWUsIERhdGVUaW1lLCBEYXRlVGltZSkiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXQVJFJ3MKKyAgICAgICAgLy8vICAgemlwIHNwZWNpZmljYXRpb248L3NlZT4gZGVzY3JpYmVzIG11bHRpcGxlIHdheXMgdG8gZm9ybWF0IHRoZXNlIHRpbWVzIGluIGEKKyAgICAgICAgLy8vICAgemlwIGZpbGUuIE9uZSBpcyB0aGUgZm9ybWF0IFdpbmRvd3MgYXBwbGljYXRpb25zIG5vcm1hbGx5IHVzZTogMTAwbnMgdGlja3MKKyAgICAgICAgLy8vICAgc2luY2UgSmFudWFyeSAxLCAxNjAxIFVUQy4gIFRoZSBvdGhlciBpcyBhIGZvcm1hdCBVbml4IGFwcGxpY2F0aW9ucworICAgICAgICAvLy8gICB0eXBpY2FsbHkgdXNlOiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCBVVEMuICBFYWNoIGZvcm1hdCBjYW4gYmUKKyAgICAgICAgLy8vICAgc3RvcmVkIGluIGFuICJleHRyYSBmaWVsZCIgaW4gdGhlIHppcCBlbnRyeSB3aGVuIHNhdmluZyB0aGUgemlwCisgICAgICAgIC8vLyAgIGFyY2hpdmUuIFRoZSBmb3JtZXIgdXNlcyBhbiBleHRyYSBmaWVsZCB3aXRoIGEgSGVhZGVyIElkIG9mIDB4MDAwQSwgd2hpbGUKKyAgICAgICAgLy8vICAgdGhlIGxhdHRlciB1c2VzIGEgaGVhZGVyIElEIG9mIDB4NTQ1NSwgYWx0aG91Z2ggeW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8vICAga25vdyB0aGF0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBOb3QgYWxsIHRvb2xzIGFuZCBsaWJyYXJpZXMgY2FuIGludGVycHJldCB0aGVzZSBmaWVsZHMuICBXaW5kb3dzCisgICAgICAgIC8vLyAgIGNvbXByZXNzZWQgZm9sZGVycyBpcyBvbmUgdGhhdCBjYW4gcmVhZCB0aGUgV2luZG93cyBGb3JtYXQgdGltZXN0YW1wcywKKyAgICAgICAgLy8vICAgd2hpbGUgSSBiZWxpZXZlIHRoZSA8c2VlIGhyZWY9Imh0dHA6Ly93d3cuaW5mby16aXAub3JnLyI+SW5mb3ppcDwvc2VlPgorICAgICAgICAvLy8gICB0b29scyBjYW4gcmVhZCB0aGUgVW5peCBmb3JtYXQgdGltZXN0YW1wcy4gU29tZSB0b29scyBhbmQgbGlicmFyaWVzIG1heSBiZQorICAgICAgICAvLy8gICBhYmxlIHRvIHJlYWQgb25seSBvbmUgb3IgdGhlIG90aGVyLiAgRG90TmV0WmlwIGNhbiByZWFkIG9yIHdyaXRlIHRpbWVzIGluCisgICAgICAgIC8vLyAgIGVpdGhlciBvciBib3RoIGZvcm1hdHMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSB0aW1lcyBzdG9yZWQgYXJlIHRha2VuIGZyb20gPHNlZSBjcmVmPSJaaXBFbnRyeS5Nb2RpZmllZFRpbWUiLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuQWNjZXNzZWRUaW1lIi8+LCBhbmQgPHNlZSBjcmVmPSJaaXBFbnRyeS5DcmVhdGlvblRpbWUiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgaXMgbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSBvZiB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJFbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIiAvPiBwcm9wZXJ0eS4gSXQgaXMgcG9zc2libGUgYW5kCisgICAgICAgIC8vLyAgIGxlZ2FsIGFuZCB2YWxpZCB0byBwcm9kdWNlIGEgemlwIGZpbGUgdGhhdCBjb250YWlucyB0aW1lc3RhbXBzIGVuY29kZWQgaW4KKyAgICAgICAgLy8vICAgdGhlIFVuaXggZm9ybWF0IGFzIHdlbGwgYXMgaW4gdGhlIFdpbmRvd3MgZm9ybWF0LCBpbiBhZGRpdGlvbiB0byB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5MYXN0TW9kaWZpZWQiPkxhc3RNb2RpZmllZDwvc2VlPiB0aW1lIGF0dGFjaGVkIHRvIGVhY2gKKyAgICAgICAgLy8vICAgZW50cnkgaW4gdGhlIHppcCBhcmNoaXZlLCBhIHRpbWUgdGhhdCBpcyBhbHdheXMgc3RvcmVkIGluICJET1MKKyAgICAgICAgLy8vICAgZm9ybWF0Ii4gQW5kLCBub3R3aXRoc3RhbmRpbmcgdGhlIG5hbWVzIFBLV2FyZSB1c2VzIGZvciB0aGVzZSB0aW1lCisgICAgICAgIC8vLyAgIGZvcm1hdHMsIGFueSBvZiB0aGVtIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGJ5IGFueSBjb21wdXRlciwgb24gYW55CisgICAgICAgIC8vLyAgIG9wZXJhdGluZyBzeXN0ZW0uICBCdXQsIHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIHRoYXQgYSBwcm9ncmFtIHJ1bm5pbmcgb24KKyAgICAgICAgLy8vICAgTWFjIG9yIExpbnV4IHdpbGwgZ3JhY2VmdWxseSBoYW5kbGUgYSB6aXAgZmlsZSB3aXRoICJXaW5kb3dzIiBmb3JtYXR0ZWQKKyAgICAgICAgLy8vICAgdGltZXMsIG9yIHRoYXQgYW4gYXBwbGljYXRpb24gdGhhdCBkb2VzIG5vdCB1c2UgRG90TmV0WmlwIGJ1dCBydW5zIG9uCisgICAgICAgIC8vLyAgIFdpbmRvd3Mgd2lsbCBiZSBhYmxlIHRvIGhhbmRsZSBmaWxlIHRpbWVzIGluIFVuaXggZm9ybWF0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIGluIGRvdWJ0LCB0ZXN0LiAgU29ycnksIEkgaGF2ZW4ndCBnb3QgYSBjb21wbGV0ZSBsaXN0IG9mIHRvb2xzIGFuZAorICAgICAgICAvLy8gICB3aGljaCBzb3J0IG9mIHRpbWVzdGFtcHMgdGhleSBjYW4gdXNlIGFuZCB3aWxsIHRvbGVyYXRlLiAgSWYgeW91IGdldCBhbnkKKyAgICAgICAgLy8vICAgZ29vZCBpbmZvcm1hdGlvbiBhbmQgd291bGQgbGlrZSB0byBwYXNzIGl0IG9uLCBwbGVhc2UgZG8gc28gYW5kIEkgd2lsbAorICAgICAgICAvLy8gICBpbmNsdWRlIHRoYXQgaW5mb3JtYXRpb24gaW4gdGhpcyBkb2N1bWVudGF0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkVtaXRUaW1lc0luVW5peEZvcm1hdFdoZW5TYXZpbmciIC8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFbWl0VGltZXNJbldpbmRvd3NGb3JtYXRXaGVuU2F2aW5nIiAvPgorICAgICAgICBwdWJsaWMgYm9vbCBFbWl0VGltZXNJblVuaXhGb3JtYXRXaGVuU2F2aW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZW1pdFVuaXhUaW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9lbWl0VW5peFRpbWVzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB2ZXJib3NlIG91dHB1dCBpcyBzZW50IHRvIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlN0YXR1c01lc3NhZ2VUZXh0V3JpdGVyIi8+IGR1cmluZyA8Yz5BZGRYeHgoKTwvYz4gYW5kCisgICAgICAgIC8vLyAgIDxjPlJlYWRYeHgoKTwvYz4gb3BlcmF0aW9ucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhpcyBpcyBhIDxlbT5zeW50aGV0aWM8L2VtPiBwcm9wZXJ0eS4gIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJTdGF0dXNNZXNzYWdlVGV4dFdyaXRlciIvPiBpcyBub24tbnVsbC4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBWZXJib3NlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiAoX1N0YXR1c01lc3NhZ2VUZXh0V3JpdGVyICE9IG51bGwpOyB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmV0dXJucyB0cnVlIGlmIGFuIGVudHJ5IGJ5IHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGUgWmlwRmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0nbmFtZSc+dGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIGZpbmQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBhbiBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0czsgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBDb250YWluc0VudHJ5KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMjUzNAorICAgICAgICAgICAgcmV0dXJuIF9lbnRyaWVzLkNvbnRhaW5zS2V5KFNoYXJlZFV0aWxpdGllcy5Ob3JtYWxpemVQYXRoRm9yVXNlSW5aaXBGaWxlKG5hbWUpKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEluZGljYXRlcyB3aGV0aGVyIHRvIHBlcmZvcm0gY2FzZS1zZW5zaXRpdmUgbWF0Y2hpbmcgb24gdGhlIGZpbGVuYW1lIHdoZW4KKyAgICAgICAgLy8vICAgcmV0cmlldmluZyBlbnRyaWVzIGluIHRoZSB6aXBmaWxlIHZpYSB0aGUgc3RyaW5nLWJhc2VkIGluZGV4ZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjPmZhbHNlPC9jPiwgd2hpY2ggbWVhbnMgZG9uJ3QgZG8gY2FzZS1zZW5zaXRpdmUKKyAgICAgICAgLy8vICAgbWF0Y2hpbmcuIEluIG90aGVyIHdvcmRzLCByZXRyaWV2aW5nIHppcFsiUmVhZE1lLlR4dCJdIGlzIHRoZSBzYW1lIGFzCisgICAgICAgIC8vLyAgIHppcFsicmVhZG1lLnR4dCJdLiAgSXQgcmVhbGx5IG1ha2VzIHNlbnNlIHRvIHNldCB0aGlzIHRvIDxjPnRydWU8L2M+IG9ubHkKKyAgICAgICAgLy8vICAgaWYgeW91IGFyZSBub3QgcnVubmluZyBvbiBXaW5kb3dzLCB3aGljaCBoYXMgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICAvLy8gICBmaWxlbmFtZXMuIEJ1dCBzaW5jZSB0aGlzIGxpYnJhcnkgaXMgbm90IGJ1aWx0IGZvciBub24tV2luZG93cyBwbGF0Zm9ybXMsCisgICAgICAgIC8vLyAgIGluIG1vc3QgY2FzZXMgeW91IHNob3VsZCBqdXN0IGxlYXZlIHRoaXMgcHJvcGVydHkgYWxvbmUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBib29sIENhc2VTZW5zaXRpdmVSZXRyaWV2YWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9DYXNlU2Vuc2l0aXZlUmV0cmlldmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA5ODY4CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IF9DYXNlU2Vuc2l0aXZlUmV0cmlldmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0Nhc2VTZW5zaXRpdmVSZXRyaWV2YWwgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgX2luaXRFbnRyaWVzRGljdGlvbmFyeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB0byBlbmNvZGUgZW50cnkgZmlsZW5hbWVzIGFuZCBlbnRyeSBjb21tZW50cyB1c2luZyBVbmljb2RlCisgICAgICAgIC8vLyAgIChVVEYtOCkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgPHNlZSBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5UaGUKKyAgICAgICAgLy8vICAgUEtXYXJlIHppcCBzcGVjaWZpY2F0aW9uPC9zZWU+IHByb3ZpZGVzIGZvciBlbmNvZGluZyBmaWxlIG5hbWVzIGFuZCBmaWxlCisgICAgICAgIC8vLyAgIGNvbW1lbnRzIGluIGVpdGhlciB0aGUgSUJNNDM3IGNvZGUgcGFnZSwgb3IgaW4gVVRGLTguICBUaGlzIGZsYWcgc2VsZWN0cworICAgICAgICAvLy8gICB0aGUgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoYXQgc3BlY2lmaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIHRoaXMgZmxhZyBpcworICAgICAgICAvLy8gICBmYWxzZSwgYW5kIGZpbGVuYW1lcyBhbmQgY29tbWVudHMgYXJlIGVuY29kZWQgaW50byB0aGUgemlwIGZpbGUgaW4gdGhlCisgICAgICAgIC8vLyAgIElCTTQzNyBjb2RlcGFnZS4gIFNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUgd2lsbCBzcGVjaWZ5IHRoYXQgZmlsZW5hbWVzCisgICAgICAgIC8vLyAgIGFuZCBjb21tZW50cyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggSUJNNDM3IHdpbGwgYmUgZW5jb2RlZCB3aXRoCisgICAgICAgIC8vLyAgIFVURi04LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBaaXAgZmlsZXMgY3JlYXRlZCB3aXRoIHN0cmljdCBhZGhlcmVuY2UgdG8gdGhlIFBLV2FyZSBzcGVjaWZpY2F0aW9uIHdpdGgKKyAgICAgICAgLy8vICAgcmVzcGVjdCB0byBVVEYtOCBlbmNvZGluZyBjYW4gY29udGFpbiBlbnRyaWVzIHdpdGggZmlsZW5hbWVzIGNvbnRhaW5pbmcKKyAgICAgICAgLy8vICAgYW55IGNvbWJpbmF0aW9uIG9mIFVuaWNvZGUgY2hhcmFjdGVycywgaW5jbHVkaW5nIHRoZSBmdWxsIHJhbmdlIG9mCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMgZnJvbSBDaGluZXNlLCBMYXRpbiwgSGVicmV3LCBHcmVlaywgQ3lyaWxsaWMsIGFuZCBtYW55IG90aGVyCisgICAgICAgIC8vLyAgIGFscGhhYmV0cy4gIEhvd2V2ZXIsIGJlY2F1c2UgYXQgdGhpcyB0aW1lLCB0aGUgVVRGLTggcG9ydGlvbiBvZiB0aGUgUEtXYXJlCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gaXMgbm90IGJyb2FkbHkgc3VwcG9ydGVkIGJ5IG90aGVyIHppcCBsaWJyYXJpZXMgYW5kCisgICAgICAgIC8vLyAgIHV0aWxpdGllcywgc3VjaCB6aXAgZmlsZXMgbWF5IG5vdCBiZSByZWFkYWJsZSBieSB5b3VyIGZhdm9yaXRlIHppcCB0b29sIG9yCisgICAgICAgIC8vLyAgIGFyY2hpdmVyLiBJbiBvdGhlciB3b3JkcywgaW50ZXJvcGVyYWJpbGl0eSB3aWxsIGRlY3JlYXNlIGlmIHlvdSBzZXQgdGhpcworICAgICAgICAvLy8gICBmbGFnIHRvIHRydWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluIHBhcnRpY3VsYXIsIFppcCBmaWxlcyBjcmVhdGVkIHdpdGggc3RyaWN0IGFkaGVyZW5jZSB0byB0aGUgUEtXYXJlCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gd2l0aCByZXNwZWN0IHRvIFVURi04IGVuY29kaW5nIHdpbGwgbm90IHdvcmsgd2VsbCB3aXRoCisgICAgICAgIC8vLyAgIEV4cGxvcmVyIGluIFdpbmRvd3MgWFAgb3IgV2luZG93cyBWaXN0YSwgYmVjYXVzZSBXaW5kb3dzIGNvbXByZXNzZWQKKyAgICAgICAgLy8vICAgZm9sZGVycywgYXMgZmFyIGFzIEkga25vdywgZG8gbm90IHN1cHBvcnQgVVRGLTggaW4gemlwIGZpbGVzLiAgVmlzdGEgY2FuCisgICAgICAgIC8vLyAgIHJlYWQgdGhlIHppcCBmaWxlcywgYnV0IHNob3dzIHRoZSBmaWxlbmFtZXMgaW5jb3JyZWN0bHkuIFVucGFja2luZyBmcm9tCisgICAgICAgIC8vLyAgIFdpbmRvd3MgVmlzdGEgRXhwbG9yZXIgd2lsbCByZXN1bHQgaW4gZmlsZW5hbWVzIHRoYXQgaGF2ZSBydWJiaXNoCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMgaW4gcGxhY2Ugb2YgdGhlIGhpZ2gtb3JkZXIgVVRGLTggYnl0ZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFsc28sIHppcCBmaWxlcyB0aGF0IHVzZSBVVEYtOCBlbmNvZGluZyB3aWxsIG5vdCB3b3JrIHdlbGwgd2l0aCBKYXZhCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgamF2YS51dGlsLnppcCBjbGFzc2VzLCBhcyBvZiB2NS4wIG9mIHRoZSBKYXZhCisgICAgICAgIC8vLyAgIHJ1bnRpbWUuIFRoZSBKYXZhIHJ1bnRpbWUgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgUEtXYXJlCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gaW4gdGhpcyByZWdhcmQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFzIGEgcmVzdWx0LCB3ZSBoYXZlIHRoZSB1bmZvcnR1bmF0ZSBzaXR1YXRpb24gdGhhdCAiY29ycmVjdCIgYmVoYXZpb3IgYnkKKyAgICAgICAgLy8vICAgdGhlIERvdE5ldFppcCBsaWJyYXJ5IHdpdGggcmVnYXJkIHRvIFVuaWNvZGUgZW5jb2Rpbmcgb2YgZmlsZW5hbWVzIGR1cmluZworICAgICAgICAvLy8gICB6aXAgY3JlYXRpb24gd2lsbCByZXN1bHQgaW4gemlwIGZpbGVzIHRoYXQgYXJlIHJlYWRhYmxlIGJ5IHN0cmljdGx5CisgICAgICAgIC8vLyAgIGNvbXBsaWFudCBhbmQgY3VycmVudCB0b29scyAoZm9yIGV4YW1wbGUgdGhlIG1vc3QgcmVjZW50IHJlbGVhc2Ugb2YgdGhlCisgICAgICAgIC8vLyAgIGNvbW1lcmNpYWwgV2luWmlwIHRvb2wpOyBidXQgdGhlc2UgemlwIGZpbGVzIHdpbGwgbm90IGJlIHJlYWRhYmxlIGJ5CisgICAgICAgIC8vLyAgIHZhcmlvdXMgb3RoZXIgdG9vbHMgb3IgbGlicmFyaWVzLCBpbmNsdWRpbmcgV2luZG93cyBFeHBsb3Jlci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIERvdE5ldFppcCBsaWJyYXJ5IGNhbiByZWFkIGFuZCB3cml0ZSB6aXAgZmlsZXMgd2l0aCBVVEY4LWVuY29kZWQKKyAgICAgICAgLy8vICAgZW50cmllcywgYWNjb3JkaW5nIHRvIHRoZSBQS3dhcmUgc3BlYy4gIElmIHlvdSB1c2UgRG90TmV0WmlwIGZvciBib3RoCisgICAgICAgIC8vLyAgIGNyZWF0aW5nIGFuZCByZWFkaW5nIHRoZSB6aXAgZmlsZSwgYW5kIHlvdSB1c2UgVVRGLTgsIHRoZXJlIHdpbGwgYmUgbm8KKyAgICAgICAgLy8vICAgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZW5hbWVzLiBGb3IgZXhhbXBsZSwgdXNpbmcgYSBzZWxmLWV4dHJhY3RvcgorICAgICAgICAvLy8gICBjcmVhdGVkIGJ5IHRoaXMgbGlicmFyeSB3aWxsIGFsbG93IHlvdSB0byB1bnBhY2sgZmlsZXMgY29ycmVjdGx5IHdpdGggbm8KKyAgICAgICAgLy8vICAgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZW5hbWVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3UgZG8gbm90IHNldCB0aGlzIGZsYWcsIGl0IHdpbGwgcmVtYWluIGZhbHNlLiAgSWYgdGhpcyBmbGFnIGlzIGZhbHNlLAorICAgICAgICAvLy8gICB5b3VyIDxjPlppcEZpbGU8L2M+IHdpbGwgZW5jb2RlIGFsbCBmaWxlbmFtZXMgYW5kIGNvbW1lbnRzIHVzaW5nIHRoZQorICAgICAgICAvLy8gICBJQk00MzcgY29kZXBhZ2UuICBUaGlzIGNhbiBjYXVzZSAibG9zcyBvZiBpbmZvcm1hdGlvbiIgb24gc29tZSBmaWxlbmFtZXMsCisgICAgICAgIC8vLyAgIGJ1dCB0aGUgcmVzdWx0aW5nIHppcGZpbGUgd2lsbCBiZSBtb3JlIGludGVyb3BlcmFibGUgd2l0aCBvdGhlcgorICAgICAgICAvLy8gICB1dGlsaXRpZXMuIEFzIGFuIGV4YW1wbGUgb2YgdGhlIGxvc3Mgb2YgaW5mb3JtYXRpb24sIGRpYWNyaXRpY3MgY2FuIGJlCisgICAgICAgIC8vLyAgIGxvc3QuICBUaGUgby10aWxkZSBjaGFyYWN0ZXIgd2lsbCBiZSBkb3duLWNvZGVkIHRvIHBsYWluIG8uICBUaGUgYyB3aXRoIGEKKyAgICAgICAgLy8vICAgY2VkaWxsYSAoVW5pY29kZSAweEU3KSB1c2VkIGluIFBvcnR1Z2VzZSB3aWxsIGJlIGRvd25jb2RlZCB0byBhIGMuCisgICAgICAgIC8vLyAgIExpa2V3aXNlLCB0aGUgTy1zdHJva2UgY2hhcmFjdGVyIChVbmljb2RlIDI0OCksIHVzZWQgaW4gRGFuaXNoIGFuZAorICAgICAgICAvLy8gICBOb3J3ZWdpYW4sIHdpbGwgYmUgZG93bi1jb2RlZCB0byBwbGFpbiBvLiBDaGluZXNlIGNoYXJhY3RlcnMgY2Fubm90IGJlCisgICAgICAgIC8vLyAgIHJlcHJlc2VudGVkIGluIGNvZGVwYWdlIElCTTQzNzsgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZywgQ2hpbmVzZQorICAgICAgICAvLy8gICBjaGFyYWN0ZXJzIGluIGZpbGVuYW1lcyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzID8uIFRoZXNlIGFyZSBhbGwgZXhhbXBsZXMKKyAgICAgICAgLy8vICAgb2YgImluZm9ybWF0aW9uIGxvc3MiLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgbG9zcyBvZiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSB1c2Ugb2YgdGhlIElCTTQzNyBlbmNvZGluZyBpcworICAgICAgICAvLy8gICBpbmNvbnZlbmllbnQsIGFuZCBjYW4gYWxzbyBsZWFkIHRvIHJ1bnRpbWUgZXJyb3JzLiBGb3IgZXhhbXBsZSwgdXNpbmcKKyAgICAgICAgLy8vICAgSUJNNDM3LCBhbnkgc2VxdWVuY2Ugb2YgNCBDaGluZXNlIGNoYXJhY3RlcnMgd2lsbCBiZSBlbmNvZGVkIGFzID8/Pz8uICBJZgorICAgICAgICAvLy8gICB5b3VyIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSA8Yz5aaXBGaWxlPC9jPiwgdGhlbiBhZGRzIHR3byBmaWxlcywgZWFjaCB3aXRoCisgICAgICAgIC8vLyAgIG5hbWVzIG9mIGZvdXIgQ2hpbmVzZSBjaGFyYWN0ZXJzIGVhY2gsIHRoaXMgd2lsbCByZXN1bHQgaW4gYSBkdXBsaWNhdGUKKyAgICAgICAgLy8vICAgZmlsZW5hbWUgZXhjZXB0aW9uLiAgSW4gdGhlIGNhc2Ugd2hlcmUgeW91IGFkZCBhIHNpbmdsZSBmaWxlIHdpdGggYSBuYW1lCisgICAgICAgIC8vLyAgIGNvbnRhaW5pbmcgZm91ciBDaGluZXNlIGNoYXJhY3RlcnMsIGNhbGxpbmcgRXh0cmFjdCgpIG9uIHRoZSBlbnRyeSB0aGF0CisgICAgICAgIC8vLyAgIGhhcyBxdWVzdGlvbiBtYXJrcyBpbiB0aGUgZmlsZW5hbWUgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uLCBiZWNhdXNlCisgICAgICAgIC8vLyAgIHRoZSBxdWVzdGlvbiBtYXJrIGlzIG5vdCBsZWdhbCBmb3IgdXNlIHdpdGhpbiBmaWxlbmFtZXMgb24gV2luZG93cy4gIFRoZXNlCisgICAgICAgIC8vLyAgIGFyZSBqdXN0IGEgZmV3IGV4YW1wbGVzIG9mIHRoZSBwcm9ibGVtcyBhc3NvY2lhdGVkIHRvIGxvc3Mgb2YgaW5mb3JtYXRpb24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgZmxhZyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGNvbnRlbnQgd2l0aGluIHRoZSBlbnRyaWVzCisgICAgICAgIC8vLyAgIGluIHRoZSB6aXAgZmlsZS4gVGhpbmsgb2YgdGhlIHppcCBmaWxlIGFzIGEgY29udGFpbmVyIC0gaXQgc3VwcG9ydHMgYW4KKyAgICAgICAgLy8vICAgZW5jb2RpbmcuICBXaXRoaW4gdGhlIGNvbnRhaW5lciBhcmUgb3RoZXIgImNvbnRhaW5lcnMiIC0gdGhlIGZpbGUgZW50cmllcworICAgICAgICAvLy8gICB0aGVtc2VsdmVzLiAgVGhlIGVuY29kaW5nIHdpdGhpbiB0aG9zZSBlbnRyaWVzIGlzIGluZGVwZW5kZW50IG9mIHRoZQorICAgICAgICAvLy8gICBlbmNvZGluZyBvZiB0aGUgemlwIGFyY2hpdmUgY29udGFpbmVyIGZvciB0aG9zZSBlbnRyaWVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBSYXRoZXIgdGhhbiBzcGVjaWZ5IHRoZSBlbmNvZGluZyBpbiBhIGJpbmFyeSBmYXNoaW9uIHVzaW5nIHRoaXMgZmxhZywgYW4KKyAgICAgICAgLy8vICAgYXBwbGljYXRpb24gY2FuIHNwZWNpZnkgYW4gYXJiaXRyYXJ5IGVuY29kaW5nIHZpYSB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+IHByb3BlcnR5LiAgU2V0dGluZyB0aGUgZW5jb2RpbmcKKyAgICAgICAgLy8vICAgZXhwbGljaXRseSB3aGVuIGNyZWF0aW5nIHppcCBhcmNoaXZlcyB3aWxsIHJlc3VsdCBpbiBub24tY29tcGxpYW50IHppcAorICAgICAgICAvLy8gICBmaWxlcyB0aGF0LCBjdXJpb3VzbHksIGFyZSBmYWlybHkgaW50ZXJvcGVyYWJsZS4gIFRoZSBjaGFsbGVuZ2UgaXMsIHRoZQorICAgICAgICAvLy8gICBQS1dhcmUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBwcm92aWRlIGZvciBhIHdheSB0byBzcGVjaWZ5IHRoYXQgYW4gZW50cnkKKyAgICAgICAgLy8vICAgaW4gYSB6aXAgYXJjaGl2ZSB1c2VzIGEgY29kZSBwYWdlIHRoYXQgaXMgbmVpdGhlciBJQk00Mzcgbm9yIFVURi04LgorICAgICAgICAvLy8gICBUaGVyZWZvcmUgaWYgeW91IHNldCB0aGUgZW5jb2RpbmcgZXhwbGljaXRseSB3aGVuIGNyZWF0aW5nIGEgemlwIGFyY2hpdmUsCisgICAgICAgIC8vLyAgIHlvdSBtdXN0IHRha2UgY2FyZSB1cG9uIHJlYWRpbmcgdGhlIHppcCBhcmNoaXZlIHRvIHVzZSB0aGUgc2FtZSBjb2RlIHBhZ2UuCisgICAgICAgIC8vLyAgIElmIHlvdSBnZXQgaXQgd3JvbmcsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgYW5kIG1heSByZXN1bHQgaW4gaW5jb3JyZWN0CisgICAgICAgIC8vLyAgIGZpbGVuYW1lcywgZXhjZXB0aW9ucywgc3RvbWFjaCB1cHNldCwgaGFpciBsb3NzLCBhbmQgYWNuZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4KKyAgICAgICAgW09ic29sZXRlKCJCZWdpbm5pbmcgd2l0aCB2MS45LjEuNiBvZiBEb3ROZXRaaXAsIHRoaXMgcHJvcGVydHkgaXMgb2Jzb2xldGUuICBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gWW91ciBhcHBsaWNhdGlvbnMgc2hvdWxkICB1c2UgQWx0ZXJuYXRlRW5jb2RpbmcgYW5kIEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgaW5zdGVhZC4iKV0KKyAgICAgICAgcHVibGljIGJvb2wgVXNlVW5pY29kZUFzTmVjZXNzYXJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoX2FsdGVybmF0ZUVuY29kaW5nID09IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJVVEYtOCIpKSAmJgorICAgICAgICAgICAgICAgICAgICAoX2FsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPT0gWmlwT3B0aW9uLkFzTmVjZXNzYXJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICBfYWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5Bc05lY2Vzc2FyeTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYWx0ZXJuYXRlRW5jb2RpbmcgPSBJb25pYy5aaXAuWmlwRmlsZS5EZWZhdWx0RW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gWmlwT3B0aW9uLk5ldmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIFpJUDY0IGV4dGVuc2lvbnMgd2hlbiBzYXZpbmcgYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBjcmVhdGluZyBhIHppcCBmaWxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IGlzIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwNjRPcHRpb24uTmV2ZXIiLz4uIDxzZWUgY3JlZj0iWmlwNjRPcHRpb24uQXNOZWNlc3NhcnkiLz4gaXMKKyAgICAgICAgLy8vICAgc2FmZXN0LCBpbiB0aGUgc2Vuc2UgdGhhdCB5b3Ugd2lsbCBub3QgZ2V0IGFuIEV4Y2VwdGlvbiBpZiBhIHByZS1aSVA2NAorICAgICAgICAvLy8gICBsaW1pdCBpcyBleGNlZWRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgWW91IG1heSBzZXQgdGhlIHByb3BlcnR5IGF0IGFueSB0aW1lIGJlZm9yZSBjYWxsaW5nIFNhdmUoKS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGEgemlwIGZpbGUgdmlhIHRoZSA8Yz5aaXBmaWxlLlJlYWQoKTwvYz4gbWV0aG9kLCBEb3ROZXRaaXAKKyAgICAgICAgLy8vICAgd2lsbCBwcm9wZXJseSByZWFkIFpJUDY0LWVuZG93ZWQgemlwIGFyY2hpdmVzLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZgorICAgICAgICAvLy8gICB0aGlzIHByb3BlcnR5LiAgRG90TmV0WmlwIHdpbGwgYWx3YXlzIHJlYWQgWklQNjQgYXJjaGl2ZXMuICBUaGlzIHByb3BlcnR5CisgICAgICAgIC8vLyAgIGdvdmVybnMgb25seSB3aGV0aGVyIERvdE5ldFppcCB3aWxsIHdyaXRlIHRoZW0uIFRoZXJlZm9yZSwgd2hlbiB1cGRhdGluZworICAgICAgICAvLy8gICBhcmNoaXZlcywgYmUgY2FyZWZ1bCBhYm91dCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgYWZ0ZXIgcmVhZGluZyBhbiBhcmNoaXZlCisgICAgICAgIC8vLyAgIHRoYXQgbWF5IHVzZSBaSVA2NCBleHRlbnNpb25zLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBbiBpbnRlcmVzdGluZyBxdWVzdGlvbiBpcywgaWYgeW91IGhhdmUgc2V0IHRoaXMgcHJvcGVydHkgdG8KKyAgICAgICAgLy8vICAgPGM+QXNOZWNlc3Nhcnk8L2M+LCBhbmQgdGhlbiBzdWNjZXNzZnVsbHkgc2F2ZWQsIGRvZXMgdGhlIHJlc3VsdGluZworICAgICAgICAvLy8gICBhcmNoaXZlIHVzZSBaSVA2NCBleHRlbnNpb25zIG9yIG5vdD8gIFRvIGxlYXJuIHRoaXMsIGNoZWNrIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9Ik91dHB1dFVzZWRaaXA2NCIvPiBwcm9wZXJ0eSwgYWZ0ZXIgY2FsbGluZyA8Yz5TYXZlKCk8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBIYXZlIHlvdSB0aG91Z2h0IGFib3V0CisgICAgICAgIC8vLyAgIDxzZWUgaHJlZj0iaHR0cDovL2NoZWVzby5tZW1iZXJzLndpbmlzcC5uZXQvRG90TmV0WmlwRG9uYXRlLmFzcHgiPmRvbmF0aW5nPC9zZWU+PworICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlJlcXVpcmVzWmlwNjQiLz4KKyAgICAgICAgaW50ZXJuYWwgWmlwNjRPcHRpb24gVXNlWmlwNjRXaGVuU2F2aW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfemlwNjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfemlwNjQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIHJlcXVpcmVzIFpJUDY0IGV4dGVuc2lvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgaXMgPGM+bnVsbDwvYz4gKG9yIDxjPk5vdGhpbmc8L2M+IGluIFZCKSBpZiB0aGUgYXJjaGl2ZSBoYXMKKyAgICAgICAgLy8vICAgbm90IGJlZW4gc2F2ZWQsIGFuZCB0aGVyZSBhcmUgZmV3ZXIgdGhhbiA2NTMzNCA8Yz5aaXBFbnRyeTwvYz4gaXRlbXMKKyAgICAgICAgLy8vICAgY29udGFpbmVkIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgPGM+VmFsdWU8L2M+IGlzIHRydWUgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgZm91ciBjb25kaXRpb25zIGhvbGRzOgorICAgICAgICAvLy8gICB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgYW55IGVudHJ5IGlzIGxhcmdlciB0aGFuIDB4RkZGRkZGRkY7IHRoZQorICAgICAgICAvLy8gICBjb21wcmVzc2VkIHNpemUgb2YgYW55IGVudHJ5IGlzIGxhcmdlciB0aGFuIDB4RkZGRkZGRkY7IHRoZSByZWxhdGl2ZQorICAgICAgICAvLy8gICBvZmZzZXQgb2YgYW55IGVudHJ5IHdpdGhpbiB0aGUgemlwIGFyY2hpdmUgaXMgbGFyZ2VyIHRoYW4gMHhGRkZGRkZGRjsgb3IKKyAgICAgICAgLy8vICAgdGhlcmUgYXJlIG1vcmUgdGhhbiA2NTUzNCBlbnRyaWVzIGluIHRoZSBhcmNoaXZlLiAgKDB4RkZGRkZGRkYgPQorICAgICAgICAvLy8gICA0LDI5NCw5NjcsMjk1KS4gIFRoZSByZXN1bHQgbWF5IG5vdCBiZSBrbm93biB1bnRpbCBhIDxjPlNhdmUoKTwvYz4gaXMgYXR0ZW1wdGVkCisgICAgICAgIC8vLyAgIG9uIHRoZSB6aXAgYXJjaGl2ZS4gIFRoZSBWYWx1ZSBvZiB0aGlzIDxzZWUgY3JlZj0iU3lzdGVtLk51bGxhYmxlIi8+CisgICAgICAgIC8vLyAgIHByb3BlcnR5IG1heSBiZSBzZXQgb25seSBBRlRFUiBvbmUgb2YgdGhlIFNhdmUoKSBtZXRob2RzIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSWYgbm9uZSBvZiB0aGUgZm91ciBjb25kaXRpb25zIGhvbGRzLCBhbmQgdGhlIGFyY2hpdmUgaGFzIGJlZW4gc2F2ZWQsIHRoZW4KKyAgICAgICAgLy8vICAgdGhlIDxjPlZhbHVlPC9jPiBpcyBmYWxzZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQSA8Yz5WYWx1ZTwvYz4gb2YgZmFsc2UgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCB0aGUgemlwIGFyY2hpdmUsIGFzIHNhdmVkLAorICAgICAgICAvLy8gICBkb2VzIG5vdCB1c2UgWklQNjQuICBJdCBtZXJlbHkgaW5kaWNhdGVzIHRoYXQgWklQNjQgaXMgbm90IHJlcXVpcmVkLiAgQW4KKyAgICAgICAgLy8vICAgYXJjaGl2ZSBtYXkgdXNlIFpJUDY0IGV2ZW4gd2hlbiBub3QgcmVxdWlyZWQgaWYgdGhlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRmlsZS5Vc2VaaXA2NFdoZW5TYXZpbmciLz4gcHJvcGVydHkgaXMgc2V0IHRvIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwNjRPcHRpb24uQWx3YXlzIi8+LCBvciBpZiB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBGaWxlLlVzZVppcDY0V2hlblNhdmluZyIvPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXA2NE9wdGlvbi5Bc05lY2Vzc2FyeSIvPiBhbmQgdGhlIG91dHB1dCBzdHJlYW0gd2FzIG5vdAorICAgICAgICAvLy8gICBzZWVrYWJsZS4gVXNlIHRoZSA8c2VlIGNyZWY9Ik91dHB1dFVzZWRaaXA2NCIvPiBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgaWYKKyAgICAgICAgLy8vICAgdGhlIG1vc3QgcmVjZW50IDxjPlNhdmUoKTwvYz4gbWV0aG9kIHJlc3VsdGVkIGluIGFuIGFyY2hpdmUgdGhhdCB1dGlsaXplZAorICAgICAgICAvLy8gICB0aGUgWklQNjQgZXh0ZW5zaW9ucy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJVc2VaaXA2NFdoZW5TYXZpbmciLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9Ik91dHB1dFVzZWRaaXA2NCIvPgorICAgICAgICBwdWJsaWMgTnVsbGFibGU8Ym9vbD4gUmVxdWlyZXNaaXA2NAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2VudHJpZXMuQ291bnQgPiA2NTUzNCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOdWxsYWJsZTxib29sPih0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSA8Yz5aaXBGaWxlPC9jPiBoYXMgbm90IGJlZW4gc2F2ZWQgb3IgaWYgdGhlIGNvbnRlbnRzIGhhdmUgY2hhbmdlZCwgdGhlbgorICAgICAgICAgICAgICAgIC8vIGl0IGlzIG5vdCBrbm93biBpZiBaSVA2NCBpcyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICBpZiAoIV9oYXNCZWVuU2F2ZWQgfHwgX2NvbnRlbnRzQ2hhbmdlZCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIFpJUDY0IGlzIHJlcXVpcmVkIGlzIGtub3dhYmxlLgorICAgICAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gX2VudHJpZXMuVmFsdWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuUmVxdWlyZXNaaXA2NC5WYWx1ZSkgcmV0dXJuIG5ldyBOdWxsYWJsZTxib29sPih0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bGxhYmxlPGJvb2w+KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbW9zdCByZWNlbnQgPGM+U2F2ZSgpPC9jPiBvcGVyYXRpb24gdXNlZCBaSVA2NCBleHRlbnNpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSB1c2Ugb2YgWklQNjQgZXh0ZW5zaW9ucyB3aXRoaW4gYW4gYXJjaGl2ZSBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeSwgYW5kCisgICAgICAgIC8vLyAgIGZvciBpbnRlcm9wZXJhYmlsaXR5IGNvbmNlcm5zLCBpdCBtYXkgYmUgZGVzaXJlZCB0byBOT1QgdXNlIFpJUDY0IGlmCisgICAgICAgIC8vLyAgIHBvc3NpYmxlLiAgVGhlIDxzZWUgY3JlZj0iWmlwRmlsZS5Vc2VaaXA2NFdoZW5TYXZpbmciLz4gcHJvcGVydHkgY2FuIGJlCisgICAgICAgIC8vLyAgIHNldCB0byB1c2UgWklQNjQgZXh0ZW5zaW9ucyBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgSW4gdGhvc2UgY2FzZXMsCisgICAgICAgIC8vLyAgIFNvbWV0aW1lcyBhcHBsaWNhdGlvbnMgd2FudCB0byBrbm93IHdoZXRoZXIgYSBTYXZlKCkgYWN0dWFsbHkgdXNlZCBaSVA2NAorICAgICAgICAvLy8gICBleHRlbnNpb25zLiAgQXBwbGljYXRpb25zIGNhbiBxdWVyeSB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSB0byBsZWFybgorICAgICAgICAvLy8gICB3aGV0aGVyIFpJUDY0IGhhcyBiZWVuIHVzZWQgaW4gYSBqdXN0LXNhdmVkIDxjPlppcEZpbGU8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgdmFsdWUgaXMgPGM+bnVsbDwvYz4gKG9yIDxjPk5vdGhpbmc8L2M+IGluIFZCKSBpZiB0aGUgYXJjaGl2ZSBoYXMgbm90CisgICAgICAgIC8vLyAgIGJlZW4gc2F2ZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIE5vbi1udWxsIHZhbHVlcyAoPGM+SGFzVmFsdWU8L2M+IGlzIHRydWUpIGluZGljYXRlIHdoZXRoZXIgWklQNjQKKyAgICAgICAgLy8vICAgZXh0ZW5zaW9ucyB3ZXJlIHVzZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudCA8Yz5TYXZlKCk8L2M+IG9wZXJhdGlvbi4gIFRoZQorICAgICAgICAvLy8gICBaSVA2NCBleHRlbnNpb25zIG1heSBoYXZlIGJlZW4gdXNlZCBhcyByZXF1aXJlZCBieSBhbnkgcGFydGljdWxhciBlbnRyeQorICAgICAgICAvLy8gICBiZWNhdXNlIG9mIGl0cyB1bmNvbXByZXNzZWQgb3IgY29tcHJlc3NlZCBzaXplLCBvciBiZWNhdXNlIHRoZSBhcmNoaXZlIGlzCisgICAgICAgIC8vLyAgIGxhcmdlciB0aGFuIDQyOTQ5NjcyOTUgYnl0ZXMsIG9yIGJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgdGhhbiA2NTUzNCBlbnRyaWVzCisgICAgICAgIC8vLyAgIGluIHRoZSBhcmNoaXZlLCBvciBiZWNhdXNlIHRoZSA8Yz5Vc2VaaXA2NFdoZW5TYXZpbmc8L2M+IHByb3BlcnR5IHdhcyBzZXQKKyAgICAgICAgLy8vICAgdG8gPHNlZSBjcmVmPSJaaXA2NE9wdGlvbi5BbHdheXMiLz4sIG9yIGJlY2F1c2UgdGhlCisgICAgICAgIC8vLyAgIDxjPlVzZVppcDY0V2hlblNhdmluZzwvYz4gcHJvcGVydHkgd2FzIHNldCB0byA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcDY0T3B0aW9uLkFzTmVjZXNzYXJ5Ii8+IGFuZCB0aGUgb3V0cHV0IHN0cmVhbSB3YXMgbm90IHNlZWthYmxlLgorICAgICAgICAvLy8gICBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdCBpbmRpY2F0ZSB0aGUgcmVhc29uIHRoZSBaSVA2NAorICAgICAgICAvLy8gICBleHRlbnNpb25zIHdlcmUgdXNlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJVc2VaaXA2NFdoZW5TYXZpbmciLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlJlcXVpcmVzWmlwNjQiLz4KKyAgICAgICAgcHVibGljIE51bGxhYmxlPGJvb2w+IE91dHB1dFVzZWRaaXA2NAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX091dHB1dFVzZXNaaXA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbW9zdCByZWNlbnQgPGM+UmVhZCgpPC9jPiBvcGVyYXRpb24gcmVhZCBhIHppcCBmaWxlIHRoYXQgdXNlcworICAgICAgICAvLy8gICBaSVA2NCBleHRlbnNpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IHdpbGwgcmV0dXJuIG51bGwgKE5vdGhpbmcgaW4gVkIpIGlmIHlvdSd2ZSBhZGRlZCBhbiBlbnRyeSBhZnRlciByZWFkaW5nCisgICAgICAgIC8vLyAgIHRoZSB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIE51bGxhYmxlPGJvb2w+IElucHV0VXNlc1ppcDY0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZW50cmllcy5Db3VudCA+IDY1NTM0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gdGhpcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFueSBlbnRyeSB3YXMgYWRkZWQgYWZ0ZXIgcmVhZGluZyB0aGUgemlwIGZpbGUsIHRoZW4gdGhlIHJlc3VsdCBpcyBudWxsCisgICAgICAgICAgICAgICAgICAgIGlmIChlLlNvdXJjZSAhPSBaaXBFbnRyeVNvdXJjZS5aaXBGaWxlKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhbnkgZW50cnkgcmVhZCBmcm9tIHRoZSB6aXAgdXNlZCB6aXA2NCwgdGhlbiB0aGUgcmVzdWx0IGlzIHRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuX0lucHV0VXNlc1ppcDY0KSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSB0ZXh0IGVuY29kaW5nIHRvIHVzZSB3aGVuIHdyaXRpbmcgbmV3IGVudHJpZXMgdG8gdGhlIDxjPlppcEZpbGU8L2M+LAorICAgICAgICAvLy8gICBmb3IgdGhvc2UgZW50cmllcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggdGhlIGRlZmF1bHQgKElCTTQzNykKKyAgICAgICAgLy8vICAgZW5jb2Rpbmc7IG9yLCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdhcyB1c2VkIHdoZW4gcmVhZGluZyB0aGUgZW50cmllcworICAgICAgICAvLy8gICBmcm9tIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbiA8c2VlIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPml0cworICAgICAgICAvLy8gICB6aXAgc3BlY2lmaWNhdGlvbjwvc2VlPiwgUEtXYXJlIGRlc2NyaWJlcyB0d28gb3B0aW9ucyBmb3IgZW5jb2RpbmcKKyAgICAgICAgLy8vICAgZmlsZW5hbWVzIGFuZCBjb21tZW50czogdXNpbmcgSUJNNDM3IG9yIFVURi04LiAgQnV0LCBzb21lIGFyY2hpdmluZyB0b29scworICAgICAgICAvLy8gICBvciBsaWJyYXJpZXMgZG8gbm90IGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kIGluc3RlYWQgZW5jb2RlCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGNvZGUgcGFnZS4gIEZvciBleGFtcGxlLCBXaW5SQVIgd2hlbgorICAgICAgICAvLy8gICBydW4gb24gYSBtYWNoaW5lIGluIFNoYW5naGFpIG1heSBlbmNvZGUgZmlsZW5hbWVzIHdpdGggdGhlIEJpZy01IENoaW5lc2UKKyAgICAgICAgLy8vICAgKDk1MCkgY29kZSBwYWdlLiAgVGhpcyBiZWhhdmlvciBpcyBjb250cmFyeSB0byB0aGUgWmlwIHNwZWNpZmljYXRpb24sIGJ1dAorICAgICAgICAvLy8gICBpdCBvY2N1cnMgYW55d2F5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHVzaW5nIERvdE5ldFppcCB0byB3cml0ZSB6aXAgYXJjaGl2ZXMgdGhhdCB3aWxsIGJlIHJlYWQgYnkgb25lIG9mCisgICAgICAgIC8vLyAgIHRoZXNlIG90aGVyIGFyY2hpdmVycywgc2V0IHRoaXMgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgY29kZSBwYWdlIHRvIHVzZQorICAgICAgICAvLy8gICB3aGVuIGVuY29kaW5nIHRoZSA8c2VlIGNyZWY9IlppcEVudHJ5LkZpbGVOYW1lIi8+IGFuZCA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5LkNvbW1lbnQiLz4gZm9yIGVhY2ggPGM+WmlwRW50cnk8L2M+IGluIHRoZSB6aXAgZmlsZSwgZm9yCisgICAgICAgIC8vLyAgIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggdGhlIGRlZmF1bHQgY29kZXBhZ2UgZm9yIHppcCBmaWxlcywKKyAgICAgICAgLy8vICAgSUJNNDM3LiAgVGhpcyBpcyB3aHkgdGhpcyBwcm9wZXJ0eSBpcyAicHJvdmlzaW9uYWwiLiAgSW4gYWxsIGNhc2VzLCBJQk00MzcKKyAgICAgICAgLy8vICAgaXMgdXNlZCB3aGVyZSBwb3NzaWJsZSwgaW4gb3RoZXIgd29yZHMsIHdoZXJlIG5vIGxvc3Mgb2YgZGF0YSB3b3VsZAorICAgICAgICAvLy8gICByZXN1bHQuIEl0IGlzIHBvc3NpYmxlLCB0aGVyZWZvcmUsIHRvIGhhdmUgYSBnaXZlbiBlbnRyeSB3aXRoIGEKKyAgICAgICAgLy8vICAgPGM+Q29tbWVudDwvYz4gZW5jb2RlZCBpbiBJQk00MzcgYW5kIGEgPGM+RmlsZU5hbWU8L2M+IGVuY29kZWQgd2l0aCB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkICJwcm92aXNpb25hbCIgY29kZXBhZ2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEJlIGF3YXJlIHRoYXQgYSB6aXAgZmlsZSBjcmVhdGVkIGFmdGVyIHlvdSd2ZSBleHBsaWNpdGx5IHNldCB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIiAvPiBwcm9wZXJ0eSB0byBhIHZhbHVlIG90aGVyIHRoYW4KKyAgICAgICAgLy8vICAgSUJNNDM3IG1heSBub3QgYmUgY29tcGxpYW50IHRvIHRoZSBQS1dhcmUgc3BlY2lmaWNhdGlvbiwgYW5kIG1heSBub3QgYmUKKyAgICAgICAgLy8vICAgcmVhZGFibGUgYnkgY29tcGxpYW50IGFyY2hpdmVycy4gIE9uIHRoZSBvdGhlciBoYW5kLCBtYW55IChtb3N0PykKKyAgICAgICAgLy8vICAgYXJjaGl2ZXJzIGFyZSBub24tY29tcGxpYW50IGFuZCBjYW4gcmVhZCB6aXAgZmlsZXMgY3JlYXRlZCBpbiBhcmJpdHJhcnkKKyAgICAgICAgLy8vICAgY29kZSBwYWdlcy4gIFRoZSB0cmljayBpcyB0byB1c2Ugb3Igc3BlY2lmeSB0aGUgcHJvcGVyIGNvZGVwYWdlIHdoZW4KKyAgICAgICAgLy8vICAgcmVhZGluZyB0aGUgemlwLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIGNyZWF0aW5nIGEgemlwIGFyY2hpdmUgdXNpbmcgdGhpcyBsaWJyYXJ5LCBpdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UKKyAgICAgICAgLy8vICAgdGhlIHZhbHVlIG9mIDxzZWUgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIgLz4gYmV0d2VlbiBlYWNoCisgICAgICAgIC8vLyAgIGVudHJ5IHlvdSBhZGQsIGFuZCBiZXR3ZWVuIGFkZGluZyBlbnRyaWVzIGFuZCB0aGUgY2FsbCB0bworICAgICAgICAvLy8gICA8Yz5TYXZlKCk8L2M+LiBEb24ndCBkbyB0aGlzLiBJdCB3aWxsIGxpa2VseSByZXN1bHQgaW4gYSB6aXBmaWxlIHRoYXQgaXMKKyAgICAgICAgLy8vICAgbm90IHJlYWRhYmxlLiAgRm9yIGJlc3QgaW50ZXJvcGVyYWJpbGl0eSwgZWl0aGVyIGxlYXZlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIgLz4gYWxvbmUsIG9yIHNwZWNpZnkgaXQgb25seSBvbmNlLAorICAgICAgICAvLy8gICBiZWZvcmUgYWRkaW5nIGFueSBlbnRyaWVzIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4gIFRoZXJlIGlzIG9uZQorICAgICAgICAvLy8gICBleGNlcHRpb24gdG8gdGhpcyByZWNvbW1lbmRhdGlvbiwgZGVzY3JpYmVkIGxhdGVyLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHVzaW5nIGFuIGFyYml0cmFyeSwgbm9uLVVURjggY29kZSBwYWdlIGZvciBlbmNvZGluZywgdGhlcmUgaXMgbm8KKyAgICAgICAgLy8vICAgc3RhbmRhcmQgd2F5IGZvciB0aGUgY3JlYXRvciBhcHBsaWNhdGlvbiAtIHdoZXRoZXIgRG90TmV0WmlwLCBXaW5aaXAsCisgICAgICAgIC8vLyAgIFdpblJhciwgb3Igc29tZXRoaW5nIGVsc2UgLSB0byBmb3JtYWxseSBzcGVjaWZ5IGluIHRoZSB6aXAgZmlsZSB3aGljaAorICAgICAgICAvLy8gICBjb2RlcGFnZSBoYXMgYmVlbiB1c2VkIGZvciB0aGUgZW50cmllcy4gQXMgYSByZXN1bHQsIHJlYWRlcnMgb2YgemlwIGZpbGVzCisgICAgICAgIC8vLyAgIGFyZSBub3QgYWJsZSB0byBpbnNwZWN0IHRoZSB6aXAgZmlsZSBhbmQgZGV0ZXJtaW5lIHRoZSBjb2RlcGFnZSB0aGF0IHdhcworICAgICAgICAvLy8gICB1c2VkIGZvciB0aGUgZW50cmllcyBjb250YWluZWQgd2l0aGluIGl0LiAgSXQgaXMgbGVmdCB0byB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgLy8vICAgb3IgdXNlciB0byBkZXRlcm1pbmUgdGhlIG5lY2Vzc2FyeSBjb2RlcGFnZSB3aGVuIHJlYWRpbmcgemlwIGZpbGVzIGVuY29kZWQKKyAgICAgICAgLy8vICAgdGhpcyB3YXkuICBJbiBvdGhlciB3b3JkcywgaWYgeW91IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgY29kZXBhZ2Ugd2hlbiB5b3UKKyAgICAgICAgLy8vICAgY3JlYXRlIHRoZSB6aXBmaWxlLCB5b3UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHNhbWUgY29kZXBhZ2Ugd2hlbgorICAgICAgICAvLy8gICByZWFkaW5nIHRoZSB6aXBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgd2F5IHlvdSBzcGVjaWZ5IHRoZSBjb2RlIHBhZ2UgdG8gdXNlIHdoZW4gcmVhZGluZyBhIHppcCBmaWxlIHZhcmllcworICAgICAgICAvLy8gICBkZXBlbmRpbmcgb24gdGhlIHRvb2wgb3IgbGlicmFyeSB5b3UgdXNlIHRvIHJlYWQgdGhlIHppcC4gIEluIERvdE5ldFppcCwKKyAgICAgICAgLy8vICAgeW91IHVzZSBhIFppcEZpbGUuUmVhZCgpIG1ldGhvZCB0aGF0IGFjY2VwdHMgYW4gZW5jb2RpbmcgcGFyYW1ldGVyLiAgSXQKKyAgICAgICAgLy8vICAgaXNuJ3QgcG9zc2libGUgd2l0aCBXaW5kb3dzIEV4cGxvcmVyLCBhcyBmYXIgYXMgSSBrbm93LCB0byBzcGVjaWZ5IGFuCisgICAgICAgIC8vLyAgIGV4cGxpY2l0IGNvZGVwYWdlIHRvIHVzZSB3aGVuIHJlYWRpbmcgYSB6aXAuICBJZiB5b3UgdXNlIGFuIGluY29ycmVjdAorICAgICAgICAvLy8gICBjb2RlcGFnZSB3aGVuIHJlYWRpbmcgYSB6aXBmaWxlLCB5b3Ugd2lsbCBnZXQgZW50cmllcyB3aXRoIGZpbGVuYW1lcyB0aGF0CisgICAgICAgIC8vLyAgIGFyZSBpbmNvcnJlY3QsIGFuZCB0aGUgaW5jb3JyZWN0IGZpbGVuYW1lcyBtYXkgZXZlbiBjb250YWluIGNoYXJhY3RlcnMKKyAgICAgICAgLy8vICAgdGhhdCBhcmUgbm90IGxlZ2FsIGZvciB1c2Ugd2l0aGluIGZpbGVuYW1lcyBpbiBXaW5kb3dzLiBFeHRyYWN0aW5nIGVudHJpZXMKKyAgICAgICAgLy8vICAgd2l0aCBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGVuYW1lcyB3aWxsIGxlYWQgdG8gZXhjZXB0aW9ucy4gSXQncyB0b28KKyAgICAgICAgLy8vICAgYmFkLCBidXQgdGhpcyBpcyBqdXN0IHRoZSB3YXkgdGhpbmdzIGFyZSB3aXRoIGNvZGUgcGFnZXMgaW4gemlwCisgICAgICAgIC8vLyAgIGZpbGVzLiBDYXZlYXQgRW1wdG9yLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBFeGFtcGxlOiBTdXBwb3NlIHlvdSBjcmVhdGUgYSB6aXBmaWxlIHRoYXQgY29udGFpbnMgZW50cmllcyB3aXRoCisgICAgICAgIC8vLyAgIGZpbGVuYW1lcyB0aGF0IGhhdmUgRGFuaXNoIGNoYXJhY3RlcnMuICBJZiB5b3UgdXNlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIgLz4gZXF1YWwgdG8gImlzby04ODU5LTEiIChjcCAyODU5MSksCisgICAgICAgIC8vLyAgIHRoZSBmaWxlbmFtZXMgd2lsbCBiZSBjb3JyZWN0bHkgZW5jb2RlZCBpbiB0aGUgemlwLiAgQnV0LCB0byByZWFkIHRoYXQKKyAgICAgICAgLy8vICAgemlwZmlsZSBjb3JyZWN0bHksIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIHNhbWUgY29kZXBhZ2UgYXQgdGhlIHRpbWUgeW91CisgICAgICAgIC8vLyAgIHJlYWQgaXQuIElmIHRyeSB0byByZWFkIHRoYXQgemlwIGZpbGUgd2l0aCBXaW5kb3dzIEV4cGxvcmVyIG9yIGFub3RoZXIKKyAgICAgICAgLy8vICAgYXBwbGljYXRpb24gdGhhdCBpcyBub3QgZmxleGlibGUgd2l0aCByZXNwZWN0IHRvIHRoZSBjb2RlcGFnZSB1c2VkIHRvCisgICAgICAgIC8vLyAgIGRlY29kZSBmaWxlbmFtZXMgaW4gemlwZmlsZXMsIHlvdSB3aWxsIGdldCBhIGZpbGVuYW1lIGxpa2UgIkluZu+/vS50eHQiLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHVzaW5nIERvdE5ldFppcCB0byByZWFkIGEgemlwIGFyY2hpdmUsIGFuZCB0aGUgemlwIGFyY2hpdmUgdXNlcyBhbgorICAgICAgICAvLy8gICBhcmJpdHJhcnkgY29kZSBwYWdlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBlbmNvZGluZyB0byB1c2UgYmVmb3JlIG9yIHdoZW4KKyAgICAgICAgLy8vICAgdGhlIDxjPlppcGZpbGU8L2M+IGlzIFJFQUQuICBUaGlzIG1lYW5zIHlvdSBtdXN0IHVzZSBhIDxjPlppcEZpbGUuUmVhZCgpPC9jPgorICAgICAgICAvLy8gICBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBTeXN0ZW0uVGV4dC5FbmNvZGluZyBwYXJhbWV0ZXIuICBTZXR0aW5nCisgICAgICAgIC8vLyAgIHRoZSBQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIHByb3BlcnR5IGFmdGVyIHlvdXIgYXBwbGljYXRpb24gaGFzIHJlYWQgaW4KKyAgICAgICAgLy8vICAgdGhlIHppcCBhcmNoaXZlIHdpbGwgbm90IGFmZmVjdCB0aGUgZW50cnkgbmFtZXMgb2YgZW50cmllcyB0aGF0IGhhdmUgYWxyZWFkeQorICAgICAgICAvLy8gICBiZWVuIHJlYWQgaW4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFuZCBub3csIHRoZSBleGNlcHRpb24gdG8gdGhlIHJ1bGUgZGVzY3JpYmVkIGFib3ZlLiAgT25lIHN0cmF0ZWd5IGZvcgorICAgICAgICAvLy8gICBzcGVjaWZ5aW5nIHRoZSBjb2RlIHBhZ2UgZm9yIGEgZ2l2ZW4gemlwIGZpbGUgaXMgdG8gZGVzY3JpYmUgdGhlIGNvZGUgcGFnZQorICAgICAgICAvLy8gICBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0gaW4gdGhlIFppcCBjb21tZW50LiBGb3IgZXhhbXBsZSwgdGhlIGNvbW1lbnQgbWF5CisgICAgICAgIC8vLyAgIHJlYWQgIkVudHJpZXMgaW4gdGhpcyBhcmNoaXZlIGFyZSBlbmNvZGVkIGluIHRoZSBCaWc1IGNvZGUgcGFnZSIuICBGb3IKKyAgICAgICAgLy8vICAgbWF4aW11bSBpbnRlcm9wZXJhYmlsaXR5LCB0aGUgemlwIGNvbW1lbnQgaW4gdGhpcyBjYXNlIHNob3VsZCBiZSBlbmNvZGVkCisgICAgICAgIC8vLyAgIGluIHRoZSBkZWZhdWx0LCBJQk00MzcgY29kZSBwYWdlLiAgSW4gdGhpcyBjYXNlLCB0aGUgemlwIGNvbW1lbnQgaXMKKyAgICAgICAgLy8vICAgZW5jb2RlZCB1c2luZyBhIGRpZmZlcmVudCBwYWdlIHRoYW4gdGhlIGZpbGVuYW1lcy4gIFRvIGRvIHRoaXMsIFNwZWNpZnkKKyAgICAgICAgLy8vICAgPGM+UHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZzwvYz4gdG8geW91ciBkZXNpcmVkIHJlZ2lvbi1zcGVjaWZpYyBjb2RlCisgICAgICAgIC8vLyAgIHBhZ2UsIG9uY2UgYmVmb3JlIGFkZGluZyBhbnkgZW50cmllcywgYW5kIHRoZW4gcmVzZXQKKyAgICAgICAgLy8vICAgPGM+UHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZzwvYz4gdG8gSUJNNDM3IGJlZm9yZSBzZXR0aW5nIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkNvbW1lbnQiLz4gcHJvcGVydHkgYW5kIGNhbGxpbmcgU2F2ZSgpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byByZWFkIGEgemlwIGZpbGUgdXNpbmcgdGhlIEJpZy01IENoaW5lc2UgY29kZSBwYWdlCisgICAgICAgIC8vLyAoOTUwKSwgYW5kIGV4dHJhY3QgZWFjaCBlbnRyeSBpbiB0aGUgemlwIGZpbGUuICBGb3IgdGhpcyBjb2RlIHRvIHdvcmsgYXMKKyAgICAgICAgLy8vIGRlc2lyZWQsIHRoZSA8Yz5aaXBmaWxlPC9jPiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHVzaW5nIHRoZSBiaWc1IGNvZGUgcGFnZQorICAgICAgICAvLy8gKENQOTUwKS4gVGhpcyBpcyB0eXBpY2FsLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2luZyBXaW5SYXIgb24gYSBtYWNoaW5lIHdpdGgKKyAgICAgICAgLy8vIENQOTUwIHNldCBhcyB0aGUgZGVmYXVsdCBjb2RlIHBhZ2UuICBJbiB0aGF0IGNhc2UsIHRoZSBuYW1lcyBvZiBlbnRyaWVzCisgICAgICAgIC8vLyB3aXRoaW4gdGhlIFppcCBhcmNoaXZlIHdpbGwgYmUgc3RvcmVkIGluIHRoYXQgY29kZSBwYWdlLCBhbmQgcmVhZGluZyB0aGUgemlwCisgICAgICAgIC8vLyBhcmNoaXZlIG11c3QgYmUgZG9uZSB1c2luZyB0aGF0IGNvZGUgcGFnZS4gIElmIHRoZSBhcHBsaWNhdGlvbiBkaWQgbm90IHVzZQorICAgICAgICAvLy8gdGhlIGNvcnJlY3QgY29kZSBwYWdlIGluIDxjPlppcEZpbGUuUmVhZCgpPC9jPiwgdGhlbiBuYW1lcyBvZiBlbnRyaWVzIHdpdGhpbiB0aGUKKyAgICAgICAgLy8vIHppcCBhcmNoaXZlIHdvdWxkIG5vdCBiZSBjb3JyZWN0bHkgcmV0cmlldmVkLgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAodmFyIHppcCA9IFppcEZpbGUuUmVhZCh6aXBGaWxlTmFtZSwgU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoImJpZzUiKSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgLy8gcmV0cmlldmUgYW5kIGV4dHJhY3QgYW4gZW50cnkgdXNpbmcgYSBuYW1lIGVuY29kZWQgd2l0aCBDUDk1MAorICAgICAgICAvLy8gICAgIHppcFtNeURlc2lyZWRFbnRyeV0uRXh0cmFjdCgidW5wYWNrIik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoWmlwVG9FeHRyYWN0LCBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZygiYmlnNSIpKQorICAgICAgICAvLy8gICAgICcgcmV0cmlldmUgYW5kIGV4dHJhY3QgYW4gZW50cnkgdXNpbmcgYSBuYW1lIGVuY29kZWQgd2l0aCBDUDk1MAorICAgICAgICAvLy8gICAgIHppcChNeURlc2lyZWRFbnRyeSkuRXh0cmFjdCgidW5wYWNrIikKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLkRlZmF1bHRFbmNvZGluZyI+RGVmYXVsdEVuY29kaW5nPC9zZWVhbHNvPgorICAgICAgICBbT2Jzb2xldGUoInVzZSBBbHRlcm5hdGVFbmNvZGluZyBpbnN0ZWFkLiIpXQorICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2FsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPT0gWmlwT3B0aW9uLkFzTmVjZXNzYXJ5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2FsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2FsdGVybmF0ZUVuY29kaW5nID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX2FsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPSBaaXBPcHRpb24uQXNOZWNlc3Nhcnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQSBUZXh0IEVuY29kaW5nIHRvIHVzZSB3aGVuIGVuY29kaW5nIHRoZSBmaWxlbmFtZXMgYW5kIGNvbW1lbnRzIGZvcgorICAgICAgICAvLy8gICBhbGwgdGhlIFppcEVudHJ5IGl0ZW1zLCBkdXJpbmcgYSBaaXBGaWxlLlNhdmUoKSBvcGVyYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgV2hldGhlciB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGhlcmUgaXMgdXNlZCBkdXJpbmcgdGhlIHNhdmUgZGVwZW5kcworICAgICAgICAvLy8gICAgIG9uIDxzZWUgY3JlZj0iQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSIvPi4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgQWx0ZXJuYXRlRW5jb2RpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hbHRlcm5hdGVFbmNvZGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEEgZmxhZyB0aGF0IHRlbGxzIGlmIGFuZCB3aGVuIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGFwcGx5CisgICAgICAgIC8vLyAgIEFsdGVybmF0ZUVuY29kaW5nIHRvIGVuY29kZSB0aGUgZmlsZW5hbWVzIGFuZCBjb21tZW50cyBhc3NvY2lhdGVkIHRvCisgICAgICAgIC8vLyAgIG9mIFppcEVudHJ5IG9iamVjdHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBaaXBPcHRpb24gQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FsdGVybmF0ZUVuY29kaW5nVXNhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCB0ZXh0IGVuY29kaW5nIHVzZWQgaW4gemlwIGFyY2hpdmVzLiAgSXQgaXMgbnVtZXJpYyA0MzcsIGFsc28KKyAgICAgICAgLy8vIGtub3duIGFzIElCTTQzNy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBTeXN0ZW0uVGV4dC5FbmNvZGluZyBEZWZhdWx0RW5jb2RpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0RW5jb2Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgb3Igc2V0cyB0aGUgPGM+VGV4dFdyaXRlcjwvYz4gdG8gd2hpY2ggc3RhdHVzIG1lc3NhZ2VzIGFyZSBkZWxpdmVyZWQKKyAgICAgICAgLy8vIGZvciB0aGUgaW5zdGFuY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIElmIHRoZSBUZXh0V3JpdGVyIGlzIHNldCB0byBhIG5vbi1udWxsIHZhbHVlLCB0aGVuIHZlcmJvc2Ugb3V0cHV0IGlzIHNlbnQKKyAgICAgICAgLy8vICAgdG8gdGhlIDxjPlRleHRXcml0ZXI8L2M+IGR1cmluZyA8Yz5BZGQ8L2M+PGM+LCBSZWFkPC9jPjxjPiwgU2F2ZTwvYz4gYW5kCisgICAgICAgIC8vLyAgIDxjPkV4dHJhY3Q8L2M+IG9wZXJhdGlvbnMuICBUeXBpY2FsbHksIGNvbnNvbGUgYXBwbGljYXRpb25zIG1pZ2h0IHVzZQorICAgICAgICAvLy8gICA8Yz5Db25zb2xlLk91dDwvYz4gYW5kIGdyYXBoaWNhbCBvciBoZWFkbGVzcyBhcHBsaWNhdGlvbnMgbWlnaHQgdXNlIGEKKyAgICAgICAgLy8vICAgPGM+U3lzdGVtLklPLlN0cmluZ1dyaXRlcjwvYz4uIFRoZSBvdXRwdXQgb2YgdGhpcyBpcyBzdWl0YWJsZSBmb3Igdmlld2luZworICAgICAgICAvLy8gICBieSBodW1hbnMuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gdGhpcyBleGFtcGxlLCBhIGNvbnNvbGUgYXBwbGljYXRpb24gaW5zdGFudGlhdGVzIGEgPGM+WmlwRmlsZTwvYz4sIHRoZW4KKyAgICAgICAgLy8vICAgc2V0cyB0aGUgPGM+U3RhdHVzTWVzc2FnZVRleHRXcml0ZXI8L2M+IHRvIDxjPkNvbnNvbGUuT3V0PC9jPi4gIEF0IHRoYXQKKyAgICAgICAgLy8vICAgcG9pbnQsIGFsbCB2ZXJib3NlIHN0YXR1cyBtZXNzYWdlcyBmb3IgdGhhdCA8Yz5aaXBGaWxlPC9jPiBhcmUgc2VudCB0byB0aGUKKyAgICAgICAgLy8vICAgY29uc29sZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXA9IFppcEZpbGUuUmVhZChGaWxlUGF0aCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIHppcC5TdGF0dXNNZXNzYWdlVGV4dFdyaXRlcj0gU3lzdGVtLkNvbnNvbGUuT3V0OworICAgICAgICAvLy8gICAvLyBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgY29uc29sZSBkdXJpbmcgZXh0cmFjdGlvbgorICAgICAgICAvLy8gICB6aXAuRXh0cmFjdEFsbCgpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKEZpbGVQYXRoKQorICAgICAgICAvLy8gICB6aXAuU3RhdHVzTWVzc2FnZVRleHRXcml0ZXI9IFN5c3RlbS5Db25zb2xlLk91dAorICAgICAgICAvLy8gICAnU3RhdHVzIE1lc3NhZ2VzIHdpbGwgYmUgc2VudCB0byB0aGUgY29uc29sZSBkdXJpbmcgZXh0cmFjdGlvbgorICAgICAgICAvLy8gICB6aXAuRXh0cmFjdEFsbCgpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gdGhpcyBleGFtcGxlLCBhIFdpbmRvd3MgRm9ybXMgYXBwbGljYXRpb24gaW5zdGFudGlhdGVzIGEKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4sIHRoZW4gc2V0cyB0aGUgPGM+U3RhdHVzTWVzc2FnZVRleHRXcml0ZXI8L2M+IHRvIGEKKyAgICAgICAgLy8vICAgPGM+U3RyaW5nV3JpdGVyPC9jPi4gIEF0IHRoYXQgcG9pbnQsIGFsbCB2ZXJib3NlIHN0YXR1cyBtZXNzYWdlcyBmb3IgdGhhdAorICAgICAgICAvLy8gICA8Yz5aaXBGaWxlPC9jPiBhcmUgc2VudCB0byB0aGUgPGM+U3RyaW5nV3JpdGVyPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB2YXIgc3cgPSBuZXcgU3lzdGVtLklPLlN0cmluZ1dyaXRlcigpOworICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwPSBaaXBGaWxlLlJlYWQoRmlsZVBhdGgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICB6aXAuU3RhdHVzTWVzc2FnZVRleHRXcml0ZXI9IHN3OworICAgICAgICAvLy8gICB6aXAuRXh0cmFjdEFsbCgpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gQ29uc29sZS5Xcml0ZUxpbmUoInswfSIsIHN3LlRvU3RyaW5nKCkpOworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIERpbSBzdyBhcyBOZXcgU3lzdGVtLklPLlN0cmluZ1dyaXRlcgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoRmlsZVBhdGgpCisgICAgICAgIC8vLyAgIHppcC5TdGF0dXNNZXNzYWdlVGV4dFdyaXRlcj0gc3cKKyAgICAgICAgLy8vICAgemlwLkV4dHJhY3RBbGwoKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyAnU3RhdHVzIE1lc3NhZ2VzIGFyZSBub3cgYXZhaWxhYmxlIGluIHN3CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICBwdWJsaWMgVGV4dFdyaXRlciBTdGF0dXNNZXNzYWdlVGV4dFdyaXRlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX1N0YXR1c01lc3NhZ2VUZXh0V3JpdGVyOyB9CisgICAgICAgICAgICBzZXQgeyBfU3RhdHVzTWVzc2FnZVRleHRXcml0ZXIgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBHZXRzIG9yIHNldHMgdGhlIG5hbWUgZm9yIHRoZSBmb2xkZXIgdG8gc3RvcmUgdGhlIHRlbXBvcmFyeSBmaWxlCisgICAgICAgIC8vLyAgIHRoaXMgbGlicmFyeSB3cml0ZXMgd2hlbiBzYXZpbmcgYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGxpYnJhcnkgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB3aGVuIHNhdmluZyBhIFppcCBhcmNoaXZlIHRvIGEKKyAgICAgICAgLy8vICAgZmlsZS4gIFRoaXMgZmlsZSBpcyB3cml0dGVuIHdoZW4gY2FsbGluZyBvbmUgb2YgdGhlIDxjPlNhdmUoKTwvYz4gbWV0aG9kcworICAgICAgICAvLy8gICB0aGF0IGRvZXMgbm90IHNhdmUgdG8gYSBzdHJlYW0sIG9yIG9uZSBvZiB0aGUgPGM+U2F2ZVNlbGZFeHRyYWN0b3IoKTwvYz4KKyAgICAgICAgLy8vICAgbWV0aG9kcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgd2lsbCBjcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIGZvciB0aGUgZmlsZSBpdHNlbGYsIHZpYSB0aGUgPHNlZSBjcmVmPSJOYW1lIi8+IHByb3BlcnR5IG9yIHZpYQorICAgICAgICAvLy8gICB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlLlNhdmUoU3RyaW5nKSIvPiBtZXRob2QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbGxvd3MgYXBwbGljYXRpb25zIHRvIG92ZXJyaWRlIHRoaXMgZGVmYXVsdAorICAgICAgICAvLy8gICBiZWhhdmlvciwgc28gdGhhdCB0aGUgbGlicmFyeSB3aWxsIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlCisgICAgICAgIC8vLyAgIHNwZWNpZmllZCBmb2xkZXIuIEZvciBleGFtcGxlLCB0byBoYXZlIHRoZSBsaWJyYXJ5IGNyZWF0ZSB0aGUgdGVtcG9yYXJ5CisgICAgICAgIC8vLyAgIGZpbGUgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIHJlZ2FyZGxlc3Mgd2hlcmUgdGhlIDxjPlppcEZpbGU8L2M+CisgICAgICAgIC8vLyAgIGlzIHNhdmVkLCBzcGVjZnkgIi4iLiAgVG8gcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBzZXQgdGhpcworICAgICAgICAvLy8gICBwcm9wZXJ0eSB0byA8Yz5udWxsPC9jPiAoPGM+Tm90aGluZzwvYz4gaW4gVkIpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHNldHRpbmcgdGhlIHByb3BlcnR5IHRvIGEgbm9uLW51bGwgdmFsdWUsIHRoZSBmb2xkZXIgc3BlY2lmaWVkIG11c3QKKyAgICAgICAgLy8vICAgZXhpc3Q7IGlmIGl0IGRvZXMgbm90IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGhhdmUKKyAgICAgICAgLy8vICAgd3JpdGUgYW5kIGRlbGV0ZSBwZXJtaXNzaW9ucyBvbiB0aGUgZm9sZGVyLiAgVGhlIHBlcm1pc3Npb25zIGFyZSBub3QKKyAgICAgICAgLy8vICAgZXhwbGljaXRseSBjaGVja2VkIGFoZWFkIG9mIHRpbWU7IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQorICAgICAgICAvLy8gICBhcHByb3ByaWF0ZSByaWdodHMsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBhdCB0aGUgdGltZSA8Yz5TYXZlKCk8L2M+CisgICAgICAgIC8vLyAgIGlzIGNhbGxlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlcmUgaXMgbm8gdGVtcG9yYXJ5IGZpbGUgY3JlYXRlZCB3aGVuIHJlYWRpbmcgYSB6aXAgYXJjaGl2ZS4gIFdoZW4KKyAgICAgICAgLy8vICAgc2F2aW5nIHRvIGEgU3RyZWFtLCB0aGVyZSBpcyBubyB0ZW1wb3JhcnkgZmlsZSBjcmVhdGVkLiAgRm9yIGV4YW1wbGUsIGlmCisgICAgICAgIC8vLyAgIHRoZSBhcHBsaWNhdGlvbiBpcyBhbiBBU1AuTkVUIGFwcGxpY2F0aW9uIGFuZCBjYWxscyA8Yz5TYXZlKCk8L2M+CisgICAgICAgIC8vLyAgIHNwZWNpZnlpbmcgdGhlIDxjPlJlc3BvbnNlLk91dHB1dFN0cmVhbTwvYz4gYXMgdGhlIG91dHB1dCBzdHJlYW0sIHRoZXJlIGlzCisgICAgICAgIC8vLyAgIG5vIHRlbXBvcmFyeSBmaWxlIGNyZWF0ZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJTeXN0ZW0uSU8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKyAgICAgICAgLy8vIFRocm93biB3aGVuIHNldHRpbmcgdGhlIHByb3BlcnR5IGlmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyBTdHJpbmcgVGVtcEZpbGVGb2xkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9UZW1wRmlsZUZvbGRlcjsgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfVGVtcEZpbGVGb2xkZXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJUaGF0IGRpcmVjdG9yeSAoezB9KSBkb2VzIG5vdCBleGlzdC4iLCB2YWx1ZSkpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIHRoZSBwYXNzd29yZCB0byBiZSB1c2VkIG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiB3cml0aW5nIGEgemlwIGFyY2hpdmUsIHRoaXMgcGFzc3dvcmQgaXMgYXBwbGllZCB0byB0aGUgZW50cmllcywgbm90CisgICAgICAgIC8vLyAgIHRvIHRoZSB6aXAgYXJjaGl2ZSBpdHNlbGYuIEl0IGFwcGxpZXMgdG8gYW55IDxjPlppcEVudHJ5PC9jPiBzdWJzZXF1ZW50bHkKKyAgICAgICAgLy8vICAgYWRkZWQgdG8gdGhlIDxjPlppcEZpbGU8L2M+LCB1c2luZyBvbmUgb2YgdGhlIDxjPkFkZEZpbGU8L2M+LAorICAgICAgICAvLy8gICA8Yz5BZGREaXJlY3Rvcnk8L2M+LCA8Yz5BZGRFbnRyeTwvYz4sIG9yIDxjPkFkZEl0ZW08L2M+IG1ldGhvZHMsIGV0Yy4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGEgemlwIGFyY2hpdmUsIHRoaXMgcHJvcGVydHkgYXBwbGllcyB0byBhbnkgZW50cnkKKyAgICAgICAgLy8vICAgc3Vic2VxdWVudGx5IGV4dHJhY3RlZCBmcm9tIHRoZSA8Yz5aaXBGaWxlPC9jPiB1c2luZyBvbmUgb2YgdGhlIEV4dHJhY3QKKyAgICAgICAgLy8vICAgbWV0aG9kcyBvbiB0aGUgPGM+WmlwRmlsZTwvYz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gd3JpdGluZyBhIHppcCBhcmNoaXZlLCBrZWVwIHRoaXMgaW4gbWluZDogdGhvdWdoIHRoZSBwYXNzd29yZCBpcyBzZXQKKyAgICAgICAgLy8vICAgb24gdGhlIFppcEZpbGUgb2JqZWN0LCBhY2NvcmRpbmcgdG8gdGhlIFppcCBzcGVjLCB0aGUgImRpcmVjdG9yeSIgb2YgdGhlCisgICAgICAgIC8vLyAgIGFyY2hpdmUgLSBpbiBvdGhlciB3b3JkcyB0aGUgbGlzdCBvZiBlbnRyaWVzIG9yIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZSAtIGlzCisgICAgICAgIC8vLyAgIG5vdCBlbmNyeXB0ZWQgd2l0aCB0aGUgcGFzc3dvcmQsIG9yIHByb3RlY3RlZCBpbiBhbnkgd2F5LiAgSWYgeW91IHNldCB0aGUKKyAgICAgICAgLy8vICAgUGFzc3dvcmQgcHJvcGVydHksIHRoZSBwYXNzd29yZCBhY3R1YWxseSBhcHBsaWVzIHRvIGluZGl2aWR1YWwgZW50cmllcworICAgICAgICAvLy8gICB0aGF0IGFyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZSwgc3Vic2VxdWVudCB0byB0aGUgc2V0dGluZyBvZiB0aGlzIHByb3BlcnR5LgorICAgICAgICAvLy8gICBUaGUgbGlzdCBvZiBmaWxlbmFtZXMgaW4gdGhlIGFyY2hpdmUgdGhhdCBpcyBldmVudHVhbGx5IGNyZWF0ZWQgd2lsbAorICAgICAgICAvLy8gICBhcHBlYXIgaW4gY2xlYXIgdGV4dCwgYnV0IHRoZSBjb250ZW50cyBvZiB0aGUgaW5kaXZpZHVhbCBmaWxlcyBhcmUKKyAgICAgICAgLy8vICAgZW5jcnlwdGVkLiAgVGhpcyBpcyBob3cgWmlwIGVuY3J5cHRpb24gd29ya3MuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIE9uZSBzaW1wbGUgd2F5IGFyb3VuZCB0aGlzIGxpbWl0YXRpb24gaXMgdG8gc2ltcGx5IGRvdWJsZS13cmFwIHNlbnNpdGl2ZQorICAgICAgICAvLy8gICBmaWxlbmFtZXM6IFN0b3JlIHRoZSBmaWxlcyBpbiBhIHppcCBmaWxlLCBhbmQgdGhlbiBzdG9yZSB0aGF0IHppcCBmaWxlCisgICAgICAgIC8vLyAgIHdpdGhpbiBhIHNlY29uZCwgIm91dGVyIiB6aXAgZmlsZS4gIElmIHlvdSBhcHBseSBhIHBhc3N3b3JkIHRvIHRoZSBvdXRlcgorICAgICAgICAvLy8gICB6aXAgZmlsZSwgdGhlbiByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBzZWUgdGhhdCB0aGUgb3V0ZXIgemlwIGZpbGUKKyAgICAgICAgLy8vICAgY29udGFpbnMgYW4gaW5uZXIgemlwIGZpbGUuICBCdXQgcmVhZGVycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlCisgICAgICAgIC8vLyAgIGRpcmVjdG9yeSBvciBmaWxlIGxpc3Qgb2YgdGhlIGlubmVyIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugc2V0IHRoZSBwYXNzd29yZCBvbiB0aGUgPGM+WmlwRmlsZTwvYz4sIGFuZCB0aGVuIGFkZCBhIHNldCBvZiBmaWxlcworICAgICAgICAvLy8gICB0byB0aGUgYXJjaGl2ZSwgdGhlbiBlYWNoIGVudHJ5IGlzIGVuY3J5cHRlZCB3aXRoIHRoYXQgcGFzc3dvcmQuICBZb3UgbWF5CisgICAgICAgIC8vLyAgIGFsc28gd2FudCB0byBjaGFuZ2UgdGhlIHBhc3N3b3JkIGJldHdlZW4gYWRkaW5nIGRpZmZlcmVudCBlbnRyaWVzLiBJZiB5b3UKKyAgICAgICAgLy8vICAgc2V0IHRoZSBwYXNzd29yZCwgYWRkIGFuIGVudHJ5LCB0aGVuIHNldCB0aGUgcGFzc3dvcmQgdG8gPGM+bnVsbDwvYz4KKyAgICAgICAgLy8vICAgKDxjPk5vdGhpbmc8L2M+IGluIFZCKSwgYW5kIGFkZCBhbm90aGVyIGVudHJ5LCB0aGUgZmlyc3QgZW50cnkgaXMKKyAgICAgICAgLy8vICAgZW5jcnlwdGVkIGFuZCB0aGUgc2Vjb25kIGlzIG5vdC4gIElmIHlvdSBjYWxsIDxjPkFkZEZpbGUoKTwvYz4sIHRoZW4gc2V0CisgICAgICAgIC8vLyAgIHRoZSA8Yz5QYXNzd29yZDwvYz4gcHJvcGVydHksIHRoZW4gY2FsbCA8Yz5aaXBGaWxlLlNhdmU8L2M+LCB0aGUgZmlsZQorICAgICAgICAvLy8gICBhZGRlZCB3aWxsIG5vdCBiZSBwYXNzd29yZC1wcm90ZWN0ZWQsIGFuZCBubyB3YXJuaW5nIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHNldHRpbmcgdGhlIFBhc3N3b3JkLCB5b3UgbWF5IGFsc28gd2FudCB0byBleHBsaWNpdGx5IHNldCB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJFbmNyeXB0aW9uIi8+IHByb3BlcnR5LCB0byBzcGVjaWZ5IGhvdyB0byBlbmNyeXB0IHRoZSBlbnRyaWVzIGFkZGVkCisgICAgICAgIC8vLyAgIHRvIHRoZSBaaXBGaWxlLiAgSWYgeW91IHNldCB0aGUgUGFzc3dvcmQgdG8gYSBub24tbnVsbCB2YWx1ZSBhbmQgZG8gbm90CisgICAgICAgIC8vLyAgIHNldCA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIHRoZW4gUEtaaXAgMi4wICgiV2VhayIpIGVuY3J5cHRpb24gaXMgdXNlZC4KKyAgICAgICAgLy8vICAgVGhpcyBlbmNyeXB0aW9uIGlzIHJlbGF0aXZlbHkgd2VhayBidXQgaXMgdmVyeSBpbnRlcm9wZXJhYmxlLiBJZiB5b3Ugc2V0CisgICAgICAgIC8vLyAgIHRoZSBwYXNzd29yZCB0byBhIDxjPm51bGw8L2M+IHZhbHVlICg8Yz5Ob3RoaW5nPC9jPiBpbiBWQiksIEVuY3J5cHRpb24gaXMKKyAgICAgICAgLy8vICAgcmVzZXQgdG8gTm9uZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQWxsIG9mIHRoZSBwcmVjZWRpbmcgYXBwbGllcyB0byB3cml0aW5nIHppcCBhcmNoaXZlcywgaW4gb3RoZXIgd29yZHMgd2hlbgorICAgICAgICAvLy8gICB5b3UgdXNlIG9uZSBvZiB0aGUgU2F2ZSBtZXRob2RzLiAgVG8gdXNlIHRoaXMgcHJvcGVydHkgd2hlbiByZWFkaW5nIG9yIGFuCisgICAgICAgIC8vLyAgIGV4aXN0aW5nIFppcEZpbGUsIGRvIHRoZSBmb2xsb3dpbmc6IHNldCB0aGUgUGFzc3dvcmQgcHJvcGVydHkgb24gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+LCB0aGVuIGNhbGwgb25lIG9mIHRoZSBFeHRyYWN0KCkgb3ZlcmxvYWRzIG9uIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcEVudHJ5IiAvPi4gSW4gdGhpcyBjYXNlLCB0aGUgZW50cnkgaXMgZXh0cmFjdGVkIHVzaW5nIHRoZQorICAgICAgICAvLy8gICA8Yz5QYXNzd29yZDwvYz4gdGhhdCBpcyBzcGVjaWZpZWQgb24gdGhlIDxjPlppcEZpbGU8L2M+IGluc3RhbmNlLiBJZiB5b3UKKyAgICAgICAgLy8vICAgaGF2ZSBub3Qgc2V0IHRoZSA8Yz5QYXNzd29yZDwvYz4gcHJvcGVydHksIHRoZW4gdGhlIHBhc3N3b3JkIGlzCisgICAgICAgIC8vLyAgIDxjPm51bGw8L2M+LCBhbmQgdGhlIGVudHJ5IGlzIGV4dHJhY3RlZCB3aXRoIG5vIHBhc3N3b3JkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugc2V0IHRoZSBQYXNzd29yZCBwcm9wZXJ0eSBvbiB0aGUgPGM+WmlwRmlsZTwvYz4sIHRoZW4gY2FsbAorICAgICAgICAvLy8gICA8Yz5FeHRyYWN0KCk8L2M+IGFuIGVudHJ5IHRoYXQgaGFzIG5vdCBiZWVuIGVuY3J5cHRlZCB3aXRoIGEgcGFzc3dvcmQsIHRoZQorICAgICAgICAvLy8gICBwYXNzd29yZCBpcyBub3QgdXNlZCBmb3IgdGhhdCBlbnRyeSwgYW5kIHRoZSA8Yz5aaXBFbnRyeTwvYz4gaXMgZXh0cmFjdGVkCisgICAgICAgIC8vLyAgIGFzIG5vcm1hbC4gSW4gb3RoZXIgd29yZHMsIHRoZSBwYXNzd29yZCBpcyB1c2VkIG9ubHkgaWYgbmVjZXNzYXJ5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgPHNlZSBjcmVmPSJaaXBFbnRyeSIvPiBjbGFzcyBhbHNvIGhhcyBhIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuUGFzc3dvcmQiPlBhc3N3b3JkPC9zZWU+IHByb3BlcnR5LiAgSXQgdGFrZXMgcHJlY2VkZW5jZQorICAgICAgICAvLy8gICBvdmVyIHRoaXMgcHJvcGVydHkgb24gdGhlIDxjPlppcEZpbGU8L2M+LiAgVHlwaWNhbGx5LCB5b3Ugd291bGQgdXNlIHRoZQorICAgICAgICAvLy8gICBwZXItZW50cnkgUGFzc3dvcmQgd2hlbiBtb3N0IGVudHJpZXMgaW4gdGhlIHppcCBhcmNoaXZlIHVzZSBvbmUgcGFzc3dvcmQsCisgICAgICAgIC8vLyAgIGFuZCBhIGZldyBlbnRyaWVzIHVzZSBhIGRpZmZlcmVudCBwYXNzd29yZC4gIElmIGFsbCBlbnRyaWVzIGluIHRoZSB6aXAKKyAgICAgICAgLy8vICAgZmlsZSB1c2UgdGhlIHNhbWUgcGFzc3dvcmQsIHRoZW4gaXQgaXMgc2ltcGxlciB0byBqdXN0IHNldCB0aGlzIHByb3BlcnR5CisgICAgICAgIC8vLyAgIG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBpdHNlbGYsIHdoZXRoZXIgY3JlYXRpbmcgYSB6aXAgYXJjaGl2ZSBvciBleHRyYWN0aW5nCisgICAgICAgIC8vLyAgIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgemlwIGZpbGUsIHVzaW5nIHBhc3N3b3JkIHByb3RlY3Rpb24gZm9yIHRoZQorICAgICAgICAvLy8gICBlbnRyaWVzLCBhbmQgdGhlbiBleHRyYWN0cyB0aGUgZW50cmllcyBmcm9tIHRoZSB6aXAgZmlsZS4gIFdoZW4gY3JlYXRpbmcKKyAgICAgICAgLy8vICAgdGhlIHppcCBmaWxlLCB0aGUgUmVhZG1lLnR4dCBmaWxlIGlzIG5vdCBwcm90ZWN0ZWQgd2l0aCBhIHBhc3N3b3JkLCBidXQKKyAgICAgICAgLy8vICAgdGhlIG90aGVyIHR3byBhcmUgcGFzc3dvcmQtcHJvdGVjdGVkIGFzIHRoZXkgYXJlIHNhdmVkLiBEdXJpbmcgZXh0cmFjdGlvbiwKKyAgICAgICAgLy8vICAgZWFjaCBmaWxlIGlzIGV4dHJhY3RlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwYXNzd29yZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gLy8gY3JlYXRlIGEgZmlsZSB3aXRoIGVuY3J5cHRpb24KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoIlJlYWRNZS50eHQiKTsKKyAgICAgICAgLy8vICAgICB6aXAuUGFzc3dvcmQ9ICIhU2VjcmV0MSI7CisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoIk1hcFRvVGhlU2l0ZS03NDQwLU40OXRoLnBuZyIpOworICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCIyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiKTsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSgiRW5jcnlwdGVkQXJjaGl2ZS56aXAiKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAvLyBleHRyYWN0IGVudHJpZXMgdGhhdCB1c2UgZW5jcnlwdGlvbgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gWmlwRmlsZS5SZWFkKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHppcC5QYXNzd29yZD0gIiFTZWNyZXQxIjsKKyAgICAgICAgLy8vICAgICB6aXAuRXh0cmFjdEFsbCgiZXh0cmFjdERpciIpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZSgiUmVhZE1lLnR4dCIpCisgICAgICAgIC8vLyAgICAgemlwLlBhc3N3b3JkID0gIjEyMzQ1NiEiCisgICAgICAgIC8vLyAgICAgemlwLkFkZEZpbGUoIk1hcFRvVGhlU2l0ZS03NDQwLU40OXRoLnBuZyIpCisgICAgICAgIC8vLyAgICAgemlwLlBhc3N3b3JkPSAiIVNlY3JldDEiOworICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCIyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vCisgICAgICAgIC8vLworICAgICAgICAvLy8gJyBleHRyYWN0IGVudHJpZXMgdGhhdCB1c2UgZW5jcnlwdGlvbgorICAgICAgICAvLy8gVXNpbmcgKHppcCBhcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpKQorICAgICAgICAvLy8gICAgIHppcC5QYXNzd29yZD0gIiFTZWNyZXQxIgorICAgICAgICAvLy8gICAgIHppcC5FeHRyYWN0QWxsKCJleHRyYWN0RGlyIikKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuRW5jcnlwdGlvbiI+WmlwRmlsZS5FbmNyeXB0aW9uPC9zZWVhbHNvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRW50cnkuUGFzc3dvcmQiPlppcEVudHJ5LlBhc3N3b3JkPC9zZWVhbHNvPgorICAgICAgICBwdWJsaWMgU3RyaW5nIFBhc3N3b3JkCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9QYXNzd29yZCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChfUGFzc3dvcmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb24gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKEVuY3J5cHRpb24gPT0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9QYXNzd29yZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgYWN0aW9uIHRoZSBsaWJyYXJ5IHNob3VsZCB0YWtlIHdoZW4gZXh0cmFjdGluZyBhIGZpbGUgdGhhdCBhbHJlYWR5CisgICAgICAgIC8vLyAgIGV4aXN0cy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IGFmZmVjdHMgdGhlIGJlaGF2aW9yIG9mIHRoZSBFeHRyYWN0IG1ldGhvZHMgKG9uZSBvZiB0aGUKKyAgICAgICAgLy8vICAgPGM+RXh0cmFjdCgpPC9jPiBvciA8Yz5FeHRyYWN0V2l0aFBhc3N3b3JkKCk8L2M+IG92ZXJsb2FkcyksIHdoZW4KKyAgICAgICAgLy8vICAgZXh0cmFjdGlvbiB3b3VsZCB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZXN5c3RlbSBmaWxlLiBJZiB5b3UgZG8KKyAgICAgICAgLy8vICAgbm90IHNldCB0aGlzIHByb3BlcnR5LCB0aGUgbGlicmFyeSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gZXh0cmFjdGluZyBhbgorICAgICAgICAvLy8gICBlbnRyeSB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IHdoZW4gZXh0cmFjdGluZyB0byBhIHN0cmVhbSwgb3Igd2hlbiB0aGUgZmlsZQorICAgICAgICAvLy8gICB0byBiZSBleHRyYWN0ZWQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkV4dHJhY3RFeGlzdGluZ0ZpbGUiLz4KKyAgICAgICAgaW50ZXJuYWwgRXh0cmFjdEV4aXN0aW5nRmlsZUFjdGlvbiBFeHRyYWN0RXhpc3RpbmdGaWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgYWN0aW9uIHRoZSBsaWJyYXJ5IHNob3VsZCB0YWtlIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUKKyAgICAgICAgLy8vICAgb3BlbmluZyBvciByZWFkaW5nIGZpbGVzIGFzIHRoZXkgYXJlIHNhdmVkIGludG8gYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIEVycm9ycyBjYW4gb2NjdXIgYXMgYSBmaWxlIGlzIGJlaW5nIHNhdmVkIHRvIHRoZSB6aXAgYXJjaGl2ZS4gIEZvcgorICAgICAgICAvLy8gICAgZXhhbXBsZSwgdGhlIEZpbGUuT3BlbiBtYXkgZmFpbCwgb3IgYSBGaWxlLlJlYWQgbWF5IGZhaWwsIGJlY2F1c2Ugb2YKKyAgICAgICAgLy8vICAgIGxvY2sgY29uZmxpY3RzIG9yIG90aGVyIHJlYXNvbnMuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIFRoZSBmaXJzdCBwcm9ibGVtIG1pZ2h0IG9jY3VyIGFmdGVyIGhhdmluZyBjYWxsZWQgQWRkRGlyZWN0b3J5KCkgb24gYQorICAgICAgICAvLy8gICAgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgYSBDbGlwcGVyIC5kYmYgZmlsZTsgdGhlIGZpbGUgaXMgbG9ja2VkIGJ5CisgICAgICAgIC8vLyAgICBDbGlwcGVyIGFuZCBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkIGJ5IGFub3RoZXIgcHJvY2Vzcy4gQW4gZXhhbXBsZSBvZgorICAgICAgICAvLy8gICAgdGhlIHNlY29uZCBwcm9ibGVtIG1pZ2h0IG9jY3VyIHdoZW4gdHJ5aW5nIHRvIHppcCBhIC5wc3QgZmlsZSB0aGF0IGlzIGluCisgICAgICAgIC8vLyAgICB1c2UgYnkgTWljcm9zb2Z0IE91dGxvb2suIE91dGxvb2sgbG9ja3MgYSByYW5nZSBvbiB0aGUgZmlsZSwgd2hpY2ggYWxsb3dzCisgICAgICAgIC8vLyAgICBvdGhlciBwcm9jZXNzZXMgdG8gb3BlbiB0aGUgZmlsZSwgYnV0IG5vdCByZWFkIGl0IGluIGl0cyBlbnRpcmV0eS4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgVGhpcyBwcm9wZXJ0eSB0ZWxscyBEb3ROZXRaaXAgd2hhdCB5b3Ugd291bGQgbGlrZSB0byBkbyBpbiB0aGUgY2FzZSBvZgorICAgICAgICAvLy8gICAgdGhlc2UgZXJyb3JzLiAgVGhlIHByaW1hcnkgb3B0aW9ucyBhcmU6IDxjPlppcEVycm9yQWN0aW9uLlRocm93PC9jPiB0bworICAgICAgICAvLy8gICAgdGhyb3cgYW4gZXhjZXB0aW9uICh0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlmIHlvdSBkb24ndCBzZXQgdGhpcworICAgICAgICAvLy8gICAgcHJvcGVydHkpOyA8Yz5aaXBFcnJvckFjdGlvbi5Ta2lwPC9jPiB0byBTa2lwIHRoZSBmaWxlIGZvciB3aGljaCB0aGVyZQorICAgICAgICAvLy8gICAgd2FzIGFuIGVycm9yIGFuZCBjb250aW51ZSBzYXZpbmc7IDxjPlppcEVycm9yQWN0aW9uLlJldHJ5PC9jPiB0byBSZXRyeQorICAgICAgICAvLy8gICAgdGhlIGVudHJ5IHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtOyBvcgorICAgICAgICAvLy8gICAgPGM+WmlwRXJyb3JBY3Rpb24uSW52b2tlRXJyb3JFdmVudDwvYz4gdG8gaW52b2tlIGFuIGV2ZW50IGhhbmRsZXIuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIFRoaXMgcHJvcGVydHkgaXMgaW1wbGljaXRseSBzZXQgdG8gPGM+WmlwRXJyb3JBY3Rpb24uSW52b2tlRXJyb3JFdmVudDwvYz4KKyAgICAgICAgLy8vICAgIGlmIHlvdSBhZGQgYSBoYW5kbGVyIHRvIHRoZSA8c2VlIGNyZWY9IlppcEVycm9yIiAvPiBldmVudC4gIElmIHlvdSBzZXQKKyAgICAgICAgLy8vICAgIHRoaXMgcHJvcGVydHkgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICAgLy8vICAgIDxjPlppcEVycm9yQWN0aW9uLkludm9rZUVycm9yRXZlbnQ8L2M+LCB0aGVuIHRoZSA8Yz5aaXBFcnJvcjwvYz4KKyAgICAgICAgLy8vICAgIGV2ZW50IGlzIGltcGxpY2l0bHkgY2xlYXJlZC4gIFdoYXQgaXQgbWVhbnMgaXMgeW91IGNhbiBzZXQgb25lIG9yIHRoZQorICAgICAgICAvLy8gICAgb3RoZXIgKG9yIG5laXRoZXIpLCBkZXBlbmRpbmcgb24gd2hhdCB5b3Ugd2FudCwgYnV0IHlvdSBuZXZlciBuZWVkIHRvIHNldAorICAgICAgICAvLy8gICAgYm90aC4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgQXMgd2l0aCBzb21lIG90aGVyIHByb3BlcnRpZXMgb24gdGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzLCBsaWtlIDxzZWUKKyAgICAgICAgLy8vICAgIGNyZWY9IlBhc3N3b3JkIi8+LCA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sIGFuZCA8c2VlCisgICAgICAgIC8vLyAgICBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+LCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb24gYSA8Yz5aaXBGaWxlPC9jPgorICAgICAgICAvLy8gICAgaW5zdGFuY2Ugd2lsbCBjYXVzZSB0aGUgc3BlY2lmaWVkIDxjPlppcEVycm9yQWN0aW9uPC9jPiB0byBiZSB1c2VkIG9uIGFsbAorICAgICAgICAvLy8gICAgPHNlZSBjcmVmPSJaaXBFbnRyeSIvPiBpdGVtcyB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgYWRkZWQgdG8gdGhlCisgICAgICAgIC8vLyAgICA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4gSWYgeW91IHNldCB0aGlzIHByb3BlcnR5IGFmdGVyIHlvdSBoYXZlIGFkZGVkCisgICAgICAgIC8vLyAgICBpdGVtcyB0byB0aGUgPGM+WmlwRmlsZTwvYz4sIGJ1dCBiZWZvcmUgeW91IGhhdmUgY2FsbGVkIDxjPlNhdmUoKTwvYz4sCisgICAgICAgIC8vLyAgICB0aG9zZSBpdGVtcyB3aWxsIG5vdCB1c2UgdGhlIHNwZWNpZmllZCBlcnJvciBoYW5kbGluZyBhY3Rpb24uCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICA8cGFyYT4KKyAgICAgICAgLy8vICAgIElmIHlvdSB3YW50IHRvIGhhbmRsZSBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgd2l0aCBhbnkgZW50cnkgaW4gdGhlIHppcAorICAgICAgICAvLy8gICAgZmlsZSBpbiB0aGUgc2FtZSB3YXksIHRoZW4gc2V0IHRoaXMgcHJvcGVydHkgb25jZSwgYmVmb3JlIGFkZGluZyBhbnkKKyAgICAgICAgLy8vICAgIGVudHJpZXMgdG8gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgPHBhcmE+CisgICAgICAgIC8vLyAgICBJZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gPGM+WmlwRXJyb3JBY3Rpb24uU2tpcDwvYz4gYW5kIHlvdSdkIGxpa2UgdG8KKyAgICAgICAgLy8vICAgIGxlYXJuIHdoaWNoIGZpbGVzIG1heSBoYXZlIGJlZW4gc2tpcHBlZCBhZnRlciBhIDxjPlNhdmUoKTwvYz4sIHlvdSBjYW4KKyAgICAgICAgLy8vICAgIHNldCB0aGUgPHNlZSBjcmVmPSJTdGF0dXNNZXNzYWdlVGV4dFdyaXRlciIgLz4gb24gdGhlIFppcEZpbGUgYmVmb3JlCisgICAgICAgIC8vLyAgICBjYWxsaW5nIDxjPlNhdmUoKTwvYz4uIEEgbWVzc2FnZSB3aWxsIGJlIGVtaXR0ZWQgaW50byB0aGF0IHdyaXRlciBmb3IKKyAgICAgICAgLy8vICAgIGVhY2ggc2tpcHBlZCBmaWxlLCBpZiBhbnkuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB0ZWxsIERvdE5ldFppcCB0byBza2lwIGFueSBmaWxlcyBmb3Igd2hpY2ggYW4KKyAgICAgICAgLy8vICAgZXJyb3IgaXMgZ2VuZXJhdGVkIGR1cmluZyB0aGUgU2F2ZSgpLgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gUHVibGljIFN1YiBTYXZlWmlwRmlsZSgpCisgICAgICAgIC8vLyAgICAgRGltIFNvdXJjZUZvbGRlciBBcyBTdHJpbmcgPSAiZm9kZGVyIgorICAgICAgICAvLy8gICAgIERpbSBEZXN0RmlsZSBBcyBTdHJpbmcgPSAgImVIYW5kbGVyLnppcCIKKyAgICAgICAgLy8vICAgICBEaW0gc3cgYXMgTmV3IFN0cmluZ1dyaXRlcgorICAgICAgICAvLy8gICAgIFVzaW5nIHppcEFyY2hpdmUgQXMgWmlwRmlsZSA9IE5ldyBaaXBGaWxlCisgICAgICAgIC8vLyAgICAgICAgICcgVGVsbCBEb3ROZXRaaXAgdG8gc2tpcCBhbnkgZmlsZXMgZm9yIHdoaWNoIGl0IGVuY291bnRlcnMgYW4gZXJyb3IKKyAgICAgICAgLy8vICAgICAgICAgemlwQXJjaGl2ZS5aaXBFcnJvckFjdGlvbiA9IFppcEVycm9yQWN0aW9uLlNraXAKKyAgICAgICAgLy8vICAgICAgICAgemlwQXJjaGl2ZS5TdGF0dXNNZXNzYWdlVGV4dFdyaXRlciA9IHN3CisgICAgICAgIC8vLyAgICAgICAgIHppcEFyY2hpdmUuQWRkRGlyZWN0b3J5KFNvdXJjZUZvbGRlcikKKyAgICAgICAgLy8vICAgICAgICAgemlwQXJjaGl2ZS5TYXZlKERlc3RGaWxlKQorICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgICcgZXhhbWluZSBzdyBoZXJlIHRvIHNlZSBhbnkgbWVzc2FnZXMKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmlwRW50cnkuWmlwRXJyb3JBY3Rpb24iLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IklvbmljLlppcC5aaXBGaWxlLlppcEVycm9yIi8+CisKKyAgICAgICAgaW50ZXJuYWwgWmlwRXJyb3JBY3Rpb24gWmlwRXJyb3JBY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFppcEVycm9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF96aXBFcnJvckFjdGlvbiA9IFppcEVycm9yQWN0aW9uLkludm9rZUVycm9yRXZlbnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96aXBFcnJvckFjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF96aXBFcnJvckFjdGlvbiA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChfemlwRXJyb3JBY3Rpb24gIT0gWmlwRXJyb3JBY3Rpb24uSW52b2tlRXJyb3JFdmVudCAmJiBaaXBFcnJvciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBaaXBFcnJvciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIEVuY3J5cHRpb24gdG8gdXNlIGZvciBlbnRyaWVzIGFkZGVkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZXQgdGhpcyB3aGVuIGNyZWF0aW5nIGEgemlwIGFyY2hpdmUsIG9yIHdoZW4gdXBkYXRpbmcgYSB6aXAgYXJjaGl2ZS4gVGhlCisgICAgICAgIC8vLyAgIHNwZWNpZmllZCBFbmNyeXB0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVudHJpZXMgc3Vic2VxdWVudGx5IGFkZGVkIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4gIEFwcGxpY2F0aW9ucyBkbyBub3QgbmVlZCB0byBzZXQgdGhlCisgICAgICAgIC8vLyAgIDxjPkVuY3J5cHRpb248L2M+IHByb3BlcnR5IHdoZW4gcmVhZGluZyBvciBleHRyYWN0aW5nIGEgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSBzZXQgdGhpcyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmUsIHlvdQorICAgICAgICAvLy8gICB3aWxsIGFsc28gbmVlZCB0byBzZXQgdGhlIDxzZWUgY3JlZj0iUGFzc3dvcmQiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFzIHdpdGggc29tZSBvdGhlciBwcm9wZXJ0aWVzIG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcywgbGlrZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlBhc3N3b3JkIi8+IGFuZCA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4sIHNldHRpbmcgdGhpcworICAgICAgICAvLy8gICBwcm9wZXJ0eSBvbiBhIDxjPlppcEZpbGU8L2M+IGluc3RhbmNlIHdpbGwgY2F1c2UgdGhlIHNwZWNpZmllZAorICAgICAgICAvLy8gICA8Yz5FbmNyeXB0aW9uQWxnb3JpdGhtPC9jPiB0byBiZSB1c2VkIG9uIGFsbCA8c2VlIGNyZWY9IlppcEVudHJ5Ii8+IGl0ZW1zCisgICAgICAgIC8vLyAgIHRoYXQgYXJlIHN1YnNlcXVlbnRseSBhZGRlZCB0byB0aGUgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UuIEluIG90aGVyCisgICAgICAgIC8vLyAgIHdvcmRzLCBpZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgYWZ0ZXIgeW91IGhhdmUgYWRkZWQgaXRlbXMgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+LCBidXQgYmVmb3JlIHlvdSBoYXZlIGNhbGxlZCA8Yz5TYXZlKCk8L2M+LCB0aG9zZSBpdGVtcyB3aWxsCisgICAgICAgIC8vLyAgIG5vdCBiZSBlbmNyeXB0ZWQgb3IgcHJvdGVjdGVkIHdpdGggYSBwYXNzd29yZCBpbiB0aGUgcmVzdWx0aW5nIHppcAorICAgICAgICAvLy8gICBhcmNoaXZlLiBUbyBnZXQgYSB6aXAgYXJjaGl2ZSB3aXRoIGVuY3J5cHRlZCBlbnRyaWVzLCBzZXQgdGhpcyBwcm9wZXJ0eSwKKyAgICAgICAgLy8vICAgYWxvbmcgd2l0aCB0aGUgPHNlZSBjcmVmPSJQYXNzd29yZCIvPiBwcm9wZXJ0eSwgYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgLy8vICAgPGM+QWRkRmlsZTwvYz4sIDxjPkFkZEl0ZW08L2M+LCBvciA8Yz5BZGREaXJlY3Rvcnk8L2M+IChldGMuKSBvbiB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSByZWFkIGEgPGM+WmlwRmlsZTwvYz4sIHlvdSBjYW4gbW9kaWZ5IHRoZSA8Yz5FbmNyeXB0aW9uPC9jPiBvbiBhbgorICAgICAgICAvLy8gICBlbmNyeXB0ZWQgZW50cnksIG9ubHkgYnkgc2V0dGluZyB0aGUgPGM+RW5jcnlwdGlvbjwvYz4gcHJvcGVydHkgb24gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEVudHJ5PC9jPiBpdHNlbGYuICBTZXR0aW5nIHRoZSA8Yz5FbmNyeXB0aW9uPC9jPiBwcm9wZXJ0eSBvbiB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4sIG9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZCB2aWEgYSBjYWxsIHRvCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGUuUmVhZCgpPC9jPiwgZG9lcyBub3QgYWZmZWN0IGVudHJpZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgcmVhZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IHJlYWQgYSA8Yz5aaXBGaWxlPC9jPiwgYW5kIHRoZXJlIGlzIGFuIGVuY3J5cHRlZAorICAgICAgICAvLy8gICBlbnRyeS4gIFNldHRpbmcgdGhlIDxjPkVuY3J5cHRpb248L2M+IHByb3BlcnR5IG9uIHRoYXQgPGM+WmlwRmlsZTwvYz4gYW5kCisgICAgICAgIC8vLyAgIHRoZW4gY2FsbGluZyA8Yz5TYXZlKCk8L2M+IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPiBkb2VzIG5vdCB1cGRhdGUgdGhlCisgICAgICAgIC8vLyAgIDxjPkVuY3J5cHRpb248L2M+IHVzZWQgZm9yIHRoZSBlbnRyaWVzIGluIHRoZSBhcmNoaXZlLiAgTmVpdGhlciBpcyBhbgorICAgICAgICAvLy8gICBleGNlcHRpb24gdGhyb3duLiBJbnN0ZWFkLCB3aGF0IGhhcHBlbnMgZHVyaW5nIHRoZSA8Yz5TYXZlKCk8L2M+IGlzIHRoYXQKKyAgICAgICAgLy8vICAgYWxsIHByZXZpb3VzbHkgZXhpc3RpbmcgZW50cmllcyBhcmUgY29waWVkIHRocm91Z2ggdG8gdGhlIG5ldyB6aXAgYXJjaGl2ZSwKKyAgICAgICAgLy8vICAgd2l0aCB3aGF0ZXZlciBlbmNyeXB0aW9uIGFuZCBwYXNzd29yZCB0aGF0IHdhcyB1c2VkIHdoZW4gb3JpZ2luYWxseQorICAgICAgICAvLy8gICBjcmVhdGluZyB0aGUgemlwIGFyY2hpdmUuIFVwb24gcmUtcmVhZGluZyB0aGF0IGFyY2hpdmUsIHRvIGV4dHJhY3QKKyAgICAgICAgLy8vICAgZW50cmllcywgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIG9yaWdpbmFsIHBhc3N3b3JkIG9yIHBhc3N3b3JkcywgaWYKKyAgICAgICAgLy8vICAgYW55LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTdXBwb3NlIGFuIGFwcGxpY2F0aW9uIHJlYWRzIGEgPGM+WmlwRmlsZTwvYz4sIGFuZCB0aGVyZSBpcyBhbiBlbmNyeXB0ZWQKKyAgICAgICAgLy8vICAgZW50cnkuICBTZXR0aW5nIHRoZSA8Yz5FbmNyeXB0aW9uPC9jPiBwcm9wZXJ0eSBvbiB0aGF0IDxjPlppcEZpbGU8L2M+IGFuZAorICAgICAgICAvLy8gICB0aGVuIGFkZGluZyBuZXcgZW50cmllcyAodmlhIDxjPkFkZEZpbGUoKTwvYz4sIDxjPkFkZEVudHJ5KCk8L2M+LCBldGMpCisgICAgICAgIC8vLyAgIGFuZCB0aGVuIGNhbGxpbmcgPGM+U2F2ZSgpPC9jPiBvbiB0aGUgPGM+WmlwRmlsZTwvYz4gZG9lcyBub3QgdXBkYXRlIHRoZQorICAgICAgICAvLy8gICA8Yz5FbmNyeXB0aW9uPC9jPiBvbiBhbnkgb2YgdGhlIGVudHJpZXMgdGhhdCBoYWQgcHJldmlvdXNseSBiZWVuIGluIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBGaWxlPC9jPi4gIFRoZSA8Yz5FbmNyeXB0aW9uPC9jPiBwcm9wZXJ0eSBhcHBsaWVzIG9ubHkgdG8gdGhlCisgICAgICAgIC8vLyAgIG5ld2x5LWFkZGVkIGVudHJpZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgemlwIGFyY2hpdmUgdGhhdCB1c2VzIGVuY3J5cHRpb24sIGFuZCB0aGVuIGV4dHJhY3RzCisgICAgICAgIC8vLyAgIGVudHJpZXMgZnJvbSB0aGUgYXJjaGl2ZS4gIFdoZW4gY3JlYXRpbmcgdGhlIHppcCBhcmNoaXZlLCB0aGUgUmVhZE1lLnR4dAorICAgICAgICAvLy8gICBmaWxlIGlzIHppcHBlZCB3aXRob3V0IHVzaW5nIGEgcGFzc3dvcmQgb3IgZW5jcnlwdGlvbi4gIFRoZSBvdGhlciBmaWxlcworICAgICAgICAvLy8gICB1c2UgZW5jcnlwdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIC8vIENyZWF0ZSBhIHppcCBhcmNoaXZlIHdpdGggQUVTIEVuY3J5cHRpb24uCisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCJSZWFkTWUudHh0Iik7CisgICAgICAgIC8vLyAgICAgemlwLkVuY3J5cHRpb249IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2OworICAgICAgICAvLy8gICAgIHppcC5QYXNzd29yZD0gIlRvcC5TZWNyZXQuTm8uUGVla2luZyEiOworICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCI3NDQwLU40OXRoLnBuZyIpOworICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCIyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiKTsKKyAgICAgICAgLy8vICAgICB6aXAuU2F2ZSgiRW5jcnlwdGVkQXJjaGl2ZS56aXAiKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAvLyBFeHRyYWN0IGEgemlwIGFyY2hpdmUgdGhhdCB1c2VzIEFFUyBFbmNyeXB0aW9uLgorICAgICAgICAvLy8gLy8gWW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgdGhlIGFsZ29yaXRobSBkdXJpbmcgZXh0cmFjdGlvbi4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCgiRW5jcnlwdGVkQXJjaGl2ZS56aXAiKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB6aXAuUGFzc3dvcmQ9ICJUb3AuU2VjcmV0Lk5vLlBlZWtpbmchIjsKKyAgICAgICAgLy8vICAgICB6aXAuRXh0cmFjdEFsbCgiZXh0cmFjdERpcmVjdG9yeSIpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vICcgQ3JlYXRlIGEgemlwIHRoYXQgdXNlcyBFbmNyeXB0aW9uLgorICAgICAgICAvLy8gVXNpbmcgemlwIEFzIE5ldyBaaXBGaWxlKCkKKyAgICAgICAgLy8vICAgICB6aXAuRW5jcnlwdGlvbj0gRW5jcnlwdGlvbkFsZ29yaXRobS5XaW5aaXBBZXMyNTYKKyAgICAgICAgLy8vICAgICB6aXAuUGFzc3dvcmQ9ICJUb3AuU2VjcmV0Lk5vLlBlZWtpbmchIgorICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCJSZWFkTWUudHh0IikKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZSgiNzQ0MC1ONDl0aC5wbmciKQorICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlKCIyMDA4LVJlZ2lvbmFsLVNhbGVzLVJlcG9ydC5wZGYiKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKCJFbmNyeXB0ZWRBcmNoaXZlLnppcCIpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAnIEV4dHJhY3QgYSB6aXAgYXJjaGl2ZSB0aGF0IHVzZXMgQUVTIEVuY3J5cHRpb24uCisgICAgICAgIC8vLyAnIFlvdSBkbyBub3QgbmVlZCB0byBzcGVjaWZ5IHRoZSBhbGdvcml0aG0gZHVyaW5nIGV4dHJhY3Rpb24uCisgICAgICAgIC8vLyBVc2luZyAoemlwIGFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoIkVuY3J5cHRlZEFyY2hpdmUuemlwIikpCisgICAgICAgIC8vLyAgICAgemlwLlBhc3N3b3JkPSAiVG9wLlNlY3JldC5Oby5QZWVraW5nISIKKyAgICAgICAgLy8vICAgICB6aXAuRXh0cmFjdEFsbCgiZXh0cmFjdERpcmVjdG9yeSIpCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuUGFzc3dvcmQiPlppcEZpbGUuUGFzc3dvcmQ8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJaaXBFbnRyeS5FbmNyeXB0aW9uIj5aaXBFbnRyeS5FbmNyeXB0aW9uPC9zZWVhbHNvPgorICAgICAgICBpbnRlcm5hbCBFbmNyeXB0aW9uQWxnb3JpdGhtIEVuY3J5cHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9FbmNyeXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IEVuY3J5cHRpb25BbGdvcml0aG0uVW5zdXBwb3J0ZWQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbWF5IG5vdCBzZXQgRW5jcnlwdGlvbiB0byB0aGF0IHZhbHVlLiIpOworICAgICAgICAgICAgICAgIF9FbmNyeXB0aW9uID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBIGNhbGxiYWNrIHRoYXQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbAorICAgICAgICAvLy8gICB0byB1c2UgZm9yIGVudHJpZXMgc3Vic2VxdWVudGx5IGFkZGVkIHRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2l0aCB0aGlzIGNhbGxiYWNrLCB0aGUgRG90TmV0WmlwIGxpYnJhcnkgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0bworICAgICAgICAvLy8gICBkZXRlcm1pbmUgd2hldGhlciBjb21wcmVzc2lvbiB3aWxsIGJlIHVzZWQsIGF0IHRoZSB0aW1lIG9mIHRoZQorICAgICAgICAvLy8gICA8Yz5TYXZlPC9jPi4gVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBmYXZvcgorICAgICAgICAvLy8gICBzcGVlZCBvdmVyIHNpemUsIGFuZCB3YW50cyB0byBkZWZlciB0aGUgZGVjaXNpb24gdW50aWwgdGhlIHRpbWUgb2YKKyAgICAgICAgLy8vICAgPGM+U2F2ZTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFR5cGljYWxseSBhcHBsaWNhdGlvbnMgc2V0IHRoZSA8c2VlIGNyZWY9IkNvbXByZXNzaW9uTGV2ZWwiLz4gcHJvcGVydHkgb24KKyAgICAgICAgLy8vICAgdGhlIDxjPlppcEZpbGU8L2M+IG9yIG9uIGVhY2ggPGM+WmlwRW50cnk8L2M+IHRvIGRldGVybWluZSB0aGUgbGV2ZWwgb2YKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24gdXNlZC4gVGhpcyBpcyBkb25lIGF0IHRoZSB0aW1lIHRoZSBlbnRyeSBpcyBhZGRlZCB0byB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4uIFNldHRpbmcgdGhlIHByb3BlcnR5IHRvCisgICAgICAgIC8vLyAgIDxjPklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbC5Ob25lPC9jPiBtZWFucyBubyBjb21wcmVzc2lvbiB3aWxsIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgY2FsbGJhY2sgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBkZWZlciB0aGUgZGVjaXNpb24gb24gdGhlCisgICAgICAgIC8vLyAgIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+IHRvIHVzZSwgdW50aWwgdGhlIHRpbWUgb2YgdGhlIGNhbGwgdG8KKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZS5TYXZlKCk8L2M+LiBUaGUgY2FsbGJhY2sgaXMgaW52b2tlZCBvbmNlIHBlciA8Yz5aaXBFbnRyeTwvYz4sCisgICAgICAgIC8vLyAgIGF0IHRoZSB0aW1lIHRoZSBkYXRhIGZvciB0aGUgZW50cnkgaXMgYmVpbmcgd3JpdHRlbiBvdXQgYXMgcGFydCBvZiBhCisgICAgICAgIC8vLyAgIDxjPlNhdmUoKTwvYz4gb3BlcmF0aW9uLiBUaGUgYXBwbGljYXRpb24gY2FuIHVzZSB3aGF0ZXZlciBjcml0ZXJpYSBpdAorICAgICAgICAvLy8gICBsaWtlcyBpbiBkZXRlcm1pbmluZyB0aGUgbGV2ZWwgdG8gcmV0dXJuLiAgRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIG1heQorICAgICAgICAvLy8gICB3aXNoIHRoYXQgbm8gLm1wMyBmaWxlcyBzaG91bGQgYmUgY29tcHJlc3NlZCwgYmVjYXVzZSB0aGV5IGFyZSBhbHJlYWR5CisgICAgICAgIC8vLyAgIGNvbXByZXNzZWQgYW5kIHRoZSBleHRyYSBjb21wcmVzc2lvbiBpcyBub3Qgd29ydGggdGhlIENQVSB0aW1lIGluY3VycmVkLAorICAgICAgICAvLy8gICBhbmQgc28gY2FuIHJldHVybiA8Yz5Ob25lPC9jPiBmb3IgYWxsIC5tcDMgZW50cmllcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGxpYnJhcnkgZGV0ZXJtaW5lcyB3aGV0aGVyIGNvbXByZXNzaW9uIHdpbGwgYmUgYXR0ZW1wdGVkIGZvciBhbiBlbnRyeQorICAgICAgICAvLy8gICB0aGlzIHdheTogSWYgdGhlIGVudHJ5IGlzIGEgemVybyBsZW5ndGggZmlsZSwgb3IgYSBkaXJlY3RvcnksIG5vCisgICAgICAgIC8vLyAgIGNvbXByZXNzaW9uIGlzIHVzZWQuICBPdGhlcndpc2UsIGlmIHRoaXMgY2FsbGJhY2sgaXMgc2V0LCBpdCBpcyBpbnZva2VkCisgICAgICAgIC8vLyAgIGFuZCB0aGUgPGM+Q29tcHJlc3Npb25MZXZlbDwvYz4gaXMgc2V0IHRvIHRoZSByZXR1cm4gdmFsdWUuIElmIHRoaXMKKyAgICAgICAgLy8vICAgY2FsbGJhY2sgaGFzIG5vdCBiZWVuIHNldCwgdGhlbiB0aGUgcHJldmlvdXNseSBzZXQgdmFsdWUgZm9yCisgICAgICAgIC8vLyAgIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+IGlzIHVzZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgU2V0Q29tcHJlc3Npb25DYWxsYmFjayBTZXRDb21wcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBtYXhpbXVtIHNpemUgb2YgYW4gb3V0cHV0IHNlZ21lbnQsIHdoZW4gc2F2aW5nIGEgc3BsaXQgWmlwIGZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgU2V0IHRoaXMgdG8gYSBub24temVybyB2YWx1ZSBiZWZvcmUgY2FsbGluZyA8c2VlIGNyZWY9IlNhdmUoKSIvPiBvciA8c2VlCisgICAgICAgIC8vLyAgICAgY3JlZj0iU2F2ZShTdHJpbmcpIi8+IHRvIHNwZWNpZnkgdGhhdCB0aGUgWmlwRmlsZSBzaG91bGQgYmUgc2F2ZWQgYXMgYQorICAgICAgICAvLy8gICAgIHNwbGl0IGFyY2hpdmUsIGFsc28gc29tZXRpbWVzIGNhbGxlZCBhIHNwYW5uZWQgYXJjaGl2ZS4gU29tZSBhbHNvCisgICAgICAgIC8vLyAgICAgY2FsbCB0aGVtIG11bHRpLWZpbGUgYXJjaGl2ZXMuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIEEgc3BsaXQgemlwIGFyY2hpdmUgaXMgc2F2ZWQgaW4gYSBzZXQgb2YgZGlzY3JldGUgZmlsZXN5c3RlbSBmaWxlcywKKyAgICAgICAgLy8vICAgICByYXRoZXIgdGhhbiBpbiBhIHNpbmdsZSBmaWxlLiBUaGlzIGlzIGhhbmR5IHdoZW4gdHJhbnNtaXR0aW5nIHRoZQorICAgICAgICAvLy8gICAgIGFyY2hpdmUgaW4gZW1haWwgb3Igc29tZSBvdGhlciBtZWNoYW5pc20gdGhhdCBoYXMgYSBsaW1pdCB0byB0aGUgc2l6ZSBvZgorICAgICAgICAvLy8gICAgIGVhY2ggZmlsZS4gIFRoZSBmaXJzdCBmaWxlIGluIGEgc3BsaXQgYXJjaGl2ZSB3aWxsIGJlIG5hbWVkCisgICAgICAgIC8vLyAgICAgPGM+YmFzZW5hbWUuejAxPC9jPiwgdGhlIHNlY29uZCB3aWxsIGJlIG5hbWVkIDxjPmJhc2VuYW1lLnowMjwvYz4sIGFuZAorICAgICAgICAvLy8gICAgIHNvIG9uLiBUaGUgZmluYWwgZmlsZSBpcyBuYW1lZCA8Yz5iYXNlbmFtZS56aXA8L2M+LiBBY2NvcmRpbmcgdG8gdGhlIHppcAorICAgICAgICAvLy8gICAgIHNwZWNpZmljYXRpb24gZnJvbSBQS1dhcmUsIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDY1NTM2LCBmb3IgYSA2NGsgc2VnbWVudAorICAgICAgICAvLy8gICAgIHNpemUuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cyBhbGxvd3MgaW4gYSBzcGxpdCBhcmNoaXZlIGlzIDk5LgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBzcGxpdAorICAgICAgICAvLy8gICAgIHNlZ21lbnQgd2hlbiB3cml0aW5nIGEgc3BsaXQgYXJjaGl2ZS4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEKKyAgICAgICAgLy8vICAgICA8Yz5aaXBGaWxlPC9jPiB0aGF0IHdvdWxkIHNhdmUgdG8gYSBzaW5nbGUgZmlsZSBvZiAyMDBrLiBJZiB5b3Ugc2V0IHRoZQorICAgICAgICAvLy8gICAgIDxjPk1heE91dHB1dFNlZ21lbnRTaXplPC9jPiB0byA2NTUzNiBiZWZvcmUgY2FsbGluZyA8Yz5TYXZlKCk8L2M+LCB5b3UKKyAgICAgICAgLy8vICAgICB3aWxsIGdldCBmb3VyIGRpc3RpbmN0IG91dHB1dCBmaWxlcy4gT24gdGhlIG90aGVyIGhhbmQgaWYgeW91IHNldCB0aGlzCisgICAgICAgIC8vLyAgICAgcHJvcGVydHkgdG8gMjU2aywgdGhlbiB5b3Ugd2lsbCBnZXQgYSBzaW5nbGUtZmlsZSBhcmNoaXZlIGZvciB0aGF0CisgICAgICAgIC8vLyAgICAgPGM+WmlwRmlsZTwvYz4uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoZSBzaXplIG9mIGVhY2ggc3BsaXQgb3V0cHV0IGZpbGUgd2lsbCBiZSBhcyBsYXJnZSBhcyBwb3NzaWJsZSwgdXAgdG8KKyAgICAgICAgLy8vICAgICB0aGUgbWF4aW11bSBzaXplIHNldCBoZXJlLiBUaGUgemlwIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhhdCBzb21lIGRhdGEKKyAgICAgICAgLy8vICAgICBmaWVsZHMgaW4gYSB6aXAgYXJjaGl2ZSBtYXkgbm90IHNwYW4gYSBzcGxpdCBib3VuZGFyeSwgYW5kIGFuIG91dHB1dAorICAgICAgICAvLy8gICAgIHNlZ21lbnQgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgbWF4aW11bSBpZiBuZWNlc3NhcnkgdG8gYXZvaWQgdGhhdAorICAgICAgICAvLy8gICAgIHByb2JsZW0uIEFsc28sIG9idmlvdXNseSB0aGUgZmluYWwgc2VnbWVudCBvZiB0aGUgYXJjaGl2ZSBtYXkgYmUgc21hbGxlcgorICAgICAgICAvLy8gICAgIHRoYW4gdGhlIG1heGltdW0gc2VnbWVudCBzaXplLiBTZWdtZW50cyB3aWxsIG5ldmVyIGJlIGxhcmdlciB0aGFuIHRoZQorICAgICAgICAvLy8gICAgIHZhbHVlIHNldCB3aXRoIHRoaXMgcHJvcGVydHkuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFlvdSBjYW4gc2F2ZSBhIHNwbGl0IFppcCBmaWxlIG9ubHkgd2hlbiBzYXZpbmcgdG8gYSByZWd1bGFyIGZpbGVzeXN0ZW0KKyAgICAgICAgLy8vICAgICBmaWxlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byBzYXZlIGEgc3BsaXQgemlwIGZpbGUgYXMgYSBzZWxmLWV4dHJhY3RpbmcKKyAgICAgICAgLy8vICAgICBhcmNoaXZlLCBub3IgaXMgaXQgcG9zc2libGUgdG8gc2F2ZSBhIHNwbGl0IHppcCBmaWxlIHRvIGEgc3RyZWFtLiBXaGVuCisgICAgICAgIC8vLyAgICAgc2F2aW5nIHRvIGEgU0ZYIG9yIHRvIGEgU3RyZWFtLCB0aGlzIHByb3BlcnR5IGlzIGlnbm9yZWQuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIEFib3V0IGludGVyb3BlcmFiaWxpdHk6IFNwbGl0IG9yIHNwYW5uZWQgemlwIGZpbGVzIHByb2R1Y2VkIGJ5IERvdE5ldFppcAorICAgICAgICAvLy8gICAgIGNhbiBiZSByZWFkIGJ5IFdpblppcCBvciBQS1ppcCwgYW5kIHZpY2UtdmVyc2EuIFNlZ21lbnRlZCB6aXAgZmlsZXMgbWF5CisgICAgICAgIC8vLyAgICAgbm90IGJlIHJlYWRhYmxlIGJ5IG90aGVyIHRvb2xzLCBpZiB0aG9zZSBvdGhlciB0b29scyBkb24ndCBzdXBwb3J0IHppcAorICAgICAgICAvLy8gICAgIHNwYW5uaW5nIG9yIHNwbGl0dGluZy4gIFdoZW4gaW4gZG91YnQsIHRlc3QuICBJIGRvbid0IGJlbGlldmUgV2luZG93cworICAgICAgICAvLy8gICAgIEV4cGxvcmVyIGNhbiBleHRyYWN0IGEgc3BsaXQgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IHdoZW4gcmVhZGluZyBhIHNwbGl0IGFyY2hpdmUuIFlvdSBjYW4gcmVhZAorICAgICAgICAvLy8gICAgIGEgc3BsaXQgYXJjaGl2ZSBpbiB0aGUgbm9ybWFsIHdheSB3aXRoIERvdE5ldFppcC4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgV2hlbiBzYXZpbmcgYSB6aXAgZmlsZSwgaWYgeW91IHdhbnQgYSByZWd1bGFyIHppcCBmaWxlIHJhdGhlciB0aGFuIGEKKyAgICAgICAgLy8vICAgICBzcGxpdCB6aXAgZmlsZSwgZG9uJ3Qgc2V0IHRoaXMgcHJvcGVydHksIG9yIHNldCBpdCB0byBaZXJvLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBJZiB5b3UgcmVhZCBhIHNwbGl0IGFyY2hpdmUsIHdpdGggPHNlZSBjcmVmPSJaaXBGaWxlLlJlYWQoc3RyaW5nKSIvPiBhbmQKKyAgICAgICAgLy8vICAgICB0aGVuIHN1YnNlcXVlbnRseSBjYWxsIDxjPlppcEZpbGUuU2F2ZSgpPC9jPiwgdW5sZXNzIHlvdSBzZXQgdGhpcworICAgICAgICAvLy8gICAgIHByb3BlcnR5IGJlZm9yZSBjYWxsaW5nIDxjPlNhdmUoKTwvYz4sIHlvdSB3aWxsIGdldCBhIG5vcm1hbCwKKyAgICAgICAgLy8vICAgICBzaW5nbGUtZmlsZSBhcmNoaXZlLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iTnVtYmVyT2ZTZWdtZW50c0Zvck1vc3RSZWNlbnRTYXZlIi8+CisgICAgICAgIHB1YmxpYyBJbnQzMiBNYXhPdXRwdXRTZWdtZW50U2l6ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX21heE91dHB1dFNlZ21lbnRTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgNjU1MzYgJiYgdmFsdWUgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiVGhlIG1pbmltdW0gYWNjZXB0YWJsZSBzZWdtZW50IHNpemUgaXMgNjU1MzYuIik7CisgICAgICAgICAgICAgICAgX21heE91dHB1dFNlZ21lbnRTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHVzZWQgaW4gdGhlIG1vc3QgcmVjZW50IFNhdmUoKSBvcGVyYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBpcyBub3JtYWxseSB6ZXJvLCB1bmxlc3MgeW91IGhhdmUgc2V0IHRoZSA8c2VlCisgICAgICAgIC8vLyAgICAgY3JlZj0iTWF4T3V0cHV0U2VnbWVudFNpemUiLz4gcHJvcGVydHkuICBJZiB5b3UgaGF2ZSBzZXQgPHNlZQorICAgICAgICAvLy8gICAgIGNyZWY9Ik1heE91dHB1dFNlZ21lbnRTaXplIi8+LCBhbmQgdGhlbiB5b3Ugc2F2ZSBhIGZpbGUsIGFmdGVyIHRoZSBjYWxsIHRvCisgICAgICAgIC8vLyAgICAgU2F2ZSgpIGNvbXBsZXRlcywgeW91IGNhbiByZWFkIHRoaXMgdmFsdWUgdG8gbGVhcm4gdGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGF0CisgICAgICAgIC8vLyAgICAgd2VyZSBjcmVhdGVkLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIElmIHlvdSBjYWxsIFNhdmUoIkFyY2hpdmUuemlwIiksIGFuZCBpdCBjcmVhdGVzIDUgc2VnbWVudHMsIHRoZW4geW91CisgICAgICAgIC8vLyAgICAgd2lsbCBoYXZlIGZpbGVzeXN0ZW0gZmlsZXMgbmFtZWQgQXJjaGl2ZS56MDEsIEFyY2hpdmUuejAyLCBBcmNoaXZlLnowMywKKyAgICAgICAgLy8vICAgICBBcmNoaXZlLnowNCwgYW5kIEFyY2hpdmUuemlwLCBhbmQgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgd2lsbCBiZSA1LgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJNYXhPdXRwdXRTZWdtZW50U2l6ZSIvPgorICAgICAgICBwdWJsaWMgSW50MzIgTnVtYmVyT2ZTZWdtZW50c0Zvck1vc3RSZWNlbnRTYXZlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB1bmNoZWNrZWQoKEludDMyKV9udW1iZXJPZlNlZ21lbnRzRm9yTW9zdFJlY2VudFNhdmUgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyNpZiAhTkVUQ0YKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgc2l6ZSB0aHJlc2hvbGQgZm9yIGFuIGVudHJ5LCBhYm92ZSB3aGljaCBhIHBhcmFsbGVsIGRlZmxhdGUgaXMgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIERvdE5ldFppcCB3aWxsIHVzZSBtdWx0aXBsZSB0aHJlYWRzIHRvIGNvbXByZXNzIGFueSBaaXBFbnRyeSwKKyAgICAgICAgLy8vICAgICBpZiB0aGUgZW50cnkgaXMgbGFyZ2VyIHRoYW4gdGhlIGdpdmVuIHNpemUuICBaZXJvIG1lYW5zICJhbHdheXMKKyAgICAgICAgLy8vICAgICB1c2UgcGFyYWxsZWwgZGVmbGF0ZSIsIHdoaWxlIC0xIG1lYW5zICJuZXZlciB1c2UgcGFyYWxsZWwKKyAgICAgICAgLy8vICAgICBkZWZsYXRlIi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgaXMgNTEyay4gQXNpZGUKKyAgICAgICAgLy8vICAgICBmcm9tIHRoZSBzcGVjaWFsIHZhbHVlcyBvZiAwIGFuZCAxLCB0aGUgbWluaW11bSB2YWx1ZSBpcyA2NTUzNi4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgSWYgdGhlIGVudHJ5IHNpemUgY2Fubm90IGJlIGtub3duIGJlZm9yZSBjb21wcmVzc2lvbiwgYXMgd2l0aCBhCisgICAgICAgIC8vLyAgICAgcmVhZC1mb3J3YXJkIHN0cmVhbSwgdGhlbiBQYXJhbGxlbCBkZWZsYXRlIHdpbGwgbmV2ZXIgYmUKKyAgICAgICAgLy8vICAgICBwZXJmb3JtZWQsIHVubGVzcyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyB6ZXJvLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBBIHBhcmFsbGVsIGRlZmxhdGUgb3BlcmF0aW9ucyB3aWxsIHNwZWVkIHVwIHRoZSBjb21wcmVzc2lvbiBvZgorICAgICAgICAvLy8gICAgIGxhcmdlIGZpbGVzLCBvbiBjb21wdXRlcnMgd2l0aCBtdWx0aXBsZSBDUFVzIG9yIG11bHRpcGxlIENQVQorICAgICAgICAvLy8gICAgIGNvcmVzLiAgRm9yIGZpbGVzIGFib3ZlIDFtYiwgb24gYSBkdWFsIGNvcmUgb3IgZHVhbC1jcHUgKDJwKQorICAgICAgICAvLy8gICAgIG1hY2hpbmUsIHRoZSB0aW1lIHJlcXVpcmVkIHRvIGNvbXByZXNzIHRoZSBmaWxlIGNhbiBiZSA3MCUgb2YgdGhlCisgICAgICAgIC8vLyAgICAgc2luZ2xlLXRocmVhZGVkIGRlZmxhdGUuICBGb3IgdmVyeSBsYXJnZSBmaWxlcyBvbiA0cCBtYWNoaW5lcyB0aGUKKyAgICAgICAgLy8vICAgICBjb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiAzMCUgb2YgdGhlIG5vcm1hbCB0aW1lLiAgVGhlIGRvd25zaWRlCisgICAgICAgIC8vLyAgICAgaXMgdGhhdCBwYXJhbGxlbCBkZWZsYXRlIGNvbnN1bWVzIGV4dHJhIG1lbW9yeSBkdXJpbmcgdGhlIGRlZmxhdGUsCisgICAgICAgIC8vLyAgICAgYW5kIHRoZSBkZWZsYXRpb24gaXMgbm90IGFzIGVmZmVjdGl2ZS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgUGFyYWxsZWwgZGVmbGF0ZSB0ZW5kcyB0byB5aWVsZCBzbGlnaHRseSBsZXNzIGNvbXByZXNzaW9uIHdoZW4KKyAgICAgICAgLy8vICAgICBjb21wYXJlZCB0byBhcyBzaW5nbGUtdGhyZWFkZWQgZGVmbGF0ZTsgdGhpcyBpcyBiZWNhdXNlIHRoZSBvcmlnaW5hbAorICAgICAgICAvLy8gICAgIGRhdGEgc3RyZWFtIGlzIHNwbGl0IGludG8gbXVsdGlwbGUgaW5kZXBlbmRlbnQgYnVmZmVycywgZWFjaCBvZiB3aGljaAorICAgICAgICAvLy8gICAgIGlzIGNvbXByZXNzZWQgaW4gcGFyYWxsZWwuICBCdXQgYmVjYXVzZSB0aGV5IGFyZSB0cmVhdGVkCisgICAgICAgIC8vLyAgICAgaW5kZXBlbmRlbnRseSwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gc2hhcmUgY29tcHJlc3Npb24KKyAgICAgICAgLy8vICAgICBkaWN0aW9uYXJpZXMuICBGb3IgdGhhdCByZWFzb24sIGEgZGVmbGF0ZWQgc3RyZWFtIG1heSBiZSBzbGlnaHRseQorICAgICAgICAvLy8gICAgIGxhcmdlciB3aGVuIGNvbXByZXNzZWQgdXNpbmcgcGFyYWxsZWwgZGVmbGF0ZSwgYXMgY29tcGFyZWQgdG8gYQorICAgICAgICAvLy8gICAgIHRyYWRpdGlvbmFsIHNpbmdsZS10aHJlYWRlZCBkZWZsYXRlLiBTb21ldGltZXMgdGhlIGluY3JlYXNlIG92ZXIgdGhlCisgICAgICAgIC8vLyAgICAgbm9ybWFsIGRlZmxhdGUgaXMgYXMgbXVjaCBhcyA1JSBvZiB0aGUgdG90YWwgY29tcHJlc3NlZCBzaXplLiBGb3IKKyAgICAgICAgLy8vICAgICBsYXJnZXIgZmlsZXMgaXQgY2FuIGJlIGFzIHNtYWxsIGFzIDAuMSUuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIE11bHRpLXRocmVhZGVkIGNvbXByZXNzaW9uIGRvZXMgbm90IGdpdmUgYXMgbXVjaCBhbiBhZHZhbnRhZ2Ugd2hlbgorICAgICAgICAvLy8gICAgIHVzaW5nIEVuY3J5cHRpb24uIFRoaXMgaXMgcHJpbWFyaWx5IGJlY2F1c2UgZW5jcnlwdGlvbiB0ZW5kcyB0byBzbG93CisgICAgICAgIC8vLyAgICAgZG93biB0aGUgZW50aXJlIHBpcGVsaW5lLiBBbHNvLCBtdWx0aS10aHJlYWRlZCBjb21wcmVzc2lvbiBnaXZlcyBsZXNzCisgICAgICAgIC8vLyAgICAgb2YgYW4gYWR2YW50YWdlIHdoZW4gdXNpbmcgbG93ZXIgY29tcHJlc3Npb24gbGV2ZWxzLCBmb3IgZXhhbXBsZSA8c2VlCisgICAgICAgIC8vLyAgICAgY3JlZj0iSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsLkJlc3RTcGVlZCIvPi4gIFlvdSBtYXkgaGF2ZSB0bworICAgICAgICAvLy8gICAgIHBlcmZvcm0gc29tZSB0ZXN0cyB0byBkZXRlcm1pbmUgdGhlIGJlc3QgYXBwcm9hY2ggZm9yIHlvdXIgc2l0dWF0aW9uLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlBhcmFsbGVsRGVmbGF0ZU1heEJ1ZmZlclBhaXJzIi8+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgbG9uZyBQYXJhbGxlbERlZmxhdGVUaHJlc2hvbGQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAhPSAwKSAmJiAodmFsdWUgIT0gLTEpICYmICh2YWx1ZSA8IDY0ICogMTAyNCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZCBzaG91bGQgYmUgLTEsIDAsIG9yID4gNjU1MzYiKTsKKyAgICAgICAgICAgICAgICBfUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX1BhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlciBwYWlycyB0byB1c2Ugd2hlbiBwZXJmb3JtaW5nCisgICAgICAgIC8vLyAgIHBhcmFsbGVsIGNvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgc2V0cyBhbiB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG1lbW9yeQorICAgICAgICAvLy8gICBidWZmZXIgcGFpcnMgdG8gY3JlYXRlIHdoZW4gcGVyZm9ybWluZyBwYXJhbGxlbAorICAgICAgICAvLy8gICBjb21wcmVzc2lvbi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyYWxsZWwKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24gc3RyZWFtIGFsbG9jYXRlcyBtdWx0aXBsZSBidWZmZXJzIHRvCisgICAgICAgIC8vLyAgIGZhY2lsaXRhdGUgcGFyYWxsZWwgY29tcHJlc3Npb24uICBBcyBlYWNoIGJ1ZmZlciBmaWxscyB1cCwKKyAgICAgICAgLy8vICAgdGhlIHN0cmVhbSB1c2VzIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU3lzdGVtLlRocmVhZGluZy5UaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKFN5c3RlbS5UaHJlYWRpbmcuV2FpdENhbGxiYWNrKSI+CisgICAgICAgIC8vLyAgIFRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0oKTwvc2VlPiB0byBjb21wcmVzcyB0aG9zZQorICAgICAgICAvLy8gICBidWZmZXJzIGluIGEgYmFja2dyb3VuZCB0aHJlYWRwb29sIHRocmVhZC4gQWZ0ZXIgYSBidWZmZXIKKyAgICAgICAgLy8vICAgaXMgY29tcHJlc3NlZCwgaXQgaXMgcmUtb3JkZXJlZCBhbmQgd3JpdHRlbiB0byB0aGUgb3V0cHV0CisgICAgICAgIC8vLyAgIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQSBoaWdoZXIgbnVtYmVyIG9mIGJ1ZmZlciBwYWlycyBlbmFibGVzIGEgaGlnaGVyIGRlZ3JlZSBvZgorICAgICAgICAvLy8gICBwYXJhbGxlbGlzbSwgd2hpY2ggdGVuZHMgdG8gaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGNvbXByZXNzaW9uIG9uCisgICAgICAgIC8vLyAgIG11bHRpLWNwdSBjb21wdXRlcnMuICBPbiB0aGUgb3RoZXIgaGFuZCwgYSBoaWdoZXIgbnVtYmVyIG9mIGJ1ZmZlcgorICAgICAgICAvLy8gICBwYWlycyBhbHNvIGltcGxpZXMgYSBsYXJnZXIgbWVtb3J5IGNvbnN1bXB0aW9uLCBtb3JlIGFjdGl2ZSB3b3JrZXIKKyAgICAgICAgLy8vICAgdGhyZWFkcywgYW5kIGEgaGlnaGVyIGNwdSB1dGlsaXphdGlvbiBmb3IgYW55IGNvbXByZXNzaW9uLiBUaGlzCisgICAgICAgIC8vLyAgIHByb3BlcnR5IGVuYWJsZXMgdGhlIGFwcGxpY2F0aW9uIHRvIGxpbWl0IGl0cyBtZW1vcnkgY29uc3VtcHRpb24gYW5kCisgICAgICAgIC8vLyAgIENQVSB1dGlsaXphdGlvbiBiZWhhdmlvciBkZXBlbmRpbmcgb24gcmVxdWlyZW1lbnRzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBGb3IgZWFjaCBjb21wcmVzc2lvbiAidGFzayIgdGhhdCBvY2N1cnMgaW4gcGFyYWxsZWwsIHRoZXJlIGFyZSAyCisgICAgICAgIC8vLyAgIGJ1ZmZlcnMgYWxsb2NhdGVkOiBvbmUgZm9yIGlucHV0IGFuZCBvbmUgZm9yIG91dHB1dC4gIFRoaXMgcHJvcGVydHkKKyAgICAgICAgLy8vICAgc2V0cyBhIGxpbWl0IGZvciB0aGUgbnVtYmVyIG9mIHBhaXJzLiAgVGhlIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlCisgICAgICAgIC8vLyAgIHNwYWNlIGFsbG9jYXRlZCBmb3IgYnVmZmVyaW5nIHdpbGwgdGhlbiBiZSAoTipTKjIpLCB3aGVyZSBOIGlzIHRoZQorICAgICAgICAvLy8gICBudW1iZXIgb2YgYnVmZmVyIHBhaXJzLCBTIGlzIHRoZSBzaXplIG9mIGVhY2ggYnVmZmVyICg8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IkJ1ZmZlclNpemUiLz4pLiAgQnkgZGVmYXVsdCwgRG90TmV0WmlwIGFsbG9jYXRlcyA0IGJ1ZmZlcgorICAgICAgICAvLy8gICBwYWlycyBwZXIgQ1BVIGNvcmUsIHNvIGlmIHlvdXIgbWFjaGluZSBoYXMgNCBjb3JlcywgYW5kIHlvdSByZXRhaW4KKyAgICAgICAgLy8vICAgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgb2YgMTI4aywgdGhlbiB0aGUKKyAgICAgICAgLy8vICAgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIHdpbGwgdXNlIDQgKiA0ICogMiAqIDEyOGtiIG9mIGJ1ZmZlcgorICAgICAgICAvLy8gICBtZW1vcnkgaW4gdG90YWwsIG9yIDRtYiwgaW4gYmxvY2tzIG9mIDEyOGtiLiAgSWYgeW91IHRoZW4gc2V0IHRoaXMKKyAgICAgICAgLy8vICAgcHJvcGVydHkgdG8gOCwgdGhlbiB0aGUgbnVtYmVyIHdpbGwgYmUgOCAqIDIgKiAxMjhrYiBvZiBidWZmZXIKKyAgICAgICAgLy8vICAgbWVtb3J5LCBvciAybWIuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIENQVSB1dGlsaXphdGlvbiB3aWxsIGFsc28gZ28gdXAgd2l0aCBhZGRpdGlvbmFsIGJ1ZmZlcnMsIGJlY2F1c2UgYQorICAgICAgICAvLy8gICBsYXJnZXIgbnVtYmVyIG9mIGJ1ZmZlciBwYWlycyBhbGxvd3MgYSBsYXJnZXIgbnVtYmVyIG9mIGJhY2tncm91bmQKKyAgICAgICAgLy8vICAgdGhyZWFkcyB0byBjb21wcmVzcyBpbiBwYXJhbGxlbC4gSWYgeW91IGZpbmQgdGhhdCBwYXJhbGxlbAorICAgICAgICAvLy8gICBjb21wcmVzc2lvbiBpcyBjb25zdW1pbmcgdG9vIG11Y2ggbWVtb3J5IG9yIENQVSwgeW91IGNhbiBhZGp1c3QgdGhpcworICAgICAgICAvLy8gICB2YWx1ZSBkb3dud2FyZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTYuIERpZmZlcmVudCB2YWx1ZXMgbWF5IGRlbGl2ZXIgYmV0dGVyIG9yCisgICAgICAgIC8vLyAgIHdvcnNlIHJlc3VsdHMsIGRlcGVuZGluZyBvbiB5b3VyIHByaW9yaXRpZXMgYW5kIHRoZSBkeW5hbWljCisgICAgICAgIC8vLyAgIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiB5b3VyIHN0b3JhZ2UgYW5kIGNvbXB1dGUgcmVzb3VyY2VzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IGlzIG5vdCB0aGUgbnVtYmVyIG9mIGJ1ZmZlciBwYWlycyB0byB1c2U7IGl0IGlzIGFuCisgICAgICAgIC8vLyAgIHVwcGVyIGxpbWl0LiBBbiBpbGx1c3RyYXRpb246IFN1cHBvc2UgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gdGhhdAorICAgICAgICAvLy8gICB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKHdoaWNoIGlzIDE2KSwgYW5kIGl0IHJ1bnMKKyAgICAgICAgLy8vICAgb24gYSBtYWNoaW5lIHdpdGggMiBDUFUgY29yZXMuIEluIHRoYXQgY2FzZSwgRG90TmV0WmlwIHdpbGwgYWxsb2NhdGUKKyAgICAgICAgLy8vICAgNCBidWZmZXIgcGFpcnMgcGVyIENQVSBjb3JlLCBmb3IgYSB0b3RhbCBvZiA4IHBhaXJzLiAgVGhlIHVwcGVyCisgICAgICAgIC8vLyAgIGxpbWl0IHNwZWNpZmllZCBieSB0aGlzIHByb3BlcnR5IGhhcyBubyBlZmZlY3QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBhcHBsaWNhdGlvbiBjYW4gc2V0IHRoaXMgdmFsdWUgYXQgYW55IHRpbWUKKyAgICAgICAgLy8vICAgYmVmb3JlIGNhbGxpbmcgPGM+WmlwRmlsZS5TYXZlKCk8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZCIvPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIGludCBQYXJhbGxlbERlZmxhdGVNYXhCdWZmZXJQYWlycworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX21heEJ1ZmZlclBhaXJzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUGFyYWxsZWxEZWZsYXRlTWF4QnVmZmVyUGFpcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG11c3QgYmUgNCBvciBncmVhdGVyLiIpOworICAgICAgICAgICAgICAgIF9tYXhCdWZmZXJQYWlycyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT5Qcm92aWRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+YSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RhbmNlLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJaaXBGaWxlOjp7MH0iLCBOYW1lKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb24gdGhlIERvdE5ldFppcCBhc3NlbWJseS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBwcm9wZXJ0eSBpcyBleHBvc2VkIGFzIGEgY29udmVuaWVuY2UuICBDYWxsZXJzIGNvdWxkIGFsc28gZ2V0IHRoZQorICAgICAgICAvLy8gICAgIHZlcnNpb24gdmFsdWUgYnkgcmV0cmlldmluZyBHZXROYW1lKCkuVmVyc2lvbiBvbiB0aGUKKyAgICAgICAgLy8vICAgICBTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseSBvYmplY3QgcG9pbnRpbmcgdG8gdGhlIERvdE5ldFppcAorICAgICAgICAvLy8gICAgIGFzc2VtYmx5LiBCdXQgc29tZXRpbWVzIGl0IGlzIG5vdCBjbGVhciB3aGljaCBhc3NlbWJseSBpcyBiZWluZyBsb2FkZWQuCisgICAgICAgIC8vLyAgICAgVGhpcyBwcm9wZXJ0eSBtYWtlcyBpdCBjbGVhci4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGlzIHN0YXRpYyBwcm9wZXJ0eSBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtLlZlcnNpb24gTGlicmFyeVZlcnNpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5LkdldEV4ZWN1dGluZ0Fzc2VtYmx5KCkuR2V0TmFtZSgpLlZlcnNpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIE5vdGlmeUVudHJ5Q2hhbmdlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb250ZW50c0NoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCBTdHJlYW0gU3RyZWFtRm9yRGlza051bWJlcih1aW50IGRpc2tOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaXNrTnVtYmVyICsgMSA9PSB0aGlzLl9kaXNrTnVtYmVyV2l0aENkIHx8CisgICAgICAgICAgICAgICAgKGRpc2tOdW1iZXIgPT0gMCAmJiB0aGlzLl9kaXNrTnVtYmVyV2l0aENkID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmV0dXJuICh0aGlzLlJlYWRTdHJlYW0gYXMgRmlsZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUmVhZFN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBaaXBTZWdtZW50ZWRTdHJlYW0uRm9yUmVhZGluZyh0aGlzLl9yZWFkTmFtZSA/PyB0aGlzLl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2tOdW1iZXIsIF9kaXNrTnVtYmVyV2l0aENkKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLyBjYWxsZWQgYnkgWmlwRW50cnkgaW4gWmlwRW50cnkuRXh0cmFjdCgpLCB3aGVuIHRoZXJlIGlzIG5vIHN0cmVhbSBzZXQgZm9yIHRoZQorICAgICAgICAvLyBaaXBFbnRyeS4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBSZXNldChib29sIHdoaWxlU2F2aW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0p1c3RTYXZlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyByZWFkIGluIHRoZSBqdXN0LXNhdmVkIHppcCBhcmNoaXZlCisgICAgICAgICAgICAgICAgdXNpbmcgKFppcEZpbGUgeCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDczNQorICAgICAgICAgICAgICAgICAgICB4Ll9yZWFkTmFtZSA9IHguX25hbWUgPSB3aGlsZVNhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fcmVhZE5hbWUgPz8gdGhpcy5fbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgeC5BbHRlcm5hdGVFbmNvZGluZyA9IHRoaXMuQWx0ZXJuYXRlRW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgICAgIHguQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IHRoaXMuQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgUmVhZEludG9JbnN0YW5jZSh4KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgY29udGVudHMgb2YgdGhlIGVudHJpZXMuCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBqdXN0IHJlcGxhY2UgdGhlIGVudHJpZXMgLSB0aGUgYXBwIG1heSBiZSBob2xkaW5nIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZTEgaW4geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWmlwRW50cnkgZTIgaW4gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZTEuRmlsZU5hbWUgPT0gZTIuRmlsZU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMi5Db3B5TWV0YURhdGEoZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX0p1c3RTYXZlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZXMgYSBuZXcgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgWmlwRmlsZSBmb3Igd3JpdGluZywKKyAgICAgICAgLy8vICAgb3IgdG8gc2x1cnAgaW4gYW4gZXhpc3RpbmcgemlwIGFyY2hpdmUgZm9yIHJlYWQgYW5kIHVwZGF0ZSBwdXJwb3Nlcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG8gY3JlYXRlIGEgbmV3IHppcCBhcmNoaXZlLCBhbiBhcHBsaWNhdGlvbiBjYW4gY2FsbCB0aGlzIGNvbnN0cnVjdG9yLAorICAgICAgICAvLy8gICBwYXNzaW5nIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGRvZXMgbm90IGV4aXN0LiAgVGhlIG5hbWUgbWF5IGJlIGEgZnVsbHkKKyAgICAgICAgLy8vICAgcXVhbGlmaWVkIHBhdGguIFRoZW4gdGhlIGFwcGxpY2F0aW9uIGNhbiBhZGQgZGlyZWN0b3JpZXMgb3IgZmlsZXMgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+IHZpYSA8Yz5BZGREaXJlY3RvcnkoKTwvYz4sIDxjPkFkZEZpbGUoKTwvYz4sIDxjPkFkZEl0ZW0oKTwvYz4KKyAgICAgICAgLy8vICAgYW5kIHRoZW4gd3JpdGUgdGhlIHppcCBhcmNoaXZlIHRvIHRoZSBkaXNrIGJ5IGNhbGxpbmcgPGM+U2F2ZSgpPC9jPi4gVGhlCisgICAgICAgIC8vLyAgIHppcCBmaWxlIGlzIG5vdCBhY3R1YWxseSBvcGVuZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIGRpc2sgdW50aWwgdGhlCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uIGNhbGxzIDxjPlppcEZpbGUuU2F2ZSgpPC9jPi4gIEF0IHRoYXQgcG9pbnQgdGhlIG5ldyB6aXAgZmlsZQorICAgICAgICAvLy8gICB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIGNyZWF0ZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSB3b24ndCBrbm93IHRoZSBuYW1lIG9mIHRoZSA8Yz5aaXBmaWxlPC9jPiB1bnRpbCB0aGUgdGltZSB5b3UgY2FsbAorICAgICAgICAvLy8gICA8Yz5aaXBGaWxlLlNhdmUoKTwvYz4sIG9yIGlmIHlvdSBwbGFuIHRvIHNhdmUgdG8gYSBzdHJlYW0gKHdoaWNoIGhhcyBubworICAgICAgICAvLy8gICBuYW1lKSwgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgbm8tYXJndW1lbnQgY29uc3RydWN0b3IuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBhcHBsaWNhdGlvbiBjYW4gYWxzbyBjYWxsIHRoaXMgY29uc3RydWN0b3IgdG8gcmVhZCBhbiBleGlzdGluZyB6aXAKKyAgICAgICAgLy8vICAgYXJjaGl2ZS4gIHBhc3NpbmcgdGhlIG5hbWUgb2YgYSB2YWxpZCB6aXAgZmlsZSB0aGF0IGRvZXMgZXhpc3QuIEJ1dCwgaXQncworICAgICAgICAvLy8gICBiZXR0ZXIgZm9ybSB0byB1c2UgdGhlIHN0YXRpYyA8c2VlIGNyZWY9IlppcEZpbGUuUmVhZChTdHJpbmcpIi8+IG1ldGhvZCwKKyAgICAgICAgLy8vICAgcGFzc2luZyB0aGUgbmFtZSBvZiB0aGUgemlwIGZpbGUsIGJlY2F1c2UgdXNpbmcgPGM+WmlwRmlsZS5SZWFkKCk8L2M+IGluCisgICAgICAgIC8vLyAgIHlvdXIgY29kZSBjb21tdW5pY2F0ZXMgdmVyeSBjbGVhcmx5IHdoYXQgeW91IGFyZSBkb2luZy4gIEluIGVpdGhlciBjYXNlLAorICAgICAgICAvLy8gICB0aGUgZmlsZSBpcyB0aGVuIHJlYWQgaW50byB0aGUgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UuICBUaGUgYXBwIGNhbiB0aGVuCisgICAgICAgIC8vLyAgIGVudW1lcmF0ZSB0aGUgZW50cmllcyBvciBjYW4gbW9kaWZ5IHRoZSB6aXAgZmlsZSwgZm9yIGV4YW1wbGUgYWRkaW5nCisgICAgICAgIC8vLyAgIGVudHJpZXMsIHJlbW92aW5nIGVudHJpZXMsIGNoYW5naW5nIGNvbW1lbnRzLCBhbmQgc28gb24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIE9uZSBhZHZhbnRhZ2UgdG8gdGhpcyBwYXJhbWV0ZXJpemVkIGNvbnN0cnVjdG9yOiBpdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvCisgICAgICAgIC8vLyAgIHVzZSB0aGUgc2FtZSBjb2RlIHRvIGFkZCBpdGVtcyB0byBhIHppcCBhcmNoaXZlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCisgICAgICAgIC8vLyAgIHppcCBmaWxlIGV4aXN0cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW5zdGFuY2VzIG9mIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyBhcmUgbm90IG11bHRpLXRocmVhZCBzYWZlLiAgWW91IG1heQorICAgICAgICAvLy8gICBub3QgcGFydHkgb24gYSBzaW5nbGUgaW5zdGFuY2Ugd2l0aCBtdWx0aXBsZSB0aHJlYWRzLiAgWW91IG1heSBoYXZlCisgICAgICAgIC8vLyAgIG11bHRpcGxlIHRocmVhZHMgdGhhdCBlYWNoIHVzZSBhIGRpc3RpbmN0IDxjPlppcEZpbGU8L2M+IGluc3RhbmNlLCBvciB5b3UKKyAgICAgICAgLy8vICAgY2FuIHN5bmNocm9uaXplIG11bHRpLXRocmVhZCBhY2Nlc3MgdG8gYSBzaW5nbGUgaW5zdGFuY2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEJ5IHRoZSB3YXksIHNpbmNlIERvdE5ldFppcCBpcyBzbyBlYXN5IHRvIHVzZSwgZG9uJ3QgeW91IHRoaW5rIDxzZWUKKyAgICAgICAgLy8vICAgaHJlZj0iaHR0cDovL2NoZWVzby5tZW1iZXJzLndpbmlzcC5uZXQvRG90TmV0WmlwRG9uYXRlLmFzcHgiPnlvdSBzaG91bGQKKyAgICAgICAgLy8vICAgZG9uYXRlICQ1IG9yICQxMDwvc2VlPj8KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJb25pYy5aaXAuWmlwRXhjZXB0aW9uIj4KKyAgICAgICAgLy8vIFRocm93biBpZiBuYW1lIHJlZmVycyB0byBhbiBleGlzdGluZyBmaWxlIHRoYXQgaXMgbm90IGEgdmFsaWQgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY3JlYXRlIGEgemlwZmlsZSwgYW5kIGFkZCBhIGZldyBmaWxlcyBpbnRvIGl0LgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyBTdHJpbmcgWmlwRmlsZVRvQ3JlYXRlID0gImFyY2hpdmUxLnppcCI7CisgICAgICAgIC8vLyBTdHJpbmcgRGlyZWN0b3J5VG9aaXAgID0gImM6XFxyZXBvcnRzIjsKKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIC8vIFN0b3JlIGFsbCBmaWxlcyBmb3VuZCBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSwgaW50byB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IFN5c3RlbS5JTy5EaXJlY3RvcnkuR2V0RmlsZXMoRGlyZWN0b3J5VG9aaXApOworICAgICAgICAvLy8gICB6aXAuQWRkRmlsZXMoZmlsZW5hbWVzLCAiZmlsZXMiKTsKKyAgICAgICAgLy8vICAgemlwLlNhdmUoWmlwRmlsZVRvQ3JlYXRlKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBEaW0gWmlwRmlsZVRvQ3JlYXRlIEFzIFN0cmluZyA9ICJhcmNoaXZlMS56aXAiCisgICAgICAgIC8vLyBEaW0gRGlyZWN0b3J5VG9aaXAgQXMgU3RyaW5nID0gImM6XHJlcG9ydHMiCisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IE5ldyBaaXBGaWxlKCkKKyAgICAgICAgLy8vICAgICBEaW0gZmlsZW5hbWVzIEFzIFN0cmluZygpID0gU3lzdGVtLklPLkRpcmVjdG9yeS5HZXRGaWxlcyhEaXJlY3RvcnlUb1ppcCkKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZXMoZmlsZW5hbWVzLCAiZmlsZXMiKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKFppcEZpbGVUb0NyZWF0ZSkKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIGZpbGVuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyB6aXAgYXJjaGl2ZS48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFppcEZpbGUoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfSW5pdEluc3RhbmNlKGZpbGVOYW1lLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJDb3VsZCBub3QgcmVhZCB7MH0gYXMgYSB6aXAgZmlsZSIsIGZpbGVOYW1lKSwgZTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZXMgYSBuZXcgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZSBmb3IgdGhlCisgICAgICAgIC8vLyAgIGZpbGVuYW1lLCBhbmQgdGhlIHNwZWNpZmllZCBFbmNvZGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gdGhlIDxzZWUgY3JlZj0iWmlwRmlsZShTdHJpbmcpIj5aaXBGaWxlCisgICAgICAgIC8vLyAgIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQ8L3NlZT4gZm9yIGJhc2ljCisgICAgICAgIC8vLyAgIGluZm9ybWF0aW9uIG9uIGFsbCB0aGUgPGM+WmlwRmlsZTwvYz4gY29uc3RydWN0b3JzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgRW5jb2RpbmcgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBhbHRlcm5hdGUgZW5jb2RpbmcgZm9yIGVudHJpZXMgd2l0aAorICAgICAgICAvLy8gICBmaWxlbmFtZXMgb3IgY29tbWVudHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCB3aXRoIHRoZSBJQk00MzcgY29kZSBwYWdlLgorICAgICAgICAvLy8gICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJQcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nIi8+IHByb3BlcnR5IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPgorICAgICAgICAvLy8gICBpbnN0YW5jZSBhZnRlciBjb25zdHJ1Y3Rpb24uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluc3RhbmNlcyBvZiB0aGUgPGM+WmlwRmlsZTwvYz4gY2xhc3MgYXJlIG5vdCBtdWx0aS10aHJlYWQgc2FmZS4gIFlvdSBtYXkKKyAgICAgICAgLy8vICAgbm90IHBhcnR5IG9uIGEgc2luZ2xlIGluc3RhbmNlIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4gIFlvdSBtYXkgaGF2ZQorICAgICAgICAvLy8gICBtdWx0aXBsZSB0aHJlYWRzIHRoYXQgZWFjaCB1c2UgYSBkaXN0aW5jdCA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSwgb3IgeW91CisgICAgICAgIC8vLyAgIGNhbiBzeW5jaHJvbml6ZSBtdWx0aS10aHJlYWQgYWNjZXNzIHRvIGEgc2luZ2xlIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IklvbmljLlppcC5aaXBFeGNlcHRpb24iPgorICAgICAgICAvLy8gVGhyb3duIGlmIG5hbWUgcmVmZXJzIHRvIGFuIGV4aXN0aW5nIGZpbGUgdGhhdCBpcyBub3QgYSB2YWxpZCB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIGZpbGVuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyB6aXAgYXJjaGl2ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgRW5jb2RpbmcgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBhbHRlcm5hdGUKKyAgICAgICAgLy8vIGVuY29kaW5nIGZvciBlbnRyaWVzIHdpdGggZmlsZW5hbWVzIG9yIGNvbW1lbnRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQKKyAgICAgICAgLy8vIHdpdGggdGhlIElCTTQzNyBjb2RlIHBhZ2UuIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBaaXBGaWxlKHN0cmluZyBmaWxlTmFtZSwgU3lzdGVtLlRleHQuRW5jb2RpbmcgZW5jb2RpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFsdGVybmF0ZUVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5BbHdheXM7CisgICAgICAgICAgICAgICAgX0luaXRJbnN0YW5jZShmaWxlTmFtZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiezB9IGlzIG5vdCBhIHZhbGlkIHppcCBmaWxlIiwgZmlsZU5hbWUpLCBlMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDcmVhdGUgYSB6aXAgZmlsZSwgd2l0aG91dCBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGZpbGVuYW1lIG9yIHN0cmVhbSB0byBzYXZlIHRvLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlKFN0cmluZykiPlppcEZpbGUKKyAgICAgICAgLy8vICAgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudDwvc2VlPiBmb3IgYmFzaWMKKyAgICAgICAgLy8vICAgaW5mb3JtYXRpb24gb24gYWxsIHRoZSA8Yz5aaXBGaWxlPC9jPiBjb25zdHJ1Y3RvcnMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFmdGVyIGluc3RhbnRpYXRpbmcgd2l0aCB0aGlzIGNvbnN0cnVjdG9yIGFuZCBhZGRpbmcgZW50cmllcyB0byB0aGUKKyAgICAgICAgLy8vICAgYXJjaGl2ZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDxzZWUgY3JlZj0iWmlwRmlsZS5TYXZlKFN0cmluZykiLz4gb3IKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBGaWxlLlNhdmUoU3lzdGVtLklPLlN0cmVhbSkiLz4gdG8gc2F2ZSB0byBhIGZpbGUgb3IgYQorICAgICAgICAvLy8gICBzdHJlYW0sIHJlc3BlY3RpdmVseS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gYWxzbyBzZXQgdGhlIDxzZWUgY3JlZj0iTmFtZSIvPgorICAgICAgICAvLy8gICBwcm9wZXJ0eSBhbmQgdGhlbiBjYWxsIHRoZSBuby1hcmd1bWVudCA8c2VlIGNyZWY9IlNhdmUoKSIvPiBtZXRob2QuICAoVGhpcworICAgICAgICAvLy8gICBpcyB0aGUgcHJlZmVycmVkIGFwcHJvYWNoIGZvciBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGxpYnJhcnkgdGhyb3VnaAorICAgICAgICAvLy8gICBDT00gaW50ZXJvcC4pICBJZiB5b3UgY2FsbCB0aGUgbm8tYXJndW1lbnQgPHNlZSBjcmVmPSJTYXZlKCkiLz4gbWV0aG9kCisgICAgICAgIC8vLyAgIHdpdGhvdXQgaGF2aW5nIHNldCB0aGUgPGM+TmFtZTwvYz4gb2YgdGhlIDxjPlppcEZpbGU8L2M+LCBlaXRoZXIgdGhyb3VnaAorICAgICAgICAvLy8gICB0aGUgcGFyYW1ldGVyaXplZCBjb25zdHJ1Y3RvciBvciB0aHJvdWdoIHRoZSBleHBsaWNpdCBwcm9wZXJ0eSAsIHRoZQorICAgICAgICAvLy8gICBTYXZlKCkgd2lsbCB0aHJvdywgYmVjYXVzZSB0aGVyZSBpcyBubyBwbGFjZSB0byBzYXZlIHRoZSBmaWxlLiAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbnN0YW5jZXMgb2YgdGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzIGFyZSBub3QgbXVsdGktdGhyZWFkIHNhZmUuICBZb3UgbWF5CisgICAgICAgIC8vLyAgIGhhdmUgbXVsdGlwbGUgdGhyZWFkcyB0aGF0IGVhY2ggdXNlIGEgZGlzdGluY3QgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UsIG9yCisgICAgICAgIC8vLyAgIHlvdSBjYW4gc3luY2hyb25pemUgbXVsdGktdGhyZWFkIGFjY2VzcyB0byBhIHNpbmdsZSBpbnN0YW5jZS4gIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIFppcCBhcmNoaXZlIGNhbGxlZCBCYWNrdXAuemlwLCBjb250YWluaW5nIGFsbCB0aGUgZmlsZXMKKyAgICAgICAgLy8vIGluIHRoZSBkaXJlY3RvcnkgRGlyZWN0b3J5VG9aaXAuIEZpbGVzIHdpdGhpbiBzdWJkaXJlY3RvcmllcyBhcmUgbm90IHppcHBlZCB1cC4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgLy8gU3RvcmUgYWxsIGZpbGVzIGZvdW5kIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBpbnRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgLy8gbm90ZTogdGhpcyBjb2RlIGRvZXMgbm90IHJlY3Vyc2Ugc3ViZGlyZWN0b3JpZXMhCisgICAgICAgIC8vLyAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IFN5c3RlbS5JTy5EaXJlY3RvcnkuR2V0RmlsZXMoRGlyZWN0b3J5VG9aaXApOworICAgICAgICAvLy8gICB6aXAuQWRkRmlsZXMoZmlsZW5hbWVzLCAiZmlsZXMiKTsKKyAgICAgICAgLy8vICAgemlwLlNhdmUoIkJhY2t1cC56aXAiKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyB6aXAgQXMgTmV3IFppcEZpbGUKKyAgICAgICAgLy8vICAgICAnIFN0b3JlIGFsbCBmaWxlcyBmb3VuZCBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSwgaW50byB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyAgICAgJyBub3RlOiB0aGlzIGNvZGUgZG9lcyBub3QgcmVjdXJzZSBzdWJkaXJlY3RvcmllcyEKKyAgICAgICAgLy8vICAgICBEaW0gZmlsZW5hbWVzIEFzIFN0cmluZygpID0gU3lzdGVtLklPLkRpcmVjdG9yeS5HZXRGaWxlcyhEaXJlY3RvcnlUb1ppcCkKKyAgICAgICAgLy8vICAgICB6aXAuQWRkRmlsZXMoZmlsZW5hbWVzLCAiZmlsZXMiKQorICAgICAgICAvLy8gICAgIHppcC5TYXZlKCJCYWNrdXAuemlwIikKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICBwdWJsaWMgWmlwRmlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9Jbml0SW5zdGFuY2UobnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgemlwIGZpbGUsIHNwZWNpZnlpbmcgYSB0ZXh0IEVuY29kaW5nLCBidXQgd2l0aG91dCBzcGVjaWZ5aW5nIGEKKyAgICAgICAgLy8vICAgdGFyZ2V0IGZpbGVuYW1lIG9yIHN0cmVhbSB0byBzYXZlIHRvLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlKFN0cmluZykiPlppcEZpbGUKKyAgICAgICAgLy8vICAgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudDwvc2VlPiBmb3IgYmFzaWMKKyAgICAgICAgLy8vICAgaW5mb3JtYXRpb24gb24gYWxsIHRoZSA8Yz5aaXBGaWxlPC9jPiBjb25zdHJ1Y3RvcnMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmNvZGluZyI+CisgICAgICAgIC8vLyBUaGUgRW5jb2RpbmcgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBhbHRlcm5hdGUgZW5jb2RpbmcgZm9yIGVudHJpZXMgd2l0aAorICAgICAgICAvLy8gZmlsZW5hbWVzIG9yIGNvbW1lbnRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgd2l0aCB0aGUgSUJNNDM3IGNvZGUgcGFnZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBaaXBGaWxlKFN5c3RlbS5UZXh0LkVuY29kaW5nIGVuY29kaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBBbHRlcm5hdGVFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5BbHdheXM7CisgICAgICAgICAgICBfSW5pdEluc3RhbmNlKG51bGwsIG51bGwpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZXMgYSBuZXcgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZSBmb3IgdGhlCisgICAgICAgIC8vLyAgIGZpbGVuYW1lLCBhbmQgdGhlIHNwZWNpZmllZCBzdGF0dXMgbWVzc2FnZSB3cml0ZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZSA8c2VlIGNyZWY9IlppcEZpbGUoU3RyaW5nKSI+WmlwRmlsZQorICAgICAgICAvLy8gICBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50PC9zZWU+IGZvciBiYXNpYworICAgICAgICAvLy8gICBpbmZvcm1hdGlvbiBvbiBhbGwgdGhlIDxjPlppcEZpbGU8L2M+IGNvbnN0cnVjdG9ycy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBjb25zdHJ1Y3RvciBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzIGluIGEgVGV4dFdyaXRlciwKKyAgICAgICAgLy8vICAgdG8gd2hpY2ggdmVyYm9zZSBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gZHVyaW5nIGV4dHJhY3Rpb24gb3IgY3JlYXRpb24gb2YKKyAgICAgICAgLy8vICAgdGhlIHppcCBhcmNoaXZlLiAgQSBjb25zb2xlIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvIHBhc3MKKyAgICAgICAgLy8vICAgU3lzdGVtLkNvbnNvbGUuT3V0IHRvIGdldCBtZXNzYWdlcyBvbiB0aGUgQ29uc29sZS4gQSBncmFwaGljYWwgb3IgaGVhZGxlc3MKKyAgICAgICAgLy8vICAgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8gY2FwdHVyZSB0aGUgbWVzc2FnZXMgaW4gYSBkaWZmZXJlbnQKKyAgICAgICAgLy8vICAgPGM+VGV4dFdyaXRlcjwvYz4sIGZvciBleGFtcGxlLCBhIDxjPlN0cmluZ1dyaXRlcjwvYz4sIGFuZCB0aGVuIGRpc3BsYXkKKyAgICAgICAgLy8vICAgdGhlIG1lc3NhZ2VzIGluIGEgVGV4dEJveCwgb3IgZ2VuZXJhdGUgYW4gYXVkaXQgbG9nIG9mIFppcEZpbGUgb3BlcmF0aW9ucy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG8gZW5jcnlwdCB0aGUgZGF0YSBmb3IgdGhlIGZpbGVzIGFkZGVkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSwKKyAgICAgICAgLy8vICAgc2V0IHRoZSBQYXNzd29yZCBwcm9wZXJ0eSBhZnRlciBjcmVhdGluZyB0aGUgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluc3RhbmNlcyBvZiB0aGUgPGM+WmlwRmlsZTwvYz4gY2xhc3MgYXJlIG5vdCBtdWx0aS10aHJlYWQgc2FmZS4gIFlvdSBtYXkKKyAgICAgICAgLy8vICAgbm90IHBhcnR5IG9uIGEgc2luZ2xlIGluc3RhbmNlIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4gIFlvdSBtYXkgaGF2ZQorICAgICAgICAvLy8gICBtdWx0aXBsZSB0aHJlYWRzIHRoYXQgZWFjaCB1c2UgYSBkaXN0aW5jdCA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSwgb3IgeW91CisgICAgICAgIC8vLyAgIGNhbiBzeW5jaHJvbml6ZSBtdWx0aS10aHJlYWQgYWNjZXNzIHRvIGEgc2luZ2xlIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IklvbmljLlppcC5aaXBFeGNlcHRpb24iPgorICAgICAgICAvLy8gVGhyb3duIGlmIG5hbWUgcmVmZXJzIHRvIGFuIGV4aXN0aW5nIGZpbGUgdGhhdCBpcyBub3QgYSB2YWxpZCB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZSgiQmFja3VwLnppcCIsIENvbnNvbGUuT3V0KSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgLy8gU3RvcmUgYWxsIGZpbGVzIGZvdW5kIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBpbnRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgLy8gbm90ZTogdGhpcyBjb2RlIGRvZXMgbm90IHJlY3Vyc2Ugc3ViZGlyZWN0b3JpZXMhCisgICAgICAgIC8vLyAgIC8vIFN0YXR1cyBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gQ29uc29sZS5PdXQKKyAgICAgICAgLy8vICAgU3RyaW5nW10gZmlsZW5hbWVzID0gU3lzdGVtLklPLkRpcmVjdG9yeS5HZXRGaWxlcyhEaXJlY3RvcnlUb1ppcCk7CisgICAgICAgIC8vLyAgIHppcC5BZGRGaWxlcyhmaWxlbmFtZXMpOworICAgICAgICAvLy8gICB6aXAuU2F2ZSgpOworICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBOZXcgWmlwRmlsZSgiQmFja3VwLnppcCIsIENvbnNvbGUuT3V0KQorICAgICAgICAvLy8gICAgICcgU3RvcmUgYWxsIGZpbGVzIGZvdW5kIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LCBpbnRvIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vICAgICAnIG5vdGU6IHRoaXMgY29kZSBkb2VzIG5vdCByZWN1cnNlIHN1YmRpcmVjdG9yaWVzIQorICAgICAgICAvLy8gICAgICcgU3RhdHVzIG1lc3NhZ2VzIHdpbGwgYmUgd3JpdHRlbiB0byBDb25zb2xlLk91dAorICAgICAgICAvLy8gICAgIERpbSBmaWxlbmFtZXMgQXMgU3RyaW5nKCkgPSBTeXN0ZW0uSU8uRGlyZWN0b3J5LkdldEZpbGVzKERpcmVjdG9yeVRvWmlwKQorICAgICAgICAvLy8gICAgIHppcC5BZGRGaWxlcyhmaWxlbmFtZXMpCisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoKQorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj5UaGUgZmlsZW5hbWUgdG8gdXNlIGZvciB0aGUgbmV3IHppcCBhcmNoaXZlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhdHVzTWVzc2FnZVdyaXRlciI+QSBUZXh0V3JpdGVyIHRvIHVzZSBmb3Igd3JpdGluZworICAgICAgICAvLy8gdmVyYm9zZSBzdGF0dXMgbWVzc2FnZXMuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFppcEZpbGUoc3RyaW5nIGZpbGVOYW1lLCBUZXh0V3JpdGVyIHN0YXR1c01lc3NhZ2VXcml0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9Jbml0SW5zdGFuY2UoZmlsZU5hbWUsIHN0YXR1c01lc3NhZ2VXcml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoInswfSBpcyBub3QgYSB2YWxpZCB6aXAgZmlsZSIsIGZpbGVOYW1lKSwgZTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZXMgYSBuZXcgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZSBmb3IgdGhlCisgICAgICAgIC8vLyAgIGZpbGVuYW1lLCB0aGUgc3BlY2lmaWVkIHN0YXR1cyBtZXNzYWdlIHdyaXRlciwgYW5kIHRoZSBzcGVjaWZpZWQgRW5jb2RpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBjb25zdHJ1Y3RvciB3b3JrcyBsaWtlIHRoZSA8c2VlIGNyZWY9IlppcEZpbGUoU3RyaW5nKSI+WmlwRmlsZQorICAgICAgICAvLy8gICBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50Ljwvc2VlPiBTZWUgdGhhdAorICAgICAgICAvLy8gICByZWZlcmVuY2UgZm9yIGRldGFpbCBvbiB3aGF0IHRoaXMgY29uc3RydWN0b3IgZG9lcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBjb25zdHJ1Y3RvciBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzIGluIGEKKyAgICAgICAgLy8vICAgPGM+VGV4dFdyaXRlcjwvYz4sIGFuZCBhbiBFbmNvZGluZy4gIFRoZSA8Yz5UZXh0V3JpdGVyPC9jPiB3aWxsIGNvbGxlY3QKKyAgICAgICAgLy8vICAgdmVyYm9zZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGxpYnJhcnkgZHVyaW5nIGV4dHJhY3Rpb24gb3IKKyAgICAgICAgLy8vICAgY3JlYXRpb24gb2YgdGhlIHppcCBhcmNoaXZlLiAgQSBjb25zb2xlIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvIHBhc3MKKyAgICAgICAgLy8vICAgPGM+U3lzdGVtLkNvbnNvbGUuT3V0PC9jPiB0byBnZXQgbWVzc2FnZXMgb24gdGhlIENvbnNvbGUuIEEgZ3JhcGhpY2FsIG9yCisgICAgICAgIC8vLyAgIGhlYWRsZXNzIGFwcGxpY2F0aW9uIG1heSB3aXNoIHRvIGNhcHR1cmUgdGhlIG1lc3NhZ2VzIGluIGEgZGlmZmVyZW50CisgICAgICAgIC8vLyAgIDxjPlRleHRXcml0ZXI8L2M+LCBmb3IgZXhhbXBsZSwgYSA8Yz5TdHJpbmdXcml0ZXI8L2M+LCBhbmQgdGhlbiBkaXNwbGF5CisgICAgICAgIC8vLyAgIHRoZSBtZXNzYWdlcyBpbiBhIDxjPlRleHRCb3g8L2M+LCBvciBnZW5lcmF0ZSBhbiBhdWRpdCBsb2cgb2YKKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4gb3BlcmF0aW9ucy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIDxjPkVuY29kaW5nPC9jPiBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGFsdGVybmF0ZSBlbmNvZGluZyBmb3IgZW50cmllcworICAgICAgICAvLy8gICB3aXRoIGZpbGVuYW1lcyBvciBjb21tZW50cyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggdGhlIElCTTQzNyBjb2RlCisgICAgICAgIC8vLyAgIHBhZ2UuICBUaGlzIGlzIGEgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4gcHJvcGVydHkgb24gdGhlIDxjPlppcEZpbGU8L2M+CisgICAgICAgIC8vLyAgIGluc3RhbmNlIGFmdGVyIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG8gZW5jcnlwdCB0aGUgZGF0YSBmb3IgdGhlIGZpbGVzIGFkZGVkIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSwKKyAgICAgICAgLy8vICAgc2V0IHRoZSA8Yz5QYXNzd29yZDwvYz4gcHJvcGVydHkgYWZ0ZXIgY3JlYXRpbmcgdGhlIDxjPlppcEZpbGU8L2M+CisgICAgICAgIC8vLyAgIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbnN0YW5jZXMgb2YgdGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzIGFyZSBub3QgbXVsdGktdGhyZWFkIHNhZmUuICBZb3UgbWF5CisgICAgICAgIC8vLyAgIG5vdCBwYXJ0eSBvbiBhIHNpbmdsZSBpbnN0YW5jZSB3aXRoIG11bHRpcGxlIHRocmVhZHMuICBZb3UgbWF5IGhhdmUKKyAgICAgICAgLy8vICAgbXVsdGlwbGUgdGhyZWFkcyB0aGF0IGVhY2ggdXNlIGEgZGlzdGluY3QgPGM+WmlwRmlsZTwvYz4gaW5zdGFuY2UsIG9yIHlvdQorICAgICAgICAvLy8gICBjYW4gc3luY2hyb25pemUgbXVsdGktdGhyZWFkIGFjY2VzcyB0byBhIHNpbmdsZSBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJb25pYy5aaXAuWmlwRXhjZXB0aW9uIj4KKyAgICAgICAgLy8vIFRocm93biBpZiA8Yz5maWxlTmFtZTwvYz4gcmVmZXJzIHRvIGFuIGV4aXN0aW5nIGZpbGUgdGhhdCBpcyBub3QgYSB2YWxpZCB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIGZpbGVuYW1lIHRvIHVzZSBmb3IgdGhlIG5ldyB6aXAgYXJjaGl2ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXR1c01lc3NhZ2VXcml0ZXIiPkEgVGV4dFdyaXRlciB0byB1c2UgZm9yIHdyaXRpbmcgdmVyYm9zZQorICAgICAgICAvLy8gc3RhdHVzIG1lc3NhZ2VzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jb2RpbmciPgorICAgICAgICAvLy8gVGhlIEVuY29kaW5nIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgYWx0ZXJuYXRlIGVuY29kaW5nIGZvciBlbnRyaWVzIHdpdGgKKyAgICAgICAgLy8vIGZpbGVuYW1lcyBvciBjb21tZW50cyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggdGhlIElCTTQzNyBjb2RlIHBhZ2UuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgWmlwRmlsZShzdHJpbmcgZmlsZU5hbWUsIFRleHRXcml0ZXIgc3RhdHVzTWVzc2FnZVdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlRleHQuRW5jb2RpbmcgZW5jb2RpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFsdGVybmF0ZUVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5BbHdheXM7CisgICAgICAgICAgICAgICAgX0luaXRJbnN0YW5jZShmaWxlTmFtZSwgc3RhdHVzTWVzc2FnZVdyaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiezB9IGlzIG5vdCBhIHZhbGlkIHppcCBmaWxlIiwgZmlsZU5hbWUpLCBlMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEluaXRpYWxpemUgYSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZSBieSByZWFkaW5nIGluIGEgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIGlzIHByaW1hcmlseSB1c2VmdWwgZnJvbSBDT00gQXV0b21hdGlvbiBlbnZpcm9ubWVudHMsIHdoZW4KKyAgICAgICAgLy8vICAgcmVhZGluZyBvciBleHRyYWN0aW5nIHppcCBmaWxlcy4gSW4gQ09NLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW52b2tlCisgICAgICAgIC8vLyAgIHBhcmFtZXRlcml6ZWQgY29uc3RydWN0b3JzIGZvciBhIGNsYXNzLiBBIENPTSBBdXRvbWF0aW9uIGFwcGxpY2F0aW9uIGNhbgorICAgICAgICAvLy8gICB1cGRhdGUgYSB6aXAgZmlsZSBieSB1c2luZyB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlKCkiPmRlZmF1bHQgKG5vIGFyZ3VtZW50KQorICAgICAgICAvLy8gICBjb25zdHJ1Y3Rvcjwvc2VlPiwgdGhlbiBjYWxsaW5nIDxjPkluaXRpYWxpemUoKTwvYz4gdG8gcmVhZCB0aGUgY29udGVudHMKKyAgICAgICAgLy8vICAgb2YgYW4gb24tZGlzayB6aXAgYXJjaGl2ZSBpbnRvIHRoZSA8Yz5aaXBGaWxlPC9jPiBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgLk5FVCBhcHBsaWNhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSA8Yz5aaXBGaWxlLlJlYWQoKTwvYz4gbWV0aG9kcworICAgICAgICAvLy8gICBmb3IgYmV0dGVyIGNsYXJpdHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj50aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgemlwIGZpbGUgdG8gcmVhZCBpbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0luaXRJbnN0YW5jZShmaWxlTmFtZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiezB9IGlzIG5vdCBhIHZhbGlkIHppcCBmaWxlIiwgZmlsZU5hbWUpLCBlMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9pbml0RW50cmllc0RpY3Rpb25hcnkoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA5ODY4CisgICAgICAgICAgICBTdHJpbmdDb21wYXJlciBzYyA9IChDYXNlU2Vuc2l0aXZlUmV0cmlldmFsKSA/IFN0cmluZ0NvbXBhcmVyLk9yZGluYWwgOiBTdHJpbmdDb21wYXJlci5PcmRpbmFsSWdub3JlQ2FzZTsKKyAgICAgICAgICAgIF9lbnRyaWVzID0gKF9lbnRyaWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBuZXcgRGljdGlvbmFyeTxTdHJpbmcsIFppcEVudHJ5PihzYykKKyAgICAgICAgICAgICAgICA6IG5ldyBEaWN0aW9uYXJ5PFN0cmluZywgWmlwRW50cnk+KF9lbnRyaWVzLCBzYyk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBfSW5pdEluc3RhbmNlKHN0cmluZyB6aXBGaWxlTmFtZSwgVGV4dFdyaXRlciBzdGF0dXNNZXNzYWdlV3JpdGVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgemlwZmlsZQorICAgICAgICAgICAgX25hbWUgPSB6aXBGaWxlTmFtZTsKKyAgICAgICAgICAgIF9TdGF0dXNNZXNzYWdlVGV4dFdyaXRlciA9IHN0YXR1c01lc3NhZ2VXcml0ZXI7CisgICAgICAgICAgICBfY29udGVudHNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIEFkZERpcmVjdG9yeVdpbGxUcmF2ZXJzZVJlcGFyc2VQb2ludHMgPSB0cnVlOyAgLy8gd29ya2l0ZW0gODYxNworICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbCA9IE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0OworI2lmICFORVRDRgorICAgICAgICAgICAgUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkID0gNTEyICogMTAyNDsKKyNlbmRpZgorICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzY4NSwgOTg2OAorICAgICAgICAgICAgX2luaXRFbnRyaWVzRGljdGlvbmFyeSgpOworCisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoX25hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChGdWxsU2NhbikKKyAgICAgICAgICAgICAgICAgICAgUmVhZEludG9JbnN0YW5jZV9PcmlnKHRoaXMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUmVhZEludG9JbnN0YW5jZSh0aGlzKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9maWxlQWxyZWFkeUV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKworCisgICAgICAgICNyZWdpb24gSW5kZXhlcnMgYW5kIENvbGxlY3Rpb25zCisKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFppcEVudHJ5PiBaaXBFbnRyaWVzQXNMaXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemlwRW50cmllc0FzTGlzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfemlwRW50cmllc0FzTGlzdCA9IG5ldyBMaXN0PFppcEVudHJ5PihfZW50cmllcy5WYWx1ZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBfemlwRW50cmllc0FzTGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhpcyBpcyBhbiBpbnRlZ2VyIGluZGV4ZXIgaW50byB0aGUgWmlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEludGVybmFsbHksIHRoZSA8Yz5aaXBFbnRyeTwvYz4gaW5zdGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBGaWxlPC9jPiBhcmUgc3RvcmVkIGluIGEgRGljdGlvbmFyeS4gIFdoZW4geW91IHVzZSB0aGlzCisgICAgICAgIC8vLyAgIGluZGV4ZXIgdGhlIGZpcnN0IHRpbWUsIGl0IGNyZWF0ZXMgYSByZWFkLW9ubHkKKyAgICAgICAgLy8vICAgPGM+TGlzdCZsdDtaaXBFbnRyeSZndDs8L2M+IGZyb20gdGhlIERpY3Rpb25hcnkuVmFsdWVzIENvbGxlY3Rpb24uCisgICAgICAgIC8vLyAgIElmIGF0IGFueSB0aW1lIHlvdSBtb2RpZnkgdGhlIHNldCBvZiBlbnRyaWVzIGluIHRoZSA8Yz5aaXBGaWxlPC9jPiwKKyAgICAgICAgLy8vICAgZWl0aGVyIGJ5IGFkZGluZyBhbiBlbnRyeSwgcmVtb3ZpbmcgYW4gZW50cnksIG9yIHJlbmFtaW5nIGFuCisgICAgICAgIC8vLyAgIGVudHJ5LCBhIG5ldyBMaXN0IHdpbGwgYmUgY3JlYXRlZCwgYW5kIHRoZSBudW1lcmljIGluZGV4ZXMgZm9yIHRoZQorICAgICAgICAvLy8gICByZW1haW5pbmcgZW50cmllcyBtYXkgYmUgZGlmZmVyZW50LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIG1lYW5zIHlvdSBjYW5ub3QgcmVuYW1lIGFueSBaaXBFbnRyeSBmcm9tCisgICAgICAgIC8vLyAgIGluc2lkZSBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml4Ij4KKyAgICAgICAgLy8vICAgVGhlIGluZGV4IHZhbHVlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyAgIFRoZSA8Yz5aaXBFbnRyeTwvYz4gd2l0aGluIHRoZSBaaXAgYXJjaGl2ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiB0aGUKKyAgICAgICAgLy8vICAgZW50cnkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUsIHRoaXMgaW5kZXhlciB0aHJvd3MuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgWmlwRW50cnkgdGhpc1tpbnQgaXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDY0MDIKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaaXBFbnRyaWVzQXNMaXN0W2l4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGlzIGlzIGEgbmFtZS1iYXNlZCBpbmRleGVyIGludG8gdGhlIFppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgaXMgcmVhZC1vbmx5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgPHNlZSBjcmVmPSJDYXNlU2Vuc2l0aXZlUmV0cmlldmFsIi8+IHByb3BlcnR5IG9uIHRoZSA8Yz5aaXBGaWxlPC9jPgorICAgICAgICAvLy8gICBkZXRlcm1pbmVzIHdoZXRoZXIgcmV0cmlldmFsIHZpYSB0aGlzIGluZGV4ZXIgaXMgZG9uZSB2aWEgY2FzZS1zZW5zaXRpdmUKKyAgICAgICAgLy8vICAgY29tcGFyaXNvbnMuIEJ5IGRlZmF1bHQsIHJldHJpZXZhbCBpcyBub3QgY2FzZSBzZW5zaXRpdmUuICBUaGlzIG1ha2VzCisgICAgICAgIC8vLyAgIHNlbnNlIG9uIFdpbmRvd3MsIGluIHdoaWNoIGZpbGVzeXN0ZW1zIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFJlZ2FyZGxlc3Mgb2YgY2FzZS1zZW5zaXRpdml0eSwgaXQgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSB0aGF0CisgICAgICAgIC8vLyAgIDxjPnRoaXNbdmFsdWVdLkZpbGVOYW1lID09IHZhbHVlPC9jPi4gSW4gb3RoZXIgd29yZHMsIHRoZSA8Yz5GaWxlTmFtZTwvYz4KKyAgICAgICAgLy8vICAgcHJvcGVydHkgb2YgdGhlIDxjPlppcEVudHJ5PC9jPiByZXRyaWV2ZWQgd2l0aCB0aGlzIGluZGV4ZXIsIG1heSBvciBtYXkKKyAgICAgICAgLy8vICAgbm90IGJlIGVxdWFsIHRvIHRoZSBpbmRleCB2YWx1ZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBpcyBiZWNhdXNlIERvdE5ldFppcCBwZXJmb3JtcyBhIG5vcm1hbGl6YXRpb24gb2YgZmlsZW5hbWVzIHBhc3NlZCB0bworICAgICAgICAvLy8gICB0aGlzIGluZGV4ZXIsIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRoZSBpdGVtLiAgVGhhdCBub3JtYWxpemF0aW9uCisgICAgICAgIC8vLyAgIGluY2x1ZGVzOiByZW1vdmFsIG9mIGEgdm9sdW1lIGxldHRlciBhbmQgY29sb24sIHN3YXBwaW5nIGJhY2t3YXJkIHNsYXNoZXMKKyAgICAgICAgLy8vICAgZm9yIGZvcndhcmQgc2xhc2hlcy4gIFNvLCA8Yz56aXBbImRpcjFcXGVudHJ5MS50eHQiXS5GaWxlTmFtZSA9PQorICAgICAgICAvLy8gICAiZGlyMS9lbnRyeS50eHQiPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRGlyZWN0b3J5IGVudHJpZXMgaW4gdGhlIHppcCBmaWxlIG1heSBiZSByZXRyaWV2ZWQgdmlhIHRoaXMgaW5kZXhlciBvbmx5CisgICAgICAgIC8vLyAgIHdpdGggbmFtZXMgdGhhdCBoYXZlIGEgdHJhaWxpbmcgc2xhc2guIERvdE5ldFppcCBhdXRvbWF0aWNhbGx5IGFwcGVuZHMgYQorICAgICAgICAvLy8gICB0cmFpbGluZyBzbGFzaCB0byB0aGUgbmFtZXMgb2YgYW55IGRpcmVjdG9yeSBlbnRyaWVzIGFkZGVkIHRvIGEgemlwLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBleHRyYWN0cyBvbmx5IHRoZSBlbnRyaWVzIGluIGEgemlwIGZpbGUgdGhhdCBhcmUgLnR4dCBmaWxlcy4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gWmlwRmlsZS5SZWFkKCJQYWNrZWREb2N1bWVudHMuemlwIikpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIGZvcmVhY2ggKHN0cmluZyBzMSBpbiB6aXAuRW50cnlGaWxlbmFtZXMpCisgICAgICAgIC8vLyAgIHsKKyAgICAgICAgLy8vICAgICBpZiAoczEuRW5kc1dpdGgoIi50eHQiKSkKKyAgICAgICAgLy8vICAgICAgIHppcFtzMV0uRXh0cmFjdCgidGV4dGZpbGVzIik7CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vICAgVXNpbmcgemlwIEFzIFppcEZpbGUgPSBaaXBGaWxlLlJlYWQoIlBhY2tlZERvY3VtZW50cy56aXAiKQorICAgICAgICAvLy8gICAgICAgRGltIHMxIEFzIFN0cmluZworICAgICAgICAvLy8gICAgICAgRm9yIEVhY2ggczEgSW4gemlwLkVudHJ5RmlsZW5hbWVzCisgICAgICAgIC8vLyAgICAgICAgICAgSWYgczEuRW5kc1dpdGgoIi50eHQiKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgIHppcChzMSkuRXh0cmFjdCgidGV4dGZpbGVzIikKKyAgICAgICAgLy8vICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgIE5leHQKKyAgICAgICAgLy8vICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5aaXAuWmlwRmlsZS5SZW1vdmVFbnRyeShzdHJpbmcpIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iPgorICAgICAgICAvLy8gICBUaHJvd24gaWYgdGhlIGNhbGxlciBhdHRlbXB0cyB0byBhc3NpZ24gYSBub24tbnVsbCB2YWx1ZSB0byB0aGUgaW5kZXhlci4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+CisgICAgICAgIC8vLyAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLCBpbmNsdWRpbmcgYW55IGRpcmVjdG9yeSBwYXRoLCB0byByZXRyaWV2ZSBmcm9tIHRoZQorICAgICAgICAvLy8gICB6aXAuICBUaGUgZmlsZW5hbWUgbWF0Y2ggaXMgbm90IGNhc2Utc2Vuc2l0aXZlIGJ5IGRlZmF1bHQ7IHlvdSBjYW4gdXNlIHRoZQorICAgICAgICAvLy8gICA8c2VlIGNyZWY9IkNhc2VTZW5zaXRpdmVSZXRyaWV2YWwiLz4gcHJvcGVydHkgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3IuIFRoZQorICAgICAgICAvLy8gICBwYXRobmFtZSBjYW4gdXNlIGZvcndhcmQtc2xhc2hlcyBvciBiYWNrd2FyZCBzbGFzaGVzLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIDxjPlppcEVudHJ5PC9jPiB3aXRoaW4gdGhlIFppcCBhcmNoaXZlLCBnaXZlbiBieSB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyAgIGZpbGVuYW1lLiBJZiB0aGUgbmFtZWQgZW50cnkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUsIHRoaXMgaW5kZXhlcgorICAgICAgICAvLy8gICByZXR1cm5zIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbiBWQikuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgWmlwRW50cnkgdGhpc1tTdHJpbmcgZmlsZU5hbWVdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBrZXkgPSBTaGFyZWRVdGlsaXRpZXMuTm9ybWFsaXplUGF0aEZvclVzZUluWmlwRmlsZShmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKF9lbnRyaWVzLkNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZW50cmllc1trZXldOworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDExMDU2CisgICAgICAgICAgICAgICAga2V5ID0ga2V5LlJlcGxhY2UoIi8iLCAiXFwiKTsKKyAgICAgICAgICAgICAgICBpZiAoX2VudHJpZXMuQ29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9lbnRyaWVzW2tleV07CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyNpZiBNRVNTWQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gX2VudHJpZXMuVmFsdWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ2FzZVNlbnNpdGl2ZVJldHJpZXZhbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBmaWxlIG1hdGNoIHdpdGggYSBjYXNlLXNlbnNpdGl2ZSBjb21wYXJpc29uLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuRmlsZU5hbWUgPT0gZmlsZU5hbWUpIHJldHVybiBlOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjaGVjayBmb3IgZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5SZXBsYWNlKCJcXCIsICIvIikgPT0gZS5GaWxlTmFtZSkgcmV0dXJuIGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5GaWxlTmFtZS5SZXBsYWNlKCJcXCIsICIvIikgPT0gZmlsZU5hbWUpIHJldHVybiBlOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYSBkaWZmZXJlbmNlIG9ubHkgaW4gdHJhaWxpbmcgc2xhc2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLkZpbGVOYW1lLkVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lTm9TbGFzaCA9IGUuRmlsZU5hbWUuVHJpbSgiLyIuVG9DaGFyQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lTm9TbGFzaCA9PSBmaWxlTmFtZSkgcmV0dXJuIGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjaGVjayBmb3IgZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuUmVwbGFjZSgiXFwiLCAiLyIpID09IGZpbGVOYW1lTm9TbGFzaCkgcmV0dXJuIGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lTm9TbGFzaC5SZXBsYWNlKCJcXCIsICIvIikgPT0gZmlsZU5hbWUpIHJldHVybiBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgdGhlIGZpbGUgbWF0Y2ggaW4gYSBjYXNlLWluc2Vuc2l0aXZlIG1hbm5lci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuQ29tcGFyZShlLkZpbGVOYW1lLCBmaWxlTmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpID09IDApIHJldHVybiBlOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjaGVjayBmb3IgZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuQ29tcGFyZShmaWxlTmFtZS5SZXBsYWNlKCJcXCIsICIvIiksIGUuRmlsZU5hbWUsIFN0cmluZ0NvbXBhcmlzb24uQ3VycmVudEN1bHR1cmVJZ25vcmVDYXNlKSA9PSAwKSByZXR1cm4gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuQ29tcGFyZShlLkZpbGVOYW1lLlJlcGxhY2UoIlxcIiwgIi8iKSwgZmlsZU5hbWUsIFN0cmluZ0NvbXBhcmlzb24uQ3VycmVudEN1bHR1cmVJZ25vcmVDYXNlKSA9PSAwKSByZXR1cm4gZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGEgZGlmZmVyZW5jZSBvbmx5IGluIHRyYWlsaW5nIHNsYXNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5GaWxlTmFtZS5FbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZU5vU2xhc2ggPSBlLkZpbGVOYW1lLlRyaW0oIi8iLlRvQ2hhckFycmF5KCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZy5Db21wYXJlKGZpbGVOYW1lTm9TbGFzaCwgZmlsZU5hbWUsIFN0cmluZ0NvbXBhcmlzb24uQ3VycmVudEN1bHR1cmVJZ25vcmVDYXNlKSA9PSAwKSByZXR1cm4gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNoZWNrIGZvciBlcXVpdmFsZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuQ29tcGFyZShmaWxlTmFtZS5SZXBsYWNlKCJcXCIsICIvIiksIGZpbGVOYW1lTm9TbGFzaCwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpID09IDApIHJldHVybiBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuQ29tcGFyZShmaWxlTmFtZU5vU2xhc2guUmVwbGFjZSgiXFwiLCAiLyIpLCBmaWxlTmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5DdXJyZW50Q3VsdHVyZUlnbm9yZUNhc2UpID09IDApIHJldHVybiBlOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgbGlzdCBvZiBmaWxlbmFtZXMgZm9yIHRoZSBlbnRyaWVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBBY2NvcmRpbmcgdG8gdGhlIFpJUCBzcGVjaWZpY2F0aW9uLCB0aGUgbmFtZXMgb2YgdGhlIGVudHJpZXMgdXNlIGZvcndhcmQKKyAgICAgICAgLy8vICAgc2xhc2hlcyBpbiBwYXRobmFtZXMuICBJZiB5b3UgYXJlIHNjYW5uaW5nIHRocm91Z2ggdGhlIGxpc3QsIHlvdSBtYXkgaGF2ZQorICAgICAgICAvLy8gICB0byBzd2FwIGZvcndhcmQgc2xhc2hlcyBmb3IgYmFja3NsYXNoZXMuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUudGhpc1tzdHJpbmddIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBvbmUgd2F5IHRvIHRlc3QgaWYgYSBmaWxlbmFtZSBpcyBhbHJlYWR5IGNvbnRhaW5lZAorICAgICAgICAvLy8gICB3aXRoaW4gYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gU3RyaW5nIHppcEZpbGVUb1JlYWQ9ICJQYWNrZWREb2N1bWVudHMuemlwIjsKKyAgICAgICAgLy8vIHN0cmluZyBjYW5kaWRhdGUgPSAiRGF0ZWRNYXRlcmlhbC54cHMiOworICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoemlwRmlsZVRvUmVhZCkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgIGlmICh6aXAuRW50cnlGaWxlbmFtZXMuQ29udGFpbnMoY2FuZGlkYXRlKSkKKyAgICAgICAgLy8vICAgICBDb25zb2xlLldyaXRlTGluZSgiVGhlIGZpbGUgJ3swfScgZXhpc3RzIGluIHRoZSB6aXAgYXJjaGl2ZSAnezF9JyIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgZWxzZQorICAgICAgICAvLy8gICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUaGUgZmlsZSwgJ3swfScsIGRvZXMgbm90IGV4aXN0IGluIHRoZSB6aXAgYXJjaGl2ZSAnezF9JyIsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vICAgRGltIHppcEZpbGVUb1JlYWQgQXMgU3RyaW5nID0gIlBhY2tlZERvY3VtZW50cy56aXAiCisgICAgICAgIC8vLyAgIERpbSBjYW5kaWRhdGUgQXMgU3RyaW5nID0gIkRhdGVkTWF0ZXJpYWwueHBzIgorICAgICAgICAvLy8gICBVc2luZyB6aXAgQXMgWmlwRmlsZS5SZWFkKFppcEZpbGVUb1JlYWQpCisgICAgICAgIC8vLyAgICAgICBJZiB6aXAuRW50cnlGaWxlbmFtZXMuQ29udGFpbnMoY2FuZGlkYXRlKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRoZSBmaWxlICd7MH0nIGV4aXN0cyBpbiB0aGUgemlwIGFyY2hpdmUgJ3sxfSciLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZU5hbWUpCisgICAgICAgIC8vLyAgICAgICBFbHNlCisgICAgICAgIC8vLyAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUaGUgZmlsZSwgJ3swfScsIGRvZXMgbm90IGV4aXN0IGluIHRoZSB6aXAgYXJjaGl2ZSAnezF9JyIsIF8KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUsIF8KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlTmFtZSkKKyAgICAgICAgLy8vICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgQ29uc29sZS5Xcml0ZUxpbmUKKyAgICAgICAgLy8vICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyAgIFRoZSBsaXN0IG9mIHN0cmluZ3MgZm9yIHRoZSBmaWxlbmFtZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgWmlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbGxlY3Rpb248U3RyaW5nPiBFbnRyeUZpbGVOYW1lcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2VudHJpZXMuS2V5czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZXR1cm5zIHRoZSByZWFkb25seSBjb2xsZWN0aW9uIG9mIGVudHJpZXMgaW4gdGhlIFppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB0aGVyZSBhcmUgbm8gZW50cmllcyBpbiB0aGUgY3VycmVudCA8Yz5aaXBGaWxlPC9jPiwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGEKKyAgICAgICAgLy8vICAgbm9uLW51bGwgemVyby1lbGVtZW50IGNvbGxlY3Rpb24uICBJZiB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGUgemlwIGZpbGUsCisgICAgICAgIC8vLyAgIHRoZSBlbGVtZW50cyBhcmUgcmV0dXJuZWQgaW4gbm8gcGFydGljdWxhciBvcmRlci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGlzIHRoZSBpbXBsaWVkIGVudW1lcmF0b3Igb24gdGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzLiAgSWYgeW91IHVzZSBhCisgICAgICAgIC8vLyAgIDxjPlppcEZpbGU8L2M+IGluc3RhbmNlIGluIGEgY29udGV4dCB0aGF0IGV4cGVjdHMgYW4gZW51bWVyYXRvciwgeW91IHdpbGwKKyAgICAgICAgLy8vICAgZ2V0IHRoaXMgY29sbGVjdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkVudHJpZXNTb3J0ZWQiLz4KKyAgICAgICAgcHVibGljIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9uPFppcEVudHJ5PiBFbnRyaWVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZW50cmllcy5WYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmV0dXJucyBhIHJlYWRvbmx5IGNvbGxlY3Rpb24gb2YgZW50cmllcyBpbiB0aGUgWmlwIGFyY2hpdmUsIHNvcnRlZCBieSBGaWxlTmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgSWYgdGhlcmUgYXJlIG5vIGVudHJpZXMgaW4gdGhlIGN1cnJlbnQgPGM+WmlwRmlsZTwvYz4sIHRoZSB2YWx1ZSByZXR1cm5lZAorICAgICAgICAvLy8gICBpcyBhIG5vbi1udWxsIHplcm8tZWxlbWVudCBjb2xsZWN0aW9uLiAgSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhlIHppcAorICAgICAgICAvLy8gICBmaWxlLCB0aGUgZWxlbWVudHMgYXJlIHJldHVybmVkIHNvcnRlZCBieSB0aGUgbmFtZSBvZiB0aGUgZW50cnkuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgZmlsbHMgYSBXaW5kb3dzIEZvcm1zIExpc3RWaWV3IHdpdGggdGhlIGVudHJpZXMgaW4gYSB6aXAgZmlsZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJDIyI+CisgICAgICAgIC8vLyB1c2luZyAoWmlwRmlsZSB6aXAgPSBaaXBGaWxlLlJlYWQoemlwRmlsZSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgZm9yZWFjaCAoWmlwRW50cnkgZW50cnkgaW4gemlwLkVudHJpZXNTb3J0ZWQpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICBMaXN0Vmlld0l0ZW0gaXRlbSA9IG5ldyBMaXN0Vmlld0l0ZW0obi5Ub1N0cmluZygpKTsKKyAgICAgICAgLy8vICAgICAgICAgbisrOworICAgICAgICAvLy8gICAgICAgICBzdHJpbmdbXSBzdWJpdGVtcyA9IG5ldyBzdHJpbmdbXSB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBlbnRyeS5GaWxlTmFtZS5SZXBsYWNlKCIvIiwiXFwiKSwKKyAgICAgICAgLy8vICAgICAgICAgICAgIGVudHJ5Lkxhc3RNb2RpZmllZC5Ub1N0cmluZygieXl5eS1NTS1kZCBISDptbTpzcyIpLAorICAgICAgICAvLy8gICAgICAgICAgICAgZW50cnkuVW5jb21wcmVzc2VkU2l6ZS5Ub1N0cmluZygpLAorICAgICAgICAvLy8gICAgICAgICAgICAgU3RyaW5nLkZvcm1hdCgiezAsNTpGMH0lIiwgZW50cnkuQ29tcHJlc3Npb25SYXRpbyksCisgICAgICAgIC8vLyAgICAgICAgICAgICBlbnRyeS5Db21wcmVzc2VkU2l6ZS5Ub1N0cmluZygpLAorICAgICAgICAvLy8gICAgICAgICAgICAgKGVudHJ5LlVzZXNFbmNyeXB0aW9uKSA/ICJZIiA6ICJOIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoInswOlg4fSIsIGVudHJ5LkNyYyl9OworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgICAgZm9yZWFjaCAoU3RyaW5nIHMgaW4gc3ViaXRlbXMpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIExpc3RWaWV3SXRlbS5MaXN0Vmlld1N1Ykl0ZW0gc3ViaXRlbSA9IG5ldyBMaXN0Vmlld0l0ZW0uTGlzdFZpZXdTdWJJdGVtKCk7CisgICAgICAgIC8vLyAgICAgICAgICAgICBzdWJpdGVtLlRleHQgPSBzOworICAgICAgICAvLy8gICAgICAgICAgICAgaXRlbS5TdWJJdGVtcy5BZGQoc3ViaXRlbSk7CisgICAgICAgIC8vLyAgICAgICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgICAgIHRoaXMubGlzdFZpZXcxLkl0ZW1zLkFkZChpdGVtKTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRW50cmllcyIvPgorICAgICAgICBwdWJsaWMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUNvbGxlY3Rpb248WmlwRW50cnk+IEVudHJpZXNTb3J0ZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbGwgPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdDxaaXBFbnRyeT4oKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZSBpbiB0aGlzLkVudHJpZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2xsLkFkZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyaXNvbiBzYyA9IChDYXNlU2Vuc2l0aXZlUmV0cmlldmFsKSA/IFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbCA6IFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2U7CisKKyAgICAgICAgICAgICAgICBjb2xsLlNvcnQoKHgsIHkpID0+IHsgcmV0dXJuIFN0cmluZy5Db21wYXJlKHguRmlsZU5hbWUsIHkuRmlsZU5hbWUsIHNjKTsgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbGwuQXNSZWFkT25seSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgWmlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9lbnRyaWVzLkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmVtb3ZlcyB0aGUgZ2l2ZW4gPGM+WmlwRW50cnk8L2M+IGZyb20gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFmdGVyIGNhbGxpbmcgPGM+UmVtb3ZlRW50cnk8L2M+LCB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsIDxjPlNhdmU8L2M+IHRvCisgICAgICAgIC8vLyAgIG1ha2UgdGhlIGNoYW5nZXMgcGVybWFuZW50LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uIj4KKyAgICAgICAgLy8vICAgVGhyb3duIGlmIHRoZSBzcGVjaWZpZWQgPGM+WmlwRW50cnk8L2M+IGRvZXMgbm90IGV4aXN0IGluIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICBJbiB0aGlzIGV4YW1wbGUsIGFsbCBlbnRyaWVzIGluIHRoZSB6aXAgYXJjaGl2ZSBkYXRpbmcgZnJvbSBiZWZvcmUKKyAgICAgICAgLy8vICAgRGVjZW1iZXIgMzFzdCwgMjAwNywgYXJlIHJlbW92ZWQgZnJvbSB0aGUgYXJjaGl2ZS4gIFRoaXMgaXMgYWN0dWFsbHkgbXVjaAorICAgICAgICAvLy8gICBlYXNpZXIgaWYgeW91IHVzZSB0aGUgUmVtb3ZlU2VsZWN0ZWRFbnRyaWVzIG1ldGhvZC4gIEJ1dCBJIG5lZWRlZCBhbgorICAgICAgICAvLy8gICBleGFtcGxlIGZvciBSZW1vdmVFbnRyeSwgc28gaGVyZSBpdCBpcy4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gU3RyaW5nIFppcEZpbGVUb1JlYWQgPSAiQXJjaGl2ZVRvTW9kaWZ5LnppcCI7CisgICAgICAgIC8vLyBTeXN0ZW0uRGF0ZVRpbWUgVGhyZXNob2xkID0gbmV3IFN5c3RlbS5EYXRlVGltZSgyMDA3LDEyLDMxKTsKKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZChaaXBGaWxlVG9SZWFkKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgdmFyIEVudHJpZXNUb1JlbW92ZSA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0Jmx0O1ppcEVudHJ5Jmd0OygpOworICAgICAgICAvLy8gICBmb3JlYWNoIChaaXBFbnRyeSBlIGluIHppcCkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIGlmIChlLkxhc3RNb2RpZmllZCAmbHQ7IFRocmVzaG9sZCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAvLyBXZSBjYW5ub3QgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LCB3aXRoaW4gdGhlIGNvbnRleHQgb2YKKyAgICAgICAgLy8vICAgICAgIC8vIGFuIGVudW1lcmF0aW9uIG9mIHNhaWQgbGlzdC4KKyAgICAgICAgLy8vICAgICAgIC8vIFNvIHdlIGFkZCB0aGUgZG9vbWVkIGVudHJ5IHRvIGEgbGlzdCB0byBiZSByZW1vdmVkIGxhdGVyLgorICAgICAgICAvLy8gICAgICAgRW50cmllc1RvUmVtb3ZlLkFkZChlKTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIC8vIGFjdHVhbGx5IHJlbW92ZSB0aGUgZG9vbWVkIGVudHJpZXMuCisgICAgICAgIC8vLyAgIGZvcmVhY2ggKFppcEVudHJ5IHpvbWJpZSBpbiBFbnRyaWVzVG9SZW1vdmUpCisgICAgICAgIC8vLyAgICAgemlwLlJlbW92ZUVudHJ5KHpvbWJpZSk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICB6aXAuQ29tbWVudD0gU3RyaW5nLkZvcm1hdCgiVGhpcyB6aXAgYXJjaGl2ZSB3YXMgdXBkYXRlZCBhdCB7MH0uIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lLk5vdy5Ub1N0cmluZygiRyIpKTsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIC8vIHNhdmUgd2l0aCBhIGRpZmZlcmVudCBuYW1lCisgICAgICAgIC8vLyAgIHppcC5TYXZlKCJBcmNoaXZlLVVwZGF0ZWQuemlwIik7CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gICBEaW0gWmlwRmlsZVRvUmVhZCBBcyBTdHJpbmcgPSAiQXJjaGl2ZVRvTW9kaWZ5LnppcCIKKyAgICAgICAgLy8vICAgRGltIFRocmVzaG9sZCBBcyBOZXcgRGF0ZVRpbWUoMjAwNywgMTIsIDMxKQorICAgICAgICAvLy8gICBVc2luZyB6aXAgQXMgWmlwRmlsZSA9IFppcEZpbGUuUmVhZChaaXBGaWxlVG9SZWFkKQorICAgICAgICAvLy8gICAgICAgRGltIEVudHJpZXNUb1JlbW92ZSBBcyBOZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdChPZiBaaXBFbnRyeSkKKyAgICAgICAgLy8vICAgICAgIERpbSBlIEFzIFppcEVudHJ5CisgICAgICAgIC8vLyAgICAgICBGb3IgRWFjaCBlIEluIHppcAorICAgICAgICAvLy8gICAgICAgICAgIElmIChlLkxhc3RNb2RpZmllZCAmbHQ7IFRocmVzaG9sZCkgVGhlbgorICAgICAgICAvLy8gICAgICAgICAgICAgICAnIFdlIGNhbm5vdCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QsIHdpdGhpbiB0aGUgY29udGV4dCBvZgorICAgICAgICAvLy8gICAgICAgICAgICAgICAnIGFuIGVudW1lcmF0aW9uIG9mIHNhaWQgbGlzdC4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgJyBTbyB3ZSBhZGQgdGhlIGRvb21lZCBlbnRyeSB0byBhIGxpc3QgdG8gYmUgcmVtb3ZlZCBsYXRlci4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgRW50cmllc1RvUmVtb3ZlLkFkZChlKQorICAgICAgICAvLy8gICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgTmV4dAorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICAgICcgYWN0dWFsbHkgcmVtb3ZlIHRoZSBkb29tZWQgZW50cmllcy4KKyAgICAgICAgLy8vICAgICAgIERpbSB6b21iaWUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICAgIEZvciBFYWNoIHpvbWJpZSBJbiBFbnRyaWVzVG9SZW1vdmUKKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuUmVtb3ZlRW50cnkoem9tYmllKQorICAgICAgICAvLy8gICAgICAgTmV4dAorICAgICAgICAvLy8gICAgICAgemlwLkNvbW1lbnQgPSBTdHJpbmcuRm9ybWF0KCJUaGlzIHppcCBhcmNoaXZlIHdhcyB1cGRhdGVkIGF0IHswfS4iLCBEYXRlVGltZS5Ob3cuVG9TdHJpbmcoIkciKSkKKyAgICAgICAgLy8vICAgICAgICdzYXZlIGFzIGEgZGlmZmVyZW50IG5hbWUKKyAgICAgICAgLy8vICAgICAgIHppcC5TYXZlKCJBcmNoaXZlLVVwZGF0ZWQuemlwIikKKyAgICAgICAgLy8vICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVudHJ5Ij4KKyAgICAgICAgLy8vIFRoZSA8Yz5aaXBFbnRyeTwvYz4gdG8gcmVtb3ZlIGZyb20gdGhlIHppcC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuUmVtb3ZlU2VsZWN0ZWRFbnRyaWVzKHN0cmluZykiLz4KKyAgICAgICAgLy8vCisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUVudHJ5KFppcEVudHJ5IGVudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICAvL2lmICghX2VudHJpZXMuVmFsdWVzLkNvbnRhaW5zKGVudHJ5KSkKKyAgICAgICAgICAgIC8vICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVudHJ5IHlvdSBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHppcCBhcmNoaXZlLiIpOworICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiZW50cnkiKTsKKworICAgICAgICAgICAgX2VudHJpZXMuUmVtb3ZlKFNoYXJlZFV0aWxpdGllcy5Ob3JtYWxpemVQYXRoRm9yVXNlSW5aaXBGaWxlKGVudHJ5LkZpbGVOYW1lKSk7CisgICAgICAgICAgICBfemlwRW50cmllc0FzTGlzdCA9IG51bGw7CisKKyNpZiBOT1RORUVERUQKKyAgICAgICAgICAgIGlmIChfZGlyZW50cmllcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgRm91bmRBbmRSZW1vdmVkRGlyRW50cnkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChaaXBEaXJFbnRyeSBkZTEgaW4gX2RpcmVudHJpZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuRmlsZU5hbWUgPT0gZGUxLkZpbGVOYW1lKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZGlyZW50cmllcy5SZW1vdmUoZGUxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kQW5kUmVtb3ZlZERpckVudHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFGb3VuZEFuZFJlbW92ZWREaXJFbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFN0YXRlRXhjZXB0aW9uKCJUaGUgZW50cnkgdG8gYmUgcmVtb3ZlZCB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuIik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIF9jb250ZW50c0NoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgPGM+WmlwRW50cnk8L2M+IHdpdGggdGhlIGdpdmVuIGZpbGVuYW1lIGZyb20gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFmdGVyIGNhbGxpbmcgPGM+UmVtb3ZlRW50cnk8L2M+LCB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsIDxjPlNhdmU8L2M+IHRvCisgICAgICAgIC8vLyAgIG1ha2UgdGhlIGNoYW5nZXMgcGVybWFuZW50LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj4KKyAgICAgICAgLy8vICAgVGhyb3duIGlmIHRoZSA8Yz5aaXBGaWxlPC9jPiBpcyBub3QgdXBkYXRhYmxlLgorICAgICAgICAvLy8gPC9leGNlcHRpb24+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb24iPgorICAgICAgICAvLy8gICBUaHJvd24gaWYgYSA8Yz5aaXBFbnRyeTwvYz4gd2l0aCB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lIGRvZXMgbm90IGV4aXN0IGluCisgICAgICAgIC8vLyAgIHRoZSA8Yz5aaXBGaWxlPC9jPi4KKyAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHNob3dzIG9uZSB3YXkgdG8gcmVtb3ZlIGFuIGVudHJ5IHdpdGggYSBnaXZlbiBmaWxlbmFtZSBmcm9tCisgICAgICAgIC8vLyAgIGFuIGV4aXN0aW5nIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gU3RyaW5nIHppcEZpbGVUb1JlYWQ9ICJQYWNrZWREb2N1bWVudHMuemlwIjsKKyAgICAgICAgLy8vIHN0cmluZyBjYW5kaWRhdGUgPSAiRGF0ZWRNYXRlcmlhbC54cHMiOworICAgICAgICAvLy8gdXNpbmcgKFppcEZpbGUgemlwID0gWmlwRmlsZS5SZWFkKHppcEZpbGVUb1JlYWQpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICBpZiAoemlwLkVudHJ5RmlsZW5hbWVzLkNvbnRhaW5zKGNhbmRpZGF0ZSkpCisgICAgICAgIC8vLyAgIHsKKyAgICAgICAgLy8vICAgICB6aXAuUmVtb3ZlRW50cnkoY2FuZGlkYXRlKTsKKyAgICAgICAgLy8vICAgICB6aXAuQ29tbWVudD0gU3RyaW5nLkZvcm1hdCgiVGhlIGZpbGUgJ3swfScgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoaXMgYXJjaGl2ZS4iLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZGF0ZSk7CisgICAgICAgIC8vLyAgICAgemlwLlNhdmUoKTsKKyAgICAgICAgLy8vICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gICBEaW0gemlwRmlsZVRvUmVhZCBBcyBTdHJpbmcgPSAiUGFja2VkRG9jdW1lbnRzLnppcCIKKyAgICAgICAgLy8vICAgRGltIGNhbmRpZGF0ZSBBcyBTdHJpbmcgPSAiRGF0ZWRNYXRlcmlhbC54cHMiCisgICAgICAgIC8vLyAgIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKHppcEZpbGVUb1JlYWQpCisgICAgICAgIC8vLyAgICAgICBJZiB6aXAuRW50cnlGaWxlbmFtZXMuQ29udGFpbnMoY2FuZGlkYXRlKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgemlwLlJlbW92ZUVudHJ5KGNhbmRpZGF0ZSkKKyAgICAgICAgLy8vICAgICAgICAgICB6aXAuQ29tbWVudCA9IFN0cmluZy5Gb3JtYXQoIlRoZSBmaWxlICd7MH0nIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGlzIGFyY2hpdmUuIiwgQ2FuZGlkYXRlKQorICAgICAgICAvLy8gICAgICAgICAgIHppcC5TYXZlCisgICAgICAgIC8vLyAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj4KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlLCBpbmNsdWRpbmcgYW55IGRpcmVjdG9yeSBwYXRoLCB0byByZW1vdmUgZnJvbSB0aGUgemlwLgorICAgICAgICAvLy8gVGhlIGZpbGVuYW1lIG1hdGNoIGlzIG5vdCBjYXNlLXNlbnNpdGl2ZSBieSBkZWZhdWx0OyB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgLy8vIDxjPkNhc2VTZW5zaXRpdmVSZXRyaWV2YWw8L2M+IHByb3BlcnR5IHRvIGNoYW5nZSB0aGlzIGJlaGF2aW9yLiBUaGUKKyAgICAgICAgLy8vIHBhdGhuYW1lIGNhbiB1c2UgZm9yd2FyZC1zbGFzaGVzIG9yIGJhY2t3YXJkIHNsYXNoZXMuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlRW50cnkoU3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbW9kaWZpZWROYW1lID0gWmlwRW50cnkuTmFtZUluQXJjaGl2ZShmaWxlTmFtZSwgbnVsbCk7CisgICAgICAgICAgICBaaXBFbnRyeSBlID0gdGhpc1ttb2RpZmllZE5hbWVdOworICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbnRyeSB5b3Ugc3BlY2lmaWVkIHdhcyBub3QgZm91bmQgaW4gdGhlIHppcCBhcmNoaXZlLiIpOworCisgICAgICAgICAgICBSZW1vdmVFbnRyeShlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gRGVzdHJ1Y3RvcnMgYW5kIERpc3Bvc2VycworCisgICAgICAgIC8vICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLyAgICAgICAgIC8vLyBUaGlzIGlzIHRoZSBjbGFzcyBEZXN0cnVjdG9yLCB3aGljaCBnZXRzIGNhbGxlZCBpbXBsaWNpdGx5IHdoZW4gdGhlIGluc3RhbmNlCisgICAgICAgIC8vICAgICAgICAgLy8vIGlzIGRlc3Ryb3llZC4gIEJlY2F1c2UgdGhlIDxjPlppcEZpbGU8L2M+IHR5cGUgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSwgdGhpcworICAgICAgICAvLyAgICAgICAgIC8vLyBtZXRob2QgY2FsbHMgRGlzcG9zZShmYWxzZSkuCisgICAgICAgIC8vICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8gICAgICAgICB+WmlwRmlsZSgpCisgICAgICAgIC8vICAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgICAvLyBjYWxsIERpc3Bvc2Ugd2l0aCBmYWxzZS4gIFNpbmNlIHdlJ3JlIGluIHRoZQorICAgICAgICAvLyAgICAgICAgICAgICAvLyBkZXN0cnVjdG9yIGNhbGwsIHRoZSBtYW5hZ2VkIHJlc291cmNlcyB3aWxsIGJlCisgICAgICAgIC8vICAgICAgICAgICAgIC8vIGRpc3Bvc2VkIG9mIGFueXdheXMuCisgICAgICAgIC8vICAgICAgICAgICAgIERpc3Bvc2UoZmFsc2UpOworICAgICAgICAvLyAgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENsb3NlcyB0aGUgcmVhZCBhbmQgd3JpdGUgc3RyZWFtcyBhc3NvY2lhdGVkCisgICAgICAgIC8vLyAgIHRvIHRoZSA8Yz5aaXBGaWxlPC9jPiwgaWYgbmVjZXNzYXJ5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBUaGUgRGlzcG9zZSgpIG1ldGhvZCBpcyBnZW5lcmFsbHkgZW1wbG95ZWQgaW1wbGljaXRseSwgdmlhIGEgPGM+dXNpbmcoLi4pIHsuLn08L2M+CisgICAgICAgIC8vLyAgIHN0YXRlbWVudC4gKDxjPlVzaW5nLi4uRW5kIFVzaW5nPC9jPiBpbiBWQikgSWYgeW91IGRvIG5vdCBlbXBsb3kgYSB1c2luZworICAgICAgICAvLy8gICBzdGF0ZW1lbnQsIGluc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FsbHMgRGlzcG9zZSgpIGV4cGxpY2l0bHkuICBGb3IKKyAgICAgICAgLy8vICAgZXhhbXBsZSwgaW4gYSBQb3dlcnNoZWxsIGFwcGxpY2F0aW9uLCBvciBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIENPTQorICAgICAgICAvLy8gICBpbnRlcm9wIGludGVyZmFjZSwgeW91IG11c3QgY2FsbCBEaXNwb3NlKCkgZXhwbGljaXRseS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSBleHRyYWN0cyBhbiBlbnRyeSBzZWxlY3RlZCBieSBuYW1lLCBmcm9tIHRoZSBaaXAgZmlsZSB0byB0aGUKKyAgICAgICAgLy8vIENvbnNvbGUuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBmaWxlKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgZm9yZWFjaCAoWmlwRW50cnkgZSBpbiB6aXApCisgICAgICAgIC8vLyAgIHsKKyAgICAgICAgLy8vICAgICBpZiAoV2FudFRoaXNFbnRyeShlLkZpbGVOYW1lKSkKKyAgICAgICAgLy8vICAgICAgIHppcC5FeHRyYWN0KGUuRmlsZU5hbWUsIENvbnNvbGUuT3BlblN0YW5kYXJkT3V0cHV0KCkpOworICAgICAgICAvLy8gICB9CisgICAgICAgIC8vLyB9IC8vIERpc3Bvc2UoKSBpcyBjYWxsZWQgaW1wbGljaXRseSBoZXJlLgorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKHppcGZpbGUpCisgICAgICAgIC8vLyAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICBGb3IgRWFjaCBlIEluIHppcAorICAgICAgICAvLy8gICAgICAgSWYgV2FudFRoaXNFbnRyeShlLkZpbGVOYW1lKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgemlwLkV4dHJhY3QoZS5GaWxlTmFtZSwgQ29uc29sZS5PcGVuU3RhbmRhcmRPdXRwdXQoKSkKKyAgICAgICAgLy8vICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgIE5leHQKKyAgICAgICAgLy8vIEVuZCBVc2luZyAnIERpc3Bvc2UgaXMgaW1wbGljaXR5IGNhbGxlZCBoZXJlCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkaXNwb3NlIG9mIHRoZSBtYW5hZ2VkIGFuZCB1bm1hbmFnZWQgcmVzb3VyY2VzCisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworCisgICAgICAgICAgICAvLyB0ZWxsIHRoZSBHQyB0aGF0IHRoZSBGaW5hbGl6ZSBwcm9jZXNzIG5vIGxvbmdlciBuZWVkcworICAgICAgICAgICAgLy8gdG8gYmUgcnVuIGZvciB0aGlzIG9iamVjdC4KKyAgICAgICAgICAgIEdDLlN1cHByZXNzRmluYWxpemUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIERpc3Bvc2VzIGFueSBtYW5hZ2VkIHJlc291cmNlcywgaWYgdGhlIGZsYWcgaXMgc2V0LCB0aGVuIG1hcmtzIHRoZQorICAgICAgICAvLy8gICBpbnN0YW5jZSBkaXNwb3NlZC4gIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBub3QgY2FsbGVkIGV4cGxpY2l0bHkgZnJvbQorICAgICAgICAvLy8gICBhcHBsaWNhdGlvbiBjb2RlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBBcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwgPHNlZSBjcmVmPSJEaXNwb3NlKCkiPnRoZSBuby1hcmcgRGlzcG9zZSBtZXRob2Q8L3NlZT4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpc3Bvc2VNYW5hZ2VkUmVzb3VyY2VzIj4KKyAgICAgICAgLy8vICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1ldGhvZCBzaG91bGQgZGlzcG9zZSBzdHJlYW1zIG9yIG5vdC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2VNYW5hZ2VkUmVzb3VyY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NlTWFuYWdlZFJlc291cmNlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3Bvc2UgbWFuYWdlZCByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9SZWFkU3RyZWFtSXNPdXJzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3JlYWRzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3NzA0CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVhZHN0cmVhbS5DbG9zZSgpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVhZHN0cmVhbS5EaXNwb3NlKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVhZHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwb3NlIHRoZSB3cml0ZXN0cmVhbSBpZiB0aGVyZSBpcyBhIGJhY2tpbmcgZmlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoKF90ZW1wb3JhcnlGaWxlTmFtZSAhPSBudWxsKSAmJiAoX25hbWUgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3dyaXRlc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzcwNAorI2lmIE5FVENGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dyaXRlc3RyZWFtLkNsb3NlKCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF93cml0ZXN0cmVhbS5EaXNwb3NlKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd3JpdGVzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgIU5FVENGCisgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMDMwCisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlBhcmFsbGVsRGVmbGF0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QYXJhbGxlbERlZmxhdGVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGFyYWxsZWxEZWZsYXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBwcml2YXRlIHByb3BlcnRpZXMKKworICAgICAgICBpbnRlcm5hbCBTdHJlYW0gUmVhZFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3JlYWRzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfcmVhZE5hbWUgIT0gbnVsbCB8fCBfbmFtZSAhPW51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9yZWFkc3RyZWFtID0gRmlsZS5PcGVuKF9yZWFkTmFtZSA/PyBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVNb2RlLk9wZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQWNjZXNzLlJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlU2hhcmUuUmVhZCB8IEZpbGVTaGFyZS5Xcml0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfUmVhZFN0cmVhbUlzT3VycyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFkc3RyZWFtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgU3RyZWFtIFdyaXRlU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDk3NjMKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfd3JpdGVzdHJlYW0gIT0gbnVsbCkgcmV0dXJuIF93cml0ZXN0cmVhbTsKKyAgICAgICAgICAgICAgICBpZiAoX25hbWUgPT0gbnVsbCkgcmV0dXJuIF93cml0ZXN0cmVhbTsKKworICAgICAgICAgICAgICAgIGlmIChfbWF4T3V0cHV0U2VnbWVudFNpemUgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF93cml0ZXN0cmVhbSA9IFppcFNlZ21lbnRlZFN0cmVhbS5Gb3JXcml0aW5nKHRoaXMuX25hbWUsIF9tYXhPdXRwdXRTZWdtZW50U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfd3JpdGVzdHJlYW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU2hhcmVkVXRpbGl0aWVzLkNyZWF0ZUFuZE9wZW5VbmlxdWVUZW1wRmlsZShUZW1wRmlsZUZvbGRlciA/PyBQYXRoLkdldERpcmVjdG9yeU5hbWUoX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IF93cml0ZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBfdGVtcG9yYXJ5RmlsZU5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBfd3JpdGVzdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiQ2Fubm90IHNldCB0aGUgc3RyZWFtIHRvIGEgbm9uLW51bGwgdmFsdWUuIik7CisgICAgICAgICAgICAgICAgX3dyaXRlc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBwcml2YXRlIGZpZWxkcworICAgICAgICBwcml2YXRlIFRleHRXcml0ZXIgX1N0YXR1c01lc3NhZ2VUZXh0V3JpdGVyOworICAgICAgICBwcml2YXRlIGJvb2wgX0Nhc2VTZW5zaXRpdmVSZXRyaWV2YWw7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9yZWFkc3RyZWFtOworICAgICAgICBwcml2YXRlIFN0cmVhbSBfd3JpdGVzdHJlYW07CisgICAgICAgIHByaXZhdGUgVUludDE2IF92ZXJzaW9uTWFkZUJ5OworICAgICAgICBwcml2YXRlIFVJbnQxNiBfdmVyc2lvbk5lZWRlZFRvRXh0cmFjdDsKKyAgICAgICAgcHJpdmF0ZSBVSW50MzIgX2Rpc2tOdW1iZXJXaXRoQ2Q7CisgICAgICAgIHByaXZhdGUgSW50MzIgX21heE91dHB1dFNlZ21lbnRTaXplOworICAgICAgICBwcml2YXRlIFVJbnQzMiBfbnVtYmVyT2ZTZWdtZW50c0Zvck1vc3RSZWNlbnRTYXZlOworICAgICAgICBwcml2YXRlIFppcEVycm9yQWN0aW9uIF96aXBFcnJvckFjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9kaXNwb3NlZDsKKyAgICAgICAgLy9wcml2YXRlIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8WmlwRW50cnk+IF9lbnRyaWVzOworICAgICAgICBwcml2YXRlIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnk8U3RyaW5nLCBaaXBFbnRyeT4gX2VudHJpZXM7CisgICAgICAgIHByaXZhdGUgTGlzdDxaaXBFbnRyeT4gX3ppcEVudHJpZXNBc0xpc3Q7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9uYW1lOworICAgICAgICBwcml2YXRlIHN0cmluZyBfcmVhZE5hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9Db21tZW50OworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX1Bhc3N3b3JkOworICAgICAgICBwcml2YXRlIGJvb2wgX2VtaXROdGZzVGltZXMgPSB0cnVlOworICAgICAgICBwcml2YXRlIGJvb2wgX2VtaXRVbml4VGltZXM7CisgICAgICAgIHByaXZhdGUgSW9uaWMuWmxpYi5Db21wcmVzc2lvblN0cmF0ZWd5IF9TdHJhdGVneSA9IElvbmljLlpsaWIuQ29tcHJlc3Npb25TdHJhdGVneS5EZWZhdWx0OworICAgICAgICBwcml2YXRlIElvbmljLlppcC5Db21wcmVzc2lvbk1ldGhvZCBfY29tcHJlc3Npb25NZXRob2QgPSBJb25pYy5aaXAuQ29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9maWxlQWxyZWFkeUV4aXN0czsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX3RlbXBvcmFyeUZpbGVOYW1lOworICAgICAgICBwcml2YXRlIGJvb2wgX2NvbnRlbnRzQ2hhbmdlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNCZWVuU2F2ZWQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9UZW1wRmlsZUZvbGRlcjsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9SZWFkU3RyZWFtSXNPdXJzID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgTE9DSyA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9zYXZlT3BlcmF0aW9uQ2FuY2VsZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfZXh0cmFjdE9wZXJhdGlvbkNhbmNlbGVkOworICAgICAgICBwcml2YXRlIGJvb2wgX2FkZE9wZXJhdGlvbkNhbmNlbGVkOworICAgICAgICBwcml2YXRlIEVuY3J5cHRpb25BbGdvcml0aG0gX0VuY3J5cHRpb247CisgICAgICAgIHByaXZhdGUgYm9vbCBfSnVzdFNhdmVkOworICAgICAgICBwcml2YXRlIGxvbmcgX2xvY0VuZE9mQ0RTID0gLTE7CisgICAgICAgIHByaXZhdGUgdWludCBfT2Zmc2V0T2ZDZW50cmFsRGlyZWN0b3J5OworICAgICAgICBwcml2YXRlIEludDY0IF9PZmZzZXRPZkNlbnRyYWxEaXJlY3Rvcnk2NDsKKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxib29sPiBfT3V0cHV0VXNlc1ppcDY0OworICAgICAgICBpbnRlcm5hbCBib29sIF9pbkV4dHJhY3RBbGw7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLlRleHQuRW5jb2RpbmcgX2FsdGVybmF0ZUVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoIklCTTQzNyIpOyAvLyBVVEYtOAorICAgICAgICBwcml2YXRlIFppcE9wdGlvbiBfYWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5OZXZlcjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgX2RlZmF1bHRFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKCJJQk00MzciKTsKKworICAgICAgICBwcml2YXRlIGludCBfQnVmZmVyU2l6ZSA9IEJ1ZmZlclNpemVEZWZhdWx0OworCisjaWYgIU5FVENGCisgICAgICAgIGludGVybmFsIElvbmljLlpsaWIuUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIFBhcmFsbGVsRGVmbGF0ZXI7CisgICAgICAgIHByaXZhdGUgbG9uZyBfUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkOworICAgICAgICBwcml2YXRlIGludCBfbWF4QnVmZmVyUGFpcnMgPSAxNjsKKyNlbmRpZgorCisgICAgICAgIGludGVybmFsIFppcDY0T3B0aW9uIF96aXA2NCA9IFppcDY0T3B0aW9uLkRlZmF1bHQ7CisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NDkKKyAgICAgICAgcHJpdmF0ZSBib29sIF9TYXZpbmdTZng7CisjcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSA2NDkKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIERlZmF1bHQgc2l6ZSBvZiB0aGUgYnVmZmVyIHVzZWQgZm9yIElPLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGludCBCdWZmZXJTaXplRGVmYXVsdCA9IDMyNzY4OworCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgT3B0aW9ucyBmb3IgdXNpbmcgWklQNjQgZXh0ZW5zaW9ucyB3aGVuIHNhdmluZyB6aXAgYXJjaGl2ZXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIERlc2lnbmVkIG1hbnkgeWVhcnMgYWdvLCB0aGUgPHNlZQorICAgIC8vLyAgIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPm9yaWdpbmFsIHppcAorICAgIC8vLyAgIHNwZWNpZmljYXRpb24gZnJvbSBQS1dBUkU8L3NlZT4gYWxsb3dlZCBmb3IgMzItYml0IHF1YW50aXRpZXMgZm9yIHRoZQorICAgIC8vLyAgIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyBvZiB6aXAgZW50cmllcywgYXMgd2VsbCBhcyBhIDMyLWJpdCBxdWFudGl0eQorICAgIC8vLyAgIGZvciBzcGVjaWZ5aW5nIHRoZSBsZW5ndGggb2YgdGhlIHppcCBhcmNoaXZlIGl0c2VsZiwgYW5kIGEgbWF4aW11bSBvZiA2NTUzNQorICAgIC8vLyAgIGVudHJpZXMuICBUaGVzZSBsaW1pdHMgYXJlIG5vdyByZWd1bGFybHkgZXhjZWVkZWQgaW4gbWFueSBiYWNrdXAgYW5kIGFyY2hpdmFsCisgICAgLy8vICAgc2NlbmFyaW9zLiAgUmVjZW50bHksIFBLV2FyZSBhZGRlZCBleHRlbnNpb25zIHRvIHRoZSBvcmlnaW5hbCB6aXAgc3BlYywgY2FsbGVkCisgICAgLy8vICAgIlpJUDY0IGV4dGVuc2lvbnMiLCB0byByYWlzZSB0aG9zZSBsaW1pdGF0aW9ucy4gIFRoaXMgcHJvcGVydHkgZ292ZXJucyB3aGV0aGVyCisgICAgLy8vICAgRG90TmV0WmlwIHdpbGwgdXNlIHRob3NlIGV4dGVuc2lvbnMgd2hlbiB3cml0aW5nIHppcCBhcmNoaXZlcy4gVGhlIHVzZSBvZgorICAgIC8vLyAgIHRoZXNlIGV4dGVuc2lvbnMgaXMgb3B0aW9uYWwgYW5kIGV4cGxpY2l0IGluIERvdE5ldFppcCBiZWNhdXNlLCBkZXNwaXRlIHRoZQorICAgIC8vLyAgIHN0YXR1cyBvZiBaSVA2NCBhcyBhIGJvbmEgZmlkZSBzdGFuZGFyZCwgbWFueSBvdGhlciB6aXAgdG9vbHMgYW5kIGxpYnJhcmllcyBkbworICAgIC8vLyAgIG5vdCBzdXBwb3J0IFpJUDY0LCBhbmQgdGhlcmVmb3JlIGEgemlwIGZpbGUgd2l0aCBaSVA2NCBleHRlbnNpb25zIG1heSBiZQorICAgIC8vLyAgIHVucmVhZGFibGUgYnkgc29tZSBvZiB0aG9zZSBvdGhlciB0b29scy4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBTZXQgdGhpcyBwcm9wZXJ0eSB0byA8c2VlIGNyZWY9IlppcDY0T3B0aW9uLkFsd2F5cyIvPiB0byBhbHdheXMgdXNlIFpJUDY0CisgICAgLy8vICAgZXh0ZW5zaW9ucyB3aGVuIHNhdmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdXIgemlwIGFyY2hpdmUgbmVlZHMgaXQuCisgICAgLy8vICAgU3VwcG9zZSB5b3UgYWRkIDUgZmlsZXMsIGVhY2ggdW5kZXIgMTAwaywgdG8gYSBaaXBGaWxlLiBJZiB5b3Ugc3BlY2lmeSBBbHdheXMKKyAgICAvLy8gICBmb3IgdGhpcyBmbGFnLCB5b3Ugd2lsbCBnZXQgYSBaSVA2NCBhcmNoaXZlLCB0aG91Z2ggdGhlIGFyY2hpdmUgZG9lcyBub3QgbmVlZAorICAgIC8vLyAgIHRvIHVzZSBaSVA2NCBiZWNhdXNlIG5vbmUgb2YgdGhlIG9yaWdpbmFsIHppcCBsaW1pdHMgaGFkIGJlZW4gZXhjZWVkZWQuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgU2V0IHRoaXMgcHJvcGVydHkgdG8gPHNlZSBjcmVmPSJaaXA2NE9wdGlvbi5OZXZlciIvPiB0byB0ZWxsIHRoZSBEb3ROZXRaaXAKKyAgICAvLy8gICBsaWJyYXJ5IHRvIG5ldmVyIHVzZSBaSVA2NCBleHRlbnNpb25zLiAgVGhpcyBpcyB1c2VmdWwgZm9yIG1heGltdW0KKyAgICAvLy8gICBjb21wYXRpYmlsaXR5IGFuZCBpbnRlcm9wZXJhYmlsaXR5LCBhdCB0aGUgZXhwZW5zZSBvZiB0aGUgY2FwYWJpbGl0eSBvZgorICAgIC8vLyAgIGhhbmRsaW5nIGxhcmdlIGZpbGVzIG9yIGxhcmdlIGFyY2hpdmVzLiAgTkI6IFdpbmRvd3MgRXhwbG9yZXIgaW4gV2luZG93cyBYUAorICAgIC8vLyAgIGFuZCBXaW5kb3dzIFZpc3RhIGNhbm5vdCBjdXJyZW50bHkgZXh0cmFjdCBmaWxlcyBmcm9tIGEgemlwNjQgYXJjaGl2ZSwgc28gaWYKKyAgICAvLy8gICB5b3Ugd2FudCB0byBndWFyYW50ZWUgdGhhdCBhIHppcCBhcmNoaXZlIHByb2R1Y2VkIGJ5IHRoaXMgbGlicmFyeSB3aWxsIHdvcmsgaW4KKyAgICAvLy8gICBXaW5kb3dzIEV4cGxvcmVyLCB1c2UgPGM+TmV2ZXI8L2M+LiBJZiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gPHNlZQorICAgIC8vLyAgIGNyZWY9IlppcDY0T3B0aW9uLk5ldmVyIi8+LCBhbmQgeW91ciBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgemlwIHRoYXQgd291bGQKKyAgICAvLy8gICBleGNlZWQgb25lIG9mIHRoZSBaaXAgbGltaXRzLCB0aGUgbGlicmFyeSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiB3aGlsZSBzYXZpbmcKKyAgICAvLy8gICB0aGUgemlwIGZpbGUuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgU2V0IHRoaXMgcHJvcGVydHkgdG8gPHNlZSBjcmVmPSJaaXA2NE9wdGlvbi5Bc05lY2Vzc2FyeSIvPiB0byB0ZWxsIHRoZQorICAgIC8vLyAgIERvdE5ldFppcCBsaWJyYXJ5IHRvIHVzZSB0aGUgWklQNjQgZXh0ZW5zaW9ucyB3aGVuIHJlcXVpcmVkIGJ5IHRoZQorICAgIC8vLyAgIGVudHJ5LiBBZnRlciB0aGUgZmlsZSBpcyBjb21wcmVzc2VkLCB0aGUgb3JpZ2luYWwgYW5kIGNvbXByZXNzZWQgc2l6ZXMgYXJlCisgICAgLy8vICAgY2hlY2tlZCwgYW5kIGlmIHRoZXkgZXhjZWVkIHRoZSBsaW1pdHMgZGVzY3JpYmVkIGFib3ZlLCB0aGVuIHppcDY0IGNhbiBiZQorICAgIC8vLyAgIHVzZWQuIFRoYXQgaXMgdGhlIGdlbmVyYWwgaWRlYSwgYnV0IHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgd3JpbmtsZSB3aGVuIHNhdmluZworICAgIC8vLyAgIHRvIGEgbm9uLXNlZWthYmxlIGRldmljZSwgbGlrZSB0aGUgQVNQLk5FVCA8Yz5SZXNwb25zZS5PdXRwdXRTdHJlYW08L2M+LCBvcgorICAgIC8vLyAgIDxjPkNvbnNvbGUuT3V0PC9jPi4gIFdoZW4gdXNpbmcgbm9uLXNlZWthYmxlIHN0cmVhbXMgZm9yIG91dHB1dCwgdGhlIGVudHJ5CisgICAgLy8vICAgaGVhZGVyIC0gd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgemlwNjQgaXMgaW4gdXNlIC0gaXMgZW1pdHRlZCBiZWZvcmUgaXQgaXMKKyAgICAvLy8gICBrbm93biBpZiB6aXA2NCBpcyBuZWNlc3NhcnkuICBJdCBpcyBvbmx5IGFmdGVyIGFsbCBlbnRyaWVzIGhhdmUgYmVlbiBzYXZlZAorICAgIC8vLyAgIHRoYXQgaXQgY2FuIGJlIGtub3duIGlmIFpJUDY0IHdpbGwgYmUgcmVxdWlyZWQuICBPbiBzZWVrYWJsZSBvdXRwdXQgc3RyZWFtcywKKyAgICAvLy8gICBhZnRlciBzYXZpbmcgYWxsIGVudHJpZXMsIHRoZSBsaWJyYXJ5IGNhbiBzZWVrIGJhY2t3YXJkIGFuZCByZS1lbWl0IHRoZSB6aXAKKyAgICAvLy8gICBmaWxlIGhlYWRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGFjdHVhbCBaSVA2NCByZXF1aXJlbWVudC4gIEJ1dCB1c2luZyBhCisgICAgLy8vICAgbm9uLXNlZWthYmxlIG91dHB1dCBzdHJlYW0sIHRoZSBsaWJyYXJ5IGNhbm5vdCBzZWVrIGJhY2t3YXJkLCBzbyB0aGUgaGVhZGVyCisgICAgLy8vICAgY2FuIG5ldmVyIGJlIGNoYW5nZWQuIEluIG90aGVyIHdvcmRzLCB0aGUgYXJjaGl2ZSdzIHVzZSBvZiBaSVA2NCBleHRlbnNpb25zIGlzCisgICAgLy8vICAgbm90IGFsdGVyYWJsZSBhZnRlciB0aGUgaGVhZGVyIGlzIGVtaXR0ZWQuICBUaGVyZWZvcmUsIHdoZW4gc2F2aW5nIHRvCisgICAgLy8vICAgbm9uLXNlZWthYmxlIHN0cmVhbXMsIHVzaW5nIDxzZWUgY3JlZj0iWmlwNjRPcHRpb24uQXNOZWNlc3NhcnkiLz4gaXMgdGhlIHNhbWUKKyAgICAvLy8gICBhcyB1c2luZyA8c2VlIGNyZWY9IlppcDY0T3B0aW9uLkFsd2F5cyIvPjogaXQgd2lsbCBhbHdheXMgcHJvZHVjZSBhIHppcAorICAgIC8vLyAgIGFyY2hpdmUgdGhhdCB1c2VzIFpJUDY0IGV4dGVuc2lvbnMuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGludGVybmFsIGVudW0gWmlwNjRPcHRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yLCB3aGljaCBpcyAiTmV2ZXIiLgorICAgICAgICAvLy8gKEZvciBDT00gY2xpZW50cywgdGhpcyBpcyBhIDAgKHplcm8pLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRGVmYXVsdCA9IDAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERvIG5vdCB1c2UgWklQNjQgZXh0ZW5zaW9ucyB3aGVuIHdyaXRpbmcgemlwIGFyY2hpdmVzLgorICAgICAgICAvLy8gKEZvciBDT00gY2xpZW50cywgdGhpcyBpcyBhIDAgKHplcm8pLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTmV2ZXIgPSAwLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgWklQNjQgZXh0ZW5zaW9ucyB3aGVuIHdyaXRpbmcgemlwIGFyY2hpdmVzLCBhcyBuZWNlc3NhcnkuCisgICAgICAgIC8vLyBGb3IgZXhhbXBsZSwgd2hlbiBhIHNpbmdsZSBlbnRyeSBleGNlZWRzIDB4RkZGRkZGRkYgaW4gc2l6ZSwgb3Igd2hlbiB0aGUgYXJjaGl2ZSBhcyBhIHdob2xlCisgICAgICAgIC8vLyBleGNlZWRzIDB4RkZGRkZGRkYgaW4gc2l6ZSwgb3Igd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIDY1NTM1IGVudHJpZXMgaW4gYW4gYXJjaGl2ZS4KKyAgICAgICAgLy8vIChGb3IgQ09NIGNsaWVudHMsIHRoaXMgaXMgYSAxLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQXNOZWNlc3NhcnkgPSAxLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHdheXMgdXNlIFpJUDY0IGV4dGVuc2lvbnMgd2hlbiB3cml0aW5nIHppcCBhcmNoaXZlcywgZXZlbiB3aGVuIHVubmVjZXNzYXJ5LgorICAgICAgICAvLy8gKEZvciBDT00gY2xpZW50cywgdGhpcyBpcyBhIDIuKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBbHdheXMKKyAgICB9CisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gIEFuIGVudW0gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb24gYSB0aHJlZS13YXkgdG9nZ2xlIHN3aXRjaAorICAgIC8vLyAgZm9yIHZhcmlvdXMgb3B0aW9ucyBpbiB0aGUgbGlicmFyeS4gVGhpcyBtaWdodCBiZSB1c2VkIHRvCisgICAgLy8vICBzcGVjaWZ5IHdoZXRoZXIgdG8gZW1wbG95IGEgcGFydGljdWxhciB0ZXh0IGVuY29kaW5nLCBvciB0byB1c2UKKyAgICAvLy8gIFpJUDY0IGV4dGVuc2lvbnMsIG9yIHNvbWUgb3RoZXIgb3B0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgZW51bSBaaXBPcHRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJOZXZlciIuCisgICAgICAgIC8vLyAoRm9yIENPTSBjbGllbnRzLCB0aGlzIGlzIGEgMCAoemVybykuKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBEZWZhdWx0ID0gMCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTmV2ZXIgdXNlIHRoZSBhc3NvY2lhdGVkIG9wdGlvbi4KKyAgICAgICAgLy8vIChGb3IgQ09NIGNsaWVudHMsIHRoaXMgaXMgYSAwICh6ZXJvKS4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5ldmVyID0gMCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIHRoZSBhc3NvY2lhdGVkIGJlaGF2aW9yICJhcyBuZWNlc3NhcnkuIgorICAgICAgICAvLy8gKEZvciBDT00gY2xpZW50cywgdGhpcyBpcyBhIDEuKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBBc05lY2Vzc2FyeSA9IDEsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSB0aGUgYXNzb2NpYXRlZCBiZWhhdmlvciBBbHdheXMsIHdoZXRoZXIgbmVjZXNzYXJ5IG9yIG5vdC4KKyAgICAgICAgLy8vIChGb3IgQ09NIGNsaWVudHMsIHRoaXMgaXMgYSAyLikKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQWx3YXlzCisgICAgfQorCisKKyAgICBlbnVtIEFkZE9yVXBkYXRlQWN0aW9uCisgICAgeworICAgICAgICBBZGRPbmx5ID0gMCwKKyAgICAgICAgQWRkT3JVcGRhdGUKKyAgICB9CisKK30KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8KKy8vIEluZm9ybWF0aW9uIG9uIHRoZSBaSVAgZm9ybWF0OgorLy8KKy8vIEZyb20KKy8vIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKKy8vCisvLyAgT3ZlcmFsbCAuWklQIGZpbGUgZm9ybWF0OgorLy8KKy8vICAgICBbbG9jYWwgZmlsZSBoZWFkZXIgMV0KKy8vICAgICBbZmlsZSBkYXRhIDFdCisvLyAgICAgW2RhdGEgZGVzY3JpcHRvciAxXSAgKiogc29tZXRpbWVzCisvLyAgICAgLgorLy8gICAgIC4KKy8vICAgICAuCisvLyAgICAgW2xvY2FsIGZpbGUgaGVhZGVyIG5dCisvLyAgICAgW2ZpbGUgZGF0YSBuXQorLy8gICAgIFtkYXRhIGRlc2NyaXB0b3Igbl0gICAqKiBzb21ldGltZXMKKy8vICAgICBbYXJjaGl2ZSBkZWNyeXB0aW9uIGhlYWRlcl0KKy8vICAgICBbYXJjaGl2ZSBleHRyYSBkYXRhIHJlY29yZF0KKy8vICAgICBbY2VudHJhbCBkaXJlY3RvcnldCisvLyAgICAgW3ppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRdCisvLyAgICAgW3ppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yXQorLy8gICAgIFtlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXQorLy8KKy8vIExvY2FsIEZpbGUgSGVhZGVyIGZvcm1hdDoKKy8vICAgICAgICAgbG9jYWwgZmlsZSBoZWFkZXIgc2lnbmF0dXJlIC4uLiA0IGJ5dGVzICAoMHgwNDAzNGI1MCkKKy8vICAgICAgICAgdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAuLi4uLiAyIGJ5dGVzCisvLyAgICAgICAgIGdlbmVyYWwgcHVycG9zZSBiaXQgZmllbGQgLi4uLi4gMiBieXRlcworLy8gICAgICAgICBjb21wcmVzc2lvbiBtZXRob2QgLi4uLi4uLi4uLi4uIDIgYnl0ZXMKKy8vICAgICAgICAgbGFzdCBtb2QgZmlsZSB0aW1lIC4uLi4uLi4uLi4uLiAyIGJ5dGVzCisvLyAgICAgICAgIGxhc3QgbW9kIGZpbGUgZGF0ZS4uLi4uLi4uLi4uLi4gMiBieXRlcworLy8gICAgICAgICBjcmMtMzIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDQgYnl0ZXMKKy8vICAgICAgICAgY29tcHJlc3NlZCBzaXplLi4uLi4uLi4uLi4uLi4uLiA0IGJ5dGVzCisvLyAgICAgICAgIHVuY29tcHJlc3NlZCBzaXplLi4uLi4uLi4uLi4uLi4gNCBieXRlcworLy8gICAgICAgICBmaWxlIG5hbWUgbGVuZ3RoLi4uLi4uLi4uLi4uLi4uIDIgYnl0ZXMKKy8vICAgICAgICAgZXh0cmEgZmllbGQgbGVuZ3RoIC4uLi4uLi4uLi4uLiAyIGJ5dGVzCisvLyAgICAgICAgIGZpbGUgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgdmFyaWVzCisvLyAgICAgICAgIGV4dHJhIGZpZWxkICAgICAgICAgICAgICAgICAgICAgdmFyaWVzCisvLworLy8KKy8vIERhdGEgZGVzY3JpcHRvcjogICh1c2VkIG9ubHkgd2hlbiBiaXQgMyBvZiB0aGUgZ2VuZXJhbCBwdXJwb3NlIGJpdGZpZWxkIGlzIHNldCkKKy8vICAgICAgICAgKGFsdGhvdWdoLCBJIGhhdmUgZm91bmQgemlwIGZpbGVzIHdoZXJlIGJpdCAzIGlzIG5vdCBzZXQsIHlldCB0aGlzIGRlc2NyaXB0b3IgaXMgcHJlc2VudCEpCisvLyAgICAgICAgIGxvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSAgICAgNCBieXRlcyAgKDB4MDgwNzRiNTApICAqKiBzb21ldGltZXMhISEgTm90IGFsd2F5cworLy8gICAgICAgICBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMKKy8vICAgICAgICAgY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA0IGJ5dGVzCisvLyAgICAgICAgIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcworLy8KKy8vCisvLyAgIENlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZToKKy8vCisvLyAgICAgICBbZmlsZSBoZWFkZXIgMV0KKy8vICAgICAgIC4KKy8vICAgICAgIC4KKy8vICAgICAgIC4KKy8vICAgICAgIFtmaWxlIGhlYWRlciBuXQorLy8gICAgICAgW2RpZ2l0YWwgc2lnbmF0dXJlXQorLy8KKy8vCisvLyAgICAgICBGaWxlIGhlYWRlcjogIChUaGlzIGlzIGEgWmlwRGlyRW50cnkpCisvLyAgICAgICAgIGNlbnRyYWwgZmlsZSBoZWFkZXIgc2lnbmF0dXJlICAgNCBieXRlcyAgKDB4MDIwMTRiNTApCisvLyAgICAgICAgIHZlcnNpb24gbWFkZSBieSAgICAgICAgICAgICAgICAgMiBieXRlcworLy8gICAgICAgICB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICAgICAgIDIgYnl0ZXMKKy8vICAgICAgICAgZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzCisvLyAgICAgICAgIGNvbXByZXNzaW9uIG1ldGhvZCAgICAgICAgICAgICAgMiBieXRlcworLy8gICAgICAgICBsYXN0IG1vZCBmaWxlIHRpbWUgICAgICAgICAgICAgIDIgYnl0ZXMKKy8vICAgICAgICAgbGFzdCBtb2QgZmlsZSBkYXRlICAgICAgICAgICAgICAyIGJ5dGVzCisvLyAgICAgICAgIGNyYy0zMiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcworLy8gICAgICAgICBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgIDQgYnl0ZXMKKy8vICAgICAgICAgdW5jb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICA0IGJ5dGVzCisvLyAgICAgICAgIGZpbGUgbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgMiBieXRlcworLy8gICAgICAgICBleHRyYSBmaWVsZCBsZW5ndGggICAgICAgICAgICAgIDIgYnl0ZXMKKy8vICAgICAgICAgZmlsZSBjb21tZW50IGxlbmd0aCAgICAgICAgICAgICAyIGJ5dGVzCisvLyAgICAgICAgIGRpc2sgbnVtYmVyIHN0YXJ0ICAgICAgICAgICAgICAgMiBieXRlcworLy8gICAgICAgICBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgKiogICAgIDIgYnl0ZXMKKy8vICAgICAgICAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICoqKiAgICA0IGJ5dGVzCisvLyAgICAgICAgIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXIgNCBieXRlcworLy8gICAgICAgICBmaWxlIG5hbWUgKHZhcmlhYmxlIHNpemUpCisvLyAgICAgICAgIGV4dHJhIGZpZWxkICh2YXJpYWJsZSBzaXplKQorLy8gICAgICAgICBmaWxlIGNvbW1lbnQgKHZhcmlhYmxlIHNpemUpCisvLworLy8gKiogVGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlcywgbmVhciBhcyBJIGNhbiB0ZWxsLAorLy8gdXNlcyAweDAxIGZvciBhIGZpbGUgYW5kIGEgMHgwMCBmb3IgYSBkaXJlY3RvcnkuCisvLworLy8gKioqVGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBmb2xsb3dzIHRoZSBNUy1ET1MgZmlsZSBhdHRyaWJ1dGUgYnl0ZSwgZGVzY3JpYmVkIGhlcmU6CisvLyBhdCBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiL3ExMjUwMTkvCisvLyAweDAwMTAgPT4gZGlyZWN0b3J5CisvLyAweDAwMjAgPT4gZmlsZQorLy8KKy8vCisvLyBFbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkOgorLy8KKy8vICAgICAgICAgZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZSAgICA0IGJ5dGVzICAoMHgwNjA1NGI1MCkKKy8vICAgICAgICAgbnVtYmVyIG9mIHRoaXMgZGlzayAgICAgICAgICAgICAyIGJ5dGVzCisvLyAgICAgICAgIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZQorLy8gICAgICAgICBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgIDIgYnl0ZXMKKy8vICAgICAgICAgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlCisvLyAgICAgICAgIGNlbnRyYWwgZGlyZWN0b3J5IG9uIHRoaXMgZGlzayAgMiBieXRlcworLy8gICAgICAgICB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorLy8gICAgICAgICB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICAgICAgICAgIDIgYnl0ZXMKKy8vICAgICAgICAgc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICA0IGJ5dGVzCisvLyAgICAgICAgIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsCisvLyAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8KKy8vICAgICAgICAgdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICAgICAgICA0IGJ5dGVzCisvLyAgICAgICAgIC5aSVAgZmlsZSBjb21tZW50IGxlbmd0aCAgICAgICAgMiBieXRlcworLy8gICAgICAgICAuWklQIGZpbGUgY29tbWVudCAgICAgICAodmFyaWFibGUgc2l6ZSkKKy8vCisvLyBkYXRlIGFuZCB0aW1lIGFyZSBwYWNrZWQgdmFsdWVzLCBhcyBNU0RPUyBkaWQgdGhlbQorLy8gdGltZTogYml0cyAwLTQgOiBzZWNvbmRzIChkaXZpZGVkIGJ5IDIpCisvLyAgICAgICAgICAgIDUtMTA6IG1pbnV0ZQorLy8gICAgICAgICAgICAxMS0xNTogaG91cgorLy8gZGF0ZSAgYml0cyAwLTQgOiBkYXkKKy8vICAgICAgICAgICAgNS04OiBtb250aAorLy8gICAgICAgICAgICA5LTE1IHllYXIgKHNpbmNlIDE5ODApCisvLworLy8gc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczcyNDI3NChWUy44NSkuYXNweAorCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLngtSUVudW1lcmFibGUuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBGaWxlLngtSUVudW1lcmFibGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2MDdiMQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcEZpbGUueC1JRW51bWVyYWJsZS5jcwpAQCAtMCwwICsxLDE1NCBAQAorLy8gWmlwRmlsZS54LUlFbnVtZXJhYmxlLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRGlubyBDaGllc2EgYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMDktRGVjZW1iZXItMjYgMTU6MTM6MjY+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBzbW9lIG1ldGhvZHMgZm9yIElFbnVtZXJhYmxlIHN1cHBvcnQuIEl0IGlzCisvLyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciBDT00gdG8gaGF2ZSB0aGVzZSB0aGluZ3MgaW4gYSBzZXBhcmF0ZSBtb2R1bGUuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcAoreworCisgICAgLy8gRm9yIHNvbWUgd2VpcmQgcmVhc29uLCB0aGUgbWV0aG9kIHdpdGggdGhlIERpc3BJZCgtNCkgYXR0cmlidXRlLCB3aGljaCBpcyB1c2VkIGFzCisgICAgLy8gdGhlIF9OZXdFbnVtKCkgbWV0aG9kLCBhbmQgd2hpY2ggaXMgcmVxdWlyZWQgdG8gZ2V0IGVudW1lcmF0aW9uIHRvIHdvcmsgZnJvbSBDT00KKyAgICAvLyBlbnZpcm9ubWVudHMgbGlrZSBWQlNjcmlwdCBhbmQgSmF2YXNjcmlwdCAoZXRjKSBtdXN0IGJlIHRoZSBMQVNUIE1FTUJFUiBpbiB0aGUKKyAgICAvLyBzb3VyY2UuICBJbiB0aGUgZXZlbnQgb2YgUGFydGlhbCBjbGFzc2VzLCBpdCBuZWVkcyB0byBiZSB0aGUgbGFzdCBtZW1iZXIgZGVmaW5lZAorICAgIC8vIGluIHRoZSBsYXN0IHNvdXJjZSBtb2R1bGUuICBUaGUgc291cmNlIG1vZHVsZXMgYXJlIG9yZGVyZWQgYWxwaGFiZXRpY2FsbHkgYnkKKyAgICAvLyBmaWxlbmFtZS4gIE5vdCBzdXJlIHdoeSB0aGlzIGlzIHRydWUuIEluIGFueSBjYXNlLCB3ZSBwdXQgdGhlIGVudW1lcmF0aW9uIHN0dWZmCisgICAgLy8gaGVyZSBpbiB0aGlzIG9kZGx5LW5hbWVkIG1vZHVsZSwgZm9yIHRoaXMgcmVhc29uLgorICAgIC8vCisKKworCisgICAgaW50ZXJuYWwgcGFydGlhbCBjbGFzcyBaaXBGaWxlCisgICAgeworCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdlbmVyaWMgSUVudW1lcmF0b3Igc3VwcG9ydCwgZm9yIHVzZSBvZiBhIFppcEZpbGUgaW4gYW4gZW51bWVyYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBZb3UgcHJvYmFibHkgZG8gbm90IHdhbnQgdG8gY2FsbCA8Yz5HZXRFbnVtZXJhdG9yPC9jPiBleHBsaWNpdGx5LiBJbnN0ZWFkCisgICAgICAgIC8vLyBpdCBpcyBpbXBsaWNpdGx5IGNhbGxlZCB3aGVuIHlvdSB1c2UgYSA8c2VlIGxhbmd3b3JkPSJmb3JlYWNoIi8+IGxvb3AgaW4gQyMsIG9yIGEKKyAgICAgICAgLy8vIDxjPkZvciBFYWNoPC9jPiBsb29wIGluIFZCLk5FVC4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIFRoaXMgZXhhbXBsZSByZWFkcyBhIHppcGZpbGUgb2YgYSBnaXZlbiBuYW1lLCB0aGVuIGVudW1lcmF0ZXMgdGhlCisgICAgICAgIC8vLyBlbnRyaWVzIGluIHRoYXQgemlwIGZpbGUsIGFuZCBkaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaAorICAgICAgICAvLy8gZW50cnkgb24gdGhlIENvbnNvbGUuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChaaXBGaWxlIHppcCA9IFppcEZpbGUuUmVhZCh6aXBmaWxlKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgYm9vbCBoZWFkZXIgPSB0cnVlOworICAgICAgICAvLy8gICBmb3JlYWNoIChaaXBFbnRyeSBlIGluIHppcCkKKyAgICAgICAgLy8vICAgeworICAgICAgICAvLy8gICAgIGlmIChoZWFkZXIpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiWmlwZmlsZTogezB9IiwgemlwLk5hbWUpOworICAgICAgICAvLy8gICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiVmVyc2lvbiBOZWVkZWQ6IDB4ezA6WDJ9IiwgZS5WZXJzaW9uTmVlZGVkKTsKKyAgICAgICAgLy8vICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIkJpdEZpZWxkOiAweHswOlgyfSIsIGUuQml0RmllbGQpOworICAgICAgICAvLy8gICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiQ29tcHJlc3Npb24gTWV0aG9kOiAweHswOlgyfSIsIGUuQ29tcHJlc3Npb25NZXRob2QpOworICAgICAgICAvLy8gICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiXG57MSwtMjJ9IHsyLC02fSB7Myw0fSAgIHs0LC04fSAgezB9IiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIkZpbGVuYW1lIiwgIk1vZGlmaWVkIiwgIlNpemUiLCAiUmF0aW8iLCAiUGFja2VkIik7CisgICAgICAgIC8vLyAgICAgICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKG5ldyBTeXN0ZW0uU3RyaW5nKCctJywgNzIpKTsKKyAgICAgICAgLy8vICAgICAgICBoZWFkZXIgPSBmYWxzZTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiezEsLTIyfSB7MiwtNn0gezMsNDpGMH0lICAgezQsLTh9ICB7MH0iLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGUuRmlsZU5hbWUsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgZS5MYXN0TW9kaWZpZWQuVG9TdHJpbmcoInl5eXktTU0tZGQgSEg6bW06c3MiKSwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBlLlVuY29tcHJlc3NlZFNpemUsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgZS5Db21wcmVzc2lvblJhdGlvLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGUuQ29tcHJlc3NlZFNpemUpOworICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgICBlLkV4dHJhY3QoKTsKKyAgICAgICAgLy8vICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vICAgRGltIFppcEZpbGVUb0V4dHJhY3QgQXMgU3RyaW5nID0gImM6XGZvby56aXAiCisgICAgICAgIC8vLyAgIFVzaW5nIHppcCBBcyBaaXBGaWxlID0gWmlwRmlsZS5SZWFkKFppcEZpbGVUb0V4dHJhY3QpCisgICAgICAgIC8vLyAgICAgICBEaW0gaGVhZGVyIEFzIEJvb2xlYW4gPSBUcnVlCisgICAgICAgIC8vLyAgICAgICBEaW0gZSBBcyBaaXBFbnRyeQorICAgICAgICAvLy8gICAgICAgRm9yIEVhY2ggZSBJbiB6aXAKKyAgICAgICAgLy8vICAgICAgICAgICBJZiBoZWFkZXIgVGhlbgorICAgICAgICAvLy8gICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiWmlwZmlsZTogezB9IiwgemlwLk5hbWUpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJWZXJzaW9uIE5lZWRlZDogMHh7MDpYMn0iLCBlLlZlcnNpb25OZWVkZWQpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJCaXRGaWVsZDogMHh7MDpYMn0iLCBlLkJpdEZpZWxkKQorICAgICAgICAvLy8gICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29tcHJlc3Npb24gTWV0aG9kOiAweHswOlgyfSIsIGUuQ29tcHJlc3Npb25NZXRob2QpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKENoclcoMTApICZhbXA7ICJ7MSwtMjJ9IHsyLC02fSB7Myw0fSAgIHs0LC04fSAgezB9IiwgXworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICJGaWxlbmFtZSIsICJNb2RpZmllZCIsICJTaXplIiwgIlJhdGlvIiwgIlBhY2tlZCIgKQorICAgICAgICAvLy8gICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShOZXcgU3RyaW5nKCItImMsIDcyKSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgaGVhZGVyID0gRmFsc2UKKyAgICAgICAgLy8vICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezEsLTIyfSB7MiwtNn0gezMsNDpGMH0lICAgezQsLTh9ICB7MH0iLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICBlLkZpbGVOYW1lLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICBlLkxhc3RNb2RpZmllZC5Ub1N0cmluZygieXl5eS1NTS1kZCBISDptbTpzcyIpLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICBlLlVuY29tcHJlc3NlZFNpemUsIF8KKyAgICAgICAgLy8vICAgICAgICAgICAgIGUuQ29tcHJlc3Npb25SYXRpbywgXworICAgICAgICAvLy8gICAgICAgICAgICAgZS5Db21wcmVzc2VkU2l6ZSApCisgICAgICAgIC8vLyAgICAgICAgICAgZS5FeHRyYWN0CisgICAgICAgIC8vLyAgICAgICBOZXh0CisgICAgICAgIC8vLyAgIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPkEgZ2VuZXJpYyBlbnVtZXJhdG9yIHN1aXRhYmxlIGZvciB1c2UgIHdpdGhpbiBhIGZvcmVhY2ggbG9vcC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYXRvcjxaaXBFbnRyeT4gR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKFppcEVudHJ5IGUgaW4gX2VudHJpZXMuVmFsdWVzKQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBlOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQW4gSUVudW1lcmF0b3IsIGZvciB1c2Ugb2YgYSBaaXBGaWxlIGluIGEgZm9yZWFjaCBjb25zdHJ1Y3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBpcyBpbmNsdWRlZCBmb3IgQ09NIHN1cHBvcnQuICBBbiBhcHBsaWNhdGlvbiBnZW5lcmFsbHkgZG9lcyBub3QgY2FsbAorICAgICAgICAvLy8gdGhpcyBtZXRob2QgZGlyZWN0bHkuICBJdCBpcyBjYWxsZWQgaW1wbGljaXRseSBieSBDT00gY2xpZW50cyB3aGVuIGVudW1lcmF0aW5nCisgICAgICAgIC8vLyB0aGUgZW50cmllcyBpbiB0aGUgWmlwRmlsZSBpbnN0YW5jZS4gIEluIFZCU2NyaXB0LCB0aGlzIGlzIGRvbmUgd2l0aCBhIDxjPkZvciBFYWNoPC9jPgorICAgICAgICAvLy8gc3RhdGVtZW50LiAgSW4gSmF2YXNjcmlwdCwgdGhpcyBpcyBkb25lIHdpdGggPGM+bmV3IEVudW1lcmF0b3IoemlwZmlsZSk8L2M+LgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPgorICAgICAgICAvLy8gVGhlIElFbnVtZXJhdG9yIG92ZXIgdGhlIGVudHJpZXMgaW4gdGhlIFppcEZpbGUuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuRGlzcElkKC00KV0KKyAgICAgICAgcHVibGljIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBHZXROZXdFbnVtKCkgICAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgaXMgbm90IHNpZ25pZmljYW50CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcElucHV0U3RyZWFtLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwSW5wdXRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NzliNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcElucHV0U3RyZWFtLmNzCkBAIC0wLDAgKzEsODI5IEBACisvLyBaaXBJbnB1dFN0cmVhbS5jcworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTMxIDE0OjQ4OjMwPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIFppcElucHV0U3RyZWFtIGNsYXNzLCB3aGljaCBpcyBhIHN0cmVhbSBtZXRhcGhvciBmb3IKKy8vIHJlYWRpbmcgemlwIGZpbGVzLiAgVGhpcyBjbGFzcyBkb2VzIG5vdCBkZXBlbmQgb24gSW9uaWMuWmlwLlppcEZpbGUsIGJ1dCByYXRoZXIKKy8vIHN0YW5kcyBhbG9uZ3NpZGUgaXQgYXMgYW4gYWx0ZXJuYXRpdmUgImNvbnRhaW5lciIgZm9yIFppcEVudHJ5LCB3aGVuIHJlYWRpbmcgemlwcy4KKy8vCisvLyBJdCBhZGRzIG9uZSBpbnRlcmVzdGluZyBtZXRob2QgdG8gdGhlIG5vcm1hbCAic3RyZWFtIiBpbnRlcmZhY2U6IEdldE5leHRFbnRyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIElvbmljLlppcDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLkNyYzsKKworbmFtZXNwYWNlICBJb25pYy5aaXAKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgUHJvdmlkZXMgYSBzdHJlYW0gbWV0YXBob3IgZm9yIHJlYWRpbmcgemlwIGZpbGVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHByb2dyYW1taW5nIG1vZGVsIGZvciByZWFkaW5nIHppcCBmaWxlcyB0bworICAgIC8vLyAgIHRoZSBvbmUgZW5hYmxlZCBieSB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlIi8+IGNsYXNzLiAgVXNlIHRoaXMgd2hlbiByZWFkaW5nIHppcAorICAgIC8vLyAgIGZpbGVzLCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlIi8+IGNsYXNzLCB3aGVuIHlvdSB3b3VsZAorICAgIC8vLyAgIGxpa2UgdG8gdXNlIGEgU3RyZWFtIGNsYXNzIHRvIHJlYWQgdGhlIGZpbGUuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgU29tZSBhcHBsaWNhdGlvbiBkZXNpZ25zIHJlcXVpcmUgYSByZWFkYWJsZSBzdHJlYW0gZm9yIGlucHV0LiBUaGlzIHN0cmVhbSBjYW4KKyAgICAvLy8gICBiZSB1c2VkIHRvIHJlYWQgYSB6aXAgZmlsZSwgYW5kIGV4dHJhY3QgZW50cmllcy4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBCb3RoIHRoZSA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gY2xhc3MgYW5kIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyBjYW4gYmUgdXNlZAorICAgIC8vLyAgIHRvIHJlYWQgYW5kIGV4dHJhY3QgemlwIGZpbGVzLiAgQm90aCBvZiB0aGVtIHN1cHBvcnQgbWFueSBvZiB0aGUgY29tbW9uIHppcAorICAgIC8vLyAgIGZlYXR1cmVzLCBpbmNsdWRpbmcgVW5pY29kZSwgZGlmZmVyZW50IGNvbXByZXNzaW9uIGxldmVscywgYW5kIFpJUDY0LiAgVGhlCisgICAgLy8vICAgcHJvZ3JhbW1pbmcgbW9kZWxzIGRpZmZlci4gRm9yIGV4YW1wbGUsIHdoZW4gZXh0cmFjdGluZyBlbnRyaWVzIHZpYSBjYWxscyB0bworICAgIC8vLyAgIHRoZSA8Yz5HZXROZXh0RW50cnkoKTwvYz4gYW5kIDxjPlJlYWQoKTwvYz4gbWV0aG9kcyBvbiB0aGUKKyAgICAvLy8gICA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gY2xhc3MsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBmaWxlLAorICAgIC8vLyAgIHdyaXRpbmcgdGhlIGJ5dGVzIGludG8gdGhlIGZpbGUsIHNldHRpbmcgdGhlIGF0dHJpYnV0ZXMgb24gdGhlIGZpbGUsIGFuZAorICAgIC8vLyAgIHNldHRpbmcgdGhlIGNyZWF0ZWQsIGxhc3QgbW9kaWZpZWQsIGFuZCBsYXN0IGFjY2Vzc2VkIHRpbWVzdGFtcHMgb24gdGhlCisgICAgLy8vICAgZmlsZS4gQWxsIG9mIHRoZXNlIHRoaW5ncyBhcmUgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IGEgY2FsbCB0byA8c2VlCisgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuRXh0cmFjdCgpIj5aaXBFbnRyeS5FeHRyYWN0KCk8L3NlZT4uICBGb3IgdGhpcyByZWFzb24sIHRoZQorICAgIC8vLyAgIDxjPlppcElucHV0U3RyZWFtPC9jPiBpcyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgZm9yIHdoZW4geW91ciBhcHBsaWNhdGlvbiB3YW50cworICAgIC8vLyAgIHRvIGV4dHJhY3QgdGhlIGRhdGEsIHdpdGhvdXQgc3RvcmluZyB0aGF0IGRhdGEgaW50byBhIGZpbGUuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgQXNpZGUgZnJvbSB0aGUgb2J2aW91cyBkaWZmZXJlbmNlcyBpbiBwcm9ncmFtbWluZyBtb2RlbCwgdGhlcmUgYXJlIHNvbWUKKyAgICAvLy8gICBkaWZmZXJlbmNlcyBpbiBjYXBhYmlsaXR5IGJldHdlZW4gdGhlIDxjPlppcEZpbGU8L2M+IGNsYXNzIGFuZCB0aGUKKyAgICAvLy8gICA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gY2xhc3MuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPGxpc3QgdHlwZT0iYnVsbGV0Ij4KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIDxjPlppcEZpbGU8L2M+IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBvciB1cGRhdGUgemlwIGZpbGVzLCBvciByZWFkIGFuZAorICAgIC8vLyAgICAgZXh0cmFjdCB6aXAgZmlsZXMuIDxjPlppcElucHV0U3RyZWFtPC9jPiBjYW4gYmUgdXNlZCBvbmx5IHRvIHJlYWQgYW5kCisgICAgLy8vICAgICBleHRyYWN0IHppcCBmaWxlcy4gSWYgeW91IHdhbnQgdG8gdXNlIGEgc3RyZWFtIHRvIGNyZWF0ZSB6aXAgZmlsZXMsIGNoZWNrCisgICAgLy8vICAgICBvdXQgdGhlIDxzZWUgY3JlZj0iWmlwT3V0cHV0U3RyZWFtIi8+LgorICAgIC8vLyAgIDwvaXRlbT4KKyAgICAvLy8KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIDxjPlppcElucHV0U3RyZWFtPC9jPiBjYW5ub3QgcmVhZCBzZWdtZW50ZWQgb3Igc3Bhbm5lZAorICAgIC8vLyAgICAgemlwIGZpbGVzLgorICAgIC8vLyAgIDwvaXRlbT4KKyAgICAvLy8KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIDxjPlppcElucHV0U3RyZWFtPC9jPiB3aWxsIG5vdCByZWFkIFppcCBmaWxlIGNvbW1lbnRzLgorICAgIC8vLyAgIDwvaXRlbT4KKyAgICAvLy8KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIFdoZW4gcmVhZGluZyBsYXJnZXIgZmlsZXMsIDxjPlppcElucHV0U3RyZWFtPC9jPiB3aWxsIGFsd2F5cyB1bmRlcnBlcmZvcm0KKyAgICAvLy8gICAgIDxjPlppcEZpbGU8L2M+LiBUaGlzIGlzIGJlY2F1c2UgdGhlIDxjPlppcElucHV0U3RyZWFtPC9jPiBkb2VzIGEgZnVsbCBzY2FuIG9uIHRoZQorICAgIC8vLyAgICAgemlwIGZpbGUsIHdoaWxlIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyByZWFkcyB0aGUgY2VudHJhbCBkaXJlY3Rvcnkgb2YgdGhlCisgICAgLy8vICAgICB6aXAgZmlsZS4KKyAgICAvLy8gICA8L2l0ZW0+CisgICAgLy8vCisgICAgLy8vIDwvbGlzdD4KKyAgICAvLy8KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGludGVybmFsIGNsYXNzIFppcElucHV0U3RyZWFtIDogU3RyZWFtCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZSBhIDxjPlppcElucHV0U3RyZWFtPC9jPiwgd3JhcHBpbmcgaXQgYXJvdW5kIGFuIGV4aXN0aW5nIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hpbGUgdGhlIDxzZWUgY3JlZj0iWmlwRmlsZSIvPiBjbGFzcyBpcyBnZW5lcmFsbHkgZWFzaWVyCisgICAgICAgIC8vLyAgIHRvIHVzZSwgdGhpcyBjbGFzcyBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byB0aG9zZQorICAgICAgICAvLy8gICBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHJlYWQgZnJvbSBhIHppcGZpbGUgZGlyZWN0bHksCisgICAgICAgIC8vLyAgIHVzaW5nIGEgPHNlZSBjcmVmPSJTeXN0ZW0uSU8uU3RyZWFtIi8+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBCb3RoIHRoZSA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gY2xhc3MgYW5kIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyBjYW4gYmUgdXNlZAorICAgICAgICAvLy8gICB0byByZWFkIGFuZCBleHRyYWN0IHppcCBmaWxlcy4gIEJvdGggb2YgdGhlbSBzdXBwb3J0IG1hbnkgb2YgdGhlIGNvbW1vbiB6aXAKKyAgICAgICAgLy8vICAgZmVhdHVyZXMsIGluY2x1ZGluZyBVbmljb2RlLCBkaWZmZXJlbnQgY29tcHJlc3Npb24gbGV2ZWxzLCBhbmQgWklQNjQuICBUaGUKKyAgICAgICAgLy8vICAgcHJvZ3JhbW1pbmcgbW9kZWxzIGRpZmZlci4gRm9yIGV4YW1wbGUsIHdoZW4gZXh0cmFjdGluZyBlbnRyaWVzIHZpYSBjYWxscyB0bworICAgICAgICAvLy8gICB0aGUgPGM+R2V0TmV4dEVudHJ5KCk8L2M+IGFuZCA8Yz5SZWFkKCk8L2M+IG1ldGhvZHMgb24gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcElucHV0U3RyZWFtPC9jPiBjbGFzcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGZpbGUsCisgICAgICAgIC8vLyAgIHdyaXRpbmcgdGhlIGJ5dGVzIGludG8gdGhlIGZpbGUsIHNldHRpbmcgdGhlIGF0dHJpYnV0ZXMgb24gdGhlIGZpbGUsIGFuZAorICAgICAgICAvLy8gICBzZXR0aW5nIHRoZSBjcmVhdGVkLCBsYXN0IG1vZGlmaWVkLCBhbmQgbGFzdCBhY2Nlc3NlZCB0aW1lc3RhbXBzIG9uIHRoZQorICAgICAgICAvLy8gICBmaWxlLiBBbGwgb2YgdGhlc2UgdGhpbmdzIGFyZSBkb25lIGF1dG9tYXRpY2FsbHkgYnkgYSBjYWxsIHRvIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuRXh0cmFjdCgpIj5aaXBFbnRyeS5FeHRyYWN0KCk8L3NlZT4uICBGb3IgdGhpcyByZWFzb24sIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gaXMgZ2VuZXJhbGx5IHJlY29tbWVuZGVkIGZvciB3aGVuIHlvdXIgYXBwbGljYXRpb24gd2FudHMKKyAgICAgICAgLy8vICAgdG8gZXh0cmFjdCB0aGUgZGF0YSwgd2l0aG91dCBzdG9yaW5nIHRoYXQgZGF0YSBpbnRvIGEgZmlsZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQXNpZGUgZnJvbSB0aGUgb2J2aW91cyBkaWZmZXJlbmNlcyBpbiBwcm9ncmFtbWluZyBtb2RlbCwgdGhlcmUgYXJlIHNvbWUKKyAgICAgICAgLy8vICAgZGlmZmVyZW5jZXMgaW4gY2FwYWJpbGl0eSBiZXR3ZWVuIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyBhbmQgdGhlCisgICAgICAgIC8vLyAgIDxjPlppcElucHV0U3RyZWFtPC9jPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8bGlzdCB0eXBlPSJidWxsZXQiPgorICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgPGM+WmlwRmlsZTwvYz4gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG9yIHVwZGF0ZSB6aXAgZmlsZXMsIG9yIHJlYWQgYW5kIGV4dHJhY3QKKyAgICAgICAgLy8vICAgemlwIGZpbGVzLiA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gY2FuIGJlIHVzZWQgb25seSB0byByZWFkIGFuZCBleHRyYWN0IHppcAorICAgICAgICAvLy8gICAgIGZpbGVzLiBJZiB5b3Ugd2FudCB0byB1c2UgYSBzdHJlYW0gdG8gY3JlYXRlIHppcCBmaWxlcywgY2hlY2sgb3V0IHRoZSA8c2VlCisgICAgICAgIC8vLyAgICAgY3JlZj0iWmlwT3V0cHV0U3RyZWFtIi8+LgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gY2Fubm90IHJlYWQgc2VnbWVudGVkIG9yIHNwYW5uZWQKKyAgICAgICAgLy8vICAgICB6aXAgZmlsZXMuCisgICAgICAgIC8vLyAgIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxpdGVtPgorICAgICAgICAvLy8gICAgIDxjPlppcElucHV0U3RyZWFtPC9jPiB3aWxsIG5vdCByZWFkIFppcCBmaWxlIGNvbW1lbnRzLgorICAgICAgICAvLy8gICA8L2l0ZW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8aXRlbT4KKyAgICAgICAgLy8vICAgICBXaGVuIHJlYWRpbmcgbGFyZ2VyIGZpbGVzLCA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gd2lsbCBhbHdheXMgdW5kZXJwZXJmb3JtCisgICAgICAgIC8vLyAgICAgPGM+WmlwRmlsZTwvYz4uIFRoaXMgaXMgYmVjYXVzZSB0aGUgPGM+WmlwSW5wdXRTdHJlYW08L2M+IGRvZXMgYSBmdWxsIHNjYW4gb24gdGhlCisgICAgICAgIC8vLyAgICAgemlwIGZpbGUsIHdoaWxlIHRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyByZWFkcyB0aGUgY2VudHJhbCBkaXJlY3Rvcnkgb2YgdGhlCisgICAgICAgIC8vLyAgICAgemlwIGZpbGUuCisgICAgICAgIC8vLyAgIDwvaXRlbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2xpc3Q+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPgorICAgICAgICAvLy8gICBUaGUgc3RyZWFtIHRvIHJlYWQuIEl0IG11c3QgYmUgcmVhZGFibGUuIFRoaXMgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGF0CisgICAgICAgIC8vLyAgIHRoZSB0aW1lIHRoZSA8Yz5aaXBJbnB1dFN0cmVhbTwvYz4gaXMgY2xvc2VkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVhZCBhIHppcCBmaWxlLCBhbmQgZXh0cmFjdCBlbnRyaWVzLCB1c2luZyB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwSW5wdXRTdHJlYW08L2M+IGNsYXNzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBVbnppcCgpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgYnl0ZVtdIGJ1ZmZlcj0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgIC8vLyAgICAgaW50IG47CisgICAgICAgIC8vLyAgICAgdXNpbmcgKHZhciByYXcgPSBGaWxlLk9wZW4oaW5wdXRGaWxlTmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nICh2YXIgaW5wdXQ9IG5ldyBaaXBJbnB1dFN0cmVhbShyYXcpKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBaaXBFbnRyeSBlOworICAgICAgICAvLy8gICAgICAgICAgICAgd2hpbGUgKCggZSA9IGlucHV0LkdldE5leHRFbnRyeSgpKSAhPSBudWxsKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGlmIChlLklzRGlyZWN0b3J5KSBjb250aW51ZTsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBzdHJpbmcgb3V0cHV0UGF0aCA9IFBhdGguQ29tYmluZShleHRyYWN0RGlyLCBlLkZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB1c2luZyAodmFyIG91dHB1dCA9IEZpbGUuT3BlbihvdXRwdXRQYXRoLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsMCxuKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBQcml2YXRlIFN1YiBVblppcCgpCisgICAgICAgIC8vLyAgICAgRGltIGlucHV0RmlsZU5hbWUgQXMgU3RyaW5nID0gIk15QXJjaGl2ZS56aXAiCisgICAgICAgIC8vLyAgICAgRGltIGV4dHJhY3REaXIgQXMgU3RyaW5nID0gImV4dHJhY3QiCisgICAgICAgIC8vLyAgICAgRGltIGJ1ZmZlciBBcyBCeXRlKCkgPSBOZXcgQnl0ZSgyMDQ4KSB7fQorICAgICAgICAvLy8gICAgIFVzaW5nIHJhdyBBcyBGaWxlU3RyZWFtID0gRmlsZS5PcGVuKGlucHV0RmlsZU5hbWUsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCkKKyAgICAgICAgLy8vICAgICAgICAgVXNpbmcgaW5wdXQgQXMgWmlwSW5wdXRTdHJlYW0gPSBOZXcgWmlwSW5wdXRTdHJlYW0ocmF3KQorICAgICAgICAvLy8gICAgICAgICAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICAgICAgICAgIERvIFdoaWxlIChOb3QgZSA9IGlucHV0LkdldE5leHRFbnRyeSBJcyBOb3RoaW5nKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIElmIE5vdCBlLklzRGlyZWN0b3J5IFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgVXNpbmcgb3V0cHV0IEFzIEZpbGVTdHJlYW0gPSBGaWxlLk9wZW4oUGF0aC5Db21iaW5lKGV4dHJhY3REaXIsIGUuRmlsZU5hbWUpLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBEaW0gbiBBcyBJbnRlZ2VyCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBEbyBXaGlsZSAobiA9IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSA+IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKGJ1ZmZlciwgMCwgbikKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIExvb3AKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgRW5kIElmCisgICAgICAgIC8vLyAgICAgICAgICAgICBMb29wCisgICAgICAgIC8vLyAgICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gRW5kIFN1YgorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICBwdWJsaWMgWmlwSW5wdXRTdHJlYW0oU3RyZWFtIHN0cmVhbSkgIDogdGhpcyAoc3RyZWFtLCBmYWxzZSkgeyB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+WmlwSW5wdXRTdHJlYW08L2M+LCBnaXZlbiB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBjb25zdHJ1Y3RvciBvcGVucyBhIDxjPkZpbGVTdHJlYW08L2M+IGZvciB0aGUgZ2l2ZW4gemlwZmlsZSwgYW5kCisgICAgICAgIC8vLyAgIHdyYXBzIGEgPGM+WmlwSW5wdXRTdHJlYW08L2M+IGFyb3VuZCB0aGF0LiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKKyAgICAgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBJbnB1dFN0cmVhbShTdHJlYW0pIi8+IGNvbnN0cnVjdG9yIGZvciBmdWxsIGRldGFpbHMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoaWxlIHRoZSA8c2VlIGNyZWY9IlppcEZpbGUiLz4gY2xhc3MgaXMgZ2VuZXJhbGx5IGVhc2llcgorICAgICAgICAvLy8gICB0byB1c2UsIHRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhvc2UKKyAgICAgICAgLy8vICAgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byByZWFkIGZyb20gYSB6aXBmaWxlIGRpcmVjdGx5LAorICAgICAgICAvLy8gICB1c2luZyBhIDxzZWUgY3JlZj0iU3lzdGVtLklPLlN0cmVhbSIvPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGZpbGVzeXN0ZW0gZmlsZSB0byByZWFkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVhZCBhIHppcCBmaWxlLCBhbmQgZXh0cmFjdCBlbnRyaWVzLCB1c2luZyB0aGUKKyAgICAgICAgLy8vICAgPGM+WmlwSW5wdXRTdHJlYW08L2M+IGNsYXNzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBVbnppcCgpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgYnl0ZVtdIGJ1ZmZlcj0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgIC8vLyAgICAgaW50IG47CisgICAgICAgIC8vLyAgICAgdXNpbmcgKHZhciBpbnB1dD0gbmV3IFppcElucHV0U3RyZWFtKGlucHV0RmlsZU5hbWUpKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgWmlwRW50cnkgZTsKKyAgICAgICAgLy8vICAgICAgICAgd2hpbGUgKCggZSA9IGlucHV0LkdldE5leHRFbnRyeSgpKSAhPSBudWxsKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBpZiAoZS5Jc0RpcmVjdG9yeSkgY29udGludWU7CisgICAgICAgIC8vLyAgICAgICAgICAgICBzdHJpbmcgb3V0cHV0UGF0aCA9IFBhdGguQ29tYmluZShleHRyYWN0RGlyLCBlLkZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHVzaW5nICh2YXIgb3V0cHV0ID0gRmlsZS5PcGVuKG91dHB1dFBhdGgsIEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUoYnVmZmVyLDAsbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICB9CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFByaXZhdGUgU3ViIFVuWmlwKCkKKyAgICAgICAgLy8vICAgICBEaW0gaW5wdXRGaWxlTmFtZSBBcyBTdHJpbmcgPSAiTXlBcmNoaXZlLnppcCIKKyAgICAgICAgLy8vICAgICBEaW0gZXh0cmFjdERpciBBcyBTdHJpbmcgPSAiZXh0cmFjdCIKKyAgICAgICAgLy8vICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDIwNDgpIHt9CisgICAgICAgIC8vLyAgICAgVXNpbmcgaW5wdXQgQXMgWmlwSW5wdXRTdHJlYW0gPSBOZXcgWmlwSW5wdXRTdHJlYW0oaW5wdXRGaWxlTmFtZSkKKyAgICAgICAgLy8vICAgICAgICAgRGltIGUgQXMgWmlwRW50cnkKKyAgICAgICAgLy8vICAgICAgICAgRG8gV2hpbGUgKE5vdCBlID0gaW5wdXQuR2V0TmV4dEVudHJ5IElzIE5vdGhpbmcpCisgICAgICAgIC8vLyAgICAgICAgICAgICBJZiBOb3QgZS5Jc0RpcmVjdG9yeSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgVXNpbmcgb3V0cHV0IEFzIEZpbGVTdHJlYW0gPSBGaWxlLk9wZW4oUGF0aC5Db21iaW5lKGV4dHJhY3REaXIsIGUuRmlsZU5hbWUpLCBfCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgRGltIG4gQXMgSW50ZWdlcgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBEbyBXaGlsZSAobiA9IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSA+IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUoYnVmZmVyLCAwLCBuKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBMb29wCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgTG9vcAorICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gRW5kIFN1YgorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICBwdWJsaWMgWmlwSW5wdXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJlYW0gc3RyZWFtID0gRmlsZS5PcGVuKGZpbGVOYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQsIEZpbGVTaGFyZS5SZWFkICk7CisgICAgICAgICAgICBfSW5pdChzdHJlYW0sIGZhbHNlLCBmaWxlTmFtZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+WmlwSW5wdXRTdHJlYW08L2M+LCBleHBsaWNpdGx5IHNwZWNpZnlpbmcgd2hldGhlciB0bworICAgICAgICAvLy8gICBrZWVwIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBvcGVuLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcElucHV0U3RyZWFtKFN0cmVhbSkiPlppcElucHV0U3RyZWFtKFN0cmVhbSk8L3NlZT4KKyAgICAgICAgLy8vICAgY29uc3RydWN0b3IgZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGUgY2xhc3MsIGFuZCBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIGNsYXNzLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPgorICAgICAgICAvLy8gICBUaGUgc3RyZWFtIHRvIHJlYWQgZnJvbS4gSXQgbXVzdCBiZSByZWFkYWJsZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlYXZlT3BlbiI+CisgICAgICAgIC8vLyAgIHRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIHdvdWxkIGxpa2UgdGhlIHN0cmVhbQorICAgICAgICAvLy8gICB0byByZW1haW4gb3BlbiBhZnRlciB0aGUgPGM+WmlwSW5wdXRTdHJlYW08L2M+IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBaaXBJbnB1dFN0cmVhbShTdHJlYW0gc3RyZWFtLCBib29sIGxlYXZlT3BlbikKKyAgICAgICAgeworICAgICAgICAgICAgX0luaXQoc3RyZWFtLCBsZWF2ZU9wZW4sIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9Jbml0KFN0cmVhbSBzdHJlYW0sIGJvb2wgbGVhdmVPcGVuLCBzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0U3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgaWYgKCFfaW5wdXRTdHJlYW0uQ2FuUmVhZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJUaGUgc3RyZWFtIG11c3QgYmUgcmVhZGFibGUuIik7CisgICAgICAgICAgICBfY29udGFpbmVyPSBuZXcgWmlwQ29udGFpbmVyKHRoaXMpOworICAgICAgICAgICAgX3Byb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmcgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZygiSUJNNDM3Iik7CisgICAgICAgICAgICBfbGVhdmVVbmRlcmx5aW5nU3RyZWFtT3BlbiA9IGxlYXZlT3BlbjsKKyAgICAgICAgICAgIF9maW5kUmVxdWlyZWQ9IHRydWU7CisgICAgICAgICAgICBfbmFtZSA9IG5hbWUgPz8gIihzdHJlYW0pIjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PlByb3ZpZGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnN0YW5jZS48L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnN0YW5jZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZvcm1hdCAoIlppcElucHV0U3RyZWFtOjp7MH0obGVhdmVPcGVuKHsxfSkpKSIsIF9uYW1lLCBfbGVhdmVVbmRlcmx5aW5nU3RyZWFtT3Blbik7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIHRleHQgZW5jb2RpbmcgdG8gdXNlIHdoZW4gcmVhZGluZyBlbnRyaWVzIGludG8gdGhlIHppcCBhcmNoaXZlLCBmb3IKKyAgICAgICAgLy8vICAgdGhvc2UgZW50cmllcyB3aG9zZSBmaWxlbmFtZXMgb3IgY29tbWVudHMgY2Fubm90IGJlIGVuY29kZWQgd2l0aCB0aGUKKyAgICAgICAgLy8vICAgZGVmYXVsdCAoSUJNNDM3KSBlbmNvZGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJbiA8c2VlIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPml0cworICAgICAgICAvLy8gICB6aXAgc3BlY2lmaWNhdGlvbjwvc2VlPiwgUEtXYXJlIGRlc2NyaWJlcyB0d28gb3B0aW9ucyBmb3IgZW5jb2RpbmcKKyAgICAgICAgLy8vICAgZmlsZW5hbWVzIGFuZCBjb21tZW50czogdXNpbmcgSUJNNDM3IG9yIFVURi04LiAgQnV0LCBzb21lIGFyY2hpdmluZyB0b29scworICAgICAgICAvLy8gICBvciBsaWJyYXJpZXMgZG8gbm90IGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kIGluc3RlYWQgZW5jb2RlCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGNvZGUgcGFnZS4gIEZvciBleGFtcGxlLCBXaW5SQVIgd2hlbgorICAgICAgICAvLy8gICBydW4gb24gYSBtYWNoaW5lIGluIFNoYW5naGFpIG1heSBlbmNvZGUgZmlsZW5hbWVzIHdpdGggdGhlIEJpZy01IENoaW5lc2UKKyAgICAgICAgLy8vICAgKDk1MCkgY29kZSBwYWdlLiAgVGhpcyBiZWhhdmlvciBpcyBjb250cmFyeSB0byB0aGUgWmlwIHNwZWNpZmljYXRpb24sIGJ1dAorICAgICAgICAvLy8gICBpdCBvY2N1cnMgYW55d2F5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHVzaW5nIERvdE5ldFppcCB0byByZWFkIHppcCBhcmNoaXZlcyB0aGF0IHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgICAgICAvLy8gICBVVEYtOCBvciBJQk00MzcsIHNldCB0aGlzIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGNvZGUgcGFnZSB0byB1c2Ugd2hlbgorICAgICAgICAvLy8gICByZWFkaW5nIGVuY29kZWQgZmlsZW5hbWVzIGFuZCBjb21tZW50cyBmb3IgZWFjaCA8Yz5aaXBFbnRyeTwvYz4gaW4gdGhlIHppcAorICAgICAgICAvLy8gICBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IGlzICJwcm92aXNpb25hbCIuIFdoZW4gdGhlIGVudHJ5IGluIHRoZSB6aXAgYXJjaGl2ZSBpcyBub3QKKyAgICAgICAgLy8vICAgZXhwbGljaXRseSBtYXJrZWQgYXMgdXNpbmcgVVRGLTgsIHRoZW4gSUJNNDM3IGlzIHVzZWQgdG8gZGVjb2RlIGZpbGVuYW1lcworICAgICAgICAvLy8gICBhbmQgY29tbWVudHMuIElmIGEgbG9zcyBvZiBkYXRhIHdvdWxkIHJlc3VsdCBmcm9tIHVzaW5nIElCTTQzNiAtCisgICAgICAgIC8vLyAgIHNwZWNpZmljYWxseSB3aGVuIGVuY29kaW5nIGFuZCBkZWNvZGluZyBpcyBub3QgcmVmbGV4aXZlIC0gdGhlIGNvZGVwYWdlCisgICAgICAgIC8vLyAgIHNwZWNpZmllZCBoZXJlIGlzIHVzZWQuIEl0IGlzIHBvc3NpYmxlLCB0aGVyZWZvcmUsIHRvIGhhdmUgYSBnaXZlbiBlbnRyeQorICAgICAgICAvLy8gICB3aXRoIGEgPGM+Q29tbWVudDwvYz4gZW5jb2RlZCBpbiBJQk00MzcgYW5kIGEgPGM+RmlsZU5hbWU8L2M+IGVuY29kZWQgd2l0aAorICAgICAgICAvLy8gICB0aGUgc3BlY2lmaWVkICJwcm92aXNpb25hbCIgY29kZXBhZ2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gYSB6aXAgZmlsZSB1c2VzIGFuIGFyYml0cmFyeSwgbm9uLVVURjggY29kZSBwYWdlIGZvciBlbmNvZGluZywgdGhlcmUKKyAgICAgICAgLy8vICAgaXMgbm8gc3RhbmRhcmQgd2F5IGZvciB0aGUgcmVhZGVyIGFwcGxpY2F0aW9uIC0gd2hldGhlciBEb3ROZXRaaXAsIFdpblppcCwKKyAgICAgICAgLy8vICAgV2luUmFyLCBvciBzb21ldGhpbmcgZWxzZSAtIHRvIGtub3cgd2hpY2ggY29kZXBhZ2UgaGFzIGJlZW4gdXNlZCBmb3IgdGhlCisgICAgICAgIC8vLyAgIGVudHJpZXMuIFJlYWRlcnMgb2YgemlwIGZpbGVzIGFyZSBub3QgYWJsZSB0byBpbnNwZWN0IHRoZSB6aXAgZmlsZSBhbmQKKyAgICAgICAgLy8vICAgZGV0ZXJtaW5lIHRoZSBjb2RlcGFnZSB0aGF0IHdhcyB1c2VkIGZvciB0aGUgZW50cmllcyBjb250YWluZWQgd2l0aGluIGl0LgorICAgICAgICAvLy8gICBJdCBpcyBsZWZ0IHRvIHRoZSBhcHBsaWNhdGlvbiBvciB1c2VyIHRvIGRldGVybWluZSB0aGUgbmVjZXNzYXJ5IGNvZGVwYWdlCisgICAgICAgIC8vLyAgIHdoZW4gcmVhZGluZyB6aXAgZmlsZXMgZW5jb2RlZCB0aGlzIHdheS4gIElmIHlvdSB1c2UgYW4gaW5jb3JyZWN0IGNvZGVwYWdlCisgICAgICAgIC8vLyAgIHdoZW4gcmVhZGluZyBhIHppcGZpbGUsIHlvdSB3aWxsIGdldCBlbnRyaWVzIHdpdGggZmlsZW5hbWVzIHRoYXQgYXJlCisgICAgICAgIC8vLyAgIGluY29ycmVjdCwgYW5kIHRoZSBpbmNvcnJlY3QgZmlsZW5hbWVzIG1heSBldmVuIGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0CisgICAgICAgIC8vLyAgIGFyZSBub3QgbGVnYWwgZm9yIHVzZSB3aXRoaW4gZmlsZW5hbWVzIGluIFdpbmRvd3MuIEV4dHJhY3RpbmcgZW50cmllcyB3aXRoCisgICAgICAgIC8vLyAgIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgZmlsZW5hbWVzIHdpbGwgbGVhZCB0byBleGNlcHRpb25zLiBJdCdzIHRvbyBiYWQsCisgICAgICAgIC8vLyAgIGJ1dCB0aGlzIGlzIGp1c3QgdGhlIHdheSB0aGluZ3MgYXJlIHdpdGggY29kZSBwYWdlcyBpbiB6aXAgZmlsZXMuIENhdmVhdAorICAgICAgICAvLy8gICBFbXB0b3IuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Byb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNpemUgb2YgdGhlIHdvcmsgYnVmZmVyIHRvIHVzZSBmb3IgdGhlIFpMSUIgY29kZWMgZHVyaW5nIGRlY29tcHJlc3Npb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFNldHRpbmcgdGhpcyBhZmZlY3RzIHRoZSBwZXJmb3JtYW5jZSBhbmQgbWVtb3J5IGVmZmljaWVuY3kgb2YgY29tcHJlc3Npb24KKyAgICAgICAgLy8vICAgYW5kIGRlY29tcHJlc3Npb24uICBGb3IgbGFyZ2VyIGZpbGVzLCBzZXR0aW5nIHRoaXMgdG8gYSBsYXJnZXIgc2l6ZSBtYXkKKyAgICAgICAgLy8vICAgaW1wcm92ZSBwZXJmb3JtYW5jZSwgYnV0IHRoZSBleGFjdCBudW1iZXJzIHZhcnkgZGVwZW5kaW5nIG9uIGF2YWlsYWJsZQorICAgICAgICAvLy8gICBtZW1vcnksIGFuZCBhIGJ1bmNoIG9mIG90aGVyIHZhcmlhYmxlcy4gSSBkb24ndCBoYXZlIGdvb2QgZmlybQorICAgICAgICAvLy8gICByZWNvbW1lbmRhdGlvbnMgb24gaG93IHRvIHNldCBpdC4gIFlvdSdsbCBoYXZlIHRvIHRlc3QgaXQgeW91cnNlbGYuIE9yCisgICAgICAgIC8vLyAgIGp1c3QgbGVhdmUgaXQgYWxvbmUgYW5kIGFjY2VwdCB0aGUgZGVmYXVsdC4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGludCBDb2RlY0J1ZmZlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNldHMgdGhlIHBhc3N3b3JkIHRvIGJlIHVzZWQgb24gdGhlIDxjPlppcElucHV0U3RyZWFtPC9jPiBpbnN0YW5jZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGEgemlwIGFyY2hpdmUsIHRoaXMgcGFzc3dvcmQgaXMgdXNlZCB0byByZWFkIGFuZCBkZWNyeXB0IHRoZQorICAgICAgICAvLy8gICBlbnRyaWVzIHRoYXQgYXJlIGVuY3J5cHRlZCB3aXRoaW4gdGhlIHppcCBmaWxlLiBXaGVuIGVudHJpZXMgd2l0aGluIGEgemlwCisgICAgICAgIC8vLyAgIGZpbGUgdXNlIGRpZmZlcmVudCBwYXNzd29yZHMsIHNldCB0aGUgYXBwcm9wcmlhdGUgcGFzc3dvcmQgZm9yIHRoZSBlbnRyeQorICAgICAgICAvLy8gICBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gPGM+UmVhZCgpPC9jPiBmb3IgZWFjaCBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiByZWFkaW5nIGFuIGVudHJ5IHRoYXQgaXMgbm90IGVuY3J5cHRlZCwgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMKKyAgICAgICAgLy8vICAgaWdub3JlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgdXNlcyB0aGUgWmlwSW5wdXRTdHJlYW0gdG8gcmVhZCBhbmQgZXh0cmFjdCBlbnRyaWVzIGZyb20gYQorICAgICAgICAvLy8gICB6aXAgZmlsZSwgdXNpbmcgYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQgcGFzc3dvcmQgZm9yIGVhY2ggZW50cnkuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iQyMiPgorICAgICAgICAvLy8gYnl0ZVtdIGJ1ZmZlcj0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgIC8vLyBpbnQgbjsKKyAgICAgICAgLy8vIHVzaW5nICh2YXIgcmF3ID0gRmlsZS5PcGVuKF9pbnB1dEZpbGVOYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQgKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAodmFyIGlucHV0PSBuZXcgWmlwSW5wdXRTdHJlYW0ocmF3KSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIFppcEVudHJ5IGU7CisgICAgICAgIC8vLyAgICAgICAgIHdoaWxlICgoIGUgPSBpbnB1dC5HZXROZXh0RW50cnkoKSkgIT0gbnVsbCkKKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgaW5wdXQuUGFzc3dvcmQgPSBQYXNzd29yZEZvckVudHJ5KGUuRmlsZU5hbWUpOworICAgICAgICAvLy8gICAgICAgICAgICAgaWYgKGUuSXNEaXJlY3RvcnkpIGNvbnRpbnVlOworICAgICAgICAvLy8gICAgICAgICAgICAgc3RyaW5nIG91dHB1dFBhdGggPSBQYXRoLkNvbWJpbmUoX2V4dHJhY3REaXIsIGUuRmlsZU5hbWUpOworICAgICAgICAvLy8gICAgICAgICAgICAgdXNpbmcgKHZhciBvdXRwdXQgPSBGaWxlLk9wZW4ob3V0cHV0UGF0aCwgRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSkpCisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgd2hpbGUgKChuPSBpbnB1dC5SZWFkKGJ1ZmZlciwwLGJ1ZmZlci5MZW5ndGgpKSA+IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUoYnVmZmVyLDAsbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICB9CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgcHVibGljIFN0cmluZyBQYXNzd29yZAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Nsb3NlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX1Bhc3N3b3JkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXR1cFN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNlZWsgdG8gdGhlIGNvcnJlY3QgcG9zbiBpbiB0aGUgZmlsZSwgYW5kIG9wZW4gYQorICAgICAgICAgICAgLy8gc3RyZWFtIHRoYXQgY2FuIGJlIHJlYWQuCisgICAgICAgICAgICBfY3JjU3RyZWFtPSBfY3VycmVudEVudHJ5LkludGVybmFsT3BlblJlYWRlcihfUGFzc3dvcmQpOworICAgICAgICAgICAgX0xlZnRUb1JlYWQgPSBfY3JjU3RyZWFtLkxlbmd0aDsKKyAgICAgICAgICAgIF9uZWVkU2V0dXAgPSBmYWxzZTsKKyAgICAgICAgfQorCisKKworICAgICAgICBpbnRlcm5hbCBTdHJlYW0gUmVhZFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0U3RyZWFtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgc3RyZWFtIGludG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgZGF0YSBmb3IgdGhlIHppcGVudHJ5IHdpbGwgYmUgZGVjcnlwdGVkIGFuZCB1bmNvbXByZXNzZWQsIGFzCisgICAgICAgIC8vLyAgIG5lY2Vzc2FyeSwgYmVmb3JlIGJlaW5nIGNvcGllZCBpbnRvIHRoZSBidWZmZXIuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFlvdSBtdXN0IHNldCB0aGUgPHNlZSBjcmVmPSJQYXNzd29yZCIvPiBwcm9wZXJ0eSBiZWZvcmUgY2FsbGluZworICAgICAgICAvLy8gICA8Yz5SZWFkKCk8L2M+IHRoZSBmaXJzdCB0aW1lIGZvciBhbiBlbmNyeXB0ZWQgZW50cnkuICBUbyBkZXRlcm1pbmUgaWYgYW4KKyAgICAgICAgLy8vICAgZW50cnkgaXMgZW5jcnlwdGVkIGFuZCByZXF1aXJlcyBhIHBhc3N3b3JkLCBjaGVjayB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5FbmNyeXB0aW9uIj5aaXBFbnRyeS5FbmNyeXB0aW9uPC9zZWU+IHByb3BlcnR5LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSByZWFkIGZyb20gdGhlIHN0cmVhbS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBmaXJzdCBieXRlIHJlYWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+dGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIGFmdGVyIGRlY3J5cHRpb24gYW5kIGRlY29tcHJlc3Npb24uPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Nsb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZXhjZXB0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9uZWVkU2V0dXApCisgICAgICAgICAgICAgICAgU2V0dXBTdHJlYW0oKTsKKworICAgICAgICAgICAgaWYgKF9MZWZ0VG9SZWFkID09IDApIHJldHVybiAwOworCisgICAgICAgICAgICBpbnQgbGVuID0gKF9MZWZ0VG9SZWFkID4gY291bnQpID8gY291bnQgOiAoaW50KV9MZWZ0VG9SZWFkOworICAgICAgICAgICAgaW50IG4gPSBfY3JjU3RyZWFtLlJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbik7CisKKyAgICAgICAgICAgIF9MZWZ0VG9SZWFkIC09IG47CisKKyAgICAgICAgICAgIGlmIChfTGVmdFRvUmVhZCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBDcmNSZXN1bHQgPSBfY3JjU3RyZWFtLkNyYzsKKyAgICAgICAgICAgICAgICBfY3VycmVudEVudHJ5LlZlcmlmeUNyY0FmdGVyRXh0cmFjdChDcmNSZXN1bHQpOworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5TZWVrKF9lbmRPZkVudHJ5LCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgICAgIFNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgoX2lucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZWFkIHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIENhbGwgdGhpcyBtZXRob2QganVzdCBiZWZvcmUgY2FsbGluZyA8c2VlIGNyZWY9IlJlYWQoYnl0ZVtdLCBpbnQsIGludCkiLz4sCisgICAgICAgIC8vLyAgIHRvIHBvc2l0aW9uIHRoZSBwb2ludGVyIGluIHRoZSB6aXAgZmlsZSB0byB0aGUgbmV4dCBlbnRyeSB0aGF0IGNhbiBiZQorICAgICAgICAvLy8gICByZWFkLiAgU3Vic2VxdWVudCBjYWxscyB0byA8Yz5SZWFkKCk8L2M+LCB3aWxsIGRlY3J5cHQgYW5kIGRlY29tcHJlc3MgdGhlCisgICAgICAgIC8vLyAgIGRhdGEgaW4gdGhlIHppcCBmaWxlLCB1bnRpbCA8Yz5SZWFkKCk8L2M+IHJldHVybnMgMC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRWFjaCB0aW1lIHlvdSBjYWxsIDxjPkdldE5leHRFbnRyeSgpPC9jPiwgdGhlIHBvaW50ZXIgaW4gdGhlIHdyYXBwZWQKKyAgICAgICAgLy8vICAgc3RyZWFtIGlzIG1vdmVkIHRvIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB6aXAgZmlsZS4gIElmIHlvdSBjYWxsIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU2Vlayhsb25nLCBTZWVrT3JpZ2luKSIvPiwgYW5kIHRodXMgcmUtcG9zaXRpb24gdGhlIHBvaW50ZXIgd2l0aGluCisgICAgICAgIC8vLyAgIHRoZSBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgPGM+R2V0TmV4dEVudHJ5KCk8L2M+IGFnYWluLCB0byBpbnN1cmUKKyAgICAgICAgLy8vICAgdGhhdCB0aGUgZmlsZSBwb2ludGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHppcCBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgPGM+WmlwRW50cnk8L2M+LiBVc2luZyBhIHN0cmVhbSBhcHByb2FjaCwgeW91IHdpbGwKKyAgICAgICAgLy8vICAgcmVhZCB0aGUgcmF3IGJ5dGVzIGZvciBhbiBlbnRyeSBpbiBhIHppcCBmaWxlIHZpYSBjYWxscyB0byA8Yz5SZWFkKCk8L2M+LgorICAgICAgICAvLy8gICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGV4dHJhY3QgYW4gZW50cnkgaW50byBhIGZpbGUsIG9yIGEgc3RyZWFtLCBieQorICAgICAgICAvLy8gICBjYWxsaW5nIDxzZWUgY3JlZj0iWmlwRW50cnkuRXh0cmFjdCgpIi8+LCBvciBvbmUgb2YgaXRzIHNpYmxpbmdzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIDxjPlppcEVudHJ5PC9jPiByZWFkLiBSZXR1cm5zIG51bGwgKG9yIE5vdGhpbmcgaW4gVkIpIGlmIHRoZXJlIGFyZSBubyBtb3JlCisgICAgICAgIC8vLyAgIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICAvLy8KKyAgICAgICAgcHVibGljIFppcEVudHJ5IEdldE5leHRFbnRyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZmluZFJlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG5leHQgc2lnbmF0dXJlCisgICAgICAgICAgICAgICAgbG9uZyBkID0gU2hhcmVkVXRpbGl0aWVzLkZpbmRTaWduYXR1cmUoX2lucHV0U3RyZWFtLCBaaXBDb25zdGFudHMuWmlwRW50cnlTaWduYXR1cmUpOworICAgICAgICAgICAgICAgIGlmIChkID09IC0xKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBiYWNrIHVwIDQgYnl0ZXM6IFJlYWRFbnRyeSBhc3N1bWVzIHRoZSBmaWxlIHBvaW50ZXIgaXMgcG9zaXRpb25lZCBiZWZvcmUgdGhlIGVudHJ5IHNpZ25hdHVyZQorICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5TZWVrKC00LCBTZWVrT3JpZ2luLkN1cnJlbnQpOworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICAgICAgU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChfaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTA5MjMKKyAgICAgICAgICAgIGVsc2UgaWYgKF9maXJzdEVudHJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIGFscmVhZHkgcmVhZCBvbmUgZW50cnkuCisgICAgICAgICAgICAgICAgLy8gU2VlayB0byB0aGUgZW5kIG9mIGl0LgorICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5TZWVrKF9lbmRPZkVudHJ5LCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICBTaGFyZWRVdGlsaXRpZXMuV29ya2Fyb3VuZF9MYWR5YnVnMzE4OTE4KF9pbnB1dFN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9jdXJyZW50RW50cnkgPSBaaXBFbnRyeS5SZWFkRW50cnkoX2NvbnRhaW5lciwgIV9maXJzdEVudHJ5KTsKKyAgICAgICAgICAgIC8vIFJlYWRFbnRyeSBsZWF2ZXMgdGhlIGZpbGUgcG9zaXRpb24gYWZ0ZXIgYWxsIHRoZSBlbnRyeQorICAgICAgICAgICAgLy8gZGF0YSBhbmQgdGhlIG9wdGlvbmFsIGJpdC0zIGRhdGEgZGVzY3JpcHRwci4gIFRoaXMgaXMKKyAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBuZXh0IGVudHJ5IHdvdWxkIG5vcm1hbGx5IHN0YXJ0LgorICAgICAgICAgICAgX2VuZE9mRW50cnkgPSBfaW5wdXRTdHJlYW0uUG9zaXRpb247CisgICAgICAgICAgICBfZmlyc3RFbnRyeSA9IHRydWU7CisgICAgICAgICAgICBfbmVlZFNldHVwID0gdHJ1ZTsKKyAgICAgICAgICAgIF9maW5kUmVxdWlyZWQ9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50RW50cnk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRGlzcG9zZSB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIGRpc3Bvc2VzIHRoZSBaaXBJbnB1dFN0cmVhbS4gIEl0IG1heSBhbHNvIGNsb3NlIHRoZQorICAgICAgICAvLy8gICB1bmRlcmx5aW5nIHN0cmVhbSwgZGVwZW5kaW5nIG9uIHdoaWNoIGNvbnN0cnVjdG9yIHdhcyB1c2VkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUeXBpY2FsbHkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCA8Yz5EaXNwb3NlKCk8L2M+IGltcGxpY2l0bHksIHZpYQorICAgICAgICAvLy8gICBhIDxjPnVzaW5nPC9jPiBzdGF0ZW1lbnQgaW4gQyMsIG9yIGEgPGM+VXNpbmc8L2M+IHN0YXRlbWVudCBpbiBWQi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIEFwcGxpY2F0aW9uIGNvZGUgd29uJ3QgY2FsbCB0aGlzIGNvZGUgZGlyZWN0bHkuICBUaGlzIG1ldGhvZCBtYXkKKyAgICAgICAgLy8vICAgICBiZSBpbnZva2VkIGluIHR3byBkaXN0aW5jdCBzY2VuYXJpb3MuICBJZiBkaXNwb3NpbmcgPT0gdHJ1ZSwgdGhlCisgICAgICAgIC8vLyAgICAgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5IGEgdXNlcidzIGNvZGUsCisgICAgICAgIC8vLyAgICAgZm9yIGV4YW1wbGUgdmlhIHRoZSBwdWJsaWMgRGlzcG9zZSgpIG1ldGhvZC4gSW4gdGhpcyBjYXNlLCBib3RoCisgICAgICAgIC8vLyAgICAgbWFuYWdlZCBhbmQgdW5tYW5hZ2VkIHJlc291cmNlcyBjYW4gYmUgcmVmZXJlbmNlZCBhbmQgZGlzcG9zZWQuCisgICAgICAgIC8vLyAgICAgSWYgZGlzcG9zaW5nID09IGZhbHNlLCB0aGUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBieSB0aGUgcnVudGltZQorICAgICAgICAvLy8gICAgIGZyb20gaW5zaWRlIHRoZSBvYmplY3QgZmluYWxpemVyIGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgbm90CisgICAgICAgIC8vLyAgICAgcmVmZXJlbmNlIG90aGVyIG9iamVjdHM7IGluIHRoYXQgY2FzZSBvbmx5IHVubWFuYWdlZCByZXNvdXJjZXMKKyAgICAgICAgLy8vICAgICBtdXN0IGJlIHJlZmVyZW5jZWQgb3IgZGlzcG9zZWQuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlzcG9zaW5nIj4KKyAgICAgICAgLy8vICAgdHJ1ZSBpZiB0aGUgRGlzcG9zZSBtZXRob2Qgd2FzIGludm9rZWQgYnkgdXNlciBjb2RlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbG9zZWQpIHJldHVybjsKKworICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykgLy8gbm90IGNhbGxlZCBmcm9tIGZpbmFsaXplcgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdoZW4gWmlwSW5wdXRTdHJlYW0gaXMgdXNlZCB3aXRoaW4gYSB1c2luZyBjbGF1c2UsIGFuZCBhbgorICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIENsb3NlKCkgaXMgaW52b2tlZC4gIEJ1dCB3ZSBkb24ndCB3YW50IHRvCisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHdyaXRlIGFueXRoaW5nIGluIHRoYXQgY2FzZS4gIEV2ZW50dWFsbHkgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgaWYgKF9leGNlcHRpb25QZW5kaW5nKSByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAoIV9sZWF2ZVVuZGVybHlpbmdTdHJlYW1PcGVuKQorICAgICAgICAgICAgICAgIHsKKyNpZiBORVRDRgorICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY2xvc2VkPSB0cnVlOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkICB7IGdldCB7IHJldHVybiB0cnVlOyB9fQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIDxjPkNhblNlZWs8L2M+IGZvciB0aGUgdW5kZXJseWluZyAod3JhcHBlZCkgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5TZWVrICB7IGdldCB7IHJldHVybiBfaW5wdXRTdHJlYW0uQ2FuU2VlazsgfSB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGggICB7IGdldCB7IHJldHVybiBfaW5wdXRTdHJlYW0uTGVuZ3RoOyB9fQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgb3Igc2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBTZXR0aW5nIHRoZSBwb3NpdGlvbiBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgPGM+U2Vlayh2YWx1ZSwgU2Vla09yaWdpbi5CZWdpbik8L2M+LgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lucHV0U3RyZWFtLlBvc2l0aW9uO30KKyAgICAgICAgICAgIHNldCB7IFNlZWsodmFsdWUsIFNlZWtPcmlnaW4uQmVnaW4pOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGlzIGEgbm8tb3AuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRmx1c2giKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPmlnbm9yZWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+aWdub3JlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPmlnbm9yZWQ8L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIldyaXRlIik7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2Qgc2Vla3MgaW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIENhbGwgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8gc2VlayBhcm91bmQgd2l0aGluIHRoZSB6aXAgZmlsZSBmb3IgcmFuZG9tIGFjY2Vzcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQXBwbGljYXRpb25zIGNhbiBpbnRlcm1peCBjYWxscyB0byA8Yz5TZWVrKCk8L2M+IHdpdGggY2FsbHMgdG8gPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJHZXROZXh0RW50cnkoKSIvPi4gIEFmdGVyIGEgY2FsbCB0byA8Yz5TZWVrKCk8L2M+LAorICAgICAgICAvLy8gICA8Yz5HZXROZXh0RW50cnkoKTwvYz4gd2lsbCBnZXQgdGhlIG5leHQgPGM+WmlwRW50cnk8L2M+IHRoYXQgZmFsbHMgYWZ0ZXIKKyAgICAgICAgLy8vICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbS4gWW91J3JlIG9uIHlvdXIgb3duIGZvciBmaW5kaW5nCisgICAgICAgIC8vLyAgIG91dCBqdXN0IHdoZXJlIHRvIHNlZWsgaW4gdGhlIHN0cmVhbSwgdG8gZ2V0IHRvIHRoZSB2YXJpb3VzIGVudHJpZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoZSBvZmZzZXQgcG9pbnQgdG8gc2VlayB0bzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj50aGUgcmVmZXJlbmNlIHBvaW50IGZyb20gd2hpY2ggdG8gc2VlazwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbmV3IHBvc2l0aW9uPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTZWVrT3JpZ2luIG9yaWdpbikKKyAgICAgICAgeworICAgICAgICAgICAgX2ZpbmRSZXF1aXJlZD0gdHJ1ZTsKKyAgICAgICAgICAgIHZhciB4ID0gX2lucHV0U3RyZWFtLlNlZWsob2Zmc2V0LCBvcmlnaW4pOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgIFNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgoX2lucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+aWdub3JlZDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uVGV4dC5FbmNvZGluZyBfcHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZzsKKyAgICAgICAgcHJpdmF0ZSBaaXBFbnRyeSBfY3VycmVudEVudHJ5OworICAgICAgICBwcml2YXRlIGJvb2wgX2ZpcnN0RW50cnk7CisgICAgICAgIHByaXZhdGUgYm9vbCBfbmVlZFNldHVwOworICAgICAgICBwcml2YXRlIFppcENvbnRhaW5lciBfY29udGFpbmVyOworICAgICAgICBwcml2YXRlIENyY0NhbGN1bGF0b3JTdHJlYW0gX2NyY1N0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfTGVmdFRvUmVhZDsKKyAgICAgICAgaW50ZXJuYWwgU3RyaW5nIF9QYXNzd29yZDsKKyAgICAgICAgcHJpdmF0ZSBJbnQ2NCBfZW5kT2ZFbnRyeTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX25hbWU7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9sZWF2ZVVuZGVybHlpbmdTdHJlYW1PcGVuOworICAgICAgICBwcml2YXRlIGJvb2wgX2Nsb3NlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9maW5kUmVxdWlyZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfZXhjZXB0aW9uUGVuZGluZzsKKyAgICB9CisKKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwT3V0cHV0U3RyZWFtLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwT3V0cHV0U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzE2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9aaXBPdXRwdXRTdHJlYW0uY3MKQEAgLTAsMCArMSwxODE4IEBACisvLyBaaXBPdXRwdXRTdHJlYW0uY3MKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDkgRGlubyBDaGllc2EuCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKToKKy8vIFRpbWUtc3RhbXA6IDwyMDExLUp1bHktMjggMDY6MzQ6MzA+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgWmlwT3V0cHV0U3RyZWFtIGNsYXNzLCB3aGljaCBpcyBhIHN0cmVhbSBtZXRhcGhvciBmb3IKKy8vIGdlbmVyYXRpbmcgemlwIGZpbGVzLiAgVGhpcyBjbGFzcyBkb2VzIG5vdCBkZXBlbmQgb24gSW9uaWMuWmlwLlppcEZpbGUsIGJ1dCByYXRoZXIKKy8vIHN0YW5kcyBhbG9uZ3NpZGUgaXQgYXMgYW4gYWx0ZXJuYXRpdmUgImNvbnRhaW5lciIgZm9yIFppcEVudHJ5LiAgSXQgcmVwbGljYXRlcyBhCisvLyBzdWJzZXQgb2YgdGhlIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aGVzZToKKy8vCisvLyAgLSBDb21tZW50CisvLyAgLSBFbmNyeXB0aW9uCisvLyAgLSBQYXNzd29yZAorLy8gIC0gQ29kZWNCdWZmZXJTaXplCisvLyAgLSBDb21wcmVzc2lvbkxldmVsCisvLyAgLSBDb21wcmVzc2lvbk1ldGhvZAorLy8gIC0gRW5hYmxlWmlwNjQgKFVzZVppcDY0V2hlblNhdmluZykKKy8vICAtIElnbm9yZUNhc2UgKCFDYXNlU2Vuc2l0aXZlUmV0cmlldmFsKQorLy8KKy8vIEl0IGFkZHMgdGhlc2Ugbm92ZWwgbWV0aG9kczoKKy8vCisvLyAgLSBQdXROZXh0RW50cnkKKy8vCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBJb25pYy5aaXA7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIFByb3ZpZGVzIGEgc3RyZWFtIG1ldGFwaG9yIGZvciBnZW5lcmF0aW5nIHppcCBmaWxlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhpcyBjbGFzcyB3cml0ZXMgemlwIGZpbGVzLCBhcyBkZWZpbmVkIGluIHRoZSA8c2VlCisgICAgLy8vICAgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+c3BlY2lmaWNhdGlvbgorICAgIC8vLyAgIGZvciB6aXAgZmlsZXMgZGVzY3JpYmVkIGJ5IFBLV2FyZTwvc2VlPi4gIFRoZSBjb21wcmVzc2lvbiBmb3IgdGhpcworICAgIC8vLyAgIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIGJ5IGEgbWFuYWdlZC1jb2RlIHZlcnNpb24gb2YgWmxpYiwgaW5jbHVkZWQgd2l0aAorICAgIC8vLyAgIERvdE5ldFppcCBpbiB0aGUgY2xhc3NlcyBpbiB0aGUgSW9uaWMuWmxpYiBuYW1lc3BhY2UuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBwcm9ncmFtbWluZyBtb2RlbCB0byB0aGUgb25lIGVuYWJsZWQgYnkgdGhlCisgICAgLy8vICAgPHNlZSBjcmVmPSJaaXBGaWxlIi8+IGNsYXNzLiBVc2UgdGhpcyB3aGVuIGNyZWF0aW5nIHppcCBmaWxlcywgYXMgYW4KKyAgICAvLy8gICBhbHRlcm5hdGl2ZSB0byB0aGUgPHNlZSBjcmVmPSJaaXBGaWxlIi8+IGNsYXNzLCB3aGVuIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBhCisgICAgLy8vICAgPGM+U3RyZWFtPC9jPiB0eXBlIHRvIHdyaXRlIHRoZSB6aXAgZmlsZS4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBCb3RoIHRoZSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGNsYXNzIGFuZCB0aGUgPGM+WmlwRmlsZTwvYz4gY2xhc3MgY2FuIGJlIHVzZWQKKyAgICAvLy8gICB0byBjcmVhdGUgemlwIGZpbGVzLiBCb3RoIG9mIHRoZW0gc3VwcG9ydCBtYW55IG9mIHRoZSBjb21tb24gemlwIGZlYXR1cmVzLAorICAgIC8vLyAgIGluY2x1ZGluZyBVbmljb2RlLCBkaWZmZXJlbnQgY29tcHJlc3Npb24gbGV2ZWxzLCBhbmQgWklQNjQuICAgVGhleSBwcm92aWRlCisgICAgLy8vICAgdmVyeSBzaW1pbGFyIHBlcmZvcm1hbmNlIHdoZW4gY3JlYXRpbmcgemlwIGZpbGVzLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFRoZSA8Yz5aaXBGaWxlPC9jPiBjbGFzcyBpcyBnZW5lcmFsbHkgZWFzaWVyIHRvIHVzZSB0aGFuCisgICAgLy8vICAgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBoaWdoZXItbGV2ZWwgaW50ZXJmYWNlLiAgRm9yCisgICAgLy8vICAgZXhhbXBsZSwgd2hlbiBjcmVhdGluZyBhIHppcCBmaWxlIHZpYSBjYWxscyB0byB0aGUgPGM+UHV0TmV4dEVudHJ5KCk8L2M+IGFuZAorICAgIC8vLyAgIDxjPldyaXRlKCk8L2M+IG1ldGhvZHMgb24gdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gY2xhc3MsIHRoZSBjYWxsZXIgaXMKKyAgICAvLy8gICByZXNwb25zaWJsZSBmb3Igb3BlbmluZyB0aGUgZmlsZSwgcmVhZGluZyB0aGUgYnl0ZXMgZnJvbSB0aGUgZmlsZSwgd3JpdGluZworICAgIC8vLyAgIHRob3NlIGJ5dGVzIGludG8gdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4sIHNldHRpbmcgdGhlIGF0dHJpYnV0ZXMgb24gdGhlCisgICAgLy8vICAgPGM+WmlwRW50cnk8L2M+LCBhbmQgc2V0dGluZyB0aGUgY3JlYXRlZCwgbGFzdCBtb2RpZmllZCwgYW5kIGxhc3QgYWNjZXNzZWQKKyAgICAvLy8gICB0aW1lc3RhbXBzIG9uIHRoZSB6aXAgZW50cnkuIEFsbCBvZiB0aGVzZSB0aGluZ3MgYXJlIGRvbmUgYXV0b21hdGljYWxseSBieSBhCisgICAgLy8vICAgY2FsbCB0byA8c2VlIGNyZWY9IlppcEZpbGUuQWRkRmlsZShzdHJpbmcsc3RyaW5nKSI+WmlwRmlsZS5BZGRGaWxlKCk8L3NlZT4uCisgICAgLy8vICAgRm9yIHRoaXMgcmVhc29uLCB0aGUgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiBpcyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgZm9yIHVzZQorICAgIC8vLyAgIG9ubHkgd2hlbiB5b3VyIGFwcGxpY2F0aW9uIGVtaXRzIGFyYml0cmFyeSBkYXRhLCBub3QgbmVjZXNzYXJpbHkgZGF0YSBmcm9tIGEKKyAgICAvLy8gICBmaWxlc3lzdGVtIGZpbGUsIGRpcmVjdGx5IGludG8gYSB6aXAgZmlsZSwgYW5kIGRvZXMgc28gdXNpbmcgYSA8Yz5TdHJlYW08L2M+CisgICAgLy8vICAgbWV0YXBob3IuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgQXNpZGUgZnJvbSB0aGUgZGlmZmVyZW5jZXMgaW4gcHJvZ3JhbW1pbmcgbW9kZWwsIHRoZXJlIGFyZSBvdGhlcgorICAgIC8vLyAgIGRpZmZlcmVuY2VzIGluIGNhcGFiaWxpdHkgYmV0d2VlbiB0aGUgdHdvIGNsYXNzZXMuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPGxpc3QgdHlwZT0iYnVsbGV0Ij4KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIDxjPlppcEZpbGU8L2M+IGNhbiBiZSB1c2VkIHRvIHJlYWQgYW5kIGV4dHJhY3QgemlwIGZpbGVzLCBpbiBhZGRpdGlvbiB0bworICAgIC8vLyAgICAgY3JlYXRpbmcgemlwIGZpbGVzLiA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGNhbm5vdCByZWFkIHppcCBmaWxlcy4gSWYgeW91IHdhbnQKKyAgICAvLy8gICAgIHRvIHVzZSBhIHN0cmVhbSB0byByZWFkIHppcCBmaWxlcywgY2hlY2sgb3V0IHRoZSA8c2VlIGNyZWY9IlppcElucHV0U3RyZWFtIi8+IGNsYXNzLgorICAgIC8vLyAgIDwvaXRlbT4KKyAgICAvLy8KKyAgICAvLy8gICA8aXRlbT4KKyAgICAvLy8gICAgIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gZG9lcyBub3Qgc3VwcG9ydCB0aGUgY3JlYXRpb24gb2Ygc2VnbWVudGVkIG9yIHNwYW5uZWQKKyAgICAvLy8gICAgIHppcCBmaWxlcy4KKyAgICAvLy8gICA8L2l0ZW0+CisgICAgLy8vCisgICAgLy8vICAgPGl0ZW0+CisgICAgLy8vICAgICA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGNhbm5vdCBwcm9kdWNlIGEgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUuCisgICAgLy8vICAgPC9pdGVtPgorICAgIC8vLyA8L2xpc3Q+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIEJlIGF3YXJlIHRoYXQgdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gY2xhc3MgaW1wbGVtZW50cyB0aGUgPHNlZQorICAgIC8vLyAgIGNyZWY9IlN5c3RlbS5JRGlzcG9zYWJsZSIvPiBpbnRlcmZhY2UuICBJbiBvcmRlciBmb3IKKyAgICAvLy8gICA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IHRvIHByb2R1Y2UgYSB2YWxpZCB6aXAgZmlsZSwgeW91IHVzZSB1c2UgaXQgd2l0aGluCisgICAgLy8vICAgYSB1c2luZyBjbGF1c2UgKDxjPlVzaW5nPC9jPiBpbiBWQiksIG9yIGNhbGwgdGhlIDxjPkRpc3Bvc2UoKTwvYz4gbWV0aG9kCisgICAgLy8vICAgZXhwbGljaXRseS4gIFNlZSB0aGUgZXhhbXBsZXMgZm9yIGhvdyB0byBlbXBsb3kgYSB1c2luZyBjbGF1c2UuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgQWxzbywgYSBub3RlIHJlZ2FyZGluZyBjb21wcmVzc2lvbiBwZXJmb3JtYW5jZTogT24gdGhlIGRlc2t0b3AgLk5FVAorICAgIC8vLyAgIEZyYW1ld29yaywgRG90TmV0WmlwIGNhbiB1c2UgYSBtdWx0aS10aHJlYWRlZCBjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvbgorICAgIC8vLyAgIHRoYXQgcHJvdmlkZXMgc2lnbmlmaWNhbnQgc3BlZWQgaW5jcmVhc2VzIG9uIGxhcmdlIGZpbGVzLCBvdmVyIDMwMGsgb3Igc28sCisgICAgLy8vICAgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2VkIG1lbW9yeSB1c2UgYXQgcnVudGltZS4gIChUaGUgb3V0cHV0IG9mIHRoZQorICAgIC8vLyAgIGNvbXByZXNzaW9uIGlzIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIHNpemUpLiAgQnV0LCB0aGUgbXVsdGktdGhyZWFkZWQKKyAgICAvLy8gICBhcHByb2FjaCBpbmN1cnMgYSBwZXJmb3JtYW5jZSBoaXQgb24gc21hbGxlciBmaWxlcy4gVGhlcmUncyBubyB3YXkgZm9yIHRoZQorICAgIC8vLyAgIFppcE91dHB1dFN0cmVhbSB0byBrbm93IHdoZXRoZXIgcGFyYWxsZWwgY29tcHJlc3Npb24gd2lsbCBiZSBiZW5lZmljaWFsLAorICAgIC8vLyAgIGJlY2F1c2UgdGhlIFppcE91dHB1dFN0cmVhbSBkb2VzIG5vdCBrbm93IGhvdyBtdWNoIGRhdGEgeW91IHdpbGwgd3JpdGUKKyAgICAvLy8gICB0aHJvdWdoIHRoZSBzdHJlYW0uICBZb3UgbWF5IHdpc2ggdG8gc2V0IHRoZSA8c2VlCisgICAgLy8vICAgY3JlZj0iUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkIi8+IHByb3BlcnR5IHRvIHplcm8sIGlmIHlvdSBhcmUgY29tcHJlc3NpbmcKKyAgICAvLy8gICBsYXJnZSBmaWxlcyB0aHJvdWdoIDxjPlppcE91dHB1dFN0cmVhbTwvYz4uICBUaGlzIHdpbGwgY2F1c2UgcGFyYWxsZWwKKyAgICAvLy8gICBjb21wcmVzc2lvbiB0byBiZSB1c2VkLCBhbHdheXMuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGludGVybmFsIGNsYXNzIFppcE91dHB1dFN0cmVhbSA6IFN0cmVhbQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDcmVhdGUgYSBaaXBPdXRwdXRTdHJlYW0sIHdyYXBwaW5nIGFuIGV4aXN0aW5nIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgPHNlZSBjcmVmPSJaaXBGaWxlIi8+IGNsYXNzIGlzIGdlbmVyYWxseSBlYXNpZXIgdG8gdXNlIHdoZW4gY3JlYXRpbmcKKyAgICAgICAgLy8vICAgemlwIGZpbGVzLiBUaGUgWmlwT3V0cHV0U3RyZWFtIG9mZmVycyBhIGRpZmZlcmVudCBtZXRhcGhvciBmb3IgY3JlYXRpbmcgYQorICAgICAgICAvLy8gICB6aXAgZmlsZSwgYmFzZWQgb24gdGhlIDxzZWUgY3JlZj0iU3lzdGVtLklPLlN0cmVhbSIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+CisgICAgICAgIC8vLyBUaGUgc3RyZWFtIHRvIHdyYXAuIEl0IG11c3QgYmUgd3JpdGFibGUuIFRoaXMgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGF0CisgICAgICAgIC8vLyB0aGUgdGltZSB0aGUgWmlwT3V0cHV0U3RyZWFtIGlzIGNsb3NlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIHppcCBmaWxlLCB1c2luZyB0aGUKKyAgICAgICAgLy8vICAgWmlwT3V0cHV0U3RyZWFtIGNsYXNzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBaaXB1cCgpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgaWYgKGZpbGVzVG9aaXAuQ291bnQgPT0gMCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiTm90aGluZyB0byBkby4iKTsKKyAgICAgICAgLy8vICAgICAgICAgcmV0dXJuOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgdXNpbmcgKHZhciByYXcgPSBGaWxlLk9wZW4oX291dHB1dEZpbGVOYW1lLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlICkpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAodmFyIG91dHB1dD0gbmV3IFppcE91dHB1dFN0cmVhbShyYXcpKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBvdXRwdXQuUGFzc3dvcmQgPSAiVmVyeVNlY3JldCEiOworICAgICAgICAvLy8gICAgICAgICAgICAgb3V0cHV0LkVuY3J5cHRpb24gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NjsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgaW5wdXRGaWxlTmFtZSBpbiBmaWxlc1RvWmlwKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiZmlsZTogezB9IiwgaW5wdXRGaWxlTmFtZSk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG91dHB1dC5QdXROZXh0RW50cnkoaW5wdXRGaWxlTmFtZSk7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBpbnB1dCA9IEZpbGUuT3BlbihpbnB1dEZpbGVOYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQsIEZpbGVTaGFyZS5SZWFkIHwgRmlsZVNoYXJlLldyaXRlICkpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyPSBuZXcgYnl0ZVsyMDQ4XTsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsMCxidWZmZXIuTGVuZ3RoKSkgPiAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUoYnVmZmVyLDAsbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vLyAgICAgICAgICAgICB9CisgICAgICAgIC8vLyAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gUHJpdmF0ZSBTdWIgWmlwdXAoKQorICAgICAgICAvLy8gICAgIERpbSBvdXRwdXRGaWxlTmFtZSBBcyBTdHJpbmcgPSAiWG1sRGF0YS56aXAiCisgICAgICAgIC8vLyAgICAgRGltIGZpbGVzVG9aaXAgQXMgU3RyaW5nKCkgPSBEaXJlY3RvcnkuR2V0RmlsZXMoIi4iLCAiKi54bWwiKQorICAgICAgICAvLy8gICAgIElmIChmaWxlc1RvWmlwLkxlbmd0aCA9IDApIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk5vdGhpbmcgdG8gZG8uIikKKyAgICAgICAgLy8vICAgICBFbHNlCisgICAgICAgIC8vLyAgICAgICAgIFVzaW5nIHJhdyBBcyBGaWxlU3RyZWFtID0gRmlsZS5PcGVuKG91dHB1dEZpbGVOYW1lLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKQorICAgICAgICAvLy8gICAgICAgICAgICAgVXNpbmcgb3V0cHV0IEFzIFppcE91dHB1dFN0cmVhbSA9IE5ldyBaaXBPdXRwdXRTdHJlYW0ocmF3KQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG91dHB1dC5QYXNzd29yZCA9ICJWZXJ5U2VjcmV0ISIKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBvdXRwdXQuRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgRGltIGlucHV0RmlsZU5hbWUgQXMgU3RyaW5nCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgRm9yIEVhY2ggaW5wdXRGaWxlTmFtZSBJbiBmaWxlc1RvWmlwCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJmaWxlOiB7MH0iLCBpbnB1dEZpbGVOYW1lKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBvdXRwdXQuUHV0TmV4dEVudHJ5KGlucHV0RmlsZU5hbWUpCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGlucHV0IEFzIEZpbGVTdHJlYW0gPSBGaWxlLk9wZW4oaW5wdXRGaWxlTmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkLCBGaWxlU2hhcmUuUmVhZFdyaXRlKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgRGltIG4gQXMgSW50ZWdlcgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgRGltIGJ1ZmZlciBBcyBCeXRlKCkgPSBOZXcgQnl0ZSgyMDQ4KSB7fQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgRG8gV2hpbGUgKG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkgPiAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBMb29wCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIE5leHQKKyAgICAgICAgLy8vICAgICAgICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgICBFbmQgSWYKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgcHVibGljIFppcE91dHB1dFN0cmVhbShTdHJlYW0gc3RyZWFtKSA6IHRoaXMoc3RyZWFtLCBmYWxzZSkgeyB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZSBhIFppcE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byBhIGZpbGVzeXN0ZW0gZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhlIDxzZWUgY3JlZj0iWmlwRmlsZSIvPiBjbGFzcyBpcyBnZW5lcmFsbHkgZWFzaWVyIHRvIHVzZSB3aGVuIGNyZWF0aW5nCisgICAgICAgIC8vLyAgIHppcCBmaWxlcy4gVGhlIFppcE91dHB1dFN0cmVhbSBvZmZlcnMgYSBkaWZmZXJlbnQgbWV0YXBob3IgZm9yIGNyZWF0aW5nIGEKKyAgICAgICAgLy8vICAgemlwIGZpbGUsIGJhc2VkIG9uIHRoZSA8c2VlIGNyZWY9IlN5c3RlbS5JTy5TdHJlYW0iLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIHRvIGNyZWF0ZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIHppcCBmaWxlLCB1c2luZyB0aGUKKyAgICAgICAgLy8vICAgWmlwT3V0cHV0U3RyZWFtIGNsYXNzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IkMjIj4KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBaaXB1cCgpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgaWYgKGZpbGVzVG9aaXAuQ291bnQgPT0gMCkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiTm90aGluZyB0byBkby4iKTsKKyAgICAgICAgLy8vICAgICAgICAgcmV0dXJuOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgdXNpbmcgKHZhciBvdXRwdXQ9IG5ldyBaaXBPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZU5hbWUpKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgb3V0cHV0LlBhc3N3b3JkID0gIlZlcnlTZWNyZXQhIjsKKyAgICAgICAgLy8vICAgICAgICAgb3V0cHV0LkVuY3J5cHRpb24gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLldpblppcEFlczI1NjsKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBpbnB1dEZpbGVOYW1lIGluIGZpbGVzVG9aaXApCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZSgiZmlsZTogezB9IiwgaW5wdXRGaWxlTmFtZSk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgb3V0cHV0LlB1dE5leHRFbnRyeShpbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHVzaW5nICh2YXIgaW5wdXQgPSBGaWxlLk9wZW4oaW5wdXRGaWxlTmFtZSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlU2hhcmUuUmVhZCB8IEZpbGVTaGFyZS5Xcml0ZSApKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXI9IG5ldyBieXRlWzIwNDhdOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsMCxidWZmZXIuTGVuZ3RoKSkgPiAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKGJ1ZmZlciwwLG4pOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBQcml2YXRlIFN1YiBaaXB1cCgpCisgICAgICAgIC8vLyAgICAgRGltIG91dHB1dEZpbGVOYW1lIEFzIFN0cmluZyA9ICJYbWxEYXRhLnppcCIKKyAgICAgICAgLy8vICAgICBEaW0gZmlsZXNUb1ppcCBBcyBTdHJpbmcoKSA9IERpcmVjdG9yeS5HZXRGaWxlcygiLiIsICIqLnhtbCIpCisgICAgICAgIC8vLyAgICAgSWYgKGZpbGVzVG9aaXAuTGVuZ3RoID0gMCkgVGhlbgorICAgICAgICAvLy8gICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiTm90aGluZyB0byBkby4iKQorICAgICAgICAvLy8gICAgIEVsc2UKKyAgICAgICAgLy8vICAgICAgICAgVXNpbmcgb3V0cHV0IEFzIFppcE91dHB1dFN0cmVhbSA9IE5ldyBaaXBPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZU5hbWUpCisgICAgICAgIC8vLyAgICAgICAgICAgICBvdXRwdXQuUGFzc3dvcmQgPSAiVmVyeVNlY3JldCEiCisgICAgICAgIC8vLyAgICAgICAgICAgICBvdXRwdXQuRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2CisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gaW5wdXRGaWxlTmFtZSBBcyBTdHJpbmcKKyAgICAgICAgLy8vICAgICAgICAgICAgIEZvciBFYWNoIGlucHV0RmlsZU5hbWUgSW4gZmlsZXNUb1ppcAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJmaWxlOiB7MH0iLCBpbnB1dEZpbGVOYW1lKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG91dHB1dC5QdXROZXh0RW50cnkoaW5wdXRGaWxlTmFtZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBVc2luZyBpbnB1dCBBcyBGaWxlU3RyZWFtID0gRmlsZS5PcGVuKGlucHV0RmlsZU5hbWUsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCwgRmlsZVNoYXJlLlJlYWRXcml0ZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgRGltIG4gQXMgSW50ZWdlcgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDIwNDgpIHt9CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIERvIFdoaWxlIChuID0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpID4gMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIExvb3AKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgICAgICAgICAgIE5leHQKKyAgICAgICAgLy8vICAgICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgRW5kIElmCisgICAgICAgIC8vLyBFbmQgU3ViCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIHB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJlYW0gc3RyZWFtID0gRmlsZS5PcGVuKGZpbGVOYW1lLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlLCBGaWxlU2hhcmUuTm9uZSk7CisgICAgICAgICAgICBfSW5pdChzdHJlYW0sIGZhbHNlLCBmaWxlTmFtZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgWmlwT3V0cHV0U3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlppcE91dHB1dFN0cmVhbShTdHJlYW0pIj5aaXBPdXRwdXRTdHJlYW0oU3RyZWFtKTwvc2VlPgorICAgICAgICAvLy8gICBjb25zdHJ1Y3RvciBmb3IgYW4gZXhhbXBsZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj4KKyAgICAgICAgLy8vICAgVGhlIHN0cmVhbSB0byB3cmFwLiBJdCBtdXN0IGJlIHdyaXRhYmxlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj4KKyAgICAgICAgLy8vICAgdHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gd291bGQgbGlrZSB0aGUgc3RyZWFtCisgICAgICAgIC8vLyAgIHRvIHJlbWFpbiBvcGVuIGFmdGVyIHRoZSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oU3RyZWFtIHN0cmVhbSwgYm9vbCBsZWF2ZU9wZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9Jbml0KHN0cmVhbSwgbGVhdmVPcGVuLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBfSW5pdChTdHJlYW0gc3RyZWFtLCBib29sIGxlYXZlT3Blbiwgc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDkzMDcKKyAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0gPSBzdHJlYW0uQ2FuUmVhZCA/IHN0cmVhbSA6IG5ldyBDb3VudGluZ1N0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbCA9IE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0OworICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRob2QgPSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAuQ29tcHJlc3Npb25NZXRob2QuRGVmbGF0ZTsKKyAgICAgICAgICAgIF9lbmNyeXB0aW9uID0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lOworICAgICAgICAgICAgX2VudHJpZXNXcml0dGVuID0gbmV3IERpY3Rpb25hcnk8U3RyaW5nLCBaaXBFbnRyeT4oU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCk7CisgICAgICAgICAgICBfemlwNjQgPSBaaXA2NE9wdGlvbi5OZXZlcjsKKyAgICAgICAgICAgIF9sZWF2ZVVuZGVybHlpbmdTdHJlYW1PcGVuID0gbGVhdmVPcGVuOworICAgICAgICAgICAgU3RyYXRlZ3kgPSBJb25pYy5abGliLkNvbXByZXNzaW9uU3RyYXRlZ3kuRGVmYXVsdDsKKyAgICAgICAgICAgIF9uYW1lID0gbmFtZSA/PyAiKHN0cmVhbSkiOworI2lmICFORVRDRgorICAgICAgICAgICAgUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkID0gLTFMOworI2VuZGlmCisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT5Qcm92aWRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cmV0dXJucz5hIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQgKCJaaXBPdXRwdXRTdHJlYW06OnswfShsZWF2ZU9wZW4oezF9KSkpIiwgX25hbWUsIF9sZWF2ZVVuZGVybHlpbmdTdHJlYW1PcGVuKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTZXRzIHRoZSBwYXNzd29yZCB0byBiZSB1c2VkIG9uIHRoZSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGluc3RhbmNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHdyaXRpbmcgYSB6aXAgYXJjaGl2ZSwgdGhpcyBwYXNzd29yZCBpcyBhcHBsaWVkIHRvIHRoZSBlbnRyaWVzLCBub3QKKyAgICAgICAgLy8vICAgdG8gdGhlIHppcCBhcmNoaXZlIGl0c2VsZi4gSXQgYXBwbGllcyB0byBhbnkgPGM+WmlwRW50cnk8L2M+IHN1YnNlcXVlbnRseQorICAgICAgICAvLy8gICB3cml0dGVuIHRvIHRoZSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBVc2luZyBhIHBhc3N3b3JkIGRvZXMgbm90IGVuY3J5cHQgb3IgcHJvdGVjdCB0aGUgImRpcmVjdG9yeSIgb2YgdGhlCisgICAgICAgIC8vLyAgIGFyY2hpdmUgLSB0aGUgbGlzdCBvZiBlbnRyaWVzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZS4gIElmIHlvdSBzZXQgdGhlCisgICAgICAgIC8vLyAgIDxjPlBhc3N3b3JkPC9jPiBwcm9wZXJ0eSwgdGhlIHBhc3N3b3JkIGFjdHVhbGx5IGFwcGxpZXMgdG8gaW5kaXZpZHVhbAorICAgICAgICAvLy8gICBlbnRyaWVzIHRoYXQgYXJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlLCBzdWJzZXF1ZW50IHRvIHRoZSBzZXR0aW5nIG9mIHRoaXMKKyAgICAgICAgLy8vICAgcHJvcGVydHkuICBUaGUgbGlzdCBvZiBmaWxlbmFtZXMgaW4gdGhlIGFyY2hpdmUgdGhhdCBpcyBldmVudHVhbGx5IGNyZWF0ZWQKKyAgICAgICAgLy8vICAgd2lsbCBhcHBlYXIgaW4gY2xlYXIgdGV4dCwgYnV0IHRoZSBjb250ZW50cyBvZiB0aGUgaW5kaXZpZHVhbCBmaWxlcyBhcmUKKyAgICAgICAgLy8vICAgZW5jcnlwdGVkLiAgVGhpcyBpcyBob3cgWmlwIGVuY3J5cHRpb24gd29ya3MuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSBzZXQgdGhpcyBwcm9wZXJ0eSwgYW5kIHRoZW4gYWRkIGEgc2V0IG9mIGVudHJpZXMgdG8gdGhlIGFyY2hpdmUgdmlhCisgICAgICAgIC8vLyAgIGNhbGxzIHRvIDxjPlB1dE5leHRFbnRyeTwvYz4sIHRoZW4gZWFjaCBlbnRyeSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGF0CisgICAgICAgIC8vLyAgIHBhc3N3b3JkLiAgWW91IG1heSBhbHNvIHdhbnQgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCBiZXR3ZWVuIGFkZGluZworICAgICAgICAvLy8gICBkaWZmZXJlbnQgZW50cmllcy4gSWYgeW91IHNldCB0aGUgcGFzc3dvcmQsIGFkZCBhbiBlbnRyeSwgdGhlbiBzZXQgdGhlCisgICAgICAgIC8vLyAgIHBhc3N3b3JkIHRvIDxjPm51bGw8L2M+ICg8Yz5Ob3RoaW5nPC9jPiBpbiBWQiksIGFuZCBhZGQgYW5vdGhlciBlbnRyeSwgdGhlCisgICAgICAgIC8vLyAgIGZpcnN0IGVudHJ5IGlzIGVuY3J5cHRlZCBhbmQgdGhlIHNlY29uZCBpcyBub3QuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gc2V0dGluZyB0aGUgPGM+UGFzc3dvcmQ8L2M+LCB5b3UgbWF5IGFsc28gd2FudCB0byBleHBsaWNpdGx5IHNldCB0aGUgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJFbmNyeXB0aW9uIi8+IHByb3BlcnR5LCB0byBzcGVjaWZ5IGhvdyB0byBlbmNyeXB0IHRoZSBlbnRyaWVzIGFkZGVkCisgICAgICAgIC8vLyAgIHRvIHRoZSBaaXBGaWxlLiAgSWYgeW91IHNldCB0aGUgPGM+UGFzc3dvcmQ8L2M+IHRvIGEgbm9uLW51bGwgdmFsdWUgYW5kIGRvIG5vdAorICAgICAgICAvLy8gICBzZXQgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+LCB0aGVuIFBLWmlwIDIuMCAoIldlYWsiKSBlbmNyeXB0aW9uIGlzIHVzZWQuCisgICAgICAgIC8vLyAgIFRoaXMgZW5jcnlwdGlvbiBpcyByZWxhdGl2ZWx5IHdlYWsgYnV0IGlzIHZlcnkgaW50ZXJvcGVyYWJsZS4gSWYKKyAgICAgICAgLy8vICAgeW91IHNldCB0aGUgcGFzc3dvcmQgdG8gYSA8Yz5udWxsPC9jPiB2YWx1ZSAoPGM+Tm90aGluZzwvYz4gaW4gVkIpLAorICAgICAgICAvLy8gICA8Yz5FbmNyeXB0aW9uPC9jPiBpcyByZXNldCB0byBOb25lLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTcGVjaWFsIGNhc2U6IGlmIHlvdSB3cmFwIGEgWmlwT3V0cHV0U3RyZWFtIGFyb3VuZCBhIG5vbi1zZWVrYWJsZSBzdHJlYW0sCisgICAgICAgIC8vLyAgIGFuZCB1c2UgZW5jcnlwdGlvbiwgYW5kIGVtaXQgYW4gZW50cnkgb2YgemVybyBieXRlcywgdGhlIDxjPkNsb3NlKCk8L2M+IG9yCisgICAgICAgIC8vLyAgIDxjPlB1dE5leHRFbnRyeSgpPC9jPiBmb2xsb3dpbmcgdGhlIGVudHJ5IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIFN0cmluZyBQYXNzd29yZAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9wYXNzd29yZCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChfcGFzc3dvcmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lbmNyeXB0aW9uID0gRW5jcnlwdGlvbkFsZ29yaXRobS5Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfZW5jcnlwdGlvbiA9PSBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uUGt6aXBXZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgRW5jcnlwdGlvbiB0byB1c2UgZm9yIGVudHJpZXMgYWRkZWQgdG8gdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHNwZWNpZmllZCBFbmNyeXB0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVudHJpZXMgc3Vic2VxdWVudGx5CisgICAgICAgIC8vLyAgIHdyaXR0ZW4gdG8gdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gaW5zdGFuY2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSBzZXQgdGhpcyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgICAgICAvLy8gICBFbmNyeXB0aW9uQWxnb3JpdGhtLk5vbmUsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBzZXQgdGhlCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iUGFzc3dvcmQiLz4gdG8gYSBub24tbnVsbCwgbm9uLWVtcHR5IHZhbHVlIGluCisgICAgICAgIC8vLyAgIG9yZGVyIHRvIGFjdHVhbGx5IGdldCBlbmNyeXB0aW9uIG9uIHRoZSBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iUGFzc3dvcmQiPlppcE91dHB1dFN0cmVhbS5QYXNzd29yZDwvc2VlYWxzbz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlppcEVudHJ5LkVuY3J5cHRpb24iPlppcEVudHJ5LkVuY3J5cHRpb248L3NlZWFsc28+CisgICAgICAgIHB1YmxpYyBFbmNyeXB0aW9uQWxnb3JpdGhtIEVuY3J5cHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9lbmNyeXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IEVuY3J5cHRpb25BbGdvcml0aG0uVW5zdXBwb3J0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZXhjZXB0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbWF5IG5vdCBzZXQgRW5jcnlwdGlvbiB0byB0aGF0IHZhbHVlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfZW5jcnlwdGlvbiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFNpemUgb2YgdGhlIHdvcmsgYnVmZmVyIHRvIHVzZSBmb3IgdGhlIFpMSUIgY29kZWMgZHVyaW5nIGNvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZXR0aW5nIHRoaXMgbWF5IGFmZmVjdCBwZXJmb3JtYW5jZS4gIEZvciBsYXJnZXIgZmlsZXMsIHNldHRpbmcgdGhpcyB0byBhCisgICAgICAgIC8vLyAgIGxhcmdlciBzaXplIG1heSBpbXByb3ZlIHBlcmZvcm1hbmNlLCBidXQgSSdtIG5vdCBzdXJlLiAgU29ycnksIEkgZG9uJ3QKKyAgICAgICAgLy8vICAgY3VycmVudGx5IGhhdmUgZ29vZCByZWNvbW1lbmRhdGlvbnMgb24gaG93IHRvIHNldCBpdC4gIFlvdSBjYW4gdGVzdCBpdCBpZgorICAgICAgICAvLy8gICB5b3UgbGlrZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGludCBDb2RlY0J1ZmZlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBjb21wcmVzc2lvbiBzdHJhdGVneSB0byB1c2UgZm9yIGFsbCBlbnRyaWVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZXQgdGhlIFN0cmF0ZWd5IHVzZWQgYnkgdGhlIFpMSUItY29tcGF0aWJsZSBjb21wcmVzc29yLCB3aGVuIGNvbXByZXNzaW5nCisgICAgICAgIC8vLyAgIGRhdGEgZm9yIHRoZSBlbnRyaWVzIGluIHRoZSB6aXAgYXJjaGl2ZS4gRGlmZmVyZW50IGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMKKyAgICAgICAgLy8vICAgd29yayBiZXR0ZXIgb24gZGlmZmVyZW50IHNvcnRzIG9mIGRhdGEuIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgY2FuIGFmZmVjdAorICAgICAgICAvLy8gICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYW5kIHRoZSBzcGVlZCBvZiBjb21wcmVzc2lvbiBidXQgbm90IHRoZSBjb3JyZWN0bmVzcworICAgICAgICAvLy8gICBvZiB0aGUgY29tcHJlc3NzaW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iSW9uaWMuWmxpYi5Db21wcmVzc2lvblN0cmF0ZWd5ICIvPi4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIENvbXByZXNzaW9uU3RyYXRlZ3kgU3RyYXRlZ3kKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSB0eXBlIG9mIHRpbWVzdGFtcCBhdHRhY2hlZCB0byB0aGUgWmlwRW50cnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFNldCB0aGlzIGluIG9yZGVyIHRvIHNwZWNpZnkgdGhlIGtpbmQgb2YgdGltZXN0YW1wIHRoYXQgc2hvdWxkIGJlIGVtaXR0ZWQKKyAgICAgICAgLy8vICAgaW50byB0aGUgemlwIGZpbGUgZm9yIGVhY2ggZW50cnkuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBaaXBFbnRyeVRpbWVzdGFtcCBUaW1lc3RhbXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90aW1lc3RhbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfdGltZXN0YW1wID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgU2V0cyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gYmUgdXNlZCBmb3IgZW50cmllcyBzdWJzZXF1ZW50bHkgYWRkZWQgdG8KKyAgICAgICAgLy8vICAgdGhlIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgVmFyeWluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdXNlZCBvbiBlbnRyaWVzIGNhbiBhZmZlY3QgdGhlCisgICAgICAgIC8vLyAgICBzaXplLXZzLXNwZWVkIHRyYWRlb2ZmIHdoZW4gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3NpbmcgZGF0YSBzdHJlYW1zCisgICAgICAgIC8vLyAgICBvciBmaWxlcy4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgQXMgd2l0aCBzb21lIG90aGVyIHByb3BlcnRpZXMgb24gdGhlIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gY2xhc3MsIGxpa2UgPHNlZQorICAgICAgICAvLy8gICAgY3JlZj0iUGFzc3dvcmQiLz4sIGFuZCA8c2VlIGNyZWY9IkVuY3J5cHRpb24iLz4sCisgICAgICAgIC8vLyAgICBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb24gYSA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+CisgICAgICAgIC8vLyAgICBpbnN0YW5jZSB3aWxsIGNhdXNlIHRoZSBzcGVjaWZpZWQgPGM+Q29tcHJlc3Npb25MZXZlbDwvYz4gdG8gYmUgdXNlZCBvbiBhbGwKKyAgICAgICAgLy8vICAgIDxzZWUgY3JlZj0iWmlwRW50cnkiLz4gaXRlbXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IGFkZGVkIHRvIHRoZQorICAgICAgICAvLy8gICAgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiBpbnN0YW5jZS4KKyAgICAgICAgLy8vICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gIDxwYXJhPgorICAgICAgICAvLy8gICAgSWYgeW91IGRvIG5vdCBzZXQgdGhpcyBwcm9wZXJ0eSwgdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgaXMgdXNlZCwKKyAgICAgICAgLy8vICAgIHdoaWNoIG5vcm1hbGx5IGdpdmVzIGEgZ29vZCBiYWxhbmNlIG9mIGNvbXByZXNzaW9uIGVmZmljaWVuY3kgYW5kCisgICAgICAgIC8vLyAgICBjb21wcmVzc2lvbiBzcGVlZC4gIEluIHNvbWUgdGVzdHMsIHVzaW5nIDxjPkJlc3RDb21wcmVzc2lvbjwvYz4gY2FuCisgICAgICAgIC8vLyAgICBkb3VibGUgdGhlIHRpbWUgaXQgdGFrZXMgdG8gY29tcHJlc3MsIHdoaWxlIGRlbGl2ZXJpbmcganVzdCBhIHNtYWxsCisgICAgICAgIC8vLyAgICBpbmNyZWFzZSBpbiBjb21wcmVzc2lvbiBlZmZpY2llbmN5LiAgVGhpcyBiZWhhdmlvciB3aWxsIHZhcnkgd2l0aCB0aGUKKyAgICAgICAgLy8vICAgIHR5cGUgb2YgZGF0YSB5b3UgY29tcHJlc3MuICBJZiB5b3UgYXJlIGluIGRvdWJ0LCBqdXN0IGxlYXZlIHRoaXMgc2V0dGluZworICAgICAgICAvLy8gICAgYWxvbmUsIGFuZCBhY2NlcHQgdGhlIGRlZmF1bHQuCisgICAgICAgIC8vLyAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uTGV2ZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgY29tcHJlc3Npb24gbWV0aG9kIHVzZWQgb24gZWFjaCBlbnRyeSBhZGRlZCB0byB0aGUgWmlwT3V0cHV0U3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25NZXRob2QgQ29tcHJlc3Npb25NZXRob2QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEEgY29tbWVudCBhdHRhY2hlZCB0byB0aGUgemlwIGFyY2hpdmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBhcHBsaWNhdGlvbiBzZXRzIHRoaXMgcHJvcGVydHkgdG8gc3BlY2lmeSBhIGNvbW1lbnQgdG8gYmUgZW1iZWRkZWQKKyAgICAgICAgLy8vICAgaW50byB0aGUgZ2VuZXJhdGVkIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBY2NvcmRpbmcgdG8gPHNlZQorICAgICAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5QS1dBUkUncworICAgICAgICAvLy8gICB6aXAgc3BlY2lmaWNhdGlvbjwvc2VlPiwgdGhlIGNvbW1lbnQgaXMgbm90IGVuY3J5cHRlZCwgZXZlbiBpZiB0aGVyZSBpcyBhCisgICAgICAgIC8vLyAgIHBhc3N3b3JkIHNldCBvbiB0aGUgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlc2NyaWJlIGhvdyB0byBpbmRpY2F0ZSB0aGUgZW5jb2RpbmcgdXNlZAorICAgICAgICAvLy8gICBvbiBhIGNvbW1lbnQgc3RyaW5nLiBNYW55ICJjb21wbGlhbnQiIHppcCB0b29scyBhbmQgbGlicmFyaWVzIHVzZQorICAgICAgICAvLy8gICBJQk00MzcgYXMgdGhlIGNvZGUgcGFnZSBmb3IgY29tbWVudHM7IERvdE5ldFppcCwgdG9vLCBmb2xsb3dzIHRoYXQKKyAgICAgICAgLy8vICAgcHJhY3RpY2UuICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgeW91IHdhbnQgYQorICAgICAgICAvLy8gICBDb21tZW50IHRvIGJlIGVuY29kZWQgd2l0aCBzb21ldGhpbmcgZWxzZSwgZm9yIGV4YW1wbGUgdXNpbmcgY29kZSBwYWdlCisgICAgICAgIC8vLyAgIDk1MCAiQmlnLTUgQ2hpbmVzZSIuIFRvIGZpbGwgdGhhdCBuZWVkLCBEb3ROZXRaaXAgd2lsbCBlbmNvZGUgdGhlCisgICAgICAgIC8vLyAgIGNvbW1lbnQgZm9sbG93aW5nIHRoZSBzYW1lIHByb2NlZHVyZSBpdCBmb2xsb3dzIGZvciBlbmNvZGluZworICAgICAgICAvLy8gICBmaWxlbmFtZXM6IChhKSBpZiA8c2VlIGNyZWY9IkFsdGVybmF0ZUVuY29kaW5nVXNhZ2UiLz4gaXMKKyAgICAgICAgLy8vICAgPGM+TmV2ZXI8L2M+LCBpdCB1c2VzIHRoZSBkZWZhdWx0IGVuY29kaW5nIChJQk00MzcpLiAoYikgaWYgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+IGlzIDxjPkFsd2F5czwvYz4sIGl0IGFsd2F5cyB1c2VzIHRoZQorICAgICAgICAvLy8gICBhbHRlcm5hdGUgZW5jb2RpbmcgKDxzZWUgY3JlZj0iQWx0ZXJuYXRlRW5jb2RpbmciLz4pLiAoYykgaWYgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+IGlzIDxjPkFzTmVjZXNzYXJ5PC9jPiwgaXQgdXNlcyB0aGUKKyAgICAgICAgLy8vICAgYWx0ZXJuYXRlIGVuY29kaW5nIG9ubHkgaWYgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgbm90IHN1ZmZpY2llbnQgZm9yCisgICAgICAgIC8vLyAgIGVuY29kaW5nIHRoZSBjb21tZW50IC0gaW4gb3RoZXIgd29yZHMgaWYgZGVjb2RpbmcgdGhlIHJlc3VsdCBkb2VzIG5vdAorICAgICAgICAvLy8gICBwcm9kdWNlIHRoZSBvcmlnaW5hbCBzdHJpbmcuICBUaGlzIGRlY2lzaW9uIGlzIHRha2VuIGF0IHRoZSB0aW1lIG9mCisgICAgICAgIC8vLyAgIHRoZSBjYWxsIHRvIDxjPlppcEZpbGUuU2F2ZSgpPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29tbWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvbW1lbnQ7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZXhjZXB0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9jb21tZW50ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIFpJUDY0IGV4dGVuc2lvbnMgd2hlbiBzYXZpbmcgYSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IGlzIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwNjRPcHRpb24uTmV2ZXIiLz4uIDxzZWUgY3JlZj0iWmlwNjRPcHRpb24uQXNOZWNlc3NhcnkiLz4gaXMKKyAgICAgICAgLy8vICAgc2FmZXN0LCBpbiB0aGUgc2Vuc2UgdGhhdCB5b3Ugd2lsbCBub3QgZ2V0IGFuIEV4Y2VwdGlvbiBpZiBhCisgICAgICAgIC8vLyAgIHByZS1aSVA2NCBsaW1pdCBpcyBleGNlZWRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgWW91IG11c3Qgc2V0IHRoaXMgcHJvcGVydHkgYmVmb3JlIGNhbGxpbmcgPGM+V3JpdGUoKTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgWmlwNjRPcHRpb24gRW5hYmxlWmlwNjQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96aXA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZXhjZXB0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF96aXA2NCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEluZGljYXRlcyB3aGV0aGVyIFpJUDY0IGV4dGVuc2lvbnMgd2VyZSB1c2VkIHdoZW4gc2F2aW5nIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVGhlIHZhbHVlIGlzIGRlZmluZWQgb25seSBhZnRlciB0aGUgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBib29sIE91dHB1dFVzZWRaaXA2NAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FueUVudHJpZXNVc2VkWmlwNjQgfHwgX2RpcmVjdG9yeU5lZWRlZFppcDY0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFdoZXRoZXIgdGhlIFppcE91dHB1dFN0cmVhbSBzaG91bGQgdXNlIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMgd2hlbgorICAgICAgICAvLy8gICBjaGVja2luZyBmb3IgdW5pcXVlbmVzcyBvZiB6aXAgZW50cmllcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgIFRob3VnaCB0aGUgemlwIHNwZWNpZmljYXRpb24gZG9lc24ndCBwcm9oaWJpdCB6aXBmaWxlcyB3aXRoIGR1cGxpY2F0ZQorICAgICAgICAvLy8gICBlbnRyaWVzLCBTYW5lIHppcCBmaWxlcyBoYXZlIG5vIGR1cGxpY2F0ZXMsIGFuZCB0aGUgRG90TmV0WmlwIGxpYnJhcnkKKyAgICAgICAgLy8vICAgY2Fubm90IGNyZWF0ZSB6aXAgZmlsZXMgd2l0aCBkdXBsaWNhdGUgZW50cmllcy4gSWYgYW4gYXBwbGljYXRpb24gYXR0ZW1wdHMKKyAgICAgICAgLy8vICAgdG8gY2FsbCA8c2VlIGNyZWY9IlB1dE5leHRFbnRyeShTdHJpbmcpIi8+IHdpdGggYSBuYW1lIHRoYXQgZHVwbGljYXRlcyBvbmUKKyAgICAgICAgLy8vICAgYWxyZWFkeSB1c2VkIHdpdGhpbiB0aGUgYXJjaGl2ZSwgdGhlIGxpYnJhcnkgd2lsbCB0aHJvdyBhbiBFeGNlcHRpb24uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgcHJvcGVydHkgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlCisgICAgICAgIC8vLyAgIFppcE91dHB1dFN0cmVhbSBpbnN0YW5jZSBjb25zaWRlcnMgb3JkaW5hbCBjYXNlIHdoZW4gY2hlY2tpbmcgZm9yCisgICAgICAgIC8vLyAgIHVuaXF1ZW5lc3Mgb2YgemlwIGVudHJpZXMuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGJvb2wgSWdub3JlQ2FzZQorICAgICAgICB7CisgICAgICAgICAgZ2V0CisgICAgICAgICAgeworICAgICAgICAgICAgICByZXR1cm4gIV9Eb250SWdub3JlQ2FzZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzZXQKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIF9Eb250SWdub3JlQ2FzZSA9ICF2YWx1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB0byBlbmNvZGUgZW50cnkgZmlsZW5hbWVzIGFuZCBlbnRyeSBjb21tZW50cyB1c2luZworICAgICAgICAvLy8gICBVbmljb2RlIChVVEYtOCkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgPHNlZSBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5UaGUKKyAgICAgICAgLy8vICAgUEtXYXJlIHppcCBzcGVjaWZpY2F0aW9uPC9zZWU+IHByb3ZpZGVzIGZvciBlbmNvZGluZyBmaWxlIG5hbWVzIGFuZCBmaWxlCisgICAgICAgIC8vLyAgIGNvbW1lbnRzIGluIGVpdGhlciB0aGUgSUJNNDM3IGNvZGUgcGFnZSwgb3IgaW4gVVRGLTguICBUaGlzIGZsYWcgc2VsZWN0cworICAgICAgICAvLy8gICB0aGUgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoYXQgc3BlY2lmaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIHRoaXMgZmxhZyBpcworICAgICAgICAvLy8gICBmYWxzZSwgYW5kIGZpbGVuYW1lcyBhbmQgY29tbWVudHMgYXJlIGVuY29kZWQgaW50byB0aGUgemlwIGZpbGUgaW4gdGhlCisgICAgICAgIC8vLyAgIElCTTQzNyBjb2RlcGFnZS4gIFNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUgd2lsbCBzcGVjaWZ5IHRoYXQgZmlsZW5hbWVzCisgICAgICAgIC8vLyAgIGFuZCBjb21tZW50cyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggSUJNNDM3IHdpbGwgYmUgZW5jb2RlZCB3aXRoCisgICAgICAgIC8vLyAgIFVURi04LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBaaXAgZmlsZXMgY3JlYXRlZCB3aXRoIHN0cmljdCBhZGhlcmVuY2UgdG8gdGhlIFBLV2FyZSBzcGVjaWZpY2F0aW9uIHdpdGgKKyAgICAgICAgLy8vICAgcmVzcGVjdCB0byBVVEYtOCBlbmNvZGluZyBjYW4gY29udGFpbiBlbnRyaWVzIHdpdGggZmlsZW5hbWVzIGNvbnRhaW5pbmcKKyAgICAgICAgLy8vICAgYW55IGNvbWJpbmF0aW9uIG9mIFVuaWNvZGUgY2hhcmFjdGVycywgaW5jbHVkaW5nIHRoZSBmdWxsIHJhbmdlIG9mCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMgZnJvbSBDaGluZXNlLCBMYXRpbiwgSGVicmV3LCBHcmVlaywgQ3lyaWxsaWMsIGFuZCBtYW55IG90aGVyCisgICAgICAgIC8vLyAgIGFscGhhYmV0cy4gIEhvd2V2ZXIsIGJlY2F1c2UgYXQgdGhpcyB0aW1lLCB0aGUgVVRGLTggcG9ydGlvbiBvZiB0aGUgUEtXYXJlCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gaXMgbm90IGJyb2FkbHkgc3VwcG9ydGVkIGJ5IG90aGVyIHppcCBsaWJyYXJpZXMgYW5kCisgICAgICAgIC8vLyAgIHV0aWxpdGllcywgc3VjaCB6aXAgZmlsZXMgbWF5IG5vdCBiZSByZWFkYWJsZSBieSB5b3VyIGZhdm9yaXRlIHppcCB0b29sIG9yCisgICAgICAgIC8vLyAgIGFyY2hpdmVyLiBJbiBvdGhlciB3b3JkcywgaW50ZXJvcGVyYWJpbGl0eSB3aWxsIGRlY3JlYXNlIGlmIHlvdSBzZXQgdGhpcworICAgICAgICAvLy8gICBmbGFnIHRvIHRydWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEluIHBhcnRpY3VsYXIsIFppcCBmaWxlcyBjcmVhdGVkIHdpdGggc3RyaWN0IGFkaGVyZW5jZSB0byB0aGUgUEtXYXJlCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gd2l0aCByZXNwZWN0IHRvIFVURi04IGVuY29kaW5nIHdpbGwgbm90IHdvcmsgd2VsbCB3aXRoCisgICAgICAgIC8vLyAgIEV4cGxvcmVyIGluIFdpbmRvd3MgWFAgb3IgV2luZG93cyBWaXN0YSwgYmVjYXVzZSBXaW5kb3dzIGNvbXByZXNzZWQKKyAgICAgICAgLy8vICAgZm9sZGVycywgYXMgZmFyIGFzIEkga25vdywgZG8gbm90IHN1cHBvcnQgVVRGLTggaW4gemlwIGZpbGVzLiAgVmlzdGEgY2FuCisgICAgICAgIC8vLyAgIHJlYWQgdGhlIHppcCBmaWxlcywgYnV0IHNob3dzIHRoZSBmaWxlbmFtZXMgaW5jb3JyZWN0bHkuIFVucGFja2luZyBmcm9tCisgICAgICAgIC8vLyAgIFdpbmRvd3MgVmlzdGEgRXhwbG9yZXIgd2lsbCByZXN1bHQgaW4gZmlsZW5hbWVzIHRoYXQgaGF2ZSBydWJiaXNoCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMgaW4gcGxhY2Ugb2YgdGhlIGhpZ2gtb3JkZXIgVVRGLTggYnl0ZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFsc28sIHppcCBmaWxlcyB0aGF0IHVzZSBVVEYtOCBlbmNvZGluZyB3aWxsIG5vdCB3b3JrIHdlbGwgd2l0aCBKYXZhCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgamF2YS51dGlsLnppcCBjbGFzc2VzLCBhcyBvZiB2NS4wIG9mIHRoZSBKYXZhCisgICAgICAgIC8vLyAgIHJ1bnRpbWUuIFRoZSBKYXZhIHJ1bnRpbWUgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgUEtXYXJlCisgICAgICAgIC8vLyAgIHNwZWNpZmljYXRpb24gaW4gdGhpcyByZWdhcmQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFzIGEgcmVzdWx0LCB3ZSBoYXZlIHRoZSB1bmZvcnR1bmF0ZSBzaXR1YXRpb24gdGhhdCAiY29ycmVjdCIgYmVoYXZpb3IgYnkKKyAgICAgICAgLy8vICAgdGhlIERvdE5ldFppcCBsaWJyYXJ5IHdpdGggcmVnYXJkIHRvIFVuaWNvZGUgZW5jb2Rpbmcgb2YgZmlsZW5hbWVzIGR1cmluZworICAgICAgICAvLy8gICB6aXAgY3JlYXRpb24gd2lsbCByZXN1bHQgaW4gemlwIGZpbGVzIHRoYXQgYXJlIHJlYWRhYmxlIGJ5IHN0cmljdGx5CisgICAgICAgIC8vLyAgIGNvbXBsaWFudCBhbmQgY3VycmVudCB0b29scyAoZm9yIGV4YW1wbGUgdGhlIG1vc3QgcmVjZW50IHJlbGVhc2Ugb2YgdGhlCisgICAgICAgIC8vLyAgIGNvbW1lcmNpYWwgV2luWmlwIHRvb2wpOyBidXQgdGhlc2UgemlwIGZpbGVzIHdpbGwgbm90IGJlIHJlYWRhYmxlIGJ5CisgICAgICAgIC8vLyAgIHZhcmlvdXMgb3RoZXIgdG9vbHMgb3IgbGlicmFyaWVzLCBpbmNsdWRpbmcgV2luZG93cyBFeHBsb3Jlci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIERvdE5ldFppcCBsaWJyYXJ5IGNhbiByZWFkIGFuZCB3cml0ZSB6aXAgZmlsZXMgd2l0aCBVVEY4LWVuY29kZWQKKyAgICAgICAgLy8vICAgZW50cmllcywgYWNjb3JkaW5nIHRvIHRoZSBQS3dhcmUgc3BlYy4gIElmIHlvdSB1c2UgRG90TmV0WmlwIGZvciBib3RoCisgICAgICAgIC8vLyAgIGNyZWF0aW5nIGFuZCByZWFkaW5nIHRoZSB6aXAgZmlsZSwgYW5kIHlvdSB1c2UgVVRGLTgsIHRoZXJlIHdpbGwgYmUgbm8KKyAgICAgICAgLy8vICAgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZW5hbWVzLiBGb3IgZXhhbXBsZSwgdXNpbmcgYSBzZWxmLWV4dHJhY3RvcgorICAgICAgICAvLy8gICBjcmVhdGVkIGJ5IHRoaXMgbGlicmFyeSB3aWxsIGFsbG93IHlvdSB0byB1bnBhY2sgZmlsZXMgY29ycmVjdGx5IHdpdGggbm8KKyAgICAgICAgLy8vICAgbG9zcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZW5hbWVzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3UgZG8gbm90IHNldCB0aGlzIGZsYWcsIGl0IHdpbGwgcmVtYWluIGZhbHNlLiAgSWYgdGhpcyBmbGFnIGlzIGZhbHNlLAorICAgICAgICAvLy8gICB0aGUgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiB3aWxsIGVuY29kZSBhbGwgZmlsZW5hbWVzIGFuZCBjb21tZW50cyB1c2luZworICAgICAgICAvLy8gICB0aGUgSUJNNDM3IGNvZGVwYWdlLiAgVGhpcyBjYW4gY2F1c2UgImxvc3Mgb2YgaW5mb3JtYXRpb24iIG9uIHNvbWUKKyAgICAgICAgLy8vICAgZmlsZW5hbWVzLCBidXQgdGhlIHJlc3VsdGluZyB6aXBmaWxlIHdpbGwgYmUgbW9yZSBpbnRlcm9wZXJhYmxlIHdpdGggb3RoZXIKKyAgICAgICAgLy8vICAgdXRpbGl0aWVzLiBBcyBhbiBleGFtcGxlIG9mIHRoZSBsb3NzIG9mIGluZm9ybWF0aW9uLCBkaWFjcml0aWNzIGNhbiBiZQorICAgICAgICAvLy8gICBsb3N0LiAgVGhlIG8tdGlsZGUgY2hhcmFjdGVyIHdpbGwgYmUgZG93bi1jb2RlZCB0byBwbGFpbiBvLiAgVGhlIGMgd2l0aCBhCisgICAgICAgIC8vLyAgIGNlZGlsbGEgKFVuaWNvZGUgMHhFNykgdXNlZCBpbiBQb3J0dWdlc2Ugd2lsbCBiZSBkb3duY29kZWQgdG8gYSBjLgorICAgICAgICAvLy8gICBMaWtld2lzZSwgdGhlIE8tc3Ryb2tlIGNoYXJhY3RlciAoVW5pY29kZSAyNDgpLCB1c2VkIGluIERhbmlzaCBhbmQKKyAgICAgICAgLy8vICAgTm9yd2VnaWFuLCB3aWxsIGJlIGRvd24tY29kZWQgdG8gcGxhaW4gby4gQ2hpbmVzZSBjaGFyYWN0ZXJzIGNhbm5vdCBiZQorICAgICAgICAvLy8gICByZXByZXNlbnRlZCBpbiBjb2RlcGFnZSBJQk00Mzc7IHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcsIENoaW5lc2UKKyAgICAgICAgLy8vICAgY2hhcmFjdGVycyBpbiBmaWxlbmFtZXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyA/LiBUaGVzZSBhcmUgYWxsIGV4YW1wbGVzCisgICAgICAgIC8vLyAgIG9mICJpbmZvcm1hdGlvbiBsb3NzIi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIGxvc3Mgb2YgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB0byB0aGUgdXNlIG9mIHRoZSBJQk00MzcgZW5jb2RpbmcgaXMKKyAgICAgICAgLy8vICAgaW5jb252ZW5pZW50LCBhbmQgY2FuIGFsc28gbGVhZCB0byBydW50aW1lIGVycm9ycy4gRm9yIGV4YW1wbGUsIHVzaW5nCisgICAgICAgIC8vLyAgIElCTTQzNywgYW55IHNlcXVlbmNlIG9mIDQgQ2hpbmVzZSBjaGFyYWN0ZXJzIHdpbGwgYmUgZW5jb2RlZCBhcyA/Pz8/LiAgSWYKKyAgICAgICAgLy8vICAgeW91ciBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiwgZG9lcyBub3Qgc2V0IHRoZQorICAgICAgICAvLy8gICBlbmNvZGluZywgdGhlbiBhZGRzIHR3byBmaWxlcywgZWFjaCB3aXRoIG5hbWVzIG9mIGZvdXIgQ2hpbmVzZSBjaGFyYWN0ZXJzCisgICAgICAgIC8vLyAgIGVhY2gsIHRoaXMgd2lsbCByZXN1bHQgaW4gYSBkdXBsaWNhdGUgZmlsZW5hbWUgZXhjZXB0aW9uLiAgSW4gdGhlIGNhc2UKKyAgICAgICAgLy8vICAgd2hlcmUgeW91IGFkZCBhIHNpbmdsZSBmaWxlIHdpdGggYSBuYW1lIGNvbnRhaW5pbmcgZm91ciBDaGluZXNlCisgICAgICAgIC8vLyAgIGNoYXJhY3RlcnMsIHRoZSB6aXBmaWxlIHdpbGwgc2F2ZSBwcm9wZXJseSwgYnV0IGV4dHJhY3RpbmcgdGhhdCBmaWxlCisgICAgICAgIC8vLyAgIGxhdGVyLCB3aXRoIGFueSB6aXAgdG9vbCwgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IsIGJlY2F1c2UgdGhlIHF1ZXN0aW9uCisgICAgICAgIC8vLyAgIG1hcmsgaXMgbm90IGxlZ2FsIGZvciB1c2Ugd2l0aGluIGZpbGVuYW1lcyBvbiBXaW5kb3dzLiAgVGhlc2UgYXJlIGp1c3QgYQorICAgICAgICAvLy8gICBmZXcgZXhhbXBsZXMgb2YgdGhlIHByb2JsZW1zIGFzc29jaWF0ZWQgdG8gbG9zcyBvZiBpbmZvcm1hdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBmbGFnIGlzIGluZGVwZW5kZW50IG9mIHRoZSBlbmNvZGluZyBvZiB0aGUgY29udGVudCB3aXRoaW4gdGhlIGVudHJpZXMKKyAgICAgICAgLy8vICAgaW4gdGhlIHppcCBmaWxlLiBUaGluayBvZiB0aGUgemlwIGZpbGUgYXMgYSBjb250YWluZXIgLSBpdCBzdXBwb3J0cyBhbgorICAgICAgICAvLy8gICBlbmNvZGluZy4gIFdpdGhpbiB0aGUgY29udGFpbmVyIGFyZSBvdGhlciAiY29udGFpbmVycyIgLSB0aGUgZmlsZSBlbnRyaWVzCisgICAgICAgIC8vLyAgIHRoZW1zZWx2ZXMuICBUaGUgZW5jb2Rpbmcgd2l0aGluIHRob3NlIGVudHJpZXMgaXMgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgICAgIC8vLyAgIGVuY29kaW5nIG9mIHRoZSB6aXAgYXJjaGl2ZSBjb250YWluZXIgZm9yIHRob3NlIGVudHJpZXMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFJhdGhlciB0aGFuIHNwZWNpZnkgdGhlIGVuY29kaW5nIGluIGEgYmluYXJ5IGZhc2hpb24gdXNpbmcgdGhpcyBmbGFnLCBhbgorICAgICAgICAvLy8gICBhcHBsaWNhdGlvbiBjYW4gc3BlY2lmeSBhbiBhcmJpdHJhcnkgZW5jb2RpbmcgdmlhIHRoZSA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmciLz4gcHJvcGVydHkuICBTZXR0aW5nIHRoZSBlbmNvZGluZworICAgICAgICAvLy8gICBleHBsaWNpdGx5IHdoZW4gY3JlYXRpbmcgemlwIGFyY2hpdmVzIHdpbGwgcmVzdWx0IGluIG5vbi1jb21wbGlhbnQgemlwCisgICAgICAgIC8vLyAgIGZpbGVzIHRoYXQsIGN1cmlvdXNseSwgYXJlIGZhaXJseSBpbnRlcm9wZXJhYmxlLiAgVGhlIGNoYWxsZW5nZSBpcywgdGhlCisgICAgICAgIC8vLyAgIFBLV2FyZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHByb3ZpZGUgZm9yIGEgd2F5IHRvIHNwZWNpZnkgdGhhdCBhbiBlbnRyeQorICAgICAgICAvLy8gICBpbiBhIHppcCBhcmNoaXZlIHVzZXMgYSBjb2RlIHBhZ2UgdGhhdCBpcyBuZWl0aGVyIElCTTQzNyBub3IgVVRGLTguCisgICAgICAgIC8vLyAgIFRoZXJlZm9yZSBpZiB5b3Ugc2V0IHRoZSBlbmNvZGluZyBleHBsaWNpdGx5IHdoZW4gY3JlYXRpbmcgYSB6aXAgYXJjaGl2ZSwKKyAgICAgICAgLy8vICAgeW91IG11c3QgdGFrZSBjYXJlIHVwb24gcmVhZGluZyB0aGUgemlwIGFyY2hpdmUgdG8gdXNlIHRoZSBzYW1lIGNvZGUgcGFnZS4KKyAgICAgICAgLy8vICAgSWYgeW91IGdldCBpdCB3cm9uZywgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBhbmQgbWF5IHJlc3VsdCBpbiBpbmNvcnJlY3QKKyAgICAgICAgLy8vICAgZmlsZW5hbWVzLCBleGNlcHRpb25zLCBzdG9tYWNoIHVwc2V0LCBoYWlyIGxvc3MsIGFuZCBhY25lLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPgorICAgICAgICBbT2Jzb2xldGUoIkJlZ2lubmluZyB3aXRoIHYxLjkuMS42IG9mIERvdE5ldFppcCwgdGhpcyBwcm9wZXJ0eSBpcyBvYnNvbGV0ZS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFVzZSBBbHRlcm5hdGVFbmNvZGluZyBhbmQgQWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSBpbnN0ZWFkLiIpXQorICAgICAgICBwdWJsaWMgYm9vbCBVc2VVbmljb2RlQXNOZWNlc3NhcnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChfYWx0ZXJuYXRlRW5jb2RpbmcgPT0gU3lzdGVtLlRleHQuRW5jb2RpbmcuVVRGOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPT0gWmlwT3B0aW9uLkFzTmVjZXNzYXJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nLlVURjg7CisgICAgICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gWmlwT3B0aW9uLkFzTmVjZXNzYXJ5OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZyA9IElvbmljLlppcC5aaXBPdXRwdXRTdHJlYW0uRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgICAgICAgICBfYWx0ZXJuYXRlRW5jb2RpbmdVc2FnZSA9IFppcE9wdGlvbi5OZXZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIHRleHQgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZW1pdHRpbmcgZW50cmllcyBpbnRvIHRoZSB6aXAgYXJjaGl2ZSwgZm9yCisgICAgICAgIC8vLyAgIHRob3NlIGVudHJpZXMgd2hvc2UgZmlsZW5hbWVzIG9yIGNvbW1lbnRzIGNhbm5vdCBiZSBlbmNvZGVkIHdpdGggdGhlCisgICAgICAgIC8vLyAgIGRlZmF1bHQgKElCTTQzNykgZW5jb2RpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgSW4gPHNlZSBocmVmPSJodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5pdHMKKyAgICAgICAgLy8vICAgemlwIHNwZWNpZmljYXRpb248L3NlZT4sIFBLV2FyZSBkZXNjcmliZXMgdHdvIG9wdGlvbnMgZm9yIGVuY29kaW5nCisgICAgICAgIC8vLyAgIGZpbGVuYW1lcyBhbmQgY29tbWVudHM6IHVzaW5nIElCTTQzNyBvciBVVEYtOC4gIEJ1dCwgc29tZSBhcmNoaXZpbmcgdG9vbHMKKyAgICAgICAgLy8vICAgb3IgbGlicmFyaWVzIGRvIG5vdCBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24sIGFuZCBpbnN0ZWFkIGVuY29kZQorICAgICAgICAvLy8gICBjaGFyYWN0ZXJzIHVzaW5nIHRoZSBzeXN0ZW0gZGVmYXVsdCBjb2RlIHBhZ2UuICBGb3IgZXhhbXBsZSwgV2luUkFSIHdoZW4KKyAgICAgICAgLy8vICAgcnVuIG9uIGEgbWFjaGluZSBpbiBTaGFuZ2hhaSBtYXkgZW5jb2RlIGZpbGVuYW1lcyB3aXRoIHRoZSBCaWctNSBDaGluZXNlCisgICAgICAgIC8vLyAgICg5NTApIGNvZGUgcGFnZS4gIFRoaXMgYmVoYXZpb3IgaXMgY29udHJhcnkgdG8gdGhlIFppcCBzcGVjaWZpY2F0aW9uLCBidXQKKyAgICAgICAgLy8vICAgaXQgb2NjdXJzIGFueXdheS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiB1c2luZyBEb3ROZXRaaXAgdG8gd3JpdGUgemlwIGFyY2hpdmVzIHRoYXQgd2lsbCBiZSByZWFkIGJ5IG9uZSBvZgorICAgICAgICAvLy8gICB0aGVzZSBvdGhlciBhcmNoaXZlcnMsIHNldCB0aGlzIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGNvZGUgcGFnZSB0byB1c2UKKyAgICAgICAgLy8vICAgd2hlbiBlbmNvZGluZyB0aGUgPHNlZSBjcmVmPSJaaXBFbnRyeS5GaWxlTmFtZSIvPiBhbmQgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJaaXBFbnRyeS5Db21tZW50Ii8+IGZvciBlYWNoIDxjPlppcEVudHJ5PC9jPiBpbiB0aGUgemlwIGZpbGUsIGZvcgorICAgICAgICAvLy8gICB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCB3aXRoIHRoZSBkZWZhdWx0IGNvZGVwYWdlIGZvciB6aXAgZmlsZXMsCisgICAgICAgIC8vLyAgIElCTTQzNy4gIFRoaXMgaXMgd2h5IHRoaXMgcHJvcGVydHkgaXMgInByb3Zpc2lvbmFsIi4gIEluIGFsbCBjYXNlcywgSUJNNDM3CisgICAgICAgIC8vLyAgIGlzIHVzZWQgd2hlcmUgcG9zc2libGUsIGluIG90aGVyIHdvcmRzLCB3aGVyZSBubyBsb3NzIG9mIGRhdGEgd291bGQKKyAgICAgICAgLy8vICAgcmVzdWx0LiBJdCBpcyBwb3NzaWJsZSwgdGhlcmVmb3JlLCB0byBoYXZlIGEgZ2l2ZW4gZW50cnkgd2l0aCBhCisgICAgICAgIC8vLyAgIDxjPkNvbW1lbnQ8L2M+IGVuY29kZWQgaW4gSUJNNDM3IGFuZCBhIDxjPkZpbGVOYW1lPC9jPiBlbmNvZGVkIHdpdGggdGhlCisgICAgICAgIC8vLyAgIHNwZWNpZmllZCAicHJvdmlzaW9uYWwiIGNvZGVwYWdlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBCZSBhd2FyZSB0aGF0IGEgemlwIGZpbGUgY3JlYXRlZCBhZnRlciB5b3UndmUgZXhwbGljaXRseSBzZXQgdGhlCisgICAgICAgIC8vLyAgIDxjPlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2Rpbmc8L2M+IHByb3BlcnR5IHRvIGEgdmFsdWUgb3RoZXIgdGhhbgorICAgICAgICAvLy8gICBJQk00MzcgbWF5IG5vdCBiZSBjb21wbGlhbnQgdG8gdGhlIFBLV2FyZSBzcGVjaWZpY2F0aW9uLCBhbmQgbWF5IG5vdCBiZQorICAgICAgICAvLy8gICByZWFkYWJsZSBieSBjb21wbGlhbnQgYXJjaGl2ZXJzLiAgT24gdGhlIG90aGVyIGhhbmQsIG1hbnkgKG1vc3Q/KQorICAgICAgICAvLy8gICBhcmNoaXZlcnMgYXJlIG5vbi1jb21wbGlhbnQgYW5kIGNhbiByZWFkIHppcCBmaWxlcyBjcmVhdGVkIGluIGFyYml0cmFyeQorICAgICAgICAvLy8gICBjb2RlIHBhZ2VzLiAgVGhlIHRyaWNrIGlzIHRvIHVzZSBvciBzcGVjaWZ5IHRoZSBwcm9wZXIgY29kZXBhZ2Ugd2hlbgorICAgICAgICAvLy8gICByZWFkaW5nIHRoZSB6aXAuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gY3JlYXRpbmcgYSB6aXAgYXJjaGl2ZSB1c2luZyB0aGlzIGxpYnJhcnksIGl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZQorICAgICAgICAvLy8gICB0aGUgdmFsdWUgb2YgPGM+UHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZzwvYz4gYmV0d2VlbiBlYWNoIGVudHJ5IHlvdQorICAgICAgICAvLy8gICBhZGQsIGFuZCBiZXR3ZWVuIGFkZGluZyBlbnRyaWVzIGFuZCB0aGUgY2FsbCB0byA8Yz5DbG9zZSgpPC9jPi4gRG9uJ3QgZG8KKyAgICAgICAgLy8vICAgdGhpcy4gSXQgd2lsbCBsaWtlbHkgcmVzdWx0IGluIGEgemlwZmlsZSB0aGF0IGlzIG5vdCByZWFkYWJsZS4gIEZvciBiZXN0CisgICAgICAgIC8vLyAgIGludGVyb3BlcmFiaWxpdHksIGVpdGhlciBsZWF2ZSA8Yz5Qcm92aXNpb25hbEFsdGVybmF0ZUVuY29kaW5nPC9jPgorICAgICAgICAvLy8gICBhbG9uZSwgb3Igc3BlY2lmeSBpdCBvbmx5IG9uY2UsIGJlZm9yZSBhZGRpbmcgYW55IGVudHJpZXMgdG8gdGhlCisgICAgICAgIC8vLyAgIDxjPlppcE91dHB1dFN0cmVhbTwvYz4gaW5zdGFuY2UuICBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoaXMKKyAgICAgICAgLy8vICAgcmVjb21tZW5kYXRpb24sIGRlc2NyaWJlZCBsYXRlci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiB1c2luZyBhbiBhcmJpdHJhcnksIG5vbi1VVEY4IGNvZGUgcGFnZSBmb3IgZW5jb2RpbmcsIHRoZXJlIGlzIG5vCisgICAgICAgIC8vLyAgIHN0YW5kYXJkIHdheSBmb3IgdGhlIGNyZWF0b3IgYXBwbGljYXRpb24gLSB3aGV0aGVyIERvdE5ldFppcCwgV2luWmlwLAorICAgICAgICAvLy8gICBXaW5SYXIsIG9yIHNvbWV0aGluZyBlbHNlIC0gdG8gZm9ybWFsbHkgc3BlY2lmeSBpbiB0aGUgemlwIGZpbGUgd2hpY2gKKyAgICAgICAgLy8vICAgY29kZXBhZ2UgaGFzIGJlZW4gdXNlZCBmb3IgdGhlIGVudHJpZXMuIEFzIGEgcmVzdWx0LCByZWFkZXJzIG9mIHppcCBmaWxlcworICAgICAgICAvLy8gICBhcmUgbm90IGFibGUgdG8gaW5zcGVjdCB0aGUgemlwIGZpbGUgYW5kIGRldGVybWluZSB0aGUgY29kZXBhZ2UgdGhhdCB3YXMKKyAgICAgICAgLy8vICAgdXNlZCBmb3IgdGhlIGVudHJpZXMgY29udGFpbmVkIHdpdGhpbiBpdC4gIEl0IGlzIGxlZnQgdG8gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIC8vLyAgIG9yIHVzZXIgdG8gZGV0ZXJtaW5lIHRoZSBuZWNlc3NhcnkgY29kZXBhZ2Ugd2hlbiByZWFkaW5nIHppcCBmaWxlcyBlbmNvZGVkCisgICAgICAgIC8vLyAgIHRoaXMgd2F5LiAgSWYgeW91IHVzZSBhbiBpbmNvcnJlY3QgY29kZXBhZ2Ugd2hlbiByZWFkaW5nIGEgemlwZmlsZSwgeW91CisgICAgICAgIC8vLyAgIHdpbGwgZ2V0IGVudHJpZXMgd2l0aCBmaWxlbmFtZXMgdGhhdCBhcmUgaW5jb3JyZWN0LCBhbmQgdGhlIGluY29ycmVjdAorICAgICAgICAvLy8gICBmaWxlbmFtZXMgbWF5IGV2ZW4gY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBsZWdhbCBmb3IgdXNlIHdpdGhpbgorICAgICAgICAvLy8gICBmaWxlbmFtZXMgaW4gV2luZG93cy4gRXh0cmFjdGluZyBlbnRyaWVzIHdpdGggaWxsZWdhbCBjaGFyYWN0ZXJzIGluIHRoZQorICAgICAgICAvLy8gICBmaWxlbmFtZXMgd2lsbCBsZWFkIHRvIGV4Y2VwdGlvbnMuIEl0J3MgdG9vIGJhZCwgYnV0IHRoaXMgaXMganVzdCB0aGUgd2F5CisgICAgICAgIC8vLyAgIHRoaW5ncyBhcmUgd2l0aCBjb2RlIHBhZ2VzIGluIHppcCBmaWxlcy4gQ2F2ZWF0IEVtcHRvci4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgT25lIHBvc3NpYmxlIGFwcHJvYWNoIGZvciBzcGVjaWZ5aW5nIHRoZSBjb2RlIHBhZ2UgZm9yIGEgZ2l2ZW4gemlwIGZpbGUgaXMKKyAgICAgICAgLy8vICAgdG8gZGVzY3JpYmUgdGhlIGNvZGUgcGFnZSBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0gaW4gdGhlIFppcCBjb21tZW50LiBGb3IKKyAgICAgICAgLy8vICAgZXhhbXBsZSwgdGhlIGNvbW1lbnQgbWF5IHJlYWQgIkVudHJpZXMgaW4gdGhpcyBhcmNoaXZlIGFyZSBlbmNvZGVkIGluIHRoZQorICAgICAgICAvLy8gICBCaWc1IGNvZGUgcGFnZSIuICBGb3IgbWF4aW11bSBpbnRlcm9wZXJhYmlsaXR5LCB0aGUgemlwIGNvbW1lbnQgaW4gdGhpcworICAgICAgICAvLy8gICBjYXNlIHNob3VsZCBiZSBlbmNvZGVkIGluIHRoZSBkZWZhdWx0LCBJQk00MzcgY29kZSBwYWdlLiAgSW4gdGhpcyBjYXNlLAorICAgICAgICAvLy8gICB0aGUgemlwIGNvbW1lbnQgaXMgZW5jb2RlZCB1c2luZyBhIGRpZmZlcmVudCBwYWdlIHRoYW4gdGhlIGZpbGVuYW1lcy4gIFRvCisgICAgICAgIC8vLyAgIGRvIHRoaXMsIFNwZWNpZnkgPGM+UHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZzwvYz4gdG8geW91ciBkZXNpcmVkCisgICAgICAgIC8vLyAgIHJlZ2lvbi1zcGVjaWZpYyBjb2RlIHBhZ2UsIG9uY2UgYmVmb3JlIGFkZGluZyBhbnkgZW50cmllcywgYW5kIHRoZW4gc2V0CisgICAgICAgIC8vLyAgIHRoZSA8c2VlIGNyZWY9IkNvbW1lbnQiLz4gcHJvcGVydHkgYW5kIHJlc2V0CisgICAgICAgIC8vLyAgIDxjPlByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2Rpbmc8L2M+IHRvIElCTTQzNyBiZWZvcmUgY2FsbGluZyA8Yz5DbG9zZSgpPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgW09ic29sZXRlKCJ1c2UgQWx0ZXJuYXRlRW5jb2RpbmcgYW5kIEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UgaW5zdGVhZC4iKV0KKyAgICAgICAgcHVibGljIFN5c3RlbS5UZXh0LkVuY29kaW5nIFByb3Zpc2lvbmFsQWx0ZXJuYXRlRW5jb2RpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9hbHRlcm5hdGVFbmNvZGluZ1VzYWdlID09IFppcE9wdGlvbi5Bc05lY2Vzc2FyeSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hbHRlcm5hdGVFbmNvZGluZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZyA9IHZhbHVlOworICAgICAgICAgICAgICAgIF9hbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gWmlwT3B0aW9uLkFzTmVjZXNzYXJ5OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBBIFRleHQgRW5jb2RpbmcgdG8gdXNlIHdoZW4gZW5jb2RpbmcgdGhlIGZpbGVuYW1lcyBhbmQgY29tbWVudHMgZm9yCisgICAgICAgIC8vLyAgIGFsbCB0aGUgWmlwRW50cnkgaXRlbXMsIGR1cmluZyBhIFppcEZpbGUuU2F2ZSgpIG9wZXJhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBXaGV0aGVyIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgaGVyZSBpcyB1c2VkIGR1cmluZyB0aGUgc2F2ZSBkZXBlbmRzCisgICAgICAgIC8vLyAgICAgb24gPHNlZSBjcmVmPSJBbHRlcm5hdGVFbmNvZGluZ1VzYWdlIi8+LgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBTeXN0ZW0uVGV4dC5FbmNvZGluZyBBbHRlcm5hdGVFbmNvZGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2FsdGVybmF0ZUVuY29kaW5nID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIEEgZmxhZyB0aGF0IHRlbGxzIGlmIGFuZCB3aGVuIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGFwcGx5CisgICAgICAgIC8vLyAgIEFsdGVybmF0ZUVuY29kaW5nIHRvIGVuY29kZSB0aGUgZmlsZW5hbWVzIGFuZCBjb21tZW50cyBhc3NvY2lhdGVkIHRvCisgICAgICAgIC8vLyAgIG9mIFppcEVudHJ5IG9iamVjdHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGluc3RhbmNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWmlwT3B0aW9uIEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hbHRlcm5hdGVFbmNvZGluZ1VzYWdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2FsdGVybmF0ZUVuY29kaW5nVXNhZ2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IHRleHQgZW5jb2RpbmcgdXNlZCBpbiB6aXAgYXJjaGl2ZXMuICBJdCBpcyBudW1lcmljIDQzNywgYWxzbworICAgICAgICAvLy8ga25vd24gYXMgSUJNNDM3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iSW9uaWMuWmlwLlppcEZpbGUuUHJvdmlzaW9uYWxBbHRlcm5hdGVFbmNvZGluZyIvPgorICAgICAgICBwdWJsaWMgc3RhdGljIFN5c3RlbS5UZXh0LkVuY29kaW5nIERlZmF1bHRFbmNvZGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLlRleHQuRW5jb2RpbmcuR2V0RW5jb2RpbmcoIklCTTQzNyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworI2lmICFORVRDRgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBzaXplIHRocmVzaG9sZCBmb3IgYW4gZW50cnksIGFib3ZlIHdoaWNoIGEgcGFyYWxsZWwgZGVmbGF0ZSBpcyB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgRG90TmV0WmlwIHdpbGwgdXNlIG11bHRpcGxlIHRocmVhZHMgdG8gY29tcHJlc3MgYW55IFppcEVudHJ5LCB3aGVuCisgICAgICAgIC8vLyAgICAgdGhlIDxjPkNvbXByZXNzaW9uTWV0aG9kPC9jPiBpcyBEZWZsYXRlLCBhbmQgaWYgdGhlIGVudHJ5IGlzCisgICAgICAgIC8vLyAgICAgbGFyZ2VyIHRoYW4gdGhlIGdpdmVuIHNpemUuICBaZXJvIG1lYW5zICJhbHdheXMgdXNlIHBhcmFsbGVsCisgICAgICAgIC8vLyAgICAgZGVmbGF0ZSIsIHdoaWxlIC0xIG1lYW5zICJuZXZlciB1c2UgcGFyYWxsZWwgZGVmbGF0ZSIuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIElmIHRoZSBlbnRyeSBzaXplIGNhbm5vdCBiZSBrbm93biBiZWZvcmUgY29tcHJlc3Npb24sIGFzIHdpdGggYW55IGVudHJ5CisgICAgICAgIC8vLyAgICAgYWRkZWQgdmlhIGEgWmlwT3V0cHV0U3RyZWFtLCB0aGVuIFBhcmFsbGVsIGRlZmxhdGUgd2lsbCBuZXZlciBiZQorICAgICAgICAvLy8gICAgIHBlcmZvcm1lZCwgdW5sZXNzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIHplcm8uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIEEgcGFyYWxsZWwgZGVmbGF0ZSBvcGVyYXRpb25zIHdpbGwgc3BlZWQgdXAgdGhlIGNvbXByZXNzaW9uIG9mCisgICAgICAgIC8vLyAgICAgbGFyZ2UgZmlsZXMsIG9uIGNvbXB1dGVycyB3aXRoIG11bHRpcGxlIENQVXMgb3IgbXVsdGlwbGUgQ1BVCisgICAgICAgIC8vLyAgICAgY29yZXMuICBGb3IgZmlsZXMgYWJvdmUgMW1iLCBvbiBhIGR1YWwgY29yZSBvciBkdWFsLWNwdSAoMnApCisgICAgICAgIC8vLyAgICAgbWFjaGluZSwgdGhlIHRpbWUgcmVxdWlyZWQgdG8gY29tcHJlc3MgdGhlIGZpbGUgY2FuIGJlIDcwJSBvZiB0aGUKKyAgICAgICAgLy8vICAgICBzaW5nbGUtdGhyZWFkZWQgZGVmbGF0ZS4gIEZvciB2ZXJ5IGxhcmdlIGZpbGVzIG9uIDRwIG1hY2hpbmVzIHRoZQorICAgICAgICAvLy8gICAgIGNvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIDMwJSBvZiB0aGUgbm9ybWFsIHRpbWUuICBUaGUgZG93bnNpZGUKKyAgICAgICAgLy8vICAgICBpcyB0aGF0IHBhcmFsbGVsIGRlZmxhdGUgY29uc3VtZXMgZXh0cmEgbWVtb3J5IGR1cmluZyB0aGUgZGVmbGF0ZSwKKyAgICAgICAgLy8vICAgICBhbmQgdGhlIGRlZmxhdGlvbiBpcyBzbGlnaHRseSBsZXNzIGVmZmVjdGl2ZS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgUGFyYWxsZWwgZGVmbGF0ZSB0ZW5kcyB0byBub3QgYmUgYXMgZWZmZWN0aXZlIGFzIHNpbmdsZS10aHJlYWRlZCBkZWZsYXRlCisgICAgICAgIC8vLyAgICAgYmVjYXVzZSB0aGUgb3JpZ2luYWwgZGF0YSBzdHJlYW0gaXMgc3BsaXQgaW50byBtdWx0aXBsZSBpbmRlcGVuZGVudAorICAgICAgICAvLy8gICAgIGJ1ZmZlcnMsIGVhY2ggb2Ygd2hpY2ggaXMgY29tcHJlc3NlZCBpbiBwYXJhbGxlbC4gIEJ1dCBiZWNhdXNlIHRoZXkgYXJlCisgICAgICAgIC8vLyAgICAgdHJlYXRlZCBpbmRlcGVuZGVudGx5LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBzaGFyZSBjb21wcmVzc2lvbgorICAgICAgICAvLy8gICAgIGRpY3Rpb25hcmllcywgYW5kIGFkZGl0aW9uYWwgZnJhbWluZyBieXRlcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgLy8vICAgICBzdHJlYW0uICBGb3IgdGhhdCByZWFzb24sIGEgZGVmbGF0ZWQgc3RyZWFtIG1heSBiZSBzbGlnaHRseSBsYXJnZXIgd2hlbgorICAgICAgICAvLy8gICAgIGNvbXByZXNzZWQgdXNpbmcgcGFyYWxsZWwgZGVmbGF0ZSwgYXMgY29tcGFyZWQgdG8gYSB0cmFkaXRpb25hbAorICAgICAgICAvLy8gICAgIHNpbmdsZS10aHJlYWRlZCBkZWZsYXRlLiBGb3IgZmlsZXMgb2YgYWJvdXQgNTEyaywgdGhlIGluY3JlYXNlIG92ZXIgdGhlCisgICAgICAgIC8vLyAgICAgbm9ybWFsIGRlZmxhdGUgaXMgYXMgbXVjaCBhcyA1JSBvZiB0aGUgdG90YWwgY29tcHJlc3NlZCBzaXplLiBGb3IgbGFyZ2VyCisgICAgICAgIC8vLyAgICAgZmlsZXMsIHRoZSBkaWZmZXJlbmNlIGNhbiBiZSBhcyBzbWFsbCBhcyAwLjElLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBNdWx0aS10aHJlYWRlZCBjb21wcmVzc2lvbiBkb2VzIG5vdCBnaXZlIGFzIG11Y2ggYW4gYWR2YW50YWdlIHdoZW4gdXNpbmcKKyAgICAgICAgLy8vICAgICBFbmNyeXB0aW9uLiBUaGlzIGlzIHByaW1hcmlseSBiZWNhdXNlIGVuY3J5cHRpb24gdGVuZHMgdG8gc2xvdyBkb3duCisgICAgICAgIC8vLyAgICAgdGhlIGVudGlyZSBwaXBlbGluZS4gQWxzbywgbXVsdGktdGhyZWFkZWQgY29tcHJlc3Npb24gZ2l2ZXMgbGVzcyBvZiBhbgorICAgICAgICAvLy8gICAgIGFkdmFudGFnZSB3aGVuIHVzaW5nIGxvd2VyIGNvbXByZXNzaW9uIGxldmVscywgZm9yIGV4YW1wbGUgPHNlZQorICAgICAgICAvLy8gICAgIGNyZWY9IklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbC5CZXN0U3BlZWQiLz4uICBZb3UgbWF5IGhhdmUgdG8gcGVyZm9ybQorICAgICAgICAvLy8gICAgIHNvbWUgdGVzdHMgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IGFwcHJvYWNoIGZvciB5b3VyIHNpdHVhdGlvbi4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgaXMgLTEsIHdoaWNoIG1lYW5zIHBhcmFsbGVsCisgICAgICAgIC8vLyAgICAgY29tcHJlc3Npb24gd2lsbCBub3QgYmUgcGVyZm9ybWVkIHVubGVzcyB5b3Ugc2V0IGl0IHRvIHplcm8uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBsb25nIFBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHZhbHVlICE9IDApICYmICh2YWx1ZSAhPSAtMSkgJiYgKHZhbHVlIDwgNjQgKiAxMDI0KSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigidmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNjRrLCBvciAwLCBvciAtMSIpOworICAgICAgICAgICAgICAgIF9QYXJhbGxlbERlZmxhdGVUaHJlc2hvbGQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXIgcGFpcnMgdG8gdXNlIHdoZW4gcGVyZm9ybWluZworICAgICAgICAvLy8gICBwYXJhbGxlbCBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIHByb3BlcnR5IHNldHMgYW4gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBtZW1vcnkKKyAgICAgICAgLy8vICAgYnVmZmVyIHBhaXJzIHRvIGNyZWF0ZSB3aGVuIHBlcmZvcm1pbmcgcGFyYWxsZWwKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24uICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcmFsbGVsCisgICAgICAgIC8vLyAgIGNvbXByZXNzaW9uIHN0cmVhbSBhbGxvY2F0ZXMgbXVsdGlwbGUgYnVmZmVycyB0bworICAgICAgICAvLy8gICBmYWNpbGl0YXRlIHBhcmFsbGVsIGNvbXByZXNzaW9uLiAgQXMgZWFjaCBidWZmZXIgZmlsbHMgdXAsCisgICAgICAgIC8vLyAgIHRoZSBzdHJlYW0gdXNlcyA8c2VlCisgICAgICAgIC8vLyAgIGNyZWY9IlN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbShXYWl0Q2FsbGJhY2spIj4KKyAgICAgICAgLy8vICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSgpPC9zZWU+IHRvIGNvbXByZXNzIHRob3NlCisgICAgICAgIC8vLyAgIGJ1ZmZlcnMgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZHBvb2wgdGhyZWFkLiBBZnRlciBhIGJ1ZmZlcgorICAgICAgICAvLy8gICBpcyBjb21wcmVzc2VkLCBpdCBpcyByZS1vcmRlcmVkIGFuZCB3cml0dGVuIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgLy8vICAgc3RyZWFtLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBIGhpZ2hlciBudW1iZXIgb2YgYnVmZmVyIHBhaXJzIGVuYWJsZXMgYSBoaWdoZXIgZGVncmVlIG9mCisgICAgICAgIC8vLyAgIHBhcmFsbGVsaXNtLCB3aGljaCB0ZW5kcyB0byBpbmNyZWFzZSB0aGUgc3BlZWQgb2YgY29tcHJlc3Npb24gb24KKyAgICAgICAgLy8vICAgbXVsdGktY3B1IGNvbXB1dGVycy4gIE9uIHRoZSBvdGhlciBoYW5kLCBhIGhpZ2hlciBudW1iZXIgb2YgYnVmZmVyCisgICAgICAgIC8vLyAgIHBhaXJzIGFsc28gaW1wbGllcyBhIGxhcmdlciBtZW1vcnkgY29uc3VtcHRpb24sIG1vcmUgYWN0aXZlIHdvcmtlcgorICAgICAgICAvLy8gICB0aHJlYWRzLCBhbmQgYSBoaWdoZXIgY3B1IHV0aWxpemF0aW9uIGZvciBhbnkgY29tcHJlc3Npb24uIFRoaXMKKyAgICAgICAgLy8vICAgcHJvcGVydHkgZW5hYmxlcyB0aGUgYXBwbGljYXRpb24gdG8gbGltaXQgaXRzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQKKyAgICAgICAgLy8vICAgQ1BVIHV0aWxpemF0aW9uIGJlaGF2aW9yIGRlcGVuZGluZyBvbiByZXF1aXJlbWVudHMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEZvciBlYWNoIGNvbXByZXNzaW9uICJ0YXNrIiB0aGF0IG9jY3VycyBpbiBwYXJhbGxlbCwgdGhlcmUgYXJlIDIKKyAgICAgICAgLy8vICAgYnVmZmVycyBhbGxvY2F0ZWQ6IG9uZSBmb3IgaW5wdXQgYW5kIG9uZSBmb3Igb3V0cHV0LiAgVGhpcyBwcm9wZXJ0eQorICAgICAgICAvLy8gICBzZXRzIGEgbGltaXQgZm9yIHRoZSBudW1iZXIgb2YgcGFpcnMuICBUaGUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UKKyAgICAgICAgLy8vICAgc3BhY2UgYWxsb2NhdGVkIGZvciBidWZmZXJpbmcgd2lsbCB0aGVuIGJlIChOKlMqMiksIHdoZXJlIE4gaXMgdGhlCisgICAgICAgIC8vLyAgIG51bWJlciBvZiBidWZmZXIgcGFpcnMsIFMgaXMgdGhlIHNpemUgb2YgZWFjaCBidWZmZXIgKDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iQ29kZWNCdWZmZXJTaXplIi8+KS4gIEJ5IGRlZmF1bHQsIERvdE5ldFppcCBhbGxvY2F0ZXMgNCBidWZmZXIKKyAgICAgICAgLy8vICAgcGFpcnMgcGVyIENQVSBjb3JlLCBzbyBpZiB5b3VyIG1hY2hpbmUgaGFzIDQgY29yZXMsIGFuZCB5b3UgcmV0YWluCisgICAgICAgIC8vLyAgIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplIG9mIDEyOGssIHRoZW4gdGhlCisgICAgICAgIC8vLyAgIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSB3aWxsIHVzZSA0ICogNCAqIDIgKiAxMjhrYiBvZiBidWZmZXIKKyAgICAgICAgLy8vICAgbWVtb3J5IGluIHRvdGFsLCBvciA0bWIsIGluIGJsb2NrcyBvZiAxMjhrYi4gIElmIHlvdSB0aGVuIHNldCB0aGlzCisgICAgICAgIC8vLyAgIHByb3BlcnR5IHRvIDgsIHRoZW4gdGhlIG51bWJlciB3aWxsIGJlIDggKiAyICogMTI4a2Igb2YgYnVmZmVyCisgICAgICAgIC8vLyAgIG1lbW9yeSwgb3IgMm1iLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBDUFUgdXRpbGl6YXRpb24gd2lsbCBhbHNvIGdvIHVwIHdpdGggYWRkaXRpb25hbCBidWZmZXJzLCBiZWNhdXNlIGEKKyAgICAgICAgLy8vICAgbGFyZ2VyIG51bWJlciBvZiBidWZmZXIgcGFpcnMgYWxsb3dzIGEgbGFyZ2VyIG51bWJlciBvZiBiYWNrZ3JvdW5kCisgICAgICAgIC8vLyAgIHRocmVhZHMgdG8gY29tcHJlc3MgaW4gcGFyYWxsZWwuIElmIHlvdSBmaW5kIHRoYXQgcGFyYWxsZWwKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24gaXMgY29uc3VtaW5nIHRvbyBtdWNoIG1lbW9yeSBvciBDUFUsIHlvdSBjYW4gYWRqdXN0IHRoaXMKKyAgICAgICAgLy8vICAgdmFsdWUgZG93bndhcmQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE2LiBEaWZmZXJlbnQgdmFsdWVzIG1heSBkZWxpdmVyIGJldHRlciBvcgorICAgICAgICAvLy8gICB3b3JzZSByZXN1bHRzLCBkZXBlbmRpbmcgb24geW91ciBwcmlvcml0aWVzIGFuZCB0aGUgZHluYW1pYworICAgICAgICAvLy8gICBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBzdG9yYWdlIGFuZCBjb21wdXRlIHJlc291cmNlcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBpcyBub3QgdGhlIG51bWJlciBvZiBidWZmZXIgcGFpcnMgdG8gdXNlOyBpdCBpcyBhbgorICAgICAgICAvLy8gICB1cHBlciBsaW1pdC4gQW4gaWxsdXN0cmF0aW9uOiBTdXBwb3NlIHlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQKKyAgICAgICAgLy8vICAgdXNlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5ICh3aGljaCBpcyAxNiksIGFuZCBpdCBydW5zCisgICAgICAgIC8vLyAgIG9uIGEgbWFjaGluZSB3aXRoIDIgQ1BVIGNvcmVzLiBJbiB0aGF0IGNhc2UsIERvdE5ldFppcCB3aWxsIGFsbG9jYXRlCisgICAgICAgIC8vLyAgIDQgYnVmZmVyIHBhaXJzIHBlciBDUFUgY29yZSwgZm9yIGEgdG90YWwgb2YgOCBwYWlycy4gIFRoZSB1cHBlcgorICAgICAgICAvLy8gICBsaW1pdCBzcGVjaWZpZWQgYnkgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgYXBwbGljYXRpb24gY2FuIHNldCB0aGlzIHZhbHVlIGF0IGFueSB0aW1lLCBidXQgaXQgaXMKKyAgICAgICAgLy8vICAgZWZmZWN0aXZlIG9ubHkgaWYgc2V0IGJlZm9yZSBjYWxsaW5nCisgICAgICAgIC8vLyAgIDxjPlppcE91dHB1dFN0cmVhbS5Xcml0ZSgpPC9jPiBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkIi8+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgaW50IFBhcmFsbGVsRGVmbGF0ZU1heEJ1ZmZlclBhaXJzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbWF4QnVmZmVyUGFpcnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCA0KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJQYXJhbGxlbERlZmxhdGVNYXhCdWZmZXJQYWlycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgbXVzdCBiZSA0IG9yIGdyZWF0ZXIuIik7CisgICAgICAgICAgICAgICAgX21heEJ1ZmZlclBhaXJzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluc3VyZVVuaXF1ZUVudHJ5KFppcEVudHJ5IHplMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9lbnRyaWVzV3JpdHRlbi5Db250YWluc0tleSh6ZTEuRmlsZU5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiVGhlIGVudHJ5ICd7MH0nIGFscmVhZHkgZXhpc3RzIGluIHRoZSB6aXAgYXJjaGl2ZS4iLCB6ZTEuRmlsZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgU3RyZWFtIE91dHB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX291dHB1dFN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIFN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmV0dXJucyB0cnVlIGlmIGFuIGVudHJ5IGJ5IHRoZSBnaXZlbiBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbgorICAgICAgICAvLy8gICB0byB0aGUgWmlwT3V0cHV0U3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIHNjYW4gZm9yLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vIHRydWUgaWYgYW4gZW50cnkgYnkgdGhlIGdpdmVuIG5hbWUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgYm9vbCBDb250YWluc0VudHJ5KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2VudHJpZXNXcml0dGVuLkNvbnRhaW5zS2V5KFNoYXJlZFV0aWxpdGllcy5Ob3JtYWxpemVQYXRoRm9yVXNlSW5aaXBGaWxlKG5hbWUpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBXcml0ZSB0aGUgZGF0YSBmcm9tIHRoZSBidWZmZXIgdG8gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgQXMgdGhlIGFwcGxpY2F0aW9uIHdyaXRlcyBkYXRhIGludG8gdGhpcyBzdHJlYW0sIHRoZSBkYXRhIG1heSBiZQorICAgICAgICAvLy8gICBjb21wcmVzc2VkIGFuZCBlbmNyeXB0ZWQgYmVmb3JlIGJlaW5nIHdyaXR0ZW4gb3V0IHRvIHRoZSB1bmRlcmx5aW5nCisgICAgICAgIC8vLyAgIHN0cmVhbSwgZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncyBvZiB0aGUgPHNlZSBjcmVmPSJDb21wcmVzc2lvbkxldmVsIi8+CisgICAgICAgIC8vLyAgIGFuZCB0aGUgPHNlZSBjcmVmPSJFbmNyeXB0aW9uIi8+IHByb3BlcnRpZXMuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+VGhlIGJ1ZmZlciBob2xkaW5nIGRhdGEgdG8gd3JpdGUgdG8gdGhlIHN0cmVhbS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCB3aXRoaW4gdGhhdCBkYXRhIGFycmF5IHRvIGZpbmQgdGhlIGZpcnN0IGJ5dGUgdG8gd3JpdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+dGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWZmZXI9PW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uKCJidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jdXJyZW50RW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZXhjZXB0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBjYWxsIFB1dE5leHRFbnRyeSgpIGJlZm9yZSBjYWxsaW5nIFdyaXRlKCkuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfY3VycmVudEVudHJ5LklzRGlyZWN0b3J5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIllvdSBjYW5ub3QgV3JpdGUoKSBkYXRhIGZvciBhbiBlbnRyeSB0aGF0IGlzIGEgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX25lZWRUb1dyaXRlRW50cnlIZWFkZXIpCisgICAgICAgICAgICAgICAgX0luaXRpYXRlQ3VycmVudEVudHJ5KGZhbHNlKTsKKworICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApCisgICAgICAgICAgICAgICAgX2VudHJ5T3V0cHV0U3RyZWFtLldyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBuZXh0IGVudHJ5IHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSB6aXAgZmlsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBDYWxsIHRoaXMgbWV0aG9kIGp1c3QgYmVmb3JlIGNhbGxpbmcgPHNlZSBjcmVmPSJXcml0ZShieXRlW10sIGludCwgaW50KSIvPiwgdG8KKyAgICAgICAgLy8vICAgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZW50cnkgdGhhdCB0aGUgbmV4dCBzZXQgb2YgYnl0ZXMgd3JpdHRlbiB0bworICAgICAgICAvLy8gICB0aGUgPGM+WmlwT3V0cHV0U3RyZWFtPC9jPiBiZWxvbmdzIHRvLiBBbGwgc3Vic2VxdWVudCBjYWxscyB0byA8Yz5Xcml0ZTwvYz4sCisgICAgICAgIC8vLyAgIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gPGM+UHV0TmV4dEVudHJ5PC9jPiwKKyAgICAgICAgLy8vICAgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuYW1lZCBlbnRyeSBpbiB0aGUgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHRoZSA8cGFyYW1yZWYgbmFtZT0iZW50cnlOYW1lIi8+IHVzZWQgaW4gPGM+UHV0TmV4dEVudHJ5KCk8L2M+IGVuZHMgaW4KKyAgICAgICAgLy8vICAgYSBzbGFzaCwgdGhlbiB0aGUgZW50cnkgYWRkZWQgaXMgbWFya2VkIGFzIGEgZGlyZWN0b3J5LiBCZWNhdXNlIGRpcmVjdG9yeQorICAgICAgICAvLy8gICBlbnRyaWVzIGRvIG5vdCBjb250YWluIGRhdGEsIGEgY2FsbCB0byA8Yz5Xcml0ZSgpPC9jPiwgYmVmb3JlIGFuCisgICAgICAgIC8vLyAgIGludGVydmVuaW5nIGFkZGl0aW9uYWwgY2FsbCB0byA8Yz5QdXROZXh0RW50cnkoKTwvYz4sIHdpbGwgdGhyb3cgYW4KKyAgICAgICAgLy8vICAgZXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3UgZG9uJ3QgY2FsbCA8Yz5Xcml0ZSgpPC9jPiBiZXR3ZWVuIHR3byBjYWxscyB0bworICAgICAgICAvLy8gICA8Yz5QdXROZXh0RW50cnkoKTwvYz4sIHRoZSBmaXJzdCBlbnRyeSBpcyBpbnNlcnRlZCBpbnRvIHRoZSB6aXAgZmlsZSBhcyBhCisgICAgICAgIC8vLyAgIGZpbGUgb2YgemVybyBzaXplLiAgVGhpcyBtYXkgYmUgd2hhdCB5b3Ugd2FudC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgQmVjYXVzZSA8Yz5QdXROZXh0RW50cnkoKTwvYz4gY2xvc2VzIG91dCB0aGUgcHJpb3IgZW50cnksIGlmIGFueSwgdGhpcworICAgICAgICAvLy8gICBtZXRob2QgbWF5IHRocm93IGlmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBwcmlvciBlbnRyeS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgPGM+WmlwRW50cnk8L2M+LiAgWW91IGNhbiBtb2RpZnkgcHVibGljIHByb3BlcnRpZXMKKyAgICAgICAgLy8vICAgb24gdGhlIDxjPlppcEVudHJ5PC9jPiwgc3VjaCBhcyA8c2VlIGNyZWY9IlppcEVudHJ5LkVuY3J5cHRpb24iLz4sIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iWmlwRW50cnkuUGFzc3dvcmQiLz4sIGFuZCBzbyBvbiwgdW50aWwgdGhlIGZpcnN0IGNhbGwgdG8KKyAgICAgICAgLy8vICAgPGM+WmlwT3V0cHV0U3RyZWFtLldyaXRlKCk8L2M+LCBvciB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvCisgICAgICAgIC8vLyAgIDxjPlB1dE5leHRFbnRyeSgpPC9jPi4gIElmIHlvdSBtb2RpZnkgdGhlIDxjPlppcEVudHJ5PC9jPiA8ZW0+YWZ0ZXI8L2VtPgorICAgICAgICAvLy8gICBoYXZpbmcgY2FsbGVkIDxjPldyaXRlKCk8L2M+LCB5b3UgbWF5IGdldCBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBvciB5b3UgbWF5CisgICAgICAgIC8vLyAgIHNpbGVudGx5IGdldCBhbiBpbnZhbGlkIHppcCBhcmNoaXZlLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gY3JlYXRlIGEgemlwIGZpbGUsIHVzaW5nIHRoZQorICAgICAgICAvLy8gICA8Yz5aaXBPdXRwdXRTdHJlYW08L2M+IGNsYXNzLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIFppcHVwKCkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAoRmlsZVN0cmVhbSBmcyByYXcgPSBGaWxlLk9wZW4oX291dHB1dEZpbGVOYW1lLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlICkpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAodmFyIG91dHB1dD0gbmV3IFppcE91dHB1dFN0cmVhbShmcykpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIG91dHB1dC5QYXNzd29yZCA9ICJWZXJ5U2VjcmV0ISI7CisgICAgICAgIC8vLyAgICAgICAgICAgICBvdXRwdXQuRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25BbGdvcml0aG0uV2luWmlwQWVzMjU2OworICAgICAgICAvLy8gICAgICAgICAgICAgb3V0cHV0LlB1dE5leHRFbnRyeSgiZW50cnkxLnR4dCIpOworICAgICAgICAvLy8gICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlcj0gU3lzdGVtLlRleHQuRW5jb2RpbmcuQVNDSUkuR2V0Qnl0ZXMoIlRoaXMgaXMgdGhlIGNvbnRlbnQgZm9yIGVudHJ5ICMxLiIpOworICAgICAgICAvLy8gICAgICAgICAgICAgb3V0cHV0LldyaXRlKGJ1ZmZlciwwLGJ1ZmZlci5MZW5ndGgpOworICAgICAgICAvLy8gICAgICAgICAgICAgb3V0cHV0LlB1dE5leHRFbnRyeSgiZW50cnkyLnR4dCIpOyAgLy8gdGhpcyB3aWxsIGJlIHplcm8gbGVuZ3RoCisgICAgICAgIC8vLyAgICAgICAgICAgICBvdXRwdXQuUHV0TmV4dEVudHJ5KCJlbnRyeTMudHh0Iik7CisgICAgICAgIC8vLyAgICAgICAgICAgICBidWZmZXI9IFN5c3RlbS5UZXh0LkVuY29kaW5nLkFTQ0lJLkdldEJ5dGVzKCJUaGlzIGlzIHRoZSBjb250ZW50IGZvciBlbnRyeSAjMy4iKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsMCxidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW50cnlOYW1lIj4KKyAgICAgICAgLy8vICAgVGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIGJlIGFkZGVkLCBpbmNsdWRpbmcgYW55IHBhdGggdG8gYmUgdXNlZAorICAgICAgICAvLy8gICB3aXRoaW4gdGhlIHppcCBmaWxlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIFppcEVudHJ5IGNyZWF0ZWQuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgWmlwRW50cnkgUHV0TmV4dEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShlbnRyeU5hbWUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImVudHJ5TmFtZSIpOworCisgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfRmluaXNoQ3VycmVudEVudHJ5KCk7CisgICAgICAgICAgICBfY3VycmVudEVudHJ5ID0gWmlwRW50cnkuQ3JlYXRlRm9yWmlwT3V0cHV0U3RyZWFtKGVudHJ5TmFtZSk7CisgICAgICAgICAgICBfY3VycmVudEVudHJ5Ll9jb250YWluZXIgPSBuZXcgWmlwQ29udGFpbmVyKHRoaXMpOworICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5fQml0RmllbGQgfD0gMHgwMDA4OyAgLy8gd29ya2l0ZW0gODkzMgorICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5TZXRFbnRyeVRpbWVzKERhdGVUaW1lLk5vdywgRGF0ZVRpbWUuTm93LCBEYXRlVGltZS5Ob3cpOworICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5Db21wcmVzc2lvbkxldmVsID0gdGhpcy5Db21wcmVzc2lvbkxldmVsOworICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5Db21wcmVzc2lvbk1ldGhvZCA9IHRoaXMuQ29tcHJlc3Npb25NZXRob2Q7CisgICAgICAgICAgICBfY3VycmVudEVudHJ5LlBhc3N3b3JkID0gX3Bhc3N3b3JkOyAvLyB3b3JraXRlbSAxMzkwOQorICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5FbmNyeXB0aW9uID0gdGhpcy5FbmNyeXB0aW9uOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTI2MzQKKyAgICAgICAgICAgIF9jdXJyZW50RW50cnkuQWx0ZXJuYXRlRW5jb2RpbmcgPSB0aGlzLkFsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5BbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gdGhpcy5BbHRlcm5hdGVFbmNvZGluZ1VzYWdlOworCisgICAgICAgICAgICBpZiAoZW50cnlOYW1lLkVuZHNXaXRoKCIvIikpICBfY3VycmVudEVudHJ5Lk1hcmtBc0RpcmVjdG9yeSgpOworCisgICAgICAgICAgICBfY3VycmVudEVudHJ5LkVtaXRUaW1lc0luV2luZG93c0Zvcm1hdFdoZW5TYXZpbmcgPSAoKF90aW1lc3RhbXAgJiBaaXBFbnRyeVRpbWVzdGFtcC5XaW5kb3dzKSAhPSAwKTsKKyAgICAgICAgICAgIF9jdXJyZW50RW50cnkuRW1pdFRpbWVzSW5Vbml4Rm9ybWF0V2hlblNhdmluZyA9ICgoX3RpbWVzdGFtcCAmIFppcEVudHJ5VGltZXN0YW1wLlVuaXgpICE9IDApOworICAgICAgICAgICAgSW5zdXJlVW5pcXVlRW50cnkoX2N1cnJlbnRFbnRyeSk7CisgICAgICAgICAgICBfbmVlZFRvV3JpdGVFbnRyeUhlYWRlciA9IHRydWU7CisKKyAgICAgICAgICAgIHJldHVybiBfY3VycmVudEVudHJ5OworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgdm9pZCBfSW5pdGlhdGVDdXJyZW50RW50cnkoYm9vbCBmaW5pc2hpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIElmIGZpbmlzaGluZz09dHJ1ZSwgdGhpcyBtZWFucyB3ZSdyZSBpbml0aWF0aW5nIHRoZSBlbnRyeSBhdCB0aGUgdGltZSBvZgorICAgICAgICAgICAgLy8gQ2xvc2UoKSBvciBQdXROZXh0RW50cnkoKS4gIElmIHRoaXMgaGFwcGVucywgaXQgbWVhbnMgbm8gZGF0YSB3YXMgd3JpdHRlbgorICAgICAgICAgICAgLy8gZm9yIHRoZSBlbnRyeSAtIFdyaXRlKCkgd2FzIG5ldmVyIGNhbGxlZC4gIChUaGUgdXN1YWwgY2FzZSB1cyB0byBjYWxsCisgICAgICAgICAgICAvLyBfSW5pdGlhdGVDdXJyZW50RW50cnkoYm9vbCkgZnJvbSB3aXRoaW4gV3JpdGUoKS4pICBJZiBmaW5pc2hpbmc9PXRydWUsCisgICAgICAgICAgICAvLyB0aGUgZW50cnkgY291bGQgYmUgZWl0aGVyIGEgemVyby1ieXRlIGZpbGUgb3IgYSBkaXJlY3RvcnkuCisKKyAgICAgICAgICAgIF9lbnRyaWVzV3JpdHRlbi5BZGQoX2N1cnJlbnRFbnRyeS5GaWxlTmFtZSxfY3VycmVudEVudHJ5KTsKKyAgICAgICAgICAgIF9lbnRyeUNvdW50Kys7IC8vIGNvdWxkIHVzZSBfZW50cmllc1dyaXR0ZW4uQ291bnQsIGJ1dCBJIGRvbid0IHdhbnQgdG8gaW5jdXIKKyAgICAgICAgICAgIC8vIHRoZSBjb3N0LgorCisgICAgICAgICAgICBpZiAoX2VudHJ5Q291bnQgPiA2NTUzNCAmJiBfemlwNjQgPT0gWmlwNjRPcHRpb24uTmV2ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVG9vIG1hbnkgZW50cmllcy4gQ29uc2lkZXIgc2V0dGluZyBaaXBPdXRwdXRTdHJlYW0uRW5hYmxlWmlwNjQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgaGVhZGVyLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIGZpbmlzaGluZywgYW5kIGVuY3J5cHRpb24gaXMgaW4gdXNlLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gZW1pdCB0aGUKKyAgICAgICAgICAgIC8vIG5vcm1hbCBlbmNyeXB0aW9uIGhlYWRlci4gIFNpZ25hbCB0aGF0IHdpdGggYSBjeWNsZT05OSB0byB0dXJuIG9mZgorICAgICAgICAgICAgLy8gZW5jcnlwdGlvbiBmb3IgemVyby1ieXRlIGVudHJpZXMgb3IgZGlyZWN0b3JpZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgZmluaXNoaW5nLCB0aGVuIHdlIGtub3cgdGhlIHN0cmVhbSBsZW5ndGggaXMgemVyby4gIEVsc2UsIHVua25vd24KKyAgICAgICAgICAgIC8vIHN0cmVhbSBsZW5ndGguICBQYXNzaW5nIHN0cmVhbSBsZW5ndGggPT0gMCBhbGxvd3MgYW4gb3B0aW1pemF0aW9uIHNvIGFzCisgICAgICAgICAgICAvLyBub3QgdG8gc2V0dXAgYW4gZW5jcnlwdGlvbiBvciBkZWZsYXRpb24gc3RyZWFtLCB3aGVuIHN0cmVhbSBsZW5ndGggaXMKKyAgICAgICAgICAgIC8vIHplcm8uCisKKyAgICAgICAgICAgIF9jdXJyZW50RW50cnkuV3JpdGVIZWFkZXIoX291dHB1dFN0cmVhbSwgZmluaXNoaW5nID8gOTkgOiAwKTsKKyAgICAgICAgICAgIF9jdXJyZW50RW50cnkuU3RvcmVSZWxhdGl2ZU9mZnNldCgpOworCisgICAgICAgICAgICBpZiAoIV9jdXJyZW50RW50cnkuSXNEaXJlY3RvcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5Xcml0ZVNlY3VyaXR5TWV0YWRhdGEoX291dHB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5QcmVwT3V0cHV0U3RyZWFtKF9vdXRwdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGluZyA/IDAgOiAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IF9vdXRwdXRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgX2VuY3J5cHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IF9kZWZsYXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IF9lbnRyeU91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbmVlZFRvV3JpdGVFbnRyeUhlYWRlciA9IGZhbHNlOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgdm9pZCBfRmluaXNoQ3VycmVudEVudHJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jdXJyZW50RW50cnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX25lZWRUb1dyaXRlRW50cnlIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIF9Jbml0aWF0ZUN1cnJlbnRFbnRyeSh0cnVlKTsgLy8gYW4gZW1wdHkgZW50cnkgLSBubyB3cml0ZXMKKworICAgICAgICAgICAgICAgIF9jdXJyZW50RW50cnkuRmluaXNoT3V0cHV0U3RyZWFtKF9vdXRwdXRTdHJlYW0sIF9vdXRwdXRDb3VudGVyLCBfZW5jcnlwdG9yLCBfZGVmbGF0ZXIsIF9lbnRyeU91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRFbnRyeS5Qb3N0UHJvY2Vzc091dHB1dChfb3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSAxMjk2NAorICAgICAgICAgICAgICAgIGlmIChfY3VycmVudEVudHJ5Lk91dHB1dFVzZWRaaXA2NCE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2FueUVudHJpZXNVc2VkWmlwNjQgfD0gX2N1cnJlbnRFbnRyeS5PdXRwdXRVc2VkWmlwNjQuVmFsdWU7CisKKyAgICAgICAgICAgICAgICAvLyByZXNldCBhbGwgdGhlIHN0cmVhbXMKKyAgICAgICAgICAgICAgICBfb3V0cHV0Q291bnRlciA9IG51bGw7IF9lbmNyeXB0b3IgPSBfZGVmbGF0ZXIgPSBudWxsOyBfZW50cnlPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERpc3Bvc2UgdGhlIHN0cmVhbQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgbWV0aG9kIHdyaXRlcyB0aGUgWmlwIENlbnRyYWwgZGlyZWN0b3J5LCB0aGVuIGNsb3NlcyB0aGUgc3RyZWFtLiAgVGhlCisgICAgICAgIC8vLyAgIGFwcGxpY2F0aW9uIG11c3QgY2FsbCBEaXNwb3NlKCkgKG9yIENsb3NlKSBpbiBvcmRlciB0byBwcm9kdWNlIGEgdmFsaWQgemlwIGZpbGUuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFR5cGljYWxseSB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIDxjPkRpc3Bvc2UoKTwvYz4gaW1wbGljaXRseSwgdmlhIGEgPGM+dXNpbmc8L2M+CisgICAgICAgIC8vLyAgIHN0YXRlbWVudCBpbiBDIywgb3IgYSA8Yz5Vc2luZzwvYz4gc3RhdGVtZW50IGluIFZCLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlzcG9zaW5nIj5zZXQgdGhpcyB0byB0cnVlLCBhbHdheXMuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKSAvLyBub3QgY2FsbGVkIGZyb20gZmluYWxpemVyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHBlbmRpbmcgZXhjZXB0aW9ucworICAgICAgICAgICAgICAgIGlmICghX2V4Y2VwdGlvblBlbmRpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfRmluaXNoQ3VycmVudEVudHJ5KCk7CisgICAgICAgICAgICAgICAgICAgIF9kaXJlY3RvcnlOZWVkZWRaaXA2NCA9IFppcE91dHB1dC5Xcml0ZUNlbnRyYWxEaXJlY3RvcnlTdHJ1Y3R1cmUoX291dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZW50cmllc1dyaXR0ZW4uVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8vIF9udW1iZXJPZlNlZ21lbnRzRm9yTW9zdFJlY2VudFNhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ppcDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFppcENvbnRhaW5lcih0aGlzKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbSB3cmFwcGVkU3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdTdHJlYW0gY3MgPSBfb3V0cHV0U3RyZWFtIGFzIENvdW50aW5nU3RyZWFtOworICAgICAgICAgICAgICAgICAgICBpZiAoY3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZFN0cmVhbSA9IGNzLldyYXBwZWRTdHJlYW07CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICAgICAgY3MuQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjcy5EaXNwb3NlKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRTdHJlYW0gPSBfb3V0cHV0U3RyZWFtOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfbGVhdmVVbmRlcmx5aW5nU3RyZWFtT3BlbikKKyAgICAgICAgICAgICAgICAgICAgeworI2lmIE5FVENGCisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRTdHJlYW0uQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkU3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9kaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQgeyBnZXQgeyByZXR1cm4gZmFsc2U7IH0gfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5TZWVrIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZSB7IGdldCB7IHJldHVybiB0cnVlOyB9IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyBhIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoIHsgZ2V0IHsgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOyB9IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWx3YXlzIHJldHVybnMgYSBOb3RTdXBwb3J0ZWRFeGNlcHRpb24uIEdldHRpbmcgaXQKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBQb3NpdGlvbiBvbiB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfb3V0cHV0U3RyZWFtLlBvc2l0aW9uOyB9CisgICAgICAgICAgICBzZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgaXMgYSBuby1vcC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKSB7IH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgTm90U3VwcG9ydGVkRXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+aWdub3JlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5pZ25vcmVkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+aWdub3JlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5ub3RoaW5nPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJSZWFkIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgTm90U3VwcG9ydGVkRXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+aWdub3JlZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj5pZ25vcmVkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPm5vdGhpbmc8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFNlZWsobG9uZyBvZmZzZXQsIFNlZWtPcmlnaW4gb3JpZ2luKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJTZWVrIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgTm90U3VwcG9ydGVkRXhjZXB0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5pZ25vcmVkPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBFbmNyeXB0aW9uQWxnb3JpdGhtIF9lbmNyeXB0aW9uOworICAgICAgICBwcml2YXRlIFppcEVudHJ5VGltZXN0YW1wIF90aW1lc3RhbXA7CisgICAgICAgIGludGVybmFsIFN0cmluZyBfcGFzc3dvcmQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9jb21tZW50OworICAgICAgICBwcml2YXRlIFN0cmVhbSBfb3V0cHV0U3RyZWFtOworICAgICAgICBwcml2YXRlIFppcEVudHJ5IF9jdXJyZW50RW50cnk7CisgICAgICAgIGludGVybmFsIFppcDY0T3B0aW9uIF96aXA2NDsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PFN0cmluZywgWmlwRW50cnk+IF9lbnRyaWVzV3JpdHRlbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX2VudHJ5Q291bnQ7CisgICAgICAgIHByaXZhdGUgWmlwT3B0aW9uIF9hbHRlcm5hdGVFbmNvZGluZ1VzYWdlID0gWmlwT3B0aW9uLk5ldmVyOworICAgICAgICBwcml2YXRlIFN5c3RlbS5UZXh0LkVuY29kaW5nIF9hbHRlcm5hdGVFbmNvZGluZworICAgICAgICAgICAgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZygiSUJNNDM3Iik7IC8vIGRlZmF1bHQgPSBJQk00MzcKKworICAgICAgICBwcml2YXRlIGJvb2wgX2xlYXZlVW5kZXJseWluZ1N0cmVhbU9wZW47CisgICAgICAgIHByaXZhdGUgYm9vbCBfZGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfZXhjZXB0aW9uUGVuZGluZzsgLy8gKipzZWUgbm90ZSBiZWxvdworICAgICAgICBwcml2YXRlIGJvb2wgX2FueUVudHJpZXNVc2VkWmlwNjQsIF9kaXJlY3RvcnlOZWVkZWRaaXA2NDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudGluZ1N0cmVhbSBfb3V0cHV0Q291bnRlcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gX2VuY3J5cHRvcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJlYW0gX2RlZmxhdGVyOworICAgICAgICBwcml2YXRlIElvbmljLkNyYy5DcmNDYWxjdWxhdG9yU3RyZWFtIF9lbnRyeU91dHB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9uZWVkVG9Xcml0ZUVudHJ5SGVhZGVyOworICAgICAgICBwcml2YXRlIHN0cmluZyBfbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Eb250SWdub3JlQ2FzZTsKKyNpZiAhTkVUQ0YKKyAgICAgICAgaW50ZXJuYWwgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIFBhcmFsbGVsRGVmbGF0ZXI7CisgICAgICAgIHByaXZhdGUgbG9uZyBfUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkOworICAgICAgICBwcml2YXRlIGludCBfbWF4QnVmZmVyUGFpcnMgPSAxNjsKKyNlbmRpZgorCisgICAgICAgIC8vICoqTm90ZSByZWdhcmRpbmcgZXhjZXB0aW9uczoKKworICAgICAgICAvLyBXaGVuIFppcE91dHB1dFN0cmVhbSBpcyBlbXBsb3llZCB3aXRoaW4gYSB1c2luZyBjbGF1c2UsIHdoaWNoCisgICAgICAgIC8vIGlzIHRoZSB0eXBpY2FsIHNjZW5hcmlvLCBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93biB3aXRoaW4KKyAgICAgICAgLy8gdGhlIHNjb3BlIG9mIHRoZSB1c2luZywgQ2xvc2UoKS9EaXNwb3NlKCkgaXMgaW52b2tlZAorICAgICAgICAvLyBpbXBsaWNpdGx5IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBpbml0aWFsIGV4Y2VwdGlvbi4gIEluIHRoYXQKKyAgICAgICAgLy8gY2FzZSwgX2V4Y2VwdGlvblBlbmRpbmcgaXMgdHJ1ZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHRvCisgICAgICAgIC8vIHdyaXRlIGFueXRoaW5nIGluIHRoZSBDbG9zZS9EaXNwb3NlIGxvZ2ljLiAgRG9pbmcgc28gY2FuCisgICAgICAgIC8vIGNhdXNlIGFkZGl0aW9uYWwgZXhjZXB0aW9ucyB0aGF0IG1hc2sgdGhlIG9yaWdpbmFsIG9uZS4gU28sCisgICAgICAgIC8vIHRoZSBfZXhjZXB0aW9uUGVuZGluZyBmbGFnIGlzIHVzZWQgdG8gdHJhY2sgdGhhdCwgYW5kIHRvCisgICAgICAgIC8vIGFsbG93IHRoZSBvcmlnaW5hbCBleGNlcHRpb24gdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUKKyAgICAgICAgLy8gYXBwbGljYXRpb24gd2l0aG91dCBleHRyYSAibm9pc2UuIgorCisgICAgfQorCisKKworICAgIGludGVybmFsIGNsYXNzIFppcENvbnRhaW5lcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBaaXBGaWxlIF96ZjsKKyAgICAgICAgcHJpdmF0ZSBaaXBPdXRwdXRTdHJlYW0gX3pvczsKKyAgICAgICAgcHJpdmF0ZSBaaXBJbnB1dFN0cmVhbSBfemlzOworCisgICAgICAgIHB1YmxpYyBaaXBDb250YWluZXIoT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIF96ZiA9IChvIGFzIFppcEZpbGUpOworICAgICAgICAgICAgX3pvcyA9IChvIGFzIFppcE91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICBfemlzID0gKG8gYXMgWmlwSW5wdXRTdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFppcEZpbGUgWmlwRmlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3pmOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWmlwT3V0cHV0U3RyZWFtIFppcE91dHB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3pvczsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemYgIT0gbnVsbCkgcmV0dXJuIF96Zi5OYW1lOworICAgICAgICAgICAgICAgIGlmIChfemlzICE9IG51bGwpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3pvcy5OYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBQYXNzd29yZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3pmICE9IG51bGwpIHJldHVybiBfemYuX1Bhc3N3b3JkOworICAgICAgICAgICAgICAgIGlmIChfemlzICE9IG51bGwpIHJldHVybiBfemlzLl9QYXNzd29yZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3pvcy5fcGFzc3dvcmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWmlwNjRPcHRpb24gWmlwNjQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF96ZiAhPSBudWxsKSByZXR1cm4gX3pmLl96aXA2NDsKKyAgICAgICAgICAgICAgICBpZiAoX3ppcyAhPSBudWxsKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96b3MuX3ppcDY0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBCdWZmZXJTaXplCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemYgIT0gbnVsbCkgcmV0dXJuIF96Zi5CdWZmZXJTaXplOworICAgICAgICAgICAgICAgIGlmIChfemlzICE9IG51bGwpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgIU5FVENGCisgICAgICAgIHB1YmxpYyBJb25pYy5abGliLlBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSBQYXJhbGxlbERlZmxhdGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemYgIT0gbnVsbCkgcmV0dXJuIF96Zi5QYXJhbGxlbERlZmxhdGVyOworICAgICAgICAgICAgICAgIGlmIChfemlzICE9IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBfem9zLlBhcmFsbGVsRGVmbGF0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3pmICE9IG51bGwpIF96Zi5QYXJhbGxlbERlZmxhdGVyID0gdmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3pvcyAhPSBudWxsKSBfem9zLlBhcmFsbGVsRGVmbGF0ZXIgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIFBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3pmICE9IG51bGwpIHJldHVybiBfemYuUGFyYWxsZWxEZWZsYXRlVGhyZXNob2xkOworICAgICAgICAgICAgICAgIHJldHVybiBfem9zLlBhcmFsbGVsRGVmbGF0ZVRocmVzaG9sZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IFBhcmFsbGVsRGVmbGF0ZU1heEJ1ZmZlclBhaXJzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemYgIT0gbnVsbCkgcmV0dXJuIF96Zi5QYXJhbGxlbERlZmxhdGVNYXhCdWZmZXJQYWlyczsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3pvcy5QYXJhbGxlbERlZmxhdGVNYXhCdWZmZXJQYWlyczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIGludCBDb2RlY0J1ZmZlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF96ZiAhPSBudWxsKSByZXR1cm4gX3pmLkNvZGVjQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoX3ppcyAhPSBudWxsKSByZXR1cm4gX3ppcy5Db2RlY0J1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96b3MuQ29kZWNCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElvbmljLlpsaWIuQ29tcHJlc3Npb25TdHJhdGVneSBTdHJhdGVneQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3pmICE9IG51bGwpIHJldHVybiBfemYuU3RyYXRlZ3k7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96b3MuU3RyYXRlZ3k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWmlwNjRPcHRpb24gVXNlWmlwNjRXaGVuU2F2aW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemYgIT0gbnVsbCkgcmV0dXJuIF96Zi5Vc2VaaXA2NFdoZW5TYXZpbmc7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96b3MuRW5hYmxlWmlwNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgQWx0ZXJuYXRlRW5jb2RpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF96ZiAhPSBudWxsKSByZXR1cm4gX3pmLkFsdGVybmF0ZUVuY29kaW5nOworICAgICAgICAgICAgICAgIGlmIChfem9zIT1udWxsKSByZXR1cm4gX3pvcy5BbHRlcm5hdGVFbmNvZGluZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3lzdGVtLlRleHQuRW5jb2RpbmcgRGVmYXVsdEVuY29kaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfemYgIT0gbnVsbCkgcmV0dXJuIFppcEZpbGUuRGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgICAgIGlmIChfem9zIT1udWxsKSByZXR1cm4gWmlwT3V0cHV0U3RyZWFtLkRlZmF1bHRFbmNvZGluZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgWmlwT3B0aW9uIEFsdGVybmF0ZUVuY29kaW5nVXNhZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF96ZiAhPSBudWxsKSByZXR1cm4gX3pmLkFsdGVybmF0ZUVuY29kaW5nVXNhZ2U7CisgICAgICAgICAgICAgICAgaWYgKF96b3MhPW51bGwpIHJldHVybiBfem9zLkFsdGVybmF0ZUVuY29kaW5nVXNhZ2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIFppcE9wdGlvbi5OZXZlcjsgLy8gbi9hCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyZWFtIFJlYWRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF96ZiAhPSBudWxsKSByZXR1cm4gX3pmLlJlYWRTdHJlYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIF96aXMuUmVhZFN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcFNlZ21lbnRlZFN0cmVhbS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1ppcFNlZ21lbnRlZFN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZjNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmlwU2VnbWVudGVkU3RyZWFtLmNzCkBAIC0wLDAgKzEsNTcxIEBACisvLyBaaXBTZWdtZW50ZWRTdHJlYW0uY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOS0yMDExIERpbm8gQ2hpZXNhLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTEzIDIyOjI1OjQ1PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgbG9naWMgZm9yIHppcCBzdHJlYW1zIHRoYXQgc3BhbiBkaXNrIGZpbGVzLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwCit7CisgICAgaW50ZXJuYWwgY2xhc3MgWmlwU2VnbWVudGVkU3RyZWFtIDogU3lzdGVtLklPLlN0cmVhbQorICAgIHsKKyAgICAgICAgZW51bSBSd01vZGUKKyAgICAgICAgeworICAgICAgICAgICAgTm9uZSA9IDAsCisgICAgICAgICAgICBSZWFkT25seSA9IDEsCisgICAgICAgICAgICBXcml0ZSA9IDIsCisgICAgICAgICAgICAvL1VwZGF0ZSA9IDMKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUndNb2RlIHJ3TW9kZTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9leGNlcHRpb25QZW5kaW5nOyAvLyAqKnNlZSBub3RlIGJlbG93CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9iYXNlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2Jhc2VEaXI7CisgICAgICAgIC8vcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworICAgICAgICBwcml2YXRlIHN0cmluZyBfY3VycmVudE5hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9jdXJyZW50VGVtcE5hbWU7CisgICAgICAgIHByaXZhdGUgdWludCBfY3VycmVudERpc2tOdW1iZXI7CisgICAgICAgIHByaXZhdGUgdWludCBfbWF4RGlza051bWJlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX21heFNlZ21lbnRTaXplOworICAgICAgICBwcml2YXRlIFN5c3RlbS5JTy5TdHJlYW0gX2lubmVyU3RyZWFtOworCisgICAgICAgIC8vICoqTm90ZSByZWdhcmRpbmcgZXhjZXB0aW9uczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hlbiBaaXBTZWdtZW50ZWRTdHJlYW0gaXMgZW1wbG95ZWQgd2l0aGluIGEgdXNpbmcgY2xhdXNlLAorICAgICAgICAvLyB3aGljaCBpcyB0aGUgdHlwaWNhbCBzY2VuYXJpbywgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgICAgLy8gd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdXNpbmcsIERpc3Bvc2UoKSBpcyBpbnZva2VkCisgICAgICAgIC8vIGltcGxpY2l0bHkgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGluaXRpYWwgZXhjZXB0aW9uLiAgSWYgdGhhdAorICAgICAgICAvLyBoYXBwZW5zLCB0aGlzIGNsYXNzIHNldHMgX2V4Y2VwdGlvblBlbmRpbmcgdG8gdHJ1ZSwgYW5kIHRoZW4KKyAgICAgICAgLy8gd2l0aGluIHRoZSBEaXNwb3NlKGJvb2wpLCB0YWtlcyBzcGVjaWFsIGFjdGlvbiBhcworICAgICAgICAvLyBhcHByb3ByaWF0ZS4gTmVlZCB0byBiZSBjYXJlZnVsOiBhbnkgYWRkaXRpb25hbCBleGNlcHRpb25zCisgICAgICAgIC8vIHdpbGwgbWFzayB0aGUgb3JpZ2luYWwgb25lLgorCisgICAgICAgIHByaXZhdGUgWmlwU2VnbWVudGVkU3RyZWFtKCkgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWmlwU2VnbWVudGVkU3RyZWFtIEZvclJlYWRpbmcoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCBpbml0aWFsRGlza051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IG1heERpc2tOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFppcFNlZ21lbnRlZFN0cmVhbSB6c3MgPSBuZXcgWmlwU2VnbWVudGVkU3RyZWFtKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJ3TW9kZSA9IFJ3TW9kZS5SZWFkT25seSwKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudFNlZ21lbnQgPSBpbml0aWFsRGlza051bWJlciwKKyAgICAgICAgICAgICAgICAgICAgX21heERpc2tOdW1iZXIgPSBtYXhEaXNrTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBfYmFzZU5hbWUgPSBuYW1lLAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIENvbnNvbGUuV3JpdGVMaW5lKCJaU1M6IEZvclJlYWRpbmcgKHswfSkiLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIFBhdGguR2V0RmlsZU5hbWUoenNzLkN1cnJlbnROYW1lKSk7CisKKyAgICAgICAgICAgIHpzcy5fU2V0UmVhZFN0cmVhbSgpOworCisgICAgICAgICAgICByZXR1cm4genNzOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIFppcFNlZ21lbnRlZFN0cmVhbSBGb3JXcml0aW5nKHN0cmluZyBuYW1lLCBpbnQgbWF4U2VnbWVudFNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFppcFNlZ21lbnRlZFN0cmVhbSB6c3MgPSBuZXcgWmlwU2VnbWVudGVkU3RyZWFtKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJ3TW9kZSA9IFJ3TW9kZS5Xcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudFNlZ21lbnQgPSAwLAorICAgICAgICAgICAgICAgICAgICBfYmFzZU5hbWUgPSBuYW1lLAorICAgICAgICAgICAgICAgICAgICBfbWF4U2VnbWVudFNpemUgPSBtYXhTZWdtZW50U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgX2Jhc2VEaXIgPSBQYXRoLkdldERpcmVjdG9yeU5hbWUobmFtZSkKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA5NTIyCisgICAgICAgICAgICBpZiAoenNzLl9iYXNlRGlyPT0iIikgenNzLl9iYXNlRGlyPSIuIjsKKworICAgICAgICAgICAgenNzLl9TZXRXcml0ZVN0cmVhbSgwKTsKKworICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIlpTUzogRm9yV3JpdGluZyAoezB9KSIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgUGF0aC5HZXRGaWxlTmFtZSh6c3MuQ3VycmVudE5hbWUpKTsKKworICAgICAgICAgICAgcmV0dXJuIHpzczsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBTb3J0LW9mIGxpa2UgYSBmYWN0b3J5IG1ldGhvZCwgRm9yVXBkYXRlIGlzIHVzZWQgb25seSB3aGVuCisgICAgICAgIC8vLyAgIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byB1cGRhdGUgdGhlIHppcCBlbnRyeSBtZXRhZGF0YSBmb3IKKyAgICAgICAgLy8vICAgYSBzZWdtZW50ZWQgemlwIGZpbGUsIHdoZW4gdGhlIHN0YXJ0aW5nIHNlZ21lbnQgaXMgZWFybGllcgorICAgICAgICAvLy8gICB0aGFuIHRoZSBlbmRpbmcgc2VnbWVudCwgZm9yIGEgcGFydGljdWxhciBlbnRyeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGUgdXBkYXRlIGlzIGFsd2F5cyBjb250aWd1b3VzLCBuZXZlciByb2xscyBvdmVyLiAgQXMgYQorICAgICAgICAvLy8gICAgIHJlc3VsdCwgdGhpcyBtZXRob2QgZG9lc24ndCBuZWVkIHRvIHJldHVybiBhIFpTUzsgaXQgY2FuCisgICAgICAgIC8vLyAgICAgc2ltcGx5IHJldHVybiBhIEZpbGVTdHJlYW0uICBUaGF0J3Mgd2h5IGl0J3MgInNvcnQgb2YiCisgICAgICAgIC8vLyAgICAgbGlrZSBhIEZhY3RvcnkgbWV0aG9kLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIENhbGxlciBtdXN0IENsb3NlL0Rpc3Bvc2UgdGhlIHN0cmVhbSBvYmplY3QgcmV0dXJuZWQgYnkKKyAgICAgICAgLy8vICAgICB0aGlzIG1ldGhvZC4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmVhbSBGb3JVcGRhdGUoc3RyaW5nIG5hbWUsIHVpbnQgZGlza051bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpc2tOdW1iZXIgPj0gOTkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiZGlza051bWJlciIpOworCisgICAgICAgICAgICBzdHJpbmcgZm5hbWUgPQorICAgICAgICAgICAgICAgIFN0cmluZy5Gb3JtYXQoInswfS56ezE6RDJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguQ29tYmluZShQYXRoLkdldERpcmVjdG9yeU5hbWUobmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aC5HZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24obmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlza051bWJlciArIDEpOworCisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiWlNTOiBGb3JVcGRhdGUgKHswfSkiLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgUGF0aC5HZXRGaWxlTmFtZShmbmFtZSkpOworCisgICAgICAgICAgICAvLyBUaGlzIGNsYXNzIGFzc3VtZXMgdGhhdCB0aGUgdXBkYXRlIHdpbGwgbm90IGV4cGFuZCB0aGUKKyAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIHNlZ21lbnQuIFVwZGF0ZSBpcyB1c2VkIG9ubHkgZm9yIGFuIGluLXBsYWNlCisgICAgICAgICAgICAvLyB1cGRhdGUgb2YgemlwIG1ldGFkYXRhLiBJdCBuZXZlciB3aWxsIHRyeSB0byB3cml0ZSBiZXlvbmQKKyAgICAgICAgICAgIC8vIHRoZSBlbmQgb2YgYSBzZWdtZW50LgorCisgICAgICAgICAgICByZXR1cm4gRmlsZS5PcGVuKGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTW9kZS5PcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQWNjZXNzLlJlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVNoYXJlLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGlndW91c1dyaXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFVJbnQzMiBDdXJyZW50U2VnbWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnREaXNrTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpdmF0ZSBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY3VycmVudERpc2tOdW1iZXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBfY3VycmVudE5hbWUgPSBudWxsOyAvLyBpdCB3aWxsIGdldCB1cGRhdGVkIG5leHQgdGltZSByZWZlcmVuY2VkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIE5hbWUgb2YgdGhlIGZpbGVzeXN0ZW0gZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhlIG5hbWUgaXMgbm90IGFsd2F5cyB0aGUgbmFtZSBjdXJyZW50bHkgYmVpbmcgdXNlZCBpbiB0aGUKKyAgICAgICAgLy8vICAgICBmaWxlc3lzdGVtLiAgV2hlbiByd01vZGUgaXMgUndNb2RlLldyaXRlLCB0aGUgZmlsZXN5c3RlbSBmaWxlIGhhcyBhCisgICAgICAgIC8vLyAgICAgdGVtcG9yYXJ5IG5hbWUgdW50aWwgdGhlIHN0cmVhbSBpcyBjbG9zZWQgb3IgdW50aWwgdGhlIG5leHQgc2VnbWVudCBpcworICAgICAgICAvLy8gICAgIHN0YXJ0ZWQuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIFN0cmluZyBDdXJyZW50TmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2N1cnJlbnROYW1lPT1udWxsKQorICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5hbWUgPSBfTmFtZUZvclNlZ21lbnQoQ3VycmVudFNlZ21lbnQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50TmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFN0cmluZyBDdXJyZW50VGVtcE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50VGVtcE5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0cmluZyBfTmFtZUZvclNlZ21lbnQodWludCBkaXNrTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGlza051bWJlciA+PSA5OSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZXhjZXB0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE92ZXJmbG93RXhjZXB0aW9uKCJUaGUgbnVtYmVyIG9mIHppcCBzZWdtZW50cyB3b3VsZCBleGNlZWQgOTkuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRm9ybWF0KCJ7MH0uensxOkQyfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoLkNvbWJpbmUoUGF0aC5HZXREaXJlY3RvcnlOYW1lKF9iYXNlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aC5HZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oX2Jhc2VOYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrTnVtYmVyICsgMSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHNlZ21lbnQgdGhhdCBXSUxMIGJlIGN1cnJlbnQgaWYgd3JpdGluZworICAgICAgICAvLyBhIGJsb2NrIG9mIHRoZSBnaXZlbiBsZW5ndGguCisgICAgICAgIC8vIFRoaXMgaXNuJ3QgZXhhY3RseSB0cnVlLiBJdCBjb3VsZCByb2xsIG92ZXIgYmV5b25kCisgICAgICAgIC8vIHRoaXMgbnVtYmVyLgorICAgICAgICBwdWJsaWMgVUludDMyIENvbXB1dGVTZWdtZW50KGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaW5uZXJTdHJlYW0uUG9zaXRpb24gKyBsZW5ndGggPiBfbWF4U2VnbWVudFNpemUpCisgICAgICAgICAgICAgICAgLy8gdGhlIGJsb2NrIHdpbGwgZ28gQVQgTEVBU1QgaW50byB0aGUgbmV4dCBzZWdtZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIEN1cnJlbnRTZWdtZW50ICsgMTsKKworICAgICAgICAgICAgLy8gaXQgd2lsbCBmaXQgaW4gdGhlIGN1cnJlbnQgc2VnbWVudAorICAgICAgICAgICAgcmV0dXJuIEN1cnJlbnRTZWdtZW50OworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5Gb3JtYXQoInswfVt7MX1dW3syfV0sIHBvcz0weHszOlh9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmlwU2VnbWVudGVkU3RyZWFtIiwgQ3VycmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByd01vZGUuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUG9zaXRpb24pOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgX1NldFJlYWRTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lubmVyU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICBfaW5uZXJTdHJlYW0uQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX2lubmVyU3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQ3VycmVudFNlZ21lbnQgKyAxID09IF9tYXhEaXNrTnVtYmVyKQorICAgICAgICAgICAgICAgIF9jdXJyZW50TmFtZSA9IF9iYXNlTmFtZTsKKworICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIlpTUzogU1JTICh7MH0pIiwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIFBhdGguR2V0RmlsZU5hbWUoQ3VycmVudE5hbWUpKTsKKworICAgICAgICAgICAgX2lubmVyU3RyZWFtID0gRmlsZS5PcGVuUmVhZChDdXJyZW50TmFtZSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgZnJvbSB0aGUgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj50aGUgYnVmZmVyIHRvIHJlYWQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCBhdCB3aGljaCB0byBzdGFydDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyd01vZGUgIT0gUndNb2RlLlJlYWRPbmx5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3RyZWFtIEVycm9yOiBDYW5ub3QgUmVhZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHIgPSBfaW5uZXJTdHJlYW0uUmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOworICAgICAgICAgICAgaW50IHIxID0gcjsKKworICAgICAgICAgICAgd2hpbGUgKHIxICE9IGNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaW5uZXJTdHJlYW0uUG9zaXRpb24gIT0gX2lubmVyU3RyZWFtLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJSZWFkIGVycm9yIGluIGZpbGUgezB9IiwgQ3VycmVudE5hbWUpKTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChDdXJyZW50U2VnbWVudCArIDEgPT0gX21heERpc2tOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByOyAvLyBubyBtb3JlIHRvIHJlYWQKKworICAgICAgICAgICAgICAgIEN1cnJlbnRTZWdtZW50Kys7CisgICAgICAgICAgICAgICAgX1NldFJlYWRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcjE7CisgICAgICAgICAgICAgICAgY291bnQgLT0gcjE7CisgICAgICAgICAgICAgICAgcjEgPSBfaW5uZXJTdHJlYW0uUmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOworICAgICAgICAgICAgICAgIHIgKz0gcjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorCisKKworICAgICAgICBwcml2YXRlIHZvaWQgX1NldFdyaXRlU3RyZWFtKHVpbnQgaW5jcmVtZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lubmVyU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICBfaW5uZXJTdHJlYW0uQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX2lubmVyU3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhDdXJyZW50TmFtZSkpCisgICAgICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKEN1cnJlbnROYW1lKTsKKyAgICAgICAgICAgICAgICBGaWxlLk1vdmUoX2N1cnJlbnRUZW1wTmFtZSwgQ3VycmVudE5hbWUpOworICAgICAgICAgICAgICAgIC8vIENvbnNvbGUuV3JpdGVMaW5lKCJaU1M6IFNXUyBjbG9zZSAoezB9KSIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgUGF0aC5HZXRGaWxlTmFtZShDdXJyZW50TmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5jcmVtZW50ID4gMCkKKyAgICAgICAgICAgICAgICBDdXJyZW50U2VnbWVudCArPSBpbmNyZW1lbnQ7CisKKyAgICAgICAgICAgIFNoYXJlZFV0aWxpdGllcy5DcmVhdGVBbmRPcGVuVW5pcXVlVGVtcEZpbGUoX2Jhc2VEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBfaW5uZXJTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBfY3VycmVudFRlbXBOYW1lKTsKKworICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIlpTUzogU1dTIG9wZW4gKHswfSkiLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgUGF0aC5HZXRGaWxlTmFtZShfY3VycmVudFRlbXBOYW1lKSk7CisKKyAgICAgICAgICAgIGlmIChDdXJyZW50U2VnbWVudCA9PSAwKQorICAgICAgICAgICAgICAgIF9pbm5lclN0cmVhbS5Xcml0ZShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoWmlwQ29uc3RhbnRzLlNwbGl0QXJjaGl2ZVNpZ25hdHVyZSksIDAsIDQpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSB0byB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+dGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHdyaXRlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGU8L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyd01vZGUgIT0gUndNb2RlLldyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9leGNlcHRpb25QZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3RyZWFtIEVycm9yOiBDYW5ub3QgV3JpdGUuIik7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKENvbnRpZ3VvdXNXcml0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBlbm91Z2ggc3BhY2UgZm9yIGEgY29udGlndW91cyB3cml0ZT8KKyAgICAgICAgICAgICAgICBpZiAoX2lubmVyU3RyZWFtLlBvc2l0aW9uICsgY291bnQgPiBfbWF4U2VnbWVudFNpemUpCisgICAgICAgICAgICAgICAgICAgIF9TZXRXcml0ZVN0cmVhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoX2lubmVyU3RyZWFtLlBvc2l0aW9uICsgY291bnQgPiBfbWF4U2VnbWVudFNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IHVuY2hlY2tlZChfbWF4U2VnbWVudFNpemUgLSAoaW50KV9pbm5lclN0cmVhbS5Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIF9pbm5lclN0cmVhbS5Xcml0ZShidWZmZXIsIG9mZnNldCwgYyk7CisgICAgICAgICAgICAgICAgICAgIF9TZXRXcml0ZVN0cmVhbSgxKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgLT0gYzsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfaW5uZXJTdHJlYW0uV3JpdGUoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGxvbmcgVHJ1bmNhdGVCYWNrd2FyZCh1aW50IGRpc2tOdW1iZXIsIGxvbmcgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiKioqWlNTLlRydW5jIHRvIGRpc2sgezB9IiwgZGlza051bWJlcik7CisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiKioqWlNTLlRydW5jOiAgY3VycmVudCBkaXNrIHswfSIsIEN1cnJlbnRTZWdtZW50KTsKKyAgICAgICAgICAgIGlmIChkaXNrTnVtYmVyID49IDk5KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImRpc2tOdW1iZXIiKTsKKworICAgICAgICAgICAgaWYgKHJ3TW9kZSAhPSBSd01vZGUuV3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oImJhZCBzdGF0ZS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VlayBiYWNrIGluIHRoZSBzZWdtZW50ZWQgc3RyZWFtIHRvIGEgKG1heWJlKSBwcmlvciBzZWdtZW50LgorCisgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyB0aGUgc2FtZSBzZWdtZW50LiAgSWYgaXQgaXMsIHZlcnkgc2ltcGxlLgorICAgICAgICAgICAgaWYgKGRpc2tOdW1iZXIgPT0gQ3VycmVudFNlZ21lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHggPV9pbm5lclN0cmVhbS5TZWVrKG9mZnNldCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gMTAxNzgKKyAgICAgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChfaW5uZXJTdHJlYW0pOworICAgICAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZWVraW5nIGJhY2sgdG8gYSBwcmlvciBzZWdtZW50LgorICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgc2VnbWVudCBhbmQgYW55IGludGVydmVuaW5nIHNlZ21lbnRzIG11c3QgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgIC8vIEZpcnN0LCBjbG9zZSB0aGUgY3VycmVudCBzZWdtZW50LCBhbmQgdGhlbiByZW1vdmUgaXQuCisgICAgICAgICAgICBpZiAoX2lubmVyU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisjaWYgTkVUQ0YKKyAgICAgICAgICAgICAgICBfaW5uZXJTdHJlYW0uQ2xvc2UoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgX2lubmVyU3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhfY3VycmVudFRlbXBOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUoX2N1cnJlbnRUZW1wTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vdywgcmVtb3ZlIGludGVydmVuaW5nIHNlZ21lbnRzLgorICAgICAgICAgICAgZm9yICh1aW50IGo9IEN1cnJlbnRTZWdtZW50LTE7IGogPiBkaXNrTnVtYmVyOyBqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHMgPSBfTmFtZUZvclNlZ21lbnQoaik7CisgICAgICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoIioqKlpTUy5UcnVuYzogIHJlbW92aW5nIGZpbGUgezB9Iiwgcyk7CisgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHMpKQorICAgICAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm93LCBvcGVuIHRoZSBkZXNpcmVkIHNlZ21lbnQuICBJdCBtdXN0IGV4aXN0LgorICAgICAgICAgICAgQ3VycmVudFNlZ21lbnQgPSBkaXNrTnVtYmVyOworCisgICAgICAgICAgICAvLyBnZXQgYSBuZXcgdGVtcCBmaWxlLCB0cnkgMyB0aW1lczoKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRUZW1wTmFtZSA9IFNoYXJlZFV0aWxpdGllcy5JbnRlcm5hbEdldFRlbXBGaWxlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRoZSAuejB4IGZpbGUgYmFjayB0byBhIHRlbXAgbmFtZQorICAgICAgICAgICAgICAgICAgICBGaWxlLk1vdmUoQ3VycmVudE5hbWUsIF9jdXJyZW50VGVtcE5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gd29ya2l0ZW0gMTI0MDMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAyKSB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG9wZW4gaXQKKyAgICAgICAgICAgIF9pbm5lclN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKF9jdXJyZW50VGVtcE5hbWUsIEZpbGVNb2RlLk9wZW4pOworCisgICAgICAgICAgICB2YXIgciA9ICBfaW5uZXJTdHJlYW0uU2VlayhvZmZzZXQsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAvLyB3b3JraXRlbSAxMDE3OAorICAgICAgICAgICAgSW9uaWMuWmlwLlNoYXJlZFV0aWxpdGllcy5Xb3JrYXJvdW5kX0xhZHlidWczMTg5MTgoX2lubmVyU3RyZWFtKTsKKworICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJ3TW9kZSA9PSBSd01vZGUuUmVhZE9ubHkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChfaW5uZXJTdHJlYW0gIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbm5lclN0cmVhbS5DYW5SZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlaworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9pbm5lclN0cmVhbSAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgX2lubmVyU3RyZWFtLkNhblNlZWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAocndNb2RlID09IFJ3TW9kZS5Xcml0ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChfaW5uZXJTdHJlYW0gIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbm5lclN0cmVhbS5DYW5Xcml0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lubmVyU3RyZWFtLkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pbm5lclN0cmVhbS5MZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lubmVyU3RyZWFtLlBvc2l0aW9uOyB9CisgICAgICAgICAgICBzZXQgeyBfaW5uZXJTdHJlYW0uUG9zaXRpb24gPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU3lzdGVtLklPLlNlZWtPcmlnaW4gb3JpZ2luKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeCA9IF9pbm5lclN0cmVhbS5TZWVrKG9mZnNldCwgb3JpZ2luKTsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDEwMTc4CisgICAgICAgICAgICBJb25pYy5aaXAuU2hhcmVkVXRpbGl0aWVzLldvcmthcm91bmRfTGFkeWJ1ZzMxODkxOChfaW5uZXJTdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ3TW9kZSAhPSBSd01vZGUuV3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4Y2VwdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaW5uZXJTdHJlYW0uU2V0TGVuZ3RoKHZhbHVlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBnZXRzIGNhbGxlZCBieSBTdHJlYW0uQ2xvc2UoKQorCisgICAgICAgICAgICAvLyBpZiAoX2lzRGlzcG9zZWQpIHJldHVybjsKKyAgICAgICAgICAgIC8vIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIkRpc3Bvc2UgKG1vZGU9ezB9KVxuIiwgcndNb2RlLlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lubmVyU3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworI2lmIE5FVENGCisgICAgICAgICAgICAgICAgICAgIF9pbm5lclN0cmVhbS5DbG9zZSgpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgX2lubmVyU3RyZWFtLkRpc3Bvc2UoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvL19pbm5lclN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChyd01vZGUgPT0gUndNb2RlLldyaXRlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2V4Y2VwdGlvblBlbmRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libHkgY291bGQgdHJ5IHRvIGNsZWFuIHVwIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzIGNyZWF0ZWQgc28gZmFyLi4uCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLy8gbW92ZSB0aGUgZmluYWwgdGVtcCBmaWxlIHRvIHRoZSAuek5OIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoRmlsZS5FeGlzdHMoQ3VycmVudE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBGaWxlLkRlbGV0ZShDdXJyZW50TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKEZpbGUuRXhpc3RzKF9jdXJyZW50VGVtcE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBGaWxlLk1vdmUoX2N1cnJlbnRUZW1wTmFtZSwgQ3VycmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL0RlZmxhdGUuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL0RlZmxhdGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkMzJhZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvRGVmbGF0ZS5jcwpAQCAtMCwwICsxLDE4NzkgQEAKKy8vIERlZmxhdGUuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOSBEaW5vIENoaWVzYSBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1BdWd1c3QtMDMgMTk6NTI6MTU+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBsb2dpYyBmb3IgaGFuZGxpbmcgdGhlIERlZmxhdGUgb3IgY29tcHJlc3Npb24uCisvLworLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIG11bHRpcGxlIHNvdXJjZXM6CisvLyAtIHRoZSBvcmlnaW5hbCB6bGliIHYxLjIuMyBzb3VyY2UsIHdoaWNoIGlzIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisvLyAtIHRoZSBvcmlnaW5hbCBqemxpYiwgd2hpY2ggaXMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgeW1uaywgSkNyYWZ0LEluYy4KKy8vCisvLyBIb3dldmVyLCB0aGlzIGNvZGUgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBib3RoLgorLy8gVGhlIG9iamVjdCBtb2RlbCBpcyBub3QgdGhlIHNhbWUsIGFuZCBtYW55IG9mIHRoZSBiZWhhdmlvcnMgYXJlIGRpZmZlcmVudC4KKy8vCisvLyBJbiBrZWVwaW5nIHdpdGggdGhlIGxpY2Vuc2UgZm9yIHRoZXNlIG90aGVyIHdvcmtzLCB0aGUgY29weXJpZ2h0cyBmb3IKKy8vIGp6bGliIGFuZCB6bGliIGFyZSBoZXJlLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSwyMDAyLDIwMDMgeW1uaywgSkNyYWZ0LEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorLy8gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKKy8vIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBKQ1JBRlQsCisvLyBJTkMuIE9SIEFOWSBDT05UUklCVVRPUlMgVE8gVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCisvLyBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisvLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworLy8gTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorLy8gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiB6bGliLTEuMS4zOyBjcmVkaXQgdG8gYXV0aG9ycworLy8gSmVhbi1sb3VwIEdhaWxseShqbG91cEBnemlwLm9yZykgYW5kIE1hcmsgQWRsZXIobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkKKy8vIGFuZCBjb250cmlidXRvcnMgb2YgemxpYi4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIKK3sKKworICAgIGludGVybmFsIGVudW0gQmxvY2tTdGF0ZQorICAgIHsKKyAgICAgICAgTmVlZE1vcmUgPSAwLCAgICAgICAvLyBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQKKyAgICAgICAgQmxvY2tEb25lLCAgICAgICAgICAvLyBibG9jayBmbHVzaCBwZXJmb3JtZWQKKyAgICAgICAgRmluaXNoU3RhcnRlZCwgICAgICAgICAgICAgIC8vIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlCisgICAgICAgIEZpbmlzaERvbmUgICAgICAgICAgLy8gZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dAorICAgIH0KKworICAgIGludGVybmFsIGVudW0gRGVmbGF0ZUZsYXZvcgorICAgIHsKKyAgICAgICAgU3RvcmUsCisgICAgICAgIEZhc3QsCisgICAgICAgIFNsb3cKKyAgICB9CisKKyAgICBpbnRlcm5hbCBzZWFsZWQgY2xhc3MgRGVmbGF0ZU1hbmFnZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludCBNRU1fTEVWRUxfTUFYID0gOTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IE1FTV9MRVZFTF9ERUZBVUxUID0gODsKKworICAgICAgICBpbnRlcm5hbCBkZWxlZ2F0ZSBCbG9ja1N0YXRlIENvbXByZXNzRnVuYyhGbHVzaFR5cGUgZmx1c2gpOworCisgICAgICAgIGludGVybmFsIGNsYXNzIENvbmZpZworICAgICAgICB7CisgICAgICAgICAgICAvLyBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMKKyAgICAgICAgICAgIGludGVybmFsIGludCBHb29kTGVuZ3RoOyAvLyByZWR1Y2UgbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGgKKworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcworICAgICAgICAgICAgLy8gc3RyaWN0bHkgc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IKKyAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIGxldmVscyA+PSA0LiAgRm9yIGxldmVscyAxLDIsMzogTWF4TGF6eSBpcyBhY3R1YWxseQorICAgICAgICAgICAgLy8gTWF4SW5zZXJ0TGVuZ3RoLiAoU2VlIERlZmxhdGVGYXN0KQorCisgICAgICAgICAgICBpbnRlcm5hbCBpbnQgTWF4TGF6eTsgICAgLy8gZG8gbm90IHBlcmZvcm0gbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGgKKworICAgICAgICAgICAgaW50ZXJuYWwgaW50IE5pY2VMZW5ndGg7IC8vIHF1aXQgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoCisKKyAgICAgICAgICAgIC8vIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzCisgICAgICAgICAgICAvLyBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlIHNwZWVkLgorCisgICAgICAgICAgICBpbnRlcm5hbCBpbnQgTWF4Q2hhaW5MZW5ndGg7CisKKyAgICAgICAgICAgIGludGVybmFsIERlZmxhdGVGbGF2b3IgRmxhdm9yOworCisgICAgICAgICAgICBwcml2YXRlIENvbmZpZyhpbnQgZ29vZExlbmd0aCwgaW50IG1heExhenksIGludCBuaWNlTGVuZ3RoLCBpbnQgbWF4Q2hhaW5MZW5ndGgsIERlZmxhdGVGbGF2b3IgZmxhdm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuR29vZExlbmd0aCA9IGdvb2RMZW5ndGg7CisgICAgICAgICAgICAgICAgdGhpcy5NYXhMYXp5ID0gbWF4TGF6eTsKKyAgICAgICAgICAgICAgICB0aGlzLk5pY2VMZW5ndGggPSBuaWNlTGVuZ3RoOworICAgICAgICAgICAgICAgIHRoaXMuTWF4Q2hhaW5MZW5ndGggPSBtYXhDaGFpbkxlbmd0aDsKKyAgICAgICAgICAgICAgICB0aGlzLkZsYXZvciA9IGZsYXZvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDb25maWcgTG9va3VwKENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhYmxlWyhpbnQpbGV2ZWxdOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN0YXRpYyBDb25maWcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRhYmxlID0gbmV3IENvbmZpZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBEZWZsYXRlRmxhdm9yLlN0b3JlKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbmZpZyg0LCA0LCA4LCA0LCBEZWZsYXRlRmxhdm9yLkZhc3QpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBEZWZsYXRlRmxhdm9yLkZhc3QpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgRGVmbGF0ZUZsYXZvci5GYXN0KSwKKworICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgRGVmbGF0ZUZsYXZvci5TbG93KSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbmZpZyg4LCAxNiwgMzIsIDMyLCBEZWZsYXRlRmxhdm9yLlNsb3cpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgRGVmbGF0ZUZsYXZvci5TbG93KSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbmZpZyg4LCAzMiwgMTI4LCAyNTYsIERlZmxhdGVGbGF2b3IuU2xvdyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBEZWZsYXRlRmxhdm9yLlNsb3cpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgRGVmbGF0ZUZsYXZvci5TbG93KSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDb25maWdbXSBUYWJsZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBDb21wcmVzc0Z1bmMgRGVmbGF0ZUZ1bmN0aW9uOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFN5c3RlbS5TdHJpbmdbXSBfRXJyb3JNZXNzYWdlID0gbmV3IFN5c3RlbS5TdHJpbmdbXQorICAgICAgICB7CisgICAgICAgICAgICAibmVlZCBkaWN0aW9uYXJ5IiwKKyAgICAgICAgICAgICJzdHJlYW0gZW5kIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgImZpbGUgZXJyb3IiLAorICAgICAgICAgICAgInN0cmVhbSBlcnJvciIsCisgICAgICAgICAgICAiZGF0YSBlcnJvciIsCisgICAgICAgICAgICAiaW5zdWZmaWNpZW50IG1lbW9yeSIsCisgICAgICAgICAgICAiYnVmZmVyIGVycm9yIiwKKyAgICAgICAgICAgICJpbmNvbXBhdGlibGUgdmVyc2lvbiIsCisgICAgICAgICAgICAiIgorICAgICAgICB9OworCisgICAgICAgIC8vIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IFBSRVNFVF9ESUNUID0gMHgyMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgSU5JVF9TVEFURSA9IDQyOworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgQlVTWV9TVEFURSA9IDExMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IEZJTklTSF9TVEFURSA9IDY2NjsKKworICAgICAgICAvLyBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IFpfREVGTEFURUQgPSA4OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludCBTVE9SRURfQkxPQ0sgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgU1RBVElDX1RSRUVTID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IERZTl9UUkVFUyA9IDI7CisKKyAgICAgICAgLy8gVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IFpfQklOQVJZID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IFpfQVNDSUkgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgWl9VTktOT1dOID0gMjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgQnVmX3NpemUgPSA4ICogMjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgTUlOX01BVENIID0gMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IE1BWF9NQVRDSCA9IDI1ODsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgTUlOX0xPT0tBSEVBRCA9IChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnQgSEVBUF9TSVpFID0gKDIgKiBJbnRlcm5hbENvbnN0YW50cy5MX0NPREVTICsgMSk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IEVORF9CTE9DSyA9IDI1NjsKKworICAgICAgICBpbnRlcm5hbCBabGliQ29kZWMgX2NvZGVjOyAvLyB0aGUgemxpYiBlbmNvZGVyL2RlY29kZXIKKyAgICAgICAgaW50ZXJuYWwgaW50IHN0YXR1czsgICAgICAgLy8gYXMgdGhlIG5hbWUgaW1wbGllcworICAgICAgICBpbnRlcm5hbCBieXRlW10gcGVuZGluZzsgICAvLyBvdXRwdXQgc3RpbGwgcGVuZGluZyAtIHdhaXRpbmcgdG8gYmUgY29tcHJlc3NlZAorICAgICAgICBpbnRlcm5hbCBpbnQgbmV4dFBlbmRpbmc7ICAvLyBpbmRleCBvZiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbQorICAgICAgICBpbnRlcm5hbCBpbnQgcGVuZGluZ0NvdW50OyAvLyBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyCisKKyAgICAgICAgaW50ZXJuYWwgc2J5dGUgZGF0YV90eXBlOyAgLy8gVU5LTk9XTiwgQklOQVJZIG9yIEFTQ0lJCisgICAgICAgIGludGVybmFsIGludCBsYXN0X2ZsdXNoOyAgIC8vIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwKKworICAgICAgICBpbnRlcm5hbCBpbnQgd19zaXplOyAgICAgICAvLyBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkKKyAgICAgICAgaW50ZXJuYWwgaW50IHdfYml0czsgICAgICAgLy8gbG9nMih3X3NpemUpICAoOC4uMTYpCisgICAgICAgIGludGVybmFsIGludCB3X21hc2s7ICAgICAgIC8vIHdfc2l6ZSAtIDEKKworICAgICAgICAvL2ludGVybmFsIGJ5dGVbXSBkaWN0aW9uYXJ5OworICAgICAgICBpbnRlcm5hbCBieXRlW10gd2luZG93OworCisgICAgICAgIC8vIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LAorICAgICAgICAvLyBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZQorICAgICAgICAvLyBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCisgICAgICAgIC8vIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5cworICAgICAgICAvLyBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVG8gZG86IHVzZSB0aGUgdXNlciBpbnB1dCBidWZmZXIgYXMgc2xpZGluZyB3aW5kb3cuCisKKyAgICAgICAgaW50ZXJuYWwgaW50IHdpbmRvd19zaXplOworICAgICAgICAvLyBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlcgorICAgICAgICAvLyBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LgorCisgICAgICAgIGludGVybmFsIHNob3J0W10gcHJldjsKKyAgICAgICAgLy8gTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAgICAgICAgLy8gYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KKyAgICAgICAgLy8gQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuCisKKyAgICAgICAgaW50ZXJuYWwgc2hvcnRbXSBoZWFkOyAgLy8gSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4KKworICAgICAgICBpbnRlcm5hbCBpbnQgaW5zX2g7ICAgICAvLyBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZAorICAgICAgICBpbnRlcm5hbCBpbnQgaGFzaF9zaXplOyAvLyBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZQorICAgICAgICBpbnRlcm5hbCBpbnQgaGFzaF9iaXRzOyAvLyBsb2cyKGhhc2hfc2l6ZSkKKyAgICAgICAgaW50ZXJuYWwgaW50IGhhc2hfbWFzazsgLy8gaGFzaF9zaXplLTEKKworICAgICAgICAvLyBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dAorICAgICAgICAvLyBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKKyAgICAgICAgLy8gYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6CisgICAgICAgIC8vIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzCisgICAgICAgIGludGVybmFsIGludCBoYXNoX3NoaWZ0OworCisgICAgICAgIC8vIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cworICAgICAgICAvLyBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLgorCisgICAgICAgIGludGVybmFsIGludCBibG9ja19zdGFydDsKKworICAgICAgICBDb25maWcgY29uZmlnOworICAgICAgICBpbnRlcm5hbCBpbnQgbWF0Y2hfbGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYmVzdCBtYXRjaAorICAgICAgICBpbnRlcm5hbCBpbnQgcHJldl9tYXRjaDsgICAgICAvLyBwcmV2aW91cyBtYXRjaAorICAgICAgICBpbnRlcm5hbCBpbnQgbWF0Y2hfYXZhaWxhYmxlOyAvLyBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzCisgICAgICAgIGludGVybmFsIGludCBzdHJzdGFydDsgICAgICAgIC8vIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgaW50by4uLi4uPz8/PworICAgICAgICBpbnRlcm5hbCBpbnQgbWF0Y2hfc3RhcnQ7ICAgICAvLyBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcKKyAgICAgICAgaW50ZXJuYWwgaW50IGxvb2thaGVhZDsgICAgICAgLy8gbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdworCisgICAgICAgIC8vIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcworICAgICAgICAvLyBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi4KKyAgICAgICAgaW50ZXJuYWwgaW50IHByZXZfbGVuZ3RoOworCisgICAgICAgIC8vIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90CisgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8gbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy4KKworICAgICAgICBpbnRlcm5hbCBDb21wcmVzc2lvbkxldmVsIGNvbXByZXNzaW9uTGV2ZWw7IC8vIGNvbXByZXNzaW9uIGxldmVsICgxLi45KQorICAgICAgICBpbnRlcm5hbCBDb21wcmVzc2lvblN0cmF0ZWd5IGNvbXByZXNzaW9uU3RyYXRlZ3k7IC8vIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nCisKKworICAgICAgICBpbnRlcm5hbCBzaG9ydFtdIGR5bl9sdHJlZTsgICAgICAgICAvLyBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZQorICAgICAgICBpbnRlcm5hbCBzaG9ydFtdIGR5bl9kdHJlZTsgICAgICAgICAvLyBkaXN0YW5jZSB0cmVlCisgICAgICAgIGludGVybmFsIHNob3J0W10gYmxfdHJlZTsgICAgICAgICAgIC8vIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMKKworICAgICAgICBpbnRlcm5hbCBUcmVlIHRyZWVMaXRlcmFscyA9IG5ldyBUcmVlKCk7ICAvLyBkZXNjIGZvciBsaXRlcmFsIHRyZWUKKyAgICAgICAgaW50ZXJuYWwgVHJlZSB0cmVlRGlzdGFuY2VzID0gbmV3IFRyZWUoKTsgIC8vIGRlc2MgZm9yIGRpc3RhbmNlIHRyZWUKKyAgICAgICAgaW50ZXJuYWwgVHJlZSB0cmVlQml0TGVuZ3RocyA9IG5ldyBUcmVlKCk7IC8vIGRlc2MgZm9yIGJpdCBsZW5ndGggdHJlZQorCisgICAgICAgIC8vIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZQorICAgICAgICBpbnRlcm5hbCBzaG9ydFtdIGJsX2NvdW50ID0gbmV3IHNob3J0W0ludGVybmFsQ29uc3RhbnRzLk1BWF9CSVRTICsgMV07CisKKyAgICAgICAgLy8gaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzCisgICAgICAgIGludGVybmFsIGludFtdIGhlYXAgPSBuZXcgaW50WzIgKiBJbnRlcm5hbENvbnN0YW50cy5MX0NPREVTICsgMV07CisKKyAgICAgICAgaW50ZXJuYWwgaW50IGhlYXBfbGVuOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwCisgICAgICAgIGludGVybmFsIGludCBoZWFwX21heDsgICAgICAgICAgICAgIC8vIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kKKworICAgICAgICAvLyBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAgICAvLyBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLgorCisgICAgICAgIC8vIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgICAgaW50ZXJuYWwgc2J5dGVbXSBkZXB0aCA9IG5ldyBzYnl0ZVsyICogSW50ZXJuYWxDb25zdGFudHMuTF9DT0RFUyArIDFdOworCisgICAgICAgIGludGVybmFsIGludCBfbGVuZ3RoT2Zmc2V0OyAgICAgICAgICAgICAgICAgLy8gaW5kZXggZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMKKworCisgICAgICAgIC8vIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKKyAgICAgICAgLy8gbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOgorICAgICAgICAvLyAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzCisgICAgICAgIC8vICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQKKyAgICAgICAgLy8gICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuCisgICAgICAgIC8vICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvcgorICAgICAgICAvLyAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgICAgICAgIC8vICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhbgorICAgICAgICAvLyAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLgorICAgICAgICAvLyAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCisgICAgICAgIC8vICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3QKKyAgICAgICAgLy8gICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3IKKyAgICAgICAgLy8gICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICAgICAgICAvLyAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmUKKyAgICAgICAgLy8gICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZworICAgICAgICAvLyAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LgorCisgICAgICAgIGludGVybmFsIGludCBsaXRfYnVmc2l6ZTsKKworICAgICAgICBpbnRlcm5hbCBpbnQgbGFzdF9saXQ7ICAgICAvLyBydW5uaW5nIGluZGV4IGluIGxfYnVmCisKKyAgICAgICAgLy8gQnVmZmVyIGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZQorICAgICAgICAvLyB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZworICAgICAgICAvLyBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuCisKKyAgICAgICAgaW50ZXJuYWwgaW50IF9kaXN0YW5jZU9mZnNldDsgICAgICAgIC8vIGluZGV4IGludG8gcGVuZGluZzsgcG9pbnRzIHRvIGRpc3RhbmNlIGRhdGE/PworCisgICAgICAgIGludGVybmFsIGludCBvcHRfbGVuOyAgICAgIC8vIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMKKyAgICAgICAgaW50ZXJuYWwgaW50IHN0YXRpY19sZW47ICAgLy8gYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzCisgICAgICAgIGludGVybmFsIGludCBtYXRjaGVzOyAgICAgIC8vIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrCisgICAgICAgIGludGVybmFsIGludCBsYXN0X2VvYl9sZW47IC8vIGJpdCBsZW5ndGggb2YgRU9CIGNvZGUgZm9yIGxhc3QgYmxvY2sKKworICAgICAgICAvLyBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdAorICAgICAgICAvLyBzaWduaWZpY2FudCBiaXRzKS4KKyAgICAgICAgaW50ZXJuYWwgc2hvcnQgYmlfYnVmOworCisgICAgICAgIC8vIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdAorICAgICAgICAvLyBhcmUgYWx3YXlzIHplcm8uCisgICAgICAgIGludGVybmFsIGludCBiaV92YWxpZDsKKworCisgICAgICAgIGludGVybmFsIERlZmxhdGVNYW5hZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgZHluX2x0cmVlID0gbmV3IHNob3J0W0hFQVBfU0laRSAqIDJdOworICAgICAgICAgICAgZHluX2R0cmVlID0gbmV3IHNob3J0WygyICogSW50ZXJuYWxDb25zdGFudHMuRF9DT0RFUyArIDEpICogMl07IC8vIGRpc3RhbmNlIHRyZWUKKyAgICAgICAgICAgIGJsX3RyZWUgPSBuZXcgc2hvcnRbKDIgKiBJbnRlcm5hbENvbnN0YW50cy5CTF9DT0RFUyArIDEpICogMl07IC8vIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gbG1faW5pdAorICAgICAgICBwcml2YXRlIHZvaWQgX0luaXRpYWxpemVMYXp5TWF0Y2goKQorICAgICAgICB7CisgICAgICAgICAgICB3aW5kb3dfc2l6ZSA9IDIgKiB3X3NpemU7CisKKyAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBoYXNoIC0gd29ya2l0ZW0gOTA2MworICAgICAgICAgICAgQXJyYXkuQ2xlYXIoaGVhZCwgMCwgaGFzaF9zaXplKTsKKyAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNoX3NpemU7IGkrKykgaGVhZFtpXSA9IDA7CisKKyAgICAgICAgICAgIGNvbmZpZyA9IENvbmZpZy5Mb29rdXAoY29tcHJlc3Npb25MZXZlbCk7CisgICAgICAgICAgICBTZXREZWZsYXRlcigpOworCisgICAgICAgICAgICBzdHJzdGFydCA9IDA7CisgICAgICAgICAgICBibG9ja19zdGFydCA9IDA7CisgICAgICAgICAgICBsb29rYWhlYWQgPSAwOworICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoID0gcHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxOworICAgICAgICAgICAgbWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgIGluc19oID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9Jbml0aWFsaXplVHJlZURhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmVlTGl0ZXJhbHMuZHluX3RyZWUgPSBkeW5fbHRyZWU7CisgICAgICAgICAgICB0cmVlTGl0ZXJhbHMuc3RhdGljVHJlZSA9IFN0YXRpY1RyZWUuTGl0ZXJhbHM7CisKKyAgICAgICAgICAgIHRyZWVEaXN0YW5jZXMuZHluX3RyZWUgPSBkeW5fZHRyZWU7CisgICAgICAgICAgICB0cmVlRGlzdGFuY2VzLnN0YXRpY1RyZWUgPSBTdGF0aWNUcmVlLkRpc3RhbmNlczsKKworICAgICAgICAgICAgdHJlZUJpdExlbmd0aHMuZHluX3RyZWUgPSBibF90cmVlOworICAgICAgICAgICAgdHJlZUJpdExlbmd0aHMuc3RhdGljVHJlZSA9IFN0YXRpY1RyZWUuQml0TGVuZ3RoczsKKworICAgICAgICAgICAgYmlfYnVmID0gMDsKKyAgICAgICAgICAgIGJpX3ZhbGlkID0gMDsKKyAgICAgICAgICAgIGxhc3RfZW9iX2xlbiA9IDg7IC8vIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6CisgICAgICAgICAgICBfSW5pdGlhbGl6ZUJsb2NrcygpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBfSW5pdGlhbGl6ZUJsb2NrcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRyZWVzLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJbnRlcm5hbENvbnN0YW50cy5MX0NPREVTOyBpKyspCisgICAgICAgICAgICAgICAgZHluX2x0cmVlW2kgKiAyXSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEludGVybmFsQ29uc3RhbnRzLkRfQ09ERVM7IGkrKykKKyAgICAgICAgICAgICAgICBkeW5fZHRyZWVbaSAqIDJdID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSW50ZXJuYWxDb25zdGFudHMuQkxfQ09ERVM7IGkrKykKKyAgICAgICAgICAgICAgICBibF90cmVlW2kgKiAyXSA9IDA7CisKKyAgICAgICAgICAgIGR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXSA9IDE7CisgICAgICAgICAgICBvcHRfbGVuID0gc3RhdGljX2xlbiA9IDA7CisgICAgICAgICAgICBsYXN0X2xpdCA9IG1hdGNoZXMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssCisgICAgICAgIC8vIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCisgICAgICAgIC8vIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAgICAgICAgLy8gdHdvIHNvbnMpLgorICAgICAgICBpbnRlcm5hbCB2b2lkIHBxZG93bmhlYXAoc2hvcnRbXSB0cmVlLCBpbnQgaykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHYgPSBoZWFwW2tdOworICAgICAgICAgICAgaW50IGogPSBrIDw8IDE7IC8vIGxlZnQgc29uIG9mIGsKKyAgICAgICAgICAgIHdoaWxlIChqIDw9IGhlYXBfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6CisgICAgICAgICAgICAgICAgaWYgKGogPCBoZWFwX2xlbiAmJiBfSXNTbWFsbGVyKHRyZWUsIGhlYXBbaiArIDFdLCBoZWFwW2pdLCBkZXB0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zCisgICAgICAgICAgICAgICAgaWYgKF9Jc1NtYWxsZXIodHJlZSwgdiwgaGVhcFtqXSwgZGVwdGgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uCisgICAgICAgICAgICAgICAgaGVhcFtrXSA9IGhlYXBbal07IGsgPSBqOworICAgICAgICAgICAgICAgIC8vIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsKKyAgICAgICAgICAgICAgICBqIDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVhcFtrXSA9IHY7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBfSXNTbWFsbGVyKHNob3J0W10gdHJlZSwgaW50IG4sIGludCBtLCBzYnl0ZVtdIGRlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydCB0bjIgPSB0cmVlW24gKiAyXTsKKyAgICAgICAgICAgIHNob3J0IHRtMiA9IHRyZWVbbSAqIDJdOworICAgICAgICAgICAgcmV0dXJuICh0bjIgPCB0bTIgfHwgKHRuMiA9PSB0bTIgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICAgICAgICAvLyBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLgorICAgICAgICBpbnRlcm5hbCB2b2lkIHNjYW5fdHJlZShzaG9ydFtdIHRyZWUsIGludCBtYXhfY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG47IC8vIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMKKyAgICAgICAgICAgIGludCBwcmV2bGVuID0gLTE7IC8vIGxhc3QgZW1pdHRlZCBsZW5ndGgKKyAgICAgICAgICAgIGludCBjdXJsZW47IC8vIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUKKyAgICAgICAgICAgIGludCBuZXh0bGVuID0gKGludCl0cmVlWzAgKiAyICsgMV07IC8vIGxlbmd0aCBvZiBuZXh0IGNvZGUKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7IC8vIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlCisgICAgICAgICAgICBpbnQgbWF4X2NvdW50ID0gNzsgLy8gbWF4IHJlcGVhdCBjb3VudAorICAgICAgICAgICAgaW50IG1pbl9jb3VudCA9IDQ7IC8vIG1pbiByZXBlYXQgY291bnQKKworICAgICAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXhfY291bnQgPSAxMzg7IG1pbl9jb3VudCA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmVlWyhtYXhfY29kZSArIDEpICogMiArIDFdID0gKHNob3J0KTB4N2ZmZjsgLy8gZ3VhcmQgLy8/PworCisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IChpbnQpdHJlZVsobiArIDEpICogMiArIDFdOworICAgICAgICAgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmxfdHJlZVtjdXJsZW4gKiAyXSA9IChzaG9ydCkoYmxfdHJlZVtjdXJsZW4gKiAyXSArIGNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VybGVuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBibF90cmVlW2N1cmxlbiAqIDJdKys7CisgICAgICAgICAgICAgICAgICAgIGJsX3RyZWVbSW50ZXJuYWxDb25zdGFudHMuUkVQXzNfNiAqIDJdKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDEwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmxfdHJlZVtJbnRlcm5hbENvbnN0YW50cy5SRVBaXzNfMTAgKiAyXSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBibF90cmVlW0ludGVybmFsQ29uc3RhbnRzLlJFUFpfMTFfMTM4ICogMl0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICAgICAgICAgIGlmIChuZXh0bGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXhfY291bnQgPSAxMzg7IG1pbl9jb3VudCA9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X2NvdW50ID0gNjsgbWluX2NvdW50ID0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X2NvdW50ID0gNzsgbWluX2NvdW50ID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluCisgICAgICAgIC8vIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICAgICAgICBpbnRlcm5hbCBpbnQgYnVpbGRfYmxfdHJlZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtYXhfYmxpbmRleDsgLy8gaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcQorCisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzCisgICAgICAgICAgICBzY2FuX3RyZWUoZHluX2x0cmVlLCB0cmVlTGl0ZXJhbHMubWF4X2NvZGUpOworICAgICAgICAgICAgc2Nhbl90cmVlKGR5bl9kdHJlZSwgdHJlZURpc3RhbmNlcy5tYXhfY29kZSk7CisKKyAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6CisgICAgICAgICAgICB0cmVlQml0TGVuZ3Rocy5idWlsZF90cmVlKHRoaXMpOworICAgICAgICAgICAgLy8gb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorICAgICAgICAgICAgLy8gdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy4KKworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0CisgICAgICAgICAgICAvLyByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworICAgICAgICAgICAgLy8gMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKQorICAgICAgICAgICAgZm9yIChtYXhfYmxpbmRleCA9IEludGVybmFsQ29uc3RhbnRzLkJMX0NPREVTIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmxfdHJlZVtUcmVlLmJsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzCisgICAgICAgICAgICBvcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDsKKworICAgICAgICAgICAgcmV0dXJuIG1heF9ibGluZGV4OworICAgICAgICB9CisKKworICAgICAgICAvLyBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKKyAgICAgICAgLy8gbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCisgICAgICAgIC8vIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBzZW5kX2FsbF90cmVlcyhpbnQgbGNvZGVzLCBpbnQgZGNvZGVzLCBpbnQgYmxjb2RlcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJhbms7IC8vIGluZGV4IGluIGJsX29yZGVyCisKKyAgICAgICAgICAgIHNlbmRfYml0cyhsY29kZXMgLSAyNTcsIDUpOyAvLyBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQKKyAgICAgICAgICAgIHNlbmRfYml0cyhkY29kZXMgLSAxLCA1KTsKKyAgICAgICAgICAgIHNlbmRfYml0cyhibGNvZGVzIC0gNCwgNCk7IC8vIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQKKyAgICAgICAgICAgIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKGJsX3RyZWVbVHJlZS5ibF9vcmRlcltyYW5rXSAqIDIgKyAxXSwgMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kX3RyZWUoZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLy8gbGl0ZXJhbCB0cmVlCisgICAgICAgICAgICBzZW5kX3RyZWUoZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLy8gZGlzdGFuY2UgdHJlZQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpbgorICAgICAgICAvLyBibF90cmVlLgorICAgICAgICBpbnRlcm5hbCB2b2lkIHNlbmRfdHJlZShzaG9ydFtdIHRyZWUsIGludCBtYXhfY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cworICAgICAgICAgICAgaW50IHByZXZsZW4gICA9IC0xOyAgICAgICAgICAgICAgLy8gbGFzdCBlbWl0dGVkIGxlbmd0aAorICAgICAgICAgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIGN1cnJlbnQgY29kZQorICAgICAgICAgICAgaW50IG5leHRsZW4gICA9IHRyZWVbMCAqIDIgKyAxXTsgLy8gbGVuZ3RoIG9mIG5leHQgY29kZQorICAgICAgICAgICAgaW50IGNvdW50ICAgICA9IDA7ICAgICAgICAgICAgICAgLy8gcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUKKyAgICAgICAgICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgICAgICAgIC8vIG1heCByZXBlYXQgY291bnQKKyAgICAgICAgICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgICAgICAgIC8vIG1pbiByZXBlYXQgY291bnQKKworICAgICAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXhfY291bnQgPSAxMzg7IG1pbl9jb3VudCA9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdOworICAgICAgICAgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9jb2RlKGN1cmxlbiwgYmxfdHJlZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tY291bnQgIT0gMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cmxlbiAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvZGUoY3VybGVuLCBibF90cmVlKTsgY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZW5kX2NvZGUoSW50ZXJuYWxDb25zdGFudHMuUkVQXzNfNiwgYmxfdHJlZSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRfYml0cyhjb3VudCAtIDMsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudCA8PSAxMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRfY29kZShJbnRlcm5hbENvbnN0YW50cy5SRVBaXzNfMTAsIGJsX3RyZWUpOworICAgICAgICAgICAgICAgICAgICBzZW5kX2JpdHMoY291bnQgLSAzLCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF9jb2RlKEludGVybmFsQ29uc3RhbnRzLlJFUFpfMTFfMTM4LCBibF90cmVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF9iaXRzKGNvdW50IC0gMTEsIDcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47CisgICAgICAgICAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1heF9jb3VudCA9IDEzODsgbWluX2NvdW50ID0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXhfY291bnQgPSA2OyBtaW5fY291bnQgPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXhfY291bnQgPSA3OyBtaW5fY291bnQgPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE91dHB1dCBhIGJsb2NrIG9mIGJ5dGVzIG9uIHRoZSBzdHJlYW0uCisgICAgICAgIC8vIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ19idWYuCisgICAgICAgIHByaXZhdGUgdm9pZCBwdXRfYnl0ZXMoYnl0ZVtdIHAsIGludCBzdGFydCwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgQXJyYXkuQ29weShwLCBzdGFydCwgcGVuZGluZywgcGVuZGluZ0NvdW50LCBsZW4pOworICAgICAgICAgICAgcGVuZGluZ0NvdW50ICs9IGxlbjsKKyAgICAgICAgfQorCisjaWYgTk9UTkVFREVECisgICAgICAgIHByaXZhdGUgdm9pZCBwdXRfYnl0ZShieXRlIGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0NvdW50KytdID0gYzsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIHB1dF9zaG9ydChpbnQgYikKKyAgICAgICAgeworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSliOworICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0NvdW50KytdID0gKGJ5dGUpKGIgPj4gOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBwdXRTaG9ydE1TQihpbnQgYikKKyAgICAgICAgeworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoYiA+PiA4KTsKKyAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKWI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGludGVybmFsIHZvaWQgc2VuZF9jb2RlKGludCBjLCBzaG9ydFtdIHRyZWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjMiA9IGMgKiAyOworICAgICAgICAgICAgc2VuZF9iaXRzKCh0cmVlW2MyXSAmIDB4ZmZmZiksICh0cmVlW2MyICsgMV0gJiAweGZmZmYpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHZvaWQgc2VuZF9iaXRzKGludCB2YWx1ZSwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbiA9IGxlbmd0aDsKKyAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2ludCB2YWwgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICBiaV9idWYgfD0gKHZhbCA8PCBiaV92YWxpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgYmlfYnVmIHw9IChzaG9ydCkoKHZhbHVlIDw8IGJpX3ZhbGlkKSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIC8vcHV0X3Nob3J0KGJpX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKWJpX2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0NvdW50KytdID0gKGJ5dGUpKGJpX2J1ZiA+PiA4KTsKKworCisgICAgICAgICAgICAgICAgICAgIGJpX2J1ZiA9IChzaG9ydCkoKHVpbnQpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gYmlfdmFsaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYmlfdmFsaWQgKz0gbGVuIC0gQnVmX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmlfYnVmIHw9ICh2YWx1ZSkgPDwgYmlfdmFsaWQ7CisgICAgICAgICAgICAgICAgICAgIGJpX2J1ZiB8PSAoc2hvcnQpKCh2YWx1ZSA8PCBiaV92YWxpZCkgJiAweGZmZmYpOworICAgICAgICAgICAgICAgICAgICBiaV92YWxpZCArPSBsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS4KKyAgICAgICAgLy8gVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuCisgICAgICAgIC8vIFRoZSBjdXJyZW50IGluZmxhdGUgY29kZSByZXF1aXJlcyA5IGJpdHMgb2YgbG9va2FoZWFkLiBJZiB0aGUKKyAgICAgICAgLy8gbGFzdCB0d28gY29kZXMgZm9yIHRoZSBwcmV2aW91cyBibG9jayAocmVhbCBjb2RlIHBsdXMgRU9CKSB3ZXJlIGNvZGVkCisgICAgICAgIC8vIG9uIDUgYml0cyBvciBsZXNzLCBpbmZsYXRlIG1heSBoYXZlIG9ubHkgNSszIGJpdHMgb2YgbG9va2FoZWFkIHRvIGRlY29kZQorICAgICAgICAvLyB0aGUgbGFzdCByZWFsIGNvZGUuIEluIHRoaXMgY2FzZSB3ZSBzZW5kIHR3byBlbXB0eSBzdGF0aWMgYmxvY2tzIGluc3RlYWQKKyAgICAgICAgLy8gb2Ygb25lLiAoVGhlcmUgYXJlIG5vIHByb2JsZW1zIGlmIHRoZSBwcmV2aW91cyBibG9jayBpcyBzdG9yZWQgb3IgZml4ZWQuKQorICAgICAgICAvLyBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgYXNzdW1lIHRoZSB3b3JzdCBjYXNlIG9mIGxhc3QgcmVhbCBjb2RlIGVuY29kZWQKKyAgICAgICAgLy8gb24gb25lIGJpdCBvbmx5LgorICAgICAgICBpbnRlcm5hbCB2b2lkIF90cl9hbGlnbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRfYml0cyhTVEFUSUNfVFJFRVMgPDwgMSwgMyk7CisgICAgICAgICAgICBzZW5kX2NvZGUoRU5EX0JMT0NLLCBTdGF0aWNUcmVlLmxlbmd0aEFuZExpdGVyYWxzVHJlZUNvZGVzKTsKKworICAgICAgICAgICAgYmlfZmx1c2goKTsKKworICAgICAgICAgICAgLy8gT2YgdGhlIDEwIGJpdHMgZm9yIHRoZSBlbXB0eSBibG9jaywgd2UgaGF2ZSBhbHJlYWR5IHNlbnQKKyAgICAgICAgICAgIC8vICgxMCAtIGJpX3ZhbGlkKSBiaXRzLiBUaGUgbG9va2FoZWFkIGZvciB0aGUgbGFzdCByZWFsIGNvZGUgKGJlZm9yZQorICAgICAgICAgICAgLy8gdGhlIEVPQiBvZiB0aGUgcHJldmlvdXMgYmxvY2spIHdhcyB0aHVzIGF0IGxlYXN0IG9uZSBwbHVzIHRoZSBsZW5ndGgKKyAgICAgICAgICAgIC8vIG9mIHRoZSBFT0IgcGx1cyB3aGF0IHdlIGhhdmUganVzdCBzZW50IG9mIHRoZSBlbXB0eSBzdGF0aWMgYmxvY2suCisgICAgICAgICAgICBpZiAoMSArIGxhc3RfZW9iX2xlbiArIDEwIC0gYmlfdmFsaWQgPCA5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhTVEFUSUNfVFJFRVMgPDwgMSwgMyk7CisgICAgICAgICAgICAgICAgc2VuZF9jb2RlKEVORF9CTE9DSywgU3RhdGljVHJlZS5sZW5ndGhBbmRMaXRlcmFsc1RyZWVDb2Rlcyk7CisgICAgICAgICAgICAgICAgYmlfZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RfZW9iX2xlbiA9IDc7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgorICAgICAgICAvLyB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuCisgICAgICAgIGludGVybmFsIGJvb2wgX3RyX3RhbGx5KGludCBkaXN0LCBpbnQgbGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlbmRpbmdbX2Rpc3RhbmNlT2Zmc2V0ICsgbGFzdF9saXQgKiAyXSA9IHVuY2hlY2tlZCgoYnl0ZSkgKCAodWludClkaXN0ID4+IDggKSApOworICAgICAgICAgICAgcGVuZGluZ1tfZGlzdGFuY2VPZmZzZXQgKyBsYXN0X2xpdCAqIDIgKyAxXSA9IHVuY2hlY2tlZCgoYnl0ZSlkaXN0KTsKKyAgICAgICAgICAgIHBlbmRpbmdbX2xlbmd0aE9mZnNldCArIGxhc3RfbGl0XSA9IHVuY2hlY2tlZCgoYnl0ZSlsYyk7CisgICAgICAgICAgICBsYXN0X2xpdCsrOworCisgICAgICAgICAgICBpZiAoZGlzdCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhcgorICAgICAgICAgICAgICAgIGR5bl9sdHJlZVtsYyAqIDJdKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF0Y2hlcysrOworICAgICAgICAgICAgICAgIC8vIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0gKKyAgICAgICAgICAgICAgICBkaXN0LS07IC8vIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEKKyAgICAgICAgICAgICAgICBkeW5fbHRyZWVbKFRyZWUuTGVuZ3RoQ29kZVtsY10gKyBJbnRlcm5hbENvbnN0YW50cy5MSVRFUkFMUyArIDEpICogMl0rKzsKKyAgICAgICAgICAgICAgICBkeW5fZHRyZWVbVHJlZS5EaXN0YW5jZUNvZGUoZGlzdCkgKiAyXSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGxhc3RfbGl0ICYgMHgxZmZmKSA9PSAwICYmIChpbnQpY29tcHJlc3Npb25MZXZlbCA+IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoCisgICAgICAgICAgICAgICAgaW50IG91dF9sZW5ndGggPSBsYXN0X2xpdCA8PCAzOworICAgICAgICAgICAgICAgIGludCBpbl9sZW5ndGggPSBzdHJzdGFydCAtIGJsb2NrX3N0YXJ0OworICAgICAgICAgICAgICAgIGludCBkY29kZTsKKyAgICAgICAgICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBJbnRlcm5hbENvbnN0YW50cy5EX0NPREVTOyBkY29kZSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0X2xlbmd0aCA9IChpbnQpKG91dF9sZW5ndGggKyAoaW50KWR5bl9kdHJlZVtkY29kZSAqIDJdICogKDVMICsgVHJlZS5FeHRyYURpc3RhbmNlQml0c1tkY29kZV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0X2xlbmd0aCA+Pj0gMzsKKyAgICAgICAgICAgICAgICBpZiAoKG1hdGNoZXMgPCAobGFzdF9saXQgLyAyKSkgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aCAvIDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKGxhc3RfbGl0ID09IGxpdF9idWZzaXplIC0gMSkgfHwgKGxhc3RfbGl0ID09IGxpdF9idWZzaXplKTsKKyAgICAgICAgICAgIC8vIGRpbm9jaCAtIHdyYXBhcm91bmQ/CisgICAgICAgICAgICAvLyBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKKyAgICAgICAgICAgIC8vIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCisgICAgICAgICAgICAvLyA2NEstMSBieXRlcy4KKyAgICAgICAgfQorCisKKworICAgICAgICAvLyBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXMKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBzZW5kX2NvbXByZXNzZWRfYmxvY2soc2hvcnRbXSBsdHJlZSwgc2hvcnRbXSBkdHJlZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRpc3RhbmNlOyAvLyBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZworICAgICAgICAgICAgaW50IGxjOyAgICAgICAvLyBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkKKyAgICAgICAgICAgIGludCBseCA9IDA7ICAgLy8gcnVubmluZyBpbmRleCBpbiBsX2J1ZgorICAgICAgICAgICAgaW50IGNvZGU7ICAgICAvLyB0aGUgY29kZSB0byBzZW5kCisgICAgICAgICAgICBpbnQgZXh0cmE7ICAgIC8vIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQKKworICAgICAgICAgICAgaWYgKGxhc3RfbGl0ICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IF9kaXN0YW5jZU9mZnNldCArIGx4ICogMjsKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAoKHBlbmRpbmdbaXhdIDw8IDgpICYgMHhmZjAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAocGVuZGluZ1tpeCArIDFdICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGxjID0gKHBlbmRpbmdbX2xlbmd0aE9mZnNldCArIGx4XSkgJiAweGZmOworICAgICAgICAgICAgICAgICAgICBseCsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvZGUobGMsIGx0cmVlKTsgLy8gc2VuZCBhIGxpdGVyYWwgYnl0ZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGl0ZXJhbCBvciBtYXRjaCBwYWlyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENICisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVHJlZS5MZW5ndGhDb2RlW2xjXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgbGVuZ3RoIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29kZShjb2RlICsgSW50ZXJuYWxDb25zdGFudHMuTElURVJBTFMgKyAxLCBsdHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IFRyZWUuRXh0cmFMZW5ndGhCaXRzW2NvZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYyAtPSBUcmVlLkxlbmd0aEJhc2VbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9iaXRzKGxjLCBleHRyYSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZS0tOyAvLyBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVHJlZS5EaXN0YW5jZUNvZGUoZGlzdGFuY2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2NvZGUoY29kZSwgZHRyZWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IFRyZWUuRXh0cmFEaXN0YW5jZUJpdHNbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgLT0gVHJlZS5EaXN0YW5jZUJhc2VbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9iaXRzKGRpc3RhbmNlLCBleHRyYSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZyBhbmQgZF9idWYrbF9idWYgaXMgb2s6CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChseCA8IGxhc3RfbGl0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VuZF9jb2RlKEVORF9CTE9DSywgbHRyZWUpOworICAgICAgICAgICAgbGFzdF9lb2JfbGVuID0gbHRyZWVbRU5EX0JMT0NLICogMiArIDFdOworICAgICAgICB9CisKKworCisgICAgICAgIC8vIFNldCB0aGUgZGF0YSB0eXBlIHRvIEFTQ0lJIG9yIEJJTkFSWSwgdXNpbmcgYSBjcnVkZSBhcHByb3hpbWF0aW9uOgorICAgICAgICAvLyBiaW5hcnkgaWYgbW9yZSB0aGFuIDIwJSBvZiB0aGUgYnl0ZXMgYXJlIDw9IDYgb3IgPj0gMTI4LCBhc2NpaSBvdGhlcndpc2UuCisgICAgICAgIC8vIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0IGFuZCB0aGUgdG90YWwgb2YgYWxsCisgICAgICAgIC8vIGZyZXF1ZW5jaWVzIGRvZXMgbm90IGV4Y2VlZCA2NEsgKHRvIGZpdCBpbiBhbiBpbnQgb24gMTYgYml0IG1hY2hpbmVzKS4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBzZXRfZGF0YV90eXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgaW50IGFzY2lpX2ZyZXEgPSAwOworICAgICAgICAgICAgaW50IGJpbl9mcmVxID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChuIDwgNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiaW5fZnJlcSArPSBkeW5fbHRyZWVbbiAqIDJdOyBuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobiA8IDEyOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc2NpaV9mcmVxICs9IGR5bl9sdHJlZVtuICogMl07IG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChuIDwgSW50ZXJuYWxDb25zdGFudHMuTElURVJBTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmluX2ZyZXEgKz0gZHluX2x0cmVlW24gKiAyXTsgbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YV90eXBlID0gKHNieXRlKShiaW5fZnJlcSA+IChhc2NpaV9mcmVxID4+IDIpID8gWl9CSU5BUlkgOiBaX0FTQ0lJKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLyBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBiaV9mbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiaV92YWxpZCA9PSAxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKWJpX2J1ZjsKKyAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKShiaV9idWYgPj4gOCk7CisgICAgICAgICAgICAgICAgYmlfYnVmID0gMDsKKyAgICAgICAgICAgICAgICBiaV92YWxpZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChiaV92YWxpZCA+PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcHV0X2J5dGUoKGJ5dGUpYmlfYnVmKTsKKyAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKWJpX2J1ZjsKKyAgICAgICAgICAgICAgICBiaV9idWYgPj49IDg7CisgICAgICAgICAgICAgICAgYmlfdmFsaWQgLT0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeQorICAgICAgICBpbnRlcm5hbCB2b2lkIGJpX3dpbmR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiaV92YWxpZCA+IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSliaV9idWY7CisgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoYmlfYnVmID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYmlfdmFsaWQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcHV0X2J5dGUoKGJ5dGUpYmlfYnVmKTsKKyAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKWJpX2J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpX2J1ZiA9IDA7CisgICAgICAgICAgICBiaV92YWxpZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cworICAgICAgICAvLyBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBjb3B5X2Jsb2NrKGludCBidWYsIGludCBsZW4sIGJvb2wgaGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBiaV93aW5kdXAoKTsgLy8gYWxpZ24gb24gYnl0ZSBib3VuZGFyeQorICAgICAgICAgICAgbGFzdF9lb2JfbGVuID0gODsgLy8gZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZQorCisgICAgICAgICAgICBpZiAoaGVhZGVyKQorICAgICAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9wdXRfc2hvcnQoKHNob3J0KWxlbik7CisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0NvdW50KytdID0gKGJ5dGUpbGVuOworICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKShsZW4gPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIC8vcHV0X3Nob3J0KChzaG9ydCl+bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSl+bGVuOworICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKSh+bGVuID4+IDgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHV0X2J5dGVzKHdpbmRvdywgYnVmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBmbHVzaF9ibG9ja19vbmx5KGJvb2wgZW9mKQorICAgICAgICB7CisgICAgICAgICAgICBfdHJfZmx1c2hfYmxvY2soYmxvY2tfc3RhcnQgPj0gMCA/IGJsb2NrX3N0YXJ0IDogLTEsIHN0cnN0YXJ0IC0gYmxvY2tfc3RhcnQsIGVvZik7CisgICAgICAgICAgICBibG9ja19zdGFydCA9IHN0cnN0YXJ0OworICAgICAgICAgICAgX2NvZGVjLmZsdXNoX3BlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuCisgICAgICAgIC8vIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLgorICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQorICAgICAgICAvLyB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZAorICAgICAgICAvLyBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCisgICAgICAgIC8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KKyAgICAgICAgLy8gd2luZG93IHRvIHBlbmRpbmdfYnVmLgorICAgICAgICBpbnRlcm5hbCBCbG9ja1N0YXRlIERlZmxhdGVOb25lKEZsdXNoVHlwZSBmbHVzaCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmcgaXMgbGltaXRlZAorICAgICAgICAgICAgLy8gdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6CisKKyAgICAgICAgICAgIGludCBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjsKKyAgICAgICAgICAgIGludCBtYXhfc3RhcnQ7CisKKyAgICAgICAgICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHBlbmRpbmcuTGVuZ3RoIC0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXhfYmxvY2tfc2l6ZSA9IHBlbmRpbmcuTGVuZ3RoIC0gNTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OgorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6CisgICAgICAgICAgICAgICAgaWYgKGxvb2thaGVhZCA8PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGxXaW5kb3coKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2thaGVhZCA9PSAwICYmIGZsdXNoID09IEZsdXNoVHlwZS5Ob25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb2NrU3RhdGUuTmVlZE1vcmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb29rYWhlYWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBmbHVzaCB0aGUgY3VycmVudCBibG9jaworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0cnN0YXJ0ICs9IGxvb2thaGVhZDsKKyAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSAwOworCisgICAgICAgICAgICAgICAgLy8gRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nIHdpbGwgYmUgZnVsbDoKKyAgICAgICAgICAgICAgICBtYXhfc3RhcnQgPSBibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplOworICAgICAgICAgICAgICAgIGlmIChzdHJzdGFydCA9PSAwIHx8IHN0cnN0YXJ0ID49IG1heF9zdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IChpbnQpKHN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQgPSAoaW50KW1heF9zdGFydDsKKworICAgICAgICAgICAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc091dCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb2NrU3RhdGUuTmVlZE1vcmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKKyAgICAgICAgICAgICAgICBpZiAoc3Ryc3RhcnQgLSBibG9ja19zdGFydCA+PSB3X3NpemUgLSBNSU5fTE9PS0FIRUFEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNPdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9ja1N0YXRlLk5lZWRNb3JlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShmbHVzaCA9PSBGbHVzaFR5cGUuRmluaXNoKTsKKyAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNPdXQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZsdXNoID09IEZsdXNoVHlwZS5GaW5pc2gpID8gQmxvY2tTdGF0ZS5GaW5pc2hTdGFydGVkIDogQmxvY2tTdGF0ZS5OZWVkTW9yZTsKKworICAgICAgICAgICAgcmV0dXJuIGZsdXNoID09IEZsdXNoVHlwZS5GaW5pc2ggPyBCbG9ja1N0YXRlLkZpbmlzaERvbmUgOiBCbG9ja1N0YXRlLkJsb2NrRG9uZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gU2VuZCBhIHN0b3JlZCBibG9jaworICAgICAgICBpbnRlcm5hbCB2b2lkIF90cl9zdG9yZWRfYmxvY2soaW50IGJ1ZiwgaW50IHN0b3JlZF9sZW4sIGJvb2wgZW9mKQorICAgICAgICB7CisgICAgICAgICAgICBzZW5kX2JpdHMoKFNUT1JFRF9CTE9DSyA8PCAxKSArIChlb2YgPyAxIDogMCksIDMpOyAvLyBzZW5kIGJsb2NrIHR5cGUKKyAgICAgICAgICAgIGNvcHlfYmxvY2soYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLy8gd2l0aCBoZWFkZXIKKyAgICAgICAgfQorCisgICAgICAgIC8vIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYworICAgICAgICAvLyB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuCisgICAgICAgIGludGVybmFsIHZvaWQgX3RyX2ZsdXNoX2Jsb2NrKGludCBidWYsIGludCBzdG9yZWRfbGVuLCBib29sIGVvZikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgLy8gb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcworICAgICAgICAgICAgaW50IG1heF9ibGluZGV4ID0gMDsgLy8gaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcQorCisgICAgICAgICAgICAvLyBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkCisgICAgICAgICAgICBpZiAoY29tcHJlc3Npb25MZXZlbCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYXNjaWkgb3IgYmluYXJ5CisgICAgICAgICAgICAgICAgaWYgKGRhdGFfdHlwZSA9PSBaX1VOS05PV04pCisgICAgICAgICAgICAgICAgICAgIHNldF9kYXRhX3R5cGUoKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMKKyAgICAgICAgICAgICAgICB0cmVlTGl0ZXJhbHMuYnVpbGRfdHJlZSh0aGlzKTsKKworICAgICAgICAgICAgICAgIHRyZWVEaXN0YW5jZXMuYnVpbGRfdHJlZSh0aGlzKTsKKworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuCisKKyAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleAorICAgICAgICAgICAgICAgIC8vIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICAgICAgICAgICAgICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZSgpOworCisgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIGZpcnN0IHRoZSBibG9jayBsZW5ndGggaW4gYnl0ZXMKKyAgICAgICAgICAgICAgICBvcHRfbGVuYiA9IChvcHRfbGVuICsgMyArIDcpID4+IDM7CisgICAgICAgICAgICAgICAgc3RhdGljX2xlbmIgPSAoc3RhdGljX2xlbiArIDMgKyA3KSA+PiAzOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKQorICAgICAgICAgICAgICAgICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLy8gZm9yY2UgYSBzdG9yZWQgYmxvY2sKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iICYmIGJ1ZiAhPSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzCisgICAgICAgICAgICAgICAgLy8gVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCisgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvCisgICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KKyAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKGJ1Ziwgc3RvcmVkX2xlbiwgZW9mKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRpY19sZW5iID09IG9wdF9sZW5iKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRfYml0cygoU1RBVElDX1RSRUVTIDw8IDEpICsgKGVvZiA/IDEgOiAwKSwgMyk7CisgICAgICAgICAgICAgICAgc2VuZF9jb21wcmVzc2VkX2Jsb2NrKFN0YXRpY1RyZWUubGVuZ3RoQW5kTGl0ZXJhbHNUcmVlQ29kZXMsIFN0YXRpY1RyZWUuZGlzdFRyZWVDb2Rlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKChEWU5fVFJFRVMgPDwgMSkgKyAoZW9mID8gMSA6IDApLCAzKTsKKyAgICAgICAgICAgICAgICBzZW5kX2FsbF90cmVlcyh0cmVlTGl0ZXJhbHMubWF4X2NvZGUgKyAxLCB0cmVlRGlzdGFuY2VzLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICBzZW5kX2NvbXByZXNzZWRfYmxvY2soZHluX2x0cmVlLCBkeW5fZHRyZWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQgorICAgICAgICAgICAgLy8gYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuCisKKyAgICAgICAgICAgIF9Jbml0aWFsaXplQmxvY2tzKCk7CisKKyAgICAgICAgICAgIGlmIChlb2YpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmlfd2luZHVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgorICAgICAgICAvLyBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRAorICAgICAgICAvLyBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRAorICAgICAgICAvLyAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmUKKyAgICAgICAgLy8gICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2wKKyAgICAgICAgLy8gICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuCisgICAgICAgIHByaXZhdGUgdm9pZCBfZmlsbFdpbmRvdygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuLCBtOworICAgICAgICAgICAgaW50IHA7CisgICAgICAgICAgICBpbnQgbW9yZTsgLy8gQW1vdW50IG9mIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LgorCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1vcmUgPSAod2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydCk7CisKKyAgICAgICAgICAgICAgICAvLyBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OgorICAgICAgICAgICAgICAgIGlmIChtb3JlID09IDAgJiYgc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1vcmUgPSB3X3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vcmUgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYgc3Ryc3RhcnQgPT0gMAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgb25lIGJ5dGUgYXQgdGltZSkKKyAgICAgICAgICAgICAgICAgICAgbW9yZS0tOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCisgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnN0YXJ0ID49IHdfc2l6ZSArIHdfc2l6ZSAtIE1JTl9MT09LQUhFQUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KHdpbmRvdywgd19zaXplLCB3aW5kb3csIDAsIHdfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoX3N0YXJ0IC09IHdfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQgLT0gd19zaXplOyAvLyB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVAorICAgICAgICAgICAgICAgICAgICBibG9ja19zdGFydCAtPSB3X3NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZSkuIFdlIHNsaWRlIGV2ZW4gd2hlbiBsZXZlbCA9PSAwCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mCisgICAgICAgICAgICAgICAgICAgIC8vIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pCisKKyAgICAgICAgICAgICAgICAgICAgbiA9IGhhc2hfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IG47CisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAoaGVhZFstLXBdICYgMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRbcF0gPSAoc2hvcnQpKChtID49IHdfc2l6ZSkgPyAobSAtIHdfc2l6ZSkgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1uICE9IDApOworCisgICAgICAgICAgICAgICAgICAgIG4gPSB3X3NpemU7CisgICAgICAgICAgICAgICAgICAgIHAgPSBuOworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtID0gKHByZXZbLS1wXSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2W3BdID0gKHNob3J0KSgobSA+PSB3X3NpemUpID8gKG0gLSB3X3NpemUpIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1uICE9IDApOworICAgICAgICAgICAgICAgICAgICBtb3JlICs9IHdfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6CisgICAgICAgICAgICAgICAgLy8gICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiYKKyAgICAgICAgICAgICAgICAvLyAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKKyAgICAgICAgICAgICAgICAvLyA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSkKKyAgICAgICAgICAgICAgICAvLyA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDIKKyAgICAgICAgICAgICAgICAvLyBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSwKKyAgICAgICAgICAgICAgICAvLyAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJgorICAgICAgICAgICAgICAgIC8vICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuCisKKyAgICAgICAgICAgICAgICBuID0gX2NvZGVjLnJlYWRfYnVmKHdpbmRvdywgc3Ryc3RhcnQgKyBsb29rYWhlYWQsIG1vcmUpOworICAgICAgICAgICAgICAgIGxvb2thaGVhZCArPSBuOworCisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6CisgICAgICAgICAgICAgICAgaWYgKGxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnNfaCA9IHdpbmRvd1tzdHJzdGFydF0gJiAweGZmOworICAgICAgICAgICAgICAgICAgICBpbnNfaCA9ICgoKGluc19oKSA8PCBoYXNoX3NoaWZ0KSBeICh3aW5kb3dbc3Ryc3RhcnQgKyAxXSAmIDB4ZmYpKSAmIGhhc2hfbWFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luICE9IDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudAorICAgICAgICAvLyBibG9jayBzdGF0ZS4KKyAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzCisgICAgICAgIC8vIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydAorICAgICAgICAvLyBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuCisgICAgICAgIGludGVybmFsIEJsb2NrU3RhdGUgRGVmbGF0ZUZhc3QoRmx1c2hUeXBlIGZsdXNoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAgICBzaG9ydCBoYXNoX2hlYWQgPSAwOyAvLyBoZWFkIG9mIHRoZSBoYXNoIGNoYWluCisgICAgICAgICAgICBpbnQgaGFzaF9oZWFkID0gMDsgLy8gaGVhZCBvZiB0aGUgaGFzaCBjaGFpbgorICAgICAgICAgICAgYm9vbCBiZmx1c2g7IC8vIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZAorCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgICAgICAgIC8vIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAgICAgICAgaWYgKGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlsbFdpbmRvdygpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBGbHVzaFR5cGUuTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb2NrU3RhdGUuTmVlZE1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2thaGVhZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgICAgICAgIGlmIChsb29rYWhlYWQgPj0gTUlOX01BVENIKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zX2ggPSAoKChpbnNfaCkgPDwgaGFzaF9zaGlmdCkgXiAod2luZG93WyhzdHJzdGFydCkgKyAoTUlOX01BVENIIC0gMSldICYgMHhmZikpICYgaGFzaF9tYXNrOworCisgICAgICAgICAgICAgICAgICAgIC8vICBwcmV2W3N0cnN0YXJ0JndfbWFza109aGFzaF9oZWFkPWhlYWRbaW5zX2hdOworICAgICAgICAgICAgICAgICAgICBoYXNoX2hlYWQgPSAoaGVhZFtpbnNfaF0gJiAweGZmZmYpOworICAgICAgICAgICAgICAgICAgICBwcmV2W3N0cnN0YXJ0ICYgd19tYXNrXSA9IGhlYWRbaW5zX2hdOworICAgICAgICAgICAgICAgICAgICBoZWFkW2luc19oXSA9IHVuY2hlY2tlZCgoc2hvcnQpc3Ryc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCisgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0gKKworICAgICAgICAgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gMEwgJiYgKChzdHJzdGFydCAtIGhhc2hfaGVhZCkgJiAweGZmZmYpIDw9IHdfc2l6ZSAtIE1JTl9MT09LQUhFQUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICAgICAgICAvLyBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgorICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb25TdHJhdGVneSAhPSBDb21wcmVzc2lvblN0cmF0ZWd5Lkh1ZmZtYW5Pbmx5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgY2hlY2tfbWF0Y2goc3Ryc3RhcnQsIG1hdGNoX3N0YXJ0LCBtYXRjaF9sZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGJmbHVzaCA9IF90cl90YWxseShzdHJzdGFydCAtIG1hdGNoX3N0YXJ0LCBtYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpOworCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCAtPSBtYXRjaF9sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hfbGVuZ3RoIDw9IGNvbmZpZy5NYXhMYXp5ICYmIGxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2xlbmd0aC0tOyAvLyBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiBoYXNoIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0Kys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNfaCA9ICgoaW5zX2ggPDwgaGFzaF9zaGlmdCkgXiAod2luZG93WyhzdHJzdGFydCkgKyAoTUlOX01BVENIIC0gMSldICYgMHhmZikpICYgaGFzaF9tYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgcHJldltzdHJzdGFydCZ3X21hc2tdPWhhc2hfaGVhZD1oZWFkW2luc19oXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2hlYWQgPSAoaGVhZFtpbnNfaF0gJiAweGZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZbc3Ryc3RhcnQgJiB3X21hc2tdID0gaGVhZFtpbnNfaF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZFtpbnNfaF0gPSB1bmNoZWNrZWQoKHNob3J0KXN0cnN0YXJ0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tbWF0Y2hfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ICs9IG1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNfaCA9IHdpbmRvd1tzdHJzdGFydF0gJiAweGZmOworCisgICAgICAgICAgICAgICAgICAgICAgICBpbnNfaCA9ICgoKGluc19oKSA8PCBoYXNoX3NoaWZ0KSBeICh3aW5kb3dbc3Ryc3RhcnQgKyAxXSAmIDB4ZmYpKSAmIGhhc2hfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUKKworICAgICAgICAgICAgICAgICAgICBiZmx1c2ggPSBfdHJfdGFsbHkoMCwgd2luZG93W3N0cnN0YXJ0XSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQtLTsKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJmbHVzaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzT3V0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmxvY2tTdGF0ZS5OZWVkTW9yZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkoZmx1c2ggPT0gRmx1c2hUeXBlLkZpbmlzaCk7CisgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzT3V0ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IEZsdXNoVHlwZS5GaW5pc2gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9ja1N0YXRlLkZpbmlzaFN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmxvY2tTdGF0ZS5OZWVkTW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbHVzaCA9PSBGbHVzaFR5cGUuRmluaXNoID8gQmxvY2tTdGF0ZS5GaW5pc2hEb25lIDogQmxvY2tTdGF0ZS5CbG9ja0RvbmU7CisgICAgICAgIH0KKworICAgICAgICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5CisgICAgICAgIC8vIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKKyAgICAgICAgLy8gbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi4KKyAgICAgICAgaW50ZXJuYWwgQmxvY2tTdGF0ZSBEZWZsYXRlU2xvdyhGbHVzaFR5cGUgZmx1c2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgIHNob3J0IGhhc2hfaGVhZCA9IDA7ICAgIC8vIGhlYWQgb2YgaGFzaCBjaGFpbgorICAgICAgICAgICAgaW50IGhhc2hfaGVhZCA9IDA7IC8vIGhlYWQgb2YgaGFzaCBjaGFpbgorICAgICAgICAgICAgYm9vbCBiZmx1c2g7IC8vIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZAorCisgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKworICAgICAgICAgICAgICAgIGlmIChsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGxXaW5kb3coKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gRmx1c2hUeXBlLk5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmxvY2tTdGF0ZS5OZWVkTW9yZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobG9va2FoZWFkID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CisKKyAgICAgICAgICAgICAgICBpZiAobG9va2FoZWFkID49IE1JTl9NQVRDSCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluc19oID0gKCgoaW5zX2gpIDw8IGhhc2hfc2hpZnQpIF4gKHdpbmRvd1soc3Ryc3RhcnQpICsgKE1JTl9NQVRDSCAtIDEpXSAmIDB4ZmYpKSAmIGhhc2hfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgLy8gIHByZXZbc3Ryc3RhcnQmd19tYXNrXT1oYXNoX2hlYWQ9aGVhZFtpbnNfaF07CisgICAgICAgICAgICAgICAgICAgIGhhc2hfaGVhZCA9IChoZWFkW2luc19oXSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIHByZXZbc3Ryc3RhcnQgJiB3X21hc2tdID0gaGVhZFtpbnNfaF07CisgICAgICAgICAgICAgICAgICAgIGhlYWRbaW5zX2hdID0gdW5jaGVja2VkKChzaG9ydClzdHJzdGFydCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICAgICAgICBwcmV2X2xlbmd0aCA9IG1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBwcmV2X21hdGNoID0gbWF0Y2hfc3RhcnQ7CisgICAgICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKKworICAgICAgICAgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gMCAmJiBwcmV2X2xlbmd0aCA8IGNvbmZpZy5NYXhMYXp5ICYmCisgICAgICAgICAgICAgICAgICAgICgoc3Ryc3RhcnQgLSBoYXNoX2hlYWQpICYgMHhmZmZmKSA8PSB3X3NpemUgLSBNSU5fTE9PS0FIRUFEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3Npb25TdHJhdGVneSAhPSBDb21wcmVzc2lvblN0cmF0ZWd5Lkh1ZmZtYW5Pbmx5KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQKKworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hfbGVuZ3RoIDw9IDUgJiYgKGNvbXByZXNzaW9uU3RyYXRlZ3kgPT0gQ29tcHJlc3Npb25TdHJhdGVneS5GaWx0ZXJlZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9sZW5ndGggPT0gTUlOX01BVENIICYmIHN0cnN0YXJ0IC0gbWF0Y2hfc3RhcnQgPiA0MDk2KSkpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgaWdub3JlIHRoZSBjdXJyZW50IG1hdGNoIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAvLyBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorICAgICAgICAgICAgICAgIGlmIChwcmV2X2xlbmd0aCA+PSBNSU5fTUFUQ0ggJiYgbWF0Y2hfbGVuZ3RoIDw9IHByZXZfbGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heF9pbnNlcnQgPSBzdHJzdGFydCArIGxvb2thaGVhZCAtIE1JTl9NQVRDSDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgY2hlY2tfbWF0Y2goc3Ryc3RhcnQtMSwgcHJldl9tYXRjaCwgcHJldl9sZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGJmbHVzaCA9IF90cl90YWxseShzdHJzdGFydCAtIDEgLSBwcmV2X21hdGNoLCBwcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaGFzaCB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkIC09IChwcmV2X2xlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgICAgICBwcmV2X2xlbmd0aCAtPSAyOworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzdHJzdGFydCA8PSBtYXhfaW5zZXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc19oID0gKCgoaW5zX2gpIDw8IGhhc2hfc2hpZnQpIF4gKHdpbmRvd1soc3Ryc3RhcnQpICsgKE1JTl9NQVRDSCAtIDEpXSAmIDB4ZmYpKSAmIGhhc2hfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByZXZbc3Ryc3RhcnQmd19tYXNrXT1oYXNoX2hlYWQ9aGVhZFtpbnNfaF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9oZWFkID0gKGhlYWRbaW5zX2hdICYgMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2W3N0cnN0YXJ0ICYgd19tYXNrXSA9IGhlYWRbaW5zX2hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRbaW5zX2hdID0gdW5jaGVja2VkKChzaG9ydClzdHJzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tcHJldl9sZW5ndGggIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7CisgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJmbHVzaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfYmxvY2tfb25seShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzT3V0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb2NrU3RhdGUuTmVlZE1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hfYXZhaWxhYmxlICE9IDApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKworICAgICAgICAgICAgICAgICAgICBiZmx1c2ggPSBfdHJfdGFsbHkoMCwgd2luZG93W3N0cnN0YXJ0IC0gMV0gJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYmZsdXNoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF9ibG9ja19vbmx5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCsrOworICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc091dCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb2NrU3RhdGUuTmVlZE1vcmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hfYXZhaWxhYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWF0Y2hfYXZhaWxhYmxlICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KDAsIHdpbmRvd1tzdHJzdGFydCAtIDFdICYgMHhmZik7CisgICAgICAgICAgICAgICAgbWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsdXNoX2Jsb2NrX29ubHkoZmx1c2ggPT0gRmx1c2hUeXBlLkZpbmlzaCk7CisKKyAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNPdXQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT0gRmx1c2hUeXBlLkZpbmlzaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsb2NrU3RhdGUuRmluaXNoU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCbG9ja1N0YXRlLk5lZWRNb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmx1c2ggPT0gRmx1c2hUeXBlLkZpbmlzaCA/IEJsb2NrU3RhdGUuRmluaXNoRG9uZSA6IEJsb2NrU3RhdGUuQmxvY2tEb25lOworICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCBpbnQgbG9uZ2VzdF9tYXRjaChpbnQgY3VyX21hdGNoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hhaW5fbGVuZ3RoID0gY29uZmlnLk1heENoYWluTGVuZ3RoOyAvLyBtYXggaGFzaCBjaGFpbiBsZW5ndGgKKyAgICAgICAgICAgIGludCBzY2FuICAgICAgICAgPSBzdHJzdGFydDsgICAgICAgICAgICAgIC8vIGN1cnJlbnQgc3RyaW5nCisgICAgICAgICAgICBpbnQgbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGVkIHN0cmluZworICAgICAgICAgICAgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2gKKyAgICAgICAgICAgIGludCBiZXN0X2xlbiAgICAgPSBwcmV2X2xlbmd0aDsgICAgICAgICAgIC8vIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhcgorICAgICAgICAgICAgaW50IGxpbWl0ICAgICAgICA9IHN0cnN0YXJ0ID4gKHdfc2l6ZSAtIE1JTl9MT09LQUhFQUQpID8gc3Ryc3RhcnQgLSAod19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwOworCisgICAgICAgICAgICBpbnQgbmljZUxlbmd0aCA9IGNvbmZpZy5OaWNlTGVuZ3RoOworCisgICAgICAgICAgICAvLyBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAgICAgICAgLy8gd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC4KKworICAgICAgICAgICAgaW50IHdtYXNrID0gd19tYXNrOworCisgICAgICAgICAgICBpbnQgc3RyZW5kID0gc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisgICAgICAgICAgICBieXRlIHNjYW5fZW5kMSA9IHdpbmRvd1tzY2FuICsgYmVzdF9sZW4gLSAxXTsKKyAgICAgICAgICAgIGJ5dGUgc2Nhbl9lbmQgPSB3aW5kb3dbc2NhbiArIGJlc3RfbGVuXTsKKworICAgICAgICAgICAgLy8gVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCisgICAgICAgICAgICAvLyBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgorCisgICAgICAgICAgICAvLyBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOgorICAgICAgICAgICAgaWYgKHByZXZfbGVuZ3RoID49IGNvbmZpZy5Hb29kTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAgICAgICAgLy8gdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuCisgICAgICAgICAgICBpZiAobmljZUxlbmd0aCA+IGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICBuaWNlTGVuZ3RoID0gbG9va2FoZWFkOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hdGNoID0gY3VyX21hdGNoOworCisgICAgICAgICAgICAgICAgLy8gU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlCisgICAgICAgICAgICAgICAgLy8gb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMjoKKyAgICAgICAgICAgICAgICBpZiAod2luZG93W21hdGNoICsgYmVzdF9sZW5dICE9IHNjYW5fZW5kIHx8CisgICAgICAgICAgICAgICAgICAgIHdpbmRvd1ttYXRjaCArIGJlc3RfbGVuIC0gMV0gIT0gc2Nhbl9lbmQxIHx8CisgICAgICAgICAgICAgICAgICAgIHdpbmRvd1ttYXRjaF0gIT0gd2luZG93W3NjYW5dIHx8CisgICAgICAgICAgICAgICAgICAgIHdpbmRvd1srK21hdGNoXSAhPSB3aW5kb3dbc2NhbiArIDFdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICAgICAgICAgICAgLy8gYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKKyAgICAgICAgICAgICAgICAvLyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAgICAgICAgICAgIC8vIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KKyAgICAgICAgICAgICAgICBzY2FuICs9IDI7IG1hdGNoKys7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAgICAgICAgICAgIC8vIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAod2luZG93Wysrc2Nhbl0gPT0gd2luZG93WysrbWF0Y2hdICYmCisgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1srK3NjYW5dID09IHdpbmRvd1srK21hdGNoXSAmJgorICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbKytzY2FuXSA9PSB3aW5kb3dbKyttYXRjaF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Wysrc2Nhbl0gPT0gd2luZG93WysrbWF0Y2hdICYmCisgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1srK3NjYW5dID09IHdpbmRvd1srK21hdGNoXSAmJgorICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbKytzY2FuXSA9PSB3aW5kb3dbKyttYXRjaF0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Wysrc2Nhbl0gPT0gd2luZG93WysrbWF0Y2hdICYmCisgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1srK3NjYW5dID09IHdpbmRvd1srK21hdGNoXSAmJiBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICAgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICAgICAgICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gYmVzdF9sZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9sZW4gPSBsZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gbmljZUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBzY2FuX2VuZDEgPSB3aW5kb3dbc2NhbiArIGJlc3RfbGVuIC0gMV07CisgICAgICAgICAgICAgICAgICAgIHNjYW5fZW5kID0gd2luZG93W3NjYW4gKyBiZXN0X2xlbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKChjdXJfbWF0Y2ggPSAocHJldltjdXJfbWF0Y2ggJiB3bWFza10gJiAweGZmZmYpKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOworCisgICAgICAgICAgICBpZiAoYmVzdF9sZW4gPD0gbG9va2FoZWFkKQorICAgICAgICAgICAgICAgIHJldHVybiBiZXN0X2xlbjsKKyAgICAgICAgICAgIHJldHVybiBsb29rYWhlYWQ7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgYm9vbCBSZmMxOTUwQnl0ZXNFbWl0dGVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbCBfV2FudFJmYzE5NTBIZWFkZXJCeXRlcyA9IHRydWU7CisgICAgICAgIGludGVybmFsIGJvb2wgV2FudFJmYzE5NTBIZWFkZXJCeXRlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX1dhbnRSZmMxOTUwSGVhZGVyQnl0ZXM7IH0KKyAgICAgICAgICAgIHNldCB7IF9XYW50UmZjMTk1MEhlYWRlckJ5dGVzID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgaW50IEluaXRpYWxpemUoWmxpYkNvZGVjIGNvZGVjLCBDb21wcmVzc2lvbkxldmVsIGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5pdGlhbGl6ZShjb2RlYywgbGV2ZWwsIFpsaWJDb25zdGFudHMuV2luZG93Qml0c01heCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBpbnQgSW5pdGlhbGl6ZShabGliQ29kZWMgY29kZWMsIENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwsIGludCBiaXRzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5pdGlhbGl6ZShjb2RlYywgbGV2ZWwsIGJpdHMsIE1FTV9MRVZFTF9ERUZBVUxULCBDb21wcmVzc2lvblN0cmF0ZWd5LkRlZmF1bHQpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgaW50IEluaXRpYWxpemUoWmxpYkNvZGVjIGNvZGVjLCBDb21wcmVzc2lvbkxldmVsIGxldmVsLCBpbnQgYml0cywgQ29tcHJlc3Npb25TdHJhdGVneSBjb21wcmVzc2lvblN0cmF0ZWd5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5pdGlhbGl6ZShjb2RlYywgbGV2ZWwsIGJpdHMsIE1FTV9MRVZFTF9ERUZBVUxULCBjb21wcmVzc2lvblN0cmF0ZWd5KTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGludCBJbml0aWFsaXplKFpsaWJDb2RlYyBjb2RlYywgQ29tcHJlc3Npb25MZXZlbCBsZXZlbCwgaW50IHdpbmRvd0JpdHMsIGludCBtZW1MZXZlbCwgQ29tcHJlc3Npb25TdHJhdGVneSBzdHJhdGVneSkKKyAgICAgICAgeworICAgICAgICAgICAgX2NvZGVjID0gY29kZWM7CisgICAgICAgICAgICBfY29kZWMuTWVzc2FnZSA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIHZhbGlkYXRpb24KKyAgICAgICAgICAgIGlmICh3aW5kb3dCaXRzIDwgOSB8fCB3aW5kb3dCaXRzID4gMTUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIndpbmRvd0JpdHMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgOS4uMTUuIik7CisKKyAgICAgICAgICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNRU1fTEVWRUxfTUFYKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIm1lbUxldmVsIG11c3QgYmUgaW4gdGhlIHJhbmdlIDEuLiB7MH0iLCBNRU1fTEVWRUxfTUFYKSk7CisKKyAgICAgICAgICAgIF9jb2RlYy5kc3RhdGUgPSB0aGlzOworCisgICAgICAgICAgICB3X2JpdHMgPSB3aW5kb3dCaXRzOworICAgICAgICAgICAgd19zaXplID0gMSA8PCB3X2JpdHM7CisgICAgICAgICAgICB3X21hc2sgPSB3X3NpemUgLSAxOworCisgICAgICAgICAgICBoYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7CisgICAgICAgICAgICBoYXNoX3NpemUgPSAxIDw8IGhhc2hfYml0czsKKyAgICAgICAgICAgIGhhc2hfbWFzayA9IGhhc2hfc2l6ZSAtIDE7CisgICAgICAgICAgICBoYXNoX3NoaWZ0ID0gKChoYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7CisKKyAgICAgICAgICAgIHdpbmRvdyA9IG5ldyBieXRlW3dfc2l6ZSAqIDJdOworICAgICAgICAgICAgcHJldiA9IG5ldyBzaG9ydFt3X3NpemVdOworICAgICAgICAgICAgaGVhZCA9IG5ldyBzaG9ydFtoYXNoX3NpemVdOworCisgICAgICAgICAgICAvLyBmb3IgbWVtTGV2ZWw9PTgsIHRoaXMgd2lsbCBiZSAxNjM4NCwgMTZrCisgICAgICAgICAgICBsaXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7CisKKyAgICAgICAgICAgIC8vIFVzZSBhIHNpbmdsZSBhcnJheSBhcyB0aGUgYnVmZmVyIGZvciBkYXRhIHBlbmRpbmcgY29tcHJlc3Npb24sCisgICAgICAgICAgICAvLyB0aGUgb3V0cHV0IGRpc3RhbmNlIGNvZGVzLCBhbmQgdGhlIG91dHB1dCBsZW5ndGggY29kZXMgKGFrYSB0cmVlKS4KKyAgICAgICAgICAgIC8vIG9yaWcgY29tbWVudDogVGhpcyB3b3JrcyBqdXN0IGZpbmUgc2luY2UgdGhlIGF2ZXJhZ2UKKyAgICAgICAgICAgIC8vIG91dHB1dCBzaXplIGZvciAobGVuZ3RoLGRpc3RhbmNlKSBjb2RlcyBpcyA8PSAyNCBiaXRzLgorICAgICAgICAgICAgcGVuZGluZyA9IG5ldyBieXRlW2xpdF9idWZzaXplICogNF07CisgICAgICAgICAgICBfZGlzdGFuY2VPZmZzZXQgPSBsaXRfYnVmc2l6ZTsKKyAgICAgICAgICAgIF9sZW5ndGhPZmZzZXQgPSAoMSArIDIpICogbGl0X2J1ZnNpemU7CisKKyAgICAgICAgICAgIC8vIFNvLCBmb3IgbWVtTGV2ZWwgOCwgdGhlIGxlbmd0aCBvZiB0aGUgcGVuZGluZyBidWZmZXIgaXMgNjU1MzYuIDY0ay4KKyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCAxNmsgYXJlIHBlbmRpbmcgYnl0ZXMuCisgICAgICAgICAgICAvLyBUaGUgbWlkZGxlIHNsaWNlLCBvZiAzMmssIGlzIHVzZWQgZm9yIGRpc3RhbmNlIGNvZGVzLgorICAgICAgICAgICAgLy8gVGhlIGZpbmFsIDE2ayBhcmUgbGVuZ3RoIGNvZGVzLgorCisgICAgICAgICAgICB0aGlzLmNvbXByZXNzaW9uTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIHRoaXMuY29tcHJlc3Npb25TdHJhdGVneSA9IHN0cmF0ZWd5OworCisgICAgICAgICAgICBSZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9PSzsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gPSBfY29kZWMuVG90YWxCeXRlc091dCA9IDA7CisgICAgICAgICAgICBfY29kZWMuTWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICAvL3N0cm0uZGF0YV90eXBlID0gWl9VTktOT1dOOworCisgICAgICAgICAgICBwZW5kaW5nQ291bnQgPSAwOworICAgICAgICAgICAgbmV4dFBlbmRpbmcgPSAwOworCisgICAgICAgICAgICBSZmMxOTUwQnl0ZXNFbWl0dGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IChXYW50UmZjMTk1MEhlYWRlckJ5dGVzKSA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFOworICAgICAgICAgICAgX2NvZGVjLl9BZGxlcjMyID0gQWRsZXIuQWRsZXIzMigwLCBudWxsLCAwLCAwKTsKKworICAgICAgICAgICAgbGFzdF9mbHVzaCA9IChpbnQpRmx1c2hUeXBlLk5vbmU7CisKKyAgICAgICAgICAgIF9Jbml0aWFsaXplVHJlZURhdGEoKTsKKyAgICAgICAgICAgIF9Jbml0aWFsaXplTGF6eU1hdGNoKCk7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIGludCBFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IElOSVRfU1RBVEUgJiYgc3RhdHVzICE9IEJVU1lfU1RBVEUgJiYgc3RhdHVzICE9IEZJTklTSF9TVEFURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERlYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uczoKKyAgICAgICAgICAgIHBlbmRpbmcgPSBudWxsOworICAgICAgICAgICAgaGVhZCA9IG51bGw7CisgICAgICAgICAgICBwcmV2ID0gbnVsbDsKKyAgICAgICAgICAgIHdpbmRvdyA9IG51bGw7CisgICAgICAgICAgICAvLyBmcmVlCisgICAgICAgICAgICAvLyBkc3RhdGU9bnVsbDsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXMgPT0gQlVTWV9TVEFURSA/IFpsaWJDb25zdGFudHMuWl9EQVRBX0VSUk9SIDogWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgU2V0RGVmbGF0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbmZpZy5GbGF2b3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBEZWZsYXRlRmxhdm9yLlN0b3JlOgorICAgICAgICAgICAgICAgICAgICBEZWZsYXRlRnVuY3Rpb24gPSBEZWZsYXRlTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEZWZsYXRlRmxhdm9yLkZhc3Q6CisgICAgICAgICAgICAgICAgICAgIERlZmxhdGVGdW5jdGlvbiA9IERlZmxhdGVGYXN0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERlZmxhdGVGbGF2b3IuU2xvdzoKKyAgICAgICAgICAgICAgICAgICAgRGVmbGF0ZUZ1bmN0aW9uID0gRGVmbGF0ZVNsb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCBpbnQgU2V0UGFyYW1zKENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwsIENvbXByZXNzaW9uU3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBabGliQ29uc3RhbnRzLlpfT0s7CisKKyAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbkxldmVsICE9IGxldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbmZpZyBuZXdDb25maWcgPSBDb25maWcuTG9va3VwKGxldmVsKTsKKworICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBpbiB0aGUgZGVmbGF0ZSBmbGF2b3IgKEZhc3QgdnMgc2xvdyB2cyBub25lKT8KKyAgICAgICAgICAgICAgICBpZiAobmV3Q29uZmlnLkZsYXZvciAhPSBjb25maWcuRmxhdm9yICYmIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvZGVjLkRlZmxhdGUoRmx1c2hUeXBlLlBhcnRpYWwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBuZXdDb25maWc7CisgICAgICAgICAgICAgICAgU2V0RGVmbGF0ZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBmbHVzaCB3aXRoIGNoYW5nZSBpbiBzdHJhdGVneT8gIFJlYWxseT8KKyAgICAgICAgICAgIGNvbXByZXNzaW9uU3RyYXRlZ3kgPSBzdHJhdGVneTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgaW50IFNldERpY3Rpb25hcnkoYnl0ZVtdIGRpY3Rpb25hcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBkaWN0aW9uYXJ5Lkxlbmd0aDsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgICAgIGlmIChkaWN0aW9uYXJ5ID09IG51bGwgfHwgc3RhdHVzICE9IElOSVRfU1RBVEUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIlN0cmVhbSBlcnJvci4iKTsKKworICAgICAgICAgICAgX2NvZGVjLl9BZGxlcjMyID0gQWRsZXIuQWRsZXIzMihfY29kZWMuX0FkbGVyMzIsIGRpY3Rpb25hcnksIDAsIGRpY3Rpb25hcnkuTGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IE1JTl9NQVRDSCkKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHdfc2l6ZSAtIE1JTl9MT09LQUhFQUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gd19zaXplIC0gTUlOX0xPT0tBSEVBRDsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGRpY3Rpb25hcnkuTGVuZ3RoIC0gbGVuZ3RoOyAvLyB1c2UgdGhlIHRhaWwgb2YgdGhlIGRpY3Rpb25hcnkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFycmF5LkNvcHkoZGljdGlvbmFyeSwgaW5kZXgsIHdpbmRvdywgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHN0cnN0YXJ0ID0gbGVuZ3RoOworICAgICAgICAgICAgYmxvY2tfc3RhcnQgPSBsZW5ndGg7CisKKyAgICAgICAgICAgIC8vIEluc2VydCBhbGwgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSAoZXhjZXB0IGZvciB0aGUgbGFzdCB0d28gYnl0ZXMpLgorICAgICAgICAgICAgLy8gcy0+bG9va2FoZWFkIHN0YXlzIG51bGwsIHNvIHMtPmluc19oIHdpbGwgYmUgcmVjb21wdXRlZCBhdCB0aGUgbmV4dAorICAgICAgICAgICAgLy8gY2FsbCBvZiBmaWxsX3dpbmRvdy4KKworICAgICAgICAgICAgaW5zX2ggPSB3aW5kb3dbMF0gJiAweGZmOworICAgICAgICAgICAgaW5zX2ggPSAoKChpbnNfaCkgPDwgaGFzaF9zaGlmdCkgXiAod2luZG93WzFdICYgMHhmZikpICYgaGFzaF9tYXNrOworCisgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8PSBsZW5ndGggLSBNSU5fTUFUQ0g7IG4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnNfaCA9ICgoKGluc19oKSA8PCBoYXNoX3NoaWZ0KSBeICh3aW5kb3dbKG4pICsgKE1JTl9NQVRDSCAtIDEpXSAmIDB4ZmYpKSAmIGhhc2hfbWFzazsKKyAgICAgICAgICAgICAgICBwcmV2W24gJiB3X21hc2tdID0gaGVhZFtpbnNfaF07CisgICAgICAgICAgICAgICAgaGVhZFtpbnNfaF0gPSAoc2hvcnQpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgaW50IERlZmxhdGUoRmx1c2hUeXBlIGZsdXNoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb2xkX2ZsdXNoOworCisgICAgICAgICAgICBpZiAoX2NvZGVjLk91dHB1dEJ1ZmZlciA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgKF9jb2RlYy5JbnB1dEJ1ZmZlciA9PSBudWxsICYmIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luICE9IDApIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT0gRmx1c2hUeXBlLkZpbmlzaCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvZGVjLk1lc3NhZ2UgPSBfRXJyb3JNZXNzYWdlW1psaWJDb25zdGFudHMuWl9ORUVEX0RJQ1QgLSAoWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FUlJPUildOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIlNvbWV0aGluZyBpcyBmaXNoeS4gW3swfV0iLCBfY29kZWMuTWVzc2FnZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc091dCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb2RlYy5NZXNzYWdlID0gX0Vycm9yTWVzc2FnZVtabGliQ29uc3RhbnRzLlpfTkVFRF9ESUNUIC0gKFpsaWJDb25zdGFudHMuWl9CVUZfRVJST1IpXTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiT3V0cHV0QnVmZmVyIGlzIGZ1bGwgKEF2YWlsYWJsZUJ5dGVzT3V0ID09IDApIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9sZF9mbHVzaCA9IGxhc3RfZmx1c2g7CisgICAgICAgICAgICBsYXN0X2ZsdXNoID0gKGludClmbHVzaDsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHpsaWIgKHJmYzE5NTApIGhlYWRlciBieXRlcworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBJTklUX1NUQVRFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgod19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7CisgICAgICAgICAgICAgICAgaW50IGxldmVsX2ZsYWdzID0gKCgoaW50KWNvbXByZXNzaW9uTGV2ZWwgLSAxKSAmIDB4ZmYpID4+IDE7CisKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxfZmxhZ3MgPiAzKQorICAgICAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDM7CisgICAgICAgICAgICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTsKKyAgICAgICAgICAgICAgICBpZiAoc3Ryc3RhcnQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOworICAgICAgICAgICAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgICAgIC8vcHV0U2hvcnRNU0IoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0NvdW50KytdID0gKGJ5dGUpKGhlYWRlciA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSloZWFkZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OgorICAgICAgICAgICAgICAgIGlmIChzdHJzdGFydCAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoKF9jb2RlYy5fQWRsZXIzMiAmIDB4RkYwMDAwMDApID4+IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoKF9jb2RlYy5fQWRsZXIzMiAmIDB4MDBGRjAwMDApID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoKF9jb2RlYy5fQWRsZXIzMiAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKShfY29kZWMuX0FkbGVyMzIgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2NvZGVjLl9BZGxlcjMyID0gQWRsZXIuQWRsZXIzMigwLCBudWxsLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZQorICAgICAgICAgICAgaWYgKHBlbmRpbmdDb3VudCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb2RlYy5mbHVzaF9wZW5kaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc091dCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAgYXZhaWxfb3V0PT0wIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlCisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9mbHVzaCA9IC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQorICAgICAgICAgICAgICAgIC8vIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGRl9FUlJPUi4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpZmx1c2ggPD0gb2xkX2ZsdXNoICYmCisgICAgICAgICAgICAgICAgICAgICBmbHVzaCAhPSBGbHVzaFR5cGUuRmluaXNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDg1NTcKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIHdoeSB0aGlzIG5lZWRzIHRvIGJlIGFuIGVycm9yLiAgcGVuZGluZ0NvdW50ID09IDAsIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gbWVhbnMgdGhlcmUncyBub3RoaW5nIHRvIGRlZmxhdGUuICBBbmQgdGhlIGNhbGxlciBoYXMgbm90IGFza2VkCisgICAgICAgICAgICAgICAgLy8gZm9yIGEgRmx1c2hUeXBlLkZpbmlzaCwgYnV0Li4uICB0aGF0IHNlZW1zIHZlcnkgbm9uLWZhdGFsLiAgV2UKKyAgICAgICAgICAgICAgICAvLyBjYW4ganVzdCBzYXkgIk9LIiBhbmQgZG8gbm90aGluZy4KKworICAgICAgICAgICAgICAgIC8vIF9jb2RlYy5NZXNzYWdlID0gel9lcnJtc2dbWmxpYkNvbnN0YW50cy5aX05FRURfRElDVCAtIChabGliQ29uc3RhbnRzLlpfQlVGX0VSUk9SKV07CisgICAgICAgICAgICAgICAgLy8gdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCAmJiBmbHVzaDw9b2xkX2ZsdXNoICYmIGZsdXNoICE9IEZsdXNoVHlwZS5GaW5pc2giKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb2RlYy5NZXNzYWdlID0gX0Vycm9yTWVzc2FnZVtabGliQ29uc3RhbnRzLlpfTkVFRF9ESUNUIC0gKFpsaWJDb25zdGFudHMuWl9CVUZfRVJST1IpXTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigic3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiAhPSAwIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS4KKyAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiAhPSAwIHx8IGxvb2thaGVhZCAhPSAwIHx8IChmbHVzaCAhPSBGbHVzaFR5cGUuTm9uZSAmJiBzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCbG9ja1N0YXRlIGJzdGF0ZSA9IERlZmxhdGVGdW5jdGlvbihmbHVzaCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYnN0YXRlID09IEJsb2NrU3RhdGUuRmluaXNoU3RhcnRlZCB8fCBic3RhdGUgPT0gQmxvY2tTdGF0ZS5GaW5pc2hEb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnN0YXRlID09IEJsb2NrU3RhdGUuTmVlZE1vcmUgfHwgYnN0YXRlID09IEJsb2NrU3RhdGUuRmluaXNoU3RhcnRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNPdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9mbHVzaCA9IC0xOyAvLyBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhbgorICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzbworICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3QKKyAgICAgICAgICAgICAgICAgICAgLy8gb25lIGVtcHR5IGJsb2NrLgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChic3RhdGUgPT0gQmxvY2tTdGF0ZS5CbG9ja0RvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT0gRmx1c2hUeXBlLlBhcnRpYWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90cl9hbGlnbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2hUeXBlLkZ1bGwgb3IgRmx1c2hUeXBlLlN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2soMCwgMCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT0gRmx1c2hUeXBlLkZ1bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgaGFzaCAoZm9yZ2V0IHRoZSBoaXN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzaF9zaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5mbHVzaF9wZW5kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNPdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9mbHVzaCA9IC0xOyAvLyBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmbHVzaCAhPSBGbHVzaFR5cGUuRmluaXNoKQorICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfT0s7CisKKyAgICAgICAgICAgIGlmICghV2FudFJmYzE5NTBIZWFkZXJCeXRlcyB8fCBSZmMxOTUwQnl0ZXNFbWl0dGVkKQorICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORDsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHpsaWIgdHJhaWxlciAoYWRsZXIzMikKKyAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0NvdW50KytdID0gKGJ5dGUpKChfY29kZWMuX0FkbGVyMzIgJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdDb3VudCsrXSA9IChieXRlKSgoX2NvZGVjLl9BZGxlcjMyICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoKF9jb2RlYy5fQWRsZXIzMiAmIDB4MDAwMEZGMDApID4+IDgpOworICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nQ291bnQrK10gPSAoYnl0ZSkoX2NvZGVjLl9BZGxlcjMyICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAvL3B1dFNob3J0TVNCKChpbnQpKFNoYXJlZFV0aWxzLlVSU2hpZnQoX2NvZGVjLl9BZGxlcjMyLCAxNikpKTsKKyAgICAgICAgICAgIC8vcHV0U2hvcnRNU0IoKGludCkoX2NvZGVjLl9BZGxlcjMyICYgMHhmZmZmKSk7CisKKyAgICAgICAgICAgIF9jb2RlYy5mbHVzaF9wZW5kaW5nKCk7CisKKyAgICAgICAgICAgIC8vIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW4KKyAgICAgICAgICAgIC8vIHRvIGZsdXNoIHRoZSByZXN0LgorCisgICAgICAgICAgICBSZmMxOTUwQnl0ZXNFbWl0dGVkID0gdHJ1ZTsgLy8gd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlIQorCisgICAgICAgICAgICByZXR1cm4gcGVuZGluZ0NvdW50ICE9IDAgPyBabGliQ29uc3RhbnRzLlpfT0sgOiBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORDsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvRGVmbGF0ZVN0cmVhbS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvRGVmbGF0ZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ2NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9EZWZsYXRlU3RyZWFtLmNzCkBAIC0wLDAgKzEsNzQwIEBACisvLyBEZWZsYXRlU3RyZWFtLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBEaW5vIENoaWVzYS4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtSnVseS0zMSAxNDo0ODoxMT4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBEZWZsYXRlU3RyZWFtIGNsYXNzLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50IGZvcgorLy8gdGhlIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5EZWZsYXRlU3RyZWFtIGNsYXNzIGluIHRoZSAuTkVUIEJDTC4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGNsYXNzIGZvciBjb21wcmVzc2luZyBhbmQgZGVjb21wcmVzc2luZyBzdHJlYW1zIHVzaW5nIHRoZSBEZWZsYXRlIGFsZ29yaXRobS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLworICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhlIERlZmxhdGVTdHJlYW0gaXMgYSA8c2VlCisgICAgLy8vICAgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWNvcmF0b3JfcGF0dGVybiI+RGVjb3JhdG9yPC9zZWU+IG9uIGEgPHNlZQorICAgIC8vLyAgIGNyZWY9IlN5c3RlbS5JTy5TdHJlYW0iLz4uICBJdCBhZGRzIERFRkxBVEUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiB0byBhbnkKKyAgICAvLy8gICBzdHJlYW0uCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVXNpbmcgdGhpcyBzdHJlYW0sIGFwcGxpY2F0aW9ucyBjYW4gY29tcHJlc3Mgb3IgZGVjb21wcmVzcyBkYXRhIHZpYSBzdHJlYW0KKyAgICAvLy8gICA8Yz5SZWFkPC9jPiBhbmQgPGM+V3JpdGU8L2M+IG9wZXJhdGlvbnMuICBFaXRoZXIgY29tcHJlc3NzaW9uIG9yIGRlY29tcHJlc3Npb24KKyAgICAvLy8gICBjYW4gb2NjdXIgdGhyb3VnaCBlaXRoZXIgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgY29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaXMKKyAgICAvLy8gICBERUZMQVRFLCB3aGljaCBpcyBkb2N1bWVudGVkIGluIDxzZWUKKyAgICAvLy8gICBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dCI+SUVURiBSRkMgMTk1MTwvc2VlPiwgIkRFRkxBVEUKKyAgICAvLy8gICBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjMuIi4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBUaGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8gPHNlZSBjcmVmPSJabGliU3RyZWFtIi8+LCBleGNlcHQgdGhhdAorICAgIC8vLyAgIDxjPlpsaWJTdHJlYW08L2M+IGFkZHMgdGhlIDxzZWUgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQiPlJGQworICAgIC8vLyAgIDE5NTAgLSBaTElCPC9zZWU+IGZyYW1pbmcgYnl0ZXMgdG8gYSBjb21wcmVzc2VkIHN0cmVhbSB3aGVuIGNvbXByZXNzaW5nLCBvcgorICAgIC8vLyAgIGV4cGVjdHMgdGhlIFJGQzE5NTAgZnJhbWluZyBieXRlcyB3aGVuIGRlY29tcHJlc3NpbmcuIFRoZSA8Yz5EZWZsYXRlU3RyZWFtPC9jPgorICAgIC8vLyAgIGRvZXMgbm90LgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmxpYlN0cmVhbSIgLz4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iR1ppcFN0cmVhbSIgLz4KKyAgICBwdWJsaWMgY2xhc3MgRGVmbGF0ZVN0cmVhbSA6IFN5c3RlbS5JTy5TdHJlYW0KKyAgICB7CisgICAgICAgIGludGVybmFsIFpsaWJCYXNlU3RyZWFtIF9iYXNlU3RyZWFtOworICAgICAgICBpbnRlcm5hbCBTeXN0ZW0uSU8uU3RyZWFtIF9pbm5lclN0cmVhbTsKKyAgICAgICAgYm9vbCBfZGlzcG9zZWQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDcmVhdGUgYSBEZWZsYXRlU3RyZWFtIHVzaW5nIHRoZSBzcGVjaWZpZWQgQ29tcHJlc3Npb25Nb2RlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBXaGVuIG1vZGUgaXMgPGM+Q29tcHJlc3Npb25Nb2RlLkNvbXByZXNzPC9jPiwgdGhlIERlZmxhdGVTdHJlYW0gd2lsbCB1c2UKKyAgICAgICAgLy8vICAgdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuIFRoZSAiY2FwdGl2ZSIgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIHdoZW4KKyAgICAgICAgLy8vICAgdGhlIERlZmxhdGVTdHJlYW0gaXMgY2xvc2VkLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gVGhpcyBleGFtcGxlIHVzZXMgYSBEZWZsYXRlU3RyZWFtIHRvIGNvbXByZXNzIGRhdGEgZnJvbSBhIGZpbGUsIGFuZCB3cml0ZXMKKyAgICAgICAgLy8vIHRoZSBjb21wcmVzc2VkIGRhdGEgdG8gYW5vdGhlciBmaWxlLgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAodmFyIHJhdyA9IFN5c3RlbS5JTy5GaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyArICIuZGVmbGF0ZWQiKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nIChTdHJlYW0gY29tcHJlc3NvciA9IG5ldyBEZWZsYXRlU3RyZWFtKHJhdywgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzKSkKKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW1dPUktJTkdfQlVGRkVSX1NJWkVdOworICAgICAgICAvLy8gICAgICAgICAgICAgaW50IG47CisgICAgICAgIC8vLyAgICAgICAgICAgICB3aGlsZSAoKG49IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgIT0gMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBjb21wcmVzc29yLldyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICB9CisgICAgICAgIC8vLyAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gVXNpbmcgaW5wdXQgQXMgU3RyZWFtID0gRmlsZS5PcGVuUmVhZChmaWxlVG9Db21wcmVzcykKKyAgICAgICAgLy8vICAgICBVc2luZyByYXcgQXMgRmlsZVN0cmVhbSA9IEZpbGUuQ3JlYXRlKGZpbGVUb0NvbXByZXNzICZhbXA7ICIuZGVmbGF0ZWQiKQorICAgICAgICAvLy8gICAgICAgICBVc2luZyBjb21wcmVzc29yIEFzIFN0cmVhbSA9IE5ldyBEZWZsYXRlU3RyZWFtKHJhdywgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzKQorICAgICAgICAvLy8gICAgICAgICAgICAgRGltIGJ1ZmZlciBBcyBCeXRlKCkgPSBOZXcgQnl0ZSg0MDk2KSB7fQorICAgICAgICAvLy8gICAgICAgICAgICAgRGltIG4gQXMgSW50ZWdlciA9IC0xCisgICAgICAgIC8vLyAgICAgICAgICAgICBEbyBXaGlsZSAobiAmbHQ7Jmd0OyAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIElmIChuICZndDsgMCkgVGhlbgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLldyaXRlKGJ1ZmZlciwgMCwgbikKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBuID0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpCisgICAgICAgIC8vLyAgICAgICAgICAgICBMb29wCisgICAgICAgIC8vLyAgICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIERlZmxhdGVTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBEZWZsYXRlU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBDb21wcmVzc2lvbk1vZGUgbW9kZSkKKyAgICAgICAgICAgIDogdGhpcyhzdHJlYW0sIG1vZGUsIENvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIERlZmxhdGVTdHJlYW0gdXNpbmcgdGhlIHNwZWNpZmllZCBDb21wcmVzc2lvbk1vZGUgYW5kIHRoZSBzcGVjaWZpZWQgQ29tcHJlc3Npb25MZXZlbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBtb2RlIGlzIDxjPkNvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzPC9jPiwgdGhlIGxldmVsIHBhcmFtZXRlciBpcworICAgICAgICAvLy8gICBpZ25vcmVkLiAgVGhlICJjYXB0aXZlIiBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgd2hlbiB0aGUgRGVmbGF0ZVN0cmVhbSBpcworICAgICAgICAvLy8gICBjbG9zZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vICAgVGhpcyBleGFtcGxlIHVzZXMgYSBEZWZsYXRlU3RyZWFtIHRvIGNvbXByZXNzIGRhdGEgZnJvbSBhIGZpbGUsIGFuZCB3cml0ZXMKKyAgICAgICAgLy8vICAgdGhlIGNvbXByZXNzZWQgZGF0YSB0byBhbm90aGVyIGZpbGUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAodmFyIHJhdyA9IFN5c3RlbS5JTy5GaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyArICIuZGVmbGF0ZWQiKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nIChTdHJlYW0gY29tcHJlc3NvciA9IG5ldyBEZWZsYXRlU3RyZWFtKHJhdywKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsLkJlc3RDb21wcmVzc2lvbikpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtXT1JLSU5HX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGludCBuPSAtMTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHdoaWxlIChuICE9IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgaWYgKG4gJmd0OyAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLldyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgbj0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpOworICAgICAgICAvLy8gICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICB9CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIGlucHV0IEFzIFN0cmVhbSA9IEZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgVXNpbmcgcmF3IEFzIEZpbGVTdHJlYW0gPSBGaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyAmYW1wOyAiLmRlZmxhdGVkIikKKyAgICAgICAgLy8vICAgICAgICAgVXNpbmcgY29tcHJlc3NvciBBcyBTdHJlYW0gPSBOZXcgRGVmbGF0ZVN0cmVhbShyYXcsIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywgQ29tcHJlc3Npb25MZXZlbC5CZXN0Q29tcHJlc3Npb24pCisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDQwOTYpIHt9CisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gbiBBcyBJbnRlZ2VyID0gLTEKKyAgICAgICAgLy8vICAgICAgICAgICAgIERvIFdoaWxlIChuICZsdDsmZ3Q7IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgSWYgKG4gJmd0OyAwKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuV3JpdGUoYnVmZmVyLCAwLCBuKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIExvb3AKKyAgICAgICAgLy8vICAgICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gdG8gYmUgcmVhZCBvciB3cml0dGVuIHdoaWxlIGRlZmxhdGluZyBvciBpbmZsYXRpbmcuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2RlIj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgPGM+RGVmbGF0ZVN0cmVhbTwvYz4gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPkEgdHVuaW5nIGtub2IgdG8gdHJhZGUgc3BlZWQgZm9yIGVmZmVjdGl2ZW5lc3MuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIERlZmxhdGVTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTW9kZSBtb2RlLCBDb21wcmVzc2lvbkxldmVsIGxldmVsKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgbW9kZSwgbGV2ZWwsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZSBhIDxjPkRlZmxhdGVTdHJlYW08L2M+IHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vICAgPGM+Q29tcHJlc3Npb25Nb2RlPC9jPiwgYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyIHRoZQorICAgICAgICAvLy8gICBzdHJlYW0gc2hvdWxkIGJlIGxlZnQgb3BlbiBhZnRlciBEZWZsYXRpb24gb3IgSW5mbGF0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGNvbnN0cnVjdG9yIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gcmVxdWVzdCB0aGF0IHRoZSBjYXB0aXZlIHN0cmVhbQorICAgICAgICAvLy8gICByZW1haW4gb3BlbiBhZnRlciB0aGUgZGVmbGF0aW9uIG9yIGluZmxhdGlvbiBvY2N1cnMuICBCeSBkZWZhdWx0LCBhZnRlcgorICAgICAgICAvLy8gICA8Yz5DbG9zZSgpPC9jPiBpcyBjYWxsZWQgb24gdGhlIHN0cmVhbSwgdGhlIGNhcHRpdmUgc3RyZWFtIGlzIGFsc28KKyAgICAgICAgLy8vICAgY2xvc2VkLiBJbiBzb21lIGNhc2VzIHRoaXMgaXMgbm90IGRlc2lyZWQsIGZvciBleGFtcGxlIGlmIHRoZSBzdHJlYW0gaXMgYQorICAgICAgICAvLy8gICBtZW1vcnkgc3RyZWFtIHRoYXQgd2lsbCBiZSByZS1yZWFkIGFmdGVyIGNvbXByZXNzaW9uLiAgU3BlY2lmeSB0cnVlIGZvcgorICAgICAgICAvLy8gICB0aGUgPHBhcmFtcmVmIG5hbWU9ImxlYXZlT3BlbiIvPiBwYXJhbWV0ZXIgdG8gbGVhdmUgdGhlIHN0cmVhbSBvcGVuLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgPGM+RGVmbGF0ZVN0cmVhbTwvYz4gd2lsbCB1c2UgdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgb3RoZXIgb3ZlcmxvYWRzIG9mIHRoaXMgY29uc3RydWN0b3IgZm9yIGV4YW1wbGUgY29kZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj4KKyAgICAgICAgLy8vICAgVGhlIHN0cmVhbSB3aGljaCB3aWxsIGJlIHJlYWQgb3Igd3JpdHRlbi4gVGhpcyBpcyBjYWxsZWQgdGhlCisgICAgICAgIC8vLyAgICJjYXB0aXZlIiBzdHJlYW0gaW4gb3RoZXIgcGxhY2VzIGluIHRoaXMgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1vZGUiPgorICAgICAgICAvLy8gICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgPGM+RGVmbGF0ZVN0cmVhbTwvYz4gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj50cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRoZSBzdHJlYW0gdG8KKyAgICAgICAgLy8vIHJlbWFpbiBvcGVuIGFmdGVyIGluZmxhdGlvbi9kZWZsYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIERlZmxhdGVTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTW9kZSBtb2RlLCBib29sIGxlYXZlT3BlbikKKyAgICAgICAgICAgIDogdGhpcyhzdHJlYW0sIG1vZGUsIENvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdCwgbGVhdmVPcGVuKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZSBhIDxjPkRlZmxhdGVTdHJlYW08L2M+IHVzaW5nIHRoZSBzcGVjaWZpZWQgPGM+Q29tcHJlc3Npb25Nb2RlPC9jPgorICAgICAgICAvLy8gICBhbmQgdGhlIHNwZWNpZmllZCA8Yz5Db21wcmVzc2lvbkxldmVsPC9jPiwgYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyCisgICAgICAgIC8vLyAgIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGxlZnQgb3BlbiBhZnRlciBEZWZsYXRpb24gb3IgSW5mbGF0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIG1vZGUgaXMgPGM+Q29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3M8L2M+LCB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIGNhcHRpdmUgc3RyZWFtCisgICAgICAgIC8vLyAgIHJlbWFpbiBvcGVuIGFmdGVyIHRoZSBkZWZsYXRpb24gb3IgaW5mbGF0aW9uIG9jY3Vycy4gIEJ5IGRlZmF1bHQsIGFmdGVyCisgICAgICAgIC8vLyAgIDxjPkNsb3NlKCk8L2M+IGlzIGNhbGxlZCBvbiB0aGUgc3RyZWFtLCB0aGUgY2FwdGl2ZSBzdHJlYW0gaXMgYWxzbworICAgICAgICAvLy8gICBjbG9zZWQuIEluIHNvbWUgY2FzZXMgdGhpcyBpcyBub3QgZGVzaXJlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIHN0cmVhbSBpcyBhCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iU3lzdGVtLklPLk1lbW9yeVN0cmVhbSIvPiB0aGF0IHdpbGwgYmUgcmUtcmVhZCBhZnRlcgorICAgICAgICAvLy8gICBjb21wcmVzc2lvbi4gIFNwZWNpZnkgdHJ1ZSBmb3IgdGhlIDxwYXJhbXJlZiBuYW1lPSJsZWF2ZU9wZW4iLz4gcGFyYW1ldGVyCisgICAgICAgIC8vLyAgIHRvIGxlYXZlIHRoZSBzdHJlYW0gb3Blbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIDxjPkRlZmxhdGVTdHJlYW08L2M+IHRvIGNvbXByZXNzIGRhdGEgZnJvbQorICAgICAgICAvLy8gICBhIGZpbGUsIGFuZCBzdG9yZSB0aGUgY29tcHJlc3NlZCBkYXRhIGludG8gYW5vdGhlciBmaWxlLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKHZhciBvdXRwdXQgPSBTeXN0ZW0uSU8uRmlsZS5DcmVhdGUoZmlsZVRvQ29tcHJlc3MgKyAiLmRlZmxhdGVkIikpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgdXNpbmcgKFN5c3RlbS5JTy5TdHJlYW0gaW5wdXQgPSBTeXN0ZW0uSU8uRmlsZS5PcGVuUmVhZChmaWxlVG9Db21wcmVzcykpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAoU3RyZWFtIGNvbXByZXNzb3IgPSBuZXcgRGVmbGF0ZVN0cmVhbShvdXRwdXQsIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywgQ29tcHJlc3Npb25MZXZlbC5CZXN0Q29tcHJlc3Npb24sIHRydWUpKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbV09SS0lOR19CVUZGRVJfU0laRV07CisgICAgICAgIC8vLyAgICAgICAgICAgICBpbnQgbj0gLTE7CisgICAgICAgIC8vLyAgICAgICAgICAgICB3aGlsZSAobiAhPSAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGlmIChuICZndDsgMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG49IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgICAvLyBjYW4gd3JpdGUgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGhlcmUKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyBvdXRwdXQgQXMgRmlsZVN0cmVhbSA9IEZpbGUuQ3JlYXRlKGZpbGVUb0NvbXByZXNzICZhbXA7ICIuZGVmbGF0ZWQiKQorICAgICAgICAvLy8gICAgIFVzaW5nIGlucHV0IEFzIFN0cmVhbSA9IEZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgICAgIFVzaW5nIGNvbXByZXNzb3IgQXMgU3RyZWFtID0gTmV3IERlZmxhdGVTdHJlYW0ob3V0cHV0LCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uLCBUcnVlKQorICAgICAgICAvLy8gICAgICAgICAgICAgRGltIGJ1ZmZlciBBcyBCeXRlKCkgPSBOZXcgQnl0ZSg0MDk2KSB7fQorICAgICAgICAvLy8gICAgICAgICAgICAgRGltIG4gQXMgSW50ZWdlciA9IC0xCisgICAgICAgIC8vLyAgICAgICAgICAgICBEbyBXaGlsZSAobiAmbHQ7Jmd0OyAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIElmIChuICZndDsgMCkgVGhlbgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLldyaXRlKGJ1ZmZlciwgMCwgbikKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBuID0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpCisgICAgICAgIC8vLyAgICAgICAgICAgICBMb29wCisgICAgICAgIC8vLyAgICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgICcgY2FuIHdyaXRlIGFkZGl0aW9uYWwgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbSBoZXJlLgorICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIERlZmxhdGVTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj50cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRoZSBzdHJlYW0gdG8gcmVtYWluIG9wZW4gYWZ0ZXIgaW5mbGF0aW9uL2RlZmxhdGlvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj5BIHR1bmluZyBrbm9iIHRvIHRyYWRlIHNwZWVkIGZvciBlZmZlY3RpdmVuZXNzLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBEZWZsYXRlU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBDb21wcmVzc2lvbk1vZGUgbW9kZSwgQ29tcHJlc3Npb25MZXZlbCBsZXZlbCwgYm9vbCBsZWF2ZU9wZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9pbm5lclN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgIF9iYXNlU3RyZWFtID0gbmV3IFpsaWJCYXNlU3RyZWFtKHN0cmVhbSwgbW9kZSwgbGV2ZWwsIFpsaWJTdHJlYW1GbGF2b3IuREVGTEFURSwgbGVhdmVPcGVuKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gWmxpYiBwcm9wZXJ0aWVzCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBwcm9wZXJ0eSBzZXRzIHRoZSBmbHVzaCBiZWhhdmlvciBvbiB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+IFNlZSB0aGUgWkxJQiBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgZmx1c2ggYmVoYXZpb3IuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHZpcnR1YWwgcHVibGljIEZsdXNoVHlwZSBGbHVzaE1vZGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuICh0aGlzLl9iYXNlU3RyZWFtLl9mbHVzaE1vZGUpOyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkRlZmxhdGVTdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9iYXNlU3RyZWFtLl9mbHVzaE1vZGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIHNpemUgb2YgdGhlIHdvcmtpbmcgYnVmZmVyIGZvciB0aGUgY29tcHJlc3Npb24gY29kZWMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIHdvcmtpbmcgYnVmZmVyIGlzIHVzZWQgZm9yIGFsbCBzdHJlYW0gb3BlcmF0aW9ucy4gIFRoZSBkZWZhdWx0IHNpemUgaXMKKyAgICAgICAgLy8vICAgMTAyNCBieXRlcy4gIFRoZSBtaW5pbXVtIHNpemUgaXMgMTI4IGJ5dGVzLiBZb3UgbWF5IGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UKKyAgICAgICAgLy8vICAgd2l0aCBhIGxhcmdlciBidWZmZXIuICBUaGVuIGFnYWluLCB5b3UgbWlnaHQgbm90LiAgWW91IHdvdWxkIGhhdmUgdG8gdGVzdAorICAgICAgICAvLy8gICBpdC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgU2V0IHRoaXMgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIDxjPlJlYWQoKTwvYz4gb3IgPGM+V3JpdGUoKTwvYz4gb24gdGhlCisgICAgICAgIC8vLyAgIHN0cmVhbS4gSWYgeW91IHRyeSB0byBzZXQgaXQgYWZ0ZXJ3YXJkcywgaXQgd2lsbCB0aHJvdy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGludCBCdWZmZXJTaXplCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlU3RyZWFtLl9idWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJEZWZsYXRlU3RyZWFtIik7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2VTdHJlYW0uX3dvcmtpbmdCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIlRoZSB3b3JraW5nIGJ1ZmZlciBpcyBhbHJlYWR5IHNldC4iKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBabGliQ29uc3RhbnRzLldvcmtpbmdCdWZmZXJTaXplTWluKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJEb24ndCBiZSBzaWxseS4gezB9IGJ5dGVzPz8gVXNlIGEgYmlnZ2VyIGJ1ZmZlciwgYXQgbGVhc3QgezF9LiIsIHZhbHVlLCBabGliQ29uc3RhbnRzLldvcmtpbmdCdWZmZXJTaXplTWluKSk7CisgICAgICAgICAgICAgICAgdGhpcy5fYmFzZVN0cmVhbS5fYnVmZmVyU2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgWkxJQiBzdHJhdGVneSB0byBiZSB1c2VkIGR1cmluZyBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgQnkgdHdlYWtpbmcgdGhpcyBwYXJhbWV0ZXIsIHlvdSBtYXkgYmUgYWJsZSB0byBvcHRpbWl6ZSB0aGUgY29tcHJlc3Npb24gZm9yCisgICAgICAgIC8vLyAgIGRhdGEgd2l0aCBwYXJ0aWN1bGFyIGNoYXJhY3RlcmlzdGljcy4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIENvbXByZXNzaW9uU3RyYXRlZ3kgU3RyYXRlZ3kKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VTdHJlYW0uU3RyYXRlZ3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiRGVmbGF0ZVN0cmVhbSIpOworICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VTdHJlYW0uU3RyYXRlZ3kgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGlucHV0IHNvIGZhci48L3N1bW1hcnk+CisgICAgICAgIHZpcnR1YWwgcHVibGljIGxvbmcgVG90YWxJbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzSW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyLjwvc3VtbWFyeT4KKyAgICAgICAgdmlydHVhbCBwdWJsaWMgbG9uZyBUb3RhbE91dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzT3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gU3lzdGVtLklPLlN0cmVhbSBtZXRob2RzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRGlzcG9zZSB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoaXMgbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIGEgPGM+Q2xvc2UoKTwvYz4gY2FsbCBvbiB0aGUgY2FwdGl2ZQorICAgICAgICAvLy8gICAgIHN0cmVhbS4gIFNlZSB0aGUgY29uc3RydWN0b3JzIHRoYXQgaGF2ZSBhIDxjPmxlYXZlT3BlbjwvYz4gcGFyYW1ldGVyCisgICAgICAgIC8vLyAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgQXBwbGljYXRpb24gY29kZSB3b24ndCBjYWxsIHRoaXMgY29kZSBkaXJlY3RseS4gIFRoaXMgbWV0aG9kIG1heSBiZQorICAgICAgICAvLy8gICAgIGludm9rZWQgaW4gdHdvIGRpc3RpbmN0IHNjZW5hcmlvcy4gIElmIGRpc3Bvc2luZyA9PSB0cnVlLCB0aGUgbWV0aG9kCisgICAgICAgIC8vLyAgICAgaGFzIGJlZW4gY2FsbGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgYSB1c2VyJ3MgY29kZSwgZm9yIGV4YW1wbGUKKyAgICAgICAgLy8vICAgICB2aWEgdGhlIHB1YmxpYyBEaXNwb3NlKCkgbWV0aG9kLiBJbiB0aGlzIGNhc2UsIGJvdGggbWFuYWdlZCBhbmQKKyAgICAgICAgLy8vICAgICB1bm1hbmFnZWQgcmVzb3VyY2VzIGNhbiBiZSByZWZlcmVuY2VkIGFuZCBkaXNwb3NlZC4gIElmIGRpc3Bvc2luZyA9PQorICAgICAgICAvLy8gICAgIGZhbHNlLCB0aGUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBieSB0aGUgcnVudGltZSBmcm9tIGluc2lkZSB0aGUKKyAgICAgICAgLy8vICAgICBvYmplY3QgZmluYWxpemVyIGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgbm90IHJlZmVyZW5jZSBvdGhlciBvYmplY3RzOworICAgICAgICAvLy8gICAgIGluIHRoYXQgY2FzZSBvbmx5IHVubWFuYWdlZCByZXNvdXJjZXMgbXVzdCBiZSByZWZlcmVuY2VkIG9yCisgICAgICAgIC8vLyAgICAgZGlzcG9zZWQuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXNwb3NpbmciPgorICAgICAgICAvLy8gICB0cnVlIGlmIHRoZSBEaXNwb3NlIG1ldGhvZCB3YXMgaW52b2tlZCBieSB1c2VyIGNvZGUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9kaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcgJiYgKHRoaXMuX2Jhc2VTdHJlYW0gIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYXNlU3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9kaXNwb3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gY2FuIGJlIHJlYWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRoZSByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjYXB0aXZlIHN0cmVhbSBzdXBwb3J0cyByZWFkaW5nLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiRGVmbGF0ZVN0cmVhbSIpOworICAgICAgICAgICAgICAgIHJldHVybiBfYmFzZVN0cmVhbS5fc3RyZWFtLkNhblJlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIHN1cHBvcnRzIFNlZWsgb3BlcmF0aW9ucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gQWx3YXlzIHJldHVybnMgZmFsc2UuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gY2FuIGJlIHdyaXR0ZW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRoZSByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjYXB0aXZlIHN0cmVhbSBzdXBwb3J0cyB3cml0aW5nLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkRlZmxhdGVTdHJlYW0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2Jhc2VTdHJlYW0uX3N0cmVhbS5DYW5Xcml0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZsdXNoIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJEZWZsYXRlU3RyZWFtIik7CisgICAgICAgICAgICBfYmFzZVN0cmVhbS5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZGluZyB0aGlzIHByb3BlcnR5IGFsd2F5cyB0aHJvd3MgYSA8c2VlIGNyZWY9Ik5vdEltcGxlbWVudGVkRXhjZXB0aW9uIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgc3RyZWFtIHBvaW50ZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbHdheXMgdGhyb3dzIGEgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiIvPi4gUmVhZGluZyB3aWxsIHJldHVybiB0aGUgdG90YWwgYnl0ZXMKKyAgICAgICAgLy8vICAgd3JpdHRlbiBvdXQsIGlmIHVzZWQgaW4gd3JpdGluZywgb3IgdGhlIHRvdGFsIGJ5dGVzIHJlYWQgaW4sIGlmIHVzZWQgaW4KKyAgICAgICAgLy8vICAgcmVhZGluZy4gIFRoZSBjb3VudCBtYXkgcmVmZXIgdG8gY29tcHJlc3NlZCBieXRlcyBvciB1bmNvbXByZXNzZWQgYnl0ZXMsCisgICAgICAgIC8vLyAgIGRlcGVuZGluZyBvbiBob3cgeW91J3ZlIHVzZWQgdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUG9zaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2VTdHJlYW0uX3N0cmVhbU1vZGUgPT0gSW9uaWMuWmxpYi5abGliQmFzZVN0cmVhbS5TdHJlYW1Nb2RlLldyaXRlcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VTdHJlYW0uX3ouVG90YWxCeXRlc091dDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fYmFzZVN0cmVhbS5fc3RyZWFtTW9kZSA9PSBJb25pYy5abGliLlpsaWJCYXNlU3RyZWFtLlN0cmVhbU1vZGUuUmVhZGVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzSW47CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDxjPkRlZmxhdGVTdHJlYW08L2M+IHRvIGNvbXByZXNzIGRhdGEgd2hpbGUKKyAgICAgICAgLy8vICAgcmVhZGluZywgeW91IGNhbiBjcmVhdGUgYSA8Yz5EZWZsYXRlU3RyZWFtPC9jPiB3aXRoCisgICAgICAgIC8vLyAgIDxjPkNvbXByZXNzaW9uTW9kZS5Db21wcmVzczwvYz4sIHByb3ZpZGluZyBhbiB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisgICAgICAgIC8vLyAgIFRoZW4gY2FsbCBSZWFkKCkgb24gdGhhdCA8Yz5EZWZsYXRlU3RyZWFtPC9jPiwgYW5kIHRoZSBkYXRhIHJlYWQgd2lsbCBiZQorICAgICAgICAvLy8gICBjb21wcmVzc2VkIGFzIHlvdSByZWFkLiAgSWYgeW91IHdpc2ggdG8gdXNlIHRoZSA8Yz5EZWZsYXRlU3RyZWFtPC9jPiB0bworICAgICAgICAvLy8gICBkZWNvbXByZXNzIGRhdGEgd2hpbGUgcmVhZGluZywgeW91IGNhbiBjcmVhdGUgYSA8Yz5EZWZsYXRlU3RyZWFtPC9jPiB3aXRoCisgICAgICAgIC8vLyAgIDxjPkNvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzPC9jPiwgcHJvdmlkaW5nIGEgcmVhZGFibGUgY29tcHJlc3NlZCBkYXRhCisgICAgICAgIC8vLyAgIHN0cmVhbS4gIFRoZW4gY2FsbCBSZWFkKCkgb24gdGhhdCA8Yz5EZWZsYXRlU3RyZWFtPC9jPiwgYW5kIHRoZSBkYXRhIHJlYWQKKyAgICAgICAgLy8vICAgd2lsbCBiZSBkZWNvbXByZXNzZWQgYXMgeW91IHJlYWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEEgPGM+RGVmbGF0ZVN0cmVhbTwvYz4gY2FuIGJlIHVzZWQgZm9yIDxjPlJlYWQoKTwvYz4gb3IgPGM+V3JpdGUoKTwvYz4sIGJ1dCBub3QgYm90aC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj5UaGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIHJlYWQgZGF0YSBzaG91bGQgYmUgcGxhY2VkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij50aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGRhdGEgYXJyYXkgdG8gcHV0IHRoZSBmaXJzdCBieXRlIHJlYWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+dGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz50aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiRGVmbGF0ZVN0cmVhbSIpOworICAgICAgICAgICAgcmV0dXJuIF9iYXNlU3RyZWFtLlJlYWQoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgPHNlZSBjcmVmPSJOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiIvPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoaXMgaXMgaXJyZWxldmFudCwgc2luY2UgaXQgd2lsbCBhbHdheXMgdGhyb3chPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcmlnaW4iPnRoaXMgaXMgaXJyZWxldmFudCwgc2luY2UgaXQgd2lsbCBhbHdheXMgdGhyb3chPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmlycmVsZXZhbnQhPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTeXN0ZW0uSU8uU2Vla09yaWdpbiBvcmlnaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHdheXMgdGhyb3dzIGEgPHNlZSBjcmVmPSJOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiIvPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+dGhpcyBpcyBpcnJlbGV2YW50LCBzaW5jZSBpdCB3aWxsIGFsd2F5cyB0aHJvdyE8L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDxjPkRlZmxhdGVTdHJlYW08L2M+IHRvIGNvbXByZXNzIGRhdGEgd2hpbGUKKyAgICAgICAgLy8vICAgd3JpdGluZywgeW91IGNhbiBjcmVhdGUgYSA8Yz5EZWZsYXRlU3RyZWFtPC9jPiB3aXRoCisgICAgICAgIC8vLyAgIDxjPkNvbXByZXNzaW9uTW9kZS5Db21wcmVzczwvYz4sIGFuZCBhIHdyaXRhYmxlIG91dHB1dCBzdHJlYW0uICBUaGVuIGNhbGwKKyAgICAgICAgLy8vICAgPGM+V3JpdGUoKTwvYz4gb24gdGhhdCA8Yz5EZWZsYXRlU3RyZWFtPC9jPiwgcHJvdmlkaW5nIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICAgIC8vLyAgIGFzIGlucHV0LiAgVGhlIGRhdGEgc2VudCB0byB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIGJlIHRoZSBjb21wcmVzc2VkIGZvcm0KKyAgICAgICAgLy8vICAgb2YgdGhlIGRhdGEgd3JpdHRlbi4gIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPGM+RGVmbGF0ZVN0cmVhbTwvYz4gdG8KKyAgICAgICAgLy8vICAgZGVjb21wcmVzcyBkYXRhIHdoaWxlIHdyaXRpbmcsIHlvdSBjYW4gY3JlYXRlIGEgPGM+RGVmbGF0ZVN0cmVhbTwvYz4gd2l0aAorICAgICAgICAvLy8gICA8Yz5Db21wcmVzc2lvbk1vZGUuRGVjb21wcmVzczwvYz4sIGFuZCBhIHdyaXRhYmxlIG91dHB1dCBzdHJlYW0uICBUaGVuCisgICAgICAgIC8vLyAgIGNhbGwgPGM+V3JpdGUoKTwvYz4gb24gdGhhdCBzdHJlYW0sIHByb3ZpZGluZyBwcmV2aW91c2x5IGNvbXByZXNzZWQKKyAgICAgICAgLy8vICAgZGF0YS4gVGhlIGRhdGEgc2VudCB0byB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIGJlIHRoZSBkZWNvbXByZXNzZWQgZm9ybSBvZgorICAgICAgICAvLy8gICB0aGUgZGF0YSB3cml0dGVuLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBIDxjPkRlZmxhdGVTdHJlYW08L2M+IGNhbiBiZSB1c2VkIGZvciA8Yz5SZWFkKCk8L2M+IG9yIDxjPldyaXRlKCk8L2M+LAorICAgICAgICAvLy8gICBidXQgbm90IGJvdGguCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgaG9sZGluZyBkYXRhIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZGF0YSBhcnJheSB0byBmaW5kIHRoZSBmaXJzdCBieXRlIHRvIHdyaXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkRlZmxhdGVTdHJlYW0iKTsKKyAgICAgICAgICAgIF9iYXNlU3RyZWFtLldyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ29tcHJlc3MgYSBzdHJpbmcgaW50byBhIGJ5dGUgYXJyYXkgdXNpbmcgREVGTEFURSAoUkZDIDE5NTEpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBVbmNvbXByZXNzIGl0IHdpdGggPHNlZSBjcmVmPSJEZWZsYXRlU3RyZWFtLlVuY29tcHJlc3NTdHJpbmcoYnl0ZVtdKSIvPi4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJEZWZsYXRlU3RyZWFtLlVuY29tcHJlc3NTdHJpbmcoYnl0ZVtdKSI+RGVmbGF0ZVN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSk8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJEZWZsYXRlU3RyZWFtLkNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiPkRlZmxhdGVTdHJlYW0uQ29tcHJlc3NCdWZmZXIoYnl0ZVtdKTwvc2VlYWxzbz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkdaaXBTdHJlYW0uQ29tcHJlc3NTdHJpbmcoc3RyaW5nKSI+R1ppcFN0cmVhbS5Db21wcmVzc1N0cmluZyhzdHJpbmcpPC9zZWVhbHNvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmxpYlN0cmVhbS5Db21wcmVzc1N0cmluZyhzdHJpbmcpIj5abGliU3RyZWFtLkNvbXByZXNzU3RyaW5nKHN0cmluZyk8L3NlZWFsc28+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InMiPgorICAgICAgICAvLy8gICBBIHN0cmluZyB0byBjb21wcmVzcy4gVGhlIHN0cmluZyB3aWxsIGZpcnN0IGJlIGVuY29kZWQKKyAgICAgICAgLy8vICAgdXNpbmcgVVRGOCwgdGhlbiBjb21wcmVzc2VkLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc3RyaW5nIGluIGNvbXByZXNzZWQgZm9ybTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gQ29tcHJlc3NTdHJpbmcoU3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgbXMgPSBuZXcgU3lzdGVtLklPLk1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5JTy5TdHJlYW0gY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZsYXRlU3RyZWFtKG1zLCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBabGliQmFzZVN0cmVhbS5Db21wcmVzc1N0cmluZyhzLCBjb21wcmVzc29yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENvbXByZXNzIGEgYnl0ZSBhcnJheSBpbnRvIGEgbmV3IGJ5dGUgYXJyYXkgdXNpbmcgREVGTEFURS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVW5jb21wcmVzcyBpdCB3aXRoIDxzZWUgY3JlZj0iRGVmbGF0ZVN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRGVmbGF0ZVN0cmVhbS5Db21wcmVzc1N0cmluZyhzdHJpbmcpIj5EZWZsYXRlU3RyZWFtLkNvbXByZXNzU3RyaW5nKHN0cmluZyk8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJEZWZsYXRlU3RyZWFtLlVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdKSI+RGVmbGF0ZVN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSk8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJHWmlwU3RyZWFtLkNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiPkdaaXBTdHJlYW0uQ29tcHJlc3NCdWZmZXIoYnl0ZVtdKTwvc2VlYWxzbz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlpsaWJTdHJlYW0uQ29tcHJlc3NCdWZmZXIoYnl0ZVtdKSI+WmxpYlN0cmVhbS5Db21wcmVzc0J1ZmZlcihieXRlW10pPC9zZWVhbHNvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj4KKyAgICAgICAgLy8vICAgQSBidWZmZXIgdG8gY29tcHJlc3MuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBkYXRhIGluIGNvbXByZXNzZWQgZm9ybTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gQ29tcHJlc3NCdWZmZXIoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgbXMgPSBuZXcgU3lzdGVtLklPLk1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5JTy5TdHJlYW0gY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZsYXRlU3RyZWFtKCBtcywgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzLCBDb21wcmVzc2lvbkxldmVsLkJlc3RDb21wcmVzc2lvbiApOworCisgICAgICAgICAgICAgICAgWmxpYkJhc2VTdHJlYW0uQ29tcHJlc3NCdWZmZXIoYiwgY29tcHJlc3Nvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBVbmNvbXByZXNzIGEgREVGTEFURSdkIGJ5dGUgYXJyYXkgaW50byBhIHNpbmdsZSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRGVmbGF0ZVN0cmVhbS5Db21wcmVzc1N0cmluZyhTdHJpbmcpIj5EZWZsYXRlU3RyZWFtLkNvbXByZXNzU3RyaW5nKFN0cmluZyk8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJEZWZsYXRlU3RyZWFtLlVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdKSI+RGVmbGF0ZVN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSk8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJHWmlwU3RyZWFtLlVuY29tcHJlc3NTdHJpbmcoYnl0ZVtdKSI+R1ppcFN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSk8L3NlZWFsc28+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJabGliU3RyZWFtLlVuY29tcHJlc3NTdHJpbmcoYnl0ZVtdKSI+WmxpYlN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSk8L3NlZWFsc28+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbXByZXNzZWQiPgorICAgICAgICAvLy8gICBBIGJ1ZmZlciBjb250YWluaW5nIERFRkxBVEUtY29tcHJlc3NlZCBkYXRhLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdW5jb21wcmVzc2VkIHN0cmluZzwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21wcmVzc1N0cmluZyhieXRlW10gY29tcHJlc3NlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBpbnB1dCA9IG5ldyBTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtKGNvbXByZXNzZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5JTy5TdHJlYW0gZGVjb21wcmVzc29yID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IERlZmxhdGVTdHJlYW0oaW5wdXQsIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBabGliQmFzZVN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGNvbXByZXNzZWQsIGRlY29tcHJlc3Nvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVW5jb21wcmVzcyBhIERFRkxBVEUnZCBieXRlIGFycmF5IGludG8gYSBieXRlIGFycmF5LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkRlZmxhdGVTdHJlYW0uQ29tcHJlc3NCdWZmZXIoYnl0ZVtdKSI+RGVmbGF0ZVN0cmVhbS5Db21wcmVzc0J1ZmZlcihieXRlW10pPC9zZWVhbHNvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRGVmbGF0ZVN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSkiPkRlZmxhdGVTdHJlYW0uVW5jb21wcmVzc1N0cmluZyhieXRlW10pPC9zZWVhbHNvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iR1ppcFN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiPkdaaXBTdHJlYW0uVW5jb21wcmVzc0J1ZmZlcihieXRlW10pPC9zZWVhbHNvPgorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmxpYlN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiPlpsaWJTdHJlYW0uVW5jb21wcmVzc0J1ZmZlcihieXRlW10pPC9zZWVhbHNvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb21wcmVzc2VkIj4KKyAgICAgICAgLy8vICAgQSBidWZmZXIgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gY29tcHJlc3NlZCB3aXRoIERFRkxBVEUuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBkYXRhIGluIHVuY29tcHJlc3NlZCBmb3JtPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBVbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSBjb21wcmVzc2VkKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIGlucHV0ID0gbmV3IFN5c3RlbS5JTy5NZW1vcnlTdHJlYW0oY29tcHJlc3NlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLklPLlN0cmVhbSBkZWNvbXByZXNzb3IgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRGVmbGF0ZVN0cmVhbSggaW5wdXQsIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkJhc2VTdHJlYW0uVW5jb21wcmVzc0J1ZmZlcihjb21wcmVzc2VkLCBkZWNvbXByZXNzb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9HWmlwU3RyZWFtLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9HWmlwU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2E0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL0daaXBTdHJlYW0uY3MKQEAgLTAsMCArMSwxMDMzIEBACisvLyBHWmlwU3RyZWFtLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDkgRGlubyBDaGllc2EgYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOgorLy8gVGltZS1zdGFtcDogPDIwMTEtQXVndXN0LTA4IDE4OjE0OjM5PgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIEdaaXBTdHJlYW0gY2xhc3MsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgcmVwbGFjZW1lbnQgZm9yCisvLyB0aGUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkdaaXBTdHJlYW0gY2xhc3MgaW4gdGhlIC5ORVQgQkNMLiAgTkI6IFRoZSBkZXNpZ24gaXMgbm90CisvLyBjb21wbGV0ZWx5IE9PIGNsZWFuOiB0aGVyZSBpcyBzb21lIGludGVsbGlnZW5jZSBpbiB0aGUgWmxpYkJhc2VTdHJlYW0gdGhhdCByZWFkcyB0aGUKKy8vIEdaaXAgaGVhZGVyLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgQSBjbGFzcyBmb3IgY29tcHJlc3NpbmcgYW5kIGRlY29tcHJlc3NpbmcgR1pJUCBzdHJlYW1zLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBUaGUgPGM+R1ppcFN0cmVhbTwvYz4gaXMgYSA8c2VlCisgICAgLy8vICAgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWNvcmF0b3JfcGF0dGVybiI+RGVjb3JhdG9yPC9zZWU+IG9uIGEKKyAgICAvLy8gICA8c2VlIGNyZWY9IlN0cmVhbSIvPi4gSXQgYWRkcyBHWklQIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gdG8gYW55CisgICAgLy8vICAgc3RyZWFtLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIExpa2UgdGhlIDxjPlN5c3RlbS5JTy5Db21wcmVzc2lvbi5HWmlwU3RyZWFtPC9jPiBpbiB0aGUgLk5FVCBCYXNlIENsYXNzIExpYnJhcnksIHRoZQorICAgIC8vLyAgIDxjPklvbmljLlpsaWIuR1ppcFN0cmVhbTwvYz4gY2FuIGNvbXByZXNzIHdoaWxlIHdyaXRpbmcsIG9yIGRlY29tcHJlc3Mgd2hpbGUKKyAgICAvLy8gICByZWFkaW5nLCBidXQgbm90IHZpY2UgdmVyc2EuICBUaGUgY29tcHJlc3Npb24gbWV0aG9kIHVzZWQgaXMgR1pJUCwgd2hpY2ggaXMKKyAgICAvLy8gICBkb2N1bWVudGVkIGluIDxzZWUgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1Mi50eHQiPklFVEYgUkZDCisgICAgLy8vICAgMTk1Mjwvc2VlPiwgIkdaSVAgZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDQuMyIuPC9wYXJhPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBBIDxjPkdaaXBTdHJlYW08L2M+IGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgZGF0YSAodGhyb3VnaCA8Yz5SZWFkKCk8L2M+KSBvcgorICAgIC8vLyAgIHRvIGNvbXByZXNzIGRhdGEgKHRocm91Z2ggPGM+V3JpdGUoKTwvYz4pLCBidXQgbm90IGJvdGguCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgSWYgeW91IHdpc2ggdG8gdXNlIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPiB0byBjb21wcmVzcyBkYXRhLCB5b3UgbXVzdCB3cmFwIGl0CisgICAgLy8vICAgYXJvdW5kIGEgd3JpdGUtYWJsZSBzdHJlYW0uIEFzIHlvdSBjYWxsIDxjPldyaXRlKCk8L2M+IG9uIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPiwgdGhlCisgICAgLy8vICAgZGF0YSB3aWxsIGJlIGNvbXByZXNzZWQgaW50byB0aGUgR1pJUCBmb3JtYXQuICBJZiB5b3Ugd2FudCB0byBkZWNvbXByZXNzIGRhdGEsCisgICAgLy8vICAgeW91IG11c3Qgd3JhcCB0aGUgPGM+R1ppcFN0cmVhbTwvYz4gYXJvdW5kIGEgcmVhZGFibGUgc3RyZWFtIHRoYXQgY29udGFpbnMgYW4KKyAgICAvLy8gICBJRVRGIFJGQyAxOTUyLWNvbXBsaWFudCBzdHJlYW0uICBUaGUgZGF0YSB3aWxsIGJlIGRlY29tcHJlc3NlZCBhcyB5b3UgY2FsbAorICAgIC8vLyAgIDxjPlJlYWQoKTwvYz4gb24gdGhlIDxjPkdaaXBTdHJlYW08L2M+LgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFRob3VnaCB0aGUgR1pJUCBmb3JtYXQgYWxsb3dzIGRhdGEgZnJvbSBtdWx0aXBsZSBmaWxlcyB0byBiZSBjb25jYXRlbmF0ZWQKKyAgICAvLy8gICB0b2dldGhlciwgdGhpcyBzdHJlYW0gaGFuZGxlcyBvbmx5IGEgc2luZ2xlIHNlZ21lbnQgb2YgR1pJUCBmb3JtYXQsIHR5cGljYWxseQorICAgIC8vLyAgIHJlcHJlc2VudGluZyBhIHNpbmdsZSBmaWxlLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byA8c2VlIGNyZWY9IlpsaWJTdHJlYW0iLz4gYW5kIDxzZWUgY3JlZj0iRGVmbGF0ZVN0cmVhbSIvPi4KKyAgICAvLy8gICA8Yz5abGliU3RyZWFtPC9jPiBoYW5kbGVzIFJGQzE5NTAtY29tcGxpYW50IHN0cmVhbXMuICA8c2VlIGNyZWY9IkRlZmxhdGVTdHJlYW0iLz4KKyAgICAvLy8gICBoYW5kbGVzIFJGQzE5NTEtY29tcGxpYW50IHN0cmVhbXMuIFRoaXMgY2xhc3MgaGFuZGxlcyBSRkMxOTUyLWNvbXBsaWFudCBzdHJlYW1zLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iRGVmbGF0ZVN0cmVhbSIgLz4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmxpYlN0cmVhbSIgLz4KKyAgICBwdWJsaWMgY2xhc3MgR1ppcFN0cmVhbSA6IFN5c3RlbS5JTy5TdHJlYW0KKyAgICB7CisgICAgICAgIC8vIEdaaXAgZm9ybWF0CisgICAgICAgIC8vIHNvdXJjZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MgorICAgICAgICAvLworICAgICAgICAvLyAgaGVhZGVyIGlkOiAgICAgICAgICAgMiBieXRlcyAgICAxRiA4QgorICAgICAgICAvLyAgY29tcHJlc3MgbWV0aG9kICAgICAgMSBieXRlICAgICA4PSBERUZMQVRFIChub25lIG90aGVyIHN1cHBvcnRlZCkKKyAgICAgICAgLy8gIGZsYWcgICAgICAgICAgICAgICAgIDEgYnl0ZSAgICAgYml0ZmllbGQgKFNlZSBiZWxvdykKKyAgICAgICAgLy8gIG10aW1lICAgICAgICAgICAgICAgIDQgYnl0ZXMgICAgdGltZV90IChzZWNvbmRzIHNpbmNlIGphbiAxLCAxOTcwIFVUQyBvZiB0aGUgZmlsZS4KKyAgICAgICAgLy8gIHhmbGcgICAgICAgICAgICAgICAgIDEgYnl0ZSAgICAgMiA9IG1heCBjb21wcmVzcyB1c2VkICwgNCA9IG1heCBzcGVlZCAoY2FuIGJlIGlnbm9yZWQpCisgICAgICAgIC8vICBPUyAgICAgICAgICAgICAgICAgICAxIGJ5dGUgICAgIE9TIGZvciBvcmlnaW5hdGluZyBhcmNoaXZlLiBzZXQgdG8gMHhGRiBpbiBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8gIGV4dHJhIGZpZWxkIGxlbmd0aCAgIDIgYnl0ZXMgICAgb3B0aW9uYWwgLSBvbmx5IGlmIEZFWFRSQSBpcyBzZXQuCisgICAgICAgIC8vICBleHRyYSBmaWVsZCAgICAgICAgICB2YXJpZXMKKyAgICAgICAgLy8gIGZpbGVuYW1lICAgICAgICAgICAgIHZhcmllcyAgICAgb3B0aW9uYWwgLSBpZiBGTkFNRSBpcyBzZXQuICB6ZXJvIHRlcm1pbmF0ZWQuIElTTy04ODU5LTEuCisgICAgICAgIC8vICBmaWxlIGNvbW1lbnQgICAgICAgICB2YXJpZXMgICAgIG9wdGlvbmFsIC0gaWYgRkNPTU1FTlQgaXMgc2V0LiB6ZXJvIHRlcm1pbmF0ZWQuIElTTy04ODU5LTEuCisgICAgICAgIC8vICBjcmMxNiAgICAgICAgICAgICAgICAxIGJ5dGUgICAgIG9wdGlvbmFsIC0gcHJlc2VudCBvbmx5IGlmIEZIQ1JDIGJpdCBpcyBzZXQKKyAgICAgICAgLy8gIGNvbXByZXNzZWQgZGF0YSAgICAgIHZhcmllcworICAgICAgICAvLyAgQ1JDMzIgICAgICAgICAgICAgICAgNCBieXRlcworICAgICAgICAvLyAgaXNpemUgICAgICAgICAgICAgICAgNCBieXRlcyAgICBkYXRhIHNpemUgbW9kdWxvIDJeMzIKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgIEZMRyAoRkxhR3MpCisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJpdCAwICAgRlRFWFQgLSBpbmRpY2F0ZXMgZmlsZSBpcyBBU0NJSSB0ZXh0IChjYW4gYmUgc2FmZWx5IGlnbm9yZWQpCisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJpdCAxICAgRkhDUkMgLSB0aGVyZSBpcyBhIENSQzE2IGZvciB0aGUgaGVhZGVyIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgaGVhZGVyCisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJpdCAyICAgRkVYVFJBIC0gZXh0cmEgZmllbGRzIGFyZSBwcmVzZW50CisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJpdCAzICAgRk5BTUUgLSB0aGUgemVyby10ZXJtaW5hdGVkIGZpbGVuYW1lIGlzIHByZXNlbnQuIGVuY29kaW5nOyBJU08tODg1OS0xLgorICAgICAgICAvLyAgICAgICAgICAgICAgICBiaXQgNCAgIEZDT01NRU5UICAtIGEgemVyby10ZXJtaW5hdGVkIGZpbGUgY29tbWVudCBpcyBwcmVzZW50LiBlbmNvZGluZzogSVNPLTg4NTktMQorICAgICAgICAvLyAgICAgICAgICAgICAgICBiaXQgNSAgIHJlc2VydmVkCisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJpdCA2ICAgcmVzZXJ2ZWQKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgYml0IDcgICByZXNlcnZlZAorICAgICAgICAvLworICAgICAgICAvLyBPbiBjb25zdW1wdGlvbjoKKyAgICAgICAgLy8gRXh0cmEgZmllbGQgaXMgYSBidW5jaCBvZiBub25zZW5zZSBhbmQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLgorICAgICAgICAvLyBIZWFkZXIgQ1JDIGFuZCBPUywgbGlrZXdpc2UuCisgICAgICAgIC8vCisgICAgICAgIC8vIG9uIGdlbmVyYXRpb246CisgICAgICAgIC8vIGFsbCBvcHRpb25hbCBmaWVsZHMgZ2V0IDAsIGV4Y2VwdCBmb3IgdGhlIE9TLCB3aGljaCBnZXRzIDI1NS4KKyAgICAgICAgLy8KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgY29tbWVudCBvbiB0aGUgR1pJUCBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIEdaSVAgZm9ybWF0IGFsbG93cyBmb3IgZWFjaCBmaWxlIHRvIG9wdGlvbmFsbHkgaGF2ZSBhbiBhc3NvY2lhdGVkCisgICAgICAgIC8vLyAgIGNvbW1lbnQgc3RvcmVkIHdpdGggdGhlIGZpbGUuICBUaGUgY29tbWVudCBpcyBlbmNvZGVkIHdpdGggdGhlIElTTy04ODU5LTEKKyAgICAgICAgLy8vICAgY29kZSBwYWdlLiAgVG8gaW5jbHVkZSBhIGNvbW1lbnQgaW4gYSBHWklQIHN0cmVhbSB5b3UgY3JlYXRlLCBzZXQgdGhpcworICAgICAgICAvLy8gICBwcm9wZXJ0eSBiZWZvcmUgY2FsbGluZyA8Yz5Xcml0ZSgpPC9jPiBmb3IgdGhlIGZpcnN0IHRpbWUgb24gdGhlCisgICAgICAgIC8vLyAgIDxjPkdaaXBTdHJlYW08L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIHVzaW5nIDxjPkdaaXBTdHJlYW08L2M+IHRvIGRlY29tcHJlc3MsIHlvdSBjYW4gcmV0cmlldmUgdGhpcyBwcm9wZXJ0eQorICAgICAgICAvLy8gICBhZnRlciB0aGUgZmlyc3QgY2FsbCB0byA8Yz5SZWFkKCk8L2M+LiAgSWYgbm8gY29tbWVudCBoYXMgYmVlbiBzZXQgaW4gdGhlCisgICAgICAgIC8vLyAgIEdaSVAgYnl0ZXN0cmVhbSwgdGhlIENvbW1lbnQgcHJvcGVydHkgd2lsbCByZXR1cm4gPGM+bnVsbDwvYz4KKyAgICAgICAgLy8vICAgKDxjPk5vdGhpbmc8L2M+IGluIFZCKS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIFN0cmluZyBDb21tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfQ29tbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOworICAgICAgICAgICAgICAgIF9Db21tZW50ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBGaWxlTmFtZSBmb3IgdGhlIEdaSVAgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgR1pJUCBmb3JtYXQgb3B0aW9uYWxseSBhbGxvd3MgZWFjaCBmaWxlIHRvIGhhdmUgYW4gYXNzb2NpYXRlZAorICAgICAgICAvLy8gICBmaWxlbmFtZS4gIFdoZW4gY29tcHJlc3NpbmcgZGF0YSAodGhyb3VnaCA8Yz5Xcml0ZSgpPC9jPiksIHNldCB0aGlzCisgICAgICAgIC8vLyAgIEZpbGVOYW1lIGJlZm9yZSBjYWxsaW5nIDxjPldyaXRlKCk8L2M+IHRoZSBmaXJzdCB0aW1lIG9uIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPi4KKyAgICAgICAgLy8vICAgVGhlIGFjdHVhbCBmaWxlbmFtZSBpcyBlbmNvZGVkIGludG8gdGhlIEdaSVAgYnl0ZXN0cmVhbSB3aXRoIHRoZQorICAgICAgICAvLy8gICBJU08tODg1OS0xIGNvZGUgcGFnZSwgYWNjb3JkaW5nIHRvIFJGQyAxOTUyLiBJdCBpcyB0aGUgYXBwbGljYXRpb24ncworICAgICAgICAvLy8gICByZXNwb25zaWJpbGl0eSB0byBpbnN1cmUgdGhhdCB0aGUgRmlsZU5hbWUgY2FuIGJlIGVuY29kZWQgYW5kIGRlY29kZWQKKyAgICAgICAgLy8vICAgY29ycmVjdGx5IHdpdGggdGhpcyBjb2RlIHBhZ2UuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gZGVjb21wcmVzc2luZyAodGhyb3VnaCA8Yz5SZWFkKCk8L2M+KSwgeW91IGNhbiByZXRyaWV2ZSB0aGlzIHZhbHVlCisgICAgICAgIC8vLyAgIGFueSB0aW1lIGFmdGVyIHRoZSBmaXJzdCA8Yz5SZWFkKCk8L2M+LiAgSW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgd2FzIG5vIGZpbGVuYW1lCisgICAgICAgIC8vLyAgIGVuY29kZWQgaW50byB0aGUgR1pJUCBieXRlc3RyZWFtLCB0aGUgcHJvcGVydHkgd2lsbCByZXR1cm4gPGM+bnVsbDwvYz4gKDxjPk5vdGhpbmc8L2M+CisgICAgICAgIC8vLyAgIGluIFZCKS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIFN0cmluZyBGaWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX0ZpbGVOYW1lOyB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKKyAgICAgICAgICAgICAgICBfRmlsZU5hbWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoX0ZpbGVOYW1lID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoX0ZpbGVOYW1lLkluZGV4T2YoIi8iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9GaWxlTmFtZSA9IF9GaWxlTmFtZS5SZXBsYWNlKCIvIiwgIlxcIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfRmlsZU5hbWUuRW5kc1dpdGgoIlxcIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIklsbGVnYWwgZmlsZW5hbWUiKTsKKyAgICAgICAgICAgICAgICBpZiAoX0ZpbGVOYW1lLkluZGV4T2YoIlxcIikgIT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB0cmltIGFueSBsZWFkaW5nIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgX0ZpbGVOYW1lID0gUGF0aC5HZXRGaWxlTmFtZShfRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIGxhc3QgbW9kaWZpZWQgdGltZSBmb3IgdGhlIEdaSVAgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBHWklQIGFsbG93cyB0aGUgc3RvcmFnZSBvZiBhIGxhc3QgbW9kaWZpZWQgdGltZSB3aXRoIGVhY2ggR1pJUCBlbnRyeS4KKyAgICAgICAgLy8vICAgV2hlbiBjb21wcmVzc2luZyBkYXRhLCB5b3UgY2FuIHNldCB0aGlzIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0bworICAgICAgICAvLy8gICA8Yz5Xcml0ZSgpPC9jPi4gIFdoZW4gZGVjb21wcmVzc2luZywgeW91IGNhbiByZXRyaWV2ZSB0aGlzIHZhbHVlIGFueSB0aW1lCisgICAgICAgIC8vLyAgIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIDxjPlJlYWQoKTwvYz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBEYXRlVGltZT8gTGFzdE1vZGlmaWVkOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBDUkMgb24gdGhlIEdaSVAgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGludGVybmFsIGVycm9yIGNoZWNraW5nLiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBsb29rIGF0IHRoaXMgcHJvcGVydHkuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBpbnQgQ3JjMzIgeyBnZXQgeyByZXR1cm4gX0NyYzMyOyB9IH0KKworICAgICAgICBwcml2YXRlIGludCBfaGVhZGVyQnl0ZUNvdW50OworICAgICAgICBpbnRlcm5hbCBabGliQmFzZVN0cmVhbSBfYmFzZVN0cmVhbTsKKyAgICAgICAgYm9vbCBfZGlzcG9zZWQ7CisgICAgICAgIGJvb2wgX2ZpcnN0UmVhZERvbmU7CisgICAgICAgIHN0cmluZyBfRmlsZU5hbWU7CisgICAgICAgIHN0cmluZyBfQ29tbWVudDsKKyAgICAgICAgaW50IF9DcmMzMjsKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+R1ppcFN0cmVhbTwvYz4gdXNpbmcgdGhlIHNwZWNpZmllZCA8Yz5Db21wcmVzc2lvbk1vZGU8L2M+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gbW9kZSBpcyA8Yz5Db21wcmVzc2lvbk1vZGUuQ29tcHJlc3M8L2M+LCB0aGUgPGM+R1ppcFN0cmVhbTwvYz4gd2lsbCB1c2UgdGhlCisgICAgICAgIC8vLyAgIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFzIG5vdGVkIGluIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uLCB0aGUgPGM+Q29tcHJlc3Npb25Nb2RlPC9jPiAoQ29tcHJlc3MKKyAgICAgICAgLy8vICAgb3IgRGVjb21wcmVzcykgYWxzbyBlc3RhYmxpc2hlcyB0aGUgImRpcmVjdGlvbiIgb2YgdGhlIHN0cmVhbS4gIEEKKyAgICAgICAgLy8vICAgPGM+R1ppcFN0cmVhbTwvYz4gd2l0aCA8Yz5Db21wcmVzc2lvbk1vZGUuQ29tcHJlc3M8L2M+IHdvcmtzIG9ubHkgdGhyb3VnaAorICAgICAgICAvLy8gICA8Yz5Xcml0ZSgpPC9jPi4gIEEgPGM+R1ppcFN0cmVhbTwvYz4gd2l0aAorICAgICAgICAvLy8gICA8Yz5Db21wcmVzc2lvbk1vZGUuRGVjb21wcmVzczwvYz4gd29ya3Mgb25seSB0aHJvdWdoIDxjPlJlYWQoKTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIEdaaXBTdHJlYW0gdG8gY29tcHJlc3MgZGF0YS4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gdXNpbmcgKFN5c3RlbS5JTy5TdHJlYW0gaW5wdXQgPSBTeXN0ZW0uSU8uRmlsZS5PcGVuUmVhZChmaWxlVG9Db21wcmVzcykpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgdXNpbmcgKHZhciByYXcgPSBTeXN0ZW0uSU8uRmlsZS5DcmVhdGUob3V0cHV0RmlsZSkpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAoU3RyZWFtIGNvbXByZXNzb3IgPSBuZXcgR1ppcFN0cmVhbShyYXcsIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcykpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtXT1JLSU5HX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGludCBuOworICAgICAgICAvLy8gICAgICAgICAgICAgd2hpbGUgKChuPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkpICE9IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAvLy8gICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICB9CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gRGltIG91dHB1dEZpbGUgQXMgU3RyaW5nID0gKGZpbGVUb0NvbXByZXNzICZhbXA7ICIuY29tcHJlc3NlZCIpCisgICAgICAgIC8vLyBVc2luZyBpbnB1dCBBcyBTdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKQorICAgICAgICAvLy8gICAgIFVzaW5nIHJhdyBBcyBGaWxlU3RyZWFtID0gRmlsZS5DcmVhdGUob3V0cHV0RmlsZSkKKyAgICAgICAgLy8vICAgICBVc2luZyBjb21wcmVzc29yIEFzIFN0cmVhbSA9IE5ldyBHWmlwU3RyZWFtKHJhdywgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzKQorICAgICAgICAvLy8gICAgICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDQwOTYpIHt9CisgICAgICAgIC8vLyAgICAgICAgIERpbSBuIEFzIEludGVnZXIgPSAtMQorICAgICAgICAvLy8gICAgICAgICBEbyBXaGlsZSAobiAmbHQ7Jmd0OyAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgSWYgKG4gJmd0OyAwKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgTG9vcAorICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIEdaaXBTdHJlYW0gdG8gdW5jb21wcmVzcyBhIGZpbGUuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHByaXZhdGUgdm9pZCBHdW5aaXBGaWxlKHN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICBpZiAoIWZpbGVuYW1lLkVuZHNXaXRoKCIuZ3opKQorICAgICAgICAvLy8gICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oImZpbGVuYW1lIik7CisgICAgICAgIC8vLyAgICAgdmFyIERlY29tcHJlc3NlZEZpbGUgPSBmaWxlbmFtZS5TdWJzdHJpbmcoMCxmaWxlbmFtZS5MZW5ndGgtMyk7CisgICAgICAgIC8vLyAgICAgYnl0ZVtdIHdvcmtpbmcgPSBuZXcgYnl0ZVtXT1JLSU5HX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgLy8vICAgICBpbnQgbj0gMTsKKyAgICAgICAgLy8vICAgICB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKGZpbGVuYW1lKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nIChTdHJlYW0gZGVjb21wcmVzc29yPSBuZXcgSW9uaWMuWmxpYi5HWmlwU3RyZWFtKGlucHV0LCBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcywgdHJ1ZSkpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHVzaW5nICh2YXIgb3V0cHV0ID0gU3lzdGVtLklPLkZpbGUuQ3JlYXRlKERlY29tcHJlc3NlZEZpbGUpKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIHdoaWxlIChuICE9MCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIG49IGRlY29tcHJlc3Nvci5SZWFkKHdvcmtpbmcsIDAsIHdvcmtpbmcuTGVuZ3RoKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUod29ya2luZywgMCwgbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vLyAgICAgICAgICAgICB9CisgICAgICAgIC8vLyAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gUHJpdmF0ZSBTdWIgR3VuWmlwRmlsZShCeVZhbCBmaWxlbmFtZSBhcyBTdHJpbmcpCisgICAgICAgIC8vLyAgICAgSWYgTm90IChmaWxlbmFtZS5FbmRzV2l0aCgiLmd6KSkgVGhlbgorICAgICAgICAvLy8gICAgICAgICBUaHJvdyBOZXcgQXJndW1lbnRFeGNlcHRpb24oImZpbGVuYW1lIikKKyAgICAgICAgLy8vICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICBEaW0gRGVjb21wcmVzc2VkRmlsZSBhcyBTdHJpbmcgPSBmaWxlbmFtZS5TdWJzdHJpbmcoMCxmaWxlbmFtZS5MZW5ndGgtMykKKyAgICAgICAgLy8vICAgICBEaW0gd29ya2luZyhXT1JLSU5HX0JVRkZFUl9TSVpFKSBhcyBCeXRlCisgICAgICAgIC8vLyAgICAgRGltIG4gQXMgSW50ZWdlciA9IDEKKyAgICAgICAgLy8vICAgICBVc2luZyBpbnB1dCBBcyBTdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGZpbGVuYW1lKQorICAgICAgICAvLy8gICAgICAgICBVc2luZyBkZWNvbXByZXNzb3IgQXMgU3RyZWFtID0gbmV3IElvbmljLlpsaWIuR1ppcFN0cmVhbShpbnB1dCwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MsIFRydWUpCisgICAgICAgIC8vLyAgICAgICAgICAgICBVc2luZyBvdXRwdXQgQXMgU3RyZWFtID0gRmlsZS5DcmVhdGUoVW5jb21wcmVzc2VkRmlsZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBEbworICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICBuPSBkZWNvbXByZXNzb3IuUmVhZCh3b3JraW5nLCAwLCB3b3JraW5nLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgSWYgbiA+IDAgVGhlbgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKHdvcmtpbmcsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIEVuZCBJRgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIExvb3AgV2hpbGUgKG4gID4gMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBTdWIKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIEdaaXBTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBHWmlwU3RyZWFtKFN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTW9kZSBtb2RlKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgbW9kZSwgQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0LCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBDcmVhdGUgYSA8Yz5HWmlwU3RyZWFtPC9jPiB1c2luZyB0aGUgc3BlY2lmaWVkIDxjPkNvbXByZXNzaW9uTW9kZTwvYz4gYW5kCisgICAgICAgIC8vLyAgIHRoZSBzcGVjaWZpZWQgPGM+Q29tcHJlc3Npb25MZXZlbDwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIDxjPkNvbXByZXNzaW9uTW9kZTwvYz4gKENvbXByZXNzIG9yIERlY29tcHJlc3MpIGFsc28gZXN0YWJsaXNoZXMgdGhlCisgICAgICAgIC8vLyAgICJkaXJlY3Rpb24iIG9mIHRoZSBzdHJlYW0uICBBIDxjPkdaaXBTdHJlYW08L2M+IHdpdGgKKyAgICAgICAgLy8vICAgPGM+Q29tcHJlc3Npb25Nb2RlLkNvbXByZXNzPC9jPiB3b3JrcyBvbmx5IHRocm91Z2ggPGM+V3JpdGUoKTwvYz4uICBBCisgICAgICAgIC8vLyAgIDxjPkdaaXBTdHJlYW08L2M+IHdpdGggPGM+Q29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3M8L2M+IHdvcmtzIG9ubHkKKyAgICAgICAgLy8vICAgdGhyb3VnaCA8Yz5SZWFkKCk8L2M+LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIDxjPkdaaXBTdHJlYW08L2M+IHRvIGNvbXByZXNzIGEgZmlsZSBpbnRvIGEgLmd6IGZpbGUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAodmFyIHJhdyA9IFN5c3RlbS5JTy5GaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyArICIuZ3oiKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nIChTdHJlYW0gY29tcHJlc3NvciA9IG5ldyBHWmlwU3RyZWFtKHJhdywKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsLkJlc3RDb21wcmVzc2lvbikpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtXT1JLSU5HX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGludCBuOworICAgICAgICAvLy8gICAgICAgICAgICAgd2hpbGUgKChuPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkpICE9IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAvLy8gICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICB9CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIGlucHV0IEFzIFN0cmVhbSA9IEZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgVXNpbmcgcmF3IEFzIEZpbGVTdHJlYW0gPSBGaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyAmYW1wOyAiLmd6IikKKyAgICAgICAgLy8vICAgICAgICAgVXNpbmcgY29tcHJlc3NvciBBcyBTdHJlYW0gPSBOZXcgR1ppcFN0cmVhbShyYXcsIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywgQ29tcHJlc3Npb25MZXZlbC5CZXN0Q29tcHJlc3Npb24pCisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDQwOTYpIHt9CisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gbiBBcyBJbnRlZ2VyID0gLTEKKyAgICAgICAgLy8vICAgICAgICAgICAgIERvIFdoaWxlIChuICZsdDsmZ3Q7IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgSWYgKG4gJmd0OyAwKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuV3JpdGUoYnVmZmVyLCAwLCBuKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIExvb3AKKyAgICAgICAgLy8vICAgICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gdG8gYmUgcmVhZCBvciB3cml0dGVuIHdoaWxlIGRlZmxhdGluZyBvciBpbmZsYXRpbmcuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2RlIj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgPGM+R1ppcFN0cmVhbTwvYz4gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPkEgdHVuaW5nIGtub2IgdG8gdHJhZGUgc3BlZWQgZm9yIGVmZmVjdGl2ZW5lc3MuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEdaaXBTdHJlYW0oU3RyZWFtIHN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlIG1vZGUsIENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwpCisgICAgICAgICAgICA6IHRoaXMoc3RyZWFtLCBtb2RlLCBsZXZlbCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+R1ppcFN0cmVhbTwvYz4gdXNpbmcgdGhlIHNwZWNpZmllZCA8Yz5Db21wcmVzc2lvbk1vZGU8L2M+LCBhbmQKKyAgICAgICAgLy8vICAgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgYmUgbGVmdCBvcGVuIGFmdGVyIERlZmxhdGlvbgorICAgICAgICAvLy8gICBvciBJbmZsYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGUgY2FwdGl2ZSBzdHJlYW0KKyAgICAgICAgLy8vICAgcmVtYWluIG9wZW4gYWZ0ZXIgdGhlIGRlZmxhdGlvbiBvciBpbmZsYXRpb24gb2NjdXJzLiAgQnkgZGVmYXVsdCwgYWZ0ZXIKKyAgICAgICAgLy8vICAgPGM+Q2xvc2UoKTwvYz4gaXMgY2FsbGVkIG9uIHRoZSBzdHJlYW0sIHRoZSBjYXB0aXZlIHN0cmVhbSBpcyBhbHNvCisgICAgICAgIC8vLyAgIGNsb3NlZC4gSW4gc29tZSBjYXNlcyB0aGlzIGlzIG5vdCBkZXNpcmVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgc3RyZWFtIGlzIGEKKyAgICAgICAgLy8vICAgbWVtb3J5IHN0cmVhbSB0aGF0IHdpbGwgYmUgcmUtcmVhZCBhZnRlciBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgorICAgICAgICAvLy8gICB0byBpdC4gIFNwZWNpZnkgdHJ1ZSBmb3IgdGhlIDxwYXJhbXJlZiBuYW1lPSJsZWF2ZU9wZW4iLz4gcGFyYW1ldGVyIHRvIGxlYXZlCisgICAgICAgIC8vLyAgIHRoZSBzdHJlYW0gb3Blbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIDxzZWUgY3JlZj0iQ29tcHJlc3Npb25Nb2RlIi8+IChDb21wcmVzcyBvciBEZWNvbXByZXNzKSBhbHNvCisgICAgICAgIC8vLyAgIGVzdGFibGlzaGVzIHRoZSAiZGlyZWN0aW9uIiBvZiB0aGUgc3RyZWFtLiAgQSA8Yz5HWmlwU3RyZWFtPC9jPiB3aXRoCisgICAgICAgIC8vLyAgIDxjPkNvbXByZXNzaW9uTW9kZS5Db21wcmVzczwvYz4gd29ya3Mgb25seSB0aHJvdWdoIDxjPldyaXRlKCk8L2M+LiAgQSA8Yz5HWmlwU3RyZWFtPC9jPgorICAgICAgICAvLy8gICB3aXRoIDxjPkNvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzPC9jPiB3b3JrcyBvbmx5IHRocm91Z2ggPGM+UmVhZCgpPC9jPi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhlIDxjPkdaaXBTdHJlYW08L2M+IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsLiBJZiB5b3Ugd2FudAorICAgICAgICAvLy8gICB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgc2VlIDxzZWUgY3JlZj0iR1ppcFN0cmVhbShTdHJlYW0sCisgICAgICAgIC8vLyAgIENvbXByZXNzaW9uTW9kZSwgQ29tcHJlc3Npb25MZXZlbCwgYm9vbCkiLz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgb3RoZXIgb3ZlcmxvYWRzIG9mIHRoaXMgY29uc3RydWN0b3IgZm9yIGV4YW1wbGUgY29kZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+CisgICAgICAgIC8vLyAgIFRoZSBzdHJlYW0gd2hpY2ggd2lsbCBiZSByZWFkIG9yIHdyaXR0ZW4uIFRoaXMgaXMgY2FsbGVkIHRoZSAiY2FwdGl2ZSIKKyAgICAgICAgLy8vICAgc3RyZWFtIGluIG90aGVyIHBsYWNlcyBpbiB0aGlzIGRvY3VtZW50YXRpb24uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2RlIj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgR1ppcFN0cmVhbSB3aWxsIGNvbXByZXNzIG9yIGRlY29tcHJlc3MuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZWF2ZU9wZW4iPgorICAgICAgICAvLy8gICB0cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRoZSBiYXNlIHN0cmVhbSB0byByZW1haW4gb3BlbiBhZnRlcgorICAgICAgICAvLy8gICBpbmZsYXRpb24vZGVmbGF0aW9uLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIEdaaXBTdHJlYW0oU3RyZWFtIHN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlIG1vZGUsIGJvb2wgbGVhdmVPcGVuKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgbW9kZSwgQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0LCBsZWF2ZU9wZW4pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+R1ppcFN0cmVhbTwvYz4gdXNpbmcgdGhlIHNwZWNpZmllZCA8Yz5Db21wcmVzc2lvbk1vZGU8L2M+IGFuZCB0aGUKKyAgICAgICAgLy8vICAgc3BlY2lmaWVkIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+LCBhbmQgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgdGhlCisgICAgICAgIC8vLyAgIHN0cmVhbSBzaG91bGQgYmUgbGVmdCBvcGVuIGFmdGVyIERlZmxhdGlvbiBvciBJbmZsYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIGNhcHRpdmUgc3RyZWFtCisgICAgICAgIC8vLyAgIHJlbWFpbiBvcGVuIGFmdGVyIHRoZSBkZWZsYXRpb24gb3IgaW5mbGF0aW9uIG9jY3Vycy4gIEJ5IGRlZmF1bHQsIGFmdGVyCisgICAgICAgIC8vLyAgIDxjPkNsb3NlKCk8L2M+IGlzIGNhbGxlZCBvbiB0aGUgc3RyZWFtLCB0aGUgY2FwdGl2ZSBzdHJlYW0gaXMgYWxzbworICAgICAgICAvLy8gICBjbG9zZWQuIEluIHNvbWUgY2FzZXMgdGhpcyBpcyBub3QgZGVzaXJlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIHN0cmVhbSBpcyBhCisgICAgICAgIC8vLyAgIG1lbW9yeSBzdHJlYW0gdGhhdCB3aWxsIGJlIHJlLXJlYWQgYWZ0ZXIgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KKyAgICAgICAgLy8vICAgdG8gaXQuICBTcGVjaWZ5IHRydWUgZm9yIHRoZSA8cGFyYW1yZWYgbmFtZT0ibGVhdmVPcGVuIi8+IHBhcmFtZXRlciB0bworICAgICAgICAvLy8gICBsZWF2ZSB0aGUgc3RyZWFtIG9wZW4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEFzIG5vdGVkIGluIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uLCB0aGUgPGM+Q29tcHJlc3Npb25Nb2RlPC9jPiAoQ29tcHJlc3MKKyAgICAgICAgLy8vICAgb3IgRGVjb21wcmVzcykgYWxzbyBlc3RhYmxpc2hlcyB0aGUgImRpcmVjdGlvbiIgb2YgdGhlIHN0cmVhbS4gIEEKKyAgICAgICAgLy8vICAgPGM+R1ppcFN0cmVhbTwvYz4gd2l0aCA8Yz5Db21wcmVzc2lvbk1vZGUuQ29tcHJlc3M8L2M+IHdvcmtzIG9ubHkgdGhyb3VnaAorICAgICAgICAvLy8gICA8Yz5Xcml0ZSgpPC9jPi4gIEEgPGM+R1ppcFN0cmVhbTwvYz4gd2l0aCA8Yz5Db21wcmVzc2lvbk1vZGUuRGVjb21wcmVzczwvYz4gd29ya3Mgb25seQorICAgICAgICAvLy8gICB0aHJvdWdoIDxjPlJlYWQoKTwvYz4uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIDxjPkdaaXBTdHJlYW08L2M+IHRvIGNvbXByZXNzIGRhdGEuCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChTeXN0ZW0uSU8uU3RyZWFtIGlucHV0ID0gU3lzdGVtLklPLkZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHVzaW5nICh2YXIgcmF3ID0gU3lzdGVtLklPLkZpbGUuQ3JlYXRlKG91dHB1dEZpbGUpKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgdXNpbmcgKFN0cmVhbSBjb21wcmVzc29yID0gbmV3IEdaaXBTdHJlYW0ocmF3LCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uLCB0cnVlKSkKKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW1dPUktJTkdfQlVGRkVSX1NJWkVdOworICAgICAgICAvLy8gICAgICAgICAgICAgaW50IG47CisgICAgICAgIC8vLyAgICAgICAgICAgICB3aGlsZSAoKG49IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgIT0gMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBjb21wcmVzc29yLldyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgIC8vLyAgICAgICAgICAgICB9CisgICAgICAgIC8vLyAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyB9CisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBEaW0gb3V0cHV0RmlsZSBBcyBTdHJpbmcgPSAoZmlsZVRvQ29tcHJlc3MgJmFtcDsgIi5jb21wcmVzc2VkIikKKyAgICAgICAgLy8vIFVzaW5nIGlucHV0IEFzIFN0cmVhbSA9IEZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgVXNpbmcgcmF3IEFzIEZpbGVTdHJlYW0gPSBGaWxlLkNyZWF0ZShvdXRwdXRGaWxlKQorICAgICAgICAvLy8gICAgIFVzaW5nIGNvbXByZXNzb3IgQXMgU3RyZWFtID0gTmV3IEdaaXBTdHJlYW0ocmF3LCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uLCBUcnVlKQorICAgICAgICAvLy8gICAgICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDQwOTYpIHt9CisgICAgICAgIC8vLyAgICAgICAgIERpbSBuIEFzIEludGVnZXIgPSAtMQorICAgICAgICAvLy8gICAgICAgICBEbyBXaGlsZSAobiAmbHQ7Jmd0OyAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgSWYgKG4gJmd0OyAwKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgLy8vICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgTG9vcAorICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gICAgIEVuZCBVc2luZworICAgICAgICAvLy8gRW5kIFVzaW5nCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIEdaaXBTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj50cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRoZSBzdHJlYW0gdG8gcmVtYWluIG9wZW4gYWZ0ZXIgaW5mbGF0aW9uL2RlZmxhdGlvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj5BIHR1bmluZyBrbm9iIHRvIHRyYWRlIHNwZWVkIGZvciBlZmZlY3RpdmVuZXNzLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBHWmlwU3RyZWFtKFN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTW9kZSBtb2RlLCBDb21wcmVzc2lvbkxldmVsIGxldmVsLCBib29sIGxlYXZlT3BlbikKKyAgICAgICAgeworICAgICAgICAgICAgX2Jhc2VTdHJlYW0gPSBuZXcgWmxpYkJhc2VTdHJlYW0oc3RyZWFtLCBtb2RlLCBsZXZlbCwgWmxpYlN0cmVhbUZsYXZvci5HWklQLCBsZWF2ZU9wZW4pOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBabGliIHByb3BlcnRpZXMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHByb3BlcnR5IHNldHMgdGhlIGZsdXNoIGJlaGF2aW9yIG9uIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZpcnR1YWwgcHVibGljIEZsdXNoVHlwZSBGbHVzaE1vZGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuICh0aGlzLl9iYXNlU3RyZWFtLl9mbHVzaE1vZGUpOyB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOworICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VTdHJlYW0uX2ZsdXNoTW9kZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgc2l6ZSBvZiB0aGUgd29ya2luZyBidWZmZXIgZm9yIHRoZSBjb21wcmVzc2lvbiBjb2RlYy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgd29ya2luZyBidWZmZXIgaXMgdXNlZCBmb3IgYWxsIHN0cmVhbSBvcGVyYXRpb25zLiAgVGhlIGRlZmF1bHQgc2l6ZSBpcworICAgICAgICAvLy8gICAxMDI0IGJ5dGVzLiAgVGhlIG1pbmltdW0gc2l6ZSBpcyAxMjggYnl0ZXMuIFlvdSBtYXkgZ2V0IGJldHRlciBwZXJmb3JtYW5jZQorICAgICAgICAvLy8gICB3aXRoIGEgbGFyZ2VyIGJ1ZmZlci4gIFRoZW4gYWdhaW4sIHlvdSBtaWdodCBub3QuICBZb3Ugd291bGQgaGF2ZSB0byB0ZXN0CisgICAgICAgIC8vLyAgIGl0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBTZXQgdGhpcyBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gPGM+UmVhZCgpPC9jPiBvciA8Yz5Xcml0ZSgpPC9jPiBvbiB0aGUKKyAgICAgICAgLy8vICAgc3RyZWFtLiBJZiB5b3UgdHJ5IHRvIHNldCBpdCBhZnRlcndhcmRzLCBpdCB3aWxsIHRocm93LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgaW50IEJ1ZmZlclNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VTdHJlYW0uX2J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fYmFzZVN0cmVhbS5fd29ya2luZ0J1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiVGhlIHdvcmtpbmcgYnVmZmVyIGlzIGFscmVhZHkgc2V0LiIpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IFpsaWJDb25zdGFudHMuV29ya2luZ0J1ZmZlclNpemVNaW4pCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIkRvbid0IGJlIHNpbGx5LiB7MH0gYnl0ZXM/PyBVc2UgYSBiaWdnZXIgYnVmZmVyLCBhdCBsZWFzdCB7MX0uIiwgdmFsdWUsIFpsaWJDb25zdGFudHMuV29ya2luZ0J1ZmZlclNpemVNaW4pKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9iYXNlU3RyZWFtLl9idWZmZXJTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGlucHV0IHNvIGZhci48L3N1bW1hcnk+CisgICAgICAgIHZpcnR1YWwgcHVibGljIGxvbmcgVG90YWxJbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzSW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyLjwvc3VtbWFyeT4KKyAgICAgICAgdmlydHVhbCBwdWJsaWMgbG9uZyBUb3RhbE91dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzT3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gU3RyZWFtIG1ldGhvZHMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIERpc3Bvc2UgdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGlzIG1heSBvciBtYXkgbm90IHJlc3VsdCBpbiBhIDxjPkNsb3NlKCk8L2M+IGNhbGwgb24gdGhlIGNhcHRpdmUKKyAgICAgICAgLy8vICAgICBzdHJlYW0uICBTZWUgdGhlIGNvbnN0cnVjdG9ycyB0aGF0IGhhdmUgYSA8Yz5sZWF2ZU9wZW48L2M+IHBhcmFtZXRlcgorICAgICAgICAvLy8gICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoaXMgbWV0aG9kIG1heSBiZSBpbnZva2VkIGluIHR3byBkaXN0aW5jdCBzY2VuYXJpb3MuICBJZiBkaXNwb3NpbmcKKyAgICAgICAgLy8vICAgICA9PSB0cnVlLCB0aGUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5IGEKKyAgICAgICAgLy8vICAgICB1c2VyJ3MgY29kZSwgZm9yIGV4YW1wbGUgdmlhIHRoZSBwdWJsaWMgRGlzcG9zZSgpIG1ldGhvZC4gSW4gdGhpcworICAgICAgICAvLy8gICAgIGNhc2UsIGJvdGggbWFuYWdlZCBhbmQgdW5tYW5hZ2VkIHJlc291cmNlcyBjYW4gYmUgcmVmZXJlbmNlZCBhbmQKKyAgICAgICAgLy8vICAgICBkaXNwb3NlZC4gIElmIGRpc3Bvc2luZyA9PSBmYWxzZSwgdGhlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgYnkgdGhlCisgICAgICAgIC8vLyAgICAgcnVudGltZSBmcm9tIGluc2lkZSB0aGUgb2JqZWN0IGZpbmFsaXplciBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdAorICAgICAgICAvLy8gICAgIHJlZmVyZW5jZSBvdGhlciBvYmplY3RzOyBpbiB0aGF0IGNhc2Ugb25seSB1bm1hbmFnZWQgcmVzb3VyY2VzIG11c3QKKyAgICAgICAgLy8vICAgICBiZSByZWZlcmVuY2VkIG9yIGRpc3Bvc2VkLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlzcG9zaW5nIj4KKyAgICAgICAgLy8vICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIERpc3Bvc2UgbWV0aG9kIHdhcyBpbnZva2VkIGJ5IHVzZXIgY29kZS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX2Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZyAmJiAodGhpcy5fYmFzZVN0cmVhbSAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFzZVN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fQ3JjMzIgPSBfYmFzZVN0cmVhbS5DcmMzMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfZGlzcG9zZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBjYW4gYmUgcmVhZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNhcHRpdmUgc3RyZWFtIHN1cHBvcnRzIHJlYWRpbmcuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iYXNlU3RyZWFtLl9zdHJlYW0uQ2FuUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gc3VwcG9ydHMgU2VlayBvcGVyYXRpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlaworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBjYW4gYmUgd3JpdHRlbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNhcHRpdmUgc3RyZWFtIHN1cHBvcnRzIHdyaXRpbmcuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOworICAgICAgICAgICAgICAgIHJldHVybiBfYmFzZVN0cmVhbS5fc3RyZWFtLkNhbldyaXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmx1c2ggdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKKyAgICAgICAgICAgIF9iYXNlU3RyZWFtLkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkaW5nIHRoaXMgcHJvcGVydHkgYWx3YXlzIHRocm93cyBhIDxzZWUgY3JlZj0iTm90SW1wbGVtZW50ZWRFeGNlcHRpb24iLz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIExlbmd0aAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgcG9zaXRpb24gb2YgdGhlIHN0cmVhbSBwb2ludGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWx3YXlzIHRocm93cyBhIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iTm90SW1wbGVtZW50ZWRFeGNlcHRpb24iLz4uIFJlYWRpbmcgd2lsbCByZXR1cm4gdGhlIHRvdGFsIGJ5dGVzCisgICAgICAgIC8vLyAgIHdyaXR0ZW4gb3V0LCBpZiB1c2VkIGluIHdyaXRpbmcsIG9yIHRoZSB0b3RhbCBieXRlcyByZWFkIGluLCBpZiB1c2VkIGluCisgICAgICAgIC8vLyAgIHJlYWRpbmcuICBUaGUgY291bnQgbWF5IHJlZmVyIHRvIGNvbXByZXNzZWQgYnl0ZXMgb3IgdW5jb21wcmVzc2VkIGJ5dGVzLAorICAgICAgICAvLy8gICBkZXBlbmRpbmcgb24gaG93IHlvdSd2ZSB1c2VkIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlU3RyZWFtLl9zdHJlYW1Nb2RlID09IElvbmljLlpsaWIuWmxpYkJhc2VTdHJlYW0uU3RyZWFtTW9kZS5Xcml0ZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlU3RyZWFtLl96LlRvdGFsQnl0ZXNPdXQgKyBfaGVhZGVyQnl0ZUNvdW50OworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlU3RyZWFtLl9zdHJlYW1Nb2RlID09IElvbmljLlpsaWIuWmxpYkJhc2VTdHJlYW0uU3RyZWFtTW9kZS5SZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlU3RyZWFtLl96LlRvdGFsQnl0ZXNJbiArIHRoaXMuX2Jhc2VTdHJlYW0uX2d6aXBIZWFkZXJCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldCB7IHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFJlYWQgYW5kIGRlY29tcHJlc3MgZGF0YSBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBXaXRoIGEgPGM+R1ppcFN0cmVhbTwvYz4sIGRlY29tcHJlc3Npb24gaXMgZG9uZSB0aHJvdWdoIHJlYWRpbmcuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIGJ5dGVbXSB3b3JraW5nID0gbmV3IGJ5dGVbV09SS0lOR19CVUZGRVJfU0laRV07CisgICAgICAgIC8vLyB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKF9Db21wcmVzc2VkRmlsZSkpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgdXNpbmcgKFN0cmVhbSBkZWNvbXByZXNzb3I9IG5ldyBJb25pYy5abGliLkdaaXBTdHJlYW0oaW5wdXQsIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzLCB0cnVlKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nICh2YXIgb3V0cHV0ID0gU3lzdGVtLklPLkZpbGUuQ3JlYXRlKF9EZWNvbXByZXNzZWRGaWxlKSkKKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgaW50IG47CisgICAgICAgIC8vLyAgICAgICAgICAgICB3aGlsZSAoKG49IGRlY29tcHJlc3Nvci5SZWFkKHdvcmtpbmcsIDAsIHdvcmtpbmcuTGVuZ3RoKSkgIT0wKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZSh3b3JraW5nLCAwLCBuKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgaW50byB3aGljaCB0aGUgZGVjb21wcmVzc2VkIGRhdGEgc2hvdWxkIGJlIHBsYWNlZC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+dGhlIG9mZnNldCB3aXRoaW4gdGhhdCBkYXRhIGFycmF5IHRvIHB1dCB0aGUgZmlyc3QgYnl0ZSByZWFkLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKKyAgICAgICAgICAgIGludCBuID0gX2Jhc2VTdHJlYW0uUmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOworCisgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiR1ppcFN0cmVhbTo6UmVhZChidWZmZXIsIG9mZih7MH0pLCBjKHsxfSkgPSB7Mn0iLCBvZmZzZXQsIGNvdW50LCBuKTsKKyAgICAgICAgICAgIC8vIENvbnNvbGUuV3JpdGVMaW5lKCBVdGlsLkZvcm1hdEJ5dGVBcnJheShidWZmZXIsIG9mZnNldCwgbikgKTsKKworICAgICAgICAgICAgaWYgKCFfZmlyc3RSZWFkRG9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZmlyc3RSZWFkRG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgRmlsZU5hbWUgPSBfYmFzZVN0cmVhbS5fR3ppcEZpbGVOYW1lOworICAgICAgICAgICAgICAgIENvbW1lbnQgPSBfYmFzZVN0cmVhbS5fR3ppcENvbW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIDxzZWUgY3JlZj0iTm90SW1wbGVtZW50ZWRFeGNlcHRpb24iLz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5pcnJlbGV2YW50OyBpdCB3aWxsIGFsd2F5cyB0aHJvdyE8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9yaWdpbiI+aXJyZWxldmFudDsgaXQgd2lsbCBhbHdheXMgdGhyb3chPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPmlycmVsZXZhbnQhPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTZWVrT3JpZ2luIG9yaWdpbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIDxzZWUgY3JlZj0iTm90SW1wbGVtZW50ZWRFeGNlcHRpb24iLz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPmlycmVsZXZhbnQ7IHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHRocm93ITwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgV3JpdGUgZGF0YSB0byB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPGM+R1ppcFN0cmVhbTwvYz4gdG8gY29tcHJlc3MgZGF0YSB3aGlsZSB3cml0aW5nLAorICAgICAgICAvLy8gICB5b3UgY2FuIGNyZWF0ZSBhIDxjPkdaaXBTdHJlYW08L2M+IHdpdGggPGM+Q29tcHJlc3Npb25Nb2RlLkNvbXByZXNzPC9jPiwgYW5kIGEKKyAgICAgICAgLy8vICAgd3JpdGFibGUgb3V0cHV0IHN0cmVhbS4gIFRoZW4gY2FsbCA8Yz5Xcml0ZSgpPC9jPiBvbiB0aGF0IDxjPkdaaXBTdHJlYW08L2M+LAorICAgICAgICAvLy8gICBwcm92aWRpbmcgdW5jb21wcmVzc2VkIGRhdGEgYXMgaW5wdXQuICBUaGUgZGF0YSBzZW50IHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgIC8vLyAgIHdpbGwgYmUgdGhlIGNvbXByZXNzZWQgZm9ybSBvZiB0aGUgZGF0YSB3cml0dGVuLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBIDxjPkdaaXBTdHJlYW08L2M+IGNhbiBiZSB1c2VkIGZvciA8Yz5SZWFkKCk8L2M+IG9yIDxjPldyaXRlKCk8L2M+LCBidXQgbm90CisgICAgICAgIC8vLyAgIGJvdGguIFdyaXRpbmcgaW1wbGllcyBjb21wcmVzc2lvbi4gIFJlYWRpbmcgaW1wbGllcyBkZWNvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgaG9sZGluZyBkYXRhIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZGF0YSBhcnJheSB0byBmaW5kIHRoZSBmaXJzdCBieXRlIHRvIHdyaXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsKKyAgICAgICAgICAgIGlmIChfYmFzZVN0cmVhbS5fc3RyZWFtTW9kZSA9PSBJb25pYy5abGliLlpsaWJCYXNlU3RyZWFtLlN0cmVhbU1vZGUuVW5kZWZpbmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ29uc29sZS5Xcml0ZUxpbmUoIkdaaXBTdHJlYW06IEZpcnN0IHdyaXRlIik7CisgICAgICAgICAgICAgICAgaWYgKF9iYXNlU3RyZWFtLl93YW50Q29tcHJlc3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB3cml0ZSBpbiBjb21wcmVzc2lvbiwgdGhlcmVmb3JlLCBlbWl0IHRoZSBHWklQIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICBfaGVhZGVyQnl0ZUNvdW50ID0gRW1pdEhlYWRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2Jhc2VTdHJlYW0uV3JpdGUoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgU3lzdGVtLkRhdGVUaW1lIF91bml4RXBvY2ggPSBuZXcgU3lzdGVtLkRhdGVUaW1lKDE5NzAsIDEsIDEsIDAsIDAsIDAsIERhdGVUaW1lS2luZC5VdGMpOworI2lmIFNJTFZFUkxJR0hUIHx8IE5FVENGCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBTeXN0ZW0uVGV4dC5FbmNvZGluZyBpc284ODU5ZGFzaDEgPSBuZXcgSW9uaWMuRW5jb2RpbmcuSXNvODg1OURhc2gxRW5jb2RpbmcoKTsKKyNlbHNlCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBTeXN0ZW0uVGV4dC5FbmNvZGluZyBpc284ODU5ZGFzaDEgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZygiaXNvLTg4NTktMSIpOworI2VuZGlmCisKKworICAgICAgICBwcml2YXRlIGludCBFbWl0SGVhZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGNvbW1lbnRCeXRlcyA9IChDb21tZW50ID09IG51bGwpID8gbnVsbCA6IGlzbzg4NTlkYXNoMS5HZXRCeXRlcyhDb21tZW50KTsKKyAgICAgICAgICAgIGJ5dGVbXSBmaWxlbmFtZUJ5dGVzID0gKEZpbGVOYW1lID09IG51bGwpID8gbnVsbCA6IGlzbzg4NTlkYXNoMS5HZXRCeXRlcyhGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIGludCBjYkxlbmd0aCA9IChDb21tZW50ID09IG51bGwpID8gMCA6IGNvbW1lbnRCeXRlcy5MZW5ndGggKyAxOworICAgICAgICAgICAgaW50IGZuTGVuZ3RoID0gKEZpbGVOYW1lID09IG51bGwpID8gMCA6IGZpbGVuYW1lQnl0ZXMuTGVuZ3RoICsgMTsKKworICAgICAgICAgICAgaW50IGJ1ZmZlckxlbmd0aCA9IDEwICsgY2JMZW5ndGggKyBmbkxlbmd0aDsKKyAgICAgICAgICAgIGJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVtidWZmZXJMZW5ndGhdOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgLy8gSUQKKyAgICAgICAgICAgIGhlYWRlcltpKytdID0gMHgxRjsKKyAgICAgICAgICAgIGhlYWRlcltpKytdID0gMHg4QjsKKworICAgICAgICAgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgICAgICBoZWFkZXJbaSsrXSA9IDg7CisgICAgICAgICAgICBieXRlIGZsYWcgPSAwOworICAgICAgICAgICAgaWYgKENvbW1lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmbGFnIF49IDB4MTA7CisgICAgICAgICAgICBpZiAoRmlsZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmbGFnIF49IDB4ODsKKworICAgICAgICAgICAgLy8gZmxhZworICAgICAgICAgICAgaGVhZGVyW2krK10gPSBmbGFnOworCisgICAgICAgICAgICAvLyBtdGltZQorICAgICAgICAgICAgaWYgKCFMYXN0TW9kaWZpZWQuSGFzVmFsdWUpIExhc3RNb2RpZmllZCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIFN5c3RlbS5UaW1lU3BhbiBkZWx0YSA9IExhc3RNb2RpZmllZC5WYWx1ZSAtIF91bml4RXBvY2g7CisgICAgICAgICAgICBJbnQzMiB0aW1ldCA9IChJbnQzMilkZWx0YS5Ub3RhbFNlY29uZHM7CisgICAgICAgICAgICBBcnJheS5Db3B5KEJpdENvbnZlcnRlci5HZXRCeXRlcyh0aW1ldCksIDAsIGhlYWRlciwgaSwgNCk7CisgICAgICAgICAgICBpICs9IDQ7CisKKyAgICAgICAgICAgIC8vIHhmbGcKKyAgICAgICAgICAgIGhlYWRlcltpKytdID0gMDsgICAgLy8gdGhpcyBmaWVsZCBpcyB0b3RhbGx5IHVzZWxlc3MKKyAgICAgICAgICAgIC8vIE9TCisgICAgICAgICAgICBoZWFkZXJbaSsrXSA9IDB4RkY7IC8vIDB4RkYgPT0gdW5zcGVjaWZpZWQKKworICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoIC0gb25seSBpZiBGRVhUUkEgaXMgc2V0LCB3aGljaCBpdCBpcyBub3QuCisgICAgICAgICAgICAvL2hlYWRlcltpKytdPSAwOworICAgICAgICAgICAgLy9oZWFkZXJbaSsrXT0gMDsKKworICAgICAgICAgICAgLy8gZmlsZW5hbWUKKyAgICAgICAgICAgIGlmIChmbkxlbmd0aCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoZmlsZW5hbWVCeXRlcywgMCwgaGVhZGVyLCBpLCBmbkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIGkgKz0gZm5MZW5ndGggLSAxOworICAgICAgICAgICAgICAgIGhlYWRlcltpKytdID0gMDsgLy8gdGVybWluYXRlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbW1lbnQKKyAgICAgICAgICAgIGlmIChjYkxlbmd0aCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoY29tbWVudEJ5dGVzLCAwLCBoZWFkZXIsIGksIGNiTGVuZ3RoIC0gMSk7CisgICAgICAgICAgICAgICAgaSArPSBjYkxlbmd0aCAtIDE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2krK10gPSAwOyAvLyB0ZXJtaW5hdGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2Jhc2VTdHJlYW0uX3N0cmVhbS5Xcml0ZShoZWFkZXIsIDAsIGhlYWRlci5MZW5ndGgpOworCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyLkxlbmd0aDsgLy8gYnl0ZXMgd3JpdHRlbgorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ29tcHJlc3MgYSBzdHJpbmcgaW50byBhIGJ5dGUgYXJyYXkgdXNpbmcgR1ppcC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVW5jb21wcmVzcyBpdCB3aXRoIDxzZWUgY3JlZj0iR1ppcFN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSkiLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iR1ppcFN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSkiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkdaaXBTdHJlYW0uQ29tcHJlc3NCdWZmZXIoYnl0ZVtdKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj4KKyAgICAgICAgLy8vICAgQSBzdHJpbmcgdG8gY29tcHJlc3MuIFRoZSBzdHJpbmcgd2lsbCBmaXJzdCBiZSBlbmNvZGVkCisgICAgICAgIC8vLyAgIHVzaW5nIFVURjgsIHRoZW4gY29tcHJlc3NlZC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIHN0cmluZyBpbiBjb21wcmVzc2VkIGZvcm08L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIENvbXByZXNzU3RyaW5nKFN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5JTy5TdHJlYW0gY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBHWmlwU3RyZWFtKG1zLCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBabGliQmFzZVN0cmVhbS5Db21wcmVzc1N0cmluZyhzLCBjb21wcmVzc29yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENvbXByZXNzIGEgYnl0ZSBhcnJheSBpbnRvIGEgbmV3IGJ5dGUgYXJyYXkgdXNpbmcgR1ppcC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVW5jb21wcmVzcyBpdCB3aXRoIDxzZWUgY3JlZj0iR1ppcFN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iR1ppcFN0cmVhbS5Db21wcmVzc1N0cmluZyhzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJHWmlwU3RyZWFtLlVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj4KKyAgICAgICAgLy8vICAgQSBidWZmZXIgdG8gY29tcHJlc3MuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBkYXRhIGluIGNvbXByZXNzZWQgZm9ybTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gQ29tcHJlc3NCdWZmZXIoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLklPLlN0cmVhbSBjb21wcmVzc29yID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEdaaXBTdHJlYW0oIG1zLCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uICk7CisKKyAgICAgICAgICAgICAgICBabGliQmFzZVN0cmVhbS5Db21wcmVzc0J1ZmZlcihiLCBjb21wcmVzc29yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFVuY29tcHJlc3MgYSBHWmlwJ2VkIGJ5dGUgYXJyYXkgaW50byBhIHNpbmdsZSBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iR1ppcFN0cmVhbS5Db21wcmVzc1N0cmluZyhTdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJHWmlwU3RyZWFtLlVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb21wcmVzc2VkIj4KKyAgICAgICAgLy8vICAgQSBidWZmZXIgY29udGFpbmluZyBHWklQLWNvbXByZXNzZWQgZGF0YS4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIHVuY29tcHJlc3NlZCBzdHJpbmc8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuY29tcHJlc3NTdHJpbmcoYnl0ZVtdIGNvbXByZXNzZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgaW5wdXQgPSBuZXcgTWVtb3J5U3RyZWFtKGNvbXByZXNzZWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmVhbSBkZWNvbXByZXNzb3IgPSBuZXcgR1ppcFN0cmVhbShpbnB1dCwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MpOworICAgICAgICAgICAgICAgIHJldHVybiBabGliQmFzZVN0cmVhbS5VbmNvbXByZXNzU3RyaW5nKGNvbXByZXNzZWQsIGRlY29tcHJlc3Nvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVW5jb21wcmVzcyBhIEdaaXAnZWQgYnl0ZSBhcnJheSBpbnRvIGEgYnl0ZSBhcnJheS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJHWmlwU3RyZWFtLkNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkdaaXBTdHJlYW0uVW5jb21wcmVzc1N0cmluZyhieXRlW10pIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbXByZXNzZWQiPgorICAgICAgICAvLy8gICBBIGJ1ZmZlciBjb250YWluaW5nIGRhdGEgdGhhdCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggR1ppcC4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRhdGEgaW4gdW5jb21wcmVzc2VkIGZvcm08L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdIGNvbXByZXNzZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgaW5wdXQgPSBuZXcgU3lzdGVtLklPLk1lbW9yeVN0cmVhbShjb21wcmVzc2VkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uSU8uU3RyZWFtIGRlY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBHWmlwU3RyZWFtKCBpbnB1dCwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBabGliQmFzZVN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGNvbXByZXNzZWQsIGRlY29tcHJlc3Nvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9JbmZUcmVlLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9JbmZUcmVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTI5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL0luZlRyZWUuY3MKQEAgLTAsMCArMSw0MzYgQEAKKy8vIEluZnRyZWUuY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOSBEaW5vIENoaWVzYSBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLiAKKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6IAorLy8gVGltZS1zdGFtcDogPDIwMDktT2N0b2Jlci0yOCAxMjo0Mzo1ND4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIGNsYXNzZXMgdXNlZCBpbiAgZGVjb21wcmVzc2lvbi4gVGhpcyBjb2RlIGlzIGRlcml2ZWQKKy8vIGZyb20gdGhlIGp6bGliIGltcGxlbWVudGF0aW9uIG9mIHpsaWIuIEluIGtlZXBpbmcgd2l0aCB0aGUgbGljZW5zZSBmb3IganpsaWIsIAorLy8gdGhlIGNvcHlyaWdodCB0byB0aGF0IGNvZGUgaXMgYmVsb3cuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAKKy8vIENvcHlyaWdodCAoYykgMjAwMCwyMDAxLDIwMDIsMjAwMyB5bW5rLCBKQ3JhZnQsSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKy8vIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKKy8vIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBKQ1JBRlQsCisvLyBJTkMuIE9SIEFOWSBDT05UUklCVVRPUlMgVE8gVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCisvLyBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisvLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworLy8gTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorLy8gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24gemxpYi0xLjEuMzsgY3JlZGl0IHRvIGF1dGhvcnMKKy8vIEplYW4tbG91cCBHYWlsbHkoamxvdXBAZ3ppcC5vcmcpIGFuZCBNYXJrIEFkbGVyKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpCisvLyBhbmQgY29udHJpYnV0b3JzIG9mIHpsaWIuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKK3VzaW5nIFN5c3RlbTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliCit7CisgICAgICAgIAorICAgICAgICBzZWFsZWQgY2xhc3MgSW5mVHJlZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgTUFOWSA9IDE0NDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgWl9PSyA9IDA7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgWl9TVFJFQU1fRU5EID0gMTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGNvbnN0IGludCBaX05FRURfRElDVCA9IDI7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgWl9FUlJOTyA9IC0gMTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGNvbnN0IGludCBaX1NUUkVBTV9FUlJPUiA9IC0gMjsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGNvbnN0IGludCBaX0RBVEFfRVJST1IgPSAtIDM7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgWl9NRU1fRVJST1IgPSAtIDQ7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgWl9CVUZfRVJST1IgPSAtIDU7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgWl9WRVJTSU9OX0VSUk9SID0gLSA2OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludGVybmFsIGNvbnN0IGludCBmaXhlZF9ibCA9IDk7CisgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IGZpeGVkX2JkID0gNTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL1VQR1JBREVfTk9URTogRmluYWwgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZGVjbGFyYXRpb24gb2YgJ2ZpeGVkX3RsJy4gIm1zLWhlbHA6Ly9NUy5WU0NDLnY4MC9kdl9jb21tb25lci9sb2NhbC9yZWRpcmVjdC5odG0/aW5kZXg9JyFEZWZhdWx0Q29udGV4dFdpbmRvd0luZGV4JyZrZXl3b3JkPSdqbGNhMTAwMyciCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludFtdIGZpeGVkX3RsID0gbmV3IGludFtdezk2LCA3LCAyNTYsIDAsIDgsIDgwLCAwLCA4LCAxNiwgODQsIDgsIDExNSwgODIsIDcsIDMxLCAwLCA4LCAxMTIsIDAsIDgsIDQ4LCAwLCA5LCAxOTIsIDgwLCA3LCAxMCwgMCwgOCwgOTYsIDAsIDgsIDMyLCAwLCA5LCAxNjAsIDAsIDgsIDAsIDAsIDgsIDEyOCwgMCwgOCwgNjQsIDAsIDksIDIyNCwgODAsIDcsIDYsIDAsIDgsIDg4LCAwLCA4LCAyNCwgMCwgOSwgMTQ0LCA4MywgNywgNTksIDAsIDgsIDEyMCwgMCwgOCwgNTYsIDAsIDksIDIwOCwgODEsIDcsIDE3LCAwLCA4LCAxMDQsIDAsIDgsIDQwLCAwLCA5LCAxNzYsIDAsIDgsIDgsIDAsIDgsIDEzNiwgMCwgOCwgNzIsIDAsIDksIDI0MCwgODAsIDcsIDQsIDAsIDgsIDg0LCAwLCA4LCAyMCwgODUsIDgsIDIyNywgODMsIDcsIDQzLCAwLCA4LCAxMTYsIDAsIDgsIDUyLCAwLCA5LCAyMDAsIDgxLCA3LCAxMywgMCwgOCwgMTAwLCAwLCA4LCAzNiwgMCwgOSwgMTY4LCAwLCA4LCA0LCAwLCA4LCAxMzIsIDAsIDgsIDY4LCAwLCA5LCAyMzIsIDgwLCA3LCA4LCAwLCA4LCA5MiwgMCwgOCwgMjgsIDAsIDksIDE1MiwgODQsIDcsIDgzLCAwLCA4LCAxMjQsIDAsIDgsIDYwLCAwLCA5LCAyMTYsIDgyLCA3LCAyMywgMCwgOCwgMTA4LCAwLCA4LCA0NCwgMCwgOSwgMTg0LCAwLCA4LCAxMiwgMCwgOCwgMTQwLCAwLCA4LCA3NiwgMCwgOSwgMjQ4LCA4MCwgNywgMywgMCwgOCwgODIsIDAsIDgsIDE4LCA4NSwgOCwgMTYzLCA4MywgNywgMzUsIDAsIDgsIDExNCwgMCwgOCwgNTAsIDAsIDksIDE5NiwgODEsIDcsIDExLCAwLCA4LCA5OCwgMCwgOCwgMzQsIDAsIDksIDE2NCwgMCwgOCwgMiwgMCwgOCwgMTMwLCAwLCA4LCA2NiwgMCwgOSwgMjI4LCA4MCwgNywgNywgMCwgOCwgOTAsIDAsIDgsIDI2LCAwLCA5LCAxNDgsIDg0LCA3LCA2NywgMCwgOCwgMTIyLCAwLCA4LCA1OCwgMCwgOSwgMjEyLCA4MiwgNywgMTksIDAsIDgsIDEwNiwgMCwgOCwgNDIsIDAsIDksIDE4MCwgMCwgOCwgMTAsIDAsIDgsIDEzOCwgMCwgOCwgNzQsIDAsIDksIDI0NCwgODAsIDcsIDUsIDAsIDgsIDg2LCAwLCA4LCAyMiwgMTkyLCA4LCAwLCA4MywgNywgNTEsIDAsIDgsIDExOCwgMCwgOCwgNTQsIDAsIDksIDIwNCwgODEsIDcsIDE1LCAwLCA4LCAxMDIsIDAsIDgsIDM4LCAwLCA5LCAxNzIsIDAsIDgsIDYsIDAsIDgsIDEzNCwgMCwgOCwgNzAsIDAsIDksIDIzNiwgODAsIDcsIDksIDAsIDgsIDk0LCAwLCA4LCAzMCwgMCwgOSwgMTU2LCA4NCwgNywgOTksIDAsIDgsIDEyNiwgMCwgOCwgNjIsIDAsIDksIDIyMCwgODIsIDcsIDI3LCAwLCA4LCAxMTAsIDAsIDgsIDQ2LCAwLCA5LCAxODgsIDAsIDgsIDE0LCAwLCA4LCAxNDIsIDAsIDgsIDc4LCAwLCA5LCAyNTIsIDk2LCA3LCAyNTYsIDAsIDgsIDgxLCAwLCA4LCAxNywgODUsIDgsIDEzMSwgODIsIDcsIDMxLCAwLCA4LCAxMTMsIDAsIDgsIDQ5LCAwLCA5LCAxOTQsIDgwLCA3LCAxMCwgMCwgOCwgOTcsIDAsIDgsIDMzLCAwLCA5LCAxNjIsIDAsIDgsIDEsIDAsIDgsIDEyOSwgMCwgOCwgNjUsIDAsIDksIDIyNiwgODAsIDcsIDYsIDAsIDgsIDg5LCAwLCA4LCAyNSwgMCwgOSwgMTQ2LCA4MywgNywgNTksIDAsIDgsIDEyMSwgMCwgOCwgNTcsIDAsIDksIDIxMCwgODEsIDcsIDE3LCAwLCA4LCAxMDUsIDAsIDgsIDQxLCAwLCA5LCAxNzgsIDAsIDgsIDksIDAsIDgsIDEzNywgMCwgOCwgNzMsIDAsIDksIDI0MiwgODAsIDcsIDQsIDAsIDgsIDg1LCAwLCA4LCAyMSwgODAsIDgsIDI1OCwgODMsIDcsIDQzLCAwLCA4LCAxMTcsIDAsIDgsIDUzLCAwLCA5LCAyMDIsIDgxLCA3LCAxMywgMCwgOCwgMTAxLCAwLCA4LCAzNywgMCwgOSwgMTcwLCAwLCA4LCA1LCAwLCA4LCAxMzMsIDAsIDgsIDY5LCAwLCA5LCAyMzQsIDgwLCA3LCA4LCAwLCA4LCA5MywgMCwgOCwgMjksIDAsIDksIDE1NCwgODQsIDcsIDgzLCAwLCA4LCAxMjUsIDAsIDgsIDYxLCAwLCA5LCAyMTgsIDgyLCA3LCAyMywgMCwgOCwgMTA5LCAwLCA4LCA0NSwgMCwgOSwgMTg2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDgsIDEzLCAwLCA4LCAxNDEsIDAsIDgsIDc3LCAwLCA5LCAyNTAsIDgwLCA3LCAzLCAwLCA4LCA4MywgMCwgOCwgMTksIDg1LCA4LCAxOTUsIDgzLCA3LCAzNSwgMCwgOCwgMTE1LCAwLCA4LCA1MSwgMCwgOSwgMTk4LCA4MSwgNywgMTEsIDAsIDgsIDk5LCAwLCA4LCAzNSwgMCwgOSwgMTY2LCAwLCA4LCAzLCAwLCA4LCAxMzEsIDAsIDgsIDY3LCAwLCA5LCAyMzAsIDgwLCA3LCA3LCAwLCA4LCA5MSwgMCwgOCwgMjcsIDAsIDksIDE1MCwgODQsIDcsIDY3LCAwLCA4LCAxMjMsIDAsIDgsIDU5LCAwLCA5LCAyMTQsIDgyLCA3LCAxOSwgMCwgOCwgMTA3LCAwLCA4LCA0MywgMCwgOSwgMTgyLCAwLCA4LCAxMSwgMCwgOCwgMTM5LCAwLCA4LCA3NSwgMCwgOSwgMjQ2LCA4MCwgNywgNSwgMCwgOCwgODcsIDAsIDgsIDIzLCAxOTIsIDgsIDAsIDgzLCA3LCA1MSwgMCwgOCwgMTE5LCAwLCA4LCA1NSwgMCwgOSwgMjA2LCA4MSwgNywgMTUsIDAsIDgsIDEwMywgMCwgOCwgMzksIDAsIDksIDE3NCwgMCwgOCwgNywgMCwgOCwgMTM1LCAwLCA4LCA3MSwgMCwgOSwgMjM4LCA4MCwgNywgOSwgMCwgOCwgOTUsIDAsIDgsIDMxLCAwLCA5LCAxNTgsIDg0LCA3LCA5OSwgMCwgOCwgMTI3LCAwLCA4LCA2MywgMCwgOSwgMjIyLCA4MiwgNywgMjcsIDAsIDgsIDExMSwgMCwgOCwgNDcsIDAsIDksIDE5MCwgMCwgOCwgMTUsIDAsIDgsIDE0MywgMCwgOCwgNzksIDAsIDksIDI1NCwgOTYsIDcsIDI1NiwgMCwgOCwgODAsIDAsIDgsIDE2LCA4NCwgOCwgMTE1LCA4MiwgNywgMzEsIDAsIDgsIDExMiwgMCwgOCwgNDgsIDAsIDksIDE5MywgODAsIDcsIDEwLCAwLCA4LCA5NiwgMCwgOCwgMzIsIDAsIDksIDE2MSwgMCwgOCwgMCwgMCwgOCwgMTI4LCAwLCA4LCA2NCwgMCwgOSwgMjI1LCA4MCwgNywgNiwgMCwgOCwgODgsIDAsIDgsIDI0LCAwLCA5LCAxNDUsIDgzLCA3LCA1OSwgMCwgOCwgMTIwLCAwLCA4LCA1NiwgMCwgOSwgMjA5LCA4MSwgNywgMTcsIDAsIDgsIDEwNCwgMCwgOCwgNDAsIDAsIDksIDE3NywgMCwgOCwgOCwgMCwgOCwgMTM2LCAwLCA4LCA3MiwgMCwgOSwgMjQxLCA4MCwgNywgNCwgMCwgOCwgODQsIDAsIDgsIDIwLCA4NSwgOCwgMjI3LCA4MywgNywgNDMsIDAsIDgsIDExNiwgMCwgOCwgNTIsIDAsIDksIDIwMSwgODEsIDcsIDEzLCAwLCA4LCAxMDAsIDAsIDgsIDM2LCAwLCA5LCAxNjksIDAsIDgsIDQsIDAsIDgsIDEzMiwgMCwgOCwgNjgsIDAsIDksIDIzMywgODAsIDcsIDgsIDAsIDgsIDkyLCAwLCA4LCAyOCwgMCwgOSwgMTUzLCA4NCwgNywgODMsIDAsIDgsIDEyNCwgMCwgOCwgNjAsIDAsIDksIDIxNywgODIsIDcsIDIzLCAwLCA4LCAxMDgsIDAsIDgsIDQ0LCAwLCA5LCAxODUsIDAsIDgsIDEyLCAwLCA4LCAxNDAsIDAsIDgsIDc2LCAwLCA5LCAyNDksIDgwLCA3LCAzLCAwLCA4LCA4MiwgMCwgOCwgMTgsIDg1LCA4LCAxNjMsIDgzLCA3LCAzNSwgMCwgOCwgMTE0LCAwLCA4LCA1MCwgMCwgOSwgMTk3LCA4MSwgNywgMTEsIDAsIDgsIDk4LCAwLCA4LCAzNCwgMCwgOSwgMTY1LCAwLCA4LCAyLCAwLCA4LCAxMzAsIDAsIDgsIDY2LCAwLCA5LCAyMjksIDgwLCA3LCA3LCAwLCA4LCA5MCwgMCwgOCwgMjYsIDAsIDksIDE0OSwgODQsIDcsIDY3LCAwLCA4LCAxMjIsIDAsIDgsIDU4LCAwLCA5LCAyMTMsIDgyLCA3LCAxOSwgMCwgOCwgMTA2LCAwLCA4LCA0MiwgMCwgOSwgMTgxLCAwLCA4LCAxMCwgMCwgOCwgMTM4LCAwLCA4LCA3NCwgMCwgOSwgMjQ1LCA4MCwgNywgNSwgMCwgOCwgODYsIDAsIDgsIDIyLCAxOTIsIDgsIDAsIDgzLCA3LCA1MSwgMCwgOCwgMTE4LCAwLCA4LCA1NCwgMCwgOSwgMjA1LCA4MSwgNywgMTUsIDAsIDgsIDEwMiwgMCwgOCwgMzgsIDAsIDksIDE3MywgMCwgOCwgNiwgMCwgOCwgMTM0LCAwLCA4LCA3MCwgMCwgOSwgMjM3LCA4MCwgNywgOSwgMCwgOCwgOTQsIDAsIDgsIDMwLCAwLCA5LCAxNTcsIDg0LCA3LCA5OSwgMCwgOCwgMTI2LCAwLCA4LCA2MiwgMCwgOSwgMjIxLCA4MiwgNywgMjcsIDAsIDgsIDExMCwgMCwgOCwgNDYsIDAsIDksIDE4OSwgMCwgOCwgCisgICAgICAgICAgICAgICAgICAgICAgICAxNCwgMCwgOCwgMTQyLCAwLCA4LCA3OCwgMCwgOSwgMjUzLCA5NiwgNywgMjU2LCAwLCA4LCA4MSwgMCwgOCwgMTcsIDg1LCA4LCAxMzEsIDgyLCA3LCAzMSwgMCwgOCwgMTEzLCAwLCA4LCA0OSwgMCwgOSwgMTk1LCA4MCwgNywgMTAsIDAsIDgsIDk3LCAwLCA4LCAzMywgMCwgOSwgMTYzLCAwLCA4LCAxLCAwLCA4LCAxMjksIDAsIDgsIDY1LCAwLCA5LCAyMjcsIDgwLCA3LCA2LCAwLCA4LCA4OSwgMCwgOCwgMjUsIDAsIDksIDE0NywgODMsIDcsIDU5LCAwLCA4LCAxMjEsIDAsIDgsIDU3LCAwLCA5LCAyMTEsIDgxLCA3LCAxNywgMCwgOCwgMTA1LCAwLCA4LCA0MSwgMCwgOSwgMTc5LCAwLCA4LCA5LCAwLCA4LCAxMzcsIDAsIDgsIDczLCAwLCA5LCAyNDMsIDgwLCA3LCA0LCAwLCA4LCA4NSwgMCwgOCwgMjEsIDgwLCA4LCAyNTgsIDgzLCA3LCA0MywgMCwgOCwgMTE3LCAwLCA4LCA1MywgMCwgOSwgMjAzLCA4MSwgNywgMTMsIDAsIDgsIDEwMSwgMCwgOCwgMzcsIDAsIDksIDE3MSwgMCwgOCwgNSwgMCwgOCwgMTMzLCAwLCA4LCA2OSwgMCwgOSwgMjM1LCA4MCwgNywgOCwgMCwgOCwgOTMsIDAsIDgsIDI5LCAwLCA5LCAxNTUsIDg0LCA3LCA4MywgMCwgOCwgMTI1LCAwLCA4LCA2MSwgMCwgOSwgMjE5LCA4MiwgNywgMjMsIDAsIDgsIDEwOSwgMCwgOCwgNDUsIDAsIDksIDE4NywgMCwgOCwgMTMsIDAsIDgsIDE0MSwgMCwgOCwgNzcsIDAsIDksIDI1MSwgODAsIDcsIDMsIDAsIDgsIDgzLCAwLCA4LCAxOSwgODUsIDgsIDE5NSwgODMsIDcsIDM1LCAwLCA4LCAxMTUsIDAsIDgsIDUxLCAwLCA5LCAxOTksIDgxLCA3LCAxMSwgMCwgOCwgOTksIDAsIDgsIDM1LCAwLCA5LCAxNjcsIDAsIDgsIDMsIDAsIDgsIDEzMSwgMCwgOCwgNjcsIDAsIDksIDIzMSwgODAsIDcsIDcsIDAsIDgsIDkxLCAwLCA4LCAyNywgMCwgOSwgMTUxLCA4NCwgNywgNjcsIDAsIDgsIDEyMywgMCwgOCwgNTksIDAsIDksIDIxNSwgODIsIDcsIDE5LCAwLCA4LCAxMDcsIDAsIDgsIDQzLCAwLCA5LCAxODMsIDAsIDgsIDExLCAwLCA4LCAxMzksIDAsIDgsIDc1LCAwLCA5LCAyNDcsIDgwLCA3LCA1LCAwLCA4LCA4NywgMCwgOCwgMjMsIDE5MiwgOCwgMCwgODMsIDcsIDUxLCAwLCA4LCAxMTksIDAsIDgsIDU1LCAwLCA5LCAyMDcsIDgxLCA3LCAxNSwgMCwgOCwgMTAzLCAwLCA4LCAzOSwgMCwgOSwgMTc1LCAwLCA4LCA3LCAwLCA4LCAxMzUsIDAsIDgsIDcxLCAwLCA5LCAyMzksIDgwLCA3LCA5LCAwLCA4LCA5NSwgMCwgOCwgMzEsIDAsIDksIDE1OSwgODQsIDcsIDk5LCAwLCA4LCAxMjcsIDAsIDgsIDYzLCAwLCA5LCAyMjMsIDgyLCA3LCAyNywgMCwgOCwgMTExLCAwLCA4LCA0NywgMCwgOSwgMTkxLCAwLCA4LCAxNSwgMCwgOCwgMTQzLCAwLCA4LCA3OSwgMCwgOSwgMjU1fTsKKyAgICAgICAgICAgICAgICAvL1VQR1JBREVfTk9URTogRmluYWwgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZGVjbGFyYXRpb24gb2YgJ2ZpeGVkX3RkJy4gIm1zLWhlbHA6Ly9NUy5WU0NDLnY4MC9kdl9jb21tb25lci9sb2NhbC9yZWRpcmVjdC5odG0/aW5kZXg9JyFEZWZhdWx0Q29udGV4dFdpbmRvd0luZGV4JyZrZXl3b3JkPSdqbGNhMTAwMyciCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludFtdIGZpeGVkX3RkID0gbmV3IGludFtdezgwLCA1LCAxLCA4NywgNSwgMjU3LCA4MywgNSwgMTcsIDkxLCA1LCA0MDk3LCA4MSwgNSwgNSwgODksIDUsIDEwMjUsIDg1LCA1LCA2NSwgOTMsIDUsIDE2Mzg1LCA4MCwgNSwgMywgODgsIDUsIDUxMywgODQsIDUsIDMzLCA5MiwgNSwgODE5MywgODIsIDUsIDksIDkwLCA1LCAyMDQ5LCA4NiwgNSwgMTI5LCAxOTIsIDUsIDI0NTc3LCA4MCwgNSwgMiwgODcsIDUsIDM4NSwgODMsIDUsIDI1LCA5MSwgNSwgNjE0NSwgODEsIDUsIDcsIDg5LCA1LCAxNTM3LCA4NSwgNSwgOTcsIDkzLCA1LCAyNDU3NywgODAsIDUsIDQsIDg4LCA1LCA3NjksIDg0LCA1LCA0OSwgOTIsIDUsIDEyMjg5LCA4MiwgNSwgMTMsIDkwLCA1LCAzMDczLCA4NiwgNSwgMTkzLCAxOTIsIDUsIDI0NTc3fTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUYWJsZXMgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LgorICAgICAgICAgICAgICAgIC8vVVBHUkFERV9OT1RFOiBGaW5hbCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBkZWNsYXJhdGlvbiBvZiAnY3BsZW5zJy4gIm1zLWhlbHA6Ly9NUy5WU0NDLnY4MC9kdl9jb21tb25lci9sb2NhbC9yZWRpcmVjdC5odG0/aW5kZXg9JyFEZWZhdWx0Q29udGV4dFdpbmRvd0luZGV4JyZrZXl3b3JkPSdqbGNhMTAwMyciCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludFtdIGNwbGVucyA9IG5ldyBpbnRbXXszLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLCAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gc2VlIG5vdGUgIzEzIGFib3ZlIGFib3V0IDI1OAorICAgICAgICAgICAgICAgIC8vVVBHUkFERV9OT1RFOiBGaW5hbCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBkZWNsYXJhdGlvbiBvZiAnY3BsZXh0Jy4gIm1zLWhlbHA6Ly9NUy5WU0NDLnY4MC9kdl9jb21tb25lci9sb2NhbC9yZWRpcmVjdC5odG0/aW5kZXg9JyFEZWZhdWx0Q29udGV4dFdpbmRvd0luZGV4JyZrZXl3b3JkPSdqbGNhMTAwMyciCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludFtdIGNwbGV4dCA9IG5ldyBpbnRbXXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCAxMTIsIDExMn07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9VUEdSQURFX05PVEU6IEZpbmFsIHdhcyByZW1vdmVkIGZyb20gdGhlIGRlY2xhcmF0aW9uIG9mICdjcGRpc3QnLiAibXMtaGVscDovL01TLlZTQ0MudjgwL2R2X2NvbW1vbmVyL2xvY2FsL3JlZGlyZWN0Lmh0bT9pbmRleD0nIURlZmF1bHRDb250ZXh0V2luZG93SW5kZXgnJmtleXdvcmQ9J2psY2ExMDAzJyIKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50W10gY3BkaXN0ID0gbmV3IGludFtdezEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LCA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL1VQR1JBREVfTk9URTogRmluYWwgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZGVjbGFyYXRpb24gb2YgJ2NwZGV4dCcuICJtcy1oZWxwOi8vTVMuVlNDQy52ODAvZHZfY29tbW9uZXIvbG9jYWwvcmVkaXJlY3QuaHRtP2luZGV4PSchRGVmYXVsdENvbnRleHRXaW5kb3dJbmRleCcma2V5d29yZD0namxjYTEwMDMnIgorICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnRbXSBjcGRleHQgPSBuZXcgaW50W117MCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzfTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiBCTUFYIG5lZWRzIHRvIGJlIGxhcmdlciB0aGFuIDE2LCB0aGVuIGggYW5kIHhbXSBzaG91bGQgYmUgdUxvbmcuCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IEJNQVggPSAxNTsgLy8gbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGFueSBjb2RlCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgaW50W10gaG4gPSBudWxsOyAvLyBodWZ0cyB1c2VkIGluIHNwYWNlCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgaW50W10gdiA9IG51bGw7IC8vIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBpbnRbXSBjID0gbnVsbDsgLy8gYml0IGxlbmd0aCBjb3VudCB0YWJsZQorICAgICAgICAgICAgICAgIGludGVybmFsIGludFtdIHIgPSBudWxsOyAvLyB0YWJsZSBlbnRyeSBmb3Igc3RydWN0dXJlIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBpbnRbXSB1ID0gbnVsbDsgLy8gdGFibGUgc3RhY2sKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBpbnRbXSB4ID0gbnVsbDsgLy8gYml0IG9mZnNldHMsIHRoZW4gY29kZSBzdGFjaworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IGh1ZnRfYnVpbGQoaW50W10gYiwgaW50IGJpbmRleCwgaW50IG4sIGludCBzLCBpbnRbXSBkLCBpbnRbXSBlLCBpbnRbXSB0LCBpbnRbXSBtLCBpbnRbXSBocCwgaW50W10gaG4sIGludFtdIHYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2l2ZW4gYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBhbmQgYSBtYXhpbXVtIHRhYmxlIHNpemUsIG1ha2UgYSBzZXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlcyB0byBkZWNvZGUgdGhhdCBzZXQgb2YgY29kZXMuICBSZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGdpdmVuIGNvZGUgc2V0IGlzIGluY29tcGxldGUgKHRoZSB0YWJsZXMgYXJlIHN0aWxsIGJ1aWx0IGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UpLCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGlzIGludmFsaWQgKGFuIG92ZXItc3Vic2NyaWJlZCBzZXQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aHMpLCBvciBaX01FTV9FUlJPUiBpZiBub3QgZW5vdWdoIG1lbW9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGE7IC8vIGNvdW50ZXIgZm9yIGNvZGVzIG9mIGxlbmd0aCBrCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZjsgLy8gaSByZXBlYXRzIGluIHRhYmxlIGV2ZXJ5IGYgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGc7IC8vIG1heGltdW0gY29kZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoOyAvLyB0YWJsZSBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7IC8vIGNvdW50ZXIsIGN1cnJlbnQgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7IC8vIGNvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOyAvLyBudW1iZXIgb2YgYml0cyBpbiBjdXJyZW50IGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsOyAvLyBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrOyAvLyAoMSA8PCB3KSAtIDEsIHRvIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHA7IC8vIHBvaW50ZXIgaW50byBjW10sIGJbXSwgb3IgdltdCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcTsgLy8gcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3OyAvLyBiaXRzIGJlZm9yZSB0aGlzIHRhYmxlID09IChsICogaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4cDsgLy8gcG9pbnRlciBpbnRvIHgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5OyAvLyBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB6OyAvLyBudW1iZXIgb2YgZW50cmllcyBpbiBjdXJyZW50IHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGNvdW50cyBmb3IgZWFjaCBiaXQgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAwOyBpID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2JbYmluZGV4ICsgcF1dKys7IHArKzsgaS0tOyAvLyBhc3N1bWUgYWxsIGVudHJpZXMgPD0gQk1BWAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjWzBdID09IG4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bGwgaW5wdXQtLWFsbCB6ZXJvIGxlbmd0aCBjb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzBdID0gLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGgsIGJvdW5kICptIGJ5IHRob3NlCisgICAgICAgICAgICAgICAgICAgICAgICBsID0gbVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gQk1BWDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY1tqXSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgayA9IGo7IC8vIG1pbmltdW0gY29kZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsIDwgaikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBCTUFYOyBpICE9IDA7IGktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNbaV0gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBpOyAvLyBtYXhpbXVtIGNvZGUgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA+IGkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVswXSA9IGw7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBsYXN0IGxlbmd0aCBjb3VudCB0byBmaWxsIG91dCBjb2RlcywgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAxIDw8IGo7IGogPCBpOyBqKyssIHkgPDw9IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeSAtPSBjW2pdKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHkgLT0gY1tpXSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY1tpXSArPSB5OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBzdGFydGluZyBvZmZzZXRzIGludG8gdGhlIHZhbHVlIHRhYmxlIGZvciBlYWNoIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgeFsxXSA9IGogPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IDE7IHhwID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbeHBdID0gKGogKz0gY1twXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBhIHRhYmxlIG9mIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RocworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7IHAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZG8gCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiA9IGJbYmluZGV4ICsgcF0pICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2W3hbal0rK10gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB4W2ddOyAvLyBzZXQgbiB0byBsZW5ndGggb2YgdgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgSHVmZm1hbiBjb2RlcyBhbmQgZm9yIGVhY2gsIG1ha2UgdGhlIHRhYmxlIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHhbMF0gPSBpID0gMDsgLy8gZmlyc3QgSHVmZm1hbiBjb2RlIGlzIHplcm8KKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAwOyAvLyBncmFiIHZhbHVlcyBpbiBiaXQgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSAtIDE7IC8vIG5vIHRhYmxlcyB5ZXQtLWxldmVsIC0xCisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gLSBsOyAvLyBiaXRzIGRlY29kZWQgPT0gKGwgKiBoKQorICAgICAgICAgICAgICAgICAgICAgICAgdVswXSA9IDA7IC8vIGp1c3QgdG8ga2VlcCBjb21waWxlcnMgaGFwcHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAwOyAvLyBkaXR0bworICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDA7IC8vIGRpdHRvCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggdGhlIGJpdCBsZW5ndGhzIChrIGFscmVhZHkgaXMgYml0cyBpbiBzaG9ydGVzdCBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGsgPD0gZzsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gY1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGEtLSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBpIGlzIHRoZSBIdWZmbWFuIGNvZGUgb2YgbGVuZ3RoIGsgYml0cyBmb3IgdmFsdWUgKnAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHRhYmxlcyB1cCB0byByZXF1aXJlZCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrID4gdyArIGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSBsOyAvLyBwcmV2aW91cyB0YWJsZSBhbHdheXMgbCBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIG1pbmltdW0gc2l6ZSB0YWJsZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbCBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gZyAtIHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gKHogPiBsKT9sOno7IC8vIHRhYmxlIHNpemUgdXBwZXIgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZiA9IDEgPDwgKGogPSBrIC0gdykpID4gYSArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSBhIGstdyBiaXQgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGZldyBjb2RlcyBmb3Igay13IGJpdCB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIC09IChhICsgMSk7IC8vIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zIGxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IHopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytqIDwgeikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGYgPDw9IDEpIDw9IGNbKyt4cF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBlbm91Z2ggY29kZXMgdG8gdXNlIHVwIGogYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAtPSBjW3hwXTsgLy8gZWxzZSBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDEgPDwgajsgLy8gdGFibGUgZW50cmllcyBmb3Igai1iaXQgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgbmV3IHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG5bMF0gKyB6ID4gTUFOWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG5vdGU6IGRvZXNuJ3QgbWF0dGVyIGZvciBmaXhlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsgLy8gb3ZlcmZsb3cgb2YgTUFOWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVtoXSA9IHEgPSBoblswXTsgLy8gREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhuWzBdICs9IHo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4W2hdID0gaTsgLy8gc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMF0gPSAoc2J5dGUpIGo7IC8vIGJpdHMgaW4gdGhpcyB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByWzFdID0gKHNieXRlKSBsOyAvLyBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IFNoYXJlZFV0aWxzLlVSU2hpZnQoaSwgKHcgLSBsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSAoaW50KSAocSAtIHVbaCAtIDFdIC0gaik7IC8vIG9mZnNldCB0byB0aGlzIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkociwgMCwgaHAsICh1W2ggLSAxXSArIGopICogMywgMyk7IC8vIGNvbm5lY3QgdG8gbGFzdCB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzBdID0gcTsgLy8gZmlyc3QgdGFibGUgaXMgcmV0dXJuZWQgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB1cCB0YWJsZSBlbnRyeSBpbiByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclsxXSA9IChzYnl0ZSkgKGsgLSB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA+PSBuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMF0gPSAxMjggKyA2NDsgLy8gb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZbcF0gPCBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMF0gPSAoc2J5dGUpICh2W3BdIDwgMjU2PzA6MzIgKyA2NCk7IC8vIDI1NiBpcyBlbmQtb2YtYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMl0gPSB2W3ArK107IC8vIHNpbXBsZSBjb2RlIGlzIGp1c3QgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByWzBdID0gKHNieXRlKSAoZVt2W3BdIC0gc10gKyAxNiArIDY0KTsgLy8gbm9uLXNpbXBsZS0tbG9vayB1cCBpbiBsaXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclsyXSA9IGRbdltwKytdIC0gc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgY29kZS1saWtlIGVudHJpZXMgd2l0aCByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IDEgPDwgKGsgLSB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBTaGFyZWRVdGlscy5VUlNoaWZ0KGksIHcpOyBqIDwgejsgaiArPSBmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkociwgMCwgaHAsIChxICsgaikgKiAzLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3dhcmRzIGluY3JlbWVudCB0aGUgay1iaXQgY29kZSBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMSA8PCAoayAtIDEpOyAoaSAmIGopICE9IDA7IGogPSBTaGFyZWRVdGlscy5VUlNoaWZ0KGosIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgXj0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSBePSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2t1cCBvdmVyIGZpbmlzaGVkIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAoMSA8PCB3KSAtIDE7IC8vIG5lZWRlZCBvbiBIUCwgY2MgLU8gYnVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpICYgbWFzaykgIT0geFtoXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLS07IC8vIGRvbid0IG5lZWQgdG8gdXBkYXRlIHEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgLT0gbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAoMSA8PCB3KSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gWl9CVUZfRVJST1IgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geSAhPSAwICYmIGcgIT0gMT9aX0JVRl9FUlJPUjpaX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnRlcm5hbCBpbnQgaW5mbGF0ZV90cmVlc19iaXRzKGludFtdIGMsIGludFtdIGJiLCBpbnRbXSB0YiwgaW50W10gaHAsIFpsaWJDb2RlYyB6KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0V29ya0FyZWEoMTkpOworICAgICAgICAgICAgICAgICAgICAgICAgaG5bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaHVmdF9idWlsZChjLCAwLCAxOSwgMTksIG51bGwsIG51bGwsIHRiLCBiYiwgaHAsIGhuLCB2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBaX0RBVEFfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTWVzc2FnZSA9ICJvdmVyc3Vic2NyaWJlZCBkeW5hbWljIGJpdCBsZW5ndGhzIHRyZWUiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IFpfQlVGX0VSUk9SIHx8IGJiWzBdID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTWVzc2FnZSA9ICJpbmNvbXBsZXRlIGR5bmFtaWMgYml0IGxlbmd0aHMgdHJlZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludGVybmFsIGludCBpbmZsYXRlX3RyZWVzX2R5bmFtaWMoaW50IG5sLCBpbnQgbmQsIGludFtdIGMsIGludFtdIGJsLCBpbnRbXSBiZCwgaW50W10gdGwsIGludFtdIHRkLCBpbnRbXSBocCwgWmxpYkNvZGVjIHopCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbGl0ZXJhbC9sZW5ndGggdHJlZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFdvcmtBcmVhKDI4OCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoblswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBodWZ0X2J1aWxkKGMsIDAsIG5sLCAyNTcsIGNwbGVucywgY3BsZXh0LCB0bCwgYmwsIGhwLCBobiwgdik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFpfT0sgfHwgYmxbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBaX0RBVEFfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk1lc3NhZ2UgPSAib3ZlcnN1YnNjcmliZWQgbGl0ZXJhbC9sZW5ndGggdHJlZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9IFpfTUVNX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5NZXNzYWdlID0gImluY29tcGxldGUgbGl0ZXJhbC9sZW5ndGggdHJlZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGRpc3RhbmNlIHRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRXb3JrQXJlYSgyODgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaHVmdF9idWlsZChjLCBubCwgbmQsIDAsIGNwZGlzdCwgY3BkZXh0LCB0ZCwgYmQsIGhwLCBobiwgdik7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gWl9PSyB8fCAoYmRbMF0gPT0gMCAmJiBubCA+IDI1NykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gWl9EQVRBX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5NZXNzYWdlID0gIm92ZXJzdWJzY3JpYmVkIGRpc3RhbmNlIHRyZWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBaX0JVRl9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouTWVzc2FnZSA9ICJpbmNvbXBsZXRlIGRpc3RhbmNlIHRyZWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT0gWl9NRU1fRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk1lc3NhZ2UgPSAiZW1wdHkgZGlzdGFuY2UgdHJlZSB3aXRoIGxlbmd0aHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBpbmZsYXRlX3RyZWVzX2ZpeGVkKGludFtdIGJsLCBpbnRbXSBiZCwgaW50W11bXSB0bCwgaW50W11bXSB0ZCwgWmxpYkNvZGVjIHopCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmxbMF0gPSBmaXhlZF9ibDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkWzBdID0gZml4ZWRfYmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0bFswXSA9IGZpeGVkX3RsOworICAgICAgICAgICAgICAgICAgICAgICAgdGRbMF0gPSBmaXhlZF90ZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgIGluaXRXb3JrQXJlYShpbnQgdnNpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhuID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhuID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG5ldyBpbnRbdnNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbmV3IGludFtCTUFYICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBuZXcgaW50WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gbmV3IGludFtCTUFYXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IG5ldyBpbnRbQk1BWCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Lkxlbmd0aCA8IHZzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG5ldyBpbnRbdnNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5DbGVhcih2LDAsdnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNsZWFyKGMsMCxCTUFYKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMF09MDsgclsxXT0wOyByWzJdPTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGZvcihpbnQgaT0wOyBpPEJNQVg7IGkrKyl7dVtpXT0wO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FycmF5LkNvcHkoYywgMCwgdSwgMCwgQk1BWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ2xlYXIodSwwLEJNQVgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBmb3IoaW50IGk9MDsgaTxCTUFYKzE7IGkrKyl7eFtpXT0wO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FycmF5LkNvcHkoYywgMCwgeCwgMCwgQk1BWCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNsZWFyKHgsMCxCTUFYKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvSW5mbGF0ZS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvSW5mbGF0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M4ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9JbmZsYXRlLmNzCkBAIC0wLDAgKzEsMTc5NiBAQAorLy8gSW5mbGF0ZS5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5IERpbm8gQ2hpZXNhIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKToKKy8vIFRpbWUtc3RhbXA6IDwyMDEwLUphbnVhcnktMDggMTg6MzI6MTI+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBjbGFzc2VzIGZvciBkZWNvbXByZXNzaW9uLiBUaGlzIGNvZGUgaXMgZGVyaXZlZAorLy8gZnJvbSB0aGUganpsaWIgaW1wbGVtZW50YXRpb24gb2YgemxpYiwgYnV0IHNpZ25pZmljYW50bHkgbW9kaWZpZWQuCisvLyBUaGUgb2JqZWN0IG1vZGVsIGlzIG5vdCB0aGUgc2FtZSwgYW5kIG1hbnkgb2YgdGhlIGJlaGF2aW9ycyBhcmUKKy8vIGRpZmZlcmVudC4gIE5vbmV0aGVsZXNzLCBpbiBrZWVwaW5nIHdpdGggdGhlIGxpY2Vuc2UgZm9yIGp6bGliLCBJIGFtCisvLyByZXByb2R1Y2luZyB0aGUgY29weXJpZ2h0IHRvIHRoYXQgY29kZSBoZXJlLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwMCwyMDAxLDIwMDIsMjAwMyB5bW5rLCBKQ3JhZnQsSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisvLyB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorLy8gSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEpDUkFGVCwKKy8vIElOQy4gT1IgQU5ZIENPTlRSSUJVVE9SUyBUTyBUSElTIFNPRlRXQVJFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwKKy8vIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKy8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisvLyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisvLyBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIHpsaWItMS4xLjM7IGNyZWRpdCB0byBhdXRob3JzCisvLyBKZWFuLWxvdXAgR2FpbGx5KGpsb3VwQGd6aXAub3JnKSBhbmQgTWFyayBBZGxlcihtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1KQorLy8gYW5kIGNvbnRyaWJ1dG9ycyBvZiB6bGliLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwordXNpbmcgU3lzdGVtOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIKK3sKKyAgICBzZWFsZWQgY2xhc3MgSW5mbGF0ZUJsb2NrcworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgTUFOWSA9IDE0NDA7CisKKyAgICAgICAgLy8gVGFibGUgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50W10gYm9yZGVyID0gbmV3IGludFtdCisgICAgICAgIHsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSB9OworCisgICAgICAgIHByaXZhdGUgZW51bSBJbmZsYXRlQmxvY2tNb2RlCisgICAgICAgIHsKKyAgICAgICAgICAgIFRZUEUgICA9IDAsICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHR5cGUgYml0cyAoMywgaW5jbHVkaW5nIGVuZCBiaXQpCisgICAgICAgICAgICBMRU5TICAgPSAxLCAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBsZW5ndGhzIGZvciBzdG9yZWQKKyAgICAgICAgICAgIFNUT1JFRCA9IDIsICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBzdG9yZWQgYmxvY2sKKyAgICAgICAgICAgIFRBQkxFICA9IDMsICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRhYmxlIGxlbmd0aHMKKyAgICAgICAgICAgIEJUUkVFICA9IDQsICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJpdCBsZW5ndGhzIHRyZWUgZm9yIGEgZHluYW1pYyBibG9jaworICAgICAgICAgICAgRFRSRUUgID0gNSwgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbGVuZ3RoLCBkaXN0YW5jZSB0cmVlcyBmb3IgYSBkeW5hbWljIGJsb2NrCisgICAgICAgICAgICBDT0RFUyAgPSA2LCAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgZml4ZWQgb3IgZHluYW1pYyBibG9jaworICAgICAgICAgICAgRFJZICAgID0gNywgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcmVtYWluaW5nIHdpbmRvdyBieXRlcworICAgICAgICAgICAgRE9ORSAgID0gOCwgICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCBsYXN0IGJsb2NrLCBkb25lCisgICAgICAgICAgICBCQUQgICAgPSA5LCAgICAgICAgICAgICAgICAgICAgIC8vIG90IGEgZGF0YSBlcnJvci0tc3R1Y2sgaGVyZQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJbmZsYXRlQmxvY2tNb2RlIG1vZGU7ICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGluZmxhdGVfYmxvY2sgbW9kZQorCisgICAgICAgIGludGVybmFsIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgU1RPUkVELCBieXRlcyBsZWZ0IHRvIGNvcHkKKworICAgICAgICBpbnRlcm5hbCBpbnQgdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGxlbmd0aHMgKDE0IGJpdHMpCisgICAgICAgIGludGVybmFsIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggaW50byBibGVucyAob3IgYm9yZGVyKQorICAgICAgICBpbnRlcm5hbCBpbnRbXSBibGVuczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBsZW5ndGhzIG9mIGNvZGVzCisgICAgICAgIGludGVybmFsIGludFtdIGJiID0gbmV3IGludFsxXTsgICAgICAgICAgICAgICAgICAgLy8gYml0IGxlbmd0aCB0cmVlIGRlcHRoCisgICAgICAgIGludGVybmFsIGludFtdIHRiID0gbmV3IGludFsxXTsgICAgICAgICAgICAgICAgICAgLy8gYml0IGxlbmd0aCBkZWNvZGluZyB0cmVlCisKKyAgICAgICAgaW50ZXJuYWwgSW5mbGF0ZUNvZGVzIGNvZGVzID0gbmV3IEluZmxhdGVDb2RlcygpOyAvLyBpZiBDT0RFUywgY3VycmVudCBzdGF0ZQorCisgICAgICAgIGludGVybmFsIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrCisKKyAgICAgICAgaW50ZXJuYWwgWmxpYkNvZGVjIF9jb2RlYzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbgorICAgICAgICBpbnRlcm5hbCBpbnQgYml0azsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgaW4gYml0IGJ1ZmZlcgorICAgICAgICBpbnRlcm5hbCBpbnQgYml0YjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBidWZmZXIKKyAgICAgICAgaW50ZXJuYWwgaW50W10gaHVmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgbWFsbG9jIGZvciB0cmVlIHNwYWNlCisgICAgICAgIGludGVybmFsIGJ5dGVbXSB3aW5kb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xpZGluZyB3aW5kb3cKKyAgICAgICAgaW50ZXJuYWwgaW50IGVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgYnl0ZSBhZnRlciBzbGlkaW5nIHdpbmRvdworICAgICAgICBpbnRlcm5hbCBpbnQgcmVhZEF0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdyByZWFkIHBvaW50ZXIKKyAgICAgICAgaW50ZXJuYWwgaW50IHdyaXRlQXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cgd3JpdGUgcG9pbnRlcgorICAgICAgICBpbnRlcm5hbCBTeXN0ZW0uT2JqZWN0IGNoZWNrZm47ICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZ1bmN0aW9uCisgICAgICAgIGludGVybmFsIHVpbnQgY2hlY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb24gb3V0cHV0CisKKyAgICAgICAgaW50ZXJuYWwgSW5mVHJlZSBpbmZ0cmVlID0gbmV3IEluZlRyZWUoKTsKKworICAgICAgICBpbnRlcm5hbCBJbmZsYXRlQmxvY2tzKFpsaWJDb2RlYyBjb2RlYywgU3lzdGVtLk9iamVjdCBjaGVja2ZuLCBpbnQgdykKKyAgICAgICAgeworICAgICAgICAgICAgX2NvZGVjID0gY29kZWM7CisgICAgICAgICAgICBodWZ0cyA9IG5ldyBpbnRbTUFOWSAqIDNdOworICAgICAgICAgICAgd2luZG93ID0gbmV3IGJ5dGVbd107CisgICAgICAgICAgICBlbmQgPSB3OworICAgICAgICAgICAgdGhpcy5jaGVja2ZuID0gY2hlY2tmbjsKKyAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLlRZUEU7CisgICAgICAgICAgICBSZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgdWludCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQgb2xkQ2hlY2sgPSBjaGVjazsKKyAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLlRZUEU7CisgICAgICAgICAgICBiaXRrID0gMDsKKyAgICAgICAgICAgIGJpdGIgPSAwOworICAgICAgICAgICAgcmVhZEF0ID0gd3JpdGVBdCA9IDA7CisKKyAgICAgICAgICAgIGlmIChjaGVja2ZuICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2NvZGVjLl9BZGxlcjMyID0gY2hlY2sgPSBBZGxlci5BZGxlcjMyKDAsIG51bGwsIDAsIDApOworICAgICAgICAgICAgcmV0dXJuIG9sZENoZWNrOworICAgICAgICB9CisKKworICAgICAgICBpbnRlcm5hbCBpbnQgUHJvY2VzcyhpbnQgcikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQ7IC8vIHRlbXBvcmFyeSBzdG9yYWdlCisgICAgICAgICAgICBpbnQgYjsgLy8gYml0IGJ1ZmZlcgorICAgICAgICAgICAgaW50IGs7IC8vIGJpdHMgaW4gYml0IGJ1ZmZlcgorICAgICAgICAgICAgaW50IHA7IC8vIGlucHV0IGRhdGEgcG9pbnRlcgorICAgICAgICAgICAgaW50IG47IC8vIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZQorICAgICAgICAgICAgaW50IHE7IC8vIG91dHB1dCB3aW5kb3cgd3JpdGUgcG9pbnRlcgorICAgICAgICAgICAgaW50IG07IC8vIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyCisKKyAgICAgICAgICAgIC8vIGNvcHkgaW5wdXQvb3V0cHV0IGluZm9ybWF0aW9uIHRvIGxvY2FscyAoVVBEQVRFIG1hY3JvIHJlc3RvcmVzKQorCisgICAgICAgICAgICBwID0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgIG4gPSBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbjsKKyAgICAgICAgICAgIGIgPSBiaXRiOworICAgICAgICAgICAgayA9IGJpdGs7CisKKyAgICAgICAgICAgIHEgPSB3cml0ZUF0OworICAgICAgICAgICAgbSA9IChpbnQpKHEgPCByZWFkQXQgPyByZWFkQXQgLSBxIC0gMSA6IGVuZCAtIHEpOworCisKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgYmFzZWQgb24gY3VycmVudCBzdGF0ZQorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlQmxvY2tNb2RlLlRZUEU6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgKDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsgYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gKF9jb2RlYy5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKGludCkoYiAmIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHQgJiAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCh1aW50KXQgPj4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6ICAvLyBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA+Pj0gMzsgayAtPSAoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBrICYgNzsgLy8gZ28gdG8gYnl0ZSBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSB0OyBrIC09IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLkxFTlM7IC8vIGdldCBsZW5ndGggb2Ygc3RvcmVkIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgLy8gZml4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmwgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiZCA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gdGwgPSBuZXcgaW50WzFdW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gdGQgPSBuZXcgaW50WzFdW107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZlRyZWUuaW5mbGF0ZV90cmVlc19maXhlZChibCwgYmQsIHRsLCB0ZCwgX2NvZGVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXMuSW5pdChibFswXSwgYmRbMF0sIHRsWzBdLCAwLCB0ZFswXSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPj49IDM7IGsgLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVCbG9ja01vZGUuQ09ERVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgLy8gZHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSAzOyBrIC09IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLlRBQkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogIC8vIGlsbGVnYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA+Pj0gMzsgayAtPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZUJsb2NrTW9kZS5CQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5NZXNzYWdlID0gImludmFsaWQgYmxvY2sgdHlwZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gKz0gcCAtIF9jb2RlYy5OZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlQmxvY2tNb2RlLkxFTlM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgKDMyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IFpsaWJDb25zdGFudHMuWl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gKz0gcCAtIF9jb2RlYy5OZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gKF9jb2RlYy5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCAoKH5iKT4+MTYpICYgMHhmZmZmKSAhPSAoYiAmIDB4ZmZmZikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVCbG9ja01vZGUuQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5NZXNzYWdlID0gImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfREFUQV9FUlJPUjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGIgPSBiOyBiaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gKGIgJiAweGZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGsgPSAwOyAvLyBkdW1wIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBsZWZ0ICE9IDAgPyBJbmZsYXRlQmxvY2tNb2RlLlNUT1JFRCA6IChsYXN0ICE9IDAgPyBJbmZsYXRlQmxvY2tNb2RlLkRSWSA6IEluZmxhdGVCbG9ja01vZGUuVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVCbG9ja01vZGUuU1RPUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsgYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gKz0gcCAtIF9jb2RlYy5OZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID09IGVuZCAmJiByZWFkQXQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAwOyBtID0gKGludCkocSA8IHJlYWRBdCA/IHJlYWRBdCAtIHEgLSAxIDogZW5kIC0gcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IEZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gd3JpdGVBdDsgbSA9IChpbnQpKHEgPCByZWFkQXQgPyByZWFkQXQgLSBxIC0gMSA6IGVuZCAtIHEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSA9PSBlbmQgJiYgcmVhZEF0ICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAwOyBtID0gKGludCkocSA8IHJlYWRBdCA/IHJlYWRBdCAtIHEgLSAxIDogZW5kIC0gcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworCisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID4gbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID4gbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoX2NvZGVjLklucHV0QnVmZmVyLCBwLCB3aW5kb3csIHEsIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcCArPSB0OyBuIC09IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBxICs9IHQ7IG0gLT0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVmdCAtPSB0KSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGxhc3QgIT0gMCA/IEluZmxhdGVCbG9ja01vZGUuRFJZIDogSW5mbGF0ZUJsb2NrTW9kZS5UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlQmxvY2tNb2RlLlRBQkxFOgorCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoayA8ICgxNCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGIgPSBiOyBiaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luICs9IHAgLSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiB8PSAoX2NvZGVjLklucHV0QnVmZmVyW3ArK10gJiAweGZmKSA8PCBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0ID0gKGIgJiAweDNmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0ICYgMHgxZikgPiAyOSB8fCAoKHQgPj4gNSkgJiAweDFmKSA+IDI5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLkJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTWVzc2FnZSA9ICJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IFpsaWJDb25zdGFudHMuWl9EQVRBX0VSUk9SOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luICs9IHAgLSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAyNTggKyAodCAmIDB4MWYpICsgKCh0ID4+IDUpICYgMHgxZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxlbnMgPT0gbnVsbCB8fCBibGVucy5MZW5ndGggPCB0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5zID0gbmV3IGludFt0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5DbGVhcihibGVucywgMCwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCB0OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBibGVuc1tpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSAxNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgLT0gMTQ7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVCbG9ja01vZGUuQlRSRUU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgSW5mbGF0ZUJsb2NrTW9kZS5CVFJFRTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVCbG9ja01vZGUuQlRSRUU6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCA0ICsgKHRhYmxlID4+IDEwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoayA8ICgzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsgYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luICs9IHAgLSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiB8PSAoX2NvZGVjLklucHV0QnVmZmVyW3ArK10gJiAweGZmKSA8PCBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbnNbYm9yZGVyW2luZGV4KytdXSA9IGIgJiA3OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA+Pj0gMzsgayAtPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCAxOSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuc1tib3JkZXJbaW5kZXgrK11dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmJbMF0gPSA3OworICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGluZnRyZWUuaW5mbGF0ZV90cmVlc19iaXRzKGJsZW5zLCBiYiwgdGIsIGh1ZnRzLCBfY29kZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT0gWmxpYkNvbnN0YW50cy5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IFpsaWJDb25zdGFudHMuWl9EQVRBX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZUJsb2NrTW9kZS5CQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luICs9IHAgLSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVCbG9ja01vZGUuRFRSRUU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgSW5mbGF0ZUJsb2NrTW9kZS5EVFJFRTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVCbG9ja01vZGUuRFRSRUU6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdGFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaW5kZXggPCAyNTggKyAodCAmIDB4MWYpICsgKCh0ID4+IDUpICYgMHgxZikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGosIGM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gYmJbMF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoayA8IHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gKF9jb2RlYy5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBodWZ0c1sodGJbMF0gKyAoYiAmIEludGVybmFsSW5mbGF0ZUNvbnN0YW50cy5JbmZsYXRlTWFza1t0XSkpICogMyArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBodWZ0c1sodGJbMF0gKyAoYiAmIEludGVybmFsSW5mbGF0ZUNvbnN0YW50cy5JbmZsYXRlTWFza1t0XSkpICogMyArIDJdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPj49IHQ7IGsgLT0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbnNbaW5kZXgrK10gPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjID09IDE2Li4xOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gYyA9PSAxOCA/IDcgOiBjIC0gMTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBjID09IDE4ID8gMTEgOiAzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgKHQgKyBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGIgPSBiOyBiaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gKF9jb2RlYy5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPj49IHQ7IGsgLT0gdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IChiICYgSW50ZXJuYWxJbmZsYXRlQ29uc3RhbnRzLkluZmxhdGVNYXNrW2ldKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSBpOyBrIC09IGk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdGFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgaiA+IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSB8fCAoYyA9PSAxNiAmJiBpIDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5zID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLkJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5NZXNzYWdlID0gImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IFpsaWJDb25zdGFudHMuWl9EQVRBX0VSUk9SOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsgYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luICs9IHAgLSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAoYyA9PSAxNikgPyBibGVuc1tpLTFdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbnNbaSsrXSA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0taiAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGJbMF0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBibCA9IG5ldyBpbnRbXSB7IDkgfTsgIC8vIG11c3QgYmUgPD0gOSBmb3IgbG9va2FoZWFkIGFzc3VtcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmQgPSBuZXcgaW50W10geyA2IH07IC8vIG11c3QgYmUgPD0gOSBmb3IgbG9va2FoZWFkIGFzc3VtcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gdGwgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHRkID0gbmV3IGludFsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gaW5mdHJlZS5pbmZsYXRlX3RyZWVzX2R5bmFtaWMoMjU3ICsgKHQgJiAweDFmKSwgMSArICgodCA+PiA1KSAmIDB4MWYpLCBibGVucywgYmwsIGJkLCB0bCwgdGQsIGh1ZnRzLCBfY29kZWMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT0gWmxpYkNvbnN0YW50cy5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5zID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLkJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsgYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLkluaXQoYmxbMF0sIGJkWzBdLCBodWZ0cywgdGxbMF0sIGh1ZnRzLCB0ZFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZUJsb2NrTW9kZS5DT0RFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSBJbmZsYXRlQmxvY2tNb2RlLkNPREVTOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5mbGF0ZUJsb2NrTW9kZS5DT0RFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdGIgPSBiOyBiaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gKz0gcCAtIF9jb2RlYy5OZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworCisgICAgICAgICAgICAgICAgICAgICAgICByID0gY29kZXMuUHJvY2Vzcyh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgciA9IFpsaWJDb25zdGFudHMuWl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgbiA9IF9jb2RlYy5BdmFpbGFibGVCeXRlc0luOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGJpdGI7CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gYml0azsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB3cml0ZUF0OworICAgICAgICAgICAgICAgICAgICAgICAgbSA9IChpbnQpKHEgPCByZWFkQXQgPyByZWFkQXQgLSBxIC0gMSA6IGVuZCAtIHEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlQmxvY2tNb2RlLlRZUEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZUJsb2NrTW9kZS5EUlk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgSW5mbGF0ZUJsb2NrTW9kZS5EUlk7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlQmxvY2tNb2RlLkRSWToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IEZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHdyaXRlQXQ7IG0gPSAoaW50KShxIDwgcmVhZEF0ID8gcmVhZEF0IC0gcSAtIDEgOiBlbmQgLSBxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQXQgIT0gd3JpdGVBdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsgYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gKz0gcCAtIF9jb2RlYy5OZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVCbG9ja01vZGUuRE9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSBJbmZsYXRlQmxvY2tNb2RlLkRPTkU7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlQmxvY2tNb2RlLkRPTkU6CisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRiID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlQmxvY2tNb2RlLkJBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfREFUQV9FUlJPUjsKKworICAgICAgICAgICAgICAgICAgICAgICAgYml0YiA9IGI7IGJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmx1c2gocik7CisKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgciA9IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRVJST1I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdGIgPSBiOyBiaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gKz0gcCAtIF9jb2RlYy5OZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZsdXNoKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBGcmVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgIHdpbmRvdyA9IG51bGw7CisgICAgICAgICAgICBodWZ0cyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIFNldERpY3Rpb25hcnkoYnl0ZVtdIGQsIGludCBzdGFydCwgaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoZCwgc3RhcnQsIHdpbmRvdywgMCwgbik7CisgICAgICAgICAgICByZWFkQXQgPSB3cml0ZUF0ID0gbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkCisgICAgICAgIC8vIGJ5IFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guCisgICAgICAgIGludGVybmFsIGludCBTeW5jUG9pbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbW9kZSA9PSBJbmZsYXRlQmxvY2tNb2RlLkxFTlMgPyAxIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBzbGlkaW5nIHdpbmRvdyB0byB0aGUgb3V0cHV0IGFyZWEKKyAgICAgICAgaW50ZXJuYWwgaW50IEZsdXNoKGludCByKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbkJ5dGVzOworCisgICAgICAgICAgICBmb3IgKGludCBwYXNzPTA7IHBhc3MgPCAyOyBwYXNzKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhc3M9PTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGFzIGZhciBhcyBlbmQgb2Ygd2luZG93CisgICAgICAgICAgICAgICAgICAgIG5CeXRlcyA9IChpbnQpKChyZWFkQXQgPD0gd3JpdGVBdCA/IHdyaXRlQXQgOiBlbmQpIC0gcmVhZEF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBieXRlcyB0byBjb3B5CisgICAgICAgICAgICAgICAgICAgIG5CeXRlcyA9IHdyaXRlQXQgLSByZWFkQXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW0gODg3MAorICAgICAgICAgICAgICAgIGlmIChuQnl0ZXMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyID09IFpsaWJDb25zdGFudHMuWl9CVUZfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobkJ5dGVzID4gX2NvZGVjLkF2YWlsYWJsZUJ5dGVzT3V0KQorICAgICAgICAgICAgICAgICAgICBuQnl0ZXMgPSBfY29kZWMuQXZhaWxhYmxlQnl0ZXNPdXQ7CisKKyAgICAgICAgICAgICAgICBpZiAobkJ5dGVzICE9IDAgJiYgciA9PSBabGliQ29uc3RhbnRzLlpfQlVGX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvdW50ZXJzCisgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzT3V0IC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc091dCArPSBuQnl0ZXM7CisKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tmbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfY29kZWMuX0FkbGVyMzIgPSBjaGVjayA9IEFkbGVyLkFkbGVyMzIoY2hlY2ssIHdpbmRvdywgcmVhZEF0LCBuQnl0ZXMpOworCisgICAgICAgICAgICAgICAgLy8gY29weSBhcyBmYXIgYXMgZW5kIG9mIHdpbmRvdworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkod2luZG93LCByZWFkQXQsIF9jb2RlYy5PdXRwdXRCdWZmZXIsIF9jb2RlYy5OZXh0T3V0LCBuQnl0ZXMpOworICAgICAgICAgICAgICAgIF9jb2RlYy5OZXh0T3V0ICs9IG5CeXRlczsKKyAgICAgICAgICAgICAgICByZWFkQXQgKz0gbkJ5dGVzOworCisgICAgICAgICAgICAgICAgLy8gc2VlIGlmIG1vcmUgdG8gY29weSBhdCBiZWdpbm5pbmcgb2Ygd2luZG93CisgICAgICAgICAgICAgICAgaWYgKHJlYWRBdCA9PSBlbmQgJiYgcGFzcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBwb2ludGVycworICAgICAgICAgICAgICAgICAgICByZWFkQXQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVBdCA9PSBlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBwYXNzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvbmUKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgSW50ZXJuYWxJbmZsYXRlQ29uc3RhbnRzCisgICAgeworICAgICAgICAvLyBBbmQnaW5nIHdpdGggbWFza1tuXSBtYXNrcyB0aGUgbG93ZXIgbiBiaXRzCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnRbXSBJbmZsYXRlTWFzayA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAzLCAweDAwMDAwMDA3LAorICAgICAgICAgICAgMHgwMDAwMDAwZiwgMHgwMDAwMDAxZiwgMHgwMDAwMDAzZiwgMHgwMDAwMDA3ZiwKKyAgICAgICAgICAgIDB4MDAwMDAwZmYsIDB4MDAwMDAxZmYsIDB4MDAwMDAzZmYsIDB4MDAwMDA3ZmYsCisgICAgICAgICAgICAweDAwMDAwZmZmLCAweDAwMDAxZmZmLCAweDAwMDAzZmZmLCAweDAwMDA3ZmZmLCAweDAwMDBmZmZmIH07CisgICAgfQorCisKKyAgICBzZWFsZWQgY2xhc3MgSW5mbGF0ZUNvZGVzCisgICAgeworICAgICAgICAvLyB3YWl0aW5nIGZvciAiaToiPWlucHV0LAorICAgICAgICAvLyAgICAgICAgICAgICAibzoiPW91dHB1dCwKKyAgICAgICAgLy8gICAgICAgICAgICAgIng6Ij1ub3RoaW5nCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFNUQVJUICAgPSAwOyAvLyB4OiBzZXQgdXAgZm9yIExFTgorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBMRU4gICAgID0gMTsgLy8gaTogZ2V0IGxlbmd0aC9saXRlcmFsL2VvYiBuZXh0CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IExFTkVYVCAgPSAyOyAvLyBpOiBnZXR0aW5nIGxlbmd0aCBleHRyYSAoaGF2ZSBiYXNlKQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBESVNUICAgID0gMzsgLy8gaTogZ2V0IGRpc3RhbmNlIG5leHQKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRElTVEVYVCA9IDQ7IC8vIGk6IGdldHRpbmcgZGlzdGFuY2UgZXh0cmEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgQ09QWSAgICA9IDU7IC8vIG86IGNvcHlpbmcgYnl0ZXMgaW4gd2luZG93LCB3YWl0aW5nIGZvciBzcGFjZQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBMSVQgICAgID0gNjsgLy8gbzogZ290IGxpdGVyYWwsIHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBXQVNIICAgID0gNzsgLy8gbzogZ290IGVvYiwgcG9zc2libHkgc3RpbGwgb3V0cHV0IHdhaXRpbmcKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRU5EICAgICA9IDg7IC8vIHg6IGdvdCBlb2IgYW5kIGFsbCBkYXRhIGZsdXNoZWQKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgQkFEQ09ERSA9IDk7IC8vIHg6IGdvdCBlcnJvcgorCisgICAgICAgIGludGVybmFsIGludCBtb2RlOyAgICAgICAgLy8gY3VycmVudCBpbmZsYXRlX2NvZGVzIG1vZGUKKworICAgICAgICAvLyBtb2RlIGRlcGVuZGVudCBpbmZvcm1hdGlvbgorICAgICAgICBpbnRlcm5hbCBpbnQgbGVuOworCisgICAgICAgIGludGVybmFsIGludFtdIHRyZWU7ICAgICAgLy8gcG9pbnRlciBpbnRvIHRyZWUKKyAgICAgICAgaW50ZXJuYWwgaW50IHRyZWVfaW5kZXggPSAwOworICAgICAgICBpbnRlcm5hbCBpbnQgbmVlZDsgICAgICAgIC8vIGJpdHMgbmVlZGVkCisKKyAgICAgICAgaW50ZXJuYWwgaW50IGxpdDsKKworICAgICAgICAvLyBpZiBFWFQgb3IgQ09QWSwgd2hlcmUgYW5kIGhvdyBtdWNoCisgICAgICAgIGludGVybmFsIGludCBiaXRzVG9HZXQ7ICAgLy8gYml0cyB0byBnZXQgZm9yIGV4dHJhCisgICAgICAgIGludGVybmFsIGludCBkaXN0OyAgICAgICAgLy8gZGlzdGFuY2UgYmFjayB0byBjb3B5IGZyb20KKworICAgICAgICBpbnRlcm5hbCBieXRlIGxiaXRzOyAgICAgIC8vIGx0cmVlIGJpdHMgZGVjb2RlZCBwZXIgYnJhbmNoCisgICAgICAgIGludGVybmFsIGJ5dGUgZGJpdHM7ICAgICAgLy8gZHRyZWUgYml0cyBkZWNvZGVyIHBlciBicmFuY2gKKyAgICAgICAgaW50ZXJuYWwgaW50W10gbHRyZWU7ICAgICAvLyBsaXRlcmFsL2xlbmd0aC9lb2IgdHJlZQorICAgICAgICBpbnRlcm5hbCBpbnQgbHRyZWVfaW5kZXg7IC8vIGxpdGVyYWwvbGVuZ3RoL2VvYiB0cmVlCisgICAgICAgIGludGVybmFsIGludFtdIGR0cmVlOyAgICAgLy8gZGlzdGFuY2UgdHJlZQorICAgICAgICBpbnRlcm5hbCBpbnQgZHRyZWVfaW5kZXg7IC8vIGRpc3RhbmNlIHRyZWUKKworICAgICAgICBpbnRlcm5hbCBJbmZsYXRlQ29kZXMoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIEluaXQoaW50IGJsLCBpbnQgYmQsIGludFtdIHRsLCBpbnQgdGxfaW5kZXgsIGludFtdIHRkLCBpbnQgdGRfaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUgPSBTVEFSVDsKKyAgICAgICAgICAgIGxiaXRzID0gKGJ5dGUpYmw7CisgICAgICAgICAgICBkYml0cyA9IChieXRlKWJkOworICAgICAgICAgICAgbHRyZWUgPSB0bDsKKyAgICAgICAgICAgIGx0cmVlX2luZGV4ID0gdGxfaW5kZXg7CisgICAgICAgICAgICBkdHJlZSA9IHRkOworICAgICAgICAgICAgZHRyZWVfaW5kZXggPSB0ZF9pbmRleDsKKyAgICAgICAgICAgIHRyZWUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgaW50IFByb2Nlc3MoSW5mbGF0ZUJsb2NrcyBibG9ja3MsIGludCByKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgajsgICAgICAvLyB0ZW1wb3Jhcnkgc3RvcmFnZQorICAgICAgICAgICAgaW50IHRpbmRleDsgLy8gdGVtcG9yYXJ5IHBvaW50ZXIKKyAgICAgICAgICAgIGludCBlOyAgICAgIC8vIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uCisgICAgICAgICAgICBpbnQgYiA9IDA7ICAvLyBiaXQgYnVmZmVyCisgICAgICAgICAgICBpbnQgayA9IDA7ICAvLyBiaXRzIGluIGJpdCBidWZmZXIKKyAgICAgICAgICAgIGludCBwID0gMDsgIC8vIGlucHV0IGRhdGEgcG9pbnRlcgorICAgICAgICAgICAgaW50IG47ICAgICAgLy8gYnl0ZXMgYXZhaWxhYmxlIHRoZXJlCisgICAgICAgICAgICBpbnQgcTsgICAgICAvLyBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIKKyAgICAgICAgICAgIGludCBtOyAgICAgIC8vIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyCisgICAgICAgICAgICBpbnQgZjsgICAgICAvLyBwb2ludGVyIHRvIGNvcHkgc3RyaW5ncyBmcm9tCisKKyAgICAgICAgICAgIFpsaWJDb2RlYyB6ID0gYmxvY2tzLl9jb2RlYzsKKworICAgICAgICAgICAgLy8gY29weSBpbnB1dC9vdXRwdXQgaW5mb3JtYXRpb24gdG8gbG9jYWxzIChVUERBVEUgbWFjcm8gcmVzdG9yZXMpCisgICAgICAgICAgICBwID0gei5OZXh0SW47CisgICAgICAgICAgICBuID0gei5BdmFpbGFibGVCeXRlc0luOworICAgICAgICAgICAgYiA9IGJsb2Nrcy5iaXRiOworICAgICAgICAgICAgayA9IGJsb2Nrcy5iaXRrOworICAgICAgICAgICAgcSA9IGJsb2Nrcy53cml0ZUF0OyBtID0gcSA8IGJsb2Nrcy5yZWFkQXQgPyBibG9ja3MucmVhZEF0IC0gcSAtIDEgOiBibG9ja3MuZW5kIC0gcTsKKworICAgICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dCBhbmQgb3V0cHV0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSVDogIC8vIHg6IHNldCB1cCBmb3IgTEVOCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA+PSAyNTggJiYgbiA+PSAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MuYml0YiA9IGI7IGJsb2Nrcy5iaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouVG90YWxCeXRlc0luICs9IHAgLSB6Lk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBJbmZsYXRlRmFzdChsYml0cywgZGJpdHMsIGx0cmVlLCBsdHJlZV9pbmRleCwgZHRyZWUsIGR0cmVlX2luZGV4LCBibG9ja3MsIHopOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHouTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB6LkF2YWlsYWJsZUJ5dGVzSW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGJsb2Nrcy5iaXRiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBibG9ja3MuYml0azsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gYmxvY2tzLndyaXRlQXQ7IG0gPSBxIDwgYmxvY2tzLnJlYWRBdCA/IGJsb2Nrcy5yZWFkQXQgLSBxIC0gMSA6IGJsb2Nrcy5lbmQgLSBxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gWmxpYkNvbnN0YW50cy5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IChyID09IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EKSA/IFdBU0ggOiBCQURDT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkID0gbGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gbHRyZWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX2luZGV4ID0gbHRyZWVfaW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNhc2UgTEVOOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVOOiAgLy8gaTogZ2V0IGxlbmd0aC9saXRlcmFsL2VvYiBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmVlZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGsgPCBqKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouQXZhaWxhYmxlQnl0ZXNJbiA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouVG90YWxCeXRlc0luICs9IHAgLSB6Lk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIHw9ICh6LklucHV0QnVmZmVyW3ArK10gJiAweGZmKSA8PCBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGluZGV4ID0gKHRyZWVfaW5kZXggKyAoYiAmIEludGVybmFsSW5mbGF0ZUNvbnN0YW50cy5JbmZsYXRlTWFza1tqXSkpICogMzsKKworICAgICAgICAgICAgICAgICAgICAgICAgYiA+Pj0gKHRyZWVbdGluZGV4ICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgayAtPSAodHJlZVt0aW5kZXggKyAxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0cmVlW3RpbmRleF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGl0ZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdCA9IHRyZWVbdGluZGV4ICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IExJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZSAmIDE2KSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNUb0dldCA9IGUgJiAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSB0cmVlW3RpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBMRU5FWFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgJiA2NCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9pbmRleCA9IHRpbmRleCAvIDMgKyB0cmVlW3RpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlICYgMzIpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFdBU0g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEQ09ERTsgLy8gaW52YWxpZCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICB6Lk1lc3NhZ2UgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfREFUQV9FUlJPUjsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOworICAgICAgICAgICAgICAgICAgICAgICAgei5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2Nrcy5GbHVzaChyKTsKKworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVORVhUOiAgLy8gaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBiaXRzVG9HZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgaikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5iaXRiID0gYjsgYmxvY2tzLmJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOyB6LlRvdGFsQnl0ZXNJbiArPSBwIC0gei5OZXh0SW47IHouTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzLkZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLS07IGIgfD0gKHouSW5wdXRCdWZmZXJbcCsrXSAmIDB4ZmYpIDw8IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gKGIgJiBJbnRlcm5hbEluZmxhdGVDb25zdGFudHMuSW5mbGF0ZU1hc2tbal0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSBqOworICAgICAgICAgICAgICAgICAgICAgICAgayAtPSBqOworCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkID0gZGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gZHRyZWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX2luZGV4ID0gZHRyZWVfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gRElTVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSBESVNUOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTVDogIC8vIGk6IGdldCBkaXN0YW5jZSBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmVlZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGsgPCBqKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouQXZhaWxhYmxlQnl0ZXNJbiA9IG47IHouVG90YWxCeXRlc0luICs9IHAgLSB6Lk5leHRJbjsgei5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tLTsgYiB8PSAoei5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbmRleCA9ICh0cmVlX2luZGV4ICsgKGIgJiBJbnRlcm5hbEluZmxhdGVDb25zdGFudHMuSW5mbGF0ZU1hc2tbal0pKSAqIDM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPj49IHRyZWVbdGluZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBrIC09IHRyZWVbdGluZGV4ICsgMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAodHJlZVt0aW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZSAmIDB4MTApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzVG9HZXQgPSBlICYgMTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCA9IHRyZWVbdGluZGV4ICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IERJU1RFWFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgJiA2NCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9pbmRleCA9IHRpbmRleCAvIDMgKyB0cmVlW3RpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEJBRENPREU7IC8vIGludmFsaWQgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgei5NZXNzYWdlID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5iaXRiID0gYjsgYmxvY2tzLmJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gbjsgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOyB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzLkZsdXNoKHIpOworCisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNURVhUOiAgLy8gaTogZ2V0dGluZyBkaXN0YW5jZSBleHRyYQorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGJpdHNUb0dldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGsgPCBqKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouQXZhaWxhYmxlQnl0ZXNJbiA9IG47IHouVG90YWxCeXRlc0luICs9IHAgLSB6Lk5leHRJbjsgei5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tLTsgYiB8PSAoei5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gKGIgJiBJbnRlcm5hbEluZmxhdGVDb25zdGFudHMuSW5mbGF0ZU1hc2tbal0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSBqOworICAgICAgICAgICAgICAgICAgICAgICAgayAtPSBqOworCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQ09QWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2FzZSBDT1BZOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09QWTogIC8vIG86IGNvcHlpbmcgYnl0ZXMgaW4gd2luZG93LCB3YWl0aW5nIGZvciBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHEgLSBkaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGYgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsbyB3aW5kb3cgc2l6ZS0id2hpbGUiIGluc3RlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICs9IGJsb2Nrcy5lbmQ7IC8vIG9mICJpZiIgaGFuZGxlcyBpbnZhbGlkIGRpc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSA9PSBibG9ja3MuZW5kICYmIGJsb2Nrcy5yZWFkQXQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IDA7IG0gPSBxIDwgYmxvY2tzLnJlYWRBdCA/IGJsb2Nrcy5yZWFkQXQgLSBxIC0gMSA6IGJsb2Nrcy5lbmQgLSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy53cml0ZUF0ID0gcTsgciA9IGJsb2Nrcy5GbHVzaChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBibG9ja3Mud3JpdGVBdDsgbSA9IHEgPCBibG9ja3MucmVhZEF0ID8gYmxvY2tzLnJlYWRBdCAtIHEgLSAxIDogYmxvY2tzLmVuZCAtIHE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID09IGJsb2Nrcy5lbmQgJiYgYmxvY2tzLnJlYWRBdCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAwOyBtID0gcSA8IGJsb2Nrcy5yZWFkQXQgPyBibG9ja3MucmVhZEF0IC0gcSAtIDEgOiBibG9ja3MuZW5kIC0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MuYml0YiA9IGI7IGJsb2Nrcy5iaXRrID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouVG90YWxCeXRlc0luICs9IHAgLSB6Lk5leHRJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud2luZG93W3ErK10gPSBibG9ja3Mud2luZG93W2YrK107IG0tLTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID09IGJsb2Nrcy5lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFNUQVJUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVQ6ICAvLyBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID09IGJsb2Nrcy5lbmQgJiYgYmxvY2tzLnJlYWRBdCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IDA7IG0gPSBxIDwgYmxvY2tzLnJlYWRBdCA/IGJsb2Nrcy5yZWFkQXQgLSBxIC0gMSA6IGJsb2Nrcy5lbmQgLSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOyByID0gYmxvY2tzLkZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gYmxvY2tzLndyaXRlQXQ7IG0gPSBxIDwgYmxvY2tzLnJlYWRBdCA/IGJsb2Nrcy5yZWFkQXQgLSBxIC0gMSA6IGJsb2Nrcy5lbmQgLSBxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID09IGJsb2Nrcy5lbmQgJiYgYmxvY2tzLnJlYWRBdCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gMDsgbSA9IHEgPCBibG9ja3MucmVhZEF0ID8gYmxvY2tzLnJlYWRBdCAtIHEgLSAxIDogYmxvY2tzLmVuZCAtIHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOyB6LlRvdGFsQnl0ZXNJbiArPSBwIC0gei5OZXh0SW47IHouTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy53cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX09LOworCisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud2luZG93W3ErK10gPSAoYnl0ZSlsaXQ7IG0tLTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFNUQVJUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVNIOiAgLy8gbzogZ290IGVvYiwgcG9zc2libHkgbW9yZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID4gNykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdW51c2VkIGJ5dGUsIGlmIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgLT0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0tOyAvLyBjYW4gYWx3YXlzIHJldHVybiBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOyByID0gYmxvY2tzLkZsdXNoKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGJsb2Nrcy53cml0ZUF0OyBtID0gcSA8IGJsb2Nrcy5yZWFkQXQgPyBibG9ja3MucmVhZEF0IC0gcSAtIDEgOiBibG9ja3MuZW5kIC0gcTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2Nrcy5yZWFkQXQgIT0gYmxvY2tzLndyaXRlQXQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gbjsgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOyB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLndyaXRlQXQgPSBxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjYXNlIEVORDsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEVORDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5iaXRiID0gYjsgYmxvY2tzLmJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gbjsgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOyB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzLkZsdXNoKHIpOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkFEQ09ERTogIC8vIHg6IGdvdCBlcnJvcgorCisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5iaXRiID0gYjsgYmxvY2tzLmJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gbjsgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOyB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3Mud3JpdGVBdCA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzLkZsdXNoKHIpOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByID0gWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FUlJPUjsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmJpdGIgPSBiOyBibG9ja3MuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOyB6LlRvdGFsQnl0ZXNJbiArPSBwIC0gei5OZXh0SW47IHouTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy53cml0ZUF0ID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MuRmx1c2gocik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLyBDYWxsZWQgd2l0aCBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB3cml0ZSBpbiB3aW5kb3cgYXQgbGVhc3QgMjU4CisgICAgICAgIC8vICh0aGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoKSBhbmQgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICAvLyBhdCBsZWFzdCB0ZW4uICBUaGUgdGVuIGJ5dGVzIGFyZSBzaXggYnl0ZXMgZm9yIHRoZSBsb25nZXN0IGxlbmd0aC8KKyAgICAgICAgLy8gZGlzdGFuY2UgcGFpciBwbHVzIGZvdXIgYnl0ZXMgZm9yIG92ZXJsb2FkaW5nIHRoZSBiaXQgYnVmZmVyLgorCisgICAgICAgIGludGVybmFsIGludCBJbmZsYXRlRmFzdChpbnQgYmwsIGludCBiZCwgaW50W10gdGwsIGludCB0bF9pbmRleCwgaW50W10gdGQsIGludCB0ZF9pbmRleCwgSW5mbGF0ZUJsb2NrcyBzLCBabGliQ29kZWMgeikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQ7ICAgICAgICAvLyB0ZW1wb3JhcnkgcG9pbnRlcgorICAgICAgICAgICAgaW50W10gdHA7ICAgICAvLyB0ZW1wb3JhcnkgcG9pbnRlcgorICAgICAgICAgICAgaW50IHRwX2luZGV4OyAvLyB0ZW1wb3JhcnkgcG9pbnRlcgorICAgICAgICAgICAgaW50IGU7ICAgICAgICAvLyBleHRyYSBiaXRzIG9yIG9wZXJhdGlvbgorICAgICAgICAgICAgaW50IGI7ICAgICAgICAvLyBiaXQgYnVmZmVyCisgICAgICAgICAgICBpbnQgazsgICAgICAgIC8vIGJpdHMgaW4gYml0IGJ1ZmZlcgorICAgICAgICAgICAgaW50IHA7ICAgICAgICAvLyBpbnB1dCBkYXRhIHBvaW50ZXIKKyAgICAgICAgICAgIGludCBuOyAgICAgICAgLy8gYnl0ZXMgYXZhaWxhYmxlIHRoZXJlCisgICAgICAgICAgICBpbnQgcTsgICAgICAgIC8vIG91dHB1dCB3aW5kb3cgd3JpdGUgcG9pbnRlcgorICAgICAgICAgICAgaW50IG07ICAgICAgICAvLyBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlcgorICAgICAgICAgICAgaW50IG1sOyAgICAgICAvLyBtYXNrIGZvciBsaXRlcmFsL2xlbmd0aCB0cmVlCisgICAgICAgICAgICBpbnQgbWQ7ICAgICAgIC8vIG1hc2sgZm9yIGRpc3RhbmNlIHRyZWUKKyAgICAgICAgICAgIGludCBjOyAgICAgICAgLy8gYnl0ZXMgdG8gY29weQorICAgICAgICAgICAgaW50IGQ7ICAgICAgICAvLyBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgZnJvbQorICAgICAgICAgICAgaW50IHI7ICAgICAgICAvLyBjb3B5IHNvdXJjZSBwb2ludGVyCisKKyAgICAgICAgICAgIGludCB0cF9pbmRleF90XzM7IC8vICh0cF9pbmRleCt0KSozCisKKyAgICAgICAgICAgIC8vIGxvYWQgaW5wdXQsIG91dHB1dCwgYml0IHZhbHVlcworICAgICAgICAgICAgcCA9IHouTmV4dEluOyBuID0gei5BdmFpbGFibGVCeXRlc0luOyBiID0gcy5iaXRiOyBrID0gcy5iaXRrOworICAgICAgICAgICAgcSA9IHMud3JpdGVBdDsgbSA9IHEgPCBzLnJlYWRBdCA/IHMucmVhZEF0IC0gcSAtIDEgOiBzLmVuZCAtIHE7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbWFza3MKKyAgICAgICAgICAgIG1sID0gSW50ZXJuYWxJbmZsYXRlQ29uc3RhbnRzLkluZmxhdGVNYXNrW2JsXTsKKyAgICAgICAgICAgIG1kID0gSW50ZXJuYWxJbmZsYXRlQ29uc3RhbnRzLkluZmxhdGVNYXNrW2JkXTsKKworICAgICAgICAgICAgLy8gZG8gdW50aWwgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgc3BhY2UgZm9yIGZhc3QgbG9vcAorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWUgY2FsbGVkIHdpdGggbSA+PSAyNTggJiYgbiA+PSAxMAorICAgICAgICAgICAgICAgIC8vIGdldCBsaXRlcmFsL2xlbmd0aCBjb2RlCisgICAgICAgICAgICAgICAgd2hpbGUgKGsgPCAoMjApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4IGJpdHMgZm9yIGxpdGVyYWwvbGVuZ3RoIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgICAgICAgICBiIHw9ICh6LklucHV0QnVmZmVyW3ArK10gJiAweGZmKSA8PCBrOyBrICs9IDg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdCA9IGIgJiBtbDsKKyAgICAgICAgICAgICAgICB0cCA9IHRsOworICAgICAgICAgICAgICAgIHRwX2luZGV4ID0gdGxfaW5kZXg7CisgICAgICAgICAgICAgICAgdHBfaW5kZXhfdF8zID0gKHRwX2luZGV4ICsgdCkgKiAzOworICAgICAgICAgICAgICAgIGlmICgoZSA9IHRwW3RwX2luZGV4X3RfM10pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiID4+PSAodHBbdHBfaW5kZXhfdF8zICsgMV0pOyBrIC09ICh0cFt0cF9pbmRleF90XzMgKyAxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgcy53aW5kb3dbcSsrXSA9IChieXRlKXRwW3RwX2luZGV4X3RfMyArIDJdOworICAgICAgICAgICAgICAgICAgICBtLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBiID4+PSAodHBbdHBfaW5kZXhfdF8zICsgMV0pOyBrIC09ICh0cFt0cF9pbmRleF90XzMgKyAxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlICYgMTYpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUgJj0gMTU7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gdHBbdHBfaW5kZXhfdF8zICsgMl0gKyAoKGludCliICYgSW50ZXJuYWxJbmZsYXRlQ29uc3RhbnRzLkluZmxhdGVNYXNrW2VdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYiA+Pj0gZTsgayAtPSBlOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNvZGUgZGlzdGFuY2UgYmFzZSBvZiBibG9jayB0byBjb3B5CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoayA8IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCBiaXRzIGZvciBkaXN0YW5jZSBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gKHouSW5wdXRCdWZmZXJbcCsrXSAmIDB4ZmYpIDw8IGs7IGsgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGIgJiBtZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwID0gdGQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0cF9pbmRleCA9IHRkX2luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgdHBfaW5kZXhfdF8zID0gKHRwX2luZGV4ICsgdCkgKiAzOworICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRwW3RwX2luZGV4X3RfM107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID4+PSAodHBbdHBfaW5kZXhfdF8zICsgMV0pOyBrIC09ICh0cFt0cF9pbmRleF90XzMgKyAxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgJiAxNikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBleHRyYSBiaXRzIHRvIGFkZCB0byBkaXN0YW5jZSBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJj0gMTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGV4dHJhIGJpdHMgKHVwIHRvIDEzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiB8PSAoei5JbnB1dEJ1ZmZlcltwKytdICYgMHhmZikgPDwgazsgayArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHRwW3RwX2luZGV4X3RfMyArIDJdICsgKGIgJiBJbnRlcm5hbEluZmxhdGVDb25zdGFudHMuSW5mbGF0ZU1hc2tbZV0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPj49IGU7IGsgLT0gZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB0aGUgY29weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtIC09IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxID49IGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBiZWZvcmUgZGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGp1c3QgY29weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHEgLSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgLSByID4gMCAmJiAyID4gKHEgLSByKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLndpbmRvd1txKytdID0gcy53aW5kb3dbcisrXTsgLy8gbWluaW11bSBjb3VudCBpcyB0aHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLndpbmRvd1txKytdID0gcy53aW5kb3dbcisrXTsgLy8gc28gdW5yb2xsIGxvb3AgYSBsaXR0bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjIC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShzLndpbmRvdywgciwgcy53aW5kb3csIHEsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gMjsgciArPSAyOyBjIC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIG9mZnNldCBhZnRlciBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHEgLSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9IHMuZW5kOyAvLyBmb3JjZSBwb2ludGVyIGluIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIgPCAwKTsgLy8gY292ZXJzIGludmFsaWQgZGlzdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gcy5lbmQgLSByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNvdXJjZSBjcm9zc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgLT0gZTsgLy8gd3JhcHBlZCBjb3B5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgLSByID4gMCAmJiBlID4gKHEgLSByKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMud2luZG93W3ErK10gPSBzLndpbmRvd1tyKytdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWUgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkocy53aW5kb3csIHIsIHMud2luZG93LCBxLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSArPSBlOyByICs9IGU7IGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gMDsgLy8gY29weSByZXN0IGZyb20gc3RhcnQgb2Ygd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGFsbCBvciB3aGF0J3MgbGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSAtIHIgPiAwICYmIGMgPiAocSAtIHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMud2luZG93W3ErK10gPSBzLndpbmRvd1tyKytdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tYyAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkocy53aW5kb3csIHIsIHMud2luZG93LCBxLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gYzsgciArPSBjOyBjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGUgJiA2NCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gdHBbdHBfaW5kZXhfdF8zICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgJiBJbnRlcm5hbEluZmxhdGVDb25zdGFudHMuSW5mbGF0ZU1hc2tbZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cF9pbmRleF90XzMgPSAodHBfaW5kZXggKyB0KSAqIDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0cFt0cF9pbmRleF90XzNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lk1lc3NhZ2UgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gei5BdmFpbGFibGVCeXRlc0luIC0gbjsgYyA9IChrID4+IDMpIDwgYyA/IGsgPj4gMyA6IGM7IG4gKz0gYzsgcCAtPSBjOyBrIC09IChjIDw8IDMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYml0YiA9IGI7IHMuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouQXZhaWxhYmxlQnl0ZXNJbiA9IG47IHouVG90YWxCeXRlc0luICs9IHAgLSB6Lk5leHRJbjsgei5OZXh0SW4gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLndyaXRlQXQgPSBxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgoZSAmIDY0KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IHRwW3RwX2luZGV4X3RfMyArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgdCArPSAoYiAmIEludGVybmFsSW5mbGF0ZUNvbnN0YW50cy5JbmZsYXRlTWFza1tlXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cF9pbmRleF90XzMgPSAodHBfaW5kZXggKyB0KSAqIDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgPSB0cFt0cF9pbmRleF90XzNdKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPj49ICh0cFt0cF9pbmRleF90XzMgKyAxXSk7IGsgLT0gKHRwW3RwX2luZGV4X3RfMyArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLndpbmRvd1txKytdID0gKGJ5dGUpdHBbdHBfaW5kZXhfdF8zICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChlICYgMzIpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB6LkF2YWlsYWJsZUJ5dGVzSW4gLSBuOyBjID0gKGsgPj4gMykgPCBjID8gayA+PiAzIDogYzsgbiArPSBjOyBwIC09IGM7IGsgLT0gKGMgPDwgMyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYml0YiA9IGI7IHMuYml0ayA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICB6LkF2YWlsYWJsZUJ5dGVzSW4gPSBuOyB6LlRvdGFsQnl0ZXNJbiArPSBwIC0gei5OZXh0SW47IHouTmV4dEluID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMud3JpdGVBdCA9IHE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHouTWVzc2FnZSA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworCisgICAgICAgICAgICAgICAgICAgICAgICBjID0gei5BdmFpbGFibGVCeXRlc0luIC0gbjsgYyA9IChrID4+IDMpIDwgYyA/IGsgPj4gMyA6IGM7IG4gKz0gYzsgcCAtPSBjOyBrIC09IChjIDw8IDMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzLmJpdGIgPSBiOyBzLmJpdGsgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gbjsgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOyB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBzLndyaXRlQXQgPSBxOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKG0gPj0gMjU4ICYmIG4gPj0gMTApOworCisgICAgICAgICAgICAvLyBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dC0tcmVzdG9yZSBwb2ludGVycyBhbmQgcmV0dXJuCisgICAgICAgICAgICBjID0gei5BdmFpbGFibGVCeXRlc0luIC0gbjsgYyA9IChrID4+IDMpIDwgYyA/IGsgPj4gMyA6IGM7IG4gKz0gYzsgcCAtPSBjOyBrIC09IChjIDw8IDMpOworCisgICAgICAgICAgICBzLmJpdGIgPSBiOyBzLmJpdGsgPSBrOworICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gbjsgei5Ub3RhbEJ5dGVzSW4gKz0gcCAtIHouTmV4dEluOyB6Lk5leHRJbiA9IHA7CisgICAgICAgICAgICBzLndyaXRlQXQgPSBxOworCisgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpbnRlcm5hbCBzZWFsZWQgY2xhc3MgSW5mbGF0ZU1hbmFnZXIKKyAgICB7CisgICAgICAgIC8vIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUFJFU0VUX0RJQ1QgPSAweDIwOworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFpfREVGTEFURUQgPSA4OworCisgICAgICAgIHByaXZhdGUgZW51bSBJbmZsYXRlTWFuYWdlck1vZGUKKyAgICAgICAgeworICAgICAgICAgICAgTUVUSE9EID0gMCwgIC8vIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlCisgICAgICAgICAgICBGTEFHICAgPSAxLCAgLy8gd2FpdGluZyBmb3IgZmxhZyBieXRlCisgICAgICAgICAgICBESUNUNCAgPSAyLCAgLy8gZm91ciBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvCisgICAgICAgICAgICBESUNUMyAgPSAzLCAgLy8gdGhyZWUgZGljdGlvbmFyeSBjaGVjayBieXRlcyB0byBnbworICAgICAgICAgICAgRElDVDIgID0gNCwgIC8vIHR3byBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvCisgICAgICAgICAgICBESUNUMSAgPSA1LCAgLy8gb25lIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZSB0byBnbworICAgICAgICAgICAgRElDVDAgID0gNiwgIC8vIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgICAgICAgICAgICBCTE9DS1MgPSA3LCAgLy8gZGVjb21wcmVzc2luZyBibG9ja3MKKyAgICAgICAgICAgIENIRUNLNCA9IDgsICAvLyBmb3VyIGNoZWNrIGJ5dGVzIHRvIGdvCisgICAgICAgICAgICBDSEVDSzMgPSA5LCAgLy8gdGhyZWUgY2hlY2sgYnl0ZXMgdG8gZ28KKyAgICAgICAgICAgIENIRUNLMiA9IDEwLCAvLyB0d28gY2hlY2sgYnl0ZXMgdG8gZ28KKyAgICAgICAgICAgIENIRUNLMSA9IDExLCAvLyBvbmUgY2hlY2sgYnl0ZSB0byBnbworICAgICAgICAgICAgRE9ORSAgID0gMTIsIC8vIGZpbmlzaGVkIGNoZWNrLCBkb25lCisgICAgICAgICAgICBCQUQgICAgPSAxMywgLy8gZ290IGFuIGVycm9yLS1zdGF5IGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSW5mbGF0ZU1hbmFnZXJNb2RlIG1vZGU7IC8vIGN1cnJlbnQgaW5mbGF0ZSBtb2RlCisgICAgICAgIGludGVybmFsIFpsaWJDb2RlYyBfY29kZWM7IC8vIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtCisKKyAgICAgICAgLy8gbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24KKyAgICAgICAgaW50ZXJuYWwgaW50IG1ldGhvZDsgLy8gaWYgRkxBR1MsIG1ldGhvZCBieXRlCisKKyAgICAgICAgLy8gaWYgQ0hFQ0ssIGNoZWNrIHZhbHVlcyB0byBjb21wYXJlCisgICAgICAgIGludGVybmFsIHVpbnQgY29tcHV0ZWRDaGVjazsgLy8gY29tcHV0ZWQgY2hlY2sgdmFsdWUKKyAgICAgICAgaW50ZXJuYWwgdWludCBleHBlY3RlZENoZWNrOyAvLyBzdHJlYW0gY2hlY2sgdmFsdWUKKworICAgICAgICAvLyBpZiBCQUQsIGluZmxhdGVTeW5jJ3MgbWFya2VyIGJ5dGVzIGNvdW50CisgICAgICAgIGludGVybmFsIGludCBtYXJrZXI7CisKKyAgICAgICAgLy8gbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbgorICAgICAgICAvL2ludGVybmFsIGludCBub3dyYXA7IC8vIGZsYWcgZm9yIG5vIHdyYXBwZXIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYW5kbGVSZmMxOTUwSGVhZGVyQnl0ZXMgPSB0cnVlOworICAgICAgICBpbnRlcm5hbCBib29sIEhhbmRsZVJmYzE5NTBIZWFkZXJCeXRlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2hhbmRsZVJmYzE5NTBIZWFkZXJCeXRlczsgfQorICAgICAgICAgICAgc2V0IHsgX2hhbmRsZVJmYzE5NTBIZWFkZXJCeXRlcyA9IHZhbHVlOyB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IHdiaXRzOyAvLyBsb2cyKHdpbmRvdyBzaXplKSAgKDguLjE1LCBkZWZhdWx0cyB0byAxNSkKKworICAgICAgICBpbnRlcm5hbCBJbmZsYXRlQmxvY2tzIGJsb2NrczsgLy8gY3VycmVudCBpbmZsYXRlX2Jsb2NrcyBzdGF0ZQorCisgICAgICAgIHB1YmxpYyBJbmZsYXRlTWFuYWdlcigpIHsgfQorCisgICAgICAgIHB1YmxpYyBJbmZsYXRlTWFuYWdlcihib29sIGV4cGVjdFJmYzE5NTBIZWFkZXJCeXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgX2hhbmRsZVJmYzE5NTBIZWFkZXJCeXRlcyA9IGV4cGVjdFJmYzE5NTBIZWFkZXJCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGludCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4gPSBfY29kZWMuVG90YWxCeXRlc091dCA9IDA7CisgICAgICAgICAgICBfY29kZWMuTWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICBtb2RlID0gSGFuZGxlUmZjMTk1MEhlYWRlckJ5dGVzID8gSW5mbGF0ZU1hbmFnZXJNb2RlLk1FVEhPRCA6IEluZmxhdGVNYW5hZ2VyTW9kZS5CTE9DS1M7CisgICAgICAgICAgICBibG9ja3MuUmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBpbnQgRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJsb2NrcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJsb2Nrcy5GcmVlKCk7CisgICAgICAgICAgICBibG9ja3MgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9PSzsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGludCBJbml0aWFsaXplKFpsaWJDb2RlYyBjb2RlYywgaW50IHcpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb2RlYyA9IGNvZGVjOworICAgICAgICAgICAgX2NvZGVjLk1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgYmxvY2tzID0gbnVsbDsKKworICAgICAgICAgICAgLy8gaGFuZGxlIHVuZG9jdW1lbnRlZCBub3dyYXAgb3B0aW9uIChubyB6bGliIGhlYWRlciBvciBjaGVjaykKKyAgICAgICAgICAgIC8vbm93cmFwID0gMDsKKyAgICAgICAgICAgIC8vaWYgKHcgPCAwKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICB3ID0gLSB3OworICAgICAgICAgICAgLy8gICAgbm93cmFwID0gMTsKKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICAvLyBzZXQgd2luZG93IHNpemUKKyAgICAgICAgICAgIGlmICh3IDwgOCB8fCB3ID4gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5kKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIkJhZCB3aW5kb3cgc2l6ZS4iKTsKKworICAgICAgICAgICAgICAgIC8vcmV0dXJuIFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3Yml0cyA9IHc7CisKKyAgICAgICAgICAgIGJsb2NrcyA9IG5ldyBJbmZsYXRlQmxvY2tzKGNvZGVjLAorICAgICAgICAgICAgICAgIEhhbmRsZVJmYzE5NTBIZWFkZXJCeXRlcyA/IHRoaXMgOiBudWxsLAorICAgICAgICAgICAgICAgIDEgPDwgdyk7CisKKyAgICAgICAgICAgIC8vIHJlc2V0IHN0YXRlCisgICAgICAgICAgICBSZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9PSzsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgaW50IEluZmxhdGUoRmx1c2hUeXBlIGZsdXNoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYjsKKworICAgICAgICAgICAgaWYgKF9jb2RlYy5JbnB1dEJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJJbnB1dEJ1ZmZlciBpcyBudWxsLiAiKTsKKworLy8gICAgICAgICAgICAgaW50IGYgPSAoZmx1c2ggPT0gRmx1c2hUeXBlLkZpbmlzaCkKKy8vICAgICAgICAgICAgICAgICA/IFpsaWJDb25zdGFudHMuWl9CVUZfRVJST1IKKy8vICAgICAgICAgICAgICAgICA6IFpsaWJDb25zdGFudHMuWl9PSzsKKworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODg3MAorICAgICAgICAgICAgaW50IGYgPSBabGliQ29uc3RhbnRzLlpfT0s7CisgICAgICAgICAgICBpbnQgciA9IFpsaWJDb25zdGFudHMuWl9CVUZfRVJST1I7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5mbGF0ZU1hbmFnZXJNb2RlLk1FVEhPRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9PSAwKSByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKG1ldGhvZCA9IF9jb2RlYy5JbnB1dEJ1ZmZlcltfY29kZWMuTmV4dEluKytdKSAmIDB4ZikgIT0gWl9ERUZMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZU1hbmFnZXJNb2RlLkJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTWVzc2FnZSA9IFN0cmluZy5Gb3JtYXQoInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kICgweHswOlgyfSkiLCBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IDU7IC8vIGNhbid0IHRyeSBpbmZsYXRlU3luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtZXRob2QgPj4gNCkgKyA4ID4gd2JpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVNYW5hZ2VyTW9kZS5CQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk1lc3NhZ2UgPSBTdHJpbmcuRm9ybWF0KCJpbnZhbGlkIHdpbmRvdyBzaXplICh7MH0pIiwgKG1ldGhvZCA+PiA0KSArIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IDU7IC8vIGNhbid0IHRyeSBpbmZsYXRlU3luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVNYW5hZ2VyTW9kZS5GTEFHOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5GTEFHOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID09IDApIHJldHVybiByOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGY7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbisrOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChfY29kZWMuSW5wdXRCdWZmZXJbX2NvZGVjLk5leHRJbisrXSkgJiAweGZmOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgobWV0aG9kIDw8IDgpICsgYikgJSAzMSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZU1hbmFnZXJNb2RlLkJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuTWVzc2FnZSA9ICJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSA1OyAvLyBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICgoYiAmIFBSRVNFVF9ESUNUKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW5mbGF0ZU1hbmFnZXJNb2RlLkJMT0NLUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5mbGF0ZU1hbmFnZXJNb2RlLkRJQ1Q0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlTWFuYWdlck1vZGUuRElDVDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luLS07CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luKys7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENoZWNrID0gKHVpbnQpKChfY29kZWMuSW5wdXRCdWZmZXJbX2NvZGVjLk5leHRJbisrXSA8PCAyNCkgJiAweGZmMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuRElDVDM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5ESUNUMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9PSAwKSByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ2hlY2sgKz0gKHVpbnQpKChfY29kZWMuSW5wdXRCdWZmZXJbX2NvZGVjLk5leHRJbisrXSA8PCAxNikgJiAweDAwZmYwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuRElDVDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5ESUNUMjoKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID09IDApIHJldHVybiByOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGY7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbisrOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDaGVjayArPSAodWludCkoKF9jb2RlYy5JbnB1dEJ1ZmZlcltfY29kZWMuTmV4dEluKytdIDw8IDgpICYgMHgwMDAwZmYwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZU1hbmFnZXJNb2RlLkRJQ1QxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5ESUNUMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9PSAwKSByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4tLTsgX2NvZGVjLlRvdGFsQnl0ZXNJbisrOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDaGVjayArPSAodWludCkoX2NvZGVjLklucHV0QnVmZmVyW19jb2RlYy5OZXh0SW4rK10gJiAweDAwMDAwMGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5fQWRsZXIzMiA9IGV4cGVjdGVkQ2hlY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZU1hbmFnZXJNb2RlLkRJQ1QwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9ORUVEX0RJQ1Q7CisKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5ESUNUMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLk1lc3NhZ2UgPSAibmVlZCBkaWN0aW9uYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IDA7IC8vIGNhbiB0cnkgaW5mbGF0ZVN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VSUk9SOworCisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlTWFuYWdlck1vZGUuQkxPQ0tTOgorICAgICAgICAgICAgICAgICAgICAgICAgciA9IGJsb2Nrcy5Qcm9jZXNzKHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVNYW5hZ2VyTW9kZS5CQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gMDsgLy8gY2FuIHRyeSBpbmZsYXRlU3luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBabGliQ29uc3RhbnRzLlpfT0spIHIgPSBmOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAociAhPSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZENoZWNrID0gYmxvY2tzLlJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUhhbmRsZVJmYzE5NTBIZWFkZXJCeXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZU1hbmFnZXJNb2RlLkRPTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVNYW5hZ2VyTW9kZS5DSEVDSzQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5DSEVDSzQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luLS07CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luKys7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENoZWNrID0gKHVpbnQpKChfY29kZWMuSW5wdXRCdWZmZXJbX2NvZGVjLk5leHRJbisrXSA8PCAyNCkgJiAweGZmMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuQ0hFQ0szOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmZsYXRlTWFuYWdlck1vZGUuQ0hFQ0szOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2RlYy5BdmFpbGFibGVCeXRlc0luID09IDApIHJldHVybiByOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGY7CisgICAgICAgICAgICAgICAgICAgICAgICBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbi0tOyBfY29kZWMuVG90YWxCeXRlc0luKys7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZENoZWNrICs9ICh1aW50KSgoX2NvZGVjLklucHV0QnVmZmVyW19jb2RlYy5OZXh0SW4rK10gPDwgMTYpICYgMHgwMGZmMDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gSW5mbGF0ZU1hbmFnZXJNb2RlLkNIRUNLMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5mbGF0ZU1hbmFnZXJNb2RlLkNIRUNLMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbiA9PSAwKSByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmOworICAgICAgICAgICAgICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzSW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ2hlY2sgKz0gKHVpbnQpKChfY29kZWMuSW5wdXRCdWZmZXJbX2NvZGVjLk5leHRJbisrXSA8PCA4KSAmIDB4MDAwMGZmMDApOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVNYW5hZ2VyTW9kZS5DSEVDSzE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5DSEVDSzE6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5BdmFpbGFibGVCeXRlc0luLS07IF9jb2RlYy5Ub3RhbEJ5dGVzSW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ2hlY2sgKz0gKHVpbnQpKF9jb2RlYy5JbnB1dEJ1ZmZlcltfY29kZWMuTmV4dEluKytdICYgMHgwMDAwMDBmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRDaGVjayAhPSBleHBlY3RlZENoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb2RlYy5NZXNzYWdlID0gImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSA1OyAvLyBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuRE9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORDsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIEluZmxhdGVNYW5hZ2VyTW9kZS5ET05FOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5mbGF0ZU1hbmFnZXJNb2RlLkJBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIkJhZCBzdGF0ZSAoezB9KSIsIF9jb2RlYy5NZXNzYWdlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJTdHJlYW0gZXJyb3IuIik7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgaW50ZXJuYWwgaW50IFNldERpY3Rpb25hcnkoYnl0ZVtdIGRpY3Rpb25hcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZGljdGlvbmFyeS5MZW5ndGg7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBJbmZsYXRlTWFuYWdlck1vZGUuRElDVDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIlN0cmVhbSBlcnJvci4iKTsKKworICAgICAgICAgICAgaWYgKEFkbGVyLkFkbGVyMzIoMSwgZGljdGlvbmFyeSwgMCwgZGljdGlvbmFyeS5MZW5ndGgpICE9IF9jb2RlYy5fQWRsZXIzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9jb2RlYy5fQWRsZXIzMiA9IEFkbGVyLkFkbGVyMzIoMCwgbnVsbCwgMCwgMCk7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gKDEgPDwgd2JpdHMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9ICgxIDw8IHdiaXRzKSAtIDE7CisgICAgICAgICAgICAgICAgaW5kZXggPSBkaWN0aW9uYXJ5Lkxlbmd0aCAtIGxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsb2Nrcy5TZXREaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGluZGV4LCBsZW5ndGgpOworICAgICAgICAgICAgbW9kZSA9IEluZmxhdGVNYW5hZ2VyTW9kZS5CTE9DS1M7CisgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX09LOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gbWFyayA9IG5ldyBieXRlW10geyAwLCAwLCAweGZmLCAweGZmIH07CisKKyAgICAgICAgaW50ZXJuYWwgaW50IFN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbjsgLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQKKyAgICAgICAgICAgIGludCBwOyAvLyBwb2ludGVyIHRvIGJ5dGVzCisgICAgICAgICAgICBpbnQgbTsgLy8gbnVtYmVyIG9mIG1hcmtlciBieXRlcyBmb3VuZCBpbiBhIHJvdworICAgICAgICAgICAgbG9uZyByLCB3OyAvLyB0ZW1wb3JhcmllcyB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQKKworICAgICAgICAgICAgLy8gc2V0IHVwCisgICAgICAgICAgICBpZiAobW9kZSAhPSBJbmZsYXRlTWFuYWdlck1vZGUuQkFEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuQkFEOworICAgICAgICAgICAgICAgIG1hcmtlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG4gPSBfY29kZWMuQXZhaWxhYmxlQnl0ZXNJbikgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX0JVRl9FUlJPUjsKKyAgICAgICAgICAgIHAgPSBfY29kZWMuTmV4dEluOworICAgICAgICAgICAgbSA9IG1hcmtlcjsKKworICAgICAgICAgICAgLy8gc2VhcmNoCisgICAgICAgICAgICB3aGlsZSAobiAhPSAwICYmIG0gPCA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY29kZWMuSW5wdXRCdWZmZXJbcF0gPT0gbWFya1ttXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2NvZGVjLklucHV0QnVmZmVyW3BdICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbSA9IDQgLSBtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwKys7IG4tLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVzdG9yZQorICAgICAgICAgICAgX2NvZGVjLlRvdGFsQnl0ZXNJbiArPSBwIC0gX2NvZGVjLk5leHRJbjsKKyAgICAgICAgICAgIF9jb2RlYy5OZXh0SW4gPSBwOworICAgICAgICAgICAgX2NvZGVjLkF2YWlsYWJsZUJ5dGVzSW4gPSBuOworICAgICAgICAgICAgbWFya2VyID0gbTsKKworICAgICAgICAgICAgLy8gcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBvbiBhIG5ldyBibG9jaworICAgICAgICAgICAgaWYgKG0gIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByID0gX2NvZGVjLlRvdGFsQnl0ZXNJbjsKKyAgICAgICAgICAgIHcgPSBfY29kZWMuVG90YWxCeXRlc091dDsKKyAgICAgICAgICAgIFJlc2V0KCk7CisgICAgICAgICAgICBfY29kZWMuVG90YWxCeXRlc0luID0gcjsKKyAgICAgICAgICAgIF9jb2RlYy5Ub3RhbEJ5dGVzT3V0ID0gdzsKKyAgICAgICAgICAgIG1vZGUgPSBJbmZsYXRlTWFuYWdlck1vZGUuQkxPQ0tTOworICAgICAgICAgICAgcmV0dXJuIFpsaWJDb25zdGFudHMuWl9PSzsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQKKyAgICAgICAgLy8gYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IG9uZSBQUFAKKyAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMgWl9TWU5DX0ZMVVNICisgICAgICAgIC8vIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQgYmxvY2suIFdoZW4KKyAgICAgICAgLy8gZGVjb21wcmVzc2luZywgUFBQIGNoZWNrcyB0aGF0IGF0IHRoZSBlbmQgb2YgaW5wdXQgcGFja2V0LCBpbmZsYXRlIGlzCisgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KKyAgICAgICAgaW50ZXJuYWwgaW50IFN5bmNQb2ludChabGliQ29kZWMgeikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJsb2Nrcy5TeW5jUG9pbnQoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1BhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzk2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1BhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbS5jcwpAQCAtMCwwICsxLDEzODYgQEAKKy8vI2RlZmluZSBUcmFjZQorCisvLyBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0uY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEEgRGVmbGF0ZVN0cmVhbSB0aGF0IGRvZXMgY29tcHJlc3Npb24gb25seSwgaXQgdXNlcyBhCisvLyBkaXZpZGUtYW5kLWNvbnF1ZXIgYXBwcm9hY2ggd2l0aCBtdWx0aXBsZSB0aHJlYWRzIHRvIGV4cGxvaXQgbXVsdGlwbGUKKy8vIENQVXMgZm9yIHRoZSBERUZMQVRFIGNvbXB1dGF0aW9uLgorLy8KKy8vIGxhc3Qgc2F2ZWQ6IDwyMDExLUp1bHktMzEgMTQ6NDk6NDA+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgYnkgRGlubyBDaGllc2EKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQhCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5JTzsKKworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYgoreworICAgIGludGVybmFsIGNsYXNzIFdvcmtJdGVtCisgICAgeworICAgICAgICBwdWJsaWMgYnl0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgcHVibGljIGJ5dGVbXSBjb21wcmVzc2VkOworICAgICAgICBwdWJsaWMgaW50IGNyYzsKKyAgICAgICAgcHVibGljIGludCBpbmRleDsKKyAgICAgICAgcHVibGljIGludCBvcmRpbmFsOworICAgICAgICBwdWJsaWMgaW50IGlucHV0Qnl0ZXNBdmFpbGFibGU7CisgICAgICAgIHB1YmxpYyBpbnQgY29tcHJlc3NlZEJ5dGVzQXZhaWxhYmxlOworICAgICAgICBwdWJsaWMgWmxpYkNvZGVjIGNvbXByZXNzb3I7CisKKyAgICAgICAgcHVibGljIFdvcmtJdGVtKGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgSW9uaWMuWmxpYi5Db21wcmVzc2lvbkxldmVsIGNvbXByZXNzTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblN0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl4KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJ1ZmZlcj0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICAvLyBhbGxvYyA1IGJ5dGVzIG92ZXJoZWFkIGZvciBldmVyeSBibG9jayAobWFyZ2luIG9mIHNhZmV0eT0gMikKKyAgICAgICAgICAgIGludCBuID0gc2l6ZSArICgoc2l6ZSAvIDMyNzY4KSsxKSAqIDUgKiAyOworICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkID0gbmV3IGJ5dGVbbl07CisgICAgICAgICAgICB0aGlzLmNvbXByZXNzb3IgPSBuZXcgWmxpYkNvZGVjKCk7CisgICAgICAgICAgICB0aGlzLmNvbXByZXNzb3IuSW5pdGlhbGl6ZURlZmxhdGUoY29tcHJlc3NMZXZlbCwgZmFsc2UpOworICAgICAgICAgICAgdGhpcy5jb21wcmVzc29yLk91dHB1dEJ1ZmZlciA9IHRoaXMuY29tcHJlc3NlZDsKKyAgICAgICAgICAgIHRoaXMuY29tcHJlc3Nvci5JbnB1dEJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgICAgICAgICAgdGhpcy5pbmRleCA9IGl4OworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIEEgY2xhc3MgZm9yIGNvbXByZXNzaW5nIHN0cmVhbXMgdXNpbmcgdGhlCisgICAgLy8vICAgRGVmbGF0ZSBhbGdvcml0aG0gd2l0aCBtdWx0aXBsZSB0aHJlYWRzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gICBUaGlzIGNsYXNzIHBlcmZvcm1zIERFRkxBVEUgY29tcHJlc3Npb24gdGhyb3VnaCB3cml0aW5nLiAgRm9yCisgICAgLy8vICAgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgRGVmbGF0ZSBhbGdvcml0aG0sIHNlZSBJRVRGIFJGQyAxOTUxLAorICAgIC8vLyAgICJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMy4iCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vICAgVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIDxzZWUgY3JlZj0iSW9uaWMuWmxpYi5EZWZsYXRlU3RyZWFtIi8+LCBleGNlcHQKKyAgICAvLy8gICB0aGF0IHRoaXMgY2xhc3MgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHksIGFuZCB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYW4KKyAgICAvLy8gICBhcHByb2FjaCB0aGF0IGVtcGxveXMgbXVsdGlwbGUgd29ya2VyIHRocmVhZHMgdG8gcGVyZm9ybSB0aGUgREVGTEFURS4gIE9uCisgICAgLy8vICAgYSBtdWx0aS1jcHUgb3IgbXVsdGktY29yZSBjb21wdXRlciwgdGhlIHBlcmZvcm1hbmNlIG9mIHRoaXMgY2xhc3MgY2FuIGJlCisgICAgLy8vICAgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aGUgc2luZ2xlLXRocmVhZGVkIERlZmxhdGVTdHJlYW0sIHBhcnRpY3VsYXJseQorICAgIC8vLyAgIGZvciBsYXJnZXIgc3RyZWFtcy4gIEhvdyBsYXJnZT8gIEFueXRoaW5nIG92ZXIgMTBtYiBpcyBhIGdvb2QgY2FuZGlkYXRlCisgICAgLy8vICAgZm9yIHBhcmFsbGVsIGNvbXByZXNzaW9uLgorICAgIC8vLyA8L3BhcmE+CisgICAgLy8vCisgICAgLy8vIDxwYXJhPgorICAgIC8vLyAgIFRoZSB0cmFkZW9mZiBpcyB0aGF0IHRoaXMgY2xhc3MgdXNlcyBtb3JlIG1lbW9yeSBhbmQgbW9yZSBDUFUgdGhhbiB0aGUKKyAgICAvLy8gICB2YW5pbGxhIERlZmxhdGVTdHJlYW0sIGFuZCBhbHNvIGlzIGxlc3MgZWZmaWNpZW50IGFzIGEgY29tcHJlc3Nvci4gRm9yCisgICAgLy8vICAgbGFyZ2UgZmlsZXMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBzdHJlYW0gY2FuIGJlIGxlc3MgdGhhbiAxJQorICAgIC8vLyAgIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIGEgY29tcHJlc3NlZCBkYXRhIHN0cmVhbSBmcm9tIHRoZSB2YW5pYWxsYQorICAgIC8vLyAgIERlZmxhdGVTdHJlYW0uICBGb3Igc21hbGxlciBmaWxlcyB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgbGFyZ2VyLiAgVGhlCisgICAgLy8vICAgZGlmZmVyZW5jZSB3aWxsIGFsc28gYmUgbGFyZ2VyIGlmIHlvdSBzZXQgdGhlIEJ1ZmZlclNpemUgdG8gYmUgbG93ZXIgdGhhbgorICAgIC8vLyAgIHRoZSBkZWZhdWx0IHZhbHVlLiAgWW91ciBtaWxlYWdlIG1heSB2YXJ5LiBGaW5hbGx5LCBmb3Igc21hbGwgZmlsZXMsIHRoZQorICAgIC8vLyAgIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSBjYW4gYmUgbXVjaCBzbG93ZXIgdGhhbiB0aGUgdmFuaWxsYQorICAgIC8vLyAgIERlZmxhdGVTdHJlYW0sIGJlY2F1c2Ugb2YgdGhlIG92ZXJoZWFkIGFzc29jaWF0ZWQgdG8gdXNpbmcgdGhlIHRocmVhZAorICAgIC8vLyAgIHBvb2wuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJJb25pYy5abGliLkRlZmxhdGVTdHJlYW0iIC8+CisgICAgcHVibGljIGNsYXNzIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSA6IFN5c3RlbS5JTy5TdHJlYW0KKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IElPX0JVRkZFUl9TSVpFX0RFRkFVTFQgPSA2NCAqIDEwMjQ7ICAvLyAxMjhrCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludCBCdWZmZXJQYWlyc1BlckNvcmUgPSA0OworCisgICAgICAgIHByaXZhdGUgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdDxXb3JrSXRlbT4gX3Bvb2w7CisgICAgICAgIHByaXZhdGUgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIF9sZWF2ZU9wZW47CisgICAgICAgIHByaXZhdGUgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0aW5nOworICAgICAgICBwcml2YXRlIFN5c3RlbS5JTy5TdHJlYW0gICAgICAgICAgICBfb3V0U3RyZWFtOworICAgICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgICAgICBfbWF4QnVmZmVyUGFpcnM7CisgICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIF9idWZmZXJTaXplID0gSU9fQlVGRkVSX1NJWkVfREVGQVVMVDsKKyAgICAgICAgcHJpdmF0ZSBBdXRvUmVzZXRFdmVudCAgICAgICAgICAgICAgX25ld2x5Q29tcHJlc3NlZEJsb2I7CisgICAgICAgIC8vcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50ICAgICAgICAgICAgX3dyaXRpbmdEb25lOworICAgICAgICAvL3ByaXZhdGUgTWFudWFsUmVzZXRFdmVudCAgICAgICAgICAgIF9zZXNzaW9uUmVzZXQ7CisgICAgICAgIHByaXZhdGUgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRMb2NrID0gbmV3IG9iamVjdCgpOworICAgICAgICBwcml2YXRlIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBfaXNDbG9zZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIF9maXJzdFdyaXRlRG9uZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRseUZpbGxpbmc7CisgICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIF9sYXN0RmlsbGVkOworICAgICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgICAgICBfbGFzdFdyaXR0ZW47CisgICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIF9sYXRlc3RDb21wcmVzc2VkOworICAgICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgICAgICBfQ3JjMzI7CisgICAgICAgIHByaXZhdGUgSW9uaWMuQ3JjLkNSQzMyICAgICAgICAgICAgIF9ydW5uaW5nQ3JjOworICAgICAgICBwcml2YXRlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICBfbGF0ZXN0TG9jayA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5RdWV1ZTxpbnQ+ICAgICBfdG9Xcml0ZTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5RdWV1ZTxpbnQ+ICAgICBfdG9GaWxsOworICAgICAgICBwcml2YXRlIEludDY0ICAgICAgICAgICAgICAgICAgICAgICBfdG90YWxCeXRlc1Byb2Nlc3NlZDsKKyAgICAgICAgcHJpdmF0ZSBJb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwgX2NvbXByZXNzTGV2ZWw7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgRXhjZXB0aW9uICAgICAgICAgIF9wZW5kaW5nRXhjZXB0aW9uOworICAgICAgICBwcml2YXRlIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBfaGFuZGxpbmdFeGNlcHRpb247CisgICAgICAgIHByaXZhdGUgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgIF9lTG9jayA9IG5ldyBPYmplY3QoKTsgIC8vIHByb3RlY3RzIF9wZW5kaW5nRXhjZXB0aW9uCisKKyAgICAgICAgLy8gVGhpcyBiaXRmaWVsZCBpcyB1c2VkIG9ubHkgd2hlbiBUcmFjZSBpcyBkZWZpbmVkLgorICAgICAgICAvL3ByaXZhdGUgVHJhY2VCaXRzIF9EZXNpcmVkVHJhY2UgPSBUcmFjZUJpdHMuV3JpdGUgfCBUcmFjZUJpdHMuV3JpdGVCZWdpbiB8CisgICAgICAgIC8vVHJhY2VCaXRzLldyaXRlRG9uZSB8IFRyYWNlQml0cy5MaWZlY3ljbGUgfCBUcmFjZUJpdHMuRmlsbCB8IFRyYWNlQml0cy5GbHVzaCB8CisgICAgICAgIC8vVHJhY2VCaXRzLlNlc3Npb247CisKKyAgICAgICAgLy9wcml2YXRlIFRyYWNlQml0cyBfRGVzaXJlZFRyYWNlID0gVHJhY2VCaXRzLldyaXRlQmVnaW4gfCBUcmFjZUJpdHMuV3JpdGVEb25lIHwgVHJhY2VCaXRzLlN5bmNoIHwgVHJhY2VCaXRzLkxpZmVjeWNsZSAgfCBUcmFjZUJpdHMuU2Vzc2lvbiA7CisKKyAgICAgICAgcHJpdmF0ZSBUcmFjZUJpdHMgX0Rlc2lyZWRUcmFjZSA9CisgICAgICAgICAgICBUcmFjZUJpdHMuU2Vzc2lvbiB8CisgICAgICAgICAgICBUcmFjZUJpdHMuQ29tcHJlc3MgfAorICAgICAgICAgICAgVHJhY2VCaXRzLldyaXRlVGFrZSB8CisgICAgICAgICAgICBUcmFjZUJpdHMuV3JpdGVFbnRlciB8CisgICAgICAgICAgICBUcmFjZUJpdHMuRW1pdEVudGVyIHwKKyAgICAgICAgICAgIFRyYWNlQml0cy5FbWl0RG9uZSB8CisgICAgICAgICAgICBUcmFjZUJpdHMuRW1pdExvY2sgfAorICAgICAgICAgICAgVHJhY2VCaXRzLkVtaXRTa2lwIHwKKyAgICAgICAgICAgIFRyYWNlQml0cy5FbWl0QmVnaW47CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgc3RyZWFtIGNvbXByZXNzZXMgZGF0YSB3cml0dGVuIGludG8gaXQgdmlhIHRoZSBERUZMQVRFCisgICAgICAgIC8vLyAgIGFsZ29yaXRobSAoc2VlIFJGQyAxOTUxKSwgYW5kIHdyaXRlcyBvdXQgdGhlIGNvbXByZXNzZWQgYnl0ZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBpbnN0YW5jZSB3aWxsIHVzZSB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCwgdGhlIGRlZmF1bHQKKyAgICAgICAgLy8vICAgYnVmZmVyIHNpemVzIGFuZCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgdGhyZWFkcyBhbmQgYnVmZmVycyBwZXIKKyAgICAgICAgLy8vICAgdGhyZWFkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8gPHNlZSBjcmVmPSJJb25pYy5abGliLkRlZmxhdGVTdHJlYW0iLz4sCisgICAgICAgIC8vLyAgIGV4Y2VwdCB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhbiBhcHByb2FjaCB0aGF0IGVtcGxveXMKKyAgICAgICAgLy8vICAgbXVsdGlwbGUgd29ya2VyIHRocmVhZHMgdG8gcGVyZm9ybSB0aGUgREVGTEFURS4gIE9uIGEgbXVsdGktY3B1IG9yCisgICAgICAgIC8vLyAgIG11bHRpLWNvcmUgY29tcHV0ZXIsIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBiZQorICAgICAgICAvLy8gICBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIHRoZSBzaW5nbGUtdGhyZWFkZWQgRGVmbGF0ZVN0cmVhbSwKKyAgICAgICAgLy8vICAgcGFydGljdWxhcmx5IGZvciBsYXJnZXIgc3RyZWFtcy4gIEhvdyBsYXJnZT8gIEFueXRoaW5nIG92ZXIgMTBtYiBpcworICAgICAgICAvLy8gICBhIGdvb2QgY2FuZGlkYXRlIGZvciBwYXJhbGxlbCBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLworICAgICAgICAvLy8gVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0gdG8gY29tcHJlc3MKKyAgICAgICAgLy8vIGRhdGEuICBJdCByZWFkcyBhIGZpbGUsIGNvbXByZXNzZXMgaXQsIGFuZCB3cml0ZXMgdGhlIGNvbXByZXNzZWQgZGF0YSB0bworICAgICAgICAvLy8gYSBzZWNvbmQsIG91dHB1dCBmaWxlLgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW1dPUktJTkdfQlVGRkVSX1NJWkVdOworICAgICAgICAvLy8gaW50IG49IC0xOworICAgICAgICAvLy8gU3RyaW5nIG91dHB1dEZpbGUgPSBmaWxlVG9Db21wcmVzcyArICIuY29tcHJlc3NlZCI7CisgICAgICAgIC8vLyB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAodmFyIHJhdyA9IFN5c3RlbS5JTy5GaWxlLkNyZWF0ZShvdXRwdXRGaWxlKSkKKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIHVzaW5nIChTdHJlYW0gY29tcHJlc3NvciA9IG5ldyBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0ocmF3KSkKKyAgICAgICAgLy8vICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgd2hpbGUgKChuPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkpICE9IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAvLy8gICAgICAgICAgICAgfQorICAgICAgICAvLy8gICAgICAgICB9CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gfQorICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPGNvZGUgbGFuZz0iVkIiPgorICAgICAgICAvLy8gRGltIGJ1ZmZlciBBcyBCeXRlKCkgPSBOZXcgQnl0ZSg0MDk2KSB7fQorICAgICAgICAvLy8gRGltIG4gQXMgSW50ZWdlciA9IC0xCisgICAgICAgIC8vLyBEaW0gb3V0cHV0RmlsZSBBcyBTdHJpbmcgPSAoZmlsZVRvQ29tcHJlc3MgJmFtcDsgIi5jb21wcmVzc2VkIikKKyAgICAgICAgLy8vIFVzaW5nIGlucHV0IEFzIFN0cmVhbSA9IEZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgVXNpbmcgcmF3IEFzIEZpbGVTdHJlYW0gPSBGaWxlLkNyZWF0ZShvdXRwdXRGaWxlKQorICAgICAgICAvLy8gICAgICAgICBVc2luZyBjb21wcmVzc29yIEFzIFN0cmVhbSA9IE5ldyBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0ocmF3KQorICAgICAgICAvLy8gICAgICAgICAgICAgRG8gV2hpbGUgKG4gJmx0OyZndDsgMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBJZiAobiAmZ3Q7IDApIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgRW5kIElmCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgbiA9IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKQorICAgICAgICAvLy8gICAgICAgICAgICAgTG9vcAorICAgICAgICAvLy8gICAgICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHN0cmVhbSB0byB3aGljaCBjb21wcmVzc2VkIGRhdGEgd2lsbCBiZSB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICA6IHRoaXMoc3RyZWFtLCBDb21wcmVzc2lvbkxldmVsLkRlZmF1bHQsIENvbXByZXNzaW9uU3RyYXRlZ3kuRGVmYXVsdCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIHVzaW5nIHRoZSBzcGVjaWZpZWQgQ29tcHJlc3Npb25MZXZlbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZWUgdGhlIDxzZWUgY3JlZj0iUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0pIi8+CisgICAgICAgIC8vLyAgIGNvbnN0cnVjdG9yIGZvciBleGFtcGxlIGNvZGUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHRvIHdoaWNoIGNvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+QSB0dW5pbmcga25vYiB0byB0cmFkZSBzcGVlZCBmb3IgZWZmZWN0aXZlbmVzcy48L3BhcmFtPgorICAgICAgICBwdWJsaWMgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBDb21wcmVzc2lvbkxldmVsIGxldmVsKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgbGV2ZWwsIENvbXByZXNzaW9uU3RyYXRlZ3kuRGVmYXVsdCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSBhbmQgc3BlY2lmeSB3aGV0aGVyIHRvIGxlYXZlIHRoZSBjYXB0aXZlIHN0cmVhbSBvcGVuCisgICAgICAgIC8vLyB3aGVuIHRoZSBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0gaXMgY2xvc2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFNlZSB0aGUgPHNlZSBjcmVmPSJQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSkiLz4KKyAgICAgICAgLy8vICAgY29uc3RydWN0b3IgZm9yIGV4YW1wbGUgY29kZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gdG8gd2hpY2ggY29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlYXZlT3BlbiI+CisgICAgICAgIC8vLyAgICB0cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRoZSBzdHJlYW0gdG8gcmVtYWluIG9wZW4gYWZ0ZXIgaW5mbGF0aW9uL2RlZmxhdGlvbi4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIGJvb2wgbGVhdmVPcGVuKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0LCBDb21wcmVzc2lvblN0cmF0ZWd5LkRlZmF1bHQsIGxlYXZlT3BlbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIGFuZCBzcGVjaWZ5IHdoZXRoZXIgdG8gbGVhdmUgdGhlIGNhcHRpdmUgc3RyZWFtIG9wZW4KKyAgICAgICAgLy8vIHdoZW4gdGhlIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSBpcyBjbG9zZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgU2VlIHRoZSA8c2VlIGNyZWY9IlBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtKSIvPgorICAgICAgICAvLy8gICBjb25zdHJ1Y3RvciBmb3IgZXhhbXBsZSBjb2RlLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHN0cmVhbSB0byB3aGljaCBjb21wcmVzc2VkIGRhdGEgd2lsbCBiZSB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPkEgdHVuaW5nIGtub2IgdG8gdHJhZGUgc3BlZWQgZm9yIGVmZmVjdGl2ZW5lc3MuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZWF2ZU9wZW4iPgorICAgICAgICAvLy8gICAgdHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gd291bGQgbGlrZSB0aGUgc3RyZWFtIHRvIHJlbWFpbiBvcGVuIGFmdGVyIGluZmxhdGlvbi9kZWZsYXRpb24uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBDb21wcmVzc2lvbkxldmVsIGxldmVsLCBib29sIGxlYXZlT3BlbikKKyAgICAgICAgICAgIDogdGhpcyhzdHJlYW0sIENvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdCwgQ29tcHJlc3Npb25TdHJhdGVneS5EZWZhdWx0LCBsZWF2ZU9wZW4pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyBDb21wcmVzc2lvbkxldmVsIGFuZCBDb21wcmVzc2lvblN0cmF0ZWd5LCBhbmQgc3BlY2lmeWluZyB3aGV0aGVyIHRvCisgICAgICAgIC8vLyBsZWF2ZSB0aGUgY2FwdGl2ZSBzdHJlYW0gb3BlbiB3aGVuIHRoZSBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0gaXMKKyAgICAgICAgLy8vIGNsb3NlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZWUgdGhlIDxzZWUgY3JlZj0iUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0pIi8+CisgICAgICAgIC8vLyAgIGNvbnN0cnVjdG9yIGZvciBleGFtcGxlIGNvZGUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHRvIHdoaWNoIGNvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+QSB0dW5pbmcga25vYiB0byB0cmFkZSBzcGVlZCBmb3IgZWZmZWN0aXZlbmVzcy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmF0ZWd5Ij4KKyAgICAgICAgLy8vICAgQnkgdHdlYWtpbmcgdGhpcyBwYXJhbWV0ZXIsIHlvdSBtYXkgYmUgYWJsZSB0byBvcHRpbWl6ZSB0aGUgY29tcHJlc3Npb24gZm9yCisgICAgICAgIC8vLyAgIGRhdGEgd2l0aCBwYXJ0aWN1bGFyIGNoYXJhY3RlcmlzdGljcy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj4KKyAgICAgICAgLy8vICAgIHRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIHdvdWxkIGxpa2UgdGhlIHN0cmVhbSB0byByZW1haW4gb3BlbiBhZnRlciBpbmZsYXRpb24vZGVmbGF0aW9uLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uU3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsZWF2ZU9wZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5MaWZlY3ljbGUgfCBUcmFjZUJpdHMuU2Vzc2lvbiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5MaWZlY3ljbGUgfCBUcmFjZUJpdHMuU2Vzc2lvbiwgIkNyZWF0ZSB7MDpYOH0iLCB0aGlzLkdldEhhc2hDb2RlKCkpOworICAgICAgICAgICAgX291dFN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgIF9jb21wcmVzc0xldmVsPSBsZXZlbDsKKyAgICAgICAgICAgIFN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgICAgICAgICBfbGVhdmVPcGVuID0gbGVhdmVPcGVuOworICAgICAgICAgICAgdGhpcy5NYXhCdWZmZXJQYWlycyA9IDE2OyAvLyBkZWZhdWx0CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIFpMSUIgc3RyYXRlZ3kgdG8gYmUgdXNlZCBkdXJpbmcgY29tcHJlc3Npb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25TdHJhdGVneSBTdHJhdGVneQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlciBwYWlycyB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBzZXRzIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgbWVtb3J5IGJ1ZmZlcgorICAgICAgICAvLy8gICBwYWlycyB0byBjcmVhdGUuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBzdHJlYW0gYWxsb2NhdGVzCisgICAgICAgIC8vLyAgIG11bHRpcGxlIGJ1ZmZlcnMgdG8gZmFjaWxpdGF0ZSBwYXJhbGxlbCBjb21wcmVzc2lvbi4gIEFzIGVhY2ggYnVmZmVyCisgICAgICAgIC8vLyAgIGZpbGxzIHVwLCB0aGlzIHN0cmVhbSB1c2VzIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iU3lzdGVtLlRocmVhZGluZy5UaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKFdhaXRDYWxsYmFjaykiPgorICAgICAgICAvLy8gICBUaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKCk8L3NlZT4KKyAgICAgICAgLy8vICAgdG8gY29tcHJlc3MgdGhvc2UgYnVmZmVycyBpbiBhIGJhY2tncm91bmQgdGhyZWFkcG9vbCB0aHJlYWQuIEFmdGVyIGEKKyAgICAgICAgLy8vICAgYnVmZmVyIGlzIGNvbXByZXNzZWQsIGl0IGlzIHJlLW9yZGVyZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICAgICAgICAvLy8gICBzdHJlYW0uCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEEgaGlnaGVyIG51bWJlciBvZiBidWZmZXIgcGFpcnMgZW5hYmxlcyBhIGhpZ2hlciBkZWdyZWUgb2YKKyAgICAgICAgLy8vICAgcGFyYWxsZWxpc20sIHdoaWNoIHRlbmRzIHRvIGluY3JlYXNlIHRoZSBzcGVlZCBvZiBjb21wcmVzc2lvbiBvbgorICAgICAgICAvLy8gICBtdWx0aS1jcHUgY29tcHV0ZXJzLiAgT24gdGhlIG90aGVyIGhhbmQsIGEgaGlnaGVyIG51bWJlciBvZiBidWZmZXIKKyAgICAgICAgLy8vICAgcGFpcnMgYWxzbyBpbXBsaWVzIGEgbGFyZ2VyIG1lbW9yeSBjb25zdW1wdGlvbiwgbW9yZSBhY3RpdmUgd29ya2VyCisgICAgICAgIC8vLyAgIHRocmVhZHMsIGFuZCBhIGhpZ2hlciBjcHUgdXRpbGl6YXRpb24gZm9yIGFueSBjb21wcmVzc2lvbi4gVGhpcworICAgICAgICAvLy8gICBwcm9wZXJ0eSBlbmFibGVzIHRoZSBhcHBsaWNhdGlvbiB0byBsaW1pdCBpdHMgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZAorICAgICAgICAvLy8gICBDUFUgdXRpbGl6YXRpb24gYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHJlcXVpcmVtZW50cy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgRm9yIGVhY2ggY29tcHJlc3Npb24gInRhc2siIHRoYXQgb2NjdXJzIGluIHBhcmFsbGVsLCB0aGVyZSBhcmUgMgorICAgICAgICAvLy8gICBidWZmZXJzIGFsbG9jYXRlZDogb25lIGZvciBpbnB1dCBhbmQgb25lIGZvciBvdXRwdXQuICBUaGlzIHByb3BlcnR5CisgICAgICAgIC8vLyAgIHNldHMgYSBsaW1pdCBmb3IgdGhlIG51bWJlciBvZiBwYWlycy4gIFRoZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZQorICAgICAgICAvLy8gICBzcGFjZSBhbGxvY2F0ZWQgZm9yIGJ1ZmZlcmluZyB3aWxsIHRoZW4gYmUgKE4qUyoyKSwgd2hlcmUgTiBpcyB0aGUKKyAgICAgICAgLy8vICAgbnVtYmVyIG9mIGJ1ZmZlciBwYWlycywgUyBpcyB0aGUgc2l6ZSBvZiBlYWNoIGJ1ZmZlciAoPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJCdWZmZXJTaXplIi8+KS4gIEJ5IGRlZmF1bHQsIERvdE5ldFppcCBhbGxvY2F0ZXMgNCBidWZmZXIKKyAgICAgICAgLy8vICAgcGFpcnMgcGVyIENQVSBjb3JlLCBzbyBpZiB5b3VyIG1hY2hpbmUgaGFzIDQgY29yZXMsIGFuZCB5b3UgcmV0YWluCisgICAgICAgIC8vLyAgIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplIG9mIDEyOGssIHRoZW4gdGhlCisgICAgICAgIC8vLyAgIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSB3aWxsIHVzZSA0ICogNCAqIDIgKiAxMjhrYiBvZiBidWZmZXIKKyAgICAgICAgLy8vICAgbWVtb3J5IGluIHRvdGFsLCBvciA0bWIsIGluIGJsb2NrcyBvZiAxMjhrYi4gIElmIHlvdSB0aGVuIHNldCB0aGlzCisgICAgICAgIC8vLyAgIHByb3BlcnR5IHRvIDgsIHRoZW4gdGhlIG51bWJlciB3aWxsIGJlIDggKiAyICogMTI4a2Igb2YgYnVmZmVyCisgICAgICAgIC8vLyAgIG1lbW9yeSwgb3IgMm1iLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBDUFUgdXRpbGl6YXRpb24gd2lsbCBhbHNvIGdvIHVwIHdpdGggYWRkaXRpb25hbCBidWZmZXJzLCBiZWNhdXNlIGEKKyAgICAgICAgLy8vICAgbGFyZ2VyIG51bWJlciBvZiBidWZmZXIgcGFpcnMgYWxsb3dzIGEgbGFyZ2VyIG51bWJlciBvZiBiYWNrZ3JvdW5kCisgICAgICAgIC8vLyAgIHRocmVhZHMgdG8gY29tcHJlc3MgaW4gcGFyYWxsZWwuIElmIHlvdSBmaW5kIHRoYXQgcGFyYWxsZWwKKyAgICAgICAgLy8vICAgY29tcHJlc3Npb24gaXMgY29uc3VtaW5nIHRvbyBtdWNoIG1lbW9yeSBvciBDUFUsIHlvdSBjYW4gYWRqdXN0IHRoaXMKKyAgICAgICAgLy8vICAgdmFsdWUgZG93bndhcmQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE2LiBEaWZmZXJlbnQgdmFsdWVzIG1heSBkZWxpdmVyIGJldHRlciBvcgorICAgICAgICAvLy8gICB3b3JzZSByZXN1bHRzLCBkZXBlbmRpbmcgb24geW91ciBwcmlvcml0aWVzIGFuZCB0aGUgZHluYW1pYworICAgICAgICAvLy8gICBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgeW91ciBzdG9yYWdlIGFuZCBjb21wdXRlIHJlc291cmNlcy4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVGhpcyBwcm9wZXJ0eSBpcyBub3QgdGhlIG51bWJlciBvZiBidWZmZXIgcGFpcnMgdG8gdXNlOyBpdCBpcyBhbgorICAgICAgICAvLy8gICB1cHBlciBsaW1pdC4gQW4gaWxsdXN0cmF0aW9uOiBTdXBwb3NlIHlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQKKyAgICAgICAgLy8vICAgdXNlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5ICh3aGljaCBpcyAxNiksIGFuZCBpdCBydW5zCisgICAgICAgIC8vLyAgIG9uIGEgbWFjaGluZSB3aXRoIDIgQ1BVIGNvcmVzLiBJbiB0aGF0IGNhc2UsIERvdE5ldFppcCB3aWxsIGFsbG9jYXRlCisgICAgICAgIC8vLyAgIDQgYnVmZmVyIHBhaXJzIHBlciBDUFUgY29yZSwgZm9yIGEgdG90YWwgb2YgOCBwYWlycy4gIFRoZSB1cHBlcgorICAgICAgICAvLy8gICBsaW1pdCBzcGVjaWZpZWQgYnkgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0LgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgYXBwbGljYXRpb24gY2FuIHNldCB0aGlzIHZhbHVlIGF0IGFueSB0aW1lLCBidXQgaXQgaXMgZWZmZWN0aXZlCisgICAgICAgIC8vLyAgIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIFdyaXRlKCksIHdoaWNoIGlzIHdoZW4gdGhlIGJ1ZmZlcnMgYXJlCisgICAgICAgIC8vLyAgIGFsbG9jYXRlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGludCBNYXhCdWZmZXJQYWlycworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX21heEJ1ZmZlclBhaXJzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJNYXhCdWZmZXJQYWlycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgbXVzdCBiZSA0IG9yIGdyZWF0ZXIuIik7CisgICAgICAgICAgICAgICAgX21heEJ1ZmZlclBhaXJzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXJzIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IgdGhyZWFkcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgZGVmYXVsdCBidWZmZXIgc2l6ZSBpcyAxMjhrLiBUaGUgYXBwbGljYXRpb24gY2FuIHNldCB0aGlzIHZhbHVlCisgICAgICAgIC8vLyAgIGF0IGFueSB0aW1lLCBidXQgaXQgaXMgZWZmZWN0aXZlIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCBXcml0ZSgpLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBMYXJnZXIgYnVmZmVyIHNpemVzIGltcGxpZXMgbGFyZ2VyIG1lbW9yeSBjb25zdW1wdGlvbiBidXQgYWxsb3dzCisgICAgICAgIC8vLyAgIG1vcmUgZWZmaWNpZW50IGNvbXByZXNzaW9uLiBVc2luZyBzbWFsbGVyIGJ1ZmZlciBzaXplcyBjb25zdW1lcyBsZXNzCisgICAgICAgIC8vLyAgIG1lbW9yeSBidXQgbWF5IHJlc3VsdCBpbiBsZXNzIGVmZmVjdGl2ZSBjb21wcmVzc2lvbi4gIEZvciBleGFtcGxlLAorICAgICAgICAvLy8gICB1c2luZyB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZSBvZiAxMjhrLCB0aGUgY29tcHJlc3Npb24gZGVsaXZlcmVkIGlzCisgICAgICAgIC8vLyAgIHdpdGhpbiAxJSBvZiB0aGUgY29tcHJlc3Npb24gZGVsaXZlcmVkIGJ5IHRoZSBzaW5nbGUtdGhyZWFkZWQgPHNlZQorICAgICAgICAvLy8gICBjcmVmPSJJb25pYy5abGliLkRlZmxhdGVTdHJlYW0iLz4uICBPbiB0aGUgb3RoZXIgaGFuZCwgdXNpbmcgYQorICAgICAgICAvLy8gICBCdWZmZXJTaXplIG9mIDhrIGNhbiByZXN1bHQgaW4gYSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtIHRoYXQgaXMgNSUKKyAgICAgICAgLy8vICAgbGFyZ2VyIHRoYW4gdGhhdCBkZWxpdmVyZWQgYnkgdGhlIHNpbmdsZS10aHJlYWRlZAorICAgICAgICAvLy8gICA8Yz5EZWZsYXRlU3RyZWFtPC9jPi4gIEV4Y2Vzc2l2ZWx5IHNtYWxsIGJ1ZmZlciBzaXplcyBjYW4gYWxzbyBjYXVzZQorICAgICAgICAvLy8gICB0aGUgc3BlZWQgb2YgdGhlIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSB0byBkcm9wLCBiZWNhdXNlIG9mCisgICAgICAgIC8vLyAgIGxhcmdlciB0aHJlYWQgc2NoZWR1bGluZyBvdmVyaGVhZCBkZWFsaW5nIHdpdGggbWFueSBtYW55IHNtYWxsCisgICAgICAgIC8vLyAgIGJ1ZmZlcnMuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIGJ1ZmZlcmluZyB3aWxsIGJlCisgICAgICAgIC8vLyAgIChOKlMqMiksIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBidWZmZXIgcGFpcnMsIGFuZCBTIGlzIHRoZSBzaXplIG9mCisgICAgICAgIC8vLyAgIGVhY2ggYnVmZmVyICh0aGlzIHByb3BlcnR5KS4gVGhlcmUgYXJlIDIgYnVmZmVycyB1c2VkIGJ5IHRoZQorICAgICAgICAvLy8gICBjb21wcmVzc29yLCBvbmUgZm9yIGlucHV0IGFuZCBvbmUgZm9yIG91dHB1dC4gIEJ5IGRlZmF1bHQsIERvdE5ldFppcAorICAgICAgICAvLy8gICBhbGxvY2F0ZXMgNCBidWZmZXIgcGFpcnMgcGVyIENQVSBjb3JlLCBzbyBpZiB5b3VyIG1hY2hpbmUgaGFzIDQKKyAgICAgICAgLy8vICAgY29yZXMsIHRoZW4gdGhlIG51bWJlciBvZiBidWZmZXIgcGFpcnMgdXNlZCB3aWxsIGJlIDE2LiBJZiB5b3UKKyAgICAgICAgLy8vICAgYWNjZXB0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHksIDEyOGssIHRoZW4gdGhlCisgICAgICAgIC8vLyAgIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSB3aWxsIHVzZSAxNiAqIDIgKiAxMjhrYiBvZiBidWZmZXIgbWVtb3J5CisgICAgICAgIC8vLyAgIGluIHRvdGFsLCBvciA0bWIsIGluIGJsb2NrcyBvZiAxMjhrYi4gIElmIHlvdSBzZXQgdGhpcyBwcm9wZXJ0eSB0bworICAgICAgICAvLy8gICA2NGtiLCB0aGVuIHRoZSBudW1iZXIgd2lsbCBiZSAxNiAqIDIgKiA2NGtiIG9mIGJ1ZmZlciBtZW1vcnksIG9yCisgICAgICAgIC8vLyAgIDJtYi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBpbnQgQnVmZmVyU2l6ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2J1ZmZlclNpemU7fQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyU2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlclNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMTAyNCBieXRlcyIpOworICAgICAgICAgICAgICAgIF9idWZmZXJTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgQ1JDMzIgZm9yIHRoZSBkYXRhIHRoYXQgd2FzIHdyaXR0ZW4gb3V0LCBwcmlvciB0byBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhpcyB2YWx1ZSBpcyBtZWFuaW5nZnVsIG9ubHkgYWZ0ZXIgYSBjYWxsIHRvIENsb3NlKCkuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBpbnQgQ3JjMzIgeyBnZXQgeyByZXR1cm4gX0NyYzMyOyB9IH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHByb2Nlc3NlZCBieSB0aGUgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGlzIHZhbHVlIGlzIG1lYW5pbmdmdWwgb25seSBhZnRlciBhIGNhbGwgdG8gQ2xvc2UoKS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIEludDY0IEJ5dGVzUHJvY2Vzc2VkIHsgZ2V0IHsgcmV0dXJuIF90b3RhbEJ5dGVzUHJvY2Vzc2VkOyB9IH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBfSW5pdGlhbGl6ZVBvb2xPZldvcmtJdGVtcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b1dyaXRlID0gbmV3IFF1ZXVlPGludD4oKTsKKyAgICAgICAgICAgIF90b0ZpbGwgPSBuZXcgUXVldWU8aW50PigpOworICAgICAgICAgICAgX3Bvb2wgPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdDxXb3JrSXRlbT4oKTsKKyAgICAgICAgICAgIGludCBuVGFza3MgPSBCdWZmZXJQYWlyc1BlckNvcmUgKiBFbnZpcm9ubWVudC5Qcm9jZXNzb3JDb3VudDsKKyAgICAgICAgICAgIG5UYXNrcyA9IE1hdGguTWluKG5UYXNrcywgX21heEJ1ZmZlclBhaXJzKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgblRhc2tzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3Bvb2wuQWRkKG5ldyBXb3JrSXRlbShfYnVmZmVyU2l6ZSwgX2NvbXByZXNzTGV2ZWwsIFN0cmF0ZWd5LCBpKSk7CisgICAgICAgICAgICAgICAgX3RvRmlsbC5FbnF1ZXVlKGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbmV3bHlDb21wcmVzc2VkQmxvYiA9IG5ldyBBdXRvUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICBfcnVubmluZ0NyYyA9IG5ldyBJb25pYy5DcmMuQ1JDMzIoKTsKKyAgICAgICAgICAgIF9jdXJyZW50bHlGaWxsaW5nID0gLTE7CisgICAgICAgICAgICBfbGFzdEZpbGxlZCA9IC0xOworICAgICAgICAgICAgX2xhc3RXcml0dGVuID0gLTE7CisgICAgICAgICAgICBfbGF0ZXN0Q29tcHJlc3NlZCA9IC0xOworICAgICAgICB9CisKKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBXcml0ZSBkYXRhIHRvIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRvIHVzZSB0aGUgUGFyYWxsZWxEZWZsYXRlT3V0cHV0U3RyZWFtIHRvIGNvbXByZXNzIGRhdGEsIGNyZWF0ZSBhCisgICAgICAgIC8vLyAgIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSB3aXRoIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywgcGFzc2luZyBhCisgICAgICAgIC8vLyAgIHdyaXRhYmxlIG91dHB1dCBzdHJlYW0uICBUaGVuIGNhbGwgV3JpdGUoKSBvbiB0aGF0CisgICAgICAgIC8vLyAgIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSwgcHJvdmlkaW5nIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlucHV0LiAgVGhlCisgICAgICAgIC8vLyAgIGRhdGEgc2VudCB0byB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIGJlIHRoZSBjb21wcmVzc2VkIGZvcm0gb2YgdGhlIGRhdGEKKyAgICAgICAgLy8vICAgd3JpdHRlbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgVG8gZGVjb21wcmVzcyBkYXRhLCB1c2UgdGhlIDxzZWUgY3JlZj0iSW9uaWMuWmxpYi5EZWZsYXRlU3RyZWFtIi8+IGNsYXNzLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBidWZmZXIgaG9sZGluZyBkYXRhIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPnRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZGF0YSBhcnJheSB0byBmaW5kIHRoZSBmaXJzdCBieXRlIHRvIHdyaXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBib29sIG11c3RXYWl0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgdGhpczoKKyAgICAgICAgICAgIC8vICAgMC4gaGFuZGxlcyBhbnkgcGVuZGluZyBleGNlcHRpb25zCisgICAgICAgICAgICAvLyAgIDEuIHdyaXRlIGFueSBidWZmZXJzIHRoYXQgYXJlIHJlYWR5IHRvIGJlIHdyaXR0ZW4sCisgICAgICAgICAgICAvLyAgIDIuIGZpbGxzIGEgd29yayBidWZmZXI7IHdoZW4gZnVsbCwgZmxpcCBzdGF0ZSB0byAnRmlsbGVkJywKKyAgICAgICAgICAgIC8vICAgMy4gaWYgbW9yZSBkYXRhIHRvIGJlIHdyaXR0ZW4sICBnb3RvIHN0ZXAgMQorCisgICAgICAgICAgICBpZiAoX2lzQ2xvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIGRpc3BlbnNlIGFueSBleGNlcHRpb25zIHRoYXQgb2NjdXJyZWQgb24gdGhlIEJHIHRocmVhZHMKKyAgICAgICAgICAgIGlmIChfcGVuZGluZ0V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9oYW5kbGluZ0V4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdmFyIHBlID0gX3BlbmRpbmdFeGNlcHRpb247CisgICAgICAgICAgICAgICAgX3BlbmRpbmdFeGNlcHRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoIV9maXJzdFdyaXRlRG9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXYW50IHRvIGRvIHRoaXMgb24gZmlyc3QgV3JpdGUsIGZpcnN0IHNlc3Npb24sIGFuZCBub3QgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0b3IuICBXZSB3YW50IHRvIGFsbG93IE1heEJ1ZmZlclBhaXJzIHRvCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGFmdGVyIGNvbnN0cnVjdGlvbiwgYnV0IGJlZm9yZSBmaXJzdCBXcml0ZS4KKyAgICAgICAgICAgICAgICBfSW5pdGlhbGl6ZVBvb2xPZldvcmtJdGVtcygpOworICAgICAgICAgICAgICAgIF9maXJzdFdyaXRlRG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBtYXkgbmVlZCB0byBtYWtlIGJ1ZmZlcnMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgRW1pdFBlbmRpbmdCdWZmZXJzKGZhbHNlLCBtdXN0V2FpdCk7CisKKyAgICAgICAgICAgICAgICBtdXN0V2FpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIHVzZSBjdXJyZW50IGJ1ZmZlciwgb3IgZ2V0IGEgbmV3IGJ1ZmZlciB0byBmaWxsCisgICAgICAgICAgICAgICAgaW50IGl4ID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKF9jdXJyZW50bHlGaWxsaW5nID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpeCA9IF9jdXJyZW50bHlGaWxsaW5nOworICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuV3JpdGVUYWtlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGUgICAgbm90YWtlICAgd2koezB9KSBsZih7MX0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYXN0RmlsbGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLldyaXRlVGFrZSwgIldyaXRlICAgIHRha2U/Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdG9GaWxsLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGF2YWlsYWJsZSBidWZmZXJzLCBzby4uLiBuZWVkIHRvIGVtaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgYnVmZmVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG11c3RXYWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaXggPSBfdG9GaWxsLkRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLldyaXRlVGFrZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyaXRlICAgIHRha2UgICAgIHdpKHswfSkgbGYoezF9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbGFzdEZpbGxlZCk7CisgICAgICAgICAgICAgICAgICAgICsrX2xhc3RGaWxsZWQ7IC8vIFRPRE86IGNvbnNpZGVyIHJvbGxvdmVyPworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFdvcmtJdGVtIHdvcmtpdGVtID0gX3Bvb2xbaXhdOworCisgICAgICAgICAgICAgICAgaW50IGxpbWl0ID0gKCh3b3JraXRlbS5idWZmZXIuTGVuZ3RoIC0gd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZSkgPiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgPyBjb3VudAorICAgICAgICAgICAgICAgICAgICA6ICh3b3JraXRlbS5idWZmZXIuTGVuZ3RoIC0gd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZSk7CisKKyAgICAgICAgICAgICAgICB3b3JraXRlbS5vcmRpbmFsID0gX2xhc3RGaWxsZWQ7CisKKyAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyaXRlICAgIGxvY2sgICAgIHdpKHswfSkgb3JkKHsxfSkgaWJhKHsyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLm9yZGluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGZyb20gdGhlIHByb3ZpZGVkIGJ1ZmZlciB0byBvdXIgd29ya2l0ZW0sIHN0YXJ0aW5nIGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIHRhaWwgZW5kIG9mIHdoYXRldmVyIGRhdGEgd2UgbWlnaHQgaGF2ZSBpbiB0aGVyZSBjdXJyZW50bHkuCisgICAgICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weShidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5pbnB1dEJ5dGVzQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworCisgICAgICAgICAgICAgICAgY291bnQgLT0gbGltaXQ7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbWl0OworICAgICAgICAgICAgICAgIHdvcmtpdGVtLmlucHV0Qnl0ZXNBdmFpbGFibGUgKz0gbGltaXQ7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtpdGVtLmlucHV0Qnl0ZXNBdmFpbGFibGUgPT0gd29ya2l0ZW0uYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgZm9yIGludGVybG9ja2VkLmluY3JlbWVudDogdGhlIFdyaXRlKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIGRvY3VtZW50ZWQgYXMgbm90IG11bHRpLXRocmVhZCBzYWZlLCBzbworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gYXNzdW1lIFdyaXRlKCkgY2FsbHMgY29tZSBpbiBmcm9tIG9ubHkgb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZC4KKyAgICAgICAgICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLldyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGUgICAgUVVXSSAgICAgd2koezB9KSBvcmQoezF9KSBpYmEoezJ9KSBuZih7M30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLm9yZGluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmlucHV0Qnl0ZXNBdmFpbGFibGUgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0oIF9EZWZsYXRlT25lLCB3b3JraXRlbSApKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2Fubm90IGVucXVldWUgd29ya2l0ZW0iKTsKKworICAgICAgICAgICAgICAgICAgICBfY3VycmVudGx5RmlsbGluZyA9IC0xOyAvLyB3aWxsIGdldCBhIG5ldyBidWZmZXIgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRseUZpbGxpbmcgPSBpeDsKKworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Xcml0ZUVudGVyLCAiV3JpdGUgICAgbW9yZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGNvdW50ID4gMCk7ICAvLyB1bnRpbCBubyBtb3JlIHRvIHdyaXRlCisKKyAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Xcml0ZUVudGVyLCAiV3JpdGUgICAgZXhpdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgdm9pZCBfRmx1c2hGaW5pc2goKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBZnRlciB3cml0aW5nIGEgc2VyaWVzIG9mIGNvbXByZXNzZWQgYnVmZmVycywgZWFjaCBvbmUgY2xvc2VkCisgICAgICAgICAgICAvLyB3aXRoIEZsdXNoLlN5bmMsIHdlIG5vdyB3cml0ZSB0aGUgZmluYWwgb25lIGFzIEZsdXNoLkZpbmlzaCwKKyAgICAgICAgICAgIC8vIGFuZCB0aGVuIHN0b3AuCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTI4XTsKKyAgICAgICAgICAgIHZhciBjb21wcmVzc29yID0gbmV3IFpsaWJDb2RlYygpOworICAgICAgICAgICAgaW50IHJjID0gY29tcHJlc3Nvci5Jbml0aWFsaXplRGVmbGF0ZShfY29tcHJlc3NMZXZlbCwgZmFsc2UpOworICAgICAgICAgICAgY29tcHJlc3Nvci5JbnB1dEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICBjb21wcmVzc29yLk5leHRJbiA9IDA7CisgICAgICAgICAgICBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzSW4gPSAwOworICAgICAgICAgICAgY29tcHJlc3Nvci5PdXRwdXRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBjb21wcmVzc29yLk5leHRPdXQgPSAwOworICAgICAgICAgICAgY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCA9IGJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICByYyA9IGNvbXByZXNzb3IuRGVmbGF0ZShGbHVzaFR5cGUuRmluaXNoKTsKKworICAgICAgICAgICAgaWYgKHJjICE9IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EICYmIHJjICE9IFpsaWJDb25zdGFudHMuWl9PSykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJkZWZsYXRpbmc6ICIgKyBjb21wcmVzc29yLk1lc3NhZ2UpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyLkxlbmd0aCAtIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5FbWl0QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgICAgIGJlZ2luICAgIGZsdXNoIGJ5dGVzKHswfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5MZW5ndGggLSBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0KTsKKworICAgICAgICAgICAgICAgIF9vdXRTdHJlYW0uV3JpdGUoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoIC0gY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCk7CisKKyAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuRW1pdERvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgICAgIGRvbmUgICAgIGZsdXNoIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbXByZXNzb3IuRW5kRGVmbGF0ZSgpOworCisgICAgICAgICAgICBfQ3JjMzIgPSBfcnVubmluZ0NyYy5DcmMzMlJlc3VsdDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9GbHVzaChib29sIGxhc3RJbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Nsb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoZW1pdHRpbmcpIHJldHVybjsKKworICAgICAgICAgICAgLy8gY29tcHJlc3MgYW55IHBhcnRpYWwgYnVmZmVyCisgICAgICAgICAgICBpZiAoX2N1cnJlbnRseUZpbGxpbmcgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXb3JrSXRlbSB3b3JraXRlbSA9IF9wb29sW19jdXJyZW50bHlGaWxsaW5nXTsKKyAgICAgICAgICAgICAgICBfRGVmbGF0ZU9uZSh3b3JraXRlbSk7CisgICAgICAgICAgICAgICAgX2N1cnJlbnRseUZpbGxpbmcgPSAtMTsgLy8gZ2V0IGEgbmV3IGJ1ZmZlciBuZXh0IFdyaXRlKCkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhc3RJbnB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbWl0UGVuZGluZ0J1ZmZlcnModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIF9GbHVzaEZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVtaXRQZW5kaW5nQnVmZmVycyhmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZsdXNoIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wZW5kaW5nRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2hhbmRsaW5nRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2YXIgcGUgPSBfcGVuZGluZ0V4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICBfcGVuZGluZ0V4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgcGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2hhbmRsaW5nRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgX0ZsdXNoKGZhbHNlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2xvc2UgdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gWW91IG11c3QgY2FsbCBDbG9zZSBvbiB0aGUgc3RyZWFtIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCBvZiB0aGUgZGF0YSB3cml0dGVuIGluIGhhcworICAgICAgICAvLy8gYmVlbiBjb21wcmVzc2VkLCBhbmQgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiB3cml0dGVuIG91dC4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuU2Vzc2lvbiwgIkNsb3NlIHswOlg4fSIsIHRoaXMuR2V0SGFzaENvZGUoKSk7CisKKyAgICAgICAgICAgIGlmIChfcGVuZGluZ0V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9oYW5kbGluZ0V4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdmFyIHBlID0gX3BlbmRpbmdFeGNlcHRpb247CisgICAgICAgICAgICAgICAgX3BlbmRpbmdFeGNlcHRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2hhbmRsaW5nRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKF9pc0Nsb3NlZCkgcmV0dXJuOworCisgICAgICAgICAgICBfRmx1c2godHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICghX2xlYXZlT3BlbikKKyAgICAgICAgICAgICAgICBfb3V0U3RyZWFtLkNsb3NlKCk7CisKKyAgICAgICAgICAgIF9pc0Nsb3NlZD0gdHJ1ZTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvLyB3b3JraXRlbSAxMDAzMCAtIGltcGxlbWVudCBhIG5ldyBEaXNwb3NlIG1ldGhvZAorCisgICAgICAgIC8vLyA8c3VtbWFyeT5EaXNwb3NlIHRoZSBvYmplY3Q8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgQmVjYXVzZSBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0gaXMgSURpc3Bvc2FibGUsIHRoZQorICAgICAgICAvLy8gICAgIGFwcGxpY2F0aW9uIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGZpbmlzaGVkIHVzaW5nIHRoZSBpbnN0YW5jZS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBUaGlzIG1ldGhvZCBpcyBnZW5lcmFsbHkgY2FsbGVkIGltcGxpY2l0bHkgdXBvbiBleGl0IGZyb20KKyAgICAgICAgLy8vICAgICBhIDxjPnVzaW5nPC9jPiBzY29wZSBpbiBDIyAoPGM+VXNpbmc8L2M+IGluIFZCKS4KKyAgICAgICAgLy8vICAgPC9wYXJhPgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBuZXcgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5MaWZlY3ljbGUsICJEaXNwb3NlICB7MDpYOH0iLCB0aGlzLkdldEhhc2hDb2RlKCkpOworICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgIF9wb29sID0gbnVsbDsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PlRoZSBEaXNwb3NlIG1ldGhvZDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXNwb3NpbmciPgorICAgICAgICAvLy8gICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGlzcG9zZSBtZXRob2Qgd2FzIGludm9rZWQgYnkgdXNlciBjb2RlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmVzZXRzIHRoZSBzdHJlYW0gZm9yIHVzZSB3aXRoIGFub3RoZXIgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIEJlY2F1c2UgdGhlIFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbSBpcyBleHBlbnNpdmUgdG8gY3JlYXRlLCBpdAorICAgICAgICAvLy8gICBoYXMgYmVlbiBkZXNpZ25lZCBzbyB0aGF0IGl0IGNhbiBiZSByZWN5Y2xlZCBhbmQgcmUtdXNlZC4gIFlvdSBoYXZlCisgICAgICAgIC8vLyAgIHRvIGNhbGwgQ2xvc2UoKSBvbiB0aGUgc3RyZWFtIGZpcnN0LCB0aGVuIHlvdSBjYW4gY2FsbCBSZXNldCgpIG9uCisgICAgICAgIC8vLyAgIGl0LCB0byB1c2UgaXQgYWdhaW4gb24gYW5vdGhlciBzdHJlYW0uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+CisgICAgICAgIC8vLyAgIFRoZSBuZXcgb3V0cHV0IHN0cmVhbSBmb3IgdGhpcyBlcmEuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyBQYXJhbGxlbERlZmxhdGVPdXRwdXRTdHJlYW0gZGVmbGF0ZXIgPSBudWxsOworICAgICAgICAvLy8gZm9yZWFjaCAodmFyIGlucHV0RmlsZSBpbiBsaXN0T2ZGaWxlcykKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IGlucHV0RmlsZSArICIuY29tcHJlc3NlZCI7CisgICAgICAgIC8vLyAgICAgdXNpbmcgKFN5c3RlbS5JTy5TdHJlYW0gaW5wdXQgPSBTeXN0ZW0uSU8uRmlsZS5PcGVuUmVhZChpbnB1dEZpbGUpKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgdXNpbmcgKHZhciBvdXRTdHJlYW0gPSBTeXN0ZW0uSU8uRmlsZS5DcmVhdGUob3V0cHV0RmlsZSkpCisgICAgICAgIC8vLyAgICAgICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGlmIChkZWZsYXRlciA9PSBudWxsKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGRlZmxhdGVyID0gbmV3IFBhcmFsbGVsRGVmbGF0ZU91dHB1dFN0cmVhbShvdXRTdHJlYW0sCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTGV2ZWwuQmVzdCwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25TdHJhdGVneS5EZWZhdWx0LAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIGRlZmxhdGVyLlJlc2V0KG91dFN0cmVhbSk7CisgICAgICAgIC8vLworICAgICAgICAvLy8gICAgICAgICAgICAgd2hpbGUgKChuPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkpICE9IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgZGVmbGF0ZXIuV3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLlNlc3Npb24sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuU2Vzc2lvbiwgIlJlc2V0IHswOlg4fSBmaXJzdERvbmUoezF9KSIsIHRoaXMuR2V0SGFzaENvZGUoKSwgX2ZpcnN0V3JpdGVEb25lKTsKKworICAgICAgICAgICAgaWYgKCFfZmlyc3RXcml0ZURvbmUpIHJldHVybjsKKworICAgICAgICAgICAgLy8gcmVzZXQgYWxsIHN0YXR1cworICAgICAgICAgICAgX3RvV3JpdGUuQ2xlYXIoKTsKKyAgICAgICAgICAgIF90b0ZpbGwuQ2xlYXIoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3b3JraXRlbSBpbiBfcG9vbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdG9GaWxsLkVucXVldWUod29ya2l0ZW0uaW5kZXgpOworICAgICAgICAgICAgICAgIHdvcmtpdGVtLm9yZGluYWwgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2ZpcnN0V3JpdGVEb25lID0gZmFsc2U7CisgICAgICAgICAgICBfdG90YWxCeXRlc1Byb2Nlc3NlZCA9IDBMOworICAgICAgICAgICAgX3J1bm5pbmdDcmMgPSBuZXcgSW9uaWMuQ3JjLkNSQzMyKCk7CisgICAgICAgICAgICBfaXNDbG9zZWQ9IGZhbHNlOworICAgICAgICAgICAgX2N1cnJlbnRseUZpbGxpbmcgPSAtMTsKKyAgICAgICAgICAgIF9sYXN0RmlsbGVkID0gLTE7CisgICAgICAgICAgICBfbGFzdFdyaXR0ZW4gPSAtMTsKKyAgICAgICAgICAgIF9sYXRlc3RDb21wcmVzc2VkID0gLTE7CisgICAgICAgICAgICBfb3V0U3RyZWFtID0gc3RyZWFtOworICAgICAgICB9CisKKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVtaXRQZW5kaW5nQnVmZmVycyhib29sIGRvQWxsLCBib29sIG11c3RXYWl0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaGVuIGNvbWJpbmluZyBwYXJhbGxlbCBkZWZsYXRpb24gd2l0aCBhIFppcFNlZ21lbnRlZFN0cmVhbSwgaXQncworICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHRoZSBaU1MgdG8gdGhyb3cgZnJvbSB3aXRoaW4gdGhpcyBtZXRob2QuICBJbiB0aGF0CisgICAgICAgICAgICAvLyBjYXNlLCBDbG9zZS9EaXNwb3NlIHdpbGwgYmUgY2FsbGVkIG9uIHRoaXMgc3RyZWFtLCBpZiB0aGlzIHN0cmVhbQorICAgICAgICAgICAgLy8gaXMgZW1wbG95ZWQgd2l0aGluIGEgdXNpbmcgb3IgdHJ5L2ZpbmFsbHkgcGFpciBhcyByZXF1aXJlZC4gQnV0CisgICAgICAgICAgICAvLyB0aGlzIHN0cmVhbSBpcyB1bmF3YXJlIG9mIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiwgc28gdGhlIENsb3NlKCkKKyAgICAgICAgICAgIC8vIG1ldGhvZCBpbnZva2VzIHRoaXMgbWV0aG9kIEFHQUlOLiAgVGhpcyBjYW4gbGVhZCB0byBhIGRlYWRsb2NrLgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCBmYWlsZmFzdCBpZiByZS1lbnRlcmluZy4KKworICAgICAgICAgICAgaWYgKGVtaXR0aW5nKSByZXR1cm47CisgICAgICAgICAgICBlbWl0dGluZyA9IHRydWU7CisgICAgICAgICAgICBpZiAoZG9BbGwgfHwgbXVzdFdhaXQpCisgICAgICAgICAgICAgICAgX25ld2x5Q29tcHJlc3NlZEJsb2IuV2FpdE9uZSgpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmaXJzdFNraXAgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQgbWlsbGlzZWNvbmRzVG9XYWl0ID0gZG9BbGwgPyAyMDAgOiAobXVzdFdhaXQgPyAtMSA6IDApOworICAgICAgICAgICAgICAgIGludCBuZXh0VG9Xcml0ZSA9IC0xOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChNb25pdG9yLlRyeUVudGVyKF90b1dyaXRlLCBtaWxsaXNlY29uZHNUb1dhaXQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VG9Xcml0ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90b1dyaXRlLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRvV3JpdGUgPSBfdG9Xcml0ZS5EZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5FeGl0KF90b1dyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRUb1dyaXRlID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya0l0ZW0gd29ya2l0ZW0gPSBfcG9vbFtuZXh0VG9Xcml0ZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtpdGVtLm9yZGluYWwgIT0gX2xhc3RXcml0dGVuICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBvcmRlci4gcmVxdWV1ZSBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuRW1pdFNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbWl0ICAgICBza2lwICAgICB3aSh7MH0pIG9yZCh7MX0pIGx3KHsyfSkgZnMoezN9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5vcmRpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbGFzdFdyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2tpcCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jayhfdG9Xcml0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvV3JpdGUuRW5xdWV1ZShuZXh0VG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTa2lwID09IG5leHRUb1dyaXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3ZW50IGFyb3VuZCB0aGUgbGlzdCBvbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgaXMgdGhlIG9uZSB3ZSB3YW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHdhaXQgZm9yIGEgY29tcHJlc3NvciB0byBzaWduYWwgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmV3bHlDb21wcmVzc2VkQmxvYi5XYWl0T25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNraXAgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmaXJzdFNraXAgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNraXAgPSBuZXh0VG9Xcml0ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNraXAgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5FbWl0QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgICAgIGJlZ2luICAgIHdpKHswfSkgb3JkKHsxfSkgICAgICAgICAgICAgIGNiYSh7Mn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5vcmRpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmNvbXByZXNzZWRCeXRlc0F2YWlsYWJsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3V0U3RyZWFtLldyaXRlKHdvcmtpdGVtLmNvbXByZXNzZWQsIDAsIHdvcmtpdGVtLmNvbXByZXNzZWRCeXRlc0F2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3J1bm5pbmdDcmMuQ29tYmluZSh3b3JraXRlbS5jcmMsIHdvcmtpdGVtLmlucHV0Qnl0ZXNBdmFpbGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b3RhbEJ5dGVzUHJvY2Vzc2VkICs9IHdvcmtpdGVtLmlucHV0Qnl0ZXNBdmFpbGFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuRW1pdERvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgICAgIGRvbmUgICAgIHdpKHswfSkgb3JkKHsxfSkgICAgICAgICAgICAgIGNiYSh7Mn0pIG10dyh7M30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5vcmRpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmNvbXByZXNzZWRCeXRlc0F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHNUb1dhaXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xhc3RXcml0dGVuID0gd29ya2l0ZW0ub3JkaW5hbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9GaWxsLkVucXVldWUod29ya2l0ZW0uaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd2FpdCBuZXh0IHRpbWUgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaWxsaXNlY29uZHNUb1dhaXQgPT0gLTEpIG1pbGxpc2Vjb25kc1RvV2FpdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRvV3JpdGUgPSAtMTsKKworICAgICAgICAgICAgICAgIH0gd2hpbGUgKG5leHRUb1dyaXRlID49IDApOworCisgICAgICAgICAgICAvL30gd2hpbGUgKGRvQWxsICYmIChfbGFzdFdyaXR0ZW4gIT0gX2xhdGVzdENvbXByZXNzZWQpKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGRvQWxsICYmIChfbGFzdFdyaXR0ZW4gIT0gX2xhdGVzdENvbXByZXNzZWQgfHwgX2xhc3RXcml0dGVuICE9IF9sYXN0RmlsbGVkKSk7CisKKyAgICAgICAgICAgIGVtaXR0aW5nID0gZmFsc2U7CisgICAgICAgIH0KKworCisKKyNpZiBPTEQKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9QZXJwZXR1YWxXcml0ZXJNZXRob2Qob2JqZWN0IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuV3JpdGVyVGhyZWFkLCAiX1BlcnBldHVhbFdyaXRlck1ldGhvZCBTVEFSVCIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIG5leHQgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuU3luY2ggfCBUcmFjZUJpdHMuV3JpdGVyVGhyZWFkLCAiU3luY2ggICAgX3Nlc3Npb25SZXNldC5XYWl0T25lKGJlZ2luKSBQV00iKTsKKyAgICAgICAgICAgICAgICAgICAgX3Nlc3Npb25SZXNldC5XYWl0T25lKCk7CisgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5TeW5jaCB8IFRyYWNlQml0cy5Xcml0ZXJUaHJlYWQsICJTeW5jaCAgICBfc2Vzc2lvblJlc2V0LldhaXRPbmUoZG9uZSkgIFBXTSIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLlN5bmNoIHwgVHJhY2VCaXRzLldyaXRlclRocmVhZCwgIlN5bmNoICAgIF9zZXNzaW9uUmVzZXQuUmVzZXQoKSAgICAgICAgUFdNIik7CisgICAgICAgICAgICAgICAgICAgIF9zZXNzaW9uUmVzZXQuUmVzZXQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXRlZGx5IHdyaXRlIGJ1ZmZlcnMgYXMgdGhleSBiZWNvbWUgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgV29ya0l0ZW0gd29ya2l0ZW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBJb25pYy5abGliLkNSQzMyIGM9IG5ldyBJb25pYy5abGliLkNSQzMyKCk7CisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtID0gX3Bvb2xbX25leHRUb1dyaXRlICUgX3BjXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sod29ya2l0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9ub01vcmVJbnB1dEZvclRoaXNTZWdtZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXcml0ZSAgICBkcmFpbiAgICB3aSh7MH0pIHN0YXQoezF9KSBjYW51c2UoezJ9KSAgY2JhKHszfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2l0ZW0uc3RhdHVzID09IChpbnQpV29ya0l0ZW0uU3RhdHVzLkNvbXByZXNzZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5jb21wcmVzc2VkQnl0ZXNBdmFpbGFibGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraXRlbS5zdGF0dXMgPT0gKGludClXb3JrSXRlbS5TdGF0dXMuQ29tcHJlc3NlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLldyaXRlQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGUgICAgYmVnaW4gICAgd2koezB9KSBzdGF0KHsxfSkgICAgICAgICAgICAgIGNiYSh7Mn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uY29tcHJlc3NlZEJ5dGVzQXZhaWxhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uc3RhdHVzID0gKGludClXb3JrSXRlbS5TdGF0dXMuV3JpdGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vdXRTdHJlYW0uV3JpdGUod29ya2l0ZW0uY29tcHJlc3NlZCwgMCwgd29ya2l0ZW0uY29tcHJlc3NlZEJ5dGVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuQ29tYmluZSh3b3JraXRlbS5jcmMsIHdvcmtpdGVtLmlucHV0Qnl0ZXNBdmFpbGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvdGFsQnl0ZXNQcm9jZXNzZWQgKz0gd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uZXh0VG9Xcml0ZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLnN0YXR1cyA9IChpbnQpV29ya0l0ZW0uU3RhdHVzLkRvbmU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Xcml0ZURvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGUgICAgZG9uZSAgICAgd2koezB9KSBzdGF0KHsxfSkgICAgICAgICAgICAgIGNiYSh7Mn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uY29tcHJlc3NlZEJ5dGVzQXZhaWxhYmxlKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKHdvcmtpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdjeWNsZXMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSSd2ZSBsb2NrZWQgYSB3b3JraXRlbSBJIGNhbm5vdCB1c2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHdha2Ugc29tZW9uZSBlbHNlIHVwLCBhbmQgdGhlbiByZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdvcmtpdGVtLnN0YXR1cyAhPSAoaW50KVdvcmtJdGVtLlN0YXR1cy5Db21wcmVzc2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Xcml0ZVdhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyaXRlICAgIHdhaXRpbmcgIHdpKHswfSkgc3RhdCh7MX0pIG53KHsyfSkgbmYoezN9KSBub21vcmUoezR9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uZXh0VG9Xcml0ZSwgX25leHRUb0ZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25vTW9yZUlucHV0Rm9yVGhpc1NlZ21lbnQgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbm9Nb3JlSW5wdXRGb3JUaGlzU2VnbWVudCAmJiBfbmV4dFRvV3JpdGUgPT0gX25leHRUb0ZpbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2N5Y2xlcysrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FrZSB1cCBzb21lb25lIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKHdvcmtpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlIGFuZCB3YWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KHdvcmtpdGVtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraXRlbS5zdGF0dXMgPT0gKGludClXb3JrSXRlbS5TdGF0dXMuQ29tcHJlc3NlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLldyaXRlV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyaXRlICAgIEEtT0sgICAgIHdpKHswfSkgc3RhdCh7MX0pIGliYSh7Mn0pIGNiYSh7M30pIGN5Yyh7NH0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpdGVtLnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5wdXRCeXRlc0F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uY29tcHJlc3NlZEJ5dGVzQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y3ljbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9ub01vcmVJbnB1dEZvclRoaXNTZWdtZW50ICYmIF9uZXh0VG9Xcml0ZSA9PSBfbmV4dFRvRmlsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9ub01vcmVJbnB1dEZvclRoaXNTZWdtZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Xcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGUgICAgbm9tb3JlICBudyh7MH0pIG5mKHsxfSkgYnJlYWsoezJ9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25leHRUb1dyaXRlLCBfbmV4dFRvRmlsbCwgKF9uZXh0VG9Xcml0ZSA9PSBfbmV4dFRvRmlsbCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX25vTW9yZUlucHV0Rm9yVGhpc1NlZ21lbnQgJiYgX25leHRUb1dyaXRlID09IF9uZXh0VG9GaWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoOgorICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciB3cml0aW5nIGEgc2VyaWVzIG9mIGJ1ZmZlcnMsIGNsb3NpbmcgZWFjaCBvbmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaC5TeW5jLCB3ZSBub3cgd3JpdGUgdGhlIGZpbmFsIG9uZSBhcyBGbHVzaC5GaW5pc2gsIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHN0b3AuCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMjhdOworICAgICAgICAgICAgICAgICAgICBabGliQ29kZWMgY29tcHJlc3NvciA9IG5ldyBabGliQ29kZWMoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gY29tcHJlc3Nvci5Jbml0aWFsaXplRGVmbGF0ZShfY29tcHJlc3NMZXZlbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLklucHV0QnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5OZXh0SW4gPSAwOworICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzSW4gPSAwOworICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yLk91dHB1dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5OZXh0T3V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCA9IGJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY29tcHJlc3Nvci5EZWZsYXRlKEZsdXNoVHlwZS5GaW5pc2gpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORCAmJiByYyAhPSBabGliQ29uc3RhbnRzLlpfT0spCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJkZWZsYXRpbmc6ICIgKyBjb21wcmVzc29yLk1lc3NhZ2UpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuTGVuZ3RoIC0gY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Xcml0ZUJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyaXRlICAgIGJlZ2luICAgIGZsdXNoIGJ5dGVzKHswfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLkxlbmd0aCAtIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBfb3V0U3RyZWFtLldyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCAtIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuV3JpdGVCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXcml0ZSAgICBkb25lICAgICBmbHVzaCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5FbmREZWZsYXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgX0NyYzMyID0gYy5DcmMzMlJlc3VsdDsKKworICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgdGhhdCB3cml0aW5nIGlzIGNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICBUcmFjZU91dHB1dChUcmFjZUJpdHMuU3luY2gsICJTeW5jaCAgICBfd3JpdGluZ0RvbmUuU2V0KCkgICAgICAgICAgIFBXTSIpOworICAgICAgICAgICAgICAgICAgICBfd3JpdGluZ0RvbmUuU2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTeXN0ZW0uRXhjZXB0aW9uIGV4YzEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayhfZUxvY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBleHBvc2UgdGhlIGV4Y2VwdGlvbiB0byB0aGUgbWFpbiB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9wZW5kaW5nRXhjZXB0aW9uIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgX3BlbmRpbmdFeGNlcHRpb24gPSBleGMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVHJhY2VPdXRwdXQoVHJhY2VCaXRzLldyaXRlclRocmVhZCwgIl9QZXJwZXR1YWxXcml0ZXJNZXRob2QgRklOSVMiKTsKKyAgICAgICAgfQorI2VuZGlmCisKKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF9EZWZsYXRlT25lKE9iamVjdCB3aSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29tcHJlc3Mgb25lIGJ1ZmZlcgorICAgICAgICAgICAgV29ya0l0ZW0gd29ya2l0ZW0gPSAoV29ya0l0ZW0pIHdpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG15SXRlbSA9IHdvcmtpdGVtLmluZGV4OworICAgICAgICAgICAgICAgIElvbmljLkNyYy5DUkMzMiBjcmMgPSBuZXcgSW9uaWMuQ3JjLkNSQzMyKCk7CisKKyAgICAgICAgICAgICAgICAvLyBjYWxjIENSQyBvbiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgY3JjLlNsdXJwQmxvY2sod29ya2l0ZW0uYnVmZmVyLCAwLCB3b3JraXRlbS5pbnB1dEJ5dGVzQXZhaWxhYmxlKTsKKworICAgICAgICAgICAgICAgIC8vIGRlZmxhdGUgaXQKKyAgICAgICAgICAgICAgICBEZWZsYXRlT25lU2VnbWVudCh3b3JraXRlbSk7CisKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgc3RhdHVzCisgICAgICAgICAgICAgICAgd29ya2l0ZW0uY3JjID0gY3JjLkNyYzMyUmVzdWx0OworICAgICAgICAgICAgICAgIFRyYWNlT3V0cHV0KFRyYWNlQml0cy5Db21wcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcHJlc3MgICAgICAgICAgd2koezB9KSBvcmQoezF9KSBsZW4oezJ9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0uaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2l0ZW0ub3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraXRlbS5jb21wcmVzc2VkQnl0ZXNBdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgbG9jayhfbGF0ZXN0TG9jaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraXRlbS5vcmRpbmFsID4gX2xhdGVzdENvbXByZXNzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBfbGF0ZXN0Q29tcHJlc3NlZCA9IHdvcmtpdGVtLm9yZGluYWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2sgKF90b1dyaXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3RvV3JpdGUuRW5xdWV1ZSh3b3JraXRlbS5pbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9uZXdseUNvbXByZXNzZWRCbG9iLlNldCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFN5c3RlbS5FeGNlcHRpb24gZXhjMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NrKF9lTG9jaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4cG9zZSB0aGUgZXhjZXB0aW9uIHRvIHRoZSBtYWluIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBpZiAoX3BlbmRpbmdFeGNlcHRpb24hPW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBfcGVuZGluZ0V4Y2VwdGlvbiA9IGV4YzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisKKyAgICAgICAgcHJpdmF0ZSBib29sIERlZmxhdGVPbmVTZWdtZW50KFdvcmtJdGVtIHdvcmtpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBabGliQ29kZWMgY29tcHJlc3NvciA9IHdvcmtpdGVtLmNvbXByZXNzb3I7CisgICAgICAgICAgICBpbnQgcmM9IDA7CisgICAgICAgICAgICBjb21wcmVzc29yLlJlc2V0RGVmbGF0ZSgpOworICAgICAgICAgICAgY29tcHJlc3Nvci5OZXh0SW4gPSAwOworCisgICAgICAgICAgICBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzSW4gPSB3b3JraXRlbS5pbnB1dEJ5dGVzQXZhaWxhYmxlOworCisgICAgICAgICAgICAvLyBzdGVwIDE6IGRlZmxhdGUgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgY29tcHJlc3Nvci5OZXh0T3V0ID0gMDsKKyAgICAgICAgICAgIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQgPSAgd29ya2l0ZW0uY29tcHJlc3NlZC5MZW5ndGg7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuRGVmbGF0ZShGbHVzaFR5cGUuTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc0luID4gMCB8fCBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0ID09IDApOworCisgICAgICAgICAgICAvLyBzdGVwIDI6IGZsdXNoIChzeW5jKQorICAgICAgICAgICAgcmMgPSBjb21wcmVzc29yLkRlZmxhdGUoRmx1c2hUeXBlLlN5bmMpOworCisgICAgICAgICAgICB3b3JraXRlbS5jb21wcmVzc2VkQnl0ZXNBdmFpbGFibGU9IChpbnQpIGNvbXByZXNzb3IuVG90YWxCeXRlc091dDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKworICAgICAgICBbU3lzdGVtLkRpYWdub3N0aWNzLkNvbmRpdGlvbmFsQXR0cmlidXRlKCJUcmFjZSIpXQorICAgICAgICBwcml2YXRlIHZvaWQgVHJhY2VPdXRwdXQoVHJhY2VCaXRzIGJpdHMsIHN0cmluZyBmb3JtYXQsIHBhcmFtcyBvYmplY3RbXSB2YXJQYXJhbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoYml0cyAmIF9EZXNpcmVkVHJhY2UpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayhfb3V0cHV0TG9jaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0aWQgPSBUaHJlYWQuQ3VycmVudFRocmVhZC5HZXRIYXNoQ29kZSgpOworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkZvcmVncm91bmRDb2xvciA9IChDb25zb2xlQ29sb3IpICh0aWQgJSA4ICsgOCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiezA6MDAwfSBQRE9TICIsIHRpZCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGZvcm1hdCwgdmFyUGFyYW1zKTsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5SZXNldENvbG9yKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vIHVzZWQgb25seSB3aGVuIFRyYWNlIGlzIGRlZmluZWQKKyAgICAgICAgW0ZsYWdzXQorICAgICAgICBlbnVtIFRyYWNlQml0cyA6IHVpbnQKKyAgICAgICAgeworICAgICAgICAgICAgTm9uZSAgICAgICAgID0gMCwKKyAgICAgICAgICAgIE5vdFVzZWQxICAgICA9IDEsCisgICAgICAgICAgICBFbWl0TG9jayAgICAgPSAyLAorICAgICAgICAgICAgRW1pdEVudGVyICAgID0gNCwgICAgLy8gZW50ZXIgX0VtaXRQZW5kaW5nCisgICAgICAgICAgICBFbWl0QmVnaW4gICAgPSA4LCAgICAvLyBiZWdpbiB0byB3cml0ZSBvdXQKKyAgICAgICAgICAgIEVtaXREb25lICAgICA9IDE2LCAgIC8vIGRvbmUgd3JpdGluZyBvdXQKKyAgICAgICAgICAgIEVtaXRTa2lwICAgICA9IDMyLCAgIC8vIHdyaXRlciBza2lwcGluZyBhIHdvcmtpdGVtCisgICAgICAgICAgICBFbWl0QWxsICAgICAgPSA1OCwgICAvLyBBbGwgRW1pdCBmbGFncworICAgICAgICAgICAgRmx1c2ggICAgICAgID0gNjQsCisgICAgICAgICAgICBMaWZlY3ljbGUgICAgPSAxMjgsICAvLyBjb25zdHJ1Y3Rvci9kaXNwb3NlcgorICAgICAgICAgICAgU2Vzc2lvbiAgICAgID0gMjU2LCAgLy8gQ2xvc2UvUmVzZXQKKyAgICAgICAgICAgIFN5bmNoICAgICAgICA9IDUxMiwgIC8vIHRocmVhZCBzeW5jaHJvbml6YXRpb24KKyAgICAgICAgICAgIEluc3RhbmNlICAgICA9IDEwMjQsIC8vIGluc3RhbmNlIHNldHRpbmdzCisgICAgICAgICAgICBDb21wcmVzcyAgICAgPSAyMDQ4LCAgLy8gY29tcHJlc3MgdGFzaworICAgICAgICAgICAgV3JpdGUgICAgICAgID0gNDA5NiwgICAgLy8gZmlsbGluZyBidWZmZXJzLCB3aGVuIGNhbGxlciBpbnZva2VzIFdyaXRlKCkKKyAgICAgICAgICAgIFdyaXRlRW50ZXIgICA9IDgxOTIsICAgIC8vIHVwb24gZW50cnkgdG8gV3JpdGUoKQorICAgICAgICAgICAgV3JpdGVUYWtlICAgID0gMTYzODQsICAgIC8vIG9uIF90b0ZpbGwuVGFrZSgpCisgICAgICAgICAgICBBbGwgICAgICAgICAgPSAweGZmZmZmZmZmLAorICAgICAgICB9CisKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gc3VwcG9ydHMgU2VlayBvcGVyYXRpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlaworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzdXBwb3J0cyBSZWFkIG9wZXJhdGlvbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIEFsd2F5cyByZXR1cm5zIGZhbHNlLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7cmV0dXJuIGZhbHNlO30KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gc3VwcG9ydHMgV3JpdGUgb3BlcmF0aW9ucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBzdHJlYW0gaXMgd3JpdGFibGUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfb3V0U3RyZWFtLkNhbldyaXRlOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkaW5nIHRoaXMgcHJvcGVydHkgYWx3YXlzIHRocm93cyBhIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICA8cGFyYT4KKyAgICAgICAgLy8vICAgICBCZWNhdXNlIHRoZSBvdXRwdXQgZ2V0cyB3cml0dGVuIGJ5IGEgYmFja2dyb3VuZCB0aHJlYWQsCisgICAgICAgIC8vLyAgICAgdGhlIHZhbHVlIG1heSBjaGFuZ2UgYXN5bmNocm9ub3VzbHkuICBTZXR0aW5nIHRoaXMKKyAgICAgICAgLy8vICAgICBwcm9wZXJ0eSBhbHdheXMgdGhyb3dzIGEgTm90U3VwcG9ydGVkRXhjZXB0aW9uLgorICAgICAgICAvLy8gICA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfb3V0U3RyZWFtLlBvc2l0aW9uOyB9CisgICAgICAgICAgICBzZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYSBOb3RTdXBwb3J0ZWRFeGNlcHRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj4KKyAgICAgICAgLy8vICAgVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgd291bGQgYmUgcmVhZCwgSUYgVEhJUyBNRVRIT0QKKyAgICAgICAgLy8vICAgQUNUVUFMTFkgRElEIEFOWVRISU5HLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPgorICAgICAgICAvLy8gICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGRhdGEgYXJyYXkgYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZQorICAgICAgICAvLy8gICBkYXRhIHRoYXQgaXMgcmVhZCwgSUYgVEhJUyBNRVRIT0QgQUNUVUFMTFkgRElECisgICAgICAgIC8vLyAgIEFOWVRISU5HLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+CisgICAgICAgIC8vLyAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUsIElGIFRISVMgTUVUSE9EIEFDVFVBTExZIERJRAorICAgICAgICAvLy8gICBBTllUSElORy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5ub3RoaW5nLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPgorICAgICAgICAvLy8gICBUaGUgb2Zmc2V0IHRvIHNlZWsgdG8uLi4uCisgICAgICAgIC8vLyAgIElGIFRISVMgTUVUSE9EIEFDVFVBTExZIERJRCBBTllUSElORy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3JpZ2luIj4KKyAgICAgICAgLy8vICAgVGhlIHJlZmVyZW5jZSBzcGVjaWZ5aW5nIGhvdyB0byBhcHBseSB0aGUgb2Zmc2V0Li4uLiAgSUYKKyAgICAgICAgLy8vICAgVEhJUyBNRVRIT0QgQUNUVUFMTFkgRElEIEFOWVRISU5HLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPm5vdGhpbmcuIEl0IGFsd2F5cyB0aHJvd3MuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTeXN0ZW0uSU8uU2Vla09yaWdpbiBvcmlnaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MgYSBOb3RTdXBwb3J0ZWRFeGNlcHRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPgorICAgICAgICAvLy8gICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgc3RyZWFtIGxlbmd0aC4uLi4gIElGCisgICAgICAgIC8vLyAgIFRISVMgTUVUSE9EIEFDVFVBTExZIERJRCBBTllUSElORy4KKyAgICAgICAgLy8vIDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvVHJlZS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvVHJlZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDExZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9UcmVlLmNzCkBAIC0wLDAgKzEsNDIzIEBACisvLyBUcmVlLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDkgRGlubyBDaGllc2EgYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4gCisvLyBTZWUgdGhlIGZpbGUgTGljZW5zZS50eHQgZm9yIHRoZSBsaWNlbnNlIGRldGFpbHMuCisvLyBNb3JlIGluZm8gb246IGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbGFzdCBzYXZlZCAoaW4gZW1hY3MpOiAKKy8vIFRpbWUtc3RhbXA6IDwyMDA5LU9jdG9iZXItMjggMTM6Mjk6NTA+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBjbGFzc2VzIGZvciB6bGliIGNvbXByZXNzaW9uIGFuZAorLy8gZGVjb21wcmVzc2lvbi4gVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUganpsaWIgaW1wbGVtZW50YXRpb24gb2YKKy8vIHpsaWIuIEluIGtlZXBpbmcgd2l0aCB0aGUgbGljZW5zZSBmb3IganpsaWIsIHRoZSBjb3B5cmlnaHQgdG8gdGhhdAorLy8gY29kZSBpcyBiZWxvdy4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIAorLy8gQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEsMjAwMiwyMDAzIHltbmssIEpDcmFmdCxJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAKKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorLy8gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAKKy8vIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorLy8gSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEpDUkFGVCwKKy8vIElOQy4gT1IgQU5ZIENPTlRSSUJVVE9SUyBUTyBUSElTIFNPRlRXQVJFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwKKy8vIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKy8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisvLyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisvLyBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8gCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiB6bGliLTEuMS4zOyBjcmVkaXQgdG8gYXV0aG9ycworLy8gSmVhbi1sb3VwIEdhaWxseShqbG91cEBnemlwLm9yZykgYW5kIE1hcmsgQWRsZXIobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkKKy8vIGFuZCBjb250cmlidXRvcnMgb2YgemxpYi4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIKK3sKKyAgICBzZWFsZWQgY2xhc3MgVHJlZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IEhFQVBfU0laRSA9ICgyICogSW50ZXJuYWxDb25zdGFudHMuTF9DT0RFUyArIDEpOworICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnRbXSBFeHRyYUxlbmd0aEJpdHMgPSBuZXcgaW50W10KKyAgICAgICAgeworICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAgICAgICAgIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDAKKyAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnRbXSBFeHRyYURpc3RhbmNlQml0cyA9IG5ldyBpbnRbXQorICAgICAgICB7CisgICAgICAgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwKKyAgICAgICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMworICAgICAgICB9OworICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50W10gZXh0cmFfYmxiaXRzID0gbmV3IGludFtdezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDd9OworICAgICAgICAgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgc2J5dGVbXSBibF9vcmRlciA9IG5ldyBzYnl0ZVtdezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCisgICAgICAgIC8vIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQKKyAgICAgICAgLy8gbGVuZ3RoIGNvZGVzLgorICAgICAgICAgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgQnVmX3NpemUgPSA4ICogMjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93CisgICAgICAgIC8vaW50ZXJuYWwgY29uc3QgaW50IERJU1RfQ09ERV9MRU4gPSA1MTI7CisgICAgICAgICAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNieXRlW10gX2Rpc3RfY29kZSA9IG5ldyBzYnl0ZVtdCisgICAgICAgIHsKKyAgICAgICAgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsIAorICAgICAgICAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgICAgICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAKKyAgICAgICAgICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAKKyAgICAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAKKyAgICAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAKKyAgICAgICAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAKKyAgICAgICAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAKKyAgICAgICAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAKKyAgICAgICAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAKKyAgICAgICAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAKKyAgICAgICAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAKKyAgICAgICAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAKKyAgICAgICAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAKKyAgICAgICAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAKKyAgICAgICAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAKKyAgICAgICAgICAgIDAsICAgMCwgMTYsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAKKyAgICAgICAgICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAKKyAgICAgICAgICAgIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAKKyAgICAgICAgICAgIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAKKyAgICAgICAgICAgIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAKKyAgICAgICAgICAgIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAKKyAgICAgICAgICAgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAKKyAgICAgICAgICAgIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAKKyAgICAgICAgICAgIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAKKyAgICAgICAgICAgIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAKKyAgICAgICAgICAgIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAKKyAgICAgICAgICAgIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAKKyAgICAgICAgICAgIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAKKyAgICAgICAgICAgIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAKKyAgICAgICAgICAgIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAKKyAgICAgICAgICAgIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5CisgICAgICAgIH07CisgICAgICAgICAgICAgICAgCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBzYnl0ZVtdIExlbmd0aENvZGUgPSBuZXcgc2J5dGVbXQorICAgICAgICB7CisgICAgICAgICAgICAwLCAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwKKyAgICAgICAgICAgIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgICAgICAgICAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LCAxOSwgMTksIDE5LCAxOSwKKyAgICAgICAgICAgIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLAorICAgICAgICAgICAgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsCisgICAgICAgICAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKyAgICAgICAgICAgIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLAorICAgICAgICAgICAgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisgICAgICAgICAgICAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKyAgICAgICAgICAgIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LAorICAgICAgICAgICAgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCisgICAgICAgICAgICAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKyAgICAgICAgICAgIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorICAgICAgICAgICAgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisgICAgICAgICAgICAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyOAorICAgICAgICB9OworICAgICAgICAgICAgICAgIAorCisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnRbXSBMZW5ndGhCYXNlID0gbmV3IGludFtdCisgICAgICAgIHsKKyAgICAgICAgICAgIDAsICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgIDcsICAgOCwgIDEwLCAgMTIsICAxNCwgMTYsIDIwLCAyNCwgMjgsCisgICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDAKKyAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50W10gRGlzdGFuY2VCYXNlID0gbmV3IGludFtdCisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDYsIDgsIDEyLCAxNiwgMjQsIDMyLCA0OCwgNjQsIDk2LCAxMjgsIDE5MiwKKyAgICAgICAgICAgIDI1NiwgMzg0LCA1MTIsIDc2OCwgMTAyNCwgMTUzNiwgMjA0OCwgMzA3MiwgNDA5NiwgNjE0NCwgODE5MiwgMTIyODgsIDE2Mzg0LCAyNDU3NgorICAgICAgICB9OworCisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNYXAgZnJvbSBhIGRpc3RhbmNlIHRvIGEgZGlzdGFuY2UgY29kZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPiAKKyAgICAgICAgLy8vIE5vIHNpZGUgZWZmZWN0cy4gX2Rpc3RfY29kZVsyNTZdIGFuZCBfZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyIHVzZWQuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBpbnQgRGlzdGFuY2VDb2RlKGludCBkaXN0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRpc3QgPCAyNTYpCisgICAgICAgICAgICAgICAgPyBfZGlzdF9jb2RlW2Rpc3RdCisgICAgICAgICAgICAgICAgOiBfZGlzdF9jb2RlWzI1NiArIFNoYXJlZFV0aWxzLlVSU2hpZnQoZGlzdCwgNyldOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc2hvcnRbXSBkeW5fdHJlZTsgLy8gdGhlIGR5bmFtaWMgdHJlZQorICAgICAgICBpbnRlcm5hbCBpbnQgbWF4X2NvZGU7IC8vIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeQorICAgICAgICBpbnRlcm5hbCBTdGF0aWNUcmVlIHN0YXRpY1RyZWU7IC8vIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlCisgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoCisgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAgICAgICAgLy8gSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAgICAgICAgLy8gICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAgICAgICAgLy8gT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZQorICAgICAgICAvLyAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgICAgICAgIC8vICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMKKyAgICAgICAgLy8gICAgIG5vdCBudWxsLgorICAgICAgICBpbnRlcm5hbCB2b2lkICBnZW5fYml0bGVuKERlZmxhdGVNYW5hZ2VyIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0W10gdHJlZSA9IGR5bl90cmVlOworICAgICAgICAgICAgc2hvcnRbXSBzdHJlZSA9IHN0YXRpY1RyZWUudHJlZUNvZGVzOworICAgICAgICAgICAgaW50W10gZXh0cmEgPSBzdGF0aWNUcmVlLmV4dHJhQml0czsKKyAgICAgICAgICAgIGludCBiYXNlX1JlbmFtZWQgPSBzdGF0aWNUcmVlLmV4dHJhQmFzZTsKKyAgICAgICAgICAgIGludCBtYXhfbGVuZ3RoID0gc3RhdGljVHJlZS5tYXhMZW5ndGg7CisgICAgICAgICAgICBpbnQgaDsgLy8gaGVhcCBpbmRleAorICAgICAgICAgICAgaW50IG4sIG07IC8vIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cworICAgICAgICAgICAgaW50IGJpdHM7IC8vIGJpdCBsZW5ndGgKKyAgICAgICAgICAgIGludCB4Yml0czsgLy8gZXh0cmEgYml0cworICAgICAgICAgICAgc2hvcnQgZjsgLy8gZnJlcXVlbmN5CisgICAgICAgICAgICBpbnQgb3ZlcmZsb3cgPSAwOyAvLyBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IEludGVybmFsQ29uc3RhbnRzLk1BWF9CSVRTOyBiaXRzKyspCisgICAgICAgICAgICAgICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5CisgICAgICAgICAgICAvLyBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KKyAgICAgICAgICAgIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdID0gMDsgLy8gcm9vdCBvZiB0aGUgaGVhcAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGggPSBzLmhlYXBfbWF4ICsgMTsgaCA8IEhFQVBfU0laRTsgaCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG4gPSBzLmhlYXBbaF07CisgICAgICAgICAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdICogMiArIDFdICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiaXRzID0gbWF4X2xlbmd0aDsgb3ZlcmZsb3crKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJlZVtuICogMiArIDFdID0gKHNob3J0KSBiaXRzOworICAgICAgICAgICAgICAgIC8vIFdlIG92ZXJ3cml0ZSB0cmVlW24qMisxXSB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChuID4gbWF4X2NvZGUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgYSBsZWFmIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcy5ibF9jb3VudFtiaXRzXSsrOworICAgICAgICAgICAgICAgIHhiaXRzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAobiA+PSBiYXNlX1JlbmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VfUmVuYW1lZF07CisgICAgICAgICAgICAgICAgZiA9IHRyZWVbbiAqIDJdOworICAgICAgICAgICAgICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0gKyB4Yml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3ZlcmZsb3cgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cworICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZToKKyAgICAgICAgICAgIGRvIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBiaXRzLS07CisgICAgICAgICAgICAgICAgcy5ibF9jb3VudFtiaXRzXS0tOyAvLyBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUKKyAgICAgICAgICAgICAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSA9IChzaG9ydCkgKHMuYmxfY291bnRbYml0cyArIDFdICsgMik7IC8vIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIKKyAgICAgICAgICAgICAgICBzLmJsX2NvdW50W21heF9sZW5ndGhdLS07CisgICAgICAgICAgICAgICAgLy8gVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKKyAgICAgICAgICAgICAgICAvLyBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KKyAgICAgICAgICAgICAgICBvdmVyZmxvdyAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKG92ZXJmbG93ID4gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT0gMDsgYml0cy0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG4gPSBzLmJsX2NvdW50W2JpdHNdOworICAgICAgICAgICAgICAgIHdoaWxlIChuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtID0gcy5oZWFwWy0taF07CisgICAgICAgICAgICAgICAgICAgIGlmIChtID4gbWF4X2NvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXSAhPSBiaXRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLm9wdF9sZW4gPSAoaW50KSAocy5vcHRfbGVuICsgKChsb25nKSBiaXRzIC0gKGxvbmcpIHRyZWVbbSAqIDIgKyAxXSkgKiAobG9uZykgdHJlZVttICogMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVttICogMiArIDFdID0gKHNob3J0KSBiaXRzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgICAgICAgIC8vIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAgICAgICAgLy8gT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aAorICAgICAgICAvLyAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAgICAgICAgLy8gICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCAgYnVpbGRfdHJlZShEZWZsYXRlTWFuYWdlciBzKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydFtdIHRyZWUgID0gZHluX3RyZWU7CisgICAgICAgICAgICBzaG9ydFtdIHN0cmVlID0gc3RhdGljVHJlZS50cmVlQ29kZXM7CisgICAgICAgICAgICBpbnQgZWxlbXMgICAgID0gc3RhdGljVHJlZS5lbGVtczsKKyAgICAgICAgICAgIGludCBuLCBtOyAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzCisgICAgICAgICAgICBpbnQgbWF4X2NvZGUgID0gLTE7ICAvLyBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kKKyAgICAgICAgICAgIGludCBub2RlOyAgICAgICAgICAgIC8vIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorICAgICAgICAgICAgLy8gaGVhcFsxXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KKyAgICAgICAgICAgIC8vIGhlYXBbMF0gaXMgbm90IHVzZWQuCisgICAgICAgICAgICBzLmhlYXBfbGVuID0gMDsKKyAgICAgICAgICAgIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0cmVlW24gKiAyXSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47CisgICAgICAgICAgICAgICAgICAgIHMuZGVwdGhbbl0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmVlW24gKiAyICsgMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKKyAgICAgICAgICAgIC8vIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAgICAgICAgLy8gcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3QKKyAgICAgICAgICAgIC8vIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCisgICAgICAgICAgICB3aGlsZSAocy5oZWFwX2xlbiA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMj8rK21heF9jb2RlOjApOworICAgICAgICAgICAgICAgIHRyZWVbbm9kZSAqIDJdID0gMTsKKyAgICAgICAgICAgICAgICBzLmRlcHRoW25vZGVdID0gMDsKKyAgICAgICAgICAgICAgICBzLm9wdF9sZW4tLTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV07CisgICAgICAgICAgICAgICAgLy8gbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm1heF9jb2RlID0gbWF4X2NvZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKKyAgICAgICAgICAgIC8vIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKG4gPSBzLmhlYXBfbGVuIC8gMjsgbiA+PSAxOyBuLS0pCisgICAgICAgICAgICAgICAgcy5wcWRvd25oZWFwKHRyZWUsIG4pOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisgICAgICAgICAgICAvLyBmcmVxdWVudCBub2Rlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbm9kZSA9IGVsZW1zOyAvLyBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUKKyAgICAgICAgICAgIGRvIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgIG4gPSBzLmhlYXBbMV07CisgICAgICAgICAgICAgICAgcy5oZWFwWzFdID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07CisgICAgICAgICAgICAgICAgcy5wcWRvd25oZWFwKHRyZWUsIDEpOworICAgICAgICAgICAgICAgIG0gPSBzLmhlYXBbMV07IC8vIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLy8ga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeQorICAgICAgICAgICAgICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0KKyAgICAgICAgICAgICAgICB0cmVlW25vZGUgKiAyXSA9IHVuY2hlY2tlZCgoc2hvcnQpICh0cmVlW24gKiAyXSArIHRyZWVbbSAqIDJdKSk7CisgICAgICAgICAgICAgICAgcy5kZXB0aFtub2RlXSA9IChzYnl0ZSkgKFN5c3RlbS5NYXRoLk1heCgoYnl0ZSkgcy5kZXB0aFtuXSwgKGJ5dGUpIHMuZGVwdGhbbV0pICsgMSk7CisgICAgICAgICAgICAgICAgdHJlZVtuICogMiArIDFdID0gdHJlZVttICogMiArIDFdID0gKHNob3J0KSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcAorICAgICAgICAgICAgICAgIHMuaGVhcFsxXSA9IG5vZGUrKzsKKyAgICAgICAgICAgICAgICBzLnBxZG93bmhlYXAodHJlZSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocy5oZWFwX2xlbiA+PSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZ2VuX2JpdGxlbihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcworICAgICAgICAgICAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKKyAgICAgICAgLy8gb3B0aW1hbCkuCisgICAgICAgIC8vIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCisgICAgICAgIC8vIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgICAgICAgIC8vIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCisgICAgICAgIC8vICAgICB6ZXJvIGNvZGUgbGVuZ3RoLgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCAgZ2VuX2NvZGVzKHNob3J0W10gdHJlZSwgaW50IG1heF9jb2RlLCBzaG9ydFtdIGJsX2NvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydFtdIG5leHRfY29kZSA9IG5ldyBzaG9ydFtJbnRlcm5hbENvbnN0YW50cy5NQVhfQklUUyArIDFdOyAvLyBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aAorICAgICAgICAgICAgc2hvcnQgY29kZSA9IDA7IC8vIHJ1bm5pbmcgY29kZSB2YWx1ZQorICAgICAgICAgICAgaW50IGJpdHM7IC8vIGJpdCBpbmRleAorICAgICAgICAgICAgaW50IG47IC8vIGNvZGUgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzCisgICAgICAgICAgICAvLyB3aXRob3V0IGJpdCByZXZlcnNhbC4KKyAgICAgICAgICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gSW50ZXJuYWxDb25zdGFudHMuTUFYX0JJVFM7IGJpdHMrKykKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQgeworICAgICAgICAgICAgICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKHNob3J0KSAoKGNvZGUgKyBibF9jb3VudFtiaXRzIC0gMV0pIDw8IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorICAgICAgICAgICAgLy8gbXVzdCBiZSBhbGwgb25lcy4KKyAgICAgICAgICAgIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAorICAgICAgICAgICAgLy8gICAgICAgICJpbmNvbnNpc3RlbnQgYml0IGNvdW50cyIpOworICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gdHJlZVtuICogMiArIDFdOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8gTm93IHJldmVyc2UgdGhlIGJpdHMKKyAgICAgICAgICAgICAgICB0cmVlW24gKiAyXSA9ICB1bmNoZWNrZWQoKHNob3J0KSAoYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXIKKyAgICAgICAgLy8gbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKQorICAgICAgICAvLyBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgICAgICAgIGludGVybmFsIHN0YXRpYyBpbnQgYmlfcmV2ZXJzZShpbnQgY29kZSwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJlcyA9IDA7CisgICAgICAgICAgICBkbyAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXMgfD0gY29kZSAmIDE7CisgICAgICAgICAgICAgICAgY29kZSA+Pj0gMTsgLy9TaGFyZWRVdGlscy5VUlNoaWZ0KGNvZGUsIDEpOworICAgICAgICAgICAgICAgIHJlcyA8PD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgtLWxlbiA+IDApOworICAgICAgICAgICAgcmV0dXJuIHJlcyA+PiAxOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvWmxpYi5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvWmxpYi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ4ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9abGliLmNzCkBAIC0wLDAgKzEsNTQ2IEBACisvLyBabGliLmNzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBEaW5vIENoaWVzYSBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBMYXN0IFNhdmVkOiA8MjAxMS1BdWd1c3QtMDMgMTk6NTI6Mjg+CisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBjbGFzc2VzIGZvciBaTElCIGNvbXByZXNzaW9uIGFuZAorLy8gZGVjb21wcmVzc2lvbi4gVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUganpsaWIgaW1wbGVtZW50YXRpb24gb2YKKy8vIHpsaWIsIGJ1dCBzaWduaWZpY2FudGx5IG1vZGlmaWVkLiAgVGhlIG9iamVjdCBtb2RlbCBpcyBub3QgdGhlIHNhbWUsCisvLyBhbmQgbWFueSBvZiB0aGUgYmVoYXZpb3JzIGFyZSBuZXcgb3IgZGlmZmVyZW50LiAgTm9uZXRoZWxlc3MsIGluCisvLyBrZWVwaW5nIHdpdGggdGhlIGxpY2Vuc2UgZm9yIGp6bGliLCB0aGUgY29weXJpZ2h0IHRvIHRoYXQgY29kZSBpcworLy8gaW5jbHVkZWQgYmVsb3cuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhlIGZvbGxvd2luZyBub3RpY2UgYXBwbGllcyB0byBqemxpYjoKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSwyMDAyLDIwMDMgeW1uaywgSkNyYWZ0LEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorLy8gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKKy8vIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBKQ1JBRlQsCisvLyBJTkMuIE9SIEFOWSBDT05UUklCVVRPUlMgVE8gVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCisvLyBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisvLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworLy8gTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorLy8gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGp6bGliIGlzIGJhc2VkIG9uIHpsaWItMS4xLjMuCisvLworLy8gVGhlIGZvbGxvd2luZyBub3RpY2UgYXBwbGllcyB0byB6bGliOgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorLy8KKy8vICAgVGhlIFpMSUIgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisvLyAgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKy8vICAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKy8vCisvLyAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorLy8gICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisvLyAgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKy8vCisvLyAgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisvLyAgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisvLyAgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorLy8gICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorLy8gICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorLy8gICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisvLyAgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisvLworLy8gICBKZWFuLWxvdXAgR2FpbGx5IGpsb3VwQGd6aXAub3JnCisvLyAgIE1hcmsgQWRsZXIgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCit1c2luZyBTeXN0ZW07Cit1c2luZyBJbnRlcm9wPVN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRGVzY3JpYmVzIGhvdyB0byBmbHVzaCB0aGUgY3VycmVudCBkZWZsYXRlIG9wZXJhdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhlIGRpZmZlcmVudCBGbHVzaFR5cGUgdmFsdWVzIGFyZSB1c2VmdWwgd2hlbiB1c2luZyBhIERlZmxhdGUgaW4gYSBzdHJlYW1pbmcgYXBwbGljYXRpb24uCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwdWJsaWMgZW51bSBGbHVzaFR5cGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT5ObyBmbHVzaCBhdCBhbGwuPC9zdW1tYXJ5PgorICAgICAgICBOb25lID0gMCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+Q2xvc2VzIHRoZSBjdXJyZW50IGJsb2NrLCBidXQgZG9lc24ndCBmbHVzaCBpdCB0bworICAgICAgICAvLy8gdGhlIG91dHB1dC4gVXNlZCBpbnRlcm5hbGx5IG9ubHkgaW4gaHlwb3RoZXRpY2FsCisgICAgICAgIC8vLyBzY2VuYXJpb3MuICBUaGlzIHdhcyBzdXBwb3NlZCB0byBiZSByZW1vdmVkIGJ5IFpsaWIsIGJ1dCBpdCBpcworICAgICAgICAvLy8gc3RpbGwgaW4gdXNlIGluIHNvbWUgZWRnZSBjYXNlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUGFydGlhbCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgdGhpcyBkdXJpbmcgY29tcHJlc3Npb24gdG8gc3BlY2lmeSB0aGF0IGFsbCBwZW5kaW5nIG91dHB1dCBzaG91bGQgYmUKKyAgICAgICAgLy8vIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSBieXRlCisgICAgICAgIC8vLyBib3VuZGFyeS4gIFlvdSBtaWdodCB1c2UgdGhpcyBpbiBhIHN0cmVhbWluZyBjb21tdW5pY2F0aW9uIHNjZW5hcmlvLCBzbyB0aGF0CisgICAgICAgIC8vLyB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gIFdoZW4gdXNpbmcgdGhpcworICAgICAgICAvLy8gd2l0aCBhIFpsaWJDb2RlYywgPGM+QXZhaWxhYmxlQnl0ZXNJbjwvYz4gd2lsbCBiZSB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmCisgICAgICAgIC8vLyBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkIGJlZm9yZSB0aGUgY2FsbC4gIEZsdXNoaW5nIHdpbGwKKyAgICAgICAgLy8vIGRlZ3JhZGUgY29tcHJlc3Npb24gYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFN5bmMsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIHRoaXMgZHVyaW5nIGNvbXByZXNzaW9uIHRvIHNwZWNpZnkgdGhhdCBhbGwgb3V0cHV0IHNob3VsZCBiZSBmbHVzaGVkLCBhcworICAgICAgICAvLy8gd2l0aCA8Yz5GbHVzaFR5cGUuU3luYzwvYz4sIGJ1dCBhbHNvLCB0aGUgY29tcHJlc3Npb24gc3RhdGUgc2hvdWxkIGJlIHJlc2V0CisgICAgICAgIC8vLyBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQKKyAgICAgICAgLy8vIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZiByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuICBVc2luZworICAgICAgICAvLy8gPGM+Rmx1c2hUeXBlLkZ1bGw8L2M+IHRvbyBvZnRlbiBjYW4gc2lnbmlmaWNhbnRseSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRnVsbCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+U2lnbmFscyB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIHN0cmVhbS48L3N1bW1hcnk+CisgICAgICAgIEZpbmlzaCwKKyAgICB9CisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIGJlIHVzZWQgd2hlbiB1c2luZyBhIERlZmxhdGVTdHJlYW0gb3IgWmxpYlN0cmVhbSB3aXRoIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIENvbXByZXNzaW9uTGV2ZWwKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vbmUgbWVhbnMgdGhhdCB0aGUgZGF0YSB3aWxsIGJlIHNpbXBseSBzdG9yZWQsIHdpdGggbm8gY2hhbmdlIGF0IGFsbC4KKyAgICAgICAgLy8vIElmIHlvdSBhcmUgcHJvZHVjaW5nIFpJUHMgZm9yIHVzZSBvbiBNYWMgT1NYLCBiZSBhd2FyZSB0aGF0IGFyY2hpdmVzIHByb2R1Y2VkIHdpdGggQ29tcHJlc3Npb25MZXZlbC5Ob25lCisgICAgICAgIC8vLyBjYW5ub3QgYmUgb3BlbmVkIHdpdGggdGhlIGRlZmF1bHQgemlwIHJlYWRlci4gVXNlIGEgZGlmZmVyZW50IENvbXByZXNzaW9uTGV2ZWwuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5vbmU9IDAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhbWUgYXMgTm9uZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV2ZWwwID0gMCwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZmFzdGVzdCBidXQgbGVhc3QgZWZmZWN0aXZlIGNvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBCZXN0U3BlZWQgPSAxLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgc3lub255bSBmb3IgQmVzdFNwZWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXZlbDEgPSAxLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgbGl0dGxlIHNsb3dlciwgYnV0IGJldHRlciwgdGhhbiBsZXZlbCAxLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXZlbDIgPSAyLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgbGl0dGxlIHNsb3dlciwgYnV0IGJldHRlciwgdGhhbiBsZXZlbCAyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXZlbDMgPSAzLAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgbGl0dGxlIHNsb3dlciwgYnV0IGJldHRlciwgdGhhbiBsZXZlbCAzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXZlbDQgPSA0LAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgbGl0dGxlIHNsb3dlciB0aGFuIGxldmVsIDQsIGJ1dCB3aXRoIGJldHRlciBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV2ZWw1ID0gNSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCwgd2l0aCBhIGdvb2QgYmFsYW5jZSBvZiBzcGVlZCBhbmQgY29tcHJlc3Npb24gZWZmaWNpZW5jeS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRGVmYXVsdCA9IDYsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgc3lub255bSBmb3IgRGVmYXVsdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV2ZWw2ID0gNiwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmV0dHkgZ29vZCBjb21wcmVzc2lvbiEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGV2ZWw3ID0gNywKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgQmV0dGVyIGNvbXByZXNzaW9uIHRoYW4gTGV2ZWw3IQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXZlbDggPSA4LAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSAiYmVzdCIgY29tcHJlc3Npb24sIHdoZXJlIGJlc3QgbWVhbnMgZ3JlYXRlc3QgcmVkdWN0aW9uIGluIHNpemUgb2YgdGhlIGlucHV0IGRhdGEgc3RyZWFtLgorICAgICAgICAvLy8gVGhpcyBpcyBhbHNvIHRoZSBzbG93ZXN0IGNvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBCZXN0Q29tcHJlc3Npb24gPSA5LAorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgc3lub255bSBmb3IgQmVzdENvbXByZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBMZXZlbDkgPSA5LAorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRGVzY3JpYmVzIG9wdGlvbnMgZm9yIGhvdyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIGV4ZWN1dGVkLiAgRGlmZmVyZW50IHN0cmF0ZWdpZXMKKyAgICAvLy8gd29yayBiZXR0ZXIgb24gZGlmZmVyZW50IHNvcnRzIG9mIGRhdGEuICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGNhbiBhZmZlY3QgdGhlIGNvbXByZXNzaW9uCisgICAgLy8vIHJhdGlvIGFuZCB0aGUgc3BlZWQgb2YgY29tcHJlc3Npb24gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzc2lvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIENvbXByZXNzaW9uU3RyYXRlZ3kKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IGlzIHByb2JhYmx5IHRoZSBiZXN0IGZvciBub3JtYWwgZGF0YS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRGVmYXVsdCA9IDAsCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIDxjPkZpbHRlcmVkPC9jPiBzdHJhdGVneSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG1vc3QgZWZmZWN0aXZlbHkgd2l0aCBkYXRhIHByb2R1Y2VkIGJ5IGEKKyAgICAgICAgLy8vIGZpbHRlciBvciBwcmVkaWN0b3IuICBCeSB0aGlzIGRlZmluaXRpb24sIGZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsCisgICAgICAgIC8vLyB2YWx1ZXMgd2l0aCBhIHNvbWV3aGF0IHJhbmRvbSBkaXN0cmlidXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKyAgICAgICAgLy8vIGlzIHR1bmVkIHRvIGNvbXByZXNzIHRoZW0gYmV0dGVyLiAgVGhlIGVmZmVjdCBvZiA8Yz5GaWx0ZXJlZDwvYz4gaXMgdG8gZm9yY2UgbW9yZSBIdWZmbWFuCisgICAgICAgIC8vLyBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nOyBpdCBpcyBhIGhhbGYtc3RlcCBiZXR3ZWVuIDxjPkRlZmF1bHQ8L2M+IGFuZCA8Yz5IdWZmbWFuT25seTwvYz4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEZpbHRlcmVkID0gMSwKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2luZyA8Yz5IdWZmbWFuT25seTwvYz4gd2lsbCBmb3JjZSB0aGUgY29tcHJlc3NvciB0byBkbyBIdWZmbWFuIGVuY29kaW5nIG9ubHksIHdpdGggbm8KKyAgICAgICAgLy8vIHN0cmluZyBtYXRjaGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSHVmZm1hbk9ubHkgPSAyLAorICAgIH0KKworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBbiBlbnVtIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0cmFuc2NvZGluZyAtIHdoZXRoZXIgdG8gY29tcHJlc3Mgb3IgZGVjb21wcmVzcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIENvbXByZXNzaW9uTW9kZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlZCB0byBzcGVjaWZ5IHRoYXQgdGhlIHN0cmVhbSBzaG91bGQgY29tcHJlc3MgdGhlIGRhdGEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIENvbXByZXNzPSAwLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgc3RyZWFtIHNob3VsZCBkZWNvbXByZXNzIHRoZSBkYXRhLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBEZWNvbXByZXNzID0gMSwKKyAgICB9CisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBnZW5lcmFsIHB1cnBvc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBleGNlcHRpb25zIGluIHRoZSBabGliIGxpYnJhcnkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBbSW50ZXJvcC5HdWlkQXR0cmlidXRlKCJlYmMyNWNmNi05MTIwLTQyODMtYjk3Mi0wZTU1MjBkMDAwMEUiKV0KKyAgICBwdWJsaWMgY2xhc3MgWmxpYkV4Y2VwdGlvbiA6IFN5c3RlbS5FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBabGliRXhjZXB0aW9uIGNsYXNzIGNhcHR1cmVzIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQKKyAgICAgICAgLy8vIGJ5IHRoZSBabGliIGxpYnJhcnkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBabGliRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogYmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgY3RvciBjb2xsZWN0cyBhIG1lc3NhZ2UgYXR0YWNoZWQgdG8gdGhlIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj50aGUgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgWmxpYkV4Y2VwdGlvbihTeXN0ZW0uU3RyaW5nIHMpCisgICAgICAgICAgICA6IGJhc2UocykKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisKKyAgICBpbnRlcm5hbCBjbGFzcyBTaGFyZWRVdGlscworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGVyZm9ybXMgYW4gdW5zaWduZWQgYml0d2lzZSByaWdodCBzaGlmdCB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnVtYmVyIj5OdW1iZXIgdG8gb3BlcmF0ZSBvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYml0cyI+QW1tb3VudCBvZiBiaXRzIHRvIHNoaWZ0PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSByZXN1bHRpbmcgbnVtYmVyIGZyb20gdGhlIHNoaWZ0IG9wZXJhdGlvbjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgVVJTaGlmdChpbnQgbnVtYmVyLCBpbnQgYml0cykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKCh1aW50KW51bWJlciA+PiBiaXRzKTsKKyAgICAgICAgfQorCisjaWYgTk9UCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBlcmZvcm1zIGFuIHVuc2lnbmVkIGJpdHdpc2UgcmlnaHQgc2hpZnQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im51bWJlciI+TnVtYmVyIHRvIG9wZXJhdGUgb248L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJpdHMiPkFtbW91bnQgb2YgYml0cyB0byBzaGlmdDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgcmVzdWx0aW5nIG51bWJlciBmcm9tIHRoZSBzaGlmdCBvcGVyYXRpb248L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBVUlNoaWZ0KGxvbmcgbnVtYmVyLCBpbnQgYml0cykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKSAoKFVJbnQ2NCludW1iZXIgPj4gYml0cyk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmVhZHMgYSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBjdXJyZW50IHNvdXJjZSBUZXh0UmVhZGVyIGFuZCB3cml0ZXMKKyAgICAgICAgLy8vICAgdGhlIGRhdGEgdG8gdGhlIHRhcmdldCBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2VUZXh0UmVhZGVyIj5UaGUgc291cmNlIFRleHRSZWFkZXIgdG8gcmVhZCBmcm9tPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YXJnZXQiPkNvbnRhaW5zIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJlcyByZWFkIGZyb20gdGhlIHNvdXJjZSBUZXh0UmVhZGVyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhcnQiPlRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgdGFyZ2V0IGFycmF5LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgc291cmNlIFRleHRSZWFkZXIuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQuIFRoZSBudW1iZXIgd2lsbCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgLy8vICAgY291bnQgZGVwZW5kaW5nIG9uIHRoZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgc291cmNlIFRleHRSZWFkZXIuIFJldHVybnMgLTEKKyAgICAgICAgLy8vICAgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICAgIC8vLyA8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtLkludDMyIFJlYWRJbnB1dChTeXN0ZW0uSU8uVGV4dFJlYWRlciBzb3VyY2VUZXh0UmVhZGVyLCBieXRlW10gdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmV0dXJucyAwIGJ5dGVzIGlmIG5vdCBlbm91Z2ggc3BhY2UgaW4gdGFyZ2V0CisgICAgICAgICAgICBpZiAodGFyZ2V0Lkxlbmd0aCA9PSAwKSByZXR1cm4gMDsKKworICAgICAgICAgICAgY2hhcltdIGNoYXJBcnJheSA9IG5ldyBjaGFyW3RhcmdldC5MZW5ndGhdOworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHNvdXJjZVRleHRSZWFkZXIuUmVhZChjaGFyQXJyYXksIHN0YXJ0LCBjb3VudCk7CisKKyAgICAgICAgICAgIC8vIFJldHVybnMgLTEgaWYgRU9GCisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID09IDApIHJldHVybiAtMTsKKworICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBzdGFydCArIGJ5dGVzUmVhZDsgaW5kZXgrKykKKyAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdID0gKGJ5dGUpY2hhckFycmF5W2luZGV4XTsKKworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBUb0J5dGVBcnJheShTeXN0ZW0uU3RyaW5nIHNvdXJjZVN0cmluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHNvdXJjZVN0cmluZyk7CisgICAgICAgIH0KKworCisgICAgICAgIGludGVybmFsIHN0YXRpYyBjaGFyW10gVG9DaGFyQXJyYXkoYnl0ZVtdIGJ5dGVBcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZy5VVEY4LkdldENoYXJzKGJ5dGVBcnJheSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgSW50ZXJuYWxDb25zdGFudHMKKyAgICB7CisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnQgTUFYX0JJVFMgICAgID0gMTU7CisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnQgQkxfQ09ERVMgICAgID0gMTk7CisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnQgRF9DT0RFUyAgICAgID0gMzA7CisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBpbnQgTElURVJBTFMgICAgID0gMjU2OworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50IExFTkdUSF9DT0RFUyA9IDI5OworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50IExfQ09ERVMgICAgICA9IChMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVMpOworCisgICAgICAgIC8vIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludCBNQVhfQkxfQklUUyAgPSA3OworCisgICAgICAgIC8vIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludCBSRVBfM182ICAgICAgPSAxNjsKKworICAgICAgICAvLyByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IGludCBSRVBaXzNfMTAgICAgPSAxNzsKKworICAgICAgICAvLyByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgaW50IFJFUFpfMTFfMTM4ICA9IDE4OworCisgICAgfQorCisgICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIFN0YXRpY1RyZWUKKyAgICB7CisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBzaG9ydFtdIGxlbmd0aEFuZExpdGVyYWxzVHJlZUNvZGVzID0gbmV3IHNob3J0W10geworICAgICAgICAgICAgMTIsIDgsIDE0MCwgOCwgNzYsIDgsIDIwNCwgOCwgNDQsIDgsIDE3MiwgOCwgMTA4LCA4LCAyMzYsIDgsCisgICAgICAgICAgICAyOCwgOCwgMTU2LCA4LCA5MiwgOCwgMjIwLCA4LCA2MCwgOCwgMTg4LCA4LCAxMjQsIDgsIDI1MiwgOCwKKyAgICAgICAgICAgICAyLCA4LCAxMzAsIDgsIDY2LCA4LCAxOTQsIDgsIDM0LCA4LCAxNjIsIDgsIDk4LCA4LCAyMjYsIDgsCisgICAgICAgICAgICAxOCwgOCwgMTQ2LCA4LCA4MiwgOCwgMjEwLCA4LCA1MCwgOCwgMTc4LCA4LCAxMTQsIDgsIDI0MiwgOCwKKyAgICAgICAgICAgIDEwLCA4LCAxMzgsIDgsIDc0LCA4LCAyMDIsIDgsIDQyLCA4LCAxNzAsIDgsIDEwNiwgOCwgMjM0LCA4LAorICAgICAgICAgICAgMjYsIDgsIDE1NCwgOCwgOTAsIDgsIDIxOCwgOCwgNTgsIDgsIDE4NiwgOCwgMTIyLCA4LCAyNTAsIDgsCisgICAgICAgICAgICAgNiwgOCwgMTM0LCA4LCA3MCwgOCwgMTk4LCA4LCAzOCwgOCwgMTY2LCA4LCAxMDIsIDgsIDIzMCwgOCwKKyAgICAgICAgICAgIDIyLCA4LCAxNTAsIDgsIDg2LCA4LCAyMTQsIDgsIDU0LCA4LCAxODIsIDgsIDExOCwgOCwgMjQ2LCA4LAorICAgICAgICAgICAgMTQsIDgsIDE0MiwgOCwgNzgsIDgsIDIwNiwgOCwgNDYsIDgsIDE3NCwgOCwgMTEwLCA4LCAyMzgsIDgsCisgICAgICAgICAgICAzMCwgOCwgMTU4LCA4LCA5NCwgOCwgMjIyLCA4LCA2MiwgOCwgMTkwLCA4LCAxMjYsIDgsIDI1NCwgOCwKKyAgICAgICAgICAgICAxLCA4LCAxMjksIDgsIDY1LCA4LCAxOTMsIDgsIDMzLCA4LCAxNjEsIDgsIDk3LCA4LCAyMjUsIDgsCisgICAgICAgICAgICAxNywgOCwgMTQ1LCA4LCA4MSwgOCwgMjA5LCA4LCA0OSwgOCwgMTc3LCA4LCAxMTMsIDgsIDI0MSwgOCwKKyAgICAgICAgICAgICA5LCA4LCAxMzcsIDgsIDczLCA4LCAyMDEsIDgsIDQxLCA4LCAxNjksIDgsIDEwNSwgOCwgMjMzLCA4LAorICAgICAgICAgICAgMjUsIDgsIDE1MywgOCwgODksIDgsIDIxNywgOCwgNTcsIDgsIDE4NSwgOCwgMTIxLCA4LCAyNDksIDgsCisgICAgICAgICAgICAgNSwgOCwgMTMzLCA4LCA2OSwgOCwgMTk3LCA4LCAzNywgOCwgMTY1LCA4LCAxMDEsIDgsIDIyOSwgOCwKKyAgICAgICAgICAgIDIxLCA4LCAxNDksIDgsIDg1LCA4LCAyMTMsIDgsIDUzLCA4LCAxODEsIDgsIDExNywgOCwgMjQ1LCA4LAorICAgICAgICAgICAgMTMsIDgsIDE0MSwgOCwgNzcsIDgsIDIwNSwgOCwgNDUsIDgsIDE3MywgOCwgMTA5LCA4LCAyMzcsIDgsCisgICAgICAgICAgICAyOSwgOCwgMTU3LCA4LCA5MywgOCwgMjIxLCA4LCA2MSwgOCwgMTg5LCA4LCAxMjUsIDgsIDI1MywgOCwKKyAgICAgICAgICAgIDE5LCA5LCAyNzUsIDksIDE0NywgOSwgNDAzLCA5LCA4MywgOSwgMzM5LCA5LCAyMTEsIDksIDQ2NywgOSwKKyAgICAgICAgICAgIDUxLCA5LCAzMDcsIDksIDE3OSwgOSwgNDM1LCA5LCAxMTUsIDksIDM3MSwgOSwgMjQzLCA5LCA0OTksIDksCisgICAgICAgICAgICAxMSwgOSwgMjY3LCA5LCAxMzksIDksIDM5NSwgOSwgNzUsIDksIDMzMSwgOSwgMjAzLCA5LCA0NTksIDksCisgICAgICAgICAgICA0MywgOSwgMjk5LCA5LCAxNzEsIDksIDQyNywgOSwgMTA3LCA5LCAzNjMsIDksIDIzNSwgOSwgNDkxLCA5LAorICAgICAgICAgICAgMjcsIDksIDI4MywgOSwgMTU1LCA5LCA0MTEsIDksIDkxLCA5LCAzNDcsIDksIDIxOSwgOSwgNDc1LCA5LAorICAgICAgICAgICAgNTksIDksIDMxNSwgOSwgMTg3LCA5LCA0NDMsIDksIDEyMywgOSwgMzc5LCA5LCAyNTEsIDksIDUwNywgOSwKKyAgICAgICAgICAgICA3LCA5LCAyNjMsIDksIDEzNSwgOSwgMzkxLCA5LCA3MSwgOSwgMzI3LCA5LCAxOTksIDksIDQ1NSwgOSwKKyAgICAgICAgICAgIDM5LCA5LCAyOTUsIDksIDE2NywgOSwgNDIzLCA5LCAxMDMsIDksIDM1OSwgOSwgMjMxLCA5LCA0ODcsIDksCisgICAgICAgICAgICAyMywgOSwgMjc5LCA5LCAxNTEsIDksIDQwNywgOSwgODcsIDksIDM0MywgOSwgMjE1LCA5LCA0NzEsIDksCisgICAgICAgICAgICA1NSwgOSwgMzExLCA5LCAxODMsIDksIDQzOSwgOSwgMTE5LCA5LCAzNzUsIDksIDI0NywgOSwgNTAzLCA5LAorICAgICAgICAgICAgMTUsIDksIDI3MSwgOSwgMTQzLCA5LCAzOTksIDksIDc5LCA5LCAzMzUsIDksIDIwNywgOSwgNDYzLCA5LAorICAgICAgICAgICAgNDcsIDksIDMwMywgOSwgMTc1LCA5LCA0MzEsIDksIDExMSwgOSwgMzY3LCA5LCAyMzksIDksIDQ5NSwgOSwKKyAgICAgICAgICAgIDMxLCA5LCAyODcsIDksIDE1OSwgOSwgNDE1LCA5LCA5NSwgOSwgMzUxLCA5LCAyMjMsIDksIDQ3OSwgOSwKKyAgICAgICAgICAgIDYzLCA5LCAzMTksIDksIDE5MSwgOSwgNDQ3LCA5LCAxMjcsIDksIDM4MywgOSwgMjU1LCA5LCA1MTEsIDksCisgICAgICAgICAgICAgMCwgNywgNjQsIDcsIDMyLCA3LCA5NiwgNywgMTYsIDcsIDgwLCA3LCA0OCwgNywgMTEyLCA3LAorICAgICAgICAgICAgIDgsIDcsIDcyLCA3LCA0MCwgNywgMTA0LCA3LCAyNCwgNywgODgsIDcsIDU2LCA3LCAxMjAsIDcsCisgICAgICAgICAgICAgNCwgNywgNjgsIDcsIDM2LCA3LCAxMDAsIDcsIDIwLCA3LCA4NCwgNywgNTIsIDcsIDExNiwgNywKKyAgICAgICAgICAgICAzLCA4LCAxMzEsIDgsIDY3LCA4LCAxOTUsIDgsIDM1LCA4LCAxNjMsIDgsIDk5LCA4LCAyMjcsIDgKKyAgICAgICAgfTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBkaXN0VHJlZUNvZGVzID0gbmV3IHNob3J0W10geworICAgICAgICAgICAgMCwgNSwgMTYsIDUsIDgsIDUsIDI0LCA1LCA0LCA1LCAyMCwgNSwgMTIsIDUsIDI4LCA1LAorICAgICAgICAgICAgMiwgNSwgMTgsIDUsIDEwLCA1LCAyNiwgNSwgNiwgNSwgMjIsIDUsIDE0LCA1LCAzMCwgNSwKKyAgICAgICAgICAgIDEsIDUsIDE3LCA1LCA5LCA1LCAyNSwgNSwgNSwgNSwgMjEsIDUsIDEzLCA1LCAyOSwgNSwKKyAgICAgICAgICAgIDMsIDUsIDE5LCA1LCAxMSwgNSwgMjcsIDUsIDcsIDUsIDIzLCA1IH07CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IFN0YXRpY1RyZWUgTGl0ZXJhbHM7CisgICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBTdGF0aWNUcmVlIERpc3RhbmNlczsKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IFN0YXRpY1RyZWUgQml0TGVuZ3RoczsKKworICAgICAgICBpbnRlcm5hbCBzaG9ydFtdIHRyZWVDb2RlczsgLy8gc3RhdGljIHRyZWUgb3IgbnVsbAorICAgICAgICBpbnRlcm5hbCBpbnRbXSBleHRyYUJpdHM7ICAgLy8gZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIG51bGwKKyAgICAgICAgaW50ZXJuYWwgaW50IGV4dHJhQmFzZTsgICAgIC8vIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMKKyAgICAgICAgaW50ZXJuYWwgaW50IGVsZW1zOyAgICAgICAgIC8vIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUKKyAgICAgICAgaW50ZXJuYWwgaW50IG1heExlbmd0aDsgICAgIC8vIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMKKworICAgICAgICBwcml2YXRlIFN0YXRpY1RyZWUoc2hvcnRbXSB0cmVlQ29kZXMsIGludFtdIGV4dHJhQml0cywgaW50IGV4dHJhQmFzZSwgaW50IGVsZW1zLCBpbnQgbWF4TGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRyZWVDb2RlcyA9IHRyZWVDb2RlczsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFCaXRzID0gZXh0cmFCaXRzOworICAgICAgICAgICAgdGhpcy5leHRyYUJhc2UgPSBleHRyYUJhc2U7CisgICAgICAgICAgICB0aGlzLmVsZW1zID0gZWxlbXM7CisgICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgU3RhdGljVHJlZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpdGVyYWxzID0gbmV3IFN0YXRpY1RyZWUobGVuZ3RoQW5kTGl0ZXJhbHNUcmVlQ29kZXMsIFRyZWUuRXh0cmFMZW5ndGhCaXRzLCBJbnRlcm5hbENvbnN0YW50cy5MSVRFUkFMUyArIDEsIEludGVybmFsQ29uc3RhbnRzLkxfQ09ERVMsIEludGVybmFsQ29uc3RhbnRzLk1BWF9CSVRTKTsKKyAgICAgICAgICAgIERpc3RhbmNlcyA9IG5ldyBTdGF0aWNUcmVlKGRpc3RUcmVlQ29kZXMsIFRyZWUuRXh0cmFEaXN0YW5jZUJpdHMsIDAsIEludGVybmFsQ29uc3RhbnRzLkRfQ09ERVMsIEludGVybmFsQ29uc3RhbnRzLk1BWF9CSVRTKTsKKyAgICAgICAgICAgIEJpdExlbmd0aHMgPSBuZXcgU3RhdGljVHJlZShudWxsLCBUcmVlLmV4dHJhX2JsYml0cywgMCwgSW50ZXJuYWxDb25zdGFudHMuQkxfQ09ERVMsIEludGVybmFsQ29uc3RhbnRzLk1BWF9CTF9CSVRTKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbXB1dGVzIGFuIEFkbGVyLTMyIGNoZWNrc3VtLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGUgQWRsZXIgY2hlY2tzdW0gaXMgc2ltaWxhciB0byBhIENSQyBjaGVja3N1bSwgYnV0IGZhc3RlciB0byBjb21wdXRlLCB0aG91Z2ggbGVzcworICAgIC8vLyByZWxpYWJsZS4gIEl0IGlzIHVzZWQgaW4gcHJvZHVjaW5nIFJGQzE5NTAgY29tcHJlc3NlZCBzdHJlYW1zLiAgVGhlIEFkbGVyIGNoZWNrc3VtCisgICAgLy8vIGlzIGEgcmVxdWlyZWQgcGFydCBvZiB0aGUgIlpMSUIiIHN0YW5kYXJkLiAgQXBwbGljYXRpb25zIHdpbGwgYWxtb3N0IG5ldmVyIG5lZWQgdG8KKyAgICAvLy8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8KKyAgICAvLy8gPGV4Y2x1ZGUvPgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgQWRsZXIKKyAgICB7CisgICAgICAgIC8vIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnQgQkFTRSA9IDY1NTIxOworICAgICAgICAvLyBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IE5NQVggPSA1NTUyOworCisKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDMwMDEKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDMwMDIKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENhbGN1bGF0ZXMgdGhlIEFkbGVyMzIgY2hlY2tzdW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBpcyB1c2VkIHdpdGhpbiBaTElCLiAgWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgZGlyZWN0bHkuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gICAgVG8gY29tcHV0ZSBhbiBBZGxlcjMyIGNoZWNrc3VtIG9uIGEgYnl0ZSBhcnJheToKKyAgICAgICAgLy8vICA8Y29kZT4KKyAgICAgICAgLy8vICAgIHZhciBhZGxlciA9IEFkbGVyLkFkbGVyMzIoMCwgbnVsbCwgMCwgMCk7CisgICAgICAgIC8vLyAgICBhZGxlciA9IEFkbGVyLkFkbGVyMzIoYWRsZXIsIGJ1ZmZlciwgaW5kZXgsIGxlbmd0aCk7CisgICAgICAgIC8vLyAgPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICBwdWJsaWMgc3RhdGljIHVpbnQgQWRsZXIzMih1aW50IGFkbGVyLCBieXRlW10gYnVmLCBpbnQgaW5kZXgsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgdWludCBzMSA9ICh1aW50KSAoYWRsZXIgJiAweGZmZmYpOworICAgICAgICAgICAgdWludCBzMiA9ICh1aW50KSAoKGFkbGVyID4+IDE2KSAmIDB4ZmZmZik7CisKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBrID0gbGVuIDwgTk1BWCA/IGxlbiA6IE5NQVg7CisgICAgICAgICAgICAgICAgbGVuIC09IGs7CisgICAgICAgICAgICAgICAgd2hpbGUgKGsgPj0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL3MxICs9IChidWZbaW5kZXgrK10gJiAweGZmKTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIHMxICs9IGJ1ZltpbmRleCsrXTsgczIgKz0gczE7CisgICAgICAgICAgICAgICAgICAgIGsgLT0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChrICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzMSArPSBidWZbaW5kZXgrK107CisgICAgICAgICAgICAgICAgICAgICAgICBzMiArPSBzMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1rICE9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzMSAlPSBCQVNFOworICAgICAgICAgICAgICAgIHMyICU9IEJBU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHVpbnQpKChzMiA8PCAxNikgfCBzMSk7CisgICAgICAgIH0KKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDMwMDEKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDMwMDIKKworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvWmxpYkJhc2VTdHJlYW0uY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1psaWJCYXNlU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTVlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1psaWJCYXNlU3RyZWFtLmNzCkBAIC0wLDAgKzEsNjI4IEBACisvLyBabGliQmFzZVN0cmVhbS5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5IERpbm8gQ2hpZXNhIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFRoaXMgY29kZSBtb2R1bGUgaXMgcGFydCBvZiBEb3ROZXRaaXAsIGEgemlwZmlsZSBjbGFzcyBsaWJyYXJ5LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlLgorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKToKKy8vIFRpbWUtc3RhbXA6IDwyMDExLUF1Z3VzdC0wNiAyMToyMjozOD4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBabGliQmFzZVN0cmVhbSBjbGFzcywgd2hpY2ggaXMgYW4gaW50bmVybmFsCisvLyBiYXNlIGNsYXNzIGZvciBEZWZsYXRlU3RyZWFtLCBabGliU3RyZWFtIGFuZCBHWmlwU3RyZWFtLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5DcmM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliCit7CisKKyAgICBpbnRlcm5hbCBlbnVtIFpsaWJTdHJlYW1GbGF2b3IgeyBaTElCID0gMTk1MCwgREVGTEFURSA9IDE5NTEsIEdaSVAgPSAxOTUyIH0KKworICAgIGludGVybmFsIGNsYXNzIFpsaWJCYXNlU3RyZWFtIDogU3lzdGVtLklPLlN0cmVhbQorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIFpsaWJDb2RlYyBfeiA9IG51bGw7IC8vIGRlZmVycmVkIGluaXQuLi4gbmV3IFpsaWJDb2RlYygpOworCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBTdHJlYW1Nb2RlIF9zdHJlYW1Nb2RlID0gU3RyZWFtTW9kZS5VbmRlZmluZWQ7CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBGbHVzaFR5cGUgX2ZsdXNoTW9kZTsKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIFpsaWJTdHJlYW1GbGF2b3IgX2ZsYXZvcjsKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIENvbXByZXNzaW9uTW9kZSBfY29tcHJlc3Npb25Nb2RlOworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgQ29tcHJlc3Npb25MZXZlbCBfbGV2ZWw7CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBib29sIF9sZWF2ZU9wZW47CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBieXRlW10gX3dvcmtpbmdCdWZmZXI7CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBpbnQgX2J1ZmZlclNpemUgPSBabGliQ29uc3RhbnRzLldvcmtpbmdCdWZmZXJTaXplRGVmYXVsdDsKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGJ5dGVbXSBfYnVmMSA9IG5ldyBieXRlWzFdOworCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBTeXN0ZW0uSU8uU3RyZWFtIF9zdHJlYW07CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBDb21wcmVzc2lvblN0cmF0ZWd5IFN0cmF0ZWd5ID0gQ29tcHJlc3Npb25TdHJhdGVneS5EZWZhdWx0OworCisgICAgICAgIC8vIHdvcmtpdGVtIDcxNTkKKyAgICAgICAgQ1JDMzIgY3JjOworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RyaW5nIF9HemlwRmlsZU5hbWU7CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdHJpbmcgX0d6aXBDb21tZW50OworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgRGF0ZVRpbWUgX0d6aXBNdGltZTsKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGludCBfZ3ppcEhlYWRlckJ5dGVDb3VudDsKKworICAgICAgICBpbnRlcm5hbCBpbnQgQ3JjMzIgeyBnZXQgeyBpZiAoY3JjID09IG51bGwpIHJldHVybiAwOyByZXR1cm4gY3JjLkNyYzMyUmVzdWx0OyB9IH0KKworICAgICAgICBwdWJsaWMgWmxpYkJhc2VTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbk1vZGUgY29tcHJlc3Npb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpsaWJTdHJlYW1GbGF2b3IgZmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsZWF2ZU9wZW4pCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9mbHVzaE1vZGUgPSBGbHVzaFR5cGUuTm9uZTsKKyAgICAgICAgICAgIC8vdGhpcy5fd29ya2luZ0J1ZmZlciA9IG5ldyBieXRlW1dPUktJTkdfQlVGRkVSX1NJWkVfREVGQVVMVF07CisgICAgICAgICAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICB0aGlzLl9sZWF2ZU9wZW4gPSBsZWF2ZU9wZW47CisgICAgICAgICAgICB0aGlzLl9jb21wcmVzc2lvbk1vZGUgPSBjb21wcmVzc2lvbk1vZGU7CisgICAgICAgICAgICB0aGlzLl9mbGF2b3IgPSBmbGF2b3I7CisgICAgICAgICAgICB0aGlzLl9sZXZlbCA9IGxldmVsOworICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzE1OQorICAgICAgICAgICAgaWYgKGZsYXZvciA9PSBabGliU3RyZWFtRmxhdm9yLkdaSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5jcmMgPSBuZXcgSW9uaWMuQ3JjLkNSQzMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBib29sIF93YW50Q29tcHJlc3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9jb21wcmVzc2lvbk1vZGUgPT0gQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgWmxpYkNvZGVjIHoKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF96ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sIHdhbnRSZmMxOTUwSGVhZGVyID0gKHRoaXMuX2ZsYXZvciA9PSBabGliU3RyZWFtRmxhdm9yLlpMSUIpOworICAgICAgICAgICAgICAgICAgICBfeiA9IG5ldyBabGliQ29kZWMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXByZXNzaW9uTW9kZSA9PSBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ouSW5pdGlhbGl6ZUluZmxhdGUod2FudFJmYzE5NTBIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3ouU3RyYXRlZ3kgPSBTdHJhdGVneTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF96LkluaXRpYWxpemVEZWZsYXRlKHRoaXMuX2xldmVsLCB3YW50UmZjMTk1MEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF96OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIHdvcmtpbmdCdWZmZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF93b3JraW5nQnVmZmVyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF93b3JraW5nQnVmZmVyID0gbmV3IGJ5dGVbX2J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIHJldHVybiBfd29ya2luZ0J1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShTeXN0ZW0uQnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA3MTU5CisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIENSQyBvbiB0aGUgdW5jY29tcHJlc3NlZCBkYXRhICAoYmVmb3JlIHdyaXRpbmcpCisgICAgICAgICAgICBpZiAoY3JjICE9IG51bGwpCisgICAgICAgICAgICAgICAgY3JjLlNsdXJwQmxvY2soYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKworICAgICAgICAgICAgaWYgKF9zdHJlYW1Nb2RlID09IFN0cmVhbU1vZGUuVW5kZWZpbmVkKQorICAgICAgICAgICAgICAgIF9zdHJlYW1Nb2RlID0gU3RyZWFtTW9kZS5Xcml0ZXI7CisgICAgICAgICAgICBlbHNlIGlmIChfc3RyZWFtTW9kZSAhPSBTdHJlYW1Nb2RlLldyaXRlcikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiQ2Fubm90IFdyaXRlIGFmdGVyIFJlYWRpbmcuIik7CisKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gZmlyc3QgcmVmZXJlbmNlIG9mIHogcHJvcGVydHkgd2lsbCBpbml0aWFsaXplIHRoZSBwcml2YXRlIHZhciBfegorICAgICAgICAgICAgei5JbnB1dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIF96Lk5leHRJbiA9IG9mZnNldDsKKyAgICAgICAgICAgIF96LkF2YWlsYWJsZUJ5dGVzSW4gPSBjb3VudDsKKyAgICAgICAgICAgIGJvb2wgZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfei5PdXRwdXRCdWZmZXIgPSB3b3JraW5nQnVmZmVyOworICAgICAgICAgICAgICAgIF96Lk5leHRPdXQgPSAwOworICAgICAgICAgICAgICAgIF96LkF2YWlsYWJsZUJ5dGVzT3V0ID0gX3dvcmtpbmdCdWZmZXIuTGVuZ3RoOworICAgICAgICAgICAgICAgIGludCByYyA9IChfd2FudENvbXByZXNzKQorICAgICAgICAgICAgICAgICAgICA/IF96LkRlZmxhdGUoX2ZsdXNoTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgOiBfei5JbmZsYXRlKF9mbHVzaE1vZGUpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBabGliQ29uc3RhbnRzLlpfT0sgJiYgcmMgIT0gWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKChfd2FudENvbXByZXNzID8gImRlIiA6ICJpbiIpICsgImZsYXRpbmc6ICIgKyBfei5NZXNzYWdlKTsKKworICAgICAgICAgICAgICAgIC8vaWYgKF93b3JraW5nQnVmZmVyLkxlbmd0aCAtIF96LkF2YWlsYWJsZUJ5dGVzT3V0ID4gMCkKKyAgICAgICAgICAgICAgICBfc3RyZWFtLldyaXRlKF93b3JraW5nQnVmZmVyLCAwLCBfd29ya2luZ0J1ZmZlci5MZW5ndGggLSBfei5BdmFpbGFibGVCeXRlc091dCk7CisKKyAgICAgICAgICAgICAgICBkb25lID0gX3ouQXZhaWxhYmxlQnl0ZXNJbiA9PSAwICYmIF96LkF2YWlsYWJsZUJ5dGVzT3V0ICE9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBHWklQIGFuZCBkZS1jb21wcmVzcywgd2UncmUgZG9uZSB3aGVuIDggYnl0ZXMgcmVtYWluLgorICAgICAgICAgICAgICAgIGlmIChfZmxhdm9yID09IFpsaWJTdHJlYW1GbGF2b3IuR1pJUCAmJiAhX3dhbnRDb21wcmVzcykKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IChfei5BdmFpbGFibGVCeXRlc0luID09IDggJiYgX3ouQXZhaWxhYmxlQnl0ZXNPdXQgIT0gMCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICghZG9uZSk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfeiA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChfc3RyZWFtTW9kZSA9PSBTdHJlYW1Nb2RlLldyaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3ouT3V0cHV0QnVmZmVyID0gd29ya2luZ0J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgX3ouTmV4dE91dCA9IDA7CisgICAgICAgICAgICAgICAgICAgIF96LkF2YWlsYWJsZUJ5dGVzT3V0ID0gX3dvcmtpbmdCdWZmZXIuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSAoX3dhbnRDb21wcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgID8gX3ouRGVmbGF0ZShGbHVzaFR5cGUuRmluaXNoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfei5JbmZsYXRlKEZsdXNoVHlwZS5GaW5pc2gpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORCAmJiByYyAhPSBabGliQ29uc3RhbnRzLlpfT0spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2ZXJiID0gKF93YW50Q29tcHJlc3MgPyAiZGUiIDogImluIikgKyAiZmxhdGluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3ouTWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoInswfTogKHJjID0gezF9KSIsIHZlcmIsIHJjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24odmVyYiArICI6ICIgKyBfei5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChfd29ya2luZ0J1ZmZlci5MZW5ndGggLSBfei5BdmFpbGFibGVCeXRlc091dCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0uV3JpdGUoX3dvcmtpbmdCdWZmZXIsIDAsIF93b3JraW5nQnVmZmVyLkxlbmd0aCAtIF96LkF2YWlsYWJsZUJ5dGVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBfei5BdmFpbGFibGVCeXRlc0luID09IDAgJiYgX3ouQXZhaWxhYmxlQnl0ZXNPdXQgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgR1pJUCBhbmQgZGUtY29tcHJlc3MsIHdlJ3JlIGRvbmUgd2hlbiA4IGJ5dGVzIHJlbWFpbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9mbGF2b3IgPT0gWmxpYlN0cmVhbUZsYXZvci5HWklQICYmICFfd2FudENvbXByZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IChfei5BdmFpbGFibGVCeXRlc0luID09IDggJiYgX3ouQXZhaWxhYmxlQnl0ZXNPdXQgIT0gMCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKCFkb25lKTsKKworICAgICAgICAgICAgICAgIEZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3MTU5CisgICAgICAgICAgICAgICAgaWYgKF9mbGF2b3IgPT0gWmxpYlN0cmVhbUZsYXZvci5HWklQKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF93YW50Q29tcHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIEdaSVAgdHJhaWxlcjogQ1JDMzIgYW5kICBzaXplIG1vZCAyXjMyCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYzEgPSBjcmMuQ3JjMzJSZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtLldyaXRlKEJpdENvbnZlcnRlci5HZXRCeXRlcyhjMSksIDAsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGMyID0gKEludDMyKShjcmMuVG90YWxCeXRlc1JlYWQgJiAweDAwMDAwMDAwRkZGRkZGRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5Xcml0ZShCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoYzIpLCAwLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJXcml0aW5nIHdpdGggZGVjb21wcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd29ya2l0ZW0gNzE1OQorICAgICAgICAgICAgZWxzZSBpZiAoX3N0cmVhbU1vZGUgPT0gU3RyZWFtTW9kZS5SZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9mbGF2b3IgPT0gWmxpYlN0cmVhbUZsYXZvci5HWklQKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfd2FudENvbXByZXNzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA4NTAxOiBoYW5kbGUgZWRnZSBjYXNlIChkZWNvbXByZXNzIGVtcHR5IHN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfei5Ub3RhbEJ5dGVzT3V0ID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBhbmQgcG90ZW50aWFsbHkgdmVyaWZ5IHRoZSBHWklQIHRyYWlsZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDUkMzMiBhbmQgc2l6ZSBtb2QgMl4zMgorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHRyYWlsZXIgPSBuZXcgYnl0ZVs4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2l0ZW1zIDg2NzkgJiAxMjU1NAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF96LkF2YWlsYWJsZUJ5dGVzSW4gPCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShfei5JbnB1dEJ1ZmZlciwgX3ouTmV4dEluLCB0cmFpbGVyLCAwLCBfei5BdmFpbGFibGVCeXRlc0luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNOZWVkZWQgPSA4IC0gX3ouQXZhaWxhYmxlQnl0ZXNJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gX3N0cmVhbS5SZWFkKHRyYWlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfei5BdmFpbGFibGVCeXRlc0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNOZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc05lZWRlZCAhPSBieXRlc1JlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbihTdHJpbmcuRm9ybWF0KCJNaXNzaW5nIG9yIGluY29tcGxldGUgR1pJUCB0cmFpbGVyLiBFeHBlY3RlZCA4IGJ5dGVzLCBnb3QgezB9LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ouQXZhaWxhYmxlQnl0ZXNJbiArIGJ5dGVzUmVhZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KF96LklucHV0QnVmZmVyLCBfei5OZXh0SW4sIHRyYWlsZXIsIDAsIHRyYWlsZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgY3JjMzJfZXhwZWN0ZWQgPSBCaXRDb252ZXJ0ZXIuVG9JbnQzMih0cmFpbGVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludDMyIGNyYzMyX2FjdHVhbCA9IGNyYy5DcmMzMlJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludDMyIGlzaXplX2V4cGVjdGVkID0gQml0Q29udmVydGVyLlRvSW50MzIodHJhaWxlciwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiBpc2l6ZV9hY3R1YWwgPSAoSW50MzIpKF96LlRvdGFsQnl0ZXNPdXQgJiAweDAwMDAwMDAwRkZGRkZGRkYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JjMzJfYWN0dWFsICE9IGNyYzMyX2V4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIkJhZCBDUkMzMiBpbiBHWklQIHRyYWlsZXIuIChhY3R1YWwoezA6WDh9KSE9ZXhwZWN0ZWQoezE6WDh9KSkiLCBjcmMzMl9hY3R1YWwsIGNyYzMyX2V4cGVjdGVkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc2l6ZV9hY3R1YWwgIT0gaXNpemVfZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiQmFkIHNpemUgaW4gR1pJUCB0cmFpbGVyLiAoYWN0dWFsKHswfSkhPWV4cGVjdGVkKHsxfSkpIiwgaXNpemVfYWN0dWFsLCBpc2l6ZV9leHBlY3RlZCkpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiUmVhZGluZyB3aXRoIGNvbXByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBlbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmIChfd2FudENvbXByZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF96LkVuZERlZmxhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfei5FbmRJbmZsYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfeiA9IG51bGw7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5kKCk7CisgICAgICAgICAgICAgICAgaWYgKCFfbGVhdmVPcGVuKSBfc3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdHJlYW0uRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTeXN0ZW0uSW50NjQgU2VlayhTeXN0ZW0uSW50NjQgb2Zmc2V0LCBTeXN0ZW0uSU8uU2Vla09yaWdpbiBvcmlnaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgLy9fb3V0U3RyZWFtLlNlZWsob2Zmc2V0LCBvcmlnaW4pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChTeXN0ZW0uSW50NjQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdHJlYW0uU2V0TGVuZ3RoKHZhbHVlKTsKKyAgICAgICAgfQorCisKKyNpZiBOT1QKKyAgICAgICAgcHVibGljIGludCBSZWFkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlYWQoX2J1ZjEsIDAsIDEpID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgQ1JDIGFmdGVyIHJlYWRpbmcKKyAgICAgICAgICAgIGlmIChjcmMhPW51bGwpCisgICAgICAgICAgICAgICAgY3JjLlNsdXJwQmxvY2soX2J1ZjEsMCwxKTsKKyAgICAgICAgICAgIHJldHVybiAoX2J1ZjFbMF0gJiAweEZGKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHJpdmF0ZSBib29sIG5vbW9yZWlucHV0ID0gZmFsc2U7CisKKworCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRaZXJvVGVybWluYXRlZFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8Ynl0ZT4oKTsKKyAgICAgICAgICAgIGJvb2wgZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3b3JraXRlbSA3NzQwCisgICAgICAgICAgICAgICAgaW50IG4gPSBfc3RyZWFtLlJlYWQoX2J1ZjEsIDAsIDEpOworICAgICAgICAgICAgICAgIGlmIChuICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJVbmV4cGVjdGVkIEVPRiByZWFkaW5nIEdaSVAgaGVhZGVyLiIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfYnVmMVswXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKF9idWYxWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICghZG9uZSk7CisgICAgICAgICAgICBieXRlW10gYSA9IGxpc3QuVG9BcnJheSgpOworICAgICAgICAgICAgcmV0dXJuIEdaaXBTdHJlYW0uaXNvODg1OWRhc2gxLkdldFN0cmluZyhhLCAwLCBhLkxlbmd0aCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgaW50IF9SZWFkQW5kVmFsaWRhdGVHemlwSGVhZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIGhlYWRlciBvbiB0aGUgZmlyc3QgcmVhZAorICAgICAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgICAgIGludCBuID0gX3N0cmVhbS5SZWFkKGhlYWRlciwgMCwgaGVhZGVyLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDg1MDE6IGhhbmRsZSBlZGdlIGNhc2UgKGRlY29tcHJlc3MgZW1wdHkgc3RyZWFtKQorICAgICAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaWYgKG4gIT0gMTApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIk5vdCBhIHZhbGlkIEdaSVAgc3RyZWFtLiIpOworCisgICAgICAgICAgICBpZiAoaGVhZGVyWzBdICE9IDB4MUYgfHwgaGVhZGVyWzFdICE9IDB4OEIgfHwgaGVhZGVyWzJdICE9IDgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIkJhZCBHWklQIGhlYWRlci4iKTsKKworICAgICAgICAgICAgSW50MzIgdGltZXQgPSBCaXRDb252ZXJ0ZXIuVG9JbnQzMihoZWFkZXIsIDQpOworICAgICAgICAgICAgX0d6aXBNdGltZSA9IEdaaXBTdHJlYW0uX3VuaXhFcG9jaC5BZGRTZWNvbmRzKHRpbWV0KTsKKyAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IG47CisgICAgICAgICAgICBpZiAoKGhlYWRlclszXSAmIDB4MDQpID09IDB4MDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVhZCBhbmQgZGlzY2FyZCBleHRyYSBmaWVsZAorICAgICAgICAgICAgICAgIG4gPSBfc3RyZWFtLlJlYWQoaGVhZGVyLCAwLCAyKTsgLy8gMi1ieXRlIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IG47CisKKyAgICAgICAgICAgICAgICBJbnQxNiBleHRyYUxlbmd0aCA9IChJbnQxNikoaGVhZGVyWzBdICsgaGVhZGVyWzFdICogMjU2KTsKKyAgICAgICAgICAgICAgICBieXRlW10gZXh0cmEgPSBuZXcgYnl0ZVtleHRyYUxlbmd0aF07CisgICAgICAgICAgICAgICAgbiA9IF9zdHJlYW0uUmVhZChleHRyYSwgMCwgZXh0cmEuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAobiAhPSBleHRyYUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kLW9mLWZpbGUgcmVhZGluZyBHWklQIGhlYWRlci4iKTsKKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSBuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChoZWFkZXJbM10gJiAweDA4KSA9PSAweDA4KQorICAgICAgICAgICAgICAgIF9HemlwRmlsZU5hbWUgPSBSZWFkWmVyb1Rlcm1pbmF0ZWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICgoaGVhZGVyWzNdICYgMHgxMCkgPT0gMHgwMTApCisgICAgICAgICAgICAgICAgX0d6aXBDb21tZW50ID0gUmVhZFplcm9UZXJtaW5hdGVkU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoKGhlYWRlclszXSAmIDB4MDIpID09IDB4MDIpCisgICAgICAgICAgICAgICAgUmVhZChfYnVmMSwgMCwgMSk7IC8vIENSQzE2LCBpZ25vcmUKKworICAgICAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXNSZWFkOworICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTeXN0ZW0uSW50MzIgUmVhZChTeXN0ZW0uQnl0ZVtdIGJ1ZmZlciwgU3lzdGVtLkludDMyIG9mZnNldCwgU3lzdGVtLkludDMyIGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gTVMgZG9jdW1lbnRhdGlvbiwgYW55IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJTy5TdHJlYW0uUmVhZCBmdW5jdGlvbiBtdXN0OgorICAgICAgICAgICAgLy8gKGEpIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBvZmZzZXQgJiBjb3VudCByZWZlcmVuY2UgYW4gaW52YWxpZCBwYXJ0IG9mIHRoZSBidWZmZXIsCisgICAgICAgICAgICAvLyAgICAgb3IgaWYgY291bnQgPCAwLCBvciBpZiBidWZmZXIgaXMgbnVsbAorICAgICAgICAgICAgLy8gKGIpIHJldHVybiAwIG9ubHkgdXBvbiBFT0YsIG9yIGlmIGNvdW50ID0gMAorICAgICAgICAgICAgLy8gKGMpIGlmIG5vdCBFT0YsIHRoZW4gcmV0dXJuIGF0IGxlYXN0IDEgYnl0ZSwgdXAgdG8gPGNvdW50PiBieXRlcworCisgICAgICAgICAgICBpZiAoX3N0cmVhbU1vZGUgPT0gU3RyZWFtTW9kZS5VbmRlZmluZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdHJlYW0uQ2FuUmVhZCkgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIlRoZSBzdHJlYW0gaXMgbm90IHJlYWRhYmxlLiIpOworICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZmlyc3QgcmVhZCwgc2V0IHVwIHNvbWUgY29udHJvbHMuCisgICAgICAgICAgICAgICAgX3N0cmVhbU1vZGUgPSBTdHJlYW1Nb2RlLlJlYWRlcjsKKyAgICAgICAgICAgICAgICAvLyAoVGhlIGZpcnN0IHJlZmVyZW5jZSB0byBfeiBnb2VzIHRocm91Z2ggdGhlIHByaXZhdGUgYWNjZXNzb3Igd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBtYXkgaW5pdGlhbGl6ZSBpdC4pCisgICAgICAgICAgICAgICAgei5BdmFpbGFibGVCeXRlc0luID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoX2ZsYXZvciA9PSBabGliU3RyZWFtRmxhdm9yLkdaSVApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZ3ppcEhlYWRlckJ5dGVDb3VudCA9IF9SZWFkQW5kVmFsaWRhdGVHemlwSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpdGVtIDg1MDE6IGhhbmRsZSBlZGdlIGNhc2UgKGRlY29tcHJlc3MgZW1wdHkgc3RyZWFtKQorICAgICAgICAgICAgICAgICAgICBpZiAoX2d6aXBIZWFkZXJCeXRlQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zdHJlYW1Nb2RlICE9IFN0cmVhbU1vZGUuUmVhZGVyKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJDYW5ub3QgUmVhZCBhZnRlciBXcml0aW5nLiIpOworCisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAobm9tb3JlaW5wdXQgJiYgX3dhbnRDb21wcmVzcykgcmV0dXJuIDA7ICAvLyB3b3JraXRlbSA4NTU3CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImJ1ZmZlciIpOworICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiY291bnQiKTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBidWZmZXIuR2V0TG93ZXJCb3VuZCgwKSkgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigib2Zmc2V0Iik7CisgICAgICAgICAgICBpZiAoKG9mZnNldCArIGNvdW50KSA+IGJ1ZmZlci5HZXRMZW5ndGgoMCkpIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvdW50Iik7CisKKyAgICAgICAgICAgIGludCByYyA9IDA7CisKKyAgICAgICAgICAgIC8vIHNldCB1cCB0aGUgb3V0cHV0IG9mIHRoZSBkZWZsYXRlL2luZmxhdGUgY29kZWM6CisgICAgICAgICAgICBfei5PdXRwdXRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBfei5OZXh0T3V0ID0gb2Zmc2V0OworICAgICAgICAgICAgX3ouQXZhaWxhYmxlQnl0ZXNPdXQgPSBjb3VudDsKKworICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSBfd29ya2luZ0J1ZmZlciBoYXMgYmVlbiByZXNpemVkLiAobmV3IGJ5dGVbXSkKKyAgICAgICAgICAgIC8vIChUaGUgZmlyc3QgcmVmZXJlbmNlIHRvIF93b3JraW5nQnVmZmVyIGdvZXMgdGhyb3VnaCB0aGUgcHJpdmF0ZSBhY2Nlc3NvciB3aGljaAorICAgICAgICAgICAgLy8gbWF5IGluaXRpYWxpemUgaXQuKQorICAgICAgICAgICAgX3ouSW5wdXRCdWZmZXIgPSB3b3JraW5nQnVmZmVyOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5lZWQgZGF0YSBpbiBfd29ya2luZ0J1ZmZlciBpbiBvcmRlciB0byBkZWZsYXRlL2luZmxhdGUuICBIZXJlLCB3ZSBjaGVjayBpZiB3ZSBoYXZlIGFueS4KKyAgICAgICAgICAgICAgICBpZiAoKF96LkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkgJiYgKCFub21vcmVpbnB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBkYXRhIGF2YWlsYWJsZSwgc28gdHJ5IHRvIFJlYWQgZGF0YSBmcm9tIHRoZSBjYXB0aXZlIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgX3ouTmV4dEluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgX3ouQXZhaWxhYmxlQnl0ZXNJbiA9IF9zdHJlYW0uUmVhZChfd29ya2luZ0J1ZmZlciwgMCwgX3dvcmtpbmdCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF96LkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbW9yZWlucHV0ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGRhdGEgaW4gSW5wdXRCdWZmZXI7IG5vdyBjb21wcmVzcyBvciBkZWNvbXByZXNzIGFzIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgcmMgPSAoX3dhbnRDb21wcmVzcykKKyAgICAgICAgICAgICAgICAgICAgPyBfei5EZWZsYXRlKF9mbHVzaE1vZGUpCisgICAgICAgICAgICAgICAgICAgIDogX3ouSW5mbGF0ZShfZmx1c2hNb2RlKTsKKworICAgICAgICAgICAgICAgIGlmIChub21vcmVpbnB1dCAmJiAocmMgPT0gWmxpYkNvbnN0YW50cy5aX0JVRl9FUlJPUikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgaWYgKHJjICE9IFpsaWJDb25zdGFudHMuWl9PSyAmJiByYyAhPSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiezB9ZmxhdGluZzogIHJjPXsxfSAgbXNnPXsyfSIsIChfd2FudENvbXByZXNzID8gImRlIiA6ICJpbiIpLCByYywgX3ouTWVzc2FnZSkpOworCisgICAgICAgICAgICAgICAgaWYgKChub21vcmVpbnB1dCB8fCByYyA9PSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORCkgJiYgKF96LkF2YWlsYWJsZUJ5dGVzT3V0ID09IGNvdW50KSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG5vdGhpbmcgbW9yZSB0byByZWFkCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3doaWxlIChfei5BdmFpbGFibGVCeXRlc091dCA9PSBjb3VudCAmJiByYyA9PSBabGliQ29uc3RhbnRzLlpfT0spOworICAgICAgICAgICAgd2hpbGUgKF96LkF2YWlsYWJsZUJ5dGVzT3V0ID4gMCAmJiAhbm9tb3JlaW5wdXQgJiYgcmMgPT0gWmxpYkNvbnN0YW50cy5aX09LKTsKKworCisgICAgICAgICAgICAvLyB3b3JraXRlbSA4NTU3CisgICAgICAgICAgICAvLyBpcyB0aGVyZSBtb3JlIHJvb20gaW4gb3V0cHV0PworICAgICAgICAgICAgaWYgKF96LkF2YWlsYWJsZUJ5dGVzT3V0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gWmxpYkNvbnN0YW50cy5aX09LICYmIF96LkF2YWlsYWJsZUJ5dGVzSW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gYXJlIHdlIGNvbXBsZXRlbHkgZG9uZSByZWFkaW5nPworICAgICAgICAgICAgICAgIGlmIChub21vcmVpbnB1dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbiBjb21wcmVzc2lvbj8KKyAgICAgICAgICAgICAgICAgICAgaWYgKF93YW50Q29tcHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgaW5wdXQgZGF0YSBhdmFpbGFibGU7IHRoZXJlZm9yZSB3ZSBmbHVzaCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNvbXBsZXRlIHRoZSByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IF96LkRlZmxhdGUoRmx1c2hUeXBlLkZpbmlzaCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBabGliQ29uc3RhbnRzLlpfT0sgJiYgcmMgIT0gWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiRGVmbGF0aW5nOiAgcmM9ezB9ICBtc2c9ezF9IiwgcmMsIF96Lk1lc3NhZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICByYyA9IChjb3VudCAtIF96LkF2YWlsYWJsZUJ5dGVzT3V0KTsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIENSQyBhZnRlciByZWFkaW5nCisgICAgICAgICAgICBpZiAoY3JjICE9IG51bGwpCisgICAgICAgICAgICAgICAgY3JjLlNsdXJwQmxvY2soYnVmZmVyLCBvZmZzZXQsIHJjKTsKKworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBTeXN0ZW0uQm9vbGVhbiBDYW5SZWFkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzLl9zdHJlYW0uQ2FuUmVhZDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN5c3RlbS5Cb29sZWFuIENhblNlZWsKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXMuX3N0cmVhbS5DYW5TZWVrOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3lzdGVtLkJvb2xlYW4gQ2FuV3JpdGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXMuX3N0cmVhbS5DYW5Xcml0ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFN5c3RlbS5JbnQ2NCBMZW5ndGgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zdHJlYW0uTGVuZ3RoOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICAgICAgc2V0IHsgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGVudW0gU3RyZWFtTW9kZQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZXIsCisgICAgICAgICAgICBSZWFkZXIsCisgICAgICAgICAgICBVbmRlZmluZWQsCisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBDb21wcmVzc1N0cmluZyhTdHJpbmcgcywgU3RyZWFtIGNvbXByZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSB1bmNvbXByZXNzZWQgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpOworICAgICAgICAgICAgdXNpbmcgKGNvbXByZXNzb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZSh1bmNvbXByZXNzZWQsIDAsIHVuY29tcHJlc3NlZC5MZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENvbXByZXNzQnVmZmVyKGJ5dGVbXSBiLCBTdHJlYW0gY29tcHJlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd29ya2l0ZW0gODQ2MAorICAgICAgICAgICAgdXNpbmcgKGNvbXByZXNzb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShiLCAwLCBiLkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVbmNvbXByZXNzU3RyaW5nKGJ5dGVbXSBjb21wcmVzc2VkLCBTdHJlYW0gZGVjb21wcmVzc29yKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3b3JraXRlbSA4NDYwCisgICAgICAgICAgICBieXRlW10gd29ya2luZyA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgdmFyIGVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2RpbmcuVVRGODsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgb3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nIChkZWNvbXByZXNzb3IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChuID0gZGVjb21wcmVzc29yLlJlYWQod29ya2luZywgMCwgd29ya2luZy5MZW5ndGgpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGUod29ya2luZywgMCwgbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0byBhbGxvdyByZWFkIGZyb20gc3RhcnQKKyAgICAgICAgICAgICAgICBvdXRwdXQuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICB2YXIgc3IgPSBuZXcgU3RyZWFtUmVhZGVyKG91dHB1dCwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBzci5SZWFkVG9FbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdIGNvbXByZXNzZWQsIFN0cmVhbSBkZWNvbXByZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdvcmtpdGVtIDg0NjAKKyAgICAgICAgICAgIGJ5dGVbXSB3b3JraW5nID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICB1c2luZyAodmFyIG91dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2luZyAoZGVjb21wcmVzc29yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IGRlY29tcHJlc3Nvci5SZWFkKHdvcmtpbmcsIDAsIHdvcmtpbmcuTGVuZ3RoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKHdvcmtpbmcsIDAsIG4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9abGliQ29kZWMuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1psaWJDb2RlYy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2Q2Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9abGliQ29kZWMuY3MKQEAgLTAsMCArMSw3MTcgQEAKKy8vIFpsaWJDb2RlYy5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5IERpbm8gQ2hpZXNhIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICAKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuIAorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKTogCisvLyBUaW1lLXN0YW1wOiA8MjAwOS1Ob3ZlbWJlci0wMyAxNTo0MDo1MT4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgQ29kZWMgZm9yIFpMSUIgY29tcHJlc3Npb24gYW5kCisvLyBkZWNvbXByZXNzaW9uLiBUaGlzIGNvZGUgZXh0ZW5kcyBjb2RlIHRoYXQgd2FzIGJhc2VkIHRoZSBqemxpYgorLy8gaW1wbGVtZW50YXRpb24gb2YgemxpYiwgYnV0IHRoaXMgY29kZSBpcyBjb21wbGV0ZWx5IG5vdmVsLiAgVGhlIGNvZGVjCisvLyBjbGFzcyBpcyBuZXcsIGFuZCBlbmNhcHN1bGF0ZXMgc29tZSBiZWhhdmlvcnMgdGhhdCBhcmUgbmV3LCBhbmQgc29tZQorLy8gdGhhdCB3ZXJlIHByZXNlbnQgaW4gb3RoZXIgY2xhc3NlcyBpbiB0aGUganpsaWIgY29kZSBiYXNlLiAgSW4KKy8vIGtlZXBpbmcgd2l0aCB0aGUgbGljZW5zZSBmb3IganpsaWIsIHRoZSBjb3B5cmlnaHQgdG8gdGhlIGp6bGliIGNvZGUKKy8vIGlzIGluY2x1ZGVkIGJlbG93LgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gCisvLyBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSwyMDAyLDIwMDMgeW1uaywgSkNyYWZ0LEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vIAorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIAorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisvLyB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8gCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisvLyBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisvLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgSkNSQUZULAorLy8gSU5DLiBPUiBBTlkgQ09OVFJJQlVUT1JTIFRPIFRISVMgU09GVFdBUkUgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLAorLy8gT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKy8vIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKy8vIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIHpsaWItMS4xLjM7IGNyZWRpdCB0byBhdXRob3JzCisvLyBKZWFuLWxvdXAgR2FpbGx5KGpsb3VwQGd6aXAub3JnKSBhbmQgTWFyayBBZGxlcihtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1KQorLy8gYW5kIGNvbnRyaWJ1dG9ycyBvZiB6bGliLgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwordXNpbmcgU3lzdGVtOwordXNpbmcgSW50ZXJvcD1TeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFbmNvZGVyIGFuZCBEZWNvZGVyIGZvciBaTElCIGFuZCBERUZMQVRFIChJRVRGIFJGQzE5NTAgYW5kIFJGQzE5NTEpLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vCisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGlzIGNsYXNzIGNvbXByZXNzZXMgYW5kIGRlY29tcHJlc3NlcyBkYXRhIGFjY29yZGluZyB0byB0aGUgRGVmbGF0ZSBhbGdvcml0aG0KKyAgICAvLy8gYW5kIG9wdGlvbmFsbHksIHRoZSBaTElCIGZvcm1hdCwgYXMgZG9jdW1lbnRlZCBpbiA8c2VlCisgICAgLy8vIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0Ij5SRkMgMTk1MCAtIFpMSUI8L3NlZT4gYW5kIDxzZWUKKyAgICAvLy8gaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MS50eHQiPlJGQyAxOTUxIC0gREVGTEFURTwvc2VlPi4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIFtJbnRlcm9wLkd1aWRBdHRyaWJ1dGUoImViYzI1Y2Y2LTkxMjAtNDI4My1iOTcyLTBlNTUyMGQwMDAwRCIpXQorICAgIFtJbnRlcm9wLkNvbVZpc2libGUodHJ1ZSldCisjaWYgIU5FVENGICAgIAorICAgIFtJbnRlcm9wLkNsYXNzSW50ZXJmYWNlKEludGVyb3AuQ2xhc3NJbnRlcmZhY2VUeXBlLkF1dG9EaXNwYXRjaCldCisjZW5kaWYKKyAgICBzZWFsZWQgcHVibGljIGNsYXNzIFpsaWJDb2RlYworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGJ1ZmZlciBmcm9tIHdoaWNoIGRhdGEgaXMgdGFrZW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBieXRlW10gSW5wdXRCdWZmZXI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQW4gaW5kZXggaW50byB0aGUgSW5wdXRCdWZmZXIgYXJyYXksIGluZGljYXRpbmcgd2hlcmUgdG8gc3RhcnQgcmVhZGluZy4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgTmV4dEluOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBJbnB1dEJ1ZmZlciwgc3RhcnRpbmcgYXQgTmV4dEluLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gR2VuZXJhbGx5IHlvdSBzaG91bGQgc2V0IHRoaXMgdG8gSW5wdXRCdWZmZXIuTGVuZ3RoIGJlZm9yZSB0aGUgZmlyc3QgSW5mbGF0ZSgpIG9yIERlZmxhdGUoKSBjYWxsLiAKKyAgICAgICAgLy8vIFRoZSBjbGFzcyB3aWxsIHVwZGF0ZSB0aGlzIG51bWJlciBhcyBjYWxscyB0byBJbmZsYXRlL0RlZmxhdGUgYXJlIG1hZGUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBpbnQgQXZhaWxhYmxlQnl0ZXNJbjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBzbyBmYXIsIHRocm91Z2ggYWxsIGNhbGxzIHRvIEluZmxhdGUoKS9EZWZsYXRlKCkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBsb25nIFRvdGFsQnl0ZXNJbjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCdWZmZXIgdG8gc3RvcmUgb3V0cHV0IGRhdGEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBieXRlW10gT3V0cHV0QnVmZmVyOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuIGluZGV4IGludG8gdGhlIE91dHB1dEJ1ZmZlciBhcnJheSwgaW5kaWNhdGluZyB3aGVyZSB0byBzdGFydCB3cml0aW5nLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBOZXh0T3V0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBPdXRwdXRCdWZmZXIsIHN0YXJ0aW5nIGF0IE5leHRPdXQuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBHZW5lcmFsbHkgeW91IHNob3VsZCBzZXQgdGhpcyB0byBPdXRwdXRCdWZmZXIuTGVuZ3RoIGJlZm9yZSB0aGUgZmlyc3QgSW5mbGF0ZSgpIG9yIERlZmxhdGUoKSBjYWxsLiAKKyAgICAgICAgLy8vIFRoZSBjbGFzcyB3aWxsIHVwZGF0ZSB0aGlzIG51bWJlciBhcyBjYWxscyB0byBJbmZsYXRlL0RlZmxhdGUgYXJlIG1hZGUuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBpbnQgQXZhaWxhYmxlQnl0ZXNPdXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzbyBmYXIsIHRocm91Z2ggYWxsIGNhbGxzIHRvIEluZmxhdGUoKS9EZWZsYXRlKCkuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBsb25nIFRvdGFsQnl0ZXNPdXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gdXNlZCBmb3IgZGlhZ25vc3RpY3MsIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmchCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBTeXN0ZW0uU3RyaW5nIE1lc3NhZ2U7CisKKyAgICAgICAgaW50ZXJuYWwgRGVmbGF0ZU1hbmFnZXIgZHN0YXRlOworICAgICAgICBpbnRlcm5hbCBJbmZsYXRlTWFuYWdlciBpc3RhdGU7CisKKyAgICAgICAgaW50ZXJuYWwgdWludCBfQWRsZXIzMjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlIGluIHRoaXMgY29kZWMuICBVc2VmdWwgb25seSBpbiBjb21wcmVzc2lvbiBtb2RlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25MZXZlbCBDb21wcmVzc0xldmVsID0gQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBudW1iZXIgb2YgV2luZG93IEJpdHMgdG8gdXNlLiAgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRoaXMgZ2F1Z2VzIHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIHdpbmRvdywgYW5kIGhlbmNlIHRoZSAKKyAgICAgICAgLy8vIGNvbXByZXNzaW9uIGVmZmVjdGl2ZW5lc3MgYXMgd2VsbCBhcyBtZW1vcnkgY29uc3VtcHRpb24uIEl0J3MgYmVzdCB0byBqdXN0IGxlYXZlIHRoaXMgCisgICAgICAgIC8vLyBzZXR0aW5nIGFsb25lIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgaXQgaXMuICBUaGUgbWF4aW11bSB2YWx1ZSBpcyAxNSBiaXRzLCB3aGljaCBpbXBsaWVzCisgICAgICAgIC8vLyBhIDMyayB3aW5kb3cuICAKKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIGludCBXaW5kb3dCaXRzID0gWmxpYkNvbnN0YW50cy5XaW5kb3dCaXRzRGVmYXVsdDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29tcHJlc3Npb24gc3RyYXRlZ3kgdG8gdXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGlzIGlzIG9ubHkgZWZmZWN0aXZlIGluIGNvbXByZXNzaW9uLiAgVGhlIHRoZW9yeSBvZmZlcmVkIGJ5IFpMSUIgaXMgdGhhdCBkaWZmZXJlbnQKKyAgICAgICAgLy8vIHN0cmF0ZWdpZXMgY291bGQgcG90ZW50aWFsbHkgcHJvZHVjZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBjb21wcmVzc2lvbiBiZWhhdmlvcgorICAgICAgICAvLy8gZm9yIGRpZmZlcmVudCBkYXRhIHNldHMuICBVbmZvcnR1bmF0ZWx5IEkgZG9uJ3QgaGF2ZSBhbnkgZ29vZCByZWNvbW1lbmRhdGlvbnMgZm9yIGhvdworICAgICAgICAvLy8gdG8gc2V0IGl0IGRpZmZlcmVudGx5LiAgV2hlbiBJIHRlc3RlZCBjaGFuZ2luZyB0aGUgc3RyYXRlZ3kgSSBnb3QgbWluaW1hbGx5IGRpZmZlcmVudAorICAgICAgICAvLy8gY29tcHJlc3Npb24gcGVyZm9ybWFuY2UuIEl0J3MgYmVzdCB0byBsZWF2ZSB0aGlzIHByb3BlcnR5IGFsb25lIGlmIHlvdSBkb24ndCBoYXZlIGEKKyAgICAgICAgLy8vIGdvb2QgZmVlbCBmb3IgaXQuICBPciwgeW91IG1heSB3YW50IHRvIHByb2R1Y2UgYSB0ZXN0IGhhcm5lc3MgdGhhdCBydW5zIHRocm91Z2ggdGhlCisgICAgICAgIC8vLyBkaWZmZXJlbnQgc3RyYXRlZ3kgb3B0aW9ucyBhbmQgZXZhbHVhdGVzIHRoZW0gb24gZGlmZmVyZW50IGZpbGUgdHlwZXMuIElmIHlvdSBkbyB0aGF0LAorICAgICAgICAvLy8gbGV0IG1lIGtub3cgeW91ciByZXN1bHRzLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25TdHJhdGVneSBTdHJhdGVneSA9IENvbXByZXNzaW9uU3RyYXRlZ3kuRGVmYXVsdDsKKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBBZGxlcjMyIGNoZWNrc3VtIG9uIHRoZSBkYXRhIHRyYW5zZmVycmVkIHRocm91Z2ggdGhlIGNvZGVjIHNvIGZhci4gWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbG9vayBhdCB0aGlzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IEFkbGVyMzIgeyBnZXQgeyByZXR1cm4gKGludClfQWRsZXIzMjsgfSB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYSBabGliQ29kZWMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIElmIHlvdSB1c2UgdGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCB5b3Ugd2lsbCBsYXRlciBoYXZlIHRvIGV4cGxpY2l0bHkgY2FsbCAKKyAgICAgICAgLy8vIEluaXRpYWxpemVJbmZsYXRlKCkgb3IgSW5pdGlhbGl6ZURlZmxhdGUoKSBiZWZvcmUgdXNpbmcgdGhlIFpsaWJDb2RlYyB0byBjb21wcmVzcyAKKyAgICAgICAgLy8vIG9yIGRlY29tcHJlc3MuIAorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgWmxpYkNvZGVjKCkgeyB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgWmxpYkNvZGVjIHRoYXQgZWl0aGVyIGNvbXByZXNzZXMgb3IgZGVjb21wcmVzc2VzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1vZGUiPgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvZGVjIHNob3VsZCBjb21wcmVzcyAoZGVmbGF0ZSkgb3IgZGVjb21wcmVzcyAoaW5mbGF0ZSkuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgWmxpYkNvZGVjKENvbXByZXNzaW9uTW9kZSBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kZSA9PSBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJjID0gSW5pdGlhbGl6ZURlZmxhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gWmxpYkNvbnN0YW50cy5aX09LKSB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiQ2Fubm90IGluaXRpYWxpemUgZm9yIGRlZmxhdGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09IENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByYyA9IEluaXRpYWxpemVJbmZsYXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IFpsaWJDb25zdGFudHMuWl9PSykgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIkNhbm5vdCBpbml0aWFsaXplIGZvciBpbmZsYXRlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiSW52YWxpZCBabGliU3RyZWFtRmxhdm9yLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgaW5mbGF0aW9uIHN0YXRlLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgYmVmb3JlIHVzaW5nIHRoZSBabGliQ29kZWMgdG8gaW5mbGF0ZSBkYXRhOyAKKyAgICAgICAgLy8vIEl0IGlzIGltcGxpY2l0bHkgY2FsbGVkIHdoZW4geW91IGNhbGwgdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBldmVyeXRoaW5nIGdvZXMgd2VsbC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgSW5pdGlhbGl6ZUluZmxhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5pdGlhbGl6ZUluZmxhdGUodGhpcy5XaW5kb3dCaXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemUgdGhlIGluZmxhdGlvbiBzdGF0ZSB3aXRoIGFuIGV4cGxpY2l0IGZsYWcgdG8KKyAgICAgICAgLy8vIGdvdmVybiB0aGUgaGFuZGxpbmcgb2YgUkZDMTk1MCBoZWFkZXIgYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBCeSBkZWZhdWx0LCB0aGUgWkxJQiBoZWFkZXIgZGVmaW5lZCBpbiA8c2VlCisgICAgICAgIC8vLyBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCI+UkZDIDE5NTA8L3NlZT4gaXMgZXhwZWN0ZWQuICBJZgorICAgICAgICAvLy8geW91IHdhbnQgdG8gcmVhZCBhIHpsaWIgc3RyZWFtIHlvdSBzaG91bGQgc3BlY2lmeSB0cnVlIGZvcgorICAgICAgICAvLy8gZXhwZWN0UmZjMTk1MEhlYWRlci4gIElmIHlvdSBoYXZlIGEgZGVmbGF0ZSBzdHJlYW0sIHlvdSB3aWxsIHdhbnQgdG8gc3BlY2lmeQorICAgICAgICAvLy8gZmFsc2UuIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGludm9rZSB0aGlzIGluaXRpYWxpemVyIGV4cGxpY2l0bHkgaWYgeW91CisgICAgICAgIC8vLyB3YW50IHRvIHNwZWNpZnkgZmFsc2UuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4cGVjdFJmYzE5NTBIZWFkZXIiPndoZXRoZXIgdG8gZXhwZWN0IGFuIFJGQzE5NTAgaGVhZGVyIGJ5dGUKKyAgICAgICAgLy8vIHBhaXIgd2hlbiByZWFkaW5nIHRoZSBzdHJlYW0gb2YgZGF0YSB0byBiZSBpbmZsYXRlZC48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlpfT0sgaWYgZXZlcnl0aGluZyBnb2VzIHdlbGwuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IEluaXRpYWxpemVJbmZsYXRlKGJvb2wgZXhwZWN0UmZjMTk1MEhlYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEluaXRpYWxpemVJbmZsYXRlKHRoaXMuV2luZG93Qml0cywgZXhwZWN0UmZjMTk1MEhlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplIHRoZSBabGliQ29kZWMgZm9yIGluZmxhdGlvbiwgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3aW5kb3cgYml0cy4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id2luZG93Qml0cyI+VGhlIG51bWJlciBvZiB3aW5kb3cgYml0cyB0byB1c2UuIElmIHlvdSBuZWVkIHRvIGFzayB3aGF0IHRoYXQgaXMsIAorICAgICAgICAvLy8gdGhlbiB5b3Ugc2hvdWxkbid0IGJlIGNhbGxpbmcgdGhpcyBpbml0aWFsaXplci48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBhbGwgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBJbml0aWFsaXplSW5mbGF0ZShpbnQgd2luZG93Qml0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5XaW5kb3dCaXRzID0gd2luZG93Qml0czsgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBJbml0aWFsaXplSW5mbGF0ZSh3aW5kb3dCaXRzLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemUgdGhlIGluZmxhdGlvbiBzdGF0ZSB3aXRoIGFuIGV4cGxpY2l0IGZsYWcgdG8gZ292ZXJuIHRoZSBoYW5kbGluZyBvZgorICAgICAgICAvLy8gUkZDMTk1MCBoZWFkZXIgYnl0ZXMuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gSWYgeW91IHdhbnQgdG8gcmVhZCBhIHpsaWIgc3RyZWFtIHlvdSBzaG91bGQgc3BlY2lmeSB0cnVlIGZvcgorICAgICAgICAvLy8gZXhwZWN0UmZjMTk1MEhlYWRlci4gSW4gdGhpcyBjYXNlLCB0aGUgbGlicmFyeSB3aWxsIGV4cGVjdCB0byBmaW5kIGEgWkxJQgorICAgICAgICAvLy8gaGVhZGVyLCBhcyBkZWZpbmVkIGluIDxzZWUgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQiPlJGQworICAgICAgICAvLy8gMTk1MDwvc2VlPiwgaW4gdGhlIGNvbXByZXNzZWQgc3RyZWFtLiAgSWYgeW91IHdpbGwgYmUgcmVhZGluZyBhIERFRkxBVEUgb3IKKyAgICAgICAgLy8vIEdaSVAgc3RyZWFtLCB3aGljaCBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBoZWFkZXIsIHlvdSB3aWxsIHdhbnQgdG8gc3BlY2lmeQorICAgICAgICAvLy8gZmFsc2UuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4cGVjdFJmYzE5NTBIZWFkZXIiPndoZXRoZXIgdG8gZXhwZWN0IGFuIFJGQzE5NTAgaGVhZGVyIGJ5dGUgcGFpciB3aGVuIHJlYWRpbmcgCisgICAgICAgIC8vLyB0aGUgc3RyZWFtIG9mIGRhdGEgdG8gYmUgaW5mbGF0ZWQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3aW5kb3dCaXRzIj5UaGUgbnVtYmVyIG9mIHdpbmRvdyBiaXRzIHRvIHVzZS4gSWYgeW91IG5lZWQgdG8gYXNrIHdoYXQgdGhhdCBpcywgCisgICAgICAgIC8vLyB0aGVuIHlvdSBzaG91bGRuJ3QgYmUgY2FsbGluZyB0aGlzIGluaXRpYWxpemVyLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5aX09LIGlmIGV2ZXJ5dGhpbmcgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBJbml0aWFsaXplSW5mbGF0ZShpbnQgd2luZG93Qml0cywgYm9vbCBleHBlY3RSZmMxOTUwSGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLldpbmRvd0JpdHMgPSB3aW5kb3dCaXRzOworICAgICAgICAgICAgaWYgKGRzdGF0ZSAhPSBudWxsKSB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiWW91IG1heSBub3QgY2FsbCBJbml0aWFsaXplSW5mbGF0ZSgpIGFmdGVyIGNhbGxpbmcgSW5pdGlhbGl6ZURlZmxhdGUoKS4iKTsKKyAgICAgICAgICAgIGlzdGF0ZSA9IG5ldyBJbmZsYXRlTWFuYWdlcihleHBlY3RSZmMxOTUwSGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBpc3RhdGUuSW5pdGlhbGl6ZSh0aGlzLCB3aW5kb3dCaXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZmxhdGUgdGhlIGRhdGEgaW4gdGhlIElucHV0QnVmZmVyLCBwbGFjaW5nIHRoZSByZXN1bHQgaW4gdGhlIE91dHB1dEJ1ZmZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gWW91IG11c3QgaGF2ZSBzZXQgSW5wdXRCdWZmZXIgYW5kIE91dHB1dEJ1ZmZlciwgTmV4dEluIGFuZCBOZXh0T3V0LCBhbmQgQXZhaWxhYmxlQnl0ZXNJbiBhbmQgCisgICAgICAgIC8vLyBBdmFpbGFibGVCeXRlc091dCAgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIDxjb2RlPgorICAgICAgICAvLy8gcHJpdmF0ZSB2b2lkIEluZmxhdGVCdWZmZXIoKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGludCBidWZmZXJTaXplID0gMTAyNDsKKyAgICAgICAgLy8vICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisgICAgICAgIC8vLyAgICAgWmxpYkNvZGVjIGRlY29tcHJlc3NvciA9IG5ldyBabGliQ29kZWMoKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIENvbnNvbGUuV3JpdGVMaW5lKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIC8vLyAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNpemUgb2YgQnVmZmVyIHRvIEluZmxhdGU6IHswfSBieXRlcy4iLCBDb21wcmVzc2VkQnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgLy8vICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKERlY29tcHJlc3NlZEJ5dGVzKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIGludCByYyA9IGRlY29tcHJlc3Nvci5Jbml0aWFsaXplSW5mbGF0ZSgpOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgZGVjb21wcmVzc29yLklucHV0QnVmZmVyID0gQ29tcHJlc3NlZEJ5dGVzOworICAgICAgICAvLy8gICAgIGRlY29tcHJlc3Nvci5OZXh0SW4gPSAwOworICAgICAgICAvLy8gICAgIGRlY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc0luID0gQ29tcHJlc3NlZEJ5dGVzLkxlbmd0aDsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIGRlY29tcHJlc3Nvci5PdXRwdXRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICAvLyBwYXNzIDE6IGluZmxhdGUgCisgICAgICAgIC8vLyAgICAgZG8KKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGRlY29tcHJlc3Nvci5OZXh0T3V0ID0gMDsKKyAgICAgICAgLy8vICAgICAgICAgZGVjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0ID0gYnVmZmVyLkxlbmd0aDsKKyAgICAgICAgLy8vICAgICAgICAgcmMgPSBkZWNvbXByZXNzb3IuSW5mbGF0ZShGbHVzaFR5cGUuTm9uZSk7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICAgICAgaWYgKHJjICE9IFpsaWJDb25zdGFudHMuWl9PSyAmYW1wOyZhbXA7IHJjICE9IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EKQorICAgICAgICAvLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiaW5mbGF0aW5nOiAiICsgZGVjb21wcmVzc29yLk1lc3NhZ2UpOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgICAgIG1zLldyaXRlKGRlY29tcHJlc3Nvci5PdXRwdXRCdWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGggLSBkZWNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgICB3aGlsZSAoZGVjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzSW4gJmd0OyAwIHx8IGRlY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCA9PSAwKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIC8vIHBhc3MgMjogZmluaXNoIGFuZCBmbHVzaAorICAgICAgICAvLy8gICAgIGRvCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICBkZWNvbXByZXNzb3IuTmV4dE91dCA9IDA7CisgICAgICAgIC8vLyAgICAgICAgIGRlY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCA9IGJ1ZmZlci5MZW5ndGg7CisgICAgICAgIC8vLyAgICAgICAgIHJjID0gZGVjb21wcmVzc29yLkluZmxhdGUoRmx1c2hUeXBlLkZpbmlzaCk7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICAgICAgaWYgKHJjICE9IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EICZhbXA7JmFtcDsgcmMgIT0gWmxpYkNvbnN0YW50cy5aX09LKQorICAgICAgICAvLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiaW5mbGF0aW5nOiAiICsgZGVjb21wcmVzc29yLk1lc3NhZ2UpOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgICAgIGlmIChidWZmZXIuTGVuZ3RoIC0gZGVjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0ICZndDsgMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIG1zLldyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCAtIGRlY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCk7CisgICAgICAgIC8vLyAgICAgfQorICAgICAgICAvLy8gICAgIHdoaWxlIChkZWNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNJbiAmZ3Q7IDAgfHwgZGVjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0ID09IDApOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgZGVjb21wcmVzc29yLkVuZEluZmxhdGUoKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L2NvZGU+CisgICAgICAgIC8vLyA8L2V4YW1wbGU+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmx1c2giPlRoZSBmbHVzaCB0byB1c2Ugd2hlbiBpbmZsYXRpbmcuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlpfT0sgaWYgZXZlcnl0aGluZyBnb2VzIHdlbGwuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IEluZmxhdGUoRmx1c2hUeXBlIGZsdXNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXN0YXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIk5vIEluZmxhdGUgU3RhdGUhIik7CisgICAgICAgICAgICByZXR1cm4gaXN0YXRlLkluZmxhdGUoZmx1c2gpOworICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFbmRzIGFuIGluZmxhdGlvbiBzZXNzaW9uLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gQ2FsbCB0aGlzIGFmdGVyIHN1Y2Nlc3NpdmVseSBjYWxsaW5nIEluZmxhdGUoKS4gIFRoaXMgd2lsbCBjYXVzZSBhbGwgYnVmZmVycyB0byBiZSBmbHVzaGVkLiAKKyAgICAgICAgLy8vIEFmdGVyIGNhbGxpbmcgdGhpcyB5b3UgY2Fubm90IGNhbGwgSW5mbGF0ZSgpIHdpdGhvdXQgYSBpbnRlcnZlbmluZyBjYWxsIHRvIG9uZSBvZiB0aGUKKyAgICAgICAgLy8vIEluaXRpYWxpemVJbmZsYXRlKCkgb3ZlcmxvYWRzLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBldmVyeXRoaW5nIGdvZXMgd2VsbC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgRW5kSW5mbGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc3RhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiTm8gSW5mbGF0ZSBTdGF0ZSEiKTsKKyAgICAgICAgICAgIGludCByZXQgPSBpc3RhdGUuRW5kKCk7CisgICAgICAgICAgICBpc3RhdGUgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcyEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlpfT0sgaWYgZXZlcnl0aGluZyBnb2VzIHdlbGwuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IFN5bmNJbmZsYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzdGF0ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJObyBJbmZsYXRlIFN0YXRlISIpOworICAgICAgICAgICAgcmV0dXJuIGlzdGF0ZS5TeW5jKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplIHRoZSBabGliQ29kZWMgZm9yIGRlZmxhdGlvbiBvcGVyYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRoZSBjb2RlYyB3aWxsIHVzZSB0aGUgTUFYIHdpbmRvdyBiaXRzIGFuZCB0aGUgZGVmYXVsdCBsZXZlbCBvZiBjb21wcmVzc2lvbi4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyAgaW50IGJ1ZmZlclNpemUgPSA0MDAwMDsKKyAgICAgICAgLy8vICBieXRlW10gQ29tcHJlc3NlZEJ5dGVzID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisgICAgICAgIC8vLyAgYnl0ZVtdIERlY29tcHJlc3NlZEJ5dGVzID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisgICAgICAgIC8vLyAgCisgICAgICAgIC8vLyAgWmxpYkNvZGVjIGNvbXByZXNzb3IgPSBuZXcgWmxpYkNvZGVjKCk7CisgICAgICAgIC8vLyAgCisgICAgICAgIC8vLyAgY29tcHJlc3Nvci5Jbml0aWFsaXplRGVmbGF0ZShDb21wcmVzc2lvbkxldmVsLkRlZmF1bHQpOworICAgICAgICAvLy8gIAorICAgICAgICAvLy8gIGNvbXByZXNzb3IuSW5wdXRCdWZmZXIgPSBTeXN0ZW0uVGV4dC5BU0NJSUVuY29kaW5nLkFTQ0lJLkdldEJ5dGVzKFRleHRUb0NvbXByZXNzKTsKKyAgICAgICAgLy8vICBjb21wcmVzc29yLk5leHRJbiA9IDA7CisgICAgICAgIC8vLyAgY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc0luID0gY29tcHJlc3Nvci5JbnB1dEJ1ZmZlci5MZW5ndGg7CisgICAgICAgIC8vLyAgCisgICAgICAgIC8vLyAgY29tcHJlc3Nvci5PdXRwdXRCdWZmZXIgPSBDb21wcmVzc2VkQnl0ZXM7CisgICAgICAgIC8vLyAgY29tcHJlc3Nvci5OZXh0T3V0ID0gMDsKKyAgICAgICAgLy8vICBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0ID0gQ29tcHJlc3NlZEJ5dGVzLkxlbmd0aDsKKyAgICAgICAgLy8vICAKKyAgICAgICAgLy8vICB3aGlsZSAoY29tcHJlc3Nvci5Ub3RhbEJ5dGVzSW4gIT0gVGV4dFRvQ29tcHJlc3MuTGVuZ3RoICZhbXA7JmFtcDsgY29tcHJlc3Nvci5Ub3RhbEJ5dGVzT3V0ICZsdDsgYnVmZmVyU2l6ZSkKKyAgICAgICAgLy8vICB7CisgICAgICAgIC8vLyAgICBjb21wcmVzc29yLkRlZmxhdGUoRmx1c2hUeXBlLk5vbmUpOworICAgICAgICAvLy8gIH0KKyAgICAgICAgLy8vICAKKyAgICAgICAgLy8vICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgLy8vICB7CisgICAgICAgIC8vLyAgICBpbnQgcmM9IGNvbXByZXNzb3IuRGVmbGF0ZShGbHVzaFR5cGUuRmluaXNoKTsKKyAgICAgICAgLy8vICAgIGlmIChyYyA9PSBabGliQ29uc3RhbnRzLlpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgICAgIC8vLyAgfQorICAgICAgICAvLy8gIAorICAgICAgICAvLy8gIGNvbXByZXNzb3IuRW5kRGVmbGF0ZSgpOworICAgICAgICAvLy8gICAKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlpfT0sgaWYgYWxsIGdvZXMgd2VsbC4gWW91IGdlbmVyYWxseSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gY29kZS48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgSW5pdGlhbGl6ZURlZmxhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX0ludGVybmFsSW5pdGlhbGl6ZURlZmxhdGUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplIHRoZSBabGliQ29kZWMgZm9yIGRlZmxhdGlvbiBvcGVyYXRpb24sIHVzaW5nIHRoZSBzcGVjaWZpZWQgQ29tcHJlc3Npb25MZXZlbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhlIGNvZGVjIHdpbGwgdXNlIHRoZSBtYXhpbXVtIHdpbmRvdyBiaXRzICgxNSkgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8vIENvbXByZXNzaW9uTGV2ZWwuICBJdCB3aWxsIGVtaXQgYSBaTElCIHN0cmVhbSBhcyBpdCBjb21wcmVzc2VzLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj5UaGUgY29tcHJlc3Npb24gbGV2ZWwgZm9yIHRoZSBjb2RlYy48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBhbGwgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBJbml0aWFsaXplRGVmbGF0ZShDb21wcmVzc2lvbkxldmVsIGxldmVsKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLkNvbXByZXNzTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIHJldHVybiBfSW50ZXJuYWxJbml0aWFsaXplRGVmbGF0ZSh0cnVlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgWmxpYkNvZGVjIGZvciBkZWZsYXRpb24gb3BlcmF0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIENvbXByZXNzaW9uTGV2ZWwsIAorICAgICAgICAvLy8gYW5kIHRoZSBleHBsaWNpdCBmbGFnIGdvdmVybmluZyB3aGV0aGVyIHRvIGVtaXQgYW4gUkZDMTk1MCBoZWFkZXIgYnl0ZSBwYWlyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBUaGUgY29kZWMgd2lsbCB1c2UgdGhlIG1heGltdW0gd2luZG93IGJpdHMgKDE1KSBhbmQgdGhlIHNwZWNpZmllZCBDb21wcmVzc2lvbkxldmVsLgorICAgICAgICAvLy8gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgYSB6bGliIHN0cmVhbSwgeW91IHNob3VsZCBzcGVjaWZ5IHRydWUgZm9yCisgICAgICAgIC8vLyB3YW50UmZjMTk1MEhlYWRlci4gSW4gdGhpcyBjYXNlLCB0aGUgbGlicmFyeSB3aWxsIGVtaXQgYSBaTElCCisgICAgICAgIC8vLyBoZWFkZXIsIGFzIGRlZmluZWQgaW4gPHNlZSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCI+UkZDCisgICAgICAgIC8vLyAxOTUwPC9zZWU+LCBpbiB0aGUgY29tcHJlc3NlZCBzdHJlYW0uICAKKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIGZvciB0aGUgY29kZWMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3YW50UmZjMTk1MEhlYWRlciI+d2hldGhlciB0byBlbWl0IGFuIGluaXRpYWwgUkZDMTk1MCBieXRlIHBhaXIgaW4gdGhlIGNvbXByZXNzZWQgc3RyZWFtLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5aX09LIGlmIGFsbCBnb2VzIHdlbGwuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IEluaXRpYWxpemVEZWZsYXRlKENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwsIGJvb2wgd2FudFJmYzE5NTBIZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuQ29tcHJlc3NMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcmV0dXJuIF9JbnRlcm5hbEluaXRpYWxpemVEZWZsYXRlKHdhbnRSZmMxOTUwSGVhZGVyKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgWmxpYkNvZGVjIGZvciBkZWZsYXRpb24gb3BlcmF0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkIENvbXByZXNzaW9uTGV2ZWwsIAorICAgICAgICAvLy8gYW5kIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdpbmRvdyBiaXRzLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhlIGNvZGVjIHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdpbmRvdyBiaXRzIGFuZCB0aGUgc3BlY2lmaWVkIENvbXByZXNzaW9uTGV2ZWwuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCBmb3IgdGhlIGNvZGVjLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYml0cyI+dGhlIG51bWJlciBvZiB3aW5kb3cgYml0cyB0byB1c2UuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgbWVhbnMsIGRvbid0IHVzZSB0aGlzIG1ldGhvZC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBhbGwgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBJbml0aWFsaXplRGVmbGF0ZShDb21wcmVzc2lvbkxldmVsIGxldmVsLCBpbnQgYml0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5Db21wcmVzc0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB0aGlzLldpbmRvd0JpdHMgPSBiaXRzOworICAgICAgICAgICAgcmV0dXJuIF9JbnRlcm5hbEluaXRpYWxpemVEZWZsYXRlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgWmxpYkNvZGVjIGZvciBkZWZsYXRpb24gb3BlcmF0aW9uLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vLyBDb21wcmVzc2lvbkxldmVsLCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3aW5kb3cgYml0cywgYW5kIHRoZSBleHBsaWNpdCBmbGFnCisgICAgICAgIC8vLyBnb3Zlcm5pbmcgd2hldGhlciB0byBlbWl0IGFuIFJGQzE5NTAgaGVhZGVyIGJ5dGUgcGFpci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCBmb3IgdGhlIGNvZGVjLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id2FudFJmYzE5NTBIZWFkZXIiPndoZXRoZXIgdG8gZW1pdCBhbiBpbml0aWFsIFJGQzE5NTAgYnl0ZSBwYWlyIGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJpdHMiPnRoZSBudW1iZXIgb2Ygd2luZG93IGJpdHMgdG8gdXNlLiAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGlzIG1lYW5zLCBkb24ndCB1c2UgdGhpcyBtZXRob2QuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlpfT0sgaWYgYWxsIGdvZXMgd2VsbC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgSW5pdGlhbGl6ZURlZmxhdGUoQ29tcHJlc3Npb25MZXZlbCBsZXZlbCwgaW50IGJpdHMsIGJvb2wgd2FudFJmYzE5NTBIZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuQ29tcHJlc3NMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgdGhpcy5XaW5kb3dCaXRzID0gYml0czsKKyAgICAgICAgICAgIHJldHVybiBfSW50ZXJuYWxJbml0aWFsaXplRGVmbGF0ZSh3YW50UmZjMTk1MEhlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBfSW50ZXJuYWxJbml0aWFsaXplRGVmbGF0ZShib29sIHdhbnRSZmMxOTUwSGVhZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXN0YXRlICE9IG51bGwpIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJZb3UgbWF5IG5vdCBjYWxsIEluaXRpYWxpemVEZWZsYXRlKCkgYWZ0ZXIgY2FsbGluZyBJbml0aWFsaXplSW5mbGF0ZSgpLiIpOworICAgICAgICAgICAgZHN0YXRlID0gbmV3IERlZmxhdGVNYW5hZ2VyKCk7CisgICAgICAgICAgICBkc3RhdGUuV2FudFJmYzE5NTBIZWFkZXJCeXRlcyA9IHdhbnRSZmMxOTUwSGVhZGVyOworCisgICAgICAgICAgICByZXR1cm4gZHN0YXRlLkluaXRpYWxpemUodGhpcywgdGhpcy5Db21wcmVzc0xldmVsLCB0aGlzLldpbmRvd0JpdHMsIHRoaXMuU3RyYXRlZ3kpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmbGF0ZSBvbmUgYmF0Y2ggb2YgZGF0YS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gWW91IG11c3QgaGF2ZSBzZXQgSW5wdXRCdWZmZXIgYW5kIE91dHB1dEJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyBwcml2YXRlIHZvaWQgRGVmbGF0ZUJ1ZmZlcihDb21wcmVzc2lvbkxldmVsIGxldmVsKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIGludCBidWZmZXJTaXplID0gMTAyNDsKKyAgICAgICAgLy8vICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisgICAgICAgIC8vLyAgICAgWmxpYkNvZGVjIGNvbXByZXNzb3IgPSBuZXcgWmxpYkNvZGVjKCk7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICBDb25zb2xlLldyaXRlTGluZSgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAvLy8gICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTaXplIG9mIEJ1ZmZlciB0byBEZWZsYXRlOiB7MH0gYnl0ZXMuIiwgVW5jb21wcmVzc2VkQnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgLy8vICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICBpbnQgcmMgPSBjb21wcmVzc29yLkluaXRpYWxpemVEZWZsYXRlKGxldmVsKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIGNvbXByZXNzb3IuSW5wdXRCdWZmZXIgPSBVbmNvbXByZXNzZWRCeXRlczsKKyAgICAgICAgLy8vICAgICBjb21wcmVzc29yLk5leHRJbiA9IDA7CisgICAgICAgIC8vLyAgICAgY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc0luID0gVW5jb21wcmVzc2VkQnl0ZXMuTGVuZ3RoOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgY29tcHJlc3Nvci5PdXRwdXRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICAvLyBwYXNzIDE6IGRlZmxhdGUgCisgICAgICAgIC8vLyAgICAgZG8KKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGNvbXByZXNzb3IuTmV4dE91dCA9IDA7CisgICAgICAgIC8vLyAgICAgICAgIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQgPSBidWZmZXIuTGVuZ3RoOworICAgICAgICAvLy8gICAgICAgICByYyA9IGNvbXByZXNzb3IuRGVmbGF0ZShGbHVzaFR5cGUuTm9uZSk7CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vICAgICAgICAgaWYgKHJjICE9IFpsaWJDb25zdGFudHMuWl9PSyAmYW1wOyZhbXA7IHJjICE9IFpsaWJDb25zdGFudHMuWl9TVFJFQU1fRU5EKQorICAgICAgICAvLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiZGVmbGF0aW5nOiAiICsgY29tcHJlc3Nvci5NZXNzYWdlKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgICAgICBtcy5Xcml0ZShjb21wcmVzc29yLk91dHB1dEJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCAtIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQpOworICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgICB3aGlsZSAoY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc0luICZndDsgMCB8fCBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0ID09IDApOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgLy8gcGFzcyAyOiBmaW5pc2ggYW5kIGZsdXNoCisgICAgICAgIC8vLyAgICAgZG8KKyAgICAgICAgLy8vICAgICB7CisgICAgICAgIC8vLyAgICAgICAgIGNvbXByZXNzb3IuTmV4dE91dCA9IDA7CisgICAgICAgIC8vLyAgICAgICAgIGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNPdXQgPSBidWZmZXIuTGVuZ3RoOworICAgICAgICAvLy8gICAgICAgICByYyA9IGNvbXByZXNzb3IuRGVmbGF0ZShGbHVzaFR5cGUuRmluaXNoKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgICAgICBpZiAocmMgIT0gWmxpYkNvbnN0YW50cy5aX1NUUkVBTV9FTkQgJmFtcDsmYW1wOyByYyAhPSBabGliQ29uc3RhbnRzLlpfT0spCisgICAgICAgIC8vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJkZWZsYXRpbmc6ICIgKyBjb21wcmVzc29yLk1lc3NhZ2UpOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgICAgIGlmIChidWZmZXIuTGVuZ3RoIC0gY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCAmZ3Q7IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICBtcy5Xcml0ZShidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGggLSBjb21wcmVzc29yLkF2YWlsYWJsZUJ5dGVzT3V0KTsKKyAgICAgICAgLy8vICAgICB9CisgICAgICAgIC8vLyAgICAgd2hpbGUgKGNvbXByZXNzb3IuQXZhaWxhYmxlQnl0ZXNJbiAmZ3Q7IDAgfHwgY29tcHJlc3Nvci5BdmFpbGFibGVCeXRlc091dCA9PSAwKTsKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gICAgIGNvbXByZXNzb3IuRW5kRGVmbGF0ZSgpOworICAgICAgICAvLy8gCisgICAgICAgIC8vLyAgICAgbXMuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgLy8vICAgICBDb21wcmVzc2VkQnl0ZXMgPSBuZXcgYnl0ZVtjb21wcmVzc29yLlRvdGFsQnl0ZXNPdXRdOworICAgICAgICAvLy8gICAgIG1zLlJlYWQoQ29tcHJlc3NlZEJ5dGVzLCAwLCBDb21wcmVzc2VkQnl0ZXMuTGVuZ3RoKTsKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmbHVzaCI+d2hldGhlciB0byBmbHVzaCBhbGwgZGF0YSBhcyB5b3UgZGVmbGF0ZS4gR2VuZXJhbGx5IHlvdSB3aWxsIHdhbnQgdG8gCisgICAgICAgIC8vLyB1c2UgWl9OT19GTFVTSCBoZXJlLCBpbiBhIHNlcmllcyBvZiBjYWxscyB0byBEZWZsYXRlKCksIGFuZCB0aGVuIGNhbGwgRW5kRGVmbGF0ZSgpIHRvIAorICAgICAgICAvLy8gZmx1c2ggZXZlcnl0aGluZy4gCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBhbGwgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBEZWZsYXRlKEZsdXNoVHlwZSBmbHVzaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRzdGF0ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJObyBEZWZsYXRlIFN0YXRlISIpOworICAgICAgICAgICAgcmV0dXJuIGRzdGF0ZS5EZWZsYXRlKGZsdXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEVuZCBhIGRlZmxhdGlvbiBzZXNzaW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBDYWxsIHRoaXMgYWZ0ZXIgbWFraW5nIGEgc2VyaWVzIG9mIG9uZSBvciBtb3JlIGNhbGxzIHRvIERlZmxhdGUoKS4gQWxsIGJ1ZmZlcnMgYXJlIGZsdXNoZWQuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cmV0dXJucz5aX09LIGlmIGFsbCBnb2VzIHdlbGwuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgaW50IEVuZERlZmxhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHN0YXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIk5vIERlZmxhdGUgU3RhdGUhIik7CisgICAgICAgICAgICAvLyBUT0RPOiBkaW5vY2ggVHVlLCAwMyBOb3YgMjAwOSAgMTU6MzkgKHRlc3QgdGhpcykKKyAgICAgICAgICAgIC8vaW50IHJldCA9IGRzdGF0ZS5FbmQoKTsKKyAgICAgICAgICAgIGRzdGF0ZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gWmxpYkNvbnN0YW50cy5aX09LOyAvL3JldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlc2V0IGEgY29kZWMgZm9yIGFub3RoZXIgZGVmbGF0aW9uIHNlc3Npb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIENhbGwgdGhpcyB0byByZXNldCB0aGUgZGVmbGF0aW9uIHN0YXRlLiAgRm9yIGV4YW1wbGUgaWYgYSB0aHJlYWQgaXMgZGVmbGF0aW5nCisgICAgICAgIC8vLyBub24tY29uc2VjdXRpdmUgYmxvY2tzLCB5b3UgY2FuIGNhbGwgUmVzZXQoKSBhZnRlciB0aGUgRGVmbGF0ZShTeW5jKSBvZiB0aGUgZmlyc3QKKyAgICAgICAgLy8vIGJsb2NrIGFuZCBiZWZvcmUgdGhlIG5leHQgRGVmbGF0ZShOb25lKSBvZiB0aGUgc2Vjb25kIGJsb2NrLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBhbGwgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXREZWZsYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRzdGF0ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJObyBEZWZsYXRlIFN0YXRlISIpOworICAgICAgICAgICAgZHN0YXRlLlJlc2V0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgQ29tcHJlc3Npb25TdHJhdGVneSBhbmQgQ29tcHJlc3Npb25MZXZlbCBmb3IgYSBkZWZsYXRpb24gc2Vzc2lvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+dGhlIGxldmVsIG9mIGNvbXByZXNzaW9uIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmF0ZWd5Ij50aGUgc3RyYXRlZ3kgdG8gdXNlIGZvciBjb21wcmVzc2lvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+Wl9PSyBpZiBhbGwgZ29lcyB3ZWxsLjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGludCBTZXREZWZsYXRlUGFyYW1zKENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwsIENvbXByZXNzaW9uU3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkc3RhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmxpYkV4Y2VwdGlvbigiTm8gRGVmbGF0ZSBTdGF0ZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBkc3RhdGUuU2V0UGFyYW1zKGxldmVsLCBzdHJhdGVneSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgZGljdGlvbmFyeSB0byBiZSB1c2VkIGZvciBlaXRoZXIgSW5mbGF0aW9uIG9yIERlZmxhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaWN0aW9uYXJ5Ij5UaGUgZGljdGlvbmFyeSBieXRlcyB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlpfT0sgaWYgYWxsIGdvZXMgd2VsbC48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBpbnQgU2V0RGljdGlvbmFyeShieXRlW10gZGljdGlvbmFyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzdGF0ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBpc3RhdGUuU2V0RGljdGlvbmFyeShkaWN0aW9uYXJ5KTsKKworICAgICAgICAgICAgaWYgKGRzdGF0ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBkc3RhdGUuU2V0RGljdGlvbmFyeShkaWN0aW9uYXJ5KTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oIk5vIEluZmxhdGUgb3IgRGVmbGF0ZSBzdGF0ZSEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXMKKyAgICAgICAgLy8gdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdAorICAgICAgICAvLyB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9vdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuCisgICAgICAgIC8vIChTZWUgYWxzbyByZWFkX2J1ZigpKS4KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBmbHVzaF9wZW5kaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbiA9IGRzdGF0ZS5wZW5kaW5nQ291bnQ7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiBBdmFpbGFibGVCeXRlc091dCkKKyAgICAgICAgICAgICAgICBsZW4gPSBBdmFpbGFibGVCeXRlc091dDsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChkc3RhdGUucGVuZGluZy5MZW5ndGggPD0gZHN0YXRlLm5leHRQZW5kaW5nIHx8CisgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyLkxlbmd0aCA8PSBOZXh0T3V0IHx8CisgICAgICAgICAgICAgICAgZHN0YXRlLnBlbmRpbmcuTGVuZ3RoIDwgKGRzdGF0ZS5uZXh0UGVuZGluZyArIGxlbikgfHwKKyAgICAgICAgICAgICAgICBPdXRwdXRCdWZmZXIuTGVuZ3RoIDwgKE5leHRPdXQgKyBsZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKFN0cmluZy5Gb3JtYXQoIkludmFsaWQgU3RhdGUuIChwZW5kaW5nLkxlbmd0aD17MH0sIHBlbmRpbmdDb3VudD17MX0pIiwKKyAgICAgICAgICAgICAgICAgICAgZHN0YXRlLnBlbmRpbmcuTGVuZ3RoLCBkc3RhdGUucGVuZGluZ0NvdW50KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFycmF5LkNvcHkoZHN0YXRlLnBlbmRpbmcsIGRzdGF0ZS5uZXh0UGVuZGluZywgT3V0cHV0QnVmZmVyLCBOZXh0T3V0LCBsZW4pOworCisgICAgICAgICAgICBOZXh0T3V0ICAgICAgICAgICAgICs9IGxlbjsKKyAgICAgICAgICAgIGRzdGF0ZS5uZXh0UGVuZGluZyAgKz0gbGVuOworICAgICAgICAgICAgVG90YWxCeXRlc091dCAgICAgICArPSBsZW47CisgICAgICAgICAgICBBdmFpbGFibGVCeXRlc091dCAgIC09IGxlbjsKKyAgICAgICAgICAgIGRzdGF0ZS5wZW5kaW5nQ291bnQgLT0gbGVuOworICAgICAgICAgICAgaWYgKGRzdGF0ZS5wZW5kaW5nQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RhdGUubmV4dFBlbmRpbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgorICAgICAgICAvLyBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaAorICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZAorICAgICAgICAvLyBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KKyAgICAgICAgLy8gKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuCisgICAgICAgIGludGVybmFsIGludCByZWFkX2J1ZihieXRlW10gYnVmLCBpbnQgc3RhcnQsIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuID0gQXZhaWxhYmxlQnl0ZXNJbjsKKworICAgICAgICAgICAgaWYgKGxlbiA+IHNpemUpCisgICAgICAgICAgICAgICAgbGVuID0gc2l6ZTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgQXZhaWxhYmxlQnl0ZXNJbiAtPSBsZW47CisKKyAgICAgICAgICAgIGlmIChkc3RhdGUuV2FudFJmYzE5NTBIZWFkZXJCeXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQWRsZXIzMiA9IEFkbGVyLkFkbGVyMzIoX0FkbGVyMzIsIElucHV0QnVmZmVyLCBOZXh0SW4sIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcnJheS5Db3B5KElucHV0QnVmZmVyLCBOZXh0SW4sIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgICAgICBOZXh0SW4gKz0gbGVuOworICAgICAgICAgICAgVG90YWxCeXRlc0luICs9IGxlbjsKKyAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgIH0KKworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1psaWJDb25zdGFudHMuY3MgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1psaWJDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxZjQyYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvRG90TmV0WmlwL1psaWIvWmxpYkNvbnN0YW50cy5jcwpAQCAtMCwwICsxLDEyOCBAQAorLy8gWmxpYkNvbnN0YW50cy5jcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDA5IERpbm8gQ2hpZXNhIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICAKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gVGhpcyBjb2RlIG1vZHVsZSBpcyBwYXJ0IG9mIERvdE5ldFppcCwgYSB6aXBmaWxlIGNsYXNzIGxpYnJhcnkuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UuIAorLy8gU2VlIHRoZSBmaWxlIExpY2Vuc2UudHh0IGZvciB0aGUgbGljZW5zZSBkZXRhaWxzLgorLy8gTW9yZSBpbmZvIG9uOiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGxhc3Qgc2F2ZWQgKGluIGVtYWNzKTogCisvLyBUaW1lLXN0YW1wOiA8MjAwOS1Ob3ZlbWJlci0wMyAxODo1MDoxOT4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIG1vZHVsZSBkZWZpbmVzIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSB6bGliIGNsYXNzIGxpYnJhcnkuICBUaGlzCisvLyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUganpsaWIgaW1wbGVtZW50YXRpb24gb2YgemxpYiwgYnV0CisvLyBzaWduaWZpY2FudGx5IG1vZGlmaWVkLiAgSW4ga2VlcGluZyB3aXRoIHRoZSBsaWNlbnNlIGZvciBqemxpYiwgdGhlCisvLyBjb3B5cmlnaHQgdG8gdGhhdCBjb2RlIGlzIGluY2x1ZGVkIGhlcmUuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAKKy8vIENvcHlyaWdodCAoYykgMjAwMCwyMDAxLDIwMDIsMjAwMyB5bW5rLCBKQ3JhZnQsSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8gCisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKy8vIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gCisvLyAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAKKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKKy8vIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKy8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBKQ1JBRlQsCisvLyBJTkMuIE9SIEFOWSBDT05UUklCVVRPUlMgVE8gVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCisvLyBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisvLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworLy8gTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorLy8gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24gemxpYi0xLjEuMzsgY3JlZGl0IHRvIGF1dGhvcnMKKy8vIEplYW4tbG91cCBHYWlsbHkoamxvdXBAZ3ppcC5vcmcpIGFuZCBNYXJrIEFkbGVyKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpCisvLyBhbmQgY29udHJpYnV0b3JzIG9mIHpsaWIuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGJ1bmNoIG9mIGNvbnN0YW50cyB1c2VkIGluIHRoZSBabGliIGludGVyZmFjZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWmxpYkNvbnN0YW50cworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbmRvdyBiaXRzIGZvciB0aGUgRGVmbGF0ZSBhbGdvcml0aG0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgV2luZG93Qml0c01heCA9IDE1OyAvLyAzMksgTFo3NyB3aW5kb3cKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZGVmYXVsdCBudW1iZXIgb2Ygd2luZG93IGJpdHMgZm9yIHRoZSBEZWZsYXRlIGFsZ29yaXRobS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBXaW5kb3dCaXRzRGVmYXVsdCA9IFdpbmRvd0JpdHNNYXg7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gaW5kaWNhdGVzIGV2ZXJ5dGhpbmcgaXMgQS1PSworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFpfT0sgPSAwOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBsYXN0IG9wZXJhdGlvbiByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBaX1NUUkVBTV9FTkQgPSAxOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBvcGVyYXRpb24gZW5kZWQgaW4gbmVlZCBvZiBhIGRpY3Rpb25hcnkuIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFpfTkVFRF9ESUNUID0gMjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgc3RyZWFtIC0gbm90IGVub3VnaCBkYXRhLCBub3Qgb3BlbiBhbmQgcmVhZGFibGUsIGV0Yy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBaX1NUUkVBTV9FUlJPUiA9IC0yOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIHRoZSBkYXRhIC0gbm90IGVub3VnaCBkYXRhLCBiYWQgZGF0YSwgZXRjLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFpfREFUQV9FUlJPUiA9IC0zOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIHRoZSB3b3JraW5nIGJ1ZmZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBaX0JVRl9FUlJPUiA9IC01OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBzaXplIG9mIHRoZSB3b3JraW5nIGJ1ZmZlciB1c2VkIGluIHRoZSBabGliQ29kZWMgY2xhc3MuIERlZmF1bHRzIHRvIDgxOTIgYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisjaWYgTkVUQ0YgICAgICAgIAorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFdvcmtpbmdCdWZmZXJTaXplRGVmYXVsdCA9IDgxOTI7CisjZWxzZQorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFdvcmtpbmdCdWZmZXJTaXplRGVmYXVsdCA9IDE2Mzg0OyAKKyNlbmRpZgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWluaW11bSBzaXplIG9mIHRoZSB3b3JraW5nIGJ1ZmZlciB1c2VkIGluIHRoZSBabGliQ29kZWMgY2xhc3MuICBDdXJyZW50bHkgaXQgaXMgMTI4IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY29uc3QgaW50IFdvcmtpbmdCdWZmZXJTaXplTWluID0gMTAyNDsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9abGliU3RyZWFtLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9Eb3ROZXRaaXAvWmxpYi9abGliU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGFlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL0RvdE5ldFppcC9abGliL1psaWJTdHJlYW0uY3MKQEAgLTAsMCArMSw3MjUgQEAKKy8vIFpsaWJTdHJlYW0uY3MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvcHlyaWdodCAoYykgMjAwOSBEaW5vIENoaWVzYSBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBUaGlzIGNvZGUgbW9kdWxlIGlzIHBhcnQgb2YgRG90TmV0WmlwLCBhIHppcGZpbGUgY2xhc3MgbGlicmFyeS4KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1pY3Jvc29mdCBQdWJsaWMgTGljZW5zZS4KKy8vIFNlZSB0aGUgZmlsZSBMaWNlbnNlLnR4dCBmb3IgdGhlIGxpY2Vuc2UgZGV0YWlscy4KKy8vIE1vcmUgaW5mbyBvbjogaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb20KKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsYXN0IHNhdmVkIChpbiBlbWFjcyk6CisvLyBUaW1lLXN0YW1wOiA8MjAxMS1KdWx5LTMxIDE0OjUzOjMzPgorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIFpsaWJTdHJlYW0gY2xhc3MsIHdoaWNoIGlzIHNpbWlsYXIgaW4gaWRlYSB0bworLy8gdGhlIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5EZWZsYXRlU3RyZWFtIGFuZAorLy8gU3lzdGVtLklPLkNvbXByZXNzaW9uLkdaaXBTdHJlYW0gY2xhc3NlcyBpbiB0aGUgLk5FVCBCQ0wuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIKK3sKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwcmVzZW50cyBhIFpsaWIgc3RyZWFtIGZvciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLworICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gVGhlIFpsaWJTdHJlYW0gaXMgYSA8c2VlCisgICAgLy8vIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVjb3JhdG9yX3BhdHRlcm4iPkRlY29yYXRvcjwvc2VlPiBvbiBhIDxzZWUKKyAgICAvLy8gY3JlZj0iU3lzdGVtLklPLlN0cmVhbSIvPi4gIEl0IGFkZHMgWkxJQiBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHRvIGFueQorICAgIC8vLyBzdHJlYW0uCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+IFVzaW5nIHRoaXMgc3RyZWFtLCBhcHBsaWNhdGlvbnMgY2FuIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgZGF0YSB2aWEKKyAgICAvLy8gc3RyZWFtIDxjPlJlYWQoKTwvYz4gYW5kIDxjPldyaXRlKCk8L2M+IG9wZXJhdGlvbnMuICBFaXRoZXIgY29tcHJlc3NzaW9uIG9yCisgICAgLy8vIGRlY29tcHJlc3Npb24gY2FuIG9jY3VyIHRocm91Z2ggZWl0aGVyIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIGNvbXByZXNzaW9uCisgICAgLy8vIGZvcm1hdCB1c2VkIGlzIFpMSUIsIHdoaWNoIGlzIGRvY3VtZW50ZWQgaW4gPHNlZQorICAgIC8vLyBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCI+SUVURiBSRkMgMTk1MDwvc2VlPiwgIlpMSUIgQ29tcHJlc3NlZAorICAgIC8vLyBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMy4zIi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBaTElCIGFsd2F5cyB1c2VzCisgICAgLy8vIERFRkxBVEUgYXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gIChzZWUgPHNlZQorICAgIC8vLyBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dCI+SUVURiBSRkMgMTk1MTwvc2VlPiwgIkRFRkxBVEUKKyAgICAvLy8gQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4zLiIpIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIFRoZSBaTElCIGZvcm1hdCBhbGxvd3MgZm9yIHZhcnlpbmcgY29tcHJlc3Npb24gbWV0aG9kcywgd2luZG93IHNpemVzLCBhbmQgZGljdGlvbmFyaWVzLgorICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB1c2VzIHRoZSBERUZMQVRFIGNvbXByZXNzaW9uIG1ldGhvZCwgYSBwcmVzZXQgZGljdGlvbmFyeSwKKyAgICAvLy8gYW5kIDE1IHdpbmRvdyBiaXRzIGJ5IGRlZmF1bHQuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byA8c2VlIGNyZWY9IkRlZmxhdGVTdHJlYW0iLz4sIGV4Y2VwdCB0aGF0IGl0IGFkZHMgdGhlCisgICAgLy8vIFJGQzE5NTAgaGVhZGVyIGFuZCB0cmFpbGVyIGJ5dGVzIHRvIGEgY29tcHJlc3NlZCBzdHJlYW0gd2hlbiBjb21wcmVzc2luZywgb3IgZXhwZWN0cworICAgIC8vLyB0aGUgUkZDMTk1MCBoZWFkZXIgYW5kIHRyYWlsZXIgYnl0ZXMgd2hlbiBkZWNvbXByZXNzaW5nLiAgSXQgaXMgYWxzbyBzaW1pbGFyIHRvIHRoZQorICAgIC8vLyA8c2VlIGNyZWY9IkdaaXBTdHJlYW0iLz4uCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJEZWZsYXRlU3RyZWFtIiAvPgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJHWmlwU3RyZWFtIiAvPgorICAgIHB1YmxpYyBjbGFzcyBabGliU3RyZWFtIDogU3lzdGVtLklPLlN0cmVhbQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgWmxpYkJhc2VTdHJlYW0gX2Jhc2VTdHJlYW07CisgICAgICAgIGJvb2wgX2Rpc3Bvc2VkOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIDxjPlpsaWJTdHJlYW08L2M+IHVzaW5nIHRoZSBzcGVjaWZpZWQgPGM+Q29tcHJlc3Npb25Nb2RlPC9jPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIG1vZGUgaXMgPGM+Q29tcHJlc3Npb25Nb2RlLkNvbXByZXNzPC9jPiwgdGhlIDxjPlpsaWJTdHJlYW08L2M+CisgICAgICAgIC8vLyAgIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsLiBUaGUgImNhcHRpdmUiIHN0cmVhbSB3aWxsIGJlCisgICAgICAgIC8vLyAgIGNsb3NlZCB3aGVuIHRoZSA8Yz5abGliU3RyZWFtPC9jPiBpcyBjbG9zZWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxleGFtcGxlPgorICAgICAgICAvLy8gVGhpcyBleGFtcGxlIHVzZXMgYSA8Yz5abGliU3RyZWFtPC9jPiB0byBjb21wcmVzcyBhIGZpbGUsIGFuZCB3cml0ZXMgdGhlCisgICAgICAgIC8vLyBjb21wcmVzc2VkIGRhdGEgdG8gYW5vdGhlciBmaWxlLgorICAgICAgICAvLy8gPGNvZGU+CisgICAgICAgIC8vLyB1c2luZyAoU3lzdGVtLklPLlN0cmVhbSBpbnB1dCA9IFN5c3RlbS5JTy5GaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKSkKKyAgICAgICAgLy8vIHsKKyAgICAgICAgLy8vICAgICB1c2luZyAodmFyIHJhdyA9IFN5c3RlbS5JTy5GaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyArICIuemxpYiIpKQorICAgICAgICAvLy8gICAgIHsKKyAgICAgICAgLy8vICAgICAgICAgdXNpbmcgKFN0cmVhbSBjb21wcmVzc29yID0gbmV3IFpsaWJTdHJlYW0ocmF3LCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MpKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbV09SS0lOR19CVUZGRVJfU0laRV07CisgICAgICAgIC8vLyAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSAhPSAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuV3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIGlucHV0IEFzIFN0cmVhbSA9IEZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgVXNpbmcgcmF3IEFzIEZpbGVTdHJlYW0gPSBGaWxlLkNyZWF0ZShmaWxlVG9Db21wcmVzcyAmYW1wOyAiLnpsaWIiKQorICAgICAgICAvLy8gICAgIFVzaW5nIGNvbXByZXNzb3IgQXMgU3RyZWFtID0gTmV3IFpsaWJTdHJlYW0ocmF3LCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MpCisgICAgICAgIC8vLyAgICAgICAgIERpbSBidWZmZXIgQXMgQnl0ZSgpID0gTmV3IEJ5dGUoNDA5Nikge30KKyAgICAgICAgLy8vICAgICAgICAgRGltIG4gQXMgSW50ZWdlciA9IC0xCisgICAgICAgIC8vLyAgICAgICAgIERvIFdoaWxlIChuICZsdDsmZ3Q7IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICBJZiAobiAmZ3Q7IDApIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBjb21wcmVzc29yLldyaXRlKGJ1ZmZlciwgMCwgbikKKyAgICAgICAgLy8vICAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgICAgICAgbiA9IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKQorICAgICAgICAvLy8gICAgICAgICBMb29wCisgICAgICAgIC8vLyAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIFpsaWJTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBabGliU3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtLCBDb21wcmVzc2lvbk1vZGUgbW9kZSkKKyAgICAgICAgICAgIDogdGhpcyhzdHJlYW0sIG1vZGUsIENvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+WmxpYlN0cmVhbTwvYz4gdXNpbmcgdGhlIHNwZWNpZmllZCA8Yz5Db21wcmVzc2lvbk1vZGU8L2M+IGFuZAorICAgICAgICAvLy8gICB0aGUgc3BlY2lmaWVkIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBXaGVuIG1vZGUgaXMgPGM+Q29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3M8L2M+LCB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICAgIC8vLyAgIFRoZSAiY2FwdGl2ZSIgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlIDxjPlpsaWJTdHJlYW08L2M+IGlzIGNsb3NlZC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPGV4YW1wbGU+CisgICAgICAgIC8vLyAgIFRoaXMgZXhhbXBsZSB1c2VzIGEgPGM+WmxpYlN0cmVhbTwvYz4gdG8gY29tcHJlc3MgZGF0YSBmcm9tIGEgZmlsZSwgYW5kIHdyaXRlcyB0aGUKKyAgICAgICAgLy8vICAgY29tcHJlc3NlZCBkYXRhIHRvIGFub3RoZXIgZmlsZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nIChTeXN0ZW0uSU8uU3RyZWFtIGlucHV0ID0gU3lzdGVtLklPLkZpbGUuT3BlblJlYWQoZmlsZVRvQ29tcHJlc3MpKQorICAgICAgICAvLy8geworICAgICAgICAvLy8gICAgIHVzaW5nICh2YXIgcmF3ID0gU3lzdGVtLklPLkZpbGUuQ3JlYXRlKGZpbGVUb0NvbXByZXNzICsgIi56bGliIikpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAoU3RyZWFtIGNvbXByZXNzb3IgPSBuZXcgWmxpYlN0cmVhbShyYXcsCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbC5CZXN0Q29tcHJlc3Npb24pKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbV09SS0lOR19CVUZGRVJfU0laRV07CisgICAgICAgIC8vLyAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSAhPSAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuV3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZSBsYW5nPSJWQiI+CisgICAgICAgIC8vLyBVc2luZyBpbnB1dCBBcyBTdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKQorICAgICAgICAvLy8gICAgIFVzaW5nIHJhdyBBcyBGaWxlU3RyZWFtID0gRmlsZS5DcmVhdGUoZmlsZVRvQ29tcHJlc3MgJmFtcDsgIi56bGliIikKKyAgICAgICAgLy8vICAgICAgICAgVXNpbmcgY29tcHJlc3NvciBBcyBTdHJlYW0gPSBOZXcgWmxpYlN0cmVhbShyYXcsIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywgQ29tcHJlc3Npb25MZXZlbC5CZXN0Q29tcHJlc3Npb24pCisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gYnVmZmVyIEFzIEJ5dGUoKSA9IE5ldyBCeXRlKDQwOTYpIHt9CisgICAgICAgIC8vLyAgICAgICAgICAgICBEaW0gbiBBcyBJbnRlZ2VyID0gLTEKKyAgICAgICAgLy8vICAgICAgICAgICAgIERvIFdoaWxlIChuICZsdDsmZ3Q7IDApCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgSWYgKG4gJmd0OyAwKSBUaGVuCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuV3JpdGUoYnVmZmVyLCAwLCBuKQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAvLy8gICAgICAgICAgICAgICAgIG4gPSBpbnB1dC5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkKKyAgICAgICAgLy8vICAgICAgICAgICAgIExvb3AKKyAgICAgICAgLy8vICAgICAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyAgICAgRW5kIFVzaW5nCisgICAgICAgIC8vLyBFbmQgVXNpbmcKKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RyZWFtIj5UaGUgc3RyZWFtIHRvIGJlIHJlYWQgb3Igd3JpdHRlbiB3aGlsZSBkZWZsYXRpbmcgb3IgaW5mbGF0aW5nLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIFpsaWJTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPkEgdHVuaW5nIGtub2IgdG8gdHJhZGUgc3BlZWQgZm9yIGVmZmVjdGl2ZW5lc3MuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFpsaWJTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIENvbXByZXNzaW9uTW9kZSBtb2RlLCBDb21wcmVzc2lvbkxldmVsIGxldmVsKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgbW9kZSwgbGV2ZWwsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENyZWF0ZSBhIDxjPlpsaWJTdHJlYW08L2M+IHVzaW5nIHRoZSBzcGVjaWZpZWQgPGM+Q29tcHJlc3Npb25Nb2RlPC9jPiwgYW5kCisgICAgICAgIC8vLyAgIGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyIHRoZSBjYXB0aXZlIHN0cmVhbSBzaG91bGQgYmUgbGVmdCBvcGVuIGFmdGVyCisgICAgICAgIC8vLyAgIERlZmxhdGlvbiBvciBJbmZsYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFdoZW4gbW9kZSBpcyA8Yz5Db21wcmVzc2lvbk1vZGUuQ29tcHJlc3M8L2M+LCB0aGUgPGM+WmxpYlN0cmVhbTwvYz4gd2lsbCB1c2UKKyAgICAgICAgLy8vICAgdGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIGNhcHRpdmUgc3RyZWFtCisgICAgICAgIC8vLyAgIHJlbWFpbiBvcGVuIGFmdGVyIHRoZSBkZWZsYXRpb24gb3IgaW5mbGF0aW9uIG9jY3Vycy4gIEJ5IGRlZmF1bHQsIGFmdGVyCisgICAgICAgIC8vLyAgIDxjPkNsb3NlKCk8L2M+IGlzIGNhbGxlZCBvbiB0aGUgc3RyZWFtLCB0aGUgY2FwdGl2ZSBzdHJlYW0gaXMgYWxzbworICAgICAgICAvLy8gICBjbG9zZWQuIEluIHNvbWUgY2FzZXMgdGhpcyBpcyBub3QgZGVzaXJlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIHN0cmVhbSBpcyBhCisgICAgICAgIC8vLyAgIDxzZWUgY3JlZj0iU3lzdGVtLklPLk1lbW9yeVN0cmVhbSIvPiB0aGF0IHdpbGwgYmUgcmUtcmVhZCBhZnRlcgorICAgICAgICAvLy8gICBjb21wcmVzc2lvbi4gIFNwZWNpZnkgdHJ1ZSBmb3IgdGhlIDxwYXJhbXJlZiBuYW1lPSJsZWF2ZU9wZW4iLz4gcGFyYW1ldGVyIHRvIGxlYXZlIHRoZSBzdHJlYW0KKyAgICAgICAgLy8vICAgb3Blbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vIFNlZSB0aGUgb3RoZXIgb3ZlcmxvYWRzIG9mIHRoaXMgY29uc3RydWN0b3IgZm9yIGV4YW1wbGUgY29kZS4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0cmVhbSI+VGhlIHN0cmVhbSB3aGljaCB3aWxsIGJlIHJlYWQgb3Igd3JpdHRlbi4gVGhpcyBpcyBjYWxsZWQgdGhlCisgICAgICAgIC8vLyAiY2FwdGl2ZSIgc3RyZWFtIGluIG90aGVyIHBsYWNlcyBpbiB0aGlzIGRvY3VtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtb2RlIj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgWmxpYlN0cmVhbSB3aWxsIGNvbXByZXNzIG9yIGRlY29tcHJlc3MuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZWF2ZU9wZW4iPnRydWUgaWYgdGhlIGFwcGxpY2F0aW9uIHdvdWxkIGxpa2UgdGhlIHN0cmVhbSB0byByZW1haW4KKyAgICAgICAgLy8vIG9wZW4gYWZ0ZXIgaW5mbGF0aW9uL2RlZmxhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgWmxpYlN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtIHN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlIG1vZGUsIGJvb2wgbGVhdmVPcGVuKQorICAgICAgICAgICAgOiB0aGlzKHN0cmVhbSwgbW9kZSwgQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0LCBsZWF2ZU9wZW4pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgQ3JlYXRlIGEgPGM+WmxpYlN0cmVhbTwvYz4gdXNpbmcgdGhlIHNwZWNpZmllZCA8Yz5Db21wcmVzc2lvbk1vZGU8L2M+CisgICAgICAgIC8vLyAgIGFuZCB0aGUgc3BlY2lmaWVkIDxjPkNvbXByZXNzaW9uTGV2ZWw8L2M+LCBhbmQgZXhwbGljaXRseSBzcGVjaWZ5CisgICAgICAgIC8vLyAgIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgYmUgbGVmdCBvcGVuIGFmdGVyIERlZmxhdGlvbiBvciBJbmZsYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIGNhcHRpdmUKKyAgICAgICAgLy8vICAgc3RyZWFtIHJlbWFpbiBvcGVuIGFmdGVyIHRoZSBkZWZsYXRpb24gb3IgaW5mbGF0aW9uIG9jY3Vycy4gIEJ5CisgICAgICAgIC8vLyAgIGRlZmF1bHQsIGFmdGVyIDxjPkNsb3NlKCk8L2M+IGlzIGNhbGxlZCBvbiB0aGUgc3RyZWFtLCB0aGUgY2FwdGl2ZQorICAgICAgICAvLy8gICBzdHJlYW0gaXMgYWxzbyBjbG9zZWQuIEluIHNvbWUgY2FzZXMgdGhpcyBpcyBub3QgZGVzaXJlZCwgZm9yIGV4YW1wbGUKKyAgICAgICAgLy8vICAgaWYgdGhlIHN0cmVhbSBpcyBhIDxzZWUgY3JlZj0iU3lzdGVtLklPLk1lbW9yeVN0cmVhbSIvPiB0aGF0IHdpbGwgYmUKKyAgICAgICAgLy8vICAgcmUtcmVhZCBhZnRlciBjb21wcmVzc2lvbi4gIFNwZWNpZnkgdHJ1ZSBmb3IgdGhlIDxwYXJhbXJlZgorICAgICAgICAvLy8gICBuYW1lPSJsZWF2ZU9wZW4iLz4gcGFyYW1ldGVyIHRvIGxlYXZlIHRoZSBzdHJlYW0gb3Blbi4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYT4KKyAgICAgICAgLy8vICAgV2hlbiBtb2RlIGlzIDxjPkNvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzPC9jPiwgdGhlIGxldmVsIHBhcmFtZXRlciBpcworICAgICAgICAvLy8gICBpZ25vcmVkLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIFpsaWJTdHJlYW0gdG8gY29tcHJlc3MgdGhlIGRhdGEgZnJvbSBhIGZpbGUsCisgICAgICAgIC8vLyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbnRvIGFub3RoZXIgZmlsZS4gVGhlIGZpbGVzdHJlYW0gcmVtYWlucyBvcGVuIHRvIGFsbG93CisgICAgICAgIC8vLyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgd3JpdHRlbiB0byBpdC4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8Y29kZT4KKyAgICAgICAgLy8vIHVzaW5nICh2YXIgb3V0cHV0ID0gU3lzdGVtLklPLkZpbGUuQ3JlYXRlKGZpbGVUb0NvbXByZXNzICsgIi56bGliIikpCisgICAgICAgIC8vLyB7CisgICAgICAgIC8vLyAgICAgdXNpbmcgKFN5c3RlbS5JTy5TdHJlYW0gaW5wdXQgPSBTeXN0ZW0uSU8uRmlsZS5PcGVuUmVhZChmaWxlVG9Db21wcmVzcykpCisgICAgICAgIC8vLyAgICAgeworICAgICAgICAvLy8gICAgICAgICB1c2luZyAoU3RyZWFtIGNvbXByZXNzb3IgPSBuZXcgWmxpYlN0cmVhbShvdXRwdXQsIENvbXByZXNzaW9uTW9kZS5Db21wcmVzcywgQ29tcHJlc3Npb25MZXZlbC5CZXN0Q29tcHJlc3Npb24sIHRydWUpKQorICAgICAgICAvLy8gICAgICAgICB7CisgICAgICAgIC8vLyAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbV09SS0lOR19CVUZGRVJfU0laRV07CisgICAgICAgIC8vLyAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgLy8vICAgICAgICAgICAgIHdoaWxlICgobj0gaW5wdXQuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSAhPSAwKQorICAgICAgICAvLy8gICAgICAgICAgICAgeworICAgICAgICAvLy8gICAgICAgICAgICAgICAgIGNvbXByZXNzb3IuV3JpdGUoYnVmZmVyLCAwLCBuKTsKKyAgICAgICAgLy8vICAgICAgICAgICAgIH0KKyAgICAgICAgLy8vICAgICAgICAgfQorICAgICAgICAvLy8gICAgIH0KKyAgICAgICAgLy8vICAgICAvLyBjYW4gd3JpdGUgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGhlcmUKKyAgICAgICAgLy8vIH0KKyAgICAgICAgLy8vIDwvY29kZT4KKyAgICAgICAgLy8vIDxjb2RlIGxhbmc9IlZCIj4KKyAgICAgICAgLy8vIFVzaW5nIG91dHB1dCBBcyBGaWxlU3RyZWFtID0gRmlsZS5DcmVhdGUoZmlsZVRvQ29tcHJlc3MgJmFtcDsgIi56bGliIikKKyAgICAgICAgLy8vICAgICBVc2luZyBpbnB1dCBBcyBTdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGZpbGVUb0NvbXByZXNzKQorICAgICAgICAvLy8gICAgICAgICBVc2luZyBjb21wcmVzc29yIEFzIFN0cmVhbSA9IE5ldyBabGliU3RyZWFtKG91dHB1dCwgQ29tcHJlc3Npb25Nb2RlLkNvbXByZXNzLCBDb21wcmVzc2lvbkxldmVsLkJlc3RDb21wcmVzc2lvbiwgVHJ1ZSkKKyAgICAgICAgLy8vICAgICAgICAgICAgIERpbSBidWZmZXIgQXMgQnl0ZSgpID0gTmV3IEJ5dGUoNDA5Nikge30KKyAgICAgICAgLy8vICAgICAgICAgICAgIERpbSBuIEFzIEludGVnZXIgPSAtMQorICAgICAgICAvLy8gICAgICAgICAgICAgRG8gV2hpbGUgKG4gJmx0OyZndDsgMCkKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICBJZiAobiAmZ3Q7IDApIFRoZW4KKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nvci5Xcml0ZShidWZmZXIsIDAsIG4pCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgRW5kIElmCisgICAgICAgIC8vLyAgICAgICAgICAgICAgICAgbiA9IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKQorICAgICAgICAvLy8gICAgICAgICAgICAgTG9vcAorICAgICAgICAvLy8gICAgICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgICBFbmQgVXNpbmcKKyAgICAgICAgLy8vICAgICAnIGNhbiB3cml0ZSBhZGRpdGlvbmFsIGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0gaGVyZS4KKyAgICAgICAgLy8vIEVuZCBVc2luZworICAgICAgICAvLy8gPC9jb2RlPgorICAgICAgICAvLy8gPC9leGFtcGxlPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdHJlYW0iPlRoZSBzdHJlYW0gd2hpY2ggd2lsbCBiZSByZWFkIG9yIHdyaXR0ZW4uPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibW9kZSI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIFpsaWJTdHJlYW0gd2lsbCBjb21wcmVzcyBvciBkZWNvbXByZXNzLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlYXZlT3BlbiI+CisgICAgICAgIC8vLyB0cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRoZSBzdHJlYW0gdG8gcmVtYWluIG9wZW4gYWZ0ZXIKKyAgICAgICAgLy8vIGluZmxhdGlvbi9kZWZsYXRpb24uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+CisgICAgICAgIC8vLyBBIHR1bmluZyBrbm9iIHRvIHRyYWRlIHNwZWVkIGZvciBlZmZlY3RpdmVuZXNzLiBUaGlzIHBhcmFtZXRlciBpcworICAgICAgICAvLy8gZWZmZWN0aXZlIG9ubHkgd2hlbiBtb2RlIGlzIDxjPkNvbXByZXNzaW9uTW9kZS5Db21wcmVzczwvYz4uCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgWmxpYlN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtIHN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlIG1vZGUsIENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwsIGJvb2wgbGVhdmVPcGVuKQorICAgICAgICB7CisgICAgICAgICAgICBfYmFzZVN0cmVhbSA9IG5ldyBabGliQmFzZVN0cmVhbShzdHJlYW0sIG1vZGUsIGxldmVsLCBabGliU3RyZWFtRmxhdm9yLlpMSUIsIGxlYXZlT3Blbik7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFpsaWIgcHJvcGVydGllcworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgcHJvcGVydHkgc2V0cyB0aGUgZmx1c2ggYmVoYXZpb3Igb24gdGhlIHN0cmVhbS4KKyAgICAgICAgLy8vIFNvcnJ5LCB0aG91Z2gsIG5vdCBzdXJlIGV4YWN0bHkgaG93IHRvIGRlc2NyaWJlIGFsbCB0aGUgdmFyaW91cyBzZXR0aW5ncy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdmlydHVhbCBwdWJsaWMgRmx1c2hUeXBlIEZsdXNoTW9kZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKHRoaXMuX2Jhc2VTdHJlYW0uX2ZsdXNoTW9kZSk7IH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiWmxpYlN0cmVhbSIpOworICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VTdHJlYW0uX2ZsdXNoTW9kZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgc2l6ZSBvZiB0aGUgd29ya2luZyBidWZmZXIgZm9yIHRoZSBjb21wcmVzc2lvbiBjb2RlYy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBUaGUgd29ya2luZyBidWZmZXIgaXMgdXNlZCBmb3IgYWxsIHN0cmVhbSBvcGVyYXRpb25zLiAgVGhlIGRlZmF1bHQgc2l6ZSBpcworICAgICAgICAvLy8gICAxMDI0IGJ5dGVzLiBUaGUgbWluaW11bSBzaXplIGlzIDEyOCBieXRlcy4gWW91IG1heSBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlCisgICAgICAgIC8vLyAgIHdpdGggYSBsYXJnZXIgYnVmZmVyLiAgVGhlbiBhZ2FpbiwgeW91IG1pZ2h0IG5vdC4gIFlvdSB3b3VsZCBoYXZlIHRvIHRlc3QKKyAgICAgICAgLy8vICAgaXQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIFNldCB0aGlzIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byA8Yz5SZWFkKCk8L2M+IG9yIDxjPldyaXRlKCk8L2M+IG9uIHRoZQorICAgICAgICAvLy8gICBzdHJlYW0uIElmIHlvdSB0cnkgdG8gc2V0IGl0IGFmdGVyd2FyZHMsIGl0IHdpbGwgdGhyb3cuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBpbnQgQnVmZmVyU2l6ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fYnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiWmxpYlN0cmVhbSIpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlU3RyZWFtLl93b3JraW5nQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBabGliRXhjZXB0aW9uKCJUaGUgd29ya2luZyBidWZmZXIgaXMgYWxyZWFkeSBzZXQuIik7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgWmxpYkNvbnN0YW50cy5Xb3JraW5nQnVmZmVyU2l6ZU1pbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpsaWJFeGNlcHRpb24oU3RyaW5nLkZvcm1hdCgiRG9uJ3QgYmUgc2lsbHkuIHswfSBieXRlcz8/IFVzZSBhIGJpZ2dlciBidWZmZXIsIGF0IGxlYXN0IHsxfS4iLCB2YWx1ZSwgWmxpYkNvbnN0YW50cy5Xb3JraW5nQnVmZmVyU2l6ZU1pbikpOworICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VTdHJlYW0uX2J1ZmZlclNpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGlucHV0IHNvIGZhci48L3N1bW1hcnk+CisgICAgICAgIHZpcnR1YWwgcHVibGljIGxvbmcgVG90YWxJbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzSW47IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIuPC9zdW1tYXJ5PgorICAgICAgICB2aXJ0dWFsIHB1YmxpYyBsb25nIFRvdGFsT3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aGlzLl9iYXNlU3RyZWFtLl96LlRvdGFsQnl0ZXNPdXQ7IH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFN5c3RlbS5JTy5TdHJlYW0gbWV0aG9kcworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgRGlzcG9zZSB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIDxwYXJhPgorICAgICAgICAvLy8gICAgIFRoaXMgbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIGEgPGM+Q2xvc2UoKTwvYz4gY2FsbCBvbiB0aGUgY2FwdGl2ZQorICAgICAgICAvLy8gICAgIHN0cmVhbS4gIFNlZSB0aGUgY29uc3RydWN0b3JzIHRoYXQgaGF2ZSBhIDxjPmxlYXZlT3BlbjwvYz4gcGFyYW1ldGVyCisgICAgICAgIC8vLyAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vICAgPHBhcmE+CisgICAgICAgIC8vLyAgICAgVGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgaW4gdHdvIGRpc3RpbmN0IHNjZW5hcmlvcy4gIElmIGRpc3Bvc2luZworICAgICAgICAvLy8gICAgID09IHRydWUsIHRoZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgYQorICAgICAgICAvLy8gICAgIHVzZXIncyBjb2RlLCBmb3IgZXhhbXBsZSB2aWEgdGhlIHB1YmxpYyBEaXNwb3NlKCkgbWV0aG9kLiBJbiB0aGlzCisgICAgICAgIC8vLyAgICAgY2FzZSwgYm90aCBtYW5hZ2VkIGFuZCB1bm1hbmFnZWQgcmVzb3VyY2VzIGNhbiBiZSByZWZlcmVuY2VkIGFuZAorICAgICAgICAvLy8gICAgIGRpc3Bvc2VkLiAgSWYgZGlzcG9zaW5nID09IGZhbHNlLCB0aGUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBieSB0aGUKKyAgICAgICAgLy8vICAgICBydW50aW1lIGZyb20gaW5zaWRlIHRoZSBvYmplY3QgZmluYWxpemVyIGFuZCB0aGlzIG1ldGhvZCBzaG91bGQgbm90CisgICAgICAgIC8vLyAgICAgcmVmZXJlbmNlIG90aGVyIG9iamVjdHM7IGluIHRoYXQgY2FzZSBvbmx5IHVubWFuYWdlZCByZXNvdXJjZXMgbXVzdAorICAgICAgICAvLy8gICAgIGJlIHJlZmVyZW5jZWQgb3IgZGlzcG9zZWQuCisgICAgICAgIC8vLyAgIDwvcGFyYT4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXNwb3NpbmciPgorICAgICAgICAvLy8gICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGlzcG9zZSBtZXRob2Qgd2FzIGludm9rZWQgYnkgdXNlciBjb2RlLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfZGlzcG9zZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nICYmICh0aGlzLl9iYXNlU3RyZWFtICE9IG51bGwpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFzZVN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfZGlzcG9zZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBjYW4gYmUgcmVhZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNhcHRpdmUgc3RyZWFtIHN1cHBvcnRzIHJlYWRpbmcuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJabGliU3RyZWFtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iYXNlU3RyZWFtLl9zdHJlYW0uQ2FuUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gc3VwcG9ydHMgU2VlayBvcGVyYXRpb25zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlaworICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gY2FuIGJlIHdyaXR0ZW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRoZSByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBjYXB0aXZlIHN0cmVhbSBzdXBwb3J0cyB3cml0aW5nLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlpsaWJTdHJlYW0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2Jhc2VTdHJlYW0uX3N0cmVhbS5DYW5Xcml0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZsdXNoIHRoZSBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJabGliU3RyZWFtIik7CisgICAgICAgICAgICBfYmFzZVN0cmVhbS5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZGluZyB0aGlzIHByb3BlcnR5IGFsd2F5cyB0aHJvd3MgYSA8c2VlIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIvPi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBUaGUgcG9zaXRpb24gb2YgdGhlIHN0cmVhbSBwb2ludGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gICBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWx3YXlzIHRocm93cyBhIDxzZWUKKyAgICAgICAgLy8vICAgY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIi8+LiBSZWFkaW5nIHdpbGwgcmV0dXJuIHRoZSB0b3RhbCBieXRlcworICAgICAgICAvLy8gICB3cml0dGVuIG91dCwgaWYgdXNlZCBpbiB3cml0aW5nLCBvciB0aGUgdG90YWwgYnl0ZXMgcmVhZCBpbiwgaWYgdXNlZCBpbgorICAgICAgICAvLy8gICByZWFkaW5nLiAgVGhlIGNvdW50IG1heSByZWZlciB0byBjb21wcmVzc2VkIGJ5dGVzIG9yIHVuY29tcHJlc3NlZCBieXRlcywKKyAgICAgICAgLy8vICAgZGVwZW5kaW5nIG9uIGhvdyB5b3UndmUgdXNlZCB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fYmFzZVN0cmVhbS5fc3RyZWFtTW9kZSA9PSBJb25pYy5abGliLlpsaWJCYXNlU3RyZWFtLlN0cmVhbU1vZGUuV3JpdGVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVN0cmVhbS5fei5Ub3RhbEJ5dGVzT3V0OworICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlU3RyZWFtLl9zdHJlYW1Nb2RlID09IElvbmljLlpsaWIuWmxpYkJhc2VTdHJlYW0uU3RyZWFtTW9kZS5SZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlU3RyZWFtLl96LlRvdGFsQnl0ZXNJbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0IHsgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOyB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDxjPlpsaWJTdHJlYW08L2M+IHRvIGNvbXByZXNzIGRhdGEgd2hpbGUgcmVhZGluZywKKyAgICAgICAgLy8vICAgeW91IGNhbiBjcmVhdGUgYSA8Yz5abGliU3RyZWFtPC9jPiB3aXRoIDxjPkNvbXByZXNzaW9uTW9kZS5Db21wcmVzczwvYz4sCisgICAgICAgIC8vLyAgIHByb3ZpZGluZyBhbiB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uICBUaGVuIGNhbGwgPGM+UmVhZCgpPC9jPiBvbiB0aGF0CisgICAgICAgIC8vLyAgIDxjPlpsaWJTdHJlYW08L2M+LCBhbmQgdGhlIGRhdGEgcmVhZCB3aWxsIGJlIGNvbXByZXNzZWQuICBJZiB5b3Ugd2lzaCB0bworICAgICAgICAvLy8gICB1c2UgdGhlIDxjPlpsaWJTdHJlYW08L2M+IHRvIGRlY29tcHJlc3MgZGF0YSB3aGlsZSByZWFkaW5nLCB5b3UgY2FuIGNyZWF0ZQorICAgICAgICAvLy8gICBhIDxjPlpsaWJTdHJlYW08L2M+IHdpdGggPGM+Q29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3M8L2M+LCBwcm92aWRpbmcgYQorICAgICAgICAvLy8gICByZWFkYWJsZSBjb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlbiBjYWxsIDxjPlJlYWQoKTwvYz4gb24gdGhhdAorICAgICAgICAvLy8gICA8Yz5abGliU3RyZWFtPC9jPiwgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZGVjb21wcmVzc2VkIGFzIGl0IGlzIHJlYWQuCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmE+CisgICAgICAgIC8vLyAgIEEgPGM+WmxpYlN0cmVhbTwvYz4gY2FuIGJlIHVzZWQgZm9yIDxjPlJlYWQoKTwvYz4gb3IgPGM+V3JpdGUoKTwvYz4sIGJ1dAorICAgICAgICAvLy8gICBub3QgYm90aC4KKyAgICAgICAgLy8vIDwvcGFyYT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+CisgICAgICAgIC8vLyBUaGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIHJlYWQgZGF0YSBzaG91bGQgYmUgcGxhY2VkLjwvcGFyYW0+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+CisgICAgICAgIC8vLyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGRhdGEgYXJyYXkgdG8gcHV0IHRoZSBmaXJzdCBieXRlIHJlYWQuPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPnRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC48L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiWmxpYlN0cmVhbSIpOworICAgICAgICAgICAgcmV0dXJuIF9iYXNlU3RyZWFtLlJlYWQoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIDxzZWUgY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+CisgICAgICAgIC8vLyAgIFRoZSBvZmZzZXQgdG8gc2VlayB0by4uLi4KKyAgICAgICAgLy8vICAgSUYgVEhJUyBNRVRIT0QgQUNUVUFMTFkgRElEIEFOWVRISU5HLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcmlnaW4iPgorICAgICAgICAvLy8gICBUaGUgcmVmZXJlbmNlIHNwZWNpZnlpbmcgaG93IHRvIGFwcGx5IHRoZSBvZmZzZXQuLi4uICBJRgorICAgICAgICAvLy8gICBUSElTIE1FVEhPRCBBQ1RVQUxMWSBESUQgQU5ZVEhJTkcuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPm5vdGhpbmcuIFRoaXMgbWV0aG9kIGFsd2F5cyB0aHJvd3MuPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTeXN0ZW0uSU8uU2Vla09yaWdpbiBvcmlnaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHRocm93cyBhIDxzZWUgY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIi8+LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj4KKyAgICAgICAgLy8vICAgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHN0cmVhbSBsZW5ndGguLi4uICBJRgorICAgICAgICAvLy8gICBUSElTIE1FVEhPRCBBQ1RVQUxMWSBESUQgQU5ZVEhJTkcuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgZGF0YSB0byB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDxjPlpsaWJTdHJlYW08L2M+IHRvIGNvbXByZXNzIGRhdGEgd2hpbGUgd3JpdGluZywKKyAgICAgICAgLy8vICAgeW91IGNhbiBjcmVhdGUgYSA8Yz5abGliU3RyZWFtPC9jPiB3aXRoIDxjPkNvbXByZXNzaW9uTW9kZS5Db21wcmVzczwvYz4sCisgICAgICAgIC8vLyAgIGFuZCBhIHdyaXRhYmxlIG91dHB1dCBzdHJlYW0uICBUaGVuIGNhbGwgPGM+V3JpdGUoKTwvYz4gb24gdGhhdAorICAgICAgICAvLy8gICA8Yz5abGliU3RyZWFtPC9jPiwgcHJvdmlkaW5nIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlucHV0LiAgVGhlIGRhdGEgc2VudCB0bworICAgICAgICAvLy8gICB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIGJlIHRoZSBjb21wcmVzc2VkIGZvcm0gb2YgdGhlIGRhdGEgd3JpdHRlbi4gIElmIHlvdQorICAgICAgICAvLy8gICB3aXNoIHRvIHVzZSB0aGUgPGM+WmxpYlN0cmVhbTwvYz4gdG8gZGVjb21wcmVzcyBkYXRhIHdoaWxlIHdyaXRpbmcsIHlvdQorICAgICAgICAvLy8gICBjYW4gY3JlYXRlIGEgPGM+WmxpYlN0cmVhbTwvYz4gd2l0aCA8Yz5Db21wcmVzc2lvbk1vZGUuRGVjb21wcmVzczwvYz4sIGFuZCBhCisgICAgICAgIC8vLyAgIHdyaXRhYmxlIG91dHB1dCBzdHJlYW0uICBUaGVuIGNhbGwgPGM+V3JpdGUoKTwvYz4gb24gdGhhdCBzdHJlYW0sCisgICAgICAgIC8vLyAgIHByb3ZpZGluZyBwcmV2aW91c2x5IGNvbXByZXNzZWQgZGF0YS4gVGhlIGRhdGEgc2VudCB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAvLy8gICB3aWxsIGJlIHRoZSBkZWNvbXByZXNzZWQgZm9ybSBvZiB0aGUgZGF0YSB3cml0dGVuLgorICAgICAgICAvLy8gPC9wYXJhPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhPgorICAgICAgICAvLy8gICBBIDxjPlpsaWJTdHJlYW08L2M+IGNhbiBiZSB1c2VkIGZvciA8Yz5SZWFkKCk8L2M+IG9yIDxjPldyaXRlKCk8L2M+LCBidXQgbm90IGJvdGguCisgICAgICAgIC8vLyA8L3BhcmE+CisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyIj5UaGUgYnVmZmVyIGhvbGRpbmcgZGF0YSB0byB3cml0ZSB0byB0aGUgc3RyZWFtLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij50aGUgb2Zmc2V0IHdpdGhpbiB0aGF0IGRhdGEgYXJyYXkgdG8gZmluZCB0aGUgZmlyc3QgYnl0ZSB0byB3cml0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij50aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiWmxpYlN0cmVhbSIpOworICAgICAgICAgICAgX2Jhc2VTdHJlYW0uV3JpdGUoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENvbXByZXNzIGEgc3RyaW5nIGludG8gYSBieXRlIGFycmF5IHVzaW5nIFpMSUIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyAgIFVuY29tcHJlc3MgaXQgd2l0aCA8c2VlIGNyZWY9IlpsaWJTdHJlYW0uVW5jb21wcmVzc1N0cmluZyhieXRlW10pIi8+LgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlpsaWJTdHJlYW0uVW5jb21wcmVzc1N0cmluZyhieXRlW10pIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJabGliU3RyZWFtLkNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkdaaXBTdHJlYW0uQ29tcHJlc3NTdHJpbmcoc3RyaW5nKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj4KKyAgICAgICAgLy8vICAgQSBzdHJpbmcgdG8gY29tcHJlc3MuICBUaGUgc3RyaW5nIHdpbGwgZmlyc3QgYmUgZW5jb2RlZAorICAgICAgICAvLy8gICB1c2luZyBVVEY4LCB0aGVuIGNvbXByZXNzZWQuCisgICAgICAgIC8vLyA8L3BhcmFtPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBzdHJpbmcgaW4gY29tcHJlc3NlZCBmb3JtPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBDb21wcmVzc1N0cmluZyhTdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJlYW0gY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBabGliU3RyZWFtKG1zLCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBabGliQmFzZVN0cmVhbS5Db21wcmVzc1N0cmluZyhzLCBjb21wcmVzc29yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIENvbXByZXNzIGEgYnl0ZSBhcnJheSBpbnRvIGEgbmV3IGJ5dGUgYXJyYXkgdXNpbmcgWkxJQi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vICAgVW5jb21wcmVzcyBpdCB3aXRoIDxzZWUgY3JlZj0iWmxpYlN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiLz4uCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iWmxpYlN0cmVhbS5Db21wcmVzc1N0cmluZyhzdHJpbmcpIi8+CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJabGliU3RyZWFtLlVuY29tcHJlc3NCdWZmZXIoYnl0ZVtdKSIvPgorICAgICAgICAvLy8KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiIj4KKyAgICAgICAgLy8vIEEgYnVmZmVyIHRvIGNvbXByZXNzLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGF0YSBpbiBjb21wcmVzc2VkIGZvcm08L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIENvbXByZXNzQnVmZmVyKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmVhbSBjb21wcmVzc29yID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFpsaWJTdHJlYW0oIG1zLCBDb21wcmVzc2lvbk1vZGUuQ29tcHJlc3MsIENvbXByZXNzaW9uTGV2ZWwuQmVzdENvbXByZXNzaW9uICk7CisKKyAgICAgICAgICAgICAgICBabGliQmFzZVN0cmVhbS5Db21wcmVzc0J1ZmZlcihiLCBjb21wcmVzc29yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFVuY29tcHJlc3MgYSBaTElCLWNvbXByZXNzZWQgYnl0ZSBhcnJheSBpbnRvIGEgc2luZ2xlIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJabGliU3RyZWFtLkNvbXByZXNzU3RyaW5nKFN0cmluZykiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlpsaWJTdHJlYW0uVW5jb21wcmVzc0J1ZmZlcihieXRlW10pIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbXByZXNzZWQiPgorICAgICAgICAvLy8gICBBIGJ1ZmZlciBjb250YWluaW5nIFpMSUItY29tcHJlc3NlZCBkYXRhLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdW5jb21wcmVzc2VkIHN0cmluZzwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21wcmVzc1N0cmluZyhieXRlW10gY29tcHJlc3NlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBpbnB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oY29tcHJlc3NlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyZWFtIGRlY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBabGliU3RyZWFtKGlucHV0LCBDb21wcmVzc2lvbk1vZGUuRGVjb21wcmVzcyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWmxpYkJhc2VTdHJlYW0uVW5jb21wcmVzc1N0cmluZyhjb21wcmVzc2VkLCBkZWNvbXByZXNzb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIFVuY29tcHJlc3MgYSBaTElCLWNvbXByZXNzZWQgYnl0ZSBhcnJheSBpbnRvIGEgYnl0ZSBhcnJheS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJabGliU3RyZWFtLkNvbXByZXNzQnVmZmVyKGJ5dGVbXSkiLz4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlpsaWJTdHJlYW0uVW5jb21wcmVzc1N0cmluZyhieXRlW10pIi8+CisgICAgICAgIC8vLworICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbXByZXNzZWQiPgorICAgICAgICAvLy8gICBBIGJ1ZmZlciBjb250YWluaW5nIFpMSUItY29tcHJlc3NlZCBkYXRhLgorICAgICAgICAvLy8gPC9wYXJhbT4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGF0YSBpbiB1bmNvbXByZXNzZWQgZm9ybTwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gVW5jb21wcmVzc0J1ZmZlcihieXRlW10gY29tcHJlc3NlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBpbnB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oY29tcHJlc3NlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyZWFtIGRlY29tcHJlc3NvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBabGliU3RyZWFtKCBpbnB1dCwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBabGliQmFzZVN0cmVhbS5VbmNvbXByZXNzQnVmZmVyKGNvbXByZXNzZWQsIGRlY29tcHJlc3Nvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmM4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2UuY3MKQEAgLTAsMCArMSwzNDEgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjUtT2N0LTIwMTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlppcDsKK3VzaW5nIElvbmljLlppcDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhcmdldCBpcyBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgU3lzdGVtLklPLlBhY2thZ2luZy5QYWNrYWdlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gVGFyZ2V0TW9kZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHJlbGF0aW9uc2hpcCByZWZlcmVuY2VzIGEgcGFydCB0aGF0IGlzIGluc2lkZSB0aGUgcGFja2FnZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgSW50ZXJuYWwgPSAwLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcmVsYXRpb25zaGlwIHJlZmVyZW5jZXMgYSByZXNvdXJjZSB0aGF0IGlzIGV4dGVybmFsIHRvIHRoZSBwYWNrYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBFeHRlcm5hbCA9IDEsCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwcmVzZW50IGFuIE9PWE1MIFppcCBwYWNrYWdlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFppcFBhY2thZ2UgOiBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgY2xhc3MgQ29udGVudFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIE5hbWU7CisgICAgICAgICAgICBpbnRlcm5hbCBib29sIElzRXh0ZW5zaW9uOworICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIE1hdGNoOworICAgICAgICAgICAgcHVibGljIENvbnRlbnRUeXBlKHN0cmluZyBuYW1lLCBib29sIGlzRXh0ZW5zaW9uLCBzdHJpbmcgbWF0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgSXNFeHRlbnNpb24gPSBpc0V4dGVuc2lvbjsKKyAgICAgICAgICAgICAgICBNYXRjaCA9IG1hdGNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBaaXBQYWNrYWdlUGFydD4gUGFydHMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFppcFBhY2thZ2VQYXJ0PihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7CisgICAgICAgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBDb250ZW50VHlwZT4gX2NvbnRlbnRUeXBlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgQ29udGVudFR5cGU+KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKTsKKyAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZE5ldygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZE5ldygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb250ZW50VHlwZXMuQWRkKCJ4bWwiLCBuZXcgQ29udGVudFR5cGUoRXhjZWxQYWNrYWdlLnNjaGVtYVhtbEV4dGVuc2lvbiwgdHJ1ZSwgInhtbCIpKTsKKyAgICAgICAgICAgIF9jb250ZW50VHlwZXMuQWRkKCJyZWxzIiwgbmV3IENvbnRlbnRUeXBlKEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxzRXh0ZW5zaW9uLCB0cnVlLCAicmVscyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIFppcFBhY2thZ2UoU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBoYXNDb250ZW50VHlwZVhtbCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsIHx8IHN0cmVhbS5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGROZXcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVscyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1c2luZyAoWmlwSW5wdXRTdHJlYW0gemlwID0gbmV3IFppcElucHV0U3RyZWFtKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHppcC5HZXROZXh0RW50cnkoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuVW5jb21wcmVzc2VkU2l6ZSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBuZXcgYnl0ZVtlLlVuY29tcHJlc3NlZFNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gemlwLlJlYWQoYiwgMCwgKGludCllLlVuY29tcHJlc3NlZFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLkZpbGVOYW1lLkVxdWFscygiW2NvbnRlbnRfdHlwZXNdLnhtbCIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ29udGVudFR5cGVzKEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudFR5cGVYbWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlLkZpbGVOYW1lLkVxdWFscygiX3JlbHMvLnJlbHMiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkUmVsYXRpb24oRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYiksICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuRmlsZU5hbWUuRW5kc1dpdGgoIi5yZWxzIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHMuQWRkKEdldFVyaUtleShlLkZpbGVOYW1lKSwgRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBuZXcgWmlwUGFja2FnZVBhcnQodGhpcywgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LlN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuU3RyZWFtLldyaXRlKGIsIDAsIGIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRzLkFkZChHZXRVcmlLZXkoZS5GaWxlTmFtZSksIHBhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHppcC5HZXROZXh0RW50cnkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwIGluIFBhcnRzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IFBhdGguR2V0RmlsZU5hbWUocC5LZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4dGVuc2lvbiA9IFBhdGguR2V0RXh0ZW5zaW9uKHAuS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZWxGaWxlID0gc3RyaW5nLkZvcm1hdCgiezB9X3JlbHMvezF9LnJlbHMiLCBwLktleS5TdWJzdHJpbmcoMCwgcC5LZXkuTGVuZ3RoIC0gbmFtZS5MZW5ndGgpLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxzLkNvbnRhaW5zS2V5KHJlbEZpbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuVmFsdWUuUmVhZFJlbGF0aW9uKHJlbHNbcmVsRmlsZV0sIHAuVmFsdWUuVXJpLk9yaWdpbmFsU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY29udGVudFR5cGVzLkNvbnRhaW5zS2V5KHAuS2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLlZhbHVlLkNvbnRlbnRUeXBlID0gX2NvbnRlbnRUeXBlc1twLktleV0uTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbi5MZW5ndGggPiAxICYmIF9jb250ZW50VHlwZXMuQ29udGFpbnNLZXkoZXh0ZW5zaW9uLlN1YnN0cmluZygxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5WYWx1ZS5Db250ZW50VHlwZSA9IF9jb250ZW50VHlwZXNbZXh0ZW5zaW9uLlN1YnN0cmluZygxKV0uTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlWG1sKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgYW4gdmFsaWQgUGFja2FnZSBmaWxlLiBJZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIHBsZWFzZSBzdXBwbHkgdGhlIHBhc3N3b3JkIGluIHRoZSBjb25zdHJ1Y3Rvci4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50VHlwZVhtbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlvbigiVGhlIGZpbGUgaXMgbm90IGFuIHZhbGlkIFBhY2thZ2UgZmlsZS4gSWYgdGhlIGZpbGUgaXMgZW5jcnlwdGVkLCBwbGVhc2Ugc3VwcGx5IHRoZSBwYXNzd29yZCBpbiB0aGUgY29uc3RydWN0b3IuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHppcC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRDb250ZW50VHlwZXMoc3RyaW5nIHhtbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRvYyA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKGRvYywgeG1sLCBFbmNvZGluZy5VVEY4KTsKKworICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBjIGluIGRvYy5Eb2N1bWVudEVsZW1lbnQuQ2hpbGROb2RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb250ZW50VHlwZSBjdDsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYy5HZXRBdHRyaWJ1dGUoIkV4dGVuc2lvbiIpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN0ID0gbmV3IENvbnRlbnRUeXBlKGMuR2V0QXR0cmlidXRlKCJDb250ZW50VHlwZSIpLCBmYWxzZSwgYy5HZXRBdHRyaWJ1dGUoIlBhcnROYW1lIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdCA9IG5ldyBDb250ZW50VHlwZShjLkdldEF0dHJpYnV0ZSgiQ29udGVudFR5cGUiKSwgdHJ1ZSwgYy5HZXRBdHRyaWJ1dGUoIkV4dGVuc2lvbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2NvbnRlbnRUeXBlcy5BZGQoR2V0VXJpS2V5KGN0Lk1hdGNoKSwgY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBNZXRob2RzCisgICAgICAgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0IENyZWF0ZVBhcnQoVXJpIHBhcnRVcmksIHN0cmluZyBjb250ZW50VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVBhcnQocGFydFVyaSwgY29udGVudFR5cGUsIENvbXByZXNzaW9uTGV2ZWwuRGVmYXVsdCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQgQ3JlYXRlUGFydChVcmkgcGFydFVyaSwgc3RyaW5nIGNvbnRlbnRUeXBlLCBDb21wcmVzc2lvbkxldmVsIGNvbXByZXNzaW9uTGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChQYXJ0RXhpc3RzKHBhcnRVcmkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGFydCBhbHJlYWR5IGV4aXN0IikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcGFydCA9IG5ldyBaaXBQYWNrYWdlUGFydCh0aGlzLCBwYXJ0VXJpLCBjb250ZW50VHlwZSwgY29tcHJlc3Npb25MZXZlbCk7CisgICAgICAgICAgICBfY29udGVudFR5cGVzLkFkZChHZXRVcmlLZXkocGFydC5VcmkuT3JpZ2luYWxTdHJpbmcpLCBuZXcgQ29udGVudFR5cGUoY29udGVudFR5cGUsIGZhbHNlLCBwYXJ0LlVyaS5PcmlnaW5hbFN0cmluZykpOworICAgICAgICAgICAgUGFydHMuQWRkKEdldFVyaUtleShwYXJ0LlVyaS5PcmlnaW5hbFN0cmluZyksIHBhcnQpOworICAgICAgICAgICAgcmV0dXJuIHBhcnQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQgR2V0UGFydChVcmkgcGFydFVyaSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFBhcnRFeGlzdHMocGFydFVyaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnRzLlNpbmdsZSh4ID0+IHguS2V5LkVxdWFscyhHZXRVcmlLZXkocGFydFVyaS5PcmlnaW5hbFN0cmluZyksU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpLlZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGFydCBkb2VzIG5vdCBleGlzdC4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0VXJpS2V5KHN0cmluZyB1cmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXQgPSB1cmk7CisgICAgICAgICAgICBpZiAocmV0WzBdICE9ICcvJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSAiLyIgKyByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgUGFydEV4aXN0cyhVcmkgcGFydFVyaSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHVyaUtleSA9IEdldFVyaUtleShwYXJ0VXJpLk9yaWdpbmFsU3RyaW5nLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgcmV0dXJuIFBhcnRzLktleXMuQW55KHggPT4geC5FcXVhbHModXJpS2V5LCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIGludGVybmFsIHZvaWQgRGVsZXRlUGFydChVcmkgVXJpKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGVsTGlzdD1uZXcgTGlzdDxvYmplY3RbXT4oKTsgCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcCBpbiBQYXJ0cy5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHIgaW4gcC5HZXRSZWxhdGlvbnNoaXBzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHAuVXJpLCByLlRhcmdldFVyaSkuT3JpZ2luYWxTdHJpbmcuRXF1YWxzKFVyaS5PcmlnaW5hbFN0cmluZywgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbExpc3QuQWRkKG5ldyBvYmplY3RbXXtyLklkLCBwfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgbyBpbiBkZWxMaXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgoWmlwUGFja2FnZVBhcnQpb1sxXSkuRGVsZXRlUmVsYXRpb25zaGlwKG9bMF0uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcmVscyA9IEdldFBhcnQoVXJpKS5HZXRSZWxhdGlvbnNoaXBzKCk7CisgICAgICAgICAgICB3aGlsZSAocmVscy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVscy5SZW1vdmUocmVscy5GaXJzdCgpLklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbHM9bnVsbDsKKyAgICAgICAgICAgIF9jb250ZW50VHlwZXMuUmVtb3ZlKEdldFVyaUtleShVcmkuT3JpZ2luYWxTdHJpbmcpKTsKKyAgICAgICAgICAgIC8vcmVtb3ZlIGFsbCByZWxhdGlvbnMKKyAgICAgICAgICAgIFBhcnRzLlJlbW92ZShHZXRVcmlLZXkoVXJpLk9yaWdpbmFsU3RyaW5nKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIFNhdmUoU3RyZWFtIHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVuYyA9IEVuY29kaW5nLlVURjg7CisgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKHN0cmVhbSwgdHJ1ZSk7CisgICAgICAgICAgICBvcy5Db21wcmVzc2lvbkxldmVsID0gKE9mZmljZU9wZW5YbWwuUGFja2FnaW5nLklvbmljLlpsaWIuQ29tcHJlc3Npb25MZXZlbClfY29tcHJlc3Npb247ICAgICAgICAgICAgCisgICAgICAgICAgICAvKioqKiBDb250ZW50VHlwZSoqKiovCisgICAgICAgICAgICB2YXIgZW50cnkgPSBvcy5QdXROZXh0RW50cnkoIltDb250ZW50X1R5cGVzXS54bWwiKTsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gZW5jLkdldEJ5dGVzKEdldENvbnRlbnRUeXBlWG1sKCkpOworICAgICAgICAgICAgb3MuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOworICAgICAgICAgICAgLyoqKiogVG9wIFJlbHMgKioqKi8KKyAgICAgICAgICAgIF9yZWxzLldyaXRlWmlwKG9zLCAiX3JlbHNcXC5yZWxzIik7CisgICAgICAgICAgICBaaXBQYWNrYWdlUGFydCBzc1BhcnQ9bnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2godmFyIHBhcnQgaW4gUGFydHMuVmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LkNvbnRlbnRUeXBlICE9IEV4Y2VsUGFja2FnZS5jb250ZW50VHlwZVNoYXJlZFN0cmluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcnQuV3JpdGVaaXAob3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzc1BhcnQgPSBwYXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU2hhcmVkIHN0cmluZ3MgbXVzdCBiZSBzYXZlZCBhZnRlciBhbGwgd29ya3NoZWV0cy4gVGhlIHNzIGRpY3Rpb25hcnkgaXMgcG9wdWxhdGVkIHdoZW4gdGhhdCB3b3JraGVldHMgYXJlIHNhdmVkICh0byBnZXQgdGhlIGJlc3QgcGVyZm9ybWFuY2UpLgorICAgICAgICAgICAgaWYgKHNzUGFydCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzUGFydC5Xcml0ZVppcChvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcy5GbHVzaCgpOworICAgICAgICAgICAgb3MuQ2xvc2UoKTsKKyAgICAgICAgICAgIG9zLkRpc3Bvc2UoKTsgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvL3JldHVybiBtczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldENvbnRlbnRUeXBlWG1sKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PjxUeXBlcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlc1wiPiIpOworICAgICAgICAgICAgZm9yZWFjaCAoQ29udGVudFR5cGUgY3QgaW4gX2NvbnRlbnRUeXBlcy5WYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGN0LklzRXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPERlZmF1bHQgQ29udGVudFR5cGU9XCJ7MH1cIiBFeHRlbnNpb249XCJ7MX1cIi8+IiwgY3QuTmFtZSwgY3QuTWF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8T3ZlcnJpZGUgQ29udGVudFR5cGU9XCJ7MH1cIiBQYXJ0TmFtZT1cInsxfVwiIC8+IiwgY3QuTmFtZSwgR2V0VXJpS2V5KGN0Lk1hdGNoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeG1sLkFwcGVuZCgiPC9UeXBlcz4iKTsKKyAgICAgICAgICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIENvbXByZXNzaW9uTGV2ZWwgX2NvbXByZXNzaW9uID0gQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0OworICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25MZXZlbCBDb21wcmVzc2lvbiAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29tcHJlc3Npb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiBQYXJ0cy5WYWx1ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5Db21wcmVzc2lvbkxldmVsID09IF9jb21wcmVzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5Db21wcmVzc2lvbkxldmVsID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2NvbXByZXNzaW9uID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VQYXJ0LmNzIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUGFydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQ1YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUGFydC5jcwpAQCAtMCwwICsxLDE3MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNS1PY3QtMjAxMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXA7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZworeworICAgIGludGVybmFsIGNsYXNzIFppcFBhY2thZ2VQYXJ0IDogWmlwUGFja2FnZVJlbGF0aW9uc2hpcEJhc2UsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBpbnRlcm5hbCBkZWxlZ2F0ZSB2b2lkIFNhdmVIYW5kbGVyRGVsZWdhdGUoWmlwT3V0cHV0U3RyZWFtIHN0cmVhbSwgQ29tcHJlc3Npb25MZXZlbCBjb21wcmVzc2lvbkxldmVsLCBzdHJpbmcgZmlsZU5hbWUpOworCisgICAgICAgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0KFppcFBhY2thZ2UgcGFja2FnZSwgWmlwRW50cnkgZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhY2thZ2UgPSBwYWNrYWdlOworICAgICAgICAgICAgRW50cnkgPSBlbnRyeTsKKyAgICAgICAgICAgIFNhdmVIYW5kbGVyID0gbnVsbDsKKyAgICAgICAgICAgIFVyaSA9IG5ldyBVcmkocGFja2FnZS5HZXRVcmlLZXkoZW50cnkuRmlsZU5hbWUpLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUGFydChaaXBQYWNrYWdlIHBhY2thZ2UsIFVyaSBwYXJ0VXJpLCBzdHJpbmcgY29udGVudFR5cGUsIENvbXByZXNzaW9uTGV2ZWwgY29tcHJlc3Npb25MZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgUGFja2FnZSA9IHBhY2thZ2U7CisgICAgICAgICAgICAvL0VudHJ5ID0gbmV3IFppcEVudHJ5KCk7CisgICAgICAgICAgICAvL0VudHJ5LkZpbGVOYW1lID0gcGFydFVyaS5PcmlnaW5hbFN0cmluZy5SZXBsYWNlKCcvJywnXFwnKTsKKyAgICAgICAgICAgIFVyaSA9IHBhcnRVcmk7CisgICAgICAgICAgICBDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgICAgICAgICAgQ29tcHJlc3Npb25MZXZlbCA9IGNvbXByZXNzaW9uTGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZSBQYWNrYWdlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgWmlwRW50cnkgRW50cnkgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uTGV2ZWw7CisgICAgICAgIE1lbW9yeVN0cmVhbSBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIENyZWF0ZVJlbGF0aW9uc2hpcChVcmkgdGFyZ2V0VXJpLCBUYXJnZXRNb2RlIHRhcmdldE1vZGUsIHN0cmluZyByZWxhdGlvbnNoaXBUeXBlKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHZhciByZWwgPSBiYXNlLkNyZWF0ZVJlbGF0aW9uc2hpcCh0YXJnZXRVcmksIHRhcmdldE1vZGUsIHJlbGF0aW9uc2hpcFR5cGUpOworICAgICAgICAgICAgcmVsLlNvdXJjZVVyaSA9IFVyaTsKKyAgICAgICAgICAgIHJldHVybiByZWw7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIEdldFN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRTdHJlYW0oRmlsZU1vZGUuT3Blbk9yQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIEdldFN0cmVhbShGaWxlTW9kZSBmaWxlTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBNZW1vcnlTdHJlYW0gR2V0U3RyZWFtKEZpbGVNb2RlIGZpbGVNb2RlLCBGaWxlQWNjZXNzIGZpbGVBY2Nlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwgfHwgZmlsZU1vZGUgPT0gRmlsZU1vZGUuQ3JlYXRlTmV3IHx8IGZpbGVNb2RlID09IEZpbGVNb2RlLkNyZWF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBfY29udGVudFR5cGUgPSAiIjsKKyAgICAgICAgcHVibGljIHN0cmluZyBDb250ZW50VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRlbnRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShfY29udGVudFR5cGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFBhY2thZ2UuX2NvbnRlbnRUeXBlcy5Db250YWluc0tleShQYWNrYWdlLkdldFVyaUtleShVcmkuT3JpZ2luYWxTdHJpbmcpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZS5fY29udGVudFR5cGVzLlJlbW92ZShQYWNrYWdlLkdldFVyaUtleShVcmkuT3JpZ2luYWxTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UuX2NvbnRlbnRUeXBlcy5BZGQoUGFja2FnZS5HZXRVcmlLZXkoVXJpLk9yaWdpbmFsU3RyaW5nKSwgbmV3IFppcFBhY2thZ2UuQ29udGVudFR5cGUodmFsdWUsIGZhbHNlLCBVcmkuT3JpZ2luYWxTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfY29udGVudFR5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVXJpIFVyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgcHVibGljIFN0cmVhbSBHZXRaaXBTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG1zKTsKKyAgICAgICAgICAgIHJldHVybiBvczsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBTYXZlSGFuZGxlckRlbGVnYXRlIFNhdmVIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIFdyaXRlWmlwKFppcE91dHB1dFN0cmVhbSBvcykKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGI7CisgICAgICAgICAgICBpZiAoU2F2ZUhhbmRsZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gR2V0U3RyZWFtKCkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIGlmIChiLkxlbmd0aCA9PSAwKSAgIC8vTWFrZSBzdXJlIHRoZSBmaWxlIGlzbid0IGVtcHR5LiBEb3ROZXRaaXAgc3RyZWFtcyBkb2VzIG5vdCBzZWVtcyB0byBoYW5kbGUgemVybyBzaXplZCBmaWxlcy4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3MuQ29tcHJlc3Npb25MZXZlbCA9IChPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliLkNvbXByZXNzaW9uTGV2ZWwpQ29tcHJlc3Npb25MZXZlbDsKKyAgICAgICAgICAgICAgICBvcy5QdXROZXh0RW50cnkoVXJpLk9yaWdpbmFsU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBvcy5Xcml0ZShiLCAwLCBiLkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2F2ZUhhbmRsZXIob3MsIChDb21wcmVzc2lvbkxldmVsKUNvbXByZXNzaW9uTGV2ZWwsIFVyaS5PcmlnaW5hbFN0cmluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfcmVscy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGYgPSBVcmkuT3JpZ2luYWxTdHJpbmc7CisgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBQYXRoLkdldEZpbGVOYW1lKGYpOworICAgICAgICAgICAgICAgIF9yZWxzLldyaXRlWmlwKG9zLCAoc3RyaW5nLkZvcm1hdCgiezB9X3JlbHMvezF9LnJlbHMiLCBmLlN1YnN0cmluZygwLCBmLkxlbmd0aCAtIG5hbWUuTGVuZ3RoKSwgbmFtZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBudWxsOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3N0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgX3N0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXAuY3MgYi9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwNGEyOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcC5jcwpAQCAtMCwwICsxLDUwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI1LU9jdC0yMDEyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nCit7CisgICAgcHVibGljIGNsYXNzIFppcFBhY2thZ2VSZWxhdGlvbnNoaXAKKyAgICB7CisgICAgICAgIHB1YmxpYyBVcmkgVGFyZ2V0VXJpIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVXJpIFNvdXJjZVVyaSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBSZWxhdGlvbnNoaXBUeXBlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVGFyZ2V0TW9kZSBUYXJnZXRNb2RlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIElkIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXBCYXNlLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI2OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZS5jcwpAQCAtMCwwICsxLDEzMSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNS1PY3QtMjAxMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBJb25pYy5aaXA7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYjsKK3VzaW5nIFN5c3RlbS5XZWI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcKK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWmlwUGFja2FnZVJlbGF0aW9uc2hpcEJhc2UKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBfcmVscyA9IG5ldyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbigpOworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgCisgICAgICAgIGludCBtYXhSSWQgPSAxOworICAgICAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZVJlbGF0aW9uc2hpcChzdHJpbmcgaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZWxzLlJlbW92ZShpZCk7CisgICAgICAgICAgICBVcGRhdGVNYXhSSWQoaWQsIHJlZiBtYXhSSWQpOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFVwZGF0ZU1heFJJZChzdHJpbmcgaWQsIHJlZiBpbnQgbWF4UklkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWQuU3RhcnRzV2l0aCgicklkIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKGlkLlN1YnN0cmluZygzKSwgb3V0IG51bSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobnVtID09IG1heFJJZCAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJJZC0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZpcnR1YWwgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBDcmVhdGVSZWxhdGlvbnNoaXAoVXJpIHRhcmdldFVyaSwgVGFyZ2V0TW9kZSB0YXJnZXRNb2RlLCBzdHJpbmcgcmVsYXRpb25zaGlwVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlbCA9IG5ldyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwKCk7CisgICAgICAgICAgICByZWwuVGFyZ2V0VXJpID0gdGFyZ2V0VXJpOworICAgICAgICAgICAgcmVsLlRhcmdldE1vZGUgPSB0YXJnZXRNb2RlOworICAgICAgICAgICAgcmVsLlJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXBUeXBlOworICAgICAgICAgICAgcmVsLklkID0gInJJZCIgKyAobWF4UklkKyspLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBfcmVscy5BZGQocmVsKTsKKyAgICAgICAgICAgIHJldHVybiByZWw7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBSZWxhdGlvbnNoaXBFeGlzdHMoc3RyaW5nIGlkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3JlbHMuQ29udGFpbnNLZXkoaWQpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uIEdldFJlbGF0aW9uc2hpcHNCeVR5cGUoc3RyaW5nIHNjaGVtYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9yZWxzLkdldFJlbGF0aW9uc2hpcHNCeVR5cGUoc2NoZW1hKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBHZXRSZWxhdGlvbnNoaXBzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9yZWxzOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXAgR2V0UmVsYXRpb25zaGlwKHN0cmluZyBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9yZWxzW2lkXTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIFJlYWRSZWxhdGlvbihzdHJpbmcgeG1sLCBzdHJpbmcgc291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoZG9jLCB4bWwsIEVuY29kaW5nLlVURjgpOworCisgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IGMgaW4gZG9jLkRvY3VtZW50RWxlbWVudC5DaGlsZE5vZGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZWwgPSBuZXcgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCgpOworICAgICAgICAgICAgICAgIHJlbC5JZCA9IGMuR2V0QXR0cmlidXRlKCJJZCIpOworICAgICAgICAgICAgICAgIHJlbC5SZWxhdGlvbnNoaXBUeXBlID0gYy5HZXRBdHRyaWJ1dGUoIlR5cGUiKTsKKyAgICAgICAgICAgICAgICByZWwuVGFyZ2V0TW9kZSA9IGMuR2V0QXR0cmlidXRlKCJUYXJnZXRNb2RlIikuRXF1YWxzKCJleHRlcm5hbCIsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkgPyBUYXJnZXRNb2RlLkV4dGVybmFsIDogVGFyZ2V0TW9kZS5JbnRlcm5hbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlbC5UYXJnZXRVcmkgPSBuZXcgVXJpKGMuR2V0QXR0cmlidXRlKCJUYXJnZXQiKSwgVXJpS2luZC5SZWxhdGl2ZU9yQWJzb2x1dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UaGUgVVJJIGlzIG5vdCBhIHZhbGlkIFVSSS4gRW5jb2RlIGl0IHRvIG1ha2UgaSB2YWxpZC4KKyAgICAgICAgICAgICAgICAgICAgcmVsLlRhcmdldFVyaSA9IG5ldyBVcmkoVXJpLkVzY2FwZVVyaVN0cmluZygiSW52YWxpZDpVUkkgIitjLkdldEF0dHJpYnV0ZSgiVGFyZ2V0IikpLCBVcmlLaW5kLlJlbGF0aXZlT3JBYnNvbHV0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc291cmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlbC5Tb3VyY2VVcmkgPSBuZXcgVXJpKHNvdXJjZSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWwuSWQuU3RhcnRzV2l0aCgicmlkIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocmVsLklkLlN1YnN0cmluZygzKSwgb3V0IGlkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IG1heFJJZCAmJiBpZCA8IGludC5NYXhWYWx1ZSAtIDEwMDAwKSAvL05vdCBsaWtseSB0byBoYXZlIHRoaXMgaGlnaCBpZCdzIGJ1dCBtYWtlIHN1cmUgd2UgaGF2ZSBzcGFjZSB0byBhdm9pZCBvdmVyZmxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSSWQgPSBpZCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX3JlbHMuQWRkKHJlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxY2U4NgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwxMDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjUtT2N0LTIwMTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgSW9uaWMuWmlwOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5OwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcKK3sKKyAgICBwdWJsaWMgY2xhc3MgWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxaaXBQYWNrYWdlUmVsYXRpb25zaGlwPgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgcHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwPiBfcmVscyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgWmlwUGFja2FnZVJlbGF0aW9uc2hpcD4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOworICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZChaaXBQYWNrYWdlUmVsYXRpb25zaGlwIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZWxzLkFkZChpdGVtLklkLCBpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8WmlwUGFja2FnZVJlbGF0aW9uc2hpcD4gR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVscy5WYWx1ZXMuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9yZWxzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZShzdHJpbmcgaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZWxzLlJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBDb250YWluc0tleShzdHJpbmcgaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfcmVscy5Db250YWluc0tleShpZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCB0aGlzW3N0cmluZyBpZF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWxzW2lkXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBHZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHN0cmluZyByZWxhdGlvbnNoaXBUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmVsIGluIF9yZWxzLlZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVsLlJlbGF0aW9uc2hpcFR5cGUgPT0gcmVsYXRpb25zaGlwVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldC5BZGQocmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBXcml0ZVppcChaaXBPdXRwdXRTdHJlYW0gb3MsIHN0cmluZyBmaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzXCI+Iik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmVsIGluIF9yZWxzLlZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8UmVsYXRpb25zaGlwIElkPVwiezB9XCIgVHlwZT1cInsxfVwiIFRhcmdldD1cInsyfVwiezN9Lz4iLCBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKHJlbC5JZCksIHJlbC5SZWxhdGlvbnNoaXBUeXBlLCBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKHJlbC5UYXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcpLCByZWwuVGFyZ2V0TW9kZSA9PSBUYXJnZXRNb2RlLkV4dGVybmFsID8gIiBUYXJnZXRNb2RlPVwiRXh0ZXJuYWxcIiIgOiAiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4bWwuQXBwZW5kKCI8L1JlbGF0aW9uc2hpcHM+Iik7CisKKyAgICAgICAgICAgIG9zLlB1dE5leHRFbnRyeShmaWxlTmFtZSk7CisgICAgICAgICAgICBieXRlW10gYiA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoeG1sLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgb3MuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3JlbHMuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9FUFBsdXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiMzJhZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDY1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTEwLVNFUC0yMDA5CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5OworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRVBQbHVzIDQuMC40IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkFsbG93cyBFeGNlbCBmaWxlcyh4bHN4O3hsc20pIHRvIGJlIGNyZWF0ZWQgb24gdGhlIHNlcnZlci4gU2VlIGVwcGx1cy5jb2RlcGxleC5jb20iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJFUFBsdXMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFUFBsdXMgNC4wLjQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCAyMDA5LSDCqUphbiBLw6RsbG1hbi4gUGFydHMgb2YgdGhlIEludGVyZmFjZSBjb21lcyBmcm9tIEV4Y2VsUGFja2FnZS1wcm9qZWN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCJUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KK1thc3NlbWJseTogSW50ZXJuYWxzVmlzaWJsZVRvKCJFUFBsdXNUZXN0LCBQdWJsaWNLZXk9MDAyNDAwMDAwNDgwMDAwMDk0MDAwMDAwMDYwMjAwMDAwMDI0MDAwMDUyNTM0MTMxMDAwNDAwMDAwMTAwMDEwMDFkZDExMzA4ZWM5M2E2ZWJjZWM3MjdlMTgzYTg5NzJkYzZmOTVjMjNlY2MzNGFhMDRmNDBjYmZjOWMxN2IwOGI0YTBlYTVjMDBkY2QyMDNiYWNlNDRkMTVhMzBjZTg3OTZlMzgxNzZhZTg4ZTk2MGNlZmY5Y2M0MzlhYjkzODczOGJhMGU2MDNlM2QxNTVmYzI5ODc5OWIzOTFjMDA0ZmMwZWI0MzkzZGQyNTRjZTI1ZGIzNDFlYjQzMzAzZTRjNDg4Yzk1MDBlMTI2ZjEyODg1OTRmMDcxMGVjN2Q2NDJlOWM3MmU3NmRkODYwNjQ5ZjFjNDgyNDljMDBlMzFmYmEiKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjlkZDQzYjhkLWM0ZmUtNGE4Yi1hZDZlLTQ3ZWY4M2JiYmIwMSIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiNC4wLjQuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCI0LjAuNC4wIildCitbYXNzZW1ibHk6IEFsbG93UGFydGlhbGx5VHJ1c3RlZENhbGxlcnNdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1JhbmdlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9SYW5nZUNvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzNDQzZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9SYW5nZUNvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwzMzcgQEAKK++7vworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEwLTAyLTA0CisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbDtuYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBpcyB0aGUgc3RvcmUgZm9yIGFsbCBSb3dzLCBDb2x1bW5zIGFuZCBDZWxscy4KKyAgICAvLy8gSXQgaXMgYSBEaWN0aW9uYXJ5IGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIEtleSAodGhlIFJvd0lELCBDb2x1bW5JRCBvciBDZWxsSUQgKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgY2xhc3MgUmFuZ2VDb2xsZWN0aW9uIDogSUVudW1lcmF0b3I8SVJhbmdlSUQ+LCBJRW51bWVyYWJsZSwgSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgY2xhc3MgSW5kZXhJdGVtCisgICAgICAgIHsKKyAgICAgICAgICAgIGludGVybmFsIEluZGV4SXRlbSh1bG9uZyBjZWxsSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmFuZ2VJRCA9IGNlbGxJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIEluZGV4SXRlbSh1bG9uZyBjZWxsSWQsIGludCBsaXN0UG9pbnRlcikKKwkgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSYW5nZUlEID0gY2VsbElkOworICAgICAgICAgICAgICAgIExpc3RQb2ludGVyPWxpc3RQb2ludGVyOworCSAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgdWxvbmcgUmFuZ2VJRDsKKyAgICAgICAgICAgIGludGVybmFsIGludCBMaXN0UG9pbnRlcjsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21wYXJlcyBhbiBJbmRleEl0ZW0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgY2xhc3MgQ29tcGFyZSA6IElDb21wYXJlcjxJbmRleEl0ZW0+CisgICAgICAgIHsKKyAgICAgICAgICAgICNyZWdpb24gSUNvbXBhcmVyPEluZGV4SXRlbT4gTWVtYmVycworICAgICAgICAgICAgaW50IElDb21wYXJlcjxJbmRleEl0ZW0+LkNvbXBhcmUoSW5kZXhJdGVtIHgsIEluZGV4SXRlbSB5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB4LlJhbmdlSUQgPCB5LlJhbmdlSUQgPyAtMSA6IHguUmFuZ2VJRCA+IHkuUmFuZ2VJRCA/IDEgOiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKyAgICAgICAgSW5kZXhJdGVtW10gX2NlbGxJbmRleDsKKyAgICAgICAgTGlzdDxJUmFuZ2VJRD4gX2NlbGxzOworICAgICAgICBzdGF0aWMgcmVhZG9ubHkgQ29tcGFyZSBfY29tcGFyZXI9bmV3IENvbXBhcmUoKTsgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlbGxzIj5UaGUgQ2VsbHMuIFRoaXMgbGlzdCBtdXN0IGJlIHNvcnRlZDwvcGFyYW0+CisgICAgICAgIGludGVybmFsIFJhbmdlQ29sbGVjdGlvbihMaXN0PElSYW5nZUlEPiBjZWxscykKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgX2NlbGxzID0gY2VsbHM7CisgICAgICAgICAgICBJbml0U2l6ZShfY2VsbHMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfY2VsbHMuQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2VsbEluZGV4W2ldID0gbmV3IEluZGV4SXRlbShjZWxsc1tpXS5SYW5nZUlELCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB+UmFuZ2VDb2xsZWN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NlbGxzID0gbnVsbDsKKyAgICAgICAgICAgIF9jZWxsSW5kZXggPSBudWxsOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybiB0aGUgaXRlbSB3aXRoIHRoZSBSYW5nZUlECisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUmFuZ2VJRCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgSVJhbmdlSUQgdGhpc1t1bG9uZyBSYW5nZUlEXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NlbGxzW19jZWxsSW5kZXhbSW5kZXhPZihSYW5nZUlEKV0uTGlzdFBvaW50ZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybiBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgc29ydGVkIGxpc3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgSVJhbmdlSUQgdGhpc1tpbnQgSW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2VsbHNbX2NlbGxJbmRleFtJbmRleF0uTGlzdFBvaW50ZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NlbGxzLkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgQWRkKElSYW5nZUlEIGNlbGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpeCA9IEluZGV4T2YoY2VsbC5SYW5nZUlEKTsKKyAgICAgICAgICAgIGlmIChpeCA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJdGVtIGFscmVhZHkgZXhpc3RzIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5zZXJ0KH5peCwgY2VsbCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBEZWxldGUodWxvbmcga2V5KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaXggPSBJbmRleE9mKGtleSk7CisgICAgICAgICAgICBpZiAoaXggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJLZXkgZG9lcyBub3QgZXhpc3RzIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxpc3RQb2ludGVyID0gX2NlbGxJbmRleFtpeF0uTGlzdFBvaW50ZXI7CisgICAgICAgICAgICBBcnJheS5Db3B5KF9jZWxsSW5kZXgsIGl4ICsgMSwgX2NlbGxJbmRleCwgaXgsIF9jZWxscy5Db3VudCAtIGl4IC0gMSk7CisgICAgICAgICAgICBfY2VsbHMuUmVtb3ZlQXQobGlzdFBvaW50ZXIpOworCisgICAgICAgICAgICAvL0l0ZW0gaXMgcmVtb3ZlZCBzdWJ0cmFjdCBvbmUgZnJvbSBhbGwgaXRlbXMgd2l0aCBncmVhdGVyIExpc3RQb2ludGVyCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY2VsbEluZGV4W2ldLkxpc3RQb2ludGVyID49IGxpc3RQb2ludGVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NlbGxJbmRleFtpXS5MaXN0UG9pbnRlci0tOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBJbmRleE9mKHVsb25nIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5LkJpbmFyeVNlYXJjaDxJbmRleEl0ZW0+KF9jZWxsSW5kZXgsIDAsIF9jZWxscy5Db3VudCwgbmV3IEluZGV4SXRlbShrZXkpLCBfY29tcGFyZXIpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgQ29udGFpbnNLZXkodWxvbmcga2V5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5kZXhPZihrZXkpIDwgMCA/IGZhbHNlIDogdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgX3NpemUgeyBnZXQ7IHNldDsgfQorICAgICAgICAjcmVnaW9uICJSYW5nZUlEIG1hbmlwdWxhdGlvbiBtZXRob2RzIgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnNlcnQgYSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29sbGVjaW9uIGJ1dCBkb250IHVwZGF0ZSB0aGUgY2VsbCBvbmx5IHRoZSBpbmRleAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0lEIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5JbmRleCBvZiBmaXJzdCByYW5nZUl0ZW08L3JldHVybnM+CisgICAgICAgIGludGVybmFsIGludCBJbnNlcnRSb3dzVXBkYXRlSW5kZXgodWxvbmcgcm93SUQsIGludCByb3dzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleE9mKHJvd0lEKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4OyAvL05vIG1hdGNoIGZvdW5kIGludmVydCB0byBnZXQgc3RhcnQgY2VsbAorICAgICAgICAgICAgdWxvbmcgcm93QWRkID0gKCgodWxvbmcpcm93cykgPDwgMjkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgX2NlbGxzLkNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NlbGxJbmRleFtpXS5SYW5nZUlEICs9IHJvd0FkZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnNlcnQgYSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29sbGVjaW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93SUQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPkluZGV4IG9mIGZpcnN0IHJhbmdlSXRlbTwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgaW50IEluc2VydFJvd3ModWxvbmcgcm93SUQsIGludCByb3dzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleE9mKHJvd0lEKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4OyAvL05vIG1hdGNoIGZvdW5kIGludmVydCB0byBnZXQgc3RhcnQgY2VsbAorICAgICAgICAgICAgdWxvbmcgcm93QWRkPSgoKHVsb25nKXJvd3MpIDw8IDI5KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jZWxsSW5kZXhbaV0uUmFuZ2VJRCArPSByb3dBZGQ7CisgICAgICAgICAgICAgICAgX2NlbGxzW19jZWxsSW5kZXhbaV0uTGlzdFBvaW50ZXJdLlJhbmdlSUQgKz0gcm93QWRkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlbGV0ZSByb3dzIGZyb20gdGhlIGNvbGxlY2lvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0lEIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXBkYXRlQ2VsbHMiPlVwZGF0ZSByYW5nZSBpZCdzIG9uIGNlbGxzPC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgaW50IERlbGV0ZVJvd3ModWxvbmcgcm93SUQsIGludCByb3dzLCBib29sIHVwZGF0ZUNlbGxzKQorICAgICAgICB7CisgICAgICAgICAgICB1bG9uZyByb3dBZGQgPSAoKCh1bG9uZylyb3dzKSA8PCAyOSk7CisgICAgICAgICAgICB2YXIgaW5kZXggPSBJbmRleE9mKHJvd0lEKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4OyAvL05vIG1hdGNoIGZvdW5kIGludmVydCB0byBnZXQgc3RhcnQgY2VsbAorCisgICAgICAgICAgICBpZiAoaW5kZXggPj0gX2NlbGxzLkNvdW50IHx8IF9jZWxsSW5kZXhbaW5kZXhdID09IG51bGwpIHJldHVybiAtMTsgICAvL05vIHJvdyBhYm92ZSB0aGlzIHJvdworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgX2NlbGxzLkNvdW50ICYmIF9jZWxsSW5kZXhbaW5kZXhdLlJhbmdlSUQgPCByb3dJRCArIHJvd0FkZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWxldGUoX2NlbGxJbmRleFtpbmRleF0uUmFuZ2VJRCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB1cGRJbmRleCA9IEluZGV4T2Yocm93SUQgKyByb3dBZGQpOworICAgICAgICAgICAgaWYgKHVwZEluZGV4IDwgMCkgdXBkSW5kZXggPSB+dXBkSW5kZXg7IC8vTm8gbWF0Y2ggZm91bmQgaW52ZXJ0IHRvIGdldCBzdGFydCBjZWxsCisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB1cGRJbmRleDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jZWxsSW5kZXhbaV0uUmFuZ2VJRCAtPSByb3dBZGQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGFuZ2UgdGhlIGluZGV4CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUNlbGxzKSBfY2VsbHNbX2NlbGxJbmRleFtpXS5MaXN0UG9pbnRlcl0uUmFuZ2VJRCAtPSByb3dBZGQ7ICAgIC8vQ2hhbmdlIHRoZSBjZWxsL3JvdyBvciBjb2x1bW4gb2JqZWN0CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBJbnNlcnRDb2x1bW4odWxvbmcgQ29sdW1uSUQsIGludCBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiV29ya2luZyBvbiBpdC4uLiIpKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZUNvbHVtbih1bG9uZyBDb2x1bW5JRCxpbnQgY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIldvcmtpbmcgb24gaXQuLi4iKSk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uICJQcml2YXRlIE1ldGhvZHMiCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXQgdGhlIHNpemUgc3RhcnRpbmcgZnJvbSAxMjggaXRlbXMuIERvdWJsZSB0aGUgc2l6ZSB1bnRpbCB0aGUgbGlzdCBmaXRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Il9jZWxscyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTaXplKExpc3Q8SVJhbmdlSUQ+IF9jZWxscykKKyAgICAgICAgeworICAgICAgICAgICAgX3NpemUgPSAxMjg7CisgICAgICAgICAgICB3aGlsZSAoX2NlbGxzLkNvdW50ID4gX3NpemUpIF9zaXplIDw8PSAxOworICAgICAgICAgICAgX2NlbGxJbmRleCA9IG5ldyBJbmRleEl0ZW1bX3NpemVdOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENoZWNrIHRoZSBzaXplIGFuZCBkb3VibGUgdGhlIHNpemUgaWYgb3V0IG9mIGJvdW5kCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja1NpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NlbGxzLkNvdW50ID49IF9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zaXplIDw8PSAxOworICAgICAgICAgICAgICAgIEFycmF5LlJlc2l6ZShyZWYgX2NlbGxJbmRleCwgX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBJbnNlcnQoaW50IGl4LCBJUmFuZ2VJRCBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja1NpemUoKTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoX2NlbGxJbmRleCwgaXgsIF9jZWxsSW5kZXgsIGl4ICsgMSwgX2NlbGxzLkNvdW50IC0gaXgpOworICAgICAgICAgICAgX2NlbGxJbmRleFtpeF0gPSBuZXcgSW5kZXhJdGVtKGNlbGwuUmFuZ2VJRCwgX2NlbGxzLkNvdW50KTsKKyAgICAgICAgICAgIF9jZWxscy5BZGQoY2VsbCk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3I8SVJhbmdlSUQ+IE1lbWJlcnMKKworICAgICAgICBJUmFuZ2VJRCBJRW51bWVyYXRvcjxJUmFuZ2VJRD4uQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSURpc3Bvc2FibGUgZm9yIHRoZSBlbnVtZXJhdG9yIE1lbWJlcnMKKworICAgICAgICB2b2lkIElEaXNwb3NhYmxlLkRpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBfaXggPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElFbnVtZXJhdG9yIE1lbWJlcnMKKyAgICAgICAgaW50IF9peCA9IC0xOworICAgICAgICBvYmplY3QgSUVudW1lcmF0b3IuQ3VycmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsc1tfY2VsbEluZGV4W19peF0uTGlzdFBvaW50ZXJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBJRW51bWVyYXRvci5Nb3ZlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgX2l4Kys7CisgICAgICAgICAgIHJldHVybiBfaXggPCBfY2VsbHMuQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIElFbnVtZXJhdG9yLlJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2l4ID0gLTE7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCisKKyAgICAgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLk1lbWJlcndpc2VDbG9uZSgpIGFzIElFbnVtZXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9EeGYvRHhmU3R5bGVCYXNlLmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9EeGZTdHlsZUJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhYTZiZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRHhmU3R5bGVCYXNlLmNzCkBAIC0wLDAgKzEsOTggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmCit7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIER4ZlN0eWxlQmFzZTxUPgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VsU3R5bGVzIF9zdHlsZXM7CisgICAgICAgIGludGVybmFsIER4ZlN0eWxlQmFzZShFeGNlbFN0eWxlcyBzdHlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdHlsZXMgPSBzdHlsZXM7CisgICAgICAgICAgICBBbGxvd0NoYW5nZSA9IGZhbHNlOyAvL0Rvbid0IHRvdWNoIHRoaXMgdmFsdWUgaW4gdGhlIHN0eWxlcy54bWwgKGJ5IGRlZmF1bHQpLiBXaGVuIER4ZnMgaXMgZnVsbHkgaW1wbGVtZW50ZWQgdGhpcyBjYW4gYmUgcmVtb3ZlZC4KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgYWJzdHJhY3Qgc3RyaW5nIElkIHsgZ2V0OyB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBhYnN0cmFjdCBib29sIEhhc1ZhbHVle2dldDt9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBhYnN0cmFjdCB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKTsKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGFic3RyYWN0IFQgQ2xvbmUoKTsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgU2V0VmFsdWVDb2xvcihYbWxIZWxwZXIgaGVscGVyLHN0cmluZyBwYXRoLCBFeGNlbER4ZkNvbG9yIGNvbG9yKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvci5IYXNWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3IuQ29sb3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFZhbHVlKGhlbHBlciwgcGF0aCArICIvQHJnYiIsIGNvbG9yLkNvbG9yLlZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJ4IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvci5BdXRvICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZUJvb2woaGVscGVyLCBwYXRoICsgIi9AYXV0byIsIGNvbG9yLkF1dG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvci5UaGVtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AdGhlbWUiLCBjb2xvci5UaGVtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yLkluZGV4ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZShoZWxwZXIsIHBhdGggKyAiL0BpbmRleGVkIiwgY29sb3IuSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29sb3IuVGludCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AdGludCIsIGNvbG9yLlRpbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTYW1lIGFzIFNldFZhbHVlIGJ1dCB3aWxsIHNldCBmaXJzdCBjaGFyIHRvIGxvd2VyIGNhc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVscGVyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhdGgiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idiI+PC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgU2V0VmFsdWVFbnVtKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoLCBFbnVtIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscGVyLkRlbGV0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMgPSB2LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcyA9IHMuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBzLlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBoZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhwYXRoLCBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBTZXRWYWx1ZShYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCwgb2JqZWN0IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscGVyLkRlbGV0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscGVyLlNldFhtbE5vZGVTdHJpbmcocGF0aCwgdi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBTZXRWYWx1ZUJvb2woWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgsIGJvb2w/IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscGVyLkRlbGV0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscGVyLlNldFhtbE5vZGVCb29sKHBhdGgsIChib29sKXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdHJpbmcgR2V0QXNTdHJpbmcob2JqZWN0IHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAodiA/PyAiIikuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJcyB0aGlzIHZhbHVlIGFsbG93ZWQgdG8gYmUgY2hhbmdlZD8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGJvb2wgQWxsb3dDaGFuZ2UgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXIuY3MgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQm9yZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmQwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQm9yZGVyLmNzCkBAIC0wLDAgKzEsMTA2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZCb3JkZXJCYXNlIDogRHhmU3R5bGVCYXNlPEV4Y2VsRHhmQm9yZGVyQmFzZT4KKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsRHhmQm9yZGVyQmFzZShFeGNlbFN0eWxlcyBzdHlsZXMpCisgICAgICAgICAgICA6IGJhc2Uoc3R5bGVzKQorICAgICAgICB7CisgICAgICAgICAgICBMZWZ0PW5ldyBFeGNlbER4ZkJvcmRlckl0ZW0oX3N0eWxlcyk7CisgICAgICAgICAgICBSaWdodCA9IG5ldyBFeGNlbER4ZkJvcmRlckl0ZW0oX3N0eWxlcyk7CisgICAgICAgICAgICBUb3AgPSBuZXcgRXhjZWxEeGZCb3JkZXJJdGVtKF9zdHlsZXMpOworICAgICAgICAgICAgQm90dG9tID0gbmV3IEV4Y2VsRHhmQm9yZGVySXRlbShfc3R5bGVzKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMZWZ0IGJvcmRlciBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIExlZnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJpZ2h0IGJvcmRlciBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIFJpZ2h0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUb3AgYm9yZGVyIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbER4ZkJvcmRlckl0ZW0gVG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCb3R0b20gYm9yZGVyIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbER4ZkJvcmRlckl0ZW0gQm90dG9tCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vLy8gRGlhZ29uYWwgYm9yZGVyIHN0eWxlCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9wdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIERpYWdvbmFsCisgICAgICAgIC8veworICAgICAgICAvLyAgICBnZXQ7CisgICAgICAgIC8vICAgIHByaXZhdGUgc2V0OworICAgICAgICAvL30KKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIEEgZGlhZ29uYWwgZnJvbSB0aGUgYm90dG9tIGxlZnQgdG8gdG9wIHJpZ2h0IG9mIHRoZSBjZWxsCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9wdWJsaWMgYm9vbCBEaWFnb25hbFVwCisgICAgICAgIC8veworICAgICAgICAvLyAgICBnZXQ7CisgICAgICAgIC8vICAgIHNldDsKKyAgICAgICAgLy99CisgICAgICAgIC8vLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8vLyBBIGRpYWdvbmFsIGZyb20gdGhlIHRvcCBsZWZ0IHRvIGJvdHRvbSByaWdodCBvZiB0aGUgY2VsbAorICAgICAgICAvLy8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vcHVibGljIGJvb2wgRGlhZ29uYWxEb3duCisgICAgICAgIC8veworICAgICAgICAvLyAgICBnZXQ7CisgICAgICAgIC8vICAgIHNldDsKKyAgICAgICAgLy99CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9wLklkICsgQm90dG9tLklkICsgTGVmdC5JZCArIFJpZ2h0LklkLyogKyBEaWFnb25hbC5JZCArIEdldEFzU3RyaW5nKERpYWdvbmFsVXApICsgR2V0QXNTdHJpbmcoRGlhZ29uYWxEb3duKSovOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIExlZnQuQ3JlYXRlTm9kZXMoaGVscGVyLCBwYXRoICsgIi9kOmxlZnQiKTsKKyAgICAgICAgICAgIFJpZ2h0LkNyZWF0ZU5vZGVzKGhlbHBlciwgcGF0aCArICIvZDpyaWdodCIpOworICAgICAgICAgICAgVG9wLkNyZWF0ZU5vZGVzKGhlbHBlciwgcGF0aCArICIvZDp0b3AiKTsKKyAgICAgICAgICAgIEJvdHRvbS5DcmVhdGVOb2RlcyhoZWxwZXIsIHBhdGggKyAiL2Q6Ym90dG9tIik7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBMZWZ0Lkhhc1ZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgIFJpZ2h0Lkhhc1ZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgIFRvcC5IYXNWYWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICBCb3R0b20uSGFzVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmQm9yZGVyQmFzZSBDbG9uZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEeGZCb3JkZXJCYXNlKF9zdHlsZXMpIHsgQm90dG9tID0gQm90dG9tLkNsb25lKCksIFRvcD1Ub3AuQ2xvbmUoKSwgTGVmdD1MZWZ0LkNsb25lKCksIFJpZ2h0PVJpZ2h0LkNsb25lKCkgfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXJJdGVtLmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkJvcmRlckl0ZW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyM2JlYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXJJdGVtLmNzCkBAIC0wLDAgKzEsNDQgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZgoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbER4ZkJvcmRlckl0ZW0gOiBEeGZTdHlsZUJhc2U8RXhjZWxEeGZCb3JkZXJJdGVtPgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxEeGZCb3JkZXJJdGVtKEV4Y2VsU3R5bGVzIHN0eWxlcykgOgorICAgICAgICAgICAgYmFzZShzdHlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbG9yPW5ldyBFeGNlbER4ZkNvbG9yKHN0eWxlcyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVyU3R5bGU/IFN0eWxlIHsgZ2V0OyBzZXQ7fQorICAgICAgICBwdWJsaWMgRXhjZWxEeGZDb2xvciBDb2xvciB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0QXNTdHJpbmcoU3R5bGUpICsgInwiICsgKENvbG9yID09IG51bGwgPyAiIiA6IENvbG9yLklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKQorICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICBTZXRWYWx1ZUVudW0oaGVscGVyLCBwYXRoICsgIi9Ac3R5bGUiLCBTdHlsZSk7CisgICAgICAgICAgICBTZXRWYWx1ZUNvbG9yKGhlbHBlciwgcGF0aCArICIvZDpjb2xvciIsIENvbG9yKTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlICE9IG51bGwgfHwgQ29sb3IuSGFzVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmQm9yZGVySXRlbSBDbG9uZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEeGZCb3JkZXJJdGVtKF9zdHlsZXMpIHsgU3R5bGUgPSBTdHlsZSwgQ29sb3IgPSBDb2xvciB9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkNvbG9yLmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkNvbG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDdlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQ29sb3IuY3MKQEAgLTAsMCArMSw0NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZDb2xvciA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkNvbG9yPgorCisgICAgeworICAgICAgICBwdWJsaWMgRXhjZWxEeGZDb2xvcihFeGNlbFN0eWxlcyBzdHlsZXMpIDogYmFzZShzdHlsZXMpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQ/IFRoZW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIGludD8gSW5kZXggeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgYm9vbD8gQXV0byB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBkb3VibGU/IFRpbnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgQ29sb3I/IENvbG9yIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0QXNTdHJpbmcoVGhlbWUpICsgInwiICsgR2V0QXNTdHJpbmcoSW5kZXgpICsgInwiICsgR2V0QXNTdHJpbmcoQXV0bykgKyAifCIgKyBHZXRBc1N0cmluZyhUaW50KSArICJ8IiArIEdldEFzU3RyaW5nKENvbG9yPT1udWxsID8gIiIgOiAoKENvbG9yKUNvbG9yLlZhbHVlKS5Ub0FyZ2IoKS5Ub1N0cmluZygieCIpKTsgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZkNvbG9yIENsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbER4ZkNvbG9yKF9zdHlsZXMpIHsgVGhlbWUgPSBUaGVtZSwgSW5kZXggPSBJbmRleCwgQ29sb3IgPSBDb2xvciwgQXV0byA9IEF1dG8sIFRpbnQgPSBUaW50IH07CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRoZW1lICE9IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICBBdXRvICE9IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgVGludCAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgIENvbG9yICE9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZpbGwuY3MgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmRmlsbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmE4YzEwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZpbGwuY3MKQEAgLTAsMCArMSw1NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZGaWxsIDogRHhmU3R5bGVCYXNlPEV4Y2VsRHhmRmlsbD4KKyAgICB7CisgICAgICAgIHB1YmxpYyBFeGNlbER4ZkZpbGwoRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgICAgICAgOiBiYXNlKHN0eWxlcykKKyAgICAgICAgeworICAgICAgICAgICAgUGF0dGVybkNvbG9yID0gbmV3IEV4Y2VsRHhmQ29sb3Ioc3R5bGVzKTsKKyAgICAgICAgICAgIEJhY2tncm91bmRDb2xvciA9IG5ldyBFeGNlbER4ZkNvbG9yKHN0eWxlcyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsRmlsbFN0eWxlPyBQYXR0ZXJuVHlwZSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2xvciBvZiB0aGUgcGF0dGVybgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEeGZDb2xvciBQYXR0ZXJuQ29sb3IgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxEeGZDb2xvciBCYWNrZ3JvdW5kQ29sb3IgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldEFzU3RyaW5nKFBhdHRlcm5UeXBlKSArICJ8IiArIChQYXR0ZXJuQ29sb3IgPT0gbnVsbCA/ICIiIDogUGF0dGVybkNvbG9yLklkKSArICJ8IiArIChCYWNrZ3JvdW5kQ29sb3IgPT0gbnVsbCA/ICIiIDogQmFja2dyb3VuZENvbG9yLklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaGVscGVyLkNyZWF0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICBTZXRWYWx1ZUVudW0oaGVscGVyLCBwYXRoICsgIi9kOnBhdHRlcm5GaWxsL0BwYXR0ZXJuVHlwZSIsIFBhdHRlcm5UeXBlKTsKKyAgICAgICAgICAgIFNldFZhbHVlQ29sb3IoaGVscGVyLCBwYXRoICsgIi9kOnBhdHRlcm5GaWxsL2Q6ZmdDb2xvciIsIFBhdHRlcm5Db2xvcik7CisgICAgICAgICAgICBTZXRWYWx1ZUNvbG9yKGhlbHBlciwgcGF0aCArICIvZDpwYXR0ZXJuRmlsbC9kOmJnQ29sb3IiLCBCYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuVHlwZSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgIFBhdHRlcm5Db2xvci5IYXNWYWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kQ29sb3IuSGFzVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmRmlsbCBDbG9uZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEeGZGaWxsKF9zdHlsZXMpIHtQYXR0ZXJuVHlwZT1QYXR0ZXJuVHlwZSwgUGF0dGVybkNvbG9yPVBhdHRlcm5Db2xvci5DbG9uZSgpLCBCYWNrZ3JvdW5kQ29sb3I9QmFja2dyb3VuZENvbG9yLkNsb25lKCl9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZvbnRCYXNlLmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZvbnRCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjZmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmRm9udEJhc2UuY3MKQEAgLTAsMCArMSw4NSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKK3sKKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZGb250QmFzZSA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkZvbnRCYXNlPgorICAgIHsKKyAgICAgICAgcHVibGljIEV4Y2VsRHhmRm9udEJhc2UoRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgICAgICAgOiBiYXNlKHN0eWxlcykKKyAgICAgICAgeworICAgICAgICAgICAgQ29sb3IgPSBuZXcgRXhjZWxEeGZDb2xvcihzdHlsZXMpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbnQgYm9sZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbD8gQm9sZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9udCBJdGFsaWMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2w/IEl0YWxpYworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9udC1TdHJpa2VvdXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2w/IFN0cmlrZSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vcHVibGljIGZsb2F0PyBTaXplIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIEV4Y2VsRHhmQ29sb3IgQ29sb3IgeyBnZXQ7IHNldDsgfQorICAgICAgICAvL3B1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vcHVibGljIGludD8gRmFtaWx5IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLy8vIEZvbnQtVmVydGljYWwgQWxpZ24KKyAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgorICAgICAgICAvL3B1YmxpYyBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udD8gVmVydGljYWxBbGlnbgorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0OworICAgICAgICAvLyAgICBzZXQ7CisgICAgICAgIC8vfQorCisgICAgICAgIHB1YmxpYyBFeGNlbFVuZGVyTGluZVR5cGU/IFVuZGVybGluZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0QXNTdHJpbmcoQm9sZCkgKyAifCIgKyBHZXRBc1N0cmluZyhJdGFsaWMpICsgInwiICsgR2V0QXNTdHJpbmcoU3RyaWtlKSArICJ8IiArIChDb2xvciA9PW51bGwgPyAiIiA6IENvbG9yLklkKSArICJ8IiAvKisgR2V0QXNTdHJpbmcoVmVydGljYWxBbGlnbikgKyAifCIqLyArIEdldEFzU3RyaW5nKFVuZGVybGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaGVscGVyLkNyZWF0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICBTZXRWYWx1ZUJvb2woaGVscGVyLCBwYXRoICsgIi9kOmIvQHZhbCIsIEJvbGQpOworICAgICAgICAgICAgU2V0VmFsdWVCb29sKGhlbHBlciwgcGF0aCArICIvZDppL0B2YWwiLCBJdGFsaWMpOworICAgICAgICAgICAgU2V0VmFsdWVCb29sKGhlbHBlciwgcGF0aCArICIvZDpzdHJpa2UiLCBTdHJpa2UpOworICAgICAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9kOnUvQHZhbCIsIFVuZGVybGluZSk7CisgICAgICAgICAgICBTZXRWYWx1ZUNvbG9yKGhlbHBlciwgcGF0aCArICIvZDpjb2xvciIsIENvbG9yKTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9sZCAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgIEl0YWxpYyAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgIFVuZGVybGluZSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgIENvbG9yLkhhc1ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZkZvbnRCYXNlIENsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbER4ZkZvbnRCYXNlKF9zdHlsZXMpIHsgQm9sZCA9IEJvbGQsIENvbG9yID0gQ29sb3IuQ2xvbmUoKSwgSXRhbGljID0gSXRhbGljLCBTdHJpa2UgPSBTdHJpa2UsIFVuZGVybGluZSA9IFVuZGVybGluZSB9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4Zk51bWJlckZvcm1hdC5jcyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZOdW1iZXJGb3JtYXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZmZkMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZOdW1iZXJGb3JtYXQuY3MKQEAgLTAsMCArMSwxMDUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZgoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbER4Zk51bWJlckZvcm1hdCA6IER4ZlN0eWxlQmFzZTxFeGNlbER4Zk51bWJlckZvcm1hdD4KKyAgICB7CisgICAgICAgIHB1YmxpYyBFeGNlbER4Zk51bWJlckZvcm1hdChFeGNlbFN0eWxlcyBzdHlsZXMpIDogYmFzZShzdHlsZXMpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIGludCBfbnVtRm10SUQ9aW50Lk1pblZhbHVlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZCBmb3IgbnVtYmVyIGZvcm1hdAorICAgICAgICAvLy8gCisgICAgICAgIC8vLyBCdWlsZCBpbiBJRCdzCisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIDAgICBHZW5lcmFsIAorICAgICAgICAvLy8gMSAgIDAgCisgICAgICAgIC8vLyAyICAgMC4wMCAKKyAgICAgICAgLy8vIDMgICAjLCMjMCAKKyAgICAgICAgLy8vIDQgICAjLCMjMC4wMCAKKyAgICAgICAgLy8vIDkgICAwJSAKKyAgICAgICAgLy8vIDEwICAwLjAwJSAKKyAgICAgICAgLy8vIDExICAwLjAwRSswMCAKKyAgICAgICAgLy8vIDEyICAjID8vPyAKKyAgICAgICAgLy8vIDEzICAjID8/Lz8/IAorICAgICAgICAvLy8gMTQgIG1tLWRkLXl5IAorICAgICAgICAvLy8gMTUgIGQtbW1tLXl5IAorICAgICAgICAvLy8gMTYgIGQtbW1tIAorICAgICAgICAvLy8gMTcgIG1tbS15eSAKKyAgICAgICAgLy8vIDE4ICBoOm1tIEFNL1BNIAorICAgICAgICAvLy8gMTkgIGg6bW06c3MgQU0vUE0gCisgICAgICAgIC8vLyAyMCAgaDptbSAKKyAgICAgICAgLy8vIDIxICBoOm1tOnNzIAorICAgICAgICAvLy8gMjIgIG0vZC95eSBoOm1tIAorICAgICAgICAvLy8gMzcgICMsIyMwIDsoIywjIzApIAorICAgICAgICAvLy8gMzggICMsIyMwIDtbUmVkXSgjLCMjMCkgCisgICAgICAgIC8vLyAzOSAgIywjIzAuMDA7KCMsIyMwLjAwKSAKKyAgICAgICAgLy8vIDQwICAjLCMjMC4wMDtbUmVkXSgjLCMjMC4wMCkgCisgICAgICAgIC8vLyA0NSAgbW06c3MgCisgICAgICAgIC8vLyA0NiAgW2hdOm1tOnNzIAorICAgICAgICAvLy8gNDcgIG1tc3MuMCAKKyAgICAgICAgLy8vIDQ4ICAjIzAuMEUrMCAKKyAgICAgICAgLy8vIDQ5ICBACisgICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgICAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgTnVtRm10SUQgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX251bUZtdElEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX251bUZtdElEID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9mb3JtYXQ9IiI7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybWF0CisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2Zvcm1hdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9mb3JtYXQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBOdW1GbXRJRCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZElkRnJvbUZvcm1hdCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBGb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE51bUZtdElEIDwgMCAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybWF0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1GbXRJRCA9IF9zdHlsZXMuX25leHREZnhOdW1GbXRJRCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVscGVyLkNyZWF0ZU5vZGUocGF0aCk7CisgICAgICAgICAgICBTZXRWYWx1ZShoZWxwZXIsIHBhdGggKyAiL0BudW1GbXRJZCIsIE51bUZtdElEKTsKKyAgICAgICAgICAgIFNldFZhbHVlKGhlbHBlciwgcGF0aCArICIvQGZvcm1hdENvZGUiLCBGb3JtYXQpOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBib29sIEhhc1ZhbHVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgcmV0dXJuICFzdHJpbmcuSXNOdWxsT3JFbXB0eShGb3JtYXQpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgRXhjZWxEeGZOdW1iZXJGb3JtYXQgQ2xvbmUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRHhmTnVtYmVyRm9ybWF0KF9zdHlsZXMpIHsgTnVtRm10SUQgPSBOdW1GbXRJRCwgRm9ybWF0ID0gRm9ybWF0IH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmU3R5bGUuY3MgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmU3R5bGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxNDNlOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZTdHlsZS5jcwpAQCAtMCwwICsxLDE1MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZgoreworICAgIHB1YmxpYyBjbGFzcyBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIDogRHhmU3R5bGVCYXNlPEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmc+CisgICAgeworICAgICAgICBYbWxIZWxwZXJJbnN0YW5jZSBfaGVscGVyOworICAgICAgICBpbnRlcm5hbCBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFN0eWxlcyBzdHlsZXMpIDogYmFzZShzdHlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdCA9IG5ldyBFeGNlbER4Zk51bWJlckZvcm1hdChfc3R5bGVzKTsKKyAgICAgICAgICAgIEZvbnQgPSBuZXcgRXhjZWxEeGZGb250QmFzZShfc3R5bGVzKTsKKyAgICAgICAgICAgIEJvcmRlciA9IG5ldyBFeGNlbER4ZkJvcmRlckJhc2UoX3N0eWxlcyk7CisgICAgICAgICAgICBGaWxsID0gbmV3IEV4Y2VsRHhmRmlsbChfc3R5bGVzKTsKKyAgICAgICAgICAgIGlmICh0b3BOb2RlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2hlbHBlciA9IG5ldyBYbWxIZWxwZXJJbnN0YW5jZShuYW1lU3BhY2VNYW5hZ2VyLCB0b3BOb2RlKTsKKyAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXQuTnVtRm10SUQgPSBfaGVscGVyLkdldFhtbE5vZGVJbnQoImQ6bnVtRm10L0BudW1GbXRJZCIpOworICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdC5Gb3JtYXQgPSBfaGVscGVyLkdldFhtbE5vZGVTdHJpbmcoImQ6bnVtRm10L0Bmb3JtYXRDb2RlIik7IAorICAgICAgICAgICAgICAgIGlmIChOdW1iZXJGb3JtYXQuTnVtRm10SUQgPCAxNjQgJiYgc3RyaW5nLklzTnVsbE9yRW1wdHkoTnVtYmVyRm9ybWF0LkZvcm1hdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXQuRm9ybWF0ID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSW5Gcm9tSUQoTnVtYmVyRm9ybWF0Lk51bUZtdElEKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBGb250LkJvbGQgPSBfaGVscGVyLkdldFhtbE5vZGVCb29sTnVsbGFibGUoImQ6Zm9udC9kOmIvQHZhbCIpOworICAgICAgICAgICAgICAgIEZvbnQuSXRhbGljID0gX2hlbHBlci5HZXRYbWxOb2RlQm9vbE51bGxhYmxlKCJkOmZvbnQvZDppL0B2YWwiKTsKKyAgICAgICAgICAgICAgICBGb250LlN0cmlrZSA9IF9oZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZSgiZDpmb250L2Q6c3RyaWtlIik7CisgICAgICAgICAgICAgICAgRm9udC5VbmRlcmxpbmUgPSBHZXRVbmRlckxpbmVFbnVtKF9oZWxwZXIuR2V0WG1sTm9kZVN0cmluZygiZDpmb250L2Q6dS9AdmFsIikpOworICAgICAgICAgICAgICAgIEZvbnQuQ29sb3IgPSBHZXRDb2xvcihfaGVscGVyLCAiZDpmb250L2Q6Y29sb3IiKTsKKworICAgICAgICAgICAgICAgIEJvcmRlci5MZWZ0ID0gR2V0Qm9yZGVySXRlbShfaGVscGVyLCAiZDpib3JkZXIvZDpsZWZ0Iik7CisgICAgICAgICAgICAgICAgQm9yZGVyLlJpZ2h0ID0gR2V0Qm9yZGVySXRlbShfaGVscGVyLCAiZDpib3JkZXIvZDpyaWdodCIpOworICAgICAgICAgICAgICAgIEJvcmRlci5Cb3R0b20gPSBHZXRCb3JkZXJJdGVtKF9oZWxwZXIsICJkOmJvcmRlci9kOmJvdHRvbSIpOworICAgICAgICAgICAgICAgIEJvcmRlci5Ub3AgPSBHZXRCb3JkZXJJdGVtKF9oZWxwZXIsICJkOmJvcmRlci9kOnRvcCIpOworCisgICAgICAgICAgICAgICAgRmlsbC5QYXR0ZXJuVHlwZSA9IEdldFBhdHRlcm5UeXBlRW51bShfaGVscGVyLkdldFhtbE5vZGVTdHJpbmcoImQ6ZmlsbC9kOnBhdHRlcm5GaWxsL0BwYXR0ZXJuVHlwZSIpKTsKKyAgICAgICAgICAgICAgICBGaWxsLkJhY2tncm91bmRDb2xvciA9IEdldENvbG9yKF9oZWxwZXIsICJkOmZpbGwvZDpwYXR0ZXJuRmlsbC9kOmJnQ29sb3IvIik7CisgICAgICAgICAgICAgICAgRmlsbC5QYXR0ZXJuQ29sb3IgPSBHZXRDb2xvcihfaGVscGVyLCAiZDpmaWxsL2Q6cGF0dGVybkZpbGwvZDpmZ0NvbG9yLyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9oZWxwZXIgPSBuZXcgWG1sSGVscGVySW5zdGFuY2UobmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaGVscGVyLlNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJmb250IiwgIm51bUZtdCIsICJmaWxsIiwgImJvcmRlciIgfTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIEV4Y2VsRHhmQm9yZGVySXRlbSBHZXRCb3JkZXJJdGVtKFhtbEhlbHBlckluc3RhbmNlIGhlbHBlciwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsRHhmQm9yZGVySXRlbSBiaSA9IG5ldyBFeGNlbER4ZkJvcmRlckl0ZW0oX3N0eWxlcyk7CisgICAgICAgICAgICBiaS5TdHlsZSA9IEdldEJvcmRlclN0eWxlRW51bShoZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhwYXRoKyIvQHN0eWxlIikpOworICAgICAgICAgICAgYmkuQ29sb3IgPSBHZXRDb2xvcihoZWxwZXIsIHBhdGgrIi9kOmNvbG9yIik7CisgICAgICAgICAgICByZXR1cm4gYmk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBFeGNlbEJvcmRlclN0eWxlIEdldEJvcmRlclN0eWxlRW51bShzdHJpbmcgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiIikgcmV0dXJuIEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKKyAgICAgICAgICAgIHN0cmluZyBzSW5TdHlsZSA9IHN0eWxlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgc3R5bGUuU3Vic3RyaW5nKDEsIHN0eWxlLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEJvcmRlclN0eWxlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsQm9yZGVyU3R5bGUpLCBzSW5TdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEJvcmRlclN0eWxlLk5vbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIEV4Y2VsRmlsbFN0eWxlIEdldFBhdHRlcm5UeXBlRW51bShzdHJpbmcgcGF0dGVyblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXR0ZXJuVHlwZSA9PSAiIikgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7CisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IHBhdHRlcm5UeXBlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcGF0dGVyblR5cGUuU3Vic3RyaW5nKDEsIHBhdHRlcm5UeXBlLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEZpbGxTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihFeGNlbEZpbGxTdHlsZSksIHBhdHRlcm5UeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBFeGNlbER4ZkNvbG9yIEdldENvbG9yKFhtbEhlbHBlckluc3RhbmNlIGhlbHBlciwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIEV4Y2VsRHhmQ29sb3IgcmV0ID0gbmV3IEV4Y2VsRHhmQ29sb3IoX3N0eWxlcyk7CisgICAgICAgICAgICByZXQuVGhlbWUgPSBoZWxwZXIuR2V0WG1sTm9kZUludE51bGwocGF0aCArICIvQHRoZW1lIik7CisgICAgICAgICAgICByZXQuSW5kZXggPSBoZWxwZXIuR2V0WG1sTm9kZUludE51bGwocGF0aCArICIvQGluZGV4ZWQiKTsKKyAgICAgICAgICAgIHN0cmluZyByZ2I9aGVscGVyLkdldFhtbE5vZGVTdHJpbmcocGF0aCArICIvQHJnYiIpOworICAgICAgICAgICAgaWYocmdiIT0iIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQuQ29sb3IgPSBDb2xvci5Gcm9tQXJnYiggaW50LlBhcnNlKHJnYi5TdWJzdHJpbmcoMCwgMiksIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZShyZ2IuU3Vic3RyaW5nKDIsIDIpLCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuUGFyc2UocmdiLlN1YnN0cmluZyg0LCAyKSwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LlBhcnNlKHJnYi5TdWJzdHJpbmcoNiwgMiksIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0LkF1dG8gPSBoZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShwYXRoICsgIi9AYXV0byIpOworICAgICAgICAgICAgcmV0LlRpbnQgPSBoZWxwZXIuR2V0WG1sTm9kZURvdWJsZU51bGwocGF0aCArICIvQHRpbnQiKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBFeGNlbFVuZGVyTGluZVR5cGU/IEdldFVuZGVyTGluZUVudW0oc3RyaW5nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2godmFsdWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJzaW5nbGUiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZTsKKyAgICAgICAgICAgICAgICBjYXNlICJkb3VibGUiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlICJzaW5nbGVhY2NvdW50aW5nIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGVBY2NvdW50aW5nOworICAgICAgICAgICAgICAgIGNhc2UgImRvdWJsZWFjY291bnRpbmciOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLkRvdWJsZUFjY291bnRpbmc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IER4ZklkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIEV4Y2VsRHhmRm9udEJhc2UgRm9udCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBFeGNlbER4Zk51bWJlckZvcm1hdCBOdW1iZXJGb3JtYXQgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgRXhjZWxEeGZGaWxsIEZpbGwgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJCYXNlIEJvcmRlciB7IGdldDsgc2V0OyB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlckZvcm1hdC5JZCArIEZvbnQuSWQgKyBCb3JkZXIuSWQgKyBGaWxsLklkICsKKyAgICAgICAgICAgICAgICAgICAgKEFsbG93Q2hhbmdlID8gIiIgOiBEeGZJZC5Ub1N0cmluZygpKTsvL0lmIGFsbG93Y2hhbmdlIGlzIGZhbHNlIHdlIGFkZCB0aGUgZHhmSUQgdG8gZW5zdXJlIGl0J3Mgbm90IHVzZWQgd2hlbiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIGlzIHVwZGF0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIENsb25lKCkKKyAgICAgICAgeworIAkgICAgICAgdmFyIHM9bmV3IEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcoX2hlbHBlci5OYW1lU3BhY2VNYW5hZ2VyLCBudWxsLCBfc3R5bGVzKTsKKyAgICAgICAgICAgcy5Gb250ID0gRm9udC5DbG9uZSgpOworICAgICAgICAgICBzLk51bWJlckZvcm1hdCA9IE51bWJlckZvcm1hdC5DbG9uZSgpOworICAgICAgICAgICBzLkZpbGwgPSBGaWxsLkNsb25lKCk7CisgICAgICAgICAgIHMuQm9yZGVyID0gQm9yZGVyLkNsb25lKCk7CisgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKEZvbnQuSGFzVmFsdWUpIEZvbnQuQ3JlYXRlTm9kZXMoaGVscGVyLCAiZDpmb250Iik7CisgICAgICAgICAgICBpZiAoTnVtYmVyRm9ybWF0Lkhhc1ZhbHVlKSBOdW1iZXJGb3JtYXQuQ3JlYXRlTm9kZXMoaGVscGVyLCAiZDpudW1GbXQiKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChGaWxsLkhhc1ZhbHVlKSBGaWxsLkNyZWF0ZU5vZGVzKGhlbHBlciwgImQ6ZmlsbCIpOworICAgICAgICAgICAgaWYgKEJvcmRlci5IYXNWYWx1ZSkgQm9yZGVyLkNyZWF0ZU5vZGVzKGhlbHBlciwgImQ6Ym9yZGVyIik7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEZvbnQuSGFzVmFsdWUgfHwgTnVtYmVyRm9ybWF0Lkhhc1ZhbHVlIHx8IEZpbGwuSGFzVmFsdWUgfHwgQm9yZGVyLkhhc1ZhbHVlOyB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxCb3JkZXIuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxCb3JkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkYjdjMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbEJvcmRlci5jcwpAQCAtMCwwICsxLDE3OCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDZWxsIEJvcmRlciBzdHlsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBCb3JkZXIgOiBTdHlsZUJhc2UKKyAgICB7CisgICAgICAgIGludGVybmFsIEJvcmRlcihFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIGFkZHJlc3MsIGludCBpbmRleCkgOgorICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgYWRkcmVzcykKKwkgICAgeworICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMZWZ0IGJvcmRlciBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtIExlZnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJvcmRlckl0ZW0oX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0LCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVySXRlbSBSaWdodAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQm9yZGVySXRlbShfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0LCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUb3AgYm9yZGVyIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gVG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCb3JkZXJJdGVtKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCb3R0b20gYm9yZGVyIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gQm90dG9tCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCb3JkZXJJdGVtKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAwRGlhZ29uYWwgYm9yZGVyIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gRGlhZ29uYWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJvcmRlckl0ZW0oX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbCwgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBkaWFnb25hbCBmcm9tIHRoZSBib3R0b20gbGVmdCB0byB0b3AgcmlnaHQgb2YgdGhlIGNlbGwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgRGlhZ29uYWxVcCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEluZGV4ID49MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkRpYWdvbmFsVXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXIsIGVTdHlsZVByb3BlcnR5LkJvcmRlckRpYWdvbmFsVXAsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGRpYWdvbmFsIGZyb20gdGhlIHRvcCBsZWZ0IHRvIGJvdHRvbSByaWdodCBvZiB0aGUgY2VsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBEaWFnb25hbERvd24gCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJbmRleCA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uRGlhZ29uYWxEb3duOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuQm9yZGVyLCBlU3R5bGVQcm9wZXJ0eS5Cb3JkZXJEaWFnb25hbERvd24sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFRvcC5JZCArIEJvdHRvbS5JZCArTGVmdC5JZCArIFJpZ2h0LklkICsgRGlhZ29uYWwuSWQgKyBEaWFnb25hbFVwICsgRGlhZ29uYWxEb3duOyB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0IHRoZSBib3JkZXIgc3R5bGUgYXJvdW5kIHRoZSByYW5nZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTdHlsZSI+VGhlIGJvcmRlciBzdHlsZTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEJvcmRlckFyb3VuZChFeGNlbEJvcmRlclN0eWxlIFN0eWxlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3MoX2FkZHJlc3MpOworICAgICAgICAgICAgU2V0Qm9yZGVyQXJvdW5kU3R5bGUoU3R5bGUsIGFkZHIpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgYm9yZGVyIHN0eWxlIGFyb3VuZCB0aGUgcmFuZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU3R5bGUiPlRoZSBib3JkZXIgc3R5bGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvbG9yIj5UaGUgY29sb3Igb2YgdGhlIGJvcmRlcjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEJvcmRlckFyb3VuZChFeGNlbEJvcmRlclN0eWxlIFN0eWxlLCBTeXN0ZW0uRHJhd2luZy5Db2xvciBDb2xvcikKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGFkZHI9bmV3IEV4Y2VsQWRkcmVzcyhfYWRkcmVzcyk7CisgICAgICAgICAgICBTZXRCb3JkZXJBcm91bmRTdHlsZShTdHlsZSwgYWRkcik7CisKKyAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkJvcmRlclRvcCwgZVN0eWxlUHJvcGVydHkuQ29sb3IsIENvbG9yLlRvQXJnYigpLlRvU3RyaW5nKCJYIiksIF9wb3NpdGlvbklELCBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX2Zyb21Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7CisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJCb3R0b20sIGVTdHlsZVByb3BlcnR5LkNvbG9yLCBDb2xvci5Ub0FyZ2IoKS5Ub1N0cmluZygiWCIpLCBfcG9zaXRpb25JRCwgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl90b1JvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7CisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0LCBlU3R5bGVQcm9wZXJ0eS5Db2xvciwgQ29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSwgX3Bvc2l0aW9uSUQsIG5ldyBFeGNlbEFkZHJlc3MoYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX2Zyb21Db2wpLkFkZHJlc3MpKTsKKyAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0LCBlU3R5bGVQcm9wZXJ0eS5Db2xvciwgQ29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSwgX3Bvc2l0aW9uSUQsIG5ldyBFeGNlbEFkZHJlc3MoYWRkci5fZnJvbVJvdywgYWRkci5fdG9Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl90b0NvbCkuQWRkcmVzcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEJvcmRlckFyb3VuZFN0eWxlKEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUsIEV4Y2VsQWRkcmVzcyBhZGRyKQorICAgICAgICB7CisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJUb3AsIGVTdHlsZVByb3BlcnR5LlN0eWxlLCBTdHlsZSwgX3Bvc2l0aW9uSUQsIG5ldyBFeGNlbEFkZHJlc3MoYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fZnJvbVJvdywgYWRkci5fdG9Db2wpLkFkZHJlc3MpKTsKKyAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbSwgZVN0eWxlUHJvcGVydHkuU3R5bGUsIFN0eWxlLCBfcG9zaXRpb25JRCwgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl90b1JvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7CisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0LCBlU3R5bGVQcm9wZXJ0eS5TdHlsZSwgU3R5bGUsIF9wb3NpdGlvbklELCBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl9mcm9tQ29sKS5BZGRyZXNzKSk7CisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodCwgZVN0eWxlUHJvcGVydHkuU3R5bGUsIFN0eWxlLCBfcG9zaXRpb25JRCwgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl90b0NvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxCb3JkZXJJdGVtLmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsQm9yZGVySXRlbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk0ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsQm9yZGVySXRlbS5jcwpAQCAtMCwwICsxLDExMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDZWxsIGJvcmRlciBzdHlsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbEJvcmRlckl0ZW0gOiBTdHlsZUJhc2UKKyAgICB7CisgICAgICAgIGVTdHlsZUNsYXNzIF9jbHM7CisgICAgICAgIFN0eWxlQmFzZSBfcGFyZW50OworICAgICAgICBpbnRlcm5hbCBFeGNlbEJvcmRlckl0ZW0gKEV4Y2VsU3R5bGVzIHN0eWxlcywgT2ZmaWNlT3BlblhtbC5YbWxIZWxwZXIuQ2hhbmdlZEV2ZW50SGFuZGxlciBDaGFuZ2VkRXZlbnQsIGludCB3b3Jrc2hlZXRJRCwgc3RyaW5nIGFkZHJlc3MsIGVTdHlsZUNsYXNzIGNscywgU3R5bGVCYXNlIHBhcmVudCkgOiAKKyAgICAgICAgICAgIGJhc2Uoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIHdvcmtzaGVldElELCBhZGRyZXNzKQorCSAgICB7CisgICAgICAgICAgICBfY2xzPWNsczsKKyAgICAgICAgICAgIF9wYXJlbnQgPSBwYXJlbnQ7CisJICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGxpbmUgc3R5bGUgb2YgdGhlIGJvcmRlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJTdHlsZSBTdHlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0U291cmNlKCkuU3R5bGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhfY2xzLCBlU3R5bGVQcm9wZXJ0eS5TdHlsZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ29sb3IgX2NvbG9yPW51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2xvciBvZiB0aGUgYm9yZGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbG9yIENvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY29sb3IgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvciA9IG5ldyBFeGNlbENvbG9yKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgX2NscywgX3BhcmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfY29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFN0eWxlICsgQ29sb3IuSWQ7IH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFNldEluZGV4KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcmVudC5JbmRleCA9IGluZGV4OworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgRXhjZWxCb3JkZXJJdGVtWG1sIEdldFNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpeCA9IF9wYXJlbnQuSW5kZXggPCAwID8gMCA6IF9wYXJlbnQuSW5kZXg7CisKKyAgICAgICAgICAgIHN3aXRjaChfY2xzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW2l4XS5Ub3A7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJCb3R0b206CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbaXhdLkJvdHRvbTsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckxlZnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbaXhdLkxlZnQ7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tpeF0uUmlnaHQ7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tpeF0uRGlhZ29uYWw7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBjbGFzcyBmb3IgQm9yZGVyaXRlbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxDb2xvci5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbENvbG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDE5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxDb2xvci5jcwpAQCAtMCwwICsxLDI1NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbG9yIGZvciBjZWxsc3R5bGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbENvbG9yIDogIFN0eWxlQmFzZQorICAgIHsKKyAgICAgICAgZVN0eWxlQ2xhc3MgX2NsczsKKyAgICAgICAgU3R5bGVCYXNlIF9wYXJlbnQ7CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sb3IoRXhjZWxTdHlsZXMgc3R5bGVzLCBPZmZpY2VPcGVuWG1sLlhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIENoYW5nZWRFdmVudCwgaW50IHdvcmtzaGVldElELCBzdHJpbmcgYWRkcmVzcywgZVN0eWxlQ2xhc3MgY2xzLCBTdHlsZUJhc2UgcGFyZW50KSA6IAorICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgd29ya3NoZWV0SUQsIGFkZHJlc3MpCisgICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgIF9jbHMgPSBjbHM7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRoZW1lIGNvbG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGhlbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFNvdXJjZSgpLlRoZW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0aW50IHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkZWNpbWFsIFRpbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFNvdXJjZSgpLlRpbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAxIHx8IHZhbHVlIDwgLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIC0xIGFuZCAxIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhfY2xzLCBlU3R5bGVQcm9wZXJ0eS5UaW50LCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFJHQiB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFJnYgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0U291cmNlKCkuUmdiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoX2NscywgZVN0eWxlUHJvcGVydHkuQ29sb3IsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgaW5kZXhlZCBjb2xvciBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgSW5kZXhlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0U291cmNlKCkuSW5kZXhlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKF9jbHMsIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvciwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgY29sb3Igb2YgdGhlIG9iamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj5UaGUgY29sb3I8L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRDb2xvcihDb2xvciBjb2xvcikKKyAgICAgICAgeworICAgICAgICAgICAgUmdiID0gY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGhlbWUgKyBUaW50ICsgUmdiICsgSW5kZXhlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIEV4Y2VsQ29sb3JYbWwgR2V0U291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5kZXggPSBfcGFyZW50LkluZGV4IDwgMCA/IDAgOiBfcGFyZW50LkluZGV4OworICAgICAgICAgICAgc3dpdGNoKF9jbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsQmFja2dyb3VuZENvbG9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5GaWxsc1tJbmRleF0uQmFja2dyb3VuZENvbG9yOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuRmlsbFBhdHRlcm5Db2xvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHNbSW5kZXhdLlBhdHRlcm5Db2xvcjsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZvbnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5Db2xvcjsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckxlZnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkxlZnQuQ29sb3I7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJUb3A6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLlRvcC5Db2xvcjsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW0luZGV4XS5SaWdodC5Db2xvcjsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uQm90dG9tLkNvbG9yOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyRGlhZ29uYWw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkRpYWdvbmFsLkNvbG9yOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIkludmFsaWQgc3R5bGUtY2xhc3MgZm9yIENvbG9yIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgU2V0SW5kZXgoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyZW50LkluZGV4ID0gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJuIHRoZSBSR0IgdmFsdWUgZm9yIHRoZSBjb2xvciBvYmplY3QgdGhhdCB1c2VzIHRoZSBJbmRleGVkIG9yIFRpbnQgcHJvcGVydHkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aGVDb2xvciI+VGhlIGNvbG9yIG9iamVjdDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgUkdCIGNvbG9yIHN0YXJ0aW5nIHdpdGggYSAjPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgc3RyaW5nIExvb2t1cENvbG9yKEV4Y2VsQ29sb3IgdGhlQ29sb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVGhhbmtzIHRvIG5lYXZlcyBmb3IgY29udHJpYnV0aW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAgICAgaW50IGlUaW50ID0gMDsKKyAgICAgICAgICAgIHN0cmluZyB0cmFuc2xhdGVkUkdCID0gIiI7CisKKyAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBleHRyYWN0ZWQgZnJvbSBFQ01BLTM3NiwgUGFydCA0LCBTZWN0aW9uIDMuOC4yNgorICAgICAgICAgICAgc3RyaW5nW10gcmdiTG9va3VwID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiI0ZGMDAwMDAwIiwgLy8gMAorICAgICAgICAgICAgICAgICIjRkZGRkZGRkYiLAorICAgICAgICAgICAgICAgICIjRkZGRjAwMDAiLAorICAgICAgICAgICAgICAgICIjRkYwMEZGMDAiLAorICAgICAgICAgICAgICAgICIjRkYwMDAwRkYiLAorICAgICAgICAgICAgICAgICIjRkZGRkZGMDAiLAorICAgICAgICAgICAgICAgICIjRkZGRjAwRkYiLAorICAgICAgICAgICAgICAgICIjRkYwMEZGRkYiLAorICAgICAgICAgICAgICAgICIjRkYwMDAwMDAiLCAvLyA4CisgICAgICAgICAgICAgICAgIiNGRkZGRkZGRiIsCisgICAgICAgICAgICAgICAgIiNGRkZGMDAwMCIsCisgICAgICAgICAgICAgICAgIiNGRjAwRkYwMCIsCisgICAgICAgICAgICAgICAgIiNGRjAwMDBGRiIsCisgICAgICAgICAgICAgICAgIiNGRkZGRkYwMCIsCisgICAgICAgICAgICAgICAgIiNGRkZGMDBGRiIsCisgICAgICAgICAgICAgICAgIiNGRjAwRkZGRiIsCisgICAgICAgICAgICAgICAgIiNGRjgwMDAwMCIsCisgICAgICAgICAgICAgICAgIiNGRjAwODAwMCIsCisgICAgICAgICAgICAgICAgIiNGRjAwMDA4MCIsCisgICAgICAgICAgICAgICAgIiNGRjgwODAwMCIsCisgICAgICAgICAgICAgICAgIiNGRjgwMDA4MCIsCisgICAgICAgICAgICAgICAgIiNGRjAwODA4MCIsCisgICAgICAgICAgICAgICAgIiNGRkMwQzBDMCIsCisgICAgICAgICAgICAgICAgIiNGRjgwODA4MCIsCisgICAgICAgICAgICAgICAgIiNGRjk5OTlGRiIsCisgICAgICAgICAgICAgICAgIiNGRjk5MzM2NiIsCisgICAgICAgICAgICAgICAgIiNGRkZGRkZDQyIsCisgICAgICAgICAgICAgICAgIiNGRkNDRkZGRiIsCisgICAgICAgICAgICAgICAgIiNGRjY2MDA2NiIsCisgICAgICAgICAgICAgICAgIiNGRkZGODA4MCIsCisgICAgICAgICAgICAgICAgIiNGRjAwNjZDQyIsCisgICAgICAgICAgICAgICAgIiNGRkNDQ0NGRiIsCisgICAgICAgICAgICAgICAgIiNGRjAwMDA4MCIsCisgICAgICAgICAgICAgICAgIiNGRkZGMDBGRiIsCisgICAgICAgICAgICAgICAgIiNGRkZGRkYwMCIsCisgICAgICAgICAgICAgICAgIiNGRjAwRkZGRiIsCisgICAgICAgICAgICAgICAgIiNGRjgwMDA4MCIsCisgICAgICAgICAgICAgICAgIiNGRjgwMDAwMCIsCisgICAgICAgICAgICAgICAgIiNGRjAwODA4MCIsCisgICAgICAgICAgICAgICAgIiNGRjAwMDBGRiIsCisgICAgICAgICAgICAgICAgIiNGRjAwQ0NGRiIsCisgICAgICAgICAgICAgICAgIiNGRkNDRkZGRiIsCisgICAgICAgICAgICAgICAgIiNGRkNDRkZDQyIsCisgICAgICAgICAgICAgICAgIiNGRkZGRkY5OSIsCisgICAgICAgICAgICAgICAgIiNGRjk5Q0NGRiIsCisgICAgICAgICAgICAgICAgIiNGRkZGOTlDQyIsCisgICAgICAgICAgICAgICAgIiNGRkNDOTlGRiIsCisgICAgICAgICAgICAgICAgIiNGRkZGQ0M5OSIsCisgICAgICAgICAgICAgICAgIiNGRjMzNjZGRiIsCisgICAgICAgICAgICAgICAgIiNGRjMzQ0NDQyIsCisgICAgICAgICAgICAgICAgIiNGRjk5Q0MwMCIsCisgICAgICAgICAgICAgICAgIiNGRkZGQ0MwMCIsCisgICAgICAgICAgICAgICAgIiNGRkZGOTkwMCIsCisgICAgICAgICAgICAgICAgIiNGRkZGNjYwMCIsCisgICAgICAgICAgICAgICAgIiNGRjY2NjY5OSIsCisgICAgICAgICAgICAgICAgIiNGRjk2OTY5NiIsCisgICAgICAgICAgICAgICAgIiNGRjAwMzM2NiIsCisgICAgICAgICAgICAgICAgIiNGRjMzOTk2NiIsCisgICAgICAgICAgICAgICAgIiNGRjAwMzMwMCIsCisgICAgICAgICAgICAgICAgIiNGRjMzMzMwMCIsCisgICAgICAgICAgICAgICAgIiNGRjk5MzMwMCIsCisgICAgICAgICAgICAgICAgIiNGRjk5MzM2NiIsCisgICAgICAgICAgICAgICAgIiNGRjMzMzM5OSIsCisgICAgICAgICAgICAgICAgIiNGRjMzMzMzMyIsIC8vIDYzCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAoKDAgPD0gdGhlQ29sb3IuSW5kZXhlZCkgJiYgKHJnYkxvb2t1cC5MZW5ndGggPiB0aGVDb2xvci5JbmRleGVkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjb2xvcmluZyBieSBwcmUtc2V0IGNvbG9yIGNvZGVzCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFJHQiA9IHJnYkxvb2t1cFt0aGVDb2xvci5JbmRleGVkXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG51bGwgIT0gdGhlQ29sb3IuUmdiICYmIDAgPCB0aGVDb2xvci5SZ2IuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNvbG9yaW5nIGJ5IFJHQiB2YWx1ZSAoIkZGUlJHR0JCIikKKyAgICAgICAgICAgICAgICB0cmFuc2xhdGVkUkdCID0gIiMiICsgdGhlQ29sb3IuUmdiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNvbG9yaW5nIGJ5IHNoYWRlcyBvZiBncmV5ICgtMSAtPiAwKQorICAgICAgICAgICAgICAgIGlUaW50ID0gKChpbnQpKHRoZUNvbG9yLlRpbnQgKiAxNjApICsgMHg4MCk7CisgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFJHQiA9ICgoaW50KShkZWNpbWFsLlJvdW5kKHRoZUNvbG9yLlRpbnQgKiAtNTEyKSkpLlRvU3RyaW5nKCJYIik7CisgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFJHQiA9ICIjRkYiICsgdHJhbnNsYXRlZFJHQiArIHRyYW5zbGF0ZWRSR0IgKyB0cmFuc2xhdGVkUkdCOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFJHQjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbEZpbGwuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxGaWxsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTcxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxGaWxsLmNzCkBAIC0wLDAgKzEsMTM4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGJhY2tncm91bmQgZmlsbCBvZiBhIGNlbGwKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEZpbGwgOiBTdHlsZUJhc2UKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsRmlsbChFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIGFkZHJlc3MsIGludCBpbmRleCkgOgorICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgYWRkcmVzcykKKworICAgICAgICB7CisgICAgICAgICAgICBJbmRleCA9IGluZGV4OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBwYXR0ZXJuIGZvciBzb2xpZCBmaWxscy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRmlsbFN0eWxlIFBhdHRlcm5UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJbmRleCA9PSBpbnQuTWluVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxGaWxsU3R5bGUuTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHNbSW5kZXhdLlBhdHRlcm5UeXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnQgIT0gbnVsbCkgX2dyYWRpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5GaWxsLCBlU3R5bGVQcm9wZXJ0eS5QYXR0ZXJuVHlwZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ29sb3IgX3BhdHRlcm5Db2xvciA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2xvciBvZiB0aGUgcGF0dGVybgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb2xvciBQYXR0ZXJuQ29sb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9wYXR0ZXJuQ29sb3IgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9wYXR0ZXJuQ29sb3IgPSBuZXcgRXhjZWxDb2xvcihfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIGVTdHlsZUNsYXNzLkZpbGxQYXR0ZXJuQ29sb3IsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoX2dyYWRpZW50ICE9IG51bGwpIF9ncmFkaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfcGF0dGVybkNvbG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ29sb3IgX2JhY2tncm91bmRDb2xvciA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBiYWNrZ3JvdW5kIGNvbG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbG9yIEJhY2tncm91bmRDb2xvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2JhY2tncm91bmRDb2xvciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JhY2tncm91bmRDb2xvciA9IG5ldyBFeGNlbENvbG9yKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuRmlsbEJhY2tncm91bmRDb2xvciwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnQgIT0gbnVsbCkgX2dyYWRpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxHcmFkaWVudEZpbGwgX2dyYWRpZW50PW51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFjY2VzcyB0byBwcm9wZXJ0aWVzIGZvciBncmFkaWVudCBmaWxsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxHcmFkaWVudEZpbGwgR3JhZGllbnQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgX2dyYWRpZW50ID0gbmV3IEV4Y2VsR3JhZGllbnRGaWxsKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBfYmFja2dyb3VuZENvbG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgX3BhdHRlcm5Db2xvciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZ3JhZGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuVHlwZSArIFBhdHRlcm5Db2xvci5JZCArIEJhY2tncm91bmRDb2xvci5JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ncmFkaWVudC5JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxGb250LmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsRm9udC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzAyZDgzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsRm9udC5jcwpAQCAtMCwwICsxLDIzNSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDZWxsIHN0eWxlIEZvbnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxGb250IDogU3R5bGVCYXNlCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbEZvbnQoRXhjZWxTdHlsZXMgc3R5bGVzLCBPZmZpY2VPcGVuWG1sLlhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIENoYW5nZWRFdmVudCwgaW50IFBvc2l0aW9uSUQsIHN0cmluZyBhZGRyZXNzLCBpbnQgaW5kZXgpIDoKKyAgICAgICAgICAgIGJhc2Uoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIFBvc2l0aW9uSUQsIGFkZHJlc3MpCisKKyAgICAgICAgeworICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZm9udAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLk5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5OYW1lLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIFNpemUgb2YgdGhlIGZvbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGZsb2F0IFNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5TaXplLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9udCBmYW1pbHkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBGYW1pbHkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLkZhbWlseTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LkZhbWlseSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENlbGwgY29sb3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbG9yKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuRm9udCwgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2NoZW1lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU2NoZW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5TY2hlbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5TY2hlbWUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb250LWJvbGQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQm9sZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tJbmRleF0uQm9sZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LkJvbGQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb250LWl0YWxpYworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBJdGFsaWMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLkl0YWxpYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5Lkl0YWxpYywgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbnQtU3RyaWtlb3V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFN0cmlrZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tJbmRleF0uU3RyaWtlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuU3RyaWtlLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9udC1VbmRlcmxpbmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgVW5kZXJMaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5VbmRlckxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVbmRlckxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL19DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LlVuZGVybGluZVR5cGUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgRXhjZWxVbmRlckxpbmVUeXBlIFVuZGVyTGluZVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLlVuZGVyTGluZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5VbmRlcmxpbmVUeXBlLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9udC1WZXJ0aWNhbCBBbGlnbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQgVmVydGljYWxBbGlnbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0eWxlcy5Gb250c1tJbmRleF0uVmVydGljYWxBbGlnbiA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KSwgX3N0eWxlcy5Gb250c1tJbmRleF0uVmVydGljYWxBbGlnbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuVmVydGljYWxBbGlnbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgZm9udCBmcm9tIGEgRm9udCBvYmplY3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGb250Ij48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRGcm9tRm9udChGb250IEZvbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWUgPSBGb250Lk5hbWU7CisgICAgICAgICAgICAvL0ZhbWlseT1mbnQuRm9udEZhbWlseS47CisgICAgICAgICAgICBTaXplID0gKGludClGb250LlNpemU7CisgICAgICAgICAgICBTdHJpa2UgPSBGb250LlN0cmlrZW91dDsKKyAgICAgICAgICAgIEJvbGQgPSBGb250LkJvbGQ7CisgICAgICAgICAgICBVbmRlckxpbmUgPSBGb250LlVuZGVybGluZTsKKyAgICAgICAgICAgIEl0YWxpYyA9IEZvbnQuSXRhbGljOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTmFtZSArIFNpemUuVG9TdHJpbmcoKSArIEZhbWlseS5Ub1N0cmluZygpICsgU2NoZW1lLlRvU3RyaW5nKCkgKyBCb2xkLlRvU3RyaW5nKClbMF0gKyBJdGFsaWMuVG9TdHJpbmcoKVswXSArIFN0cmlrZS5Ub1N0cmluZygpWzBdICsgVW5kZXJMaW5lLlRvU3RyaW5nKClbMF0gKyBWZXJ0aWNhbEFsaWduOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsR3JhZGllbnRGaWxsLmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsR3JhZGllbnRGaWxsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDYzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxHcmFkaWVudEZpbGwuY3MKQEAgLTAsMCArMSwxODggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgYmFja2dyb3VuZCBmaWxsIG9mIGEgY2VsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsR3JhZGllbnRGaWxsIDogU3R5bGVCYXNlCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbEdyYWRpZW50RmlsbChFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIGFkZHJlc3MsIGludCBpbmRleCkgOgorICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgYWRkcmVzcykKKworICAgICAgICB7CisgICAgICAgICAgICBJbmRleCA9IGluZGV4OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFuZ2xlIG9mIHRoZSBsaW5lYXIgZ3JhZGllbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBEZWdyZWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxHcmFkaWVudEZpbGxYbWwpX3N0eWxlcy5GaWxsc1tJbmRleF0pLkRlZ3JlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbCwgZVN0eWxlUHJvcGVydHkuR3JhZGllbnREZWdyZWUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMaW5lYXIgb3IgUGF0aCBncmFkaWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxGaWxsR3JhZGllbnRUeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxHcmFkaWVudEZpbGxYbWwpX3N0eWxlcy5GaWxsc1tJbmRleF0pLlR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VHlwZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyBpbiBwZXJjZW50YWdlIGZvcm1hdChmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbSkgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIHRvcCwgMCBtZWFucyB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSBpcyBvbiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgY2VsbC4gKGFwcGxpZXMgdG8gRnJvbSBDb3JuZXIgYW5kIEZyb20gQ2VudGVyIGdyYWRpZW50cykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgVG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKEV4Y2VsR3JhZGllbnRGaWxsWG1sKV9zdHlsZXMuRmlsbHNbSW5kZXhdKS5Ub3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHwgdmFsdWUgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VG9wLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIGluIHBlcmNlbnRhZ2UgZm9ybWF0IChmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbSkgdGhlIHBvc2l0aW9uIG9mIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIGJvdHRvbSwgMCBtZWFucyB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSBpcyBvbiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgY2VsbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBCb3R0b20KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxHcmFkaWVudEZpbGxYbWwpX3N0eWxlcy5GaWxsc1tJbmRleF0pLkJvdHRvbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfCB2YWx1ZSA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbCwgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRCb3R0b20sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgaW4gcGVyY2VudGFnZSBmb3JtYXQgKGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0KSB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIGxlZnQsIDAgbWVhbnMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIGlzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBjZWxsLiAoYXBwbGllcyB0byBGcm9tIENvcm5lciBhbmQgRnJvbSBDZW50ZXIgZ3JhZGllbnRzKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBMZWZ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKEV4Y2VsR3JhZGllbnRGaWxsWG1sKV9zdHlsZXMuRmlsbHNbSW5kZXhdKS5MZWZ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8IHZhbHVlID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuR3JhZGllbnRGaWxsLCBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudExlZnQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgaW4gcGVyY2VudGFnZSBmb3JtYXQgKGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0KSB0aGUgcG9zaXRpb24gb2YgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSAoY29sb3IgMSkuIEZvciByaWdodCwgMCBtZWFucyB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIGlzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBjZWxsLiAoYXBwbGllcyB0byBGcm9tIENvcm5lciBhbmQgRnJvbSBDZW50ZXIgZ3JhZGllbnRzKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBSaWdodAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuUmlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHwgdmFsdWUgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50UmlnaHQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbENvbG9yIF9ncmFkaWVudENvbG9yMSA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdyYWRpZW50IENvbG9yIDEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IxCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnRDb2xvcjEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ncmFkaWVudENvbG9yMSA9IG5ldyBFeGNlbENvbG9yKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuRmlsbEdyYWRpZW50Q29sb3IxLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ncmFkaWVudENvbG9yMTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsQ29sb3IgX2dyYWRpZW50Q29sb3IyID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR3JhZGllbnQgQ29sb3IgMgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb2xvciBDb2xvcjIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9ncmFkaWVudENvbG9yMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2dyYWRpZW50Q29sb3IyID0gbmV3IEV4Y2VsQ29sb3IoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5GaWxsR3JhZGllbnRDb2xvcjIsIHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2dyYWRpZW50Q29sb3IyOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBEZWdyZWUuVG9TdHJpbmcoKSArIFR5cGUgKyBDb2xvcjEuSWQgKyBDb2xvcjIuSWQgKyBUb3AuVG9TdHJpbmcoKSArIEJvdHRvbS5Ub1N0cmluZygpICsgTGVmdC5Ub1N0cmluZygpICsgUmlnaHQuVG9TdHJpbmcoKTsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsTnVtYmVyRm9ybWF0LmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsTnVtYmVyRm9ybWF0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmZkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxOdW1iZXJGb3JtYXQuY3MKQEAgLTAsMCArMSwyMjggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIG51bWJlcmZvcm1hdCBvZiB0aGUgY2VsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbE51bWJlckZvcm1hdCA6IFN0eWxlQmFzZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXQoRXhjZWxTdHlsZXMgc3R5bGVzLCBPZmZpY2VPcGVuWG1sLlhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIENoYW5nZWRFdmVudCwgaW50IFBvc2l0aW9uSUQsIHN0cmluZyBBZGRyZXNzLCBpbnQgaW5kZXgpIDoKKyAgICAgICAgICAgIGJhc2Uoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIFBvc2l0aW9uSUQsIEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4ID0gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG51bWVyaWMgaW5kZXggZnJvciB0aGUgZm9ybWF0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgTnVtRm10SUQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc2V0CisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLk51bWJlcmZvcm1hdCwgIk51bUZtdElEIiwgdmFsdWUsIF93b3JrU2hlZXRJRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBudW1iZXJmb3JtYXQgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybWF0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8X3N0eWxlcy5OdW1iZXJGb3JtYXRzLkNvdW50O2krKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKEluZGV4PT1fc3R5bGVzLk51bWJlckZvcm1hdHNbaV0uTnVtRm10SWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLk51bWJlckZvcm1hdHNbaV0uRm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAiZ2VuZXJhbCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuTnVtYmVyZm9ybWF0LCBlU3R5bGVQcm9wZXJ0eS5Gb3JtYXQsIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkgPyAiR2VuZXJhbCIgOiB2YWx1ZSksIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRm9ybWF0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBudW1lcmljIGZvcm1hdCBpcyBhIGJ1aWxkLWluIGZyb20uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEJ1aWxkSW4geyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRGcm9tQnVpbGRJbkZyb21JRChpbnQgX251bUZtdElkKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKF9udW1GbXRJZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiR2VuZXJhbCI7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIwLjAwIjsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIywjIzAiOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIjLCMjMC4wMCI7CisgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAlIjsKKyAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAuMDAlIjsKKyAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAuMDBFKzAwIjsKKyAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMgPy8/IjsKKyAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMgPz8vPz8iOworICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibW0tZGQteXkiOworICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZC1tbW0teXkiOworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZC1tbW0iOworICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibW1tLXl5IjsKKyAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImg6bW0gQU0vUE0iOworICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaDptbTpzcyBBTS9QTSI7CisgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJoOm1tIjsKKyAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImg6bW06c3MiOworICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibS9kL3l5IGg6bW0iOworICAgICAgICAgICAgICAgIGNhc2UgMzc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIywjIzAgOygjLCMjMCkiOworICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIywjIzAgO1tSZWRdKCMsIyMwKSI7CisgICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIjLCMjMC4wMDsoIywjIzAuMDApIjsKKyAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSI7CisgICAgICAgICAgICAgICAgY2FzZSA0NToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtbTpzcyI7CisgICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJbaF06bW06c3MiOworICAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibW1zcy4wIjsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMjMC4wIjsKKyAgICAgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkAiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBHZXRGcm9tQnVpbGRJZEZyb21Gb3JtYXQoc3RyaW5nIGZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiR2VuZXJhbCI6CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgY2FzZSAiMCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGNhc2UgIjAuMDAiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBjYXNlICIjLCMjMCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICAgICAgICAgIGNhc2UgIiMsIyMwLjAwIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgICAgICAgICAgY2FzZSAiMCUiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTsKKyAgICAgICAgICAgICAgICBjYXNlICIwLjAwJSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDsKKyAgICAgICAgICAgICAgICBjYXNlICIwLjAwRSswMCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMTsKKyAgICAgICAgICAgICAgICBjYXNlICIjID8vPyI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMjsKKyAgICAgICAgICAgICAgICBjYXNlICIjID8/Lz8/IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEzOworICAgICAgICAgICAgICAgIGNhc2UgIm1tLWRkLXl5IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0OworICAgICAgICAgICAgICAgIGNhc2UgImQtbW1tLXl5IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE1OworICAgICAgICAgICAgICAgIGNhc2UgImQtbW1tIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2OworICAgICAgICAgICAgICAgIGNhc2UgIm1tbS15eSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNzsKKyAgICAgICAgICAgICAgICBjYXNlICJoOm1tIEFNL1BNIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE4OworICAgICAgICAgICAgICAgIGNhc2UgImg6bW06c3MgQU0vUE0iOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTk7CisgICAgICAgICAgICAgICAgY2FzZSAiaDptbSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDsKKyAgICAgICAgICAgICAgICBjYXNlICJoOm1tOnNzIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxOworICAgICAgICAgICAgICAgIGNhc2UgIm0vZC95eSBoOm1tIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIyOworICAgICAgICAgICAgICAgIGNhc2UgIiMsIyMwIDsoIywjIzApIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM3OworICAgICAgICAgICAgICAgIGNhc2UgIiMsIyMwIDtbUmVkXSgjLCMjMCkiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzg7CisgICAgICAgICAgICAgICAgY2FzZSAiIywjIzAuMDA7KCMsIyMwLjAwKSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOTsKKyAgICAgICAgICAgICAgICBjYXNlICIjLCMjMC4wMDtbUmVkXSgjLCMjMC4wMCkiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDA7CisgICAgICAgICAgICAgICAgY2FzZSAibW06c3MiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDU7CisgICAgICAgICAgICAgICAgY2FzZSAiW2hdOm1tOnNzIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ2OworICAgICAgICAgICAgICAgIGNhc2UgIm1tc3MuMCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzsKKyAgICAgICAgICAgICAgICBjYXNlICIjIzAuMCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODsKKyAgICAgICAgICAgICAgICBjYXNlICJAIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ5OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWluVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxQYXJhZ3JhcGguY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxQYXJhZ3JhcGguY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3NDVhZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFBhcmFncmFwaC5jcwpAQCAtMCwwICsxLDY3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSGFuZGVscyBwYXJhZ3JhcGggdGV4dAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFBhcmFncmFwaCA6IEV4Y2VsVGV4dEZvbnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBFeGNlbFBhcmFncmFwaChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHJvb3ROb2RlLCBzdHJpbmcgcGF0aCwgc3RyaW5nW10gc2NoZW1hTm9kZU9yZGVyKSA6IAorICAgICAgICAgICAgYmFzZShucywgcm9vdE5vZGUsIHBhdGggKyAiYTpyUHIiLCBzY2hlbWFOb2RlT3JkZXIpCisgICAgICAgIHsgCisKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgVGV4dFBhdGggPSAiLi4vYTp0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFRleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoVGV4dFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlVG9wTm9kZSgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVGV4dFBhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbFBhcmFncmFwaENvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0OTE2MgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFBhcmFncmFwaENvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwxNzcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgY29sbGVjdGlvbiBvZiBQYXJhZ3JhcGggb2JqZWN0cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbiA6IFhtbEhlbHBlciwgSUVudW1lcmFibGU8RXhjZWxQYXJhZ3JhcGg+CisgICAgeworICAgICAgICBMaXN0PEV4Y2VsUGFyYWdyYXBoPiBfbGlzdCA9IG5ldyBMaXN0PEV4Y2VsUGFyYWdyYXBoPigpOworICAgICAgICBzdHJpbmcgX3BhdGg7CisgICAgICAgIGludGVybmFsIEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBwYXRoLCBzdHJpbmdbXSBzY2hlbWFOb2RlT3JkZXIpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBubCA9IHRvcE5vZGUuU2VsZWN0Tm9kZXMocGF0aCArICIvYTpyIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBzY2hlbWFOb2RlT3JkZXI7CisgICAgICAgICAgICBpZiAobmwgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gbmwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdC5BZGQobmV3IEV4Y2VsUGFyYWdyYXBoKG5zLCBuLCAiIixzY2hlbWFOb2RlT3JkZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcGF0aCA9IHBhdGg7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEV4Y2VsUGFyYWdyYXBoIHRoaXNbaW50IEluZGV4XQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIHJpY2ggdGV4dCBzdHJpbmcKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgdGV4dCB0byBhZGQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxQYXJhZ3JhcGggQWRkKHN0cmluZyBUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBYbWxEb2N1bWVudCBkb2M7CisgICAgICAgICAgICBpZiAoVG9wTm9kZSBpcyBYbWxEb2N1bWVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb2MgPSBUb3BOb2RlIGFzIFhtbERvY3VtZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvYyA9IFRvcE5vZGUuT3duZXJEb2N1bWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhtbE5vZGUgcGFyZW50Tm9kZT1Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9wYXRoKTsKKyAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2MuQ3JlYXRlRWxlbWVudCgiYSIsICJyIiwgRXhjZWxQYWNrYWdlLnNjaGVtYURyYXdpbmdzKTsKKyAgICAgICAgICAgIHBhcmVudE5vZGUuQXBwZW5kQ2hpbGQobm9kZSk7CisgICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZG9jLkNyZWF0ZUVsZW1lbnQoImEiLCAiclByIiwgRXhjZWxQYWNrYWdlLnNjaGVtYURyYXdpbmdzKTsKKyAgICAgICAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgIHZhciBydCA9IG5ldyBFeGNlbFBhcmFncmFwaChOYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCAiIiwgU2NoZW1hTm9kZU9yZGVyKTsKKyAgICAgICAgICAgIHJ0LkNvbXBsZXhGb250ID0gIkNhbGlicmkiOworICAgICAgICAgICAgcnQuTGF0aW5Gb250ID0gIkNhbGlicmkiOyAKKyAgICAgICAgICAgIHJ0LlNpemUgPSAxMTsKKworICAgICAgICAgICAgcnQuVGV4dCA9IFRleHQ7CisgICAgICAgICAgICBfbGlzdC5BZGQocnQpOworICAgICAgICAgICAgcmV0dXJuIHJ0OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3QuQ2xlYXIoKTsKKyAgICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlQXQoaW50IEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbm9kZSA9IF9saXN0W0luZGV4XS5Ub3BOb2RlOworICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLk5hbWUgIT0gImE6ciIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuUGFyZW50Tm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKyAgICAgICAgICAgIF9saXN0LlJlbW92ZUF0KEluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxSaWNoVGV4dCBJdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBUb3BOb2RlLlJlbW92ZUNoaWxkKEl0ZW0uVG9wTm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIF9saXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKENvdW50ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBZGQodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzWzBdLlRleHQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGl4ID0gQ291bnQtMTsgaXggPiAwOyBpeC0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVBdChpeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZTxFeGNlbFJpY2hUZXh0PiBNZW1iZXJzCisKKyAgICAgICAgSUVudW1lcmF0b3I8RXhjZWxQYXJhZ3JhcGg+IElFbnVtZXJhYmxlPEV4Y2VsUGFyYWdyYXBoPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0LmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsUmljaFRleHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMzcyOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0LmNzCkBAIC0wLDAgKzEsMzE3IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKiBSaWNoYXJkIFRhbGxlbnQJCQkJCUZpeCBpbmFkdmVydGVudCByZW1vdmFsIG9mIFhNTCBub2RlCQkJCQkyMDEyLTEwLTMxCisgKiBSaWNoYXJkIFRhbGxlbnQJCQkJCVJlbW92ZSBWZXJ0QWxpZ24gbm9kZSBpZiBubyBhbGlnbm1lbnQgc3BlY2lmaWVkCQkyMDEyLTEwLTMxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcmljaHRleHQgcGFydAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUmljaFRleHQgOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsUmljaFRleHQoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSA6CisgICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXI9bmV3IHN0cmluZ1tdIHsiclByIiwgInQiLCAiYiIsICJpIiwic3RyaWtlIiwgInUiLCAidmVydEFsaWduIiAsICJzeiIsICJjb2xvciIsICJyRm9udCIsICJmYW1pbHkiLCAic2NoZW1lIiwgImNoYXJzZXQifTsKKyAgICAgICAgICAgIF9jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBkZWxlZ2F0ZSB2b2lkIENhbGxiYWNrRGVsZWdhdGUoKTsKKyAgICAgICAgQ2FsbGJhY2tEZWxlZ2F0ZSBfY2FsbGJhY2s7CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0Q2FsbGJhY2soQ2FsbGJhY2tEZWxlZ2F0ZSBjYWxsYmFjaykKKyAgICAgICAgeworICAgICAgICAgICAgX2NhbGxiYWNrPWNhbGxiYWNrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBURVhUX1BBVEg9ImQ6dCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dCAKKyAgICAgICAgeyAKKworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoVEVYVF9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOworICAgICAgICAgICAgICAgIC8vIERvbid0IHJlbW92ZSBpZiBibGFuayAtLSBzZXR0aW5nIGEgYmxhbmsgcmljaCB0ZXh0IHZhbHVlIG9uIGEgbm9kZSBpcyBjb21tb24sCisgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUgd2hlbiBhcHBseWluZyBib3RoIGJvbGQgYW5kIGl0YWxpYyB0byB0ZXh0LgorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9QQVRILCB2YWx1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChQcmVzZXJ2ZVNwYWNlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKFRFWFRfUEFUSCwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsICJwcmVzZXJ2ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByZXNlcnZlcyB3aGl0ZXNwYWNlLiBEZWZhdWx0IHRydWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgUHJlc2VydmVTcGFjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW0gPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoVEVYVF9QQVRILCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgIGlmIChlbGVtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5HZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIpPT0icHJlc2VydmUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW0gPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoVEVYVF9QQVRILCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgIGlmIChlbGVtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uUmVtb3ZlQXR0cmlidXRlKCJ4bWw6c3BhY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBCT0xEX1BBVEggPSAiZDpyUHIvZDpiIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQm9sZCB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEJvbGQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4aXN0Tm9kZShCT0xEX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShCT0xEX1BBVEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKEJPTERfUEFUSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKF9jYWxsYmFjayE9bnVsbCkgX2NhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIElUQUxJQ19QQVRIID0gImQ6clByL2Q6aSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEl0YWxpYyB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEl0YWxpYworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBHZXRYbWxOb2RlQm9vbChJVEFMSUNfUEFUSCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFeGlzdE5vZGUoSVRBTElDX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShJVEFMSUNfUEFUSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoSVRBTElDX1BBVEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBTVFJJS0VfUEFUSCA9ICJkOnJQci9kOnN0cmlrZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0cmlrZS1vdXQgdGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTdHJpa2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4aXN0Tm9kZShTVFJJS0VfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKFNUUklLRV9QQVRIKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShTVFJJS0VfUEFUSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgX2NhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFVOREVSTElORV9QQVRIID0gImQ6clByL2Q6dSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVuZGVybGluZWQgdGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBVbmRlckxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4aXN0Tm9kZShVTkRFUkxJTkVfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKFVOREVSTElORV9QQVRIKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShVTkRFUkxJTkVfUEFUSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgX2NhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgVkVSVF9BTElHTl9QQVRIID0gImQ6clByL2Q6dmVydEFsaWduL0B2YWwiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWZXJ0aWNhbCBBbGlnbm1lbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250IFZlcnRpY2FsQWxpZ24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHY9R2V0WG1sTm9kZVN0cmluZyhWRVJUX0FMSUdOX1BBVEgpOworICAgICAgICAgICAgICAgIGlmKHY9PSIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250Lk5vbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KSwgdiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250Lk5vbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZSkKKyAgICAgICAgICAgICAgICB7CisJCQkJCS8vIElmIEV4Y2VsIDIwMTAgZW5jb3VudGVycyBhIHZlcnRpY2FsIGFsaWduIHZhbHVlIG9mIGJsYW5rLCBpdCB3aWxsIG5vdCBsb2FkCisJCQkJCS8vIHRoZSBzcHJlYWRzaGVldC4gU28gaWYgTm9uZSBpcyBzcGVjaWZpZWQsIGRlbGV0ZSB0aGUgbm9kZSwgaXQgd2lsbCBiZSAKKwkJCQkJLy8gcmVjcmVhdGVkIGlmIGEgbmV3IHZhbHVlIGlzIGFwcGxpZWQgbGF0ZXIuCisJCQkJCURlbGV0ZU5vZGUoVkVSVF9BTElHTl9QQVRIKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTZXRYbWxOb2RlU3RyaW5nKFZFUlRfQUxJR05fUEFUSCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VySW52YXJpYW50KCkpOworCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBTSVpFX1BBVEggPSAiZDpyUHIvZDpzei9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRm9udCBzaXplCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBmbG9hdCBTaXplCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvU2luZ2xlKEdldFhtbE5vZGVEZWNpbWFsKFNJWkVfUEFUSCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhTSVpFX1BBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBGT05UX1BBVEggPSAiZDpyUHIvZDpyRm9udC9AdmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTmFtZSBvZiB0aGUgZm9udAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEZvbnROYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKEZPTlRfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZPTlRfUEFUSCwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgX2NhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIENPTE9SX1BBVEggPSAiZDpyUHIvZDpjb2xvci9AcmdiIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGV4dCBjb2xvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQ29sb3IgQ29sb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoQ09MT1JfUEFUSCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbCA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQ09MT1JfUEFUSCwgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS8qLlN1YnN0cmluZygyLCA2KSovKTsKKyAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uIF9jb2xsZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlNTgxYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0Q29sbGVjdGlvbi5jcwpAQCAtMCwwICsxLDI2NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbGxlY3Rpb24gb2YgUmljaHRleHQgb2JqZWN0cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxFeGNlbFJpY2hUZXh0PgorICAgIHsKKyAgICAgICAgTGlzdDxFeGNlbFJpY2hUZXh0PiBfbGlzdCA9IG5ldyBMaXN0PEV4Y2VsUmljaFRleHQ+KCk7CisgICAgICAgIEV4Y2VsUmFuZ2VCYXNlIF9jZWxscz1udWxsOworICAgICAgICBpbnRlcm5hbCBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBubCA9IHRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6ciIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKG5sICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIG5sKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xpc3QuQWRkKG5ldyBFeGNlbFJpY2hUZXh0KG5zLCBuLHRoaXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJhbmdlQmFzZSBjZWxscykgOgorICAgICAgICAgICAgdGhpcyhucywgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgX2NlbGxzID0gY2VsbHM7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHJpY2h0ZXh0IG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsUmljaFRleHQgdGhpc1tpbnQgSW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBpdGVtPV9saXN0W0luZGV4XTsKKyAgICAgICAgICAgICAgICBpZihfY2VsbHMhPW51bGwpIGl0ZW0uU2V0Q2FsbGJhY2soVXBkYXRlQ2VsbHMpOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEl0ZW1zIGluIHRoZSBsaXN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIHJpY2ggdGV4dCBzdHJpbmcKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgdGV4dCB0byBhZGQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxSaWNoVGV4dCBBZGQoc3RyaW5nIFRleHQpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIENvbnZlcnRSaWNodGV4dCgpOworICAgICAgICAgICAgWG1sRG9jdW1lbnQgZG9jOworICAgICAgICAgICAgaWYgKFRvcE5vZGUgaXMgWG1sRG9jdW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG9jID0gVG9wTm9kZSBhcyBYbWxEb2N1bWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb2MgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbm9kZSA9IGRvYy5DcmVhdGVFbGVtZW50KCJkIiwgInIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICBUb3BOb2RlLkFwcGVuZENoaWxkKG5vZGUpOworICAgICAgICAgICAgdmFyIHJ0ID0gbmV3IEV4Y2VsUmljaFRleHQoTmFtZVNwYWNlTWFuYWdlciwgbm9kZSwgdGhpcyk7CisgICAgICAgICAgICBpZiAoX2xpc3QuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsUmljaFRleHQgcHJldkl0ZW0gPSBfbGlzdFtfbGlzdC5Db3VudCAtIDFdOworICAgICAgICAgICAgICAgIHJ0LkZvbnROYW1lID0gcHJldkl0ZW0uRm9udE5hbWU7CisgICAgICAgICAgICAgICAgcnQuU2l6ZSA9IHByZXZJdGVtLlNpemU7CisgICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtLkNvbG9yLklzRW1wdHkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBydC5Db2xvciA9IENvbG9yLkJsYWNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBydC5Db2xvciA9IHByZXZJdGVtLkNvbG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydC5QcmVzZXJ2ZVNwYWNlID0gcnQuUHJlc2VydmVTcGFjZTsKKyAgICAgICAgICAgICAgICBydC5Cb2xkID0gcHJldkl0ZW0uQm9sZDsKKyAgICAgICAgICAgICAgICBydC5JdGFsaWMgPSBwcmV2SXRlbS5JdGFsaWM7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJ0LlVuZGVyTGluZSA9IHByZXZJdGVtLlVuZGVyTGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9jZWxscyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ0LkZvbnROYW1lID0gIkNhbGlicmkiOworICAgICAgICAgICAgICAgIHJ0LlNpemUgPSAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBfY2VsbHMuT2Zmc2V0KDAsIDApLlN0eWxlOworICAgICAgICAgICAgICAgIHJ0LkZvbnROYW1lID0gc3R5bGUuRm9udC5OYW1lOworICAgICAgICAgICAgICAgIHJ0LlNpemUgPSBzdHlsZS5Gb250LlNpemU7CisgICAgICAgICAgICAgICAgcnQuQm9sZCA9IHN0eWxlLkZvbnQuQm9sZDsKKyAgICAgICAgICAgICAgICBydC5JdGFsaWMgPSBzdHlsZS5Gb250Lkl0YWxpYzsKKyAgICAgICAgICAgICAgICBfY2VsbHMuSXNSaWNoVGV4dCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydC5UZXh0ID0gVGV4dDsKKyAgICAgICAgICAgIHJ0LlByZXNlcnZlU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgaWYoX2NlbGxzIT1udWxsKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydC5TZXRDYWxsYmFjayhVcGRhdGVDZWxscyk7CisgICAgICAgICAgICAgICAgVXBkYXRlQ2VsbHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9saXN0LkFkZChydCk7CisgICAgICAgICAgICByZXR1cm4gcnQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCB2b2lkIENvbnZlcnRSaWNodGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY2VsbHMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgdmFyIGlzUnQgPSBfY2VsbHMuV29ya3NoZWV0Ll9mbGFncy5HZXRGbGFnVmFsdWUoX2NlbGxzLl9mcm9tUm93LCBfY2VsbHMuX2Zyb21Db2wsIENlbGxGbGFncy5SaWNoVGV4dCk7CisgICAgICAgICAgICBpZiAoQ291bnQgPT0gMSAmJiBpc1J0ID09IGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jZWxscy5Xb3Jrc2hlZXQuX2ZsYWdzLlNldEZsYWdWYWx1ZShfY2VsbHMuX2Zyb21Sb3csIF9jZWxscy5fZnJvbUNvbCwgdHJ1ZSwgQ2VsbEZsYWdzLlJpY2hUZXh0KTsKKyAgICAgICAgICAgICAgICB2YXIgcyA9IF9jZWxscy5Xb3Jrc2hlZXQuX3N0eWxlcy5HZXRWYWx1ZShfY2VsbHMuX2Zyb21Sb3csIF9jZWxscy5fZnJvbUNvbCk7CisgICAgICAgICAgICAgICAgLy92YXIgZm50ID0gY2VsbC5TdHlsZS5Gb250OworICAgICAgICAgICAgICAgIHZhciBmbnQgPSBfY2VsbHMuV29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZU9iamVjdChzLCBfY2VsbHMuV29ya3NoZWV0LlBvc2l0aW9uSUQsIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0QWRkcmVzcyhfY2VsbHMuX2Zyb21Sb3csIF9jZWxscy5fZnJvbUNvbCkpLkZvbnQ7CisgICAgICAgICAgICAgICAgdGhpc1swXS5QcmVzZXJ2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzWzBdLkJvbGQgPSBmbnQuQm9sZDsKKyAgICAgICAgICAgICAgICB0aGlzWzBdLkZvbnROYW1lID0gZm50Lk5hbWU7CisgICAgICAgICAgICAgICAgdGhpc1swXS5JdGFsaWMgPSBmbnQuSXRhbGljOworICAgICAgICAgICAgICAgIHRoaXNbMF0uU2l6ZSA9IGZudC5TaXplOworICAgICAgICAgICAgICAgIHRoaXNbMF0uVW5kZXJMaW5lID0gZm50LlVuZGVyTGluZTsKKworICAgICAgICAgICAgICAgIGludCBoZXg7CisgICAgICAgICAgICAgICAgaWYgKGZudC5Db2xvci5SZ2IgIT0gIiIgJiYgaW50LlRyeVBhcnNlKGZudC5Db2xvci5SZ2IsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIsIG51bGwsIG91dCBoZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc1swXS5Db2xvciA9IENvbG9yLkZyb21BcmdiKGhleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgVXBkYXRlQ2VsbHMoKQorICAgICAgICB7CisgICAgICAgICAgICBfY2VsbHMuU2V0VmFsdWVSaWNoVGV4dChUb3BOb2RlLklubmVyWG1sKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDbGVhciB0aGUgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0LkNsZWFyKCk7CisgICAgICAgICAgICBUb3BOb2RlLlJlbW92ZUFsbCgpOworICAgICAgICAgICAgVXBkYXRlQ2VsbHMoKTsKKyAgICAgICAgICAgIGlmIChfY2VsbHMgIT0gbnVsbCkgX2NlbGxzLklzUmljaFRleHQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmVzIGFuIGl0ZW0gYXQgdGhlIHNwZWNpZmljIGluZGV4CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTm9kZS5SZW1vdmVDaGlsZChfbGlzdFtJbmRleF0uVG9wTm9kZSk7CisgICAgICAgICAgICBfbGlzdC5SZW1vdmVBdChJbmRleCk7CisgICAgICAgICAgICBpZiAoX2NlbGxzICE9IG51bGwgJiYgX2xpc3QuQ291bnQ9PTApIF9jZWxscy5Jc1JpY2hUZXh0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyBhbiBpdGVtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSXRlbSI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKEV4Y2VsUmljaFRleHQgSXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTm9kZS5SZW1vdmVDaGlsZChJdGVtLlRvcE5vZGUpOworICAgICAgICAgICAgX2xpc3QuUmVtb3ZlKEl0ZW0pOworICAgICAgICAgICAgaWYgKF9jZWxscyAhPSBudWxsICYmIF9saXN0LkNvdW50ID09IDApIF9jZWxscy5Jc1JpY2hUZXh0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBJbnNlcnQoaW50IGluZGV4LCBzdHJpbmcgVGV4dCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIF9saXN0Lkluc2VydChpbmRleCwgaXRlbSk7CisgICAgICAgIC8vfQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRleHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2I9bmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBfbGlzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChpdGVtLlRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWRkKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc1swXS5UZXh0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGl4ID0gMTsgaXggPCBDb3VudDsgaXgrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlQXQoaXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNyZWdpb24gSUVudW1lcmFibGU8RXhjZWxSaWNoVGV4dD4gTWVtYmVycworCisgICAgICAgIElFbnVtZXJhdG9yPEV4Y2VsUmljaFRleHQ+IElFbnVtZXJhYmxlPEV4Y2VsUmljaFRleHQ+LkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuU2VsZWN0KHggPT4geyB4LlNldENhbGxiYWNrKFVwZGF0ZUNlbGxzKTsgcmV0dXJuIHg7IH0pLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKKworICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuU2VsZWN0KHggPT4geyB4LlNldENhbGxiYWNrKFVwZGF0ZUNlbGxzKTsgcmV0dXJuIHg7IH0pLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dEh0bWxVdGlsaXR5LmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsUmljaFRleHRIdG1sVXRpbGl0eS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc0NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsUmljaFRleHRIdG1sVXRpbGl0eS5jcwpAQCAtMCwwICsxLDIwMCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmljaGFyZCBUYWxsZW50CQlJbml0aWFsIFJlbGVhc2UJCQkJMjAxMi0wOC0xMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQoreworCXB1YmxpYyBjbGFzcyBFeGNlbFJpY2hUZXh0SHRtbFV0aWxpdHkKKwl7CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUHJvdmlkZXMgYmFzaWMgSFRNTCBzdXBwb3J0IGJ5IGNvbnZlcnRpbmcgd2VsbC1iZWhhdmVkIEhUTUwgaW50byBhcHByb3ByaWF0ZSBSaWNoVGV4dCBibG9ja3MuCisJCS8vLyBIVE1MIHN1cHBvcnQgaXMgbGltaXRlZCwgYW5kIGRvZXMgbm90IGluY2x1ZGUgZm9udCBjb2xvcnMsIHNpemVzLCBvciB0eXBlZmFjZXMgYXQgdGhpcyB0aW1lLAorCQkvLy8gYW5kIGFsc28gZG9lcyBub3Qgc3VwcG9ydCBDU1Mgc3R5bGUgYXR0cmlidXRlcy4gSXQgZG9lcyBzdXBwb3J0IGxpbmUgYnJlYWtzIHVzaW5nIHRoZSBCUiB0YWcuCisJCS8vLworCQkvLy8gVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgSFRNTCBpbnRvIFJlZ0V4IHBhaXJpbmdzIG9mIGFuIEhUTUwgdGFnIGFuZCB0aGUgdGV4dCB1bnRpbCB0aGUgTkVYVCAKKwkJLy8vIHRhZyAoaWYgYW55KS4gVGhlIHRhZyBpcyBwYXJzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzZXR0aW5nIGNoYW5nZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBsYXN0IHNldAorCQkvLy8gb2Ygc2V0dGluZ3MsIGFuZCBpZiB0aGUgdGV4dCBpcyBub3QgYmxhbmssIGEgbmV3IGJsb2NrIGlzIGFkZGVkIHRvIHJpY2ggdGV4dC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJyYW5nZSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJodG1sIj5UaGUgSFRNTCB0byBwYXJzZSBpbnRvIFJpY2hUZXh0PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0Rm9udE5hbWUiPjwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iZGVmYXVsdEZvbnRTaXplIj48L3BhcmFtPgorCisJCXB1YmxpYyBzdGF0aWMgdm9pZCBTZXRSaWNoVGV4dEZyb21IdG1sKEV4Y2VsUmFuZ2UgcmFuZ2UsIHN0cmluZyBodG1sLCBzdHJpbmcgZGVmYXVsdEZvbnROYW1lLCBzaG9ydCBkZWZhdWx0Rm9udFNpemUpCisJCXsKKwkJCS8vIFJlc2V0IHRoZSBjZWxsIHZhbHVlLCBqdXN0IGluIGNhc2UgdGhlcmUgaXMgYW4gZXhpc3RpbmcgUmljaFRleHQgdmFsdWUuCisJCQlyYW5nZS5WYWx1ZSA9ICIiOworCisJCQkvLyBTYW5pdHkgY2hlY2sgZm9yIGJsYW5rIHZhbHVlcywgc2tpcHMgY3JlYXRpbmcgUmVnZXggb2JqZWN0cyBmb3IgcGVyZm9ybWFuY2UuCisJCQlpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaHRtbCkpCisJCQl7CisJCQkJcmFuZ2UuSXNSaWNoVGV4dCA9IGZhbHNlOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gQ2hhbmdlIGFsbCBCUiB0YWdzIHRvIGxpbmUgYnJlYWtzLiBodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbS9kaXNjdXNzaW9ucy8yMzg2OTIvCisJCQkvLyBDZWxscyB3aXRoIGxpbmUgYnJlYWtzIGFyZW4ndCBuZWNlc3NhcmlseSBjb25zaWRlcmVkIHJpY2ggdGV4dCwgc28gdGhpcyBpcyBwZXJmb3JtZWQKKwkJCS8vIGJlZm9yZSBwYXJzaW5nIHRoZSBIVE1MIHRhZ3MuCisJCQlodG1sID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LlJlcGxhY2UoaHRtbCwgQCI8YnJbXj5dKj4iLCAiXHJcbiIsIFJlZ2V4T3B0aW9ucy5Db21waWxlZCB8IFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKTsKKworCQkJc3RyaW5nIHRhZzsKKwkJCXN0cmluZyB0ZXh0OworCQkJRXhjZWxSaWNoVGV4dCB0aGlzcnQgPSBudWxsOworCQkJYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKworCQkJLy8gR2V0IGFsbCBwYWlycyBvZiBsZWdpdGltYXRlIHRhZ3MgYW5kIHRoZSB0ZXh0IGJldHdlZW4gdGhlbS4gVGhpcyBsb29wIHdpbGwKKwkJCS8vIG9ubHkgZXhlY3V0ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3RhcnQgb3IgZW5kIHRhZy4KKwkJCWZvcmVhY2ggKE1hdGNoIG0gaW4gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4Lk1hdGNoZXMoaHRtbCwgQCI8KC8/W2Etel0rKVtePD5dKj4oW1xzXFNdKj8pKD89PC8/W2Etel0rW148Pl0qPnwkKSIsIFJlZ2V4T3B0aW9ucy5Db21waWxlZCB8IFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKSkKKwkJCXsKKwkJCQlpZiAoaXNGaXJzdCkKKwkJCQl7CisJCQkJCS8vIE9uIHRoZSB2ZXJ5IGZpcnN0IG1hdGNoLCBzZXQgdXAgdGhlIGluaXRpYWwgcmljaCB0ZXh0IG9iamVjdCB3aXRoCisJCQkJCS8vIHRoZSBkZWZhdWx0cyBmb3IgdGhlIHRleHQgQkVGT1JFIHRoZSBtYXRjaC4KKwkJCQkJcmFuZ2UuSXNSaWNoVGV4dCA9IHRydWU7CisJCQkJCXRoaXNydCA9IHJhbmdlLlJpY2hUZXh0LkFkZChDbGVhblRleHQoaHRtbC5TdWJzdHJpbmcoMCwgbS5JbmRleCkpKTsJLy8gTWF5IGJlIDAtbGVuZ3RoCisJCQkJCXRoaXNydC5TaXplID0gZGVmYXVsdEZvbnRTaXplOwkJCQkJCQkJCQkvLyBTZXQgdGhlIGRlZmF1bHQgZm9udCBzaXplCisJCQkJCXRoaXNydC5Gb250TmFtZSA9IGRlZmF1bHRGb250TmFtZTsJCQkJCQkJCQkvLyBTZXQgdGhlIGRlZmF1bHQgZm9udCBuYW1lCisJCQkJCWlzRmlyc3QgPSBmYWxzZTsKKwkJCQl9CisJCQkJLy8gR2V0IHRoZSB0YWcgYW5kIHRoZSBibG9jayBvZiB0ZXh0IHVudGlsIHRoZSBORVhUIHRhZyBvciBFT1MuIElmIHRoZXJlIGFyZSBIVE1MIGVudGl0aWVzCisJCQkJLy8gZW5jb2RlZCwgdW5lbmNvZGUgdGhlbSwgdGhleSBzaG91bGQgYmUgcGFzc2VkIHRvIFJpY2hUZXh0IGFzIG5vcm1hbCBjaGFyYWN0ZXJzIChvdGhlcgorCQkJCS8vIHRoYW4gbm9uLWJyZWFraW5nIHNwYWNlcywgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbm9ybWFsIHNwYWNlcywgdGhleSBicmVhayBFeGNlbC4KKwkJCQl0YWcgPSBtLkdyb3Vwc1sxXS5DYXB0dXJlc1swXS5WYWx1ZTsKKwkJCQl0ZXh0ID0gQ2xlYW5UZXh0KG0uR3JvdXBzWzJdLkNhcHR1cmVzWzBdLlZhbHVlKTsKKworCQkJCWlmICh0aGlzcnQuVGV4dCA9PSAiIikKKwkJCQl7CisJCQkJCS8vIFRoZSBtb3N0IHJlY2VudCByaWNoIHRleHQgYmxvY2sgd2Fzbid0ICphY3R1YWxseSogdXNlZCBsYXN0IHRpbWUgYXJvdW5kLCBzbyB1cGRhdGUKKwkJCQkJLy8gdGhlIHRleHQgYW5kIGtlZXAgaXQgYXMgdGhlICJjdXJyZW50IiBibG9jay4gVGhpcyBoYXBwZW5zIHdpdGggdGhlIGZpcnN0IGJsb2NrIGlmCisJCQkJCS8vIGl0IHN0YXJ0cyB3aXRoIGEgdGFnLCBhbmQgbWF5IGhhcHBlbiBsYXRlciBpZiB0YWdzIGNvbWUgb25lIHJpZ2h0IGFmdGVyIHRoZSBvdGhlci4KKwkJCQkJdGhpc3J0LlRleHQgPSB0ZXh0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBUaGUgY3VycmVudCByaWNoIHRleHQgYmxvY2sgaGFzIHNvbWUgdGV4dCwgc28gY3JlYXRlIGEgbmV3IG9uZS4gUmljaFRleHQuQWRkKCkKKwkJCQkJLy8gYXV0b21hdGljYWxseSBhcHBsaWVzIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaywgb3RoZXIgdGhhbiB2ZXJ0aWNhbAorCQkJCQkvLyBhbGlnbm1lbnQuCisJCQkJCXRoaXNydCA9IHJhbmdlLlJpY2hUZXh0LkFkZCh0ZXh0KTsKKwkJCQl9CisJCQkJLy8gT3ZlcnJpZGUgdGhlIHNldHRpbmdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRhZywga2VlcCBhbGwgb3RoZXIgc2V0dGluZ3MuCisJCQkJU2V0U3R5bGVGcm9tVGFnKHRhZywgdGhpc3J0KTsKKwkJCX0KKworCQkJaWYgKHRoaXNydCA9PSBudWxsKQorCQkJeworCQkJCS8vIE5vIEhUTUwgdGFncyB3ZXJlIGZvdW5kLCBzbyB0cmVhdCB0aGlzIGFzIGEgbm9ybWFsIHRleHQgdmFsdWUuCisJCQkJcmFuZ2UuSXNSaWNoVGV4dCA9IGZhbHNlOworCQkJCXJhbmdlLlZhbHVlID0gQ2xlYW5UZXh0KGh0bWwpOworCQkJfQorCQkJZWxzZSBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkodGhpc3J0LlRleHQpKQorCQkJeworCQkJCS8vIFJpY2ggdGV4dCB3YXMgZm91bmQsIGJ1dCB0aGUgbGFzdCBub2RlIGNvbnRhaW5zIG5vIHRleHQsIHNvIHJlbW92ZSBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmLAorCQkJCS8vIHNheSwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGlzIGFuIGVuZCB0YWcgb3IgdW5zdXBwb3J0ZWQgdGFnIChjb21tb24pLgorCQkJCXJhbmdlLlJpY2hUZXh0LlJlbW92ZSh0aGlzcnQpOworCisJCQkJLy8gRmFpbHNhZmUgLS0gdGhlIEhUTUwgbWF5IGJlIGp1c3QgdGFncywgbm8gdGV4dCwgaW4gd2hpY2ggY2FzZSB0aGVyZSBtYXkgYmUgbm8gcmljaCB0ZXh0CisJCQkJLy8gZGlyZWN0aXZlcyB0aGF0IHJlbWFpbi4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgdHVybiBvZmYgcmljaCB0ZXh0IGFuZCB0cmVhdCB0aGlzIGxpa2UgYSBibGFuaworCQkJCS8vIGNlbGwgdmFsdWUuCisJCQkJaWYgKHJhbmdlLlJpY2hUZXh0LkNvdW50ID09IDApCisJCQkJeworCQkJCQlyYW5nZS5Jc1JpY2hUZXh0ID0gZmFsc2U7CisJCQkJCXJhbmdlLlZhbHVlID0gIiI7CisJCQkJfQorCisJCQl9CisKKwkJfQorCisJCXByaXZhdGUgc3RhdGljIHZvaWQgU2V0U3R5bGVGcm9tVGFnKHN0cmluZyB0YWcsIEV4Y2VsUmljaFRleHQgc2V0dGluZ3MpCisJCXsKKwkJCXN3aXRjaCAodGFnLlRvTG93ZXIoKSkKKwkJCXsKKwkJCQljYXNlICJiIjoKKwkJCQljYXNlICJzdHJvbmciOgorCQkJCQlzZXR0aW5ncy5Cb2xkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAiaSI6CisJCQkJY2FzZSAiZW0iOgorCQkJCQlzZXR0aW5ncy5JdGFsaWMgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQljYXNlICJ1IjoKKwkJCQkJc2V0dGluZ3MuVW5kZXJMaW5lID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAicyI6CisJCQkJY2FzZSAic3RyaWtlIjoKKwkJCQkJc2V0dGluZ3MuU3RyaWtlID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAic3VwIjoKKwkJCQkJc2V0dGluZ3MuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250LlN1cGVyc2NyaXB0OworCQkJCQlicmVhazsKKwkJCQljYXNlICJzdWIiOgorCQkJCQlzZXR0aW5ncy5WZXJ0aWNhbEFsaWduID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuU3Vic2NyaXB0OworCQkJCQlicmVhazsKKwkJCQljYXNlICIvYiI6CisJCQkJY2FzZSAiL3N0cm9uZyI6CisJCQkJCXNldHRpbmdzLkJvbGQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAiL2kiOgorCQkJCWNhc2UgIi9lbSI6CisJCQkJCXNldHRpbmdzLkl0YWxpYyA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlICIvdSI6CisJCQkJCXNldHRpbmdzLlVuZGVyTGluZSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlICIvcyI6CisJCQkJY2FzZSAiL3N0cmlrZSI6CisJCQkJCXNldHRpbmdzLlN0cmlrZSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlICIvc3VwIjoKKwkJCQljYXNlICIvc3ViIjoKKwkJCQkJc2V0dGluZ3MuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250Lk5vbmU7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCS8vIHVuc3VwcG9ydGVkIEhUTUwsIG5vIHN0eWxlIGNoYW5nZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgc3RhdGljIHN0cmluZyBDbGVhblRleHQoc3RyaW5nIHMpCisJCXsKKwkJCS8vIE5lZWQgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIChuYW1lZCBvciBudW1iZXJlZCkgaW50byBhY3R1YWwgVW5pY29kZSBjaGFyYWN0ZXJzCisJCQlzID0gU3lzdGVtLldlYi5IdHRwVXRpbGl0eS5IdG1sRGVjb2RlKHMpOworCQkJLy8gUmVtb3ZlIGFueSBub24tYnJlYWtpbmcgc3BhY2VzLCBraWxscyBFeGNlbAorCQkJcyA9IHMuUmVwbGFjZSgiXHUwMEEwIiwgIiAiKTsKKwkJCXJldHVybiBzOworCQl9CisKKwl9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxTdHlsZS5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbFN0eWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWRhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxTdHlsZS5jcwpAQCAtMCwwICsxLDI1MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUb3BsZXZlbCBjbGFzcyBmb3IgY2VsbCBzdHlsaW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU3R5bGUgOiBTdHlsZUJhc2UKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsU3R5bGUoRXhjZWxTdHlsZXMgc3R5bGVzLCBPZmZpY2VPcGVuWG1sLlhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIENoYW5nZWRFdmVudCwgaW50IHBvc2l0aW9uSUQsIHN0cmluZyBBZGRyZXNzLCBpbnQgeGZzSWQpIDoKKyAgICAgICAgICAgIGJhc2Uoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIHBvc2l0aW9uSUQsIEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4ID0geGZzSWQ7CisgICAgICAgICAgICBFeGNlbFhmcyB4ZnM7CisgICAgICAgICAgICBpZiAocG9zaXRpb25JRCA+IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhmcyA9IF9zdHlsZXMuQ2VsbFhmc1t4ZnNJZF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeGZzID0gX3N0eWxlcy5DZWxsU3R5bGVYZnNbeGZzSWRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3R5bGVzID0gc3R5bGVzOworICAgICAgICAgICAgUG9zaXRpb25JRCA9IHBvc2l0aW9uSUQ7CisgICAgICAgICAgICBOdW1iZXJmb3JtYXQgPSBuZXcgRXhjZWxOdW1iZXJGb3JtYXQoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIFBvc2l0aW9uSUQsIEFkZHJlc3MsIHhmcy5OdW1iZXJGb3JtYXRJZCk7CisgICAgICAgICAgICBGb250ID0gbmV3IEV4Y2VsRm9udChzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgQWRkcmVzcywgeGZzLkZvbnRJZCk7CisgICAgICAgICAgICBGaWxsID0gbmV3IEV4Y2VsRmlsbChzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgQWRkcmVzcywgeGZzLkZpbGxJZCk7CisgICAgICAgICAgICBCb3JkZXIgPSBuZXcgQm9yZGVyKHN0eWxlcywgQ2hhbmdlZEV2ZW50LCBQb3NpdGlvbklELCBBZGRyZXNzLCB4ZnMuQm9yZGVySWQpOyAKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOdW1iZXJmb3JtYXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsTnVtYmVyRm9ybWF0IE51bWJlcmZvcm1hdCB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbnQgc3R5bGluZworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxGb250IEZvbnQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaWxsIFN0eWxpbmcKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsRmlsbCBGaWxsIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQm9yZGVyIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgQm9yZGVyIEJvcmRlciB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBob3Jpem9udGFsIGFsaWdubWVudCBpbiB0aGUgY2VsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50IEhvcml6b250YWxBbGlnbm1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uSG9yaXpvbnRhbEFsaWdubWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLlN0eWxlLCBlU3R5bGVQcm9wZXJ0eS5Ib3Jpem9udGFsQWxpZ24sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdmVydGljYWwgYWxpZ25tZW50IGluIHRoZSBjZWxsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IFZlcnRpY2FsQWxpZ25tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLlZlcnRpY2FsQWxpZ25tZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LlZlcnRpY2FsQWxpZ24sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcmFwIHRoZSB0ZXh0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFdyYXBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLldyYXBUZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LldyYXBUZXh0LCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZGluZ29yZGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFJlYWRpbmdPcmRlciBSZWFkaW5nT3JkZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uUmVhZGluZ09yZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LlJlYWRpbmdPcmRlciwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNocmluayB0aGUgdGV4dCB0byBmaXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hyaW5rVG9GaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uU2hyaW5rVG9GaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuU2hyaW5rVG9GaXQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWFyZ2luIGJldHdlZW4gdGhlIGJvcmRlciBhbmQgdGhlIHRleHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBJbmRlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uSW5kZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwwIHx8IHZhbHVlID4gMjUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiSW5kZW50IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTAiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLlN0eWxlLCBlU3R5bGVQcm9wZXJ0eS5JbmRlbnQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUZXh0IG9yaWVudGF0aW9uIGluIGRlZ3JlZXMuIFZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMTgwLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFRleHRSb3RhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5UZXh0Um90YXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMTgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVGV4dFJvdGF0aW9uIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LlRleHRSb3RhdGlvbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgdGhlIGNlbGwgaXMgbG9ja2VkIGZvciBlZGl0aW5nIHdoZW4gdGhlIHNoZWV0IGlzIHByb3RlY3RlZAorICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRXhjZWxXb3Jrc2hlZXQuUHJvdGVjdGlvbiIvPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBMb2NrZWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uTG9ja2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LkxvY2tlZCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgdGhlIGZvcm11bGEgaXMgaGlkZGVuIHdoZW4gdGhlIHNoZWV0IGlzIHByb3RlY3RlZC4KKyAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkV4Y2VsV29ya3NoZWV0LlByb3RlY3Rpb24iLz4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgSGlkZGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLkhpZGRlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLlN0eWxlLCBlU3R5bGVQcm9wZXJ0eS5IaWRkZW4sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgY29uc3Qgc3RyaW5nIHhmSWRQYXRoID0gIkB4ZklkIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGluZGV4IGluIHRoZSBzdHlsZSBjb2xsZWN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgWGZJZCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uWGZJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLlN0eWxlLCBlU3R5bGVQcm9wZXJ0eS5YZklkLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgaW50IFBvc2l0aW9uSUQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsU3R5bGVzIFN0eWxlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCAKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcmZvcm1hdC5JZCArICJ8IiArIEZvbnQuSWQgKyAifCIgKyBGaWxsLklkICsgInwiICsgQm9yZGVyLklkICsgInwiICsgVmVydGljYWxBbGlnbm1lbnQgKyAifCIgKyBIb3Jpem9udGFsQWxpZ25tZW50ICsgInwiICsgV3JhcFRleHQuVG9TdHJpbmcoKSArICJ8IiArIFJlYWRpbmdPcmRlci5Ub1N0cmluZygpICsgInwiICsgWGZJZC5Ub1N0cmluZygpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsVGV4dEZvbnQuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxUZXh0Rm9udC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY2MmUzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsVGV4dEZvbnQuY3MKQEAgLTAsMCArMSwzMDcgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTGluZXN0eWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlVW5kZXJMaW5lVHlwZQorICAgIHsKKyAgICAgICAgRGFzaCwKKyAgICAgICAgRGFzaEhlYXZ5LAorICAgICAgICBEYXNoTG9uZywgCisgICAgICAgIERhc2hMb25nSGVhdnksCisgICAgICAgIERvdWJsZSwKKyAgICAgICAgRG90RGFzaCwKKyAgICAgICAgRG90RGFzaEhlYXZ5LAorICAgICAgICBEb3REb3REYXNoLAorICAgICAgICBEb3REb3REYXNoSGVhdnksCisgICAgICAgIERvdHRlZCwKKyAgICAgICAgRG90dGVkSGVhdnksCisgICAgICAgIEhlYXZ5LAorICAgICAgICBOb25lLAorICAgICAgICBTaW5nbGUsCisgICAgICAgIFdhdnksCisgICAgICAgIFdhdnlEYmwsCisgICAgICAgIFdhdnlIZWF2eSwKKyAgICAgICAgV29yZHMKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUeXBlIG9mIGZvbnQgc3RyaWtlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlU3RyaWtlVHlwZQorICAgIHsKKyAgICAgICAgRG91YmxlLAorICAgICAgICBObywKKyAgICAgICAgU2luZ2xlCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVXNlZCBieSBSaWNoLXRleHQgYW5kIFBhcmFncmFwaHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxUZXh0Rm9udCA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgc3RyaW5nIF9wYXRoOworICAgICAgICBYbWxOb2RlIF9yb290Tm9kZTsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxUZXh0Rm9udChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgcm9vdE5vZGUsIHN0cmluZyBwYXRoLCBzdHJpbmdbXSBzY2hlbWFOb2RlT3JkZXIpCisgICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgcm9vdE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IHNjaGVtYU5vZGVPcmRlcjsKKyAgICAgICAgICAgIF9yb290Tm9kZSA9IHJvb3ROb2RlOworICAgICAgICAgICAgaWYgKHBhdGggIT0gIiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sTm9kZSBub2RlID0gcm9vdE5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVG9wTm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX3BhdGggPSBwYXRoOworICAgICAgICB9CisgICAgICAgIHN0cmluZyBfZm9udExhdGluUGF0aCA9ICJhOmxhdGluL0B0eXBlZmFjZSI7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTGF0aW5Gb250CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9mb250TGF0aW5QYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9mb250TGF0aW5QYXRoLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgdm9pZCBDcmVhdGVUb3BOb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wYXRoIT0iIiAmJiBUb3BOb2RlID09IF9yb290Tm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9wYXRoKTsKKyAgICAgICAgICAgICAgICBUb3BOb2RlID0gX3Jvb3ROb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfZm9udENzUGF0aCA9ICJhOmNzL0B0eXBlZmFjZSI7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29tcGxleEZvbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX2ZvbnRDc1BhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlVG9wTm9kZSgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2ZvbnRDc1BhdGgsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgX2JvbGRQYXRoID0gIkBiIjsKKyAgICAgICAgcHVibGljIGJvb2wgQm9sZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2JvbGRQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9ib2xkUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfdW5kZXJMaW5lUGF0aCA9ICJAdSI7CisgICAgICAgIHB1YmxpYyBlVW5kZXJMaW5lVHlwZSBVbmRlckxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZVVuZGVybGluZShHZXRYbWxOb2RlU3RyaW5nKF91bmRlckxpbmVQYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVUb3BOb2RlKCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdW5kZXJMaW5lUGF0aCwgVHJhbnNsYXRlVW5kZXJsaW5lVGV4dCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfdW5kZXJMaW5lQ29sb3JQYXRoID0gImE6dUZpbGwvYTpzb2xpZEZpbGwvYTpzcmdiQ2xyL0B2YWwiOworICAgICAgICBwdWJsaWMgQ29sb3IgVW5kZXJMaW5lQ29sb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZUNvbG9yUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbCA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF91bmRlckxpbmVDb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikuU3Vic3RyaW5nKDIsIDYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgX2l0YWxpY1BhdGggPSAiQGkiOworICAgICAgICBwdWJsaWMgYm9vbCBJdGFsaWMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9pdGFsaWNQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9pdGFsaWNQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9zdHJpa2VQYXRoID0gIkBzdHJpa2UiOworICAgICAgICBwdWJsaWMgZVN0cmlrZVR5cGUgU3RyaWtlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVTdHJpa2UoR2V0WG1sTm9kZVN0cmluZyhfc3RyaWtlUGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JlYXRlVG9wTm9kZSgpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3N0cmlrZVBhdGgsIFRyYW5zbGF0ZVN0cmlrZVRleHQodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgX3NpemVQYXRoID0gIkBzeiI7CisgICAgICAgIHB1YmxpYyBmbG9hdCBTaXplCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KF9zaXplUGF0aCkgLyAxMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVUb3BOb2RlKCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2l6ZVBhdGgsICgoaW50KSh2YWx1ZSAqIDEwMCkpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfY29sb3JQYXRoID0gImE6c29saWRGaWxsL2E6c3JnYkNsci9AdmFsIjsKKyAgICAgICAgcHVibGljIENvbG9yIENvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBjb2wgPSBHZXRYbWxOb2RlU3RyaW5nKF9jb2xvclBhdGgpOworICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRW1wdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihpbnQuUGFyc2UoY29sLCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVUb3BOb2RlKCk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfY29sb3JQYXRoLCB2YWx1ZS5Ub0FyZ2IoKS5Ub1N0cmluZygiWCIpLlN1YnN0cmluZygyLCA2KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiAiVHJhbnNsYXRlIG1ldGhvZHMiCisgICAgICAgIHByaXZhdGUgZVVuZGVyTGluZVR5cGUgVHJhbnNsYXRlVW5kZXJsaW5lKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAic25nIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVVbmRlckxpbmVUeXBlLlNpbmdsZTsKKyAgICAgICAgICAgICAgICBjYXNlICJkYmwiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVVuZGVyTGluZVR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVW5kZXJMaW5lVHlwZS5Ob25lOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVVuZGVyTGluZVR5cGUpRW51bS5QYXJzZSh0eXBlb2YoZVVuZGVyTGluZVR5cGUpLCB0ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBUcmFuc2xhdGVVbmRlcmxpbmVUZXh0KGVVbmRlckxpbmVUeXBlIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVVuZGVyTGluZVR5cGUuU2luZ2xlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNuZyI7CisgICAgICAgICAgICAgICAgY2FzZSBlVW5kZXJMaW5lVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZGJsIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmV0ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldC5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHJldC5TdWJzdHJpbmcoMSwgcmV0Lkxlbmd0aCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgZVN0cmlrZVR5cGUgVHJhbnNsYXRlU3RyaWtlKHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiZGJsU3RyaWtlIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTdHJpa2VUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlICJzbmdTdHJpa2UiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVN0cmlrZVR5cGUuU2luZ2xlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlU3RyaWtlVHlwZS5ObzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBUcmFuc2xhdGVTdHJpa2VUZXh0KGVTdHJpa2VUeXBlIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVN0cmlrZVR5cGUuU2luZ2xlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNuZ1N0cmlrZSI7CisgICAgICAgICAgICAgICAgY2FzZSBlU3RyaWtlVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZGJsU3RyaWtlIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5vU3RyaWtlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldCB0aGUgZm9udCBzdHlsZSBmcm9tIGEgZm9udCBvYmplY3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGb250Ij48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBTZXRGcm9tRm9udChGb250IEZvbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIExhdGluRm9udCA9IEZvbnQuTmFtZTsKKyAgICAgICAgICAgIENvbXBsZXhGb250ID0gRm9udC5OYW1lOworICAgICAgICAgICAgU2l6ZSA9IEZvbnQuU2l6ZTsKKyAgICAgICAgICAgIGlmIChGb250LkJvbGQpIEJvbGQgPSBGb250LkJvbGQ7CisgICAgICAgICAgICBpZiAoRm9udC5JdGFsaWMpIEl0YWxpYyA9IEZvbnQuSXRhbGljOworICAgICAgICAgICAgaWYgKEZvbnQuVW5kZXJsaW5lKSBVbmRlckxpbmUgPSBlVW5kZXJMaW5lVHlwZS5TaW5nbGU7CisgICAgICAgICAgICBpZiAoRm9udC5TdHJpa2VvdXQpIFN0cmlrZSA9IGVTdHJpa2VUeXBlLlNpbmdsZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9JU3R5bGUuY3MgYi9FUFBsdXMvU3R5bGUvSVN0eWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjM1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvSVN0eWxlLmNzCkBAIC0wLDAgKzEsNDQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQoreworICAgIGludGVybmFsIGludGVyZmFjZSBJU3R5bGUKKyAgICB7CisgICAgICAgIHZvaWQgU2V0TmV3U3R5bGVJRChzdHJpbmcgdmFsdWUpOworICAgICAgICB1bG9uZyBJZCB7Z2V0O30KKyAgICAgICAgRXhjZWxTdHlsZSBFeGNlbFN0eWxle2dldDt9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1N0eWxlQmFzZS5jcyBiL0VQUGx1cy9TdHlsZS9TdHlsZUJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkZGRmMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9TdHlsZUJhc2UuY3MKQEAgLTAsMCArMSwxODQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJvcmRlciBsaW5lIHN0eWxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFeGNlbEJvcmRlclN0eWxlCisgICAgeworICAgICAgICBOb25lLAorICAgICAgICBIYWlyLAorICAgICAgICBEb3R0ZWQsCisgICAgICAgIERhc2hEb3QsCisgICAgICAgIFRoaW4sCisgICAgICAgIERhc2hEb3REb3QsCisgICAgICAgIERhc2hlZCwKKyAgICAgICAgTWVkaXVtRGFzaERvdERvdCwKKyAgICAgICAgTWVkaXVtRGFzaGVkLAorICAgICAgICBNZWRpdW1EYXNoRG90LAorICAgICAgICBUaGljaywKKyAgICAgICAgTWVkaXVtLAorICAgICAgICBEb3VibGUKKyAgICB9OworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSG9yaXpvbnRhbCB0ZXh0IGFsaWdubWVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50CisgICAgeworICAgICAgICBHZW5lcmFsLAorICAgICAgICBMZWZ0LAorICAgICAgICBDZW50ZXIsCisgICAgICAgIENlbnRlckNvbnRpbnVvdXMsCisgICAgICAgIFJpZ2h0LAorICAgICAgICBGaWxsLAorICAgICAgICBEaXN0cmlidXRlZCwKKyAgICAgICAgSnVzdGlmeQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFZlcnRpY2FsIHRleHQgYWxpZ25tZW50CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50CisgICAgeworICAgICAgICBUb3AsCisgICAgICAgIENlbnRlciwKKyAgICAgICAgQm90dG9tLAorICAgICAgICBEaXN0cmlidXRlZCwKKyAgICAgICAgSnVzdGlmeQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZvbnQtVmVydGljYWwgQWxpZ24KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250CisgICAgeworICAgICAgICBOb25lLAorICAgICAgICBTdWJzY3JpcHQsCisgICAgICAgIFN1cGVyc2NyaXB0CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRm9udC1VbmRlcmxpbmVzdHlsZSBmb3IgCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFeGNlbFVuZGVyTGluZVR5cGUKKyAgICB7CisgICAgICAgIE5vbmUsCisgICAgICAgIFNpbmdsZSwKKyAgICAgICAgRG91YmxlLAorICAgICAgICBTaW5nbGVBY2NvdW50aW5nLAorICAgICAgICBEb3VibGVBY2NvdW50aW5nCisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRmlsbCBwYXR0ZXJuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFeGNlbEZpbGxTdHlsZQorICAgIHsKKyAgICAgICAgTm9uZSwKKyAgICAgICAgU29saWQsCisgICAgICAgIERhcmtHcmF5LAorICAgICAgICBNZWRpdW1HcmF5LAorICAgICAgICBMaWdodEdyYXksCisgICAgICAgIEdyYXkxMjUsCisgICAgICAgIEdyYXkwNjI1LAorICAgICAgICBEYXJrVmVydGljYWwsCisgICAgICAgIERhcmtIb3Jpem9udGFsLAorICAgICAgICBEYXJrRG93biwKKyAgICAgICAgRGFya1VwLAorICAgICAgICBEYXJrR3JpZCwKKyAgICAgICAgRGFya1RyZWxsaXMsCisgICAgICAgIExpZ2h0VmVydGljYWwsCisgICAgICAgIExpZ2h0SG9yaXpvbnRhbCwKKyAgICAgICAgTGlnaHREb3duLAorICAgICAgICBMaWdodFVwLAorICAgICAgICBMaWdodEdyaWQsCisgICAgICAgIExpZ2h0VHJlbGxpcworICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFR5cGUgb2YgZ3JhZGllbnQgZmlsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gRXhjZWxGaWxsR3JhZGllbnRUeXBlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBObyBncmFkaWVudCBmaWxsLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTm9uZSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBncmFkaWVudCBmaWxsIGlzIG9mIGxpbmVhciBncmFkaWVudCB0eXBlLiBMaW5lYXIgZ3JhZGllbnQgdHlwZSBtZWFucyB0aGF0IHRoZSB0cmFuc2l0aW9uIGZyb20gb25lIGNvbG9yIHRvIHRoZSBuZXh0IGlzIGFsb25nIGEgbGluZSAoZS5nLiwgaG9yaXpvbnRhbCwgdmVydGljYWwsZGlhZ29uYWwsIGV0Yy4pCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIExpbmVhciwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBncmFkaWVudCBmaWxsIGlzIG9mIHBhdGggZ3JhZGllbnQgdHlwZS4gUGF0aCBncmFkaWVudCB0eXBlIG1lYW5zIHRoZSB0aGF0IHRoZSBib3VuZGFyeSBvZiB0cmFuc2l0aW9uIGZyb20gb25lIGNvbG9yIHRvIHRoZSBuZXh0IGlzIGEgcmVjdGFuZ2xlLCBkZWZpbmVkIGJ5IHRvcCxib3R0b20sIGxlZnQsIGFuZCByaWdodCBhdHRyaWJ1dGVzIG9uIHRoZSBncmFkaWVudEZpbGwgZWxlbWVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUGF0aAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSByZWFkaW5nIG9yZGVyCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBFeGNlbFJlYWRpbmdPcmRlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZGluZyBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSB0ZXh0IGZvciB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyOiBpZiBpdCBpcyBhIHN0cm9uZyByaWdodC10by1sZWZ0IGNoYXJhY3RlciwgdGhlIHJlYWRpbmcgb3JkZXIgaXMgcmlnaHQtdG8tbGVmdDsgb3RoZXJ3aXNlLCB0aGUgcmVhZGluZyBvcmRlciBsZWZ0LXRvLXJpZ2h0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDb250ZXh0RGVwZW5kZW50PTAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExlZnQgdG8gUmlnaHQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgTGVmdFRvUmlnaHQ9MSwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmlnaHQgdG8gTGVmdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBSaWdodFRvTGVmdD0yCisgICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHlsZUJhc2UKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBFeGNlbFN0eWxlcyBfc3R5bGVzOworICAgICAgICBpbnRlcm5hbCBPZmZpY2VPcGVuWG1sLlhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIF9DaGFuZ2VkRXZlbnQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgX3Bvc2l0aW9uSUQ7CisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgX2FkZHJlc3M7CisgICAgICAgIGludGVybmFsIFN0eWxlQmFzZShFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIEFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdHlsZXMgPSBzdHlsZXM7CisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50ID0gQ2hhbmdlZEV2ZW50OworICAgICAgICAgICAgX2FkZHJlc3MgPSBBZGRyZXNzOworICAgICAgICAgICAgX3Bvc2l0aW9uSUQgPSBQb3NpdGlvbklEOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBJbmRleCB7IGdldDsgc2V0O30KKyAgICAgICAgaW50ZXJuYWwgYWJzdHJhY3Qgc3RyaW5nIElkIHtnZXQ7fQorCisgICAgICAgIGludGVybmFsIHZpcnR1YWwgdm9pZCBTZXRJbmRleChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4ID0gaW5kZXg7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvU3R5bGVDaGFuZ2VFdmVudEFyZ3MuY3MgYi9FUFBsdXMvU3R5bGUvU3R5bGVDaGFuZ2VFdmVudEFyZ3MuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3MWRmMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9TdHlsZUNoYW5nZUV2ZW50QXJncy5jcwpAQCAtMCwwICsxLDExMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICBpbnRlcm5hbCBlbnVtIGVTdHlsZUNsYXNzCisgICAgeworICAgICAgICBOdW1iZXJmb3JtYXQsCisgICAgICAgIEZvbnQsICAgIAorICAgICAgICBCb3JkZXIsCisgICAgICAgIEJvcmRlclRvcCwKKyAgICAgICAgQm9yZGVyTGVmdCwKKyAgICAgICAgQm9yZGVyQm90dG9tLAorICAgICAgICBCb3JkZXJSaWdodCwKKyAgICAgICAgQm9yZGVyRGlhZ29uYWwsCisgICAgICAgIEZpbGwsCisgICAgICAgIEdyYWRpZW50RmlsbCwKKyAgICAgICAgRmlsbEJhY2tncm91bmRDb2xvciwKKyAgICAgICAgRmlsbFBhdHRlcm5Db2xvciwKKyAgICAgICAgRmlsbEdyYWRpZW50Q29sb3IxLAorICAgICAgICBGaWxsR3JhZGllbnRDb2xvcjIsCisgICAgICAgIE5hbWVkU3R5bGUsCisgICAgICAgIFN0eWxlCisgICAgfTsKKyAgICBpbnRlcm5hbCBlbnVtIGVTdHlsZVByb3BlcnR5CisgICAgeworICAgICAgICBGb3JtYXQsCisgICAgICAgIE5hbWUsCisgICAgICAgIFNpemUsCisgICAgICAgIEJvbGQsCisgICAgICAgIEl0YWxpYywKKyAgICAgICAgU3RyaWtlLAorICAgICAgICBDb2xvciwKKyAgICAgICAgVGludCwKKyAgICAgICAgSW5kZXhlZENvbG9yLAorICAgICAgICBBdXRvQ29sb3IsCisgICAgICAgIEdyYWRpZW50Q29sb3IsCisgICAgICAgIEZhbWlseSwKKyAgICAgICAgU2NoZW1lLAorICAgICAgICBVbmRlcmxpbmVUeXBlLAorICAgICAgICBIb3Jpem9udGFsQWxpZ24sCisgICAgICAgIFZlcnRpY2FsQWxpZ24sCisgICAgICAgIEJvcmRlciwKKyAgICAgICAgTmFtZWRTdHlsZSwKKyAgICAgICAgU3R5bGUsCisgICAgICAgIFBhdHRlcm5UeXBlLAorICAgICAgICBSZWFkaW5nT3JkZXIsCisgICAgICAgIFdyYXBUZXh0LAorICAgICAgICBUZXh0Um90YXRpb24sCisgICAgICAgIExvY2tlZCwKKyAgICAgICAgSGlkZGVuLAorICAgICAgICBTaHJpbmtUb0ZpdCwKKyAgICAgICAgQm9yZGVyRGlhZ29uYWxVcCwKKyAgICAgICAgQm9yZGVyRGlhZ29uYWxEb3duLAorICAgICAgICBHcmFkaWVudERlZ3JlZSwKKyAgICAgICAgR3JhZGllbnRUeXBlLAorICAgICAgICBHcmFkaWVudFRvcCwKKyAgICAgICAgR3JhZGllbnRCb3R0b20sCisgICAgICAgIEdyYWRpZW50TGVmdCwKKyAgICAgICAgR3JhZGllbnRSaWdodCwKKyAgICAgICAgWGZJZCwKKyAgICAgICAgSW5kZW50CisgICAgfQorICAgIGludGVybmFsIGNsYXNzIFN0eWxlQ2hhbmdlRXZlbnRBcmdzIDogRXZlbnRBcmdzCisgICAgeworICAgICAgICBpbnRlcm5hbCBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcyBzdHlsZWNsYXNzLCBlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LCBvYmplY3QgdmFsdWUsIGludCBwb3NpdGlvbklELCBzdHJpbmcgYWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgU3R5bGVDbGFzcyA9IHN0eWxlY2xhc3M7CisgICAgICAgICAgICBTdHlsZVByb3BlcnR5PXN0eWxlUHJvcGVydHk7CisgICAgICAgICAgICBWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgICAgICBQb3NpdGlvbklEID0gcG9zaXRpb25JRDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBlU3R5bGVDbGFzcyBTdHlsZUNsYXNzOworICAgICAgICBpbnRlcm5hbCBlU3R5bGVQcm9wZXJ0eSBTdHlsZVByb3BlcnR5OworICAgICAgICAvL2ludGVybmFsIHN0cmluZyBQcm9wZXJ0eU5hbWU7CisgICAgICAgIGludGVybmFsIG9iamVjdCBWYWx1ZTsKKyAgICAgICAgaW50ZXJuYWwgaW50IFBvc2l0aW9uSUQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvL2ludGVybmFsIHN0cmluZyBBZGRyZXNzOworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsQm9yZGVySXRlbVhtbC5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxCb3JkZXJJdGVtWG1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjkxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsQm9yZGVySXRlbVhtbC5jcwpAQCAtMCwwICsxLDE1NyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgYm9yZGVyIGl0ZW1zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQm9yZGVySXRlbVhtbCA6IFN0eWxlWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbEJvcmRlckl0ZW1YbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgX2JvcmRlclN0eWxlPUV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKKyAgICAgICAgICAgIF9jb2xvciA9IG5ldyBFeGNlbENvbG9yWG1sKE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVySXRlbVhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRvcE5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYm9yZGVyU3R5bGUgPSBHZXRCb3JkZXJTdHlsZShHZXRYbWxOb2RlU3RyaW5nKCJAc3R5bGUiKSk7CisgICAgICAgICAgICAgICAgX2NvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2NvbG9yUGF0aCwgbnNtKSk7CisgICAgICAgICAgICAgICAgRXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRXhjZWxCb3JkZXJTdHlsZSBHZXRCb3JkZXJTdHlsZShzdHJpbmcgc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHN0eWxlPT0iIikgcmV0dXJuIEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKKyAgICAgICAgICAgIHN0cmluZyBzSW5TdHlsZSA9IHN0eWxlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgc3R5bGUuU3Vic3RyaW5nKDEsIHN0eWxlLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEJvcmRlclN0eWxlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsQm9yZGVyU3R5bGUpLCBzSW5TdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEJvcmRlclN0eWxlLk5vbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBFeGNlbEJvcmRlclN0eWxlIF9ib3JkZXJTdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2VsbCBCb3JkZXIgc3R5bGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXJTdHlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib3JkZXJTdHlsZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIEV4aXN0cyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDb2xvclhtbCBfY29sb3IgPSBudWxsOworICAgICAgICBjb25zdCBzdHJpbmcgX2NvbG9yUGF0aCA9ICJkOmNvbG9yIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQm9yZGVyIHN0eWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbG9yWG1sIENvbG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29sb3IgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChFeGlzdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUgKyBDb2xvci5JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBFeGNlbEJvcmRlckl0ZW1YbWwgQ29weSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBib3JkZXJJdGVtID0gbmV3IEV4Y2VsQm9yZGVySXRlbVhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIGJvcmRlckl0ZW0uU3R5bGUgPSBfYm9yZGVyU3R5bGU7CisgICAgICAgICAgICBib3JkZXJJdGVtLkNvbG9yID0gX2NvbG9yLkNvcHkoKTsKKyAgICAgICAgICAgIHJldHVybiBib3JkZXJJdGVtOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisKKyAgICAgICAgICAgIGlmIChTdHlsZSAhPSBFeGNlbEJvcmRlclN0eWxlLk5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHN0eWxlIiwgU2V0Qm9yZGVyU3RyaW5nKFN0eWxlKSk7CisgICAgICAgICAgICAgICAgaWYgKENvbG9yLkV4aXN0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2NvbG9yUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoQ29sb3IuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2NvbG9yUGF0aCxOYW1lU3BhY2VNYW5hZ2VyKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBUb3BOb2RlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2V0Qm9yZGVyU3RyaW5nKEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBuZXdOYW1lPUVudW0uR2V0TmFtZSh0eXBlb2YoRXhjZWxCb3JkZXJTdHlsZSksIFN0eWxlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdOYW1lLlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgbmV3TmFtZS5TdWJzdHJpbmcoMSwgbmV3TmFtZS5MZW5ndGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbCBFeGlzdHMgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEJvcmRlclhtbC5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxCb3JkZXJYbWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwZjMxOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxCb3JkZXJYbWwuY3MKQEAgLTAsMCArMSwyMTggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGJvcmRlciB0b3AgbGV2ZWwKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCb3JkZXJYbWwgOiBTdHlsZVhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxCb3JkZXJYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVyWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpIDoKKyAgICAgICAgICAgIGJhc2UobnNtLCB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBfbGVmdCA9IG5ldyBFeGNlbEJvcmRlckl0ZW1YbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUobGVmdFBhdGgsIG5zbSkpOworICAgICAgICAgICAgX3JpZ2h0ID0gbmV3IEV4Y2VsQm9yZGVySXRlbVhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShyaWdodFBhdGgsIG5zbSkpOworICAgICAgICAgICAgX3RvcCA9IG5ldyBFeGNlbEJvcmRlckl0ZW1YbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUodG9wUGF0aCwgbnNtKSk7CisgICAgICAgICAgICBfYm90dG9tID0gbmV3IEV4Y2VsQm9yZGVySXRlbVhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShib3R0b21QYXRoLCBuc20pKTsKKyAgICAgICAgICAgIF9kaWFnb25hbCA9IG5ldyBFeGNlbEJvcmRlckl0ZW1YbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoZGlhZ29uYWxQYXRoLCBuc20pKTsKKyAgICAgICAgICAgIF9kaWFnb25hbFVwID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIGRpYWdvbmFsVXBQYXRoKTsKKyAgICAgICAgICAgIF9kaWFnb25hbERvd24gPSBHZXRCb29sVmFsdWUodG9wTm9kZSwgZGlhZ29uYWxEb3duUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBMZWZ0LklkICsgUmlnaHQuSWQgKyBUb3AuSWQgKyBCb3R0b20uSWQgKyBEaWFnb25hbC5JZCArIERpYWdvbmFsVXAuVG9TdHJpbmcoKSArIERpYWdvbmFsRG93bi5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBsZWZ0UGF0aCA9ICJkOmxlZnQiOworICAgICAgICBFeGNlbEJvcmRlckl0ZW1YbWwgX2xlZnQgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBMZWZ0IGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgTGVmdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xlZnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbGVmdCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyByaWdodFBhdGggPSAiZDpyaWdodCI7CisgICAgICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBfcmlnaHQgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtWG1sIFJpZ2h0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcmlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcmlnaHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgdG9wUGF0aCA9ICJkOnRvcCI7CisgICAgICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBfdG9wID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVG9wIGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgVG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RvcCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBib3R0b21QYXRoID0gImQ6Ym90dG9tIjsKKyAgICAgICAgRXhjZWxCb3JkZXJJdGVtWG1sIF9ib3R0b20gPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCb3R0b20gYm9yZGVyIHN0eWxlIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVySXRlbVhtbCBCb3R0b20KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ib3R0b207CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYm90dG9tID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIGRpYWdvbmFsUGF0aCA9ICJkOmRpYWdvbmFsIjsKKyAgICAgICAgRXhjZWxCb3JkZXJJdGVtWG1sIF9kaWFnb25hbCA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERpYWdvbmFsIGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgRGlhZ29uYWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kaWFnb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kaWFnb25hbCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBkaWFnb25hbFVwUGF0aCA9ICJAZGlhZ29uYWxVcCI7CisgICAgICAgIGJvb2wgX2RpYWdvbmFsVXAgPSBmYWxzZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGlhZ29uYWwgdXAgYm9yZGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERpYWdvbmFsVXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kaWFnb25hbFVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RpYWdvbmFsVXAgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgZGlhZ29uYWxEb3duUGF0aCA9ICJAZGlhZ29uYWxEb3duIjsKKyAgICAgICAgYm9vbCBfZGlhZ29uYWxEb3duID0gZmFsc2U7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERpYWdvbmFsIGRvd24gYm9yZGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERpYWdvbmFsRG93bgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RpYWdvbmFsRG93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kaWFnb25hbERvd24gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVyWG1sIENvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbEJvcmRlclhtbCBuZXdCb3JkZXIgPSBuZXcgRXhjZWxCb3JkZXJYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBuZXdCb3JkZXIuQm90dG9tID0gX2JvdHRvbS5Db3B5KCk7CisgICAgICAgICAgICBuZXdCb3JkZXIuRGlhZ29uYWwgPSBfZGlhZ29uYWwuQ29weSgpOworICAgICAgICAgICAgbmV3Qm9yZGVyLkxlZnQgPSBfbGVmdC5Db3B5KCk7CisgICAgICAgICAgICBuZXdCb3JkZXIuUmlnaHQgPSBfcmlnaHQuQ29weSgpOworICAgICAgICAgICAgbmV3Qm9yZGVyLlRvcCA9IF90b3AuQ29weSgpOworICAgICAgICAgICAgbmV3Qm9yZGVyLkRpYWdvbmFsVXAgPSBfZGlhZ29uYWxVcDsKKyAgICAgICAgICAgIG5ld0JvcmRlci5EaWFnb25hbERvd24gPSBfZGlhZ29uYWxEb3duOworCisgICAgICAgICAgICByZXR1cm4gbmV3Qm9yZGVyOworCisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICAgICAgICAgIENyZWF0ZU5vZGUobGVmdFBhdGgpOworICAgICAgICAgICAgdG9wTm9kZS5BcHBlbmRDaGlsZChfbGVmdC5DcmVhdGVYbWxOb2RlKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShsZWZ0UGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICAgICAgICAgIENyZWF0ZU5vZGUocmlnaHRQYXRoKTsKKyAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoX3JpZ2h0LkNyZWF0ZVhtbE5vZGUoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHJpZ2h0UGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICAgICAgICAgIENyZWF0ZU5vZGUodG9wUGF0aCk7CisgICAgICAgICAgICB0b3BOb2RlLkFwcGVuZENoaWxkKF90b3AuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUodG9wUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICAgICAgICAgIENyZWF0ZU5vZGUoYm90dG9tUGF0aCk7CisgICAgICAgICAgICB0b3BOb2RlLkFwcGVuZENoaWxkKF9ib3R0b20uQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoYm90dG9tUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICAgICAgICAgIENyZWF0ZU5vZGUoZGlhZ29uYWxQYXRoKTsKKyAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoX2RpYWdvbmFsLkNyZWF0ZVhtbE5vZGUoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKGRpYWdvbmFsUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICAgICAgICAgIGlmIChfZGlhZ29uYWxVcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGRpYWdvbmFsVXBQYXRoLCAiMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9kaWFnb25hbERvd24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhkaWFnb25hbERvd25QYXRoLCAiMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRvcE5vZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsQ29sb3JYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsQ29sb3JYbWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzNjExOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxDb2xvclhtbC5jcwpAQCAtMCwwICsxLDIxOSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBjb2xvcgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbENvbG9yWG1sIDogU3R5bGVYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9hdXRvID0gZmFsc2U7CisgICAgICAgICAgICBfdGhlbWUgPSAiIjsKKyAgICAgICAgICAgIF90aW50ID0gMDsKKyAgICAgICAgICAgIF9yZ2IgPSAiIjsKKyAgICAgICAgICAgIF9pbmRleGVkID0gaW50Lk1pblZhbHVlOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkgOgorICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHRvcE5vZGU9PW51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4aXN0cz1mYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfYXV0byA9IEdldFhtbE5vZGVCb29sKCJAYXV0byIpOworICAgICAgICAgICAgICAgIF90aGVtZSA9IEdldFhtbE5vZGVTdHJpbmcoIkB0aGVtZSIpOworICAgICAgICAgICAgICAgIF90aW50ID0gR2V0WG1sTm9kZURlY2ltYWxOdWxsKCJAdGludCIpPz9kZWNpbWFsLk1pblZhbHVlOworICAgICAgICAgICAgICAgIF9yZ2IgPSBHZXRYbWxOb2RlU3RyaW5nKCJAcmdiIik7CisgICAgICAgICAgICAgICAgX2luZGV4ZWQgPSBHZXRYbWxOb2RlSW50TnVsbCgiQGluZGV4ZWQiKSA/PyBpbnQuTWluVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2F1dG8uVG9TdHJpbmcoKSArICJ8IiArIF90aGVtZSArICJ8IiArIF90aW50ICsgInwiICsgX3JnYiArICJ8IiArIF9pbmRleGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvb2wgX2F1dG87CisgICAgICAgIHB1YmxpYyBib29sIEF1dG8KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hdXRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F1dG8gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBfZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBDbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZyBfdGhlbWU7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZW1lIGNvbG9yIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGhlbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90aGVtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWNpbWFsIF90aW50OworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaW50CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkZWNpbWFsIFRpbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF90aW50ID09IGRlY2ltYWwuTWluVmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90aW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX2V4aXN0cyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIF9yZ2I7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJHQiB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFJnYgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3JnYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9yZ2IgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBfZXhpc3RzPXRydWU7CisgICAgICAgICAgICAgICAgX2luZGV4ZWQgPSBpbnQuTWluVmFsdWU7CisgICAgICAgICAgICAgICAgX2F1dG8gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgX2luZGV4ZWQ7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGV4ZWQgY29sb3IgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBJbmRleGVkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoX2luZGV4ZWQgPT0gaW50Lk1pblZhbHVlID8gMCA6IF9pbmRleGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA2NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbmRleCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENsZWFyKCk7CisgICAgICAgICAgICAgICAgX2luZGV4ZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBfZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3RoZW1lID0gIiI7CisgICAgICAgICAgICBfdGludCA9IGRlY2ltYWwuTWluVmFsdWU7CisgICAgICAgICAgICBfaW5kZXhlZCA9IGludC5NaW5WYWx1ZTsKKyAgICAgICAgICAgIF9yZ2IgPSAiIjsKKyAgICAgICAgICAgIF9hdXRvID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0Q29sb3IoU3lzdGVtLkRyYXdpbmcuQ29sb3IgY29sb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsZWFyKCk7CisgICAgICAgICAgICBfcmdiID0gY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwgQ29weSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb2xvclhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7X2luZGV4ZWQ9X2luZGV4ZWQsIF90aW50PV90aW50LCBfcmdiPV9yZ2IsIF90aGVtZT1fdGhlbWUsIF9hdXRvPV9hdXRvLCBfZXhpc3RzPV9leGlzdHMgfTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOworICAgICAgICAgICAgaWYoX3JnYiE9IiIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHJnYiIsIF9yZ2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2luZGV4ZWQgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAaW5kZXhlZCIsIF9pbmRleGVkLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX2F1dG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBhdXRvIiwgX2F1dG8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB0aGVtZSIsIF90aGVtZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfdGludCAhPSBkZWNpbWFsLk1pblZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB0aW50IiwgX3RpbnQuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRvcE5vZGU7CisgICAgICAgIH0KKworICAgICAgICBib29sIF9leGlzdHM7CisgICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZXhpc3RzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZpbGxYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsRmlsbFhtbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2VhNDIzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZpbGxYbWwuY3MKQEAgLTAsMCArMSwxNzQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgZmlsbHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEZpbGxYbWwgOiBTdHlsZVhtbEhlbHBlciAKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsRmlsbFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgX2ZpbGxQYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLk5vbmU7CisgICAgICAgICAgICBfYmFja2dyb3VuZENvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBfcGF0dGVybkNvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxGaWxsWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpOgorICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhdHRlcm5UeXBlID0gR2V0UGF0dGVyblR5cGUoR2V0WG1sTm9kZVN0cmluZyhmaWxsUGF0dGVyblR5cGVQYXRoKSk7CisgICAgICAgICAgICBfYmFja2dyb3VuZENvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2JhY2tncm91bmRDb2xvclBhdGgsIG5zbSkpOworICAgICAgICAgICAgX3BhdHRlcm5Db2xvciA9IG5ldyBFeGNlbENvbG9yWG1sKG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXR0ZXJuQ29sb3JQYXRoLCBuc20pKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRXhjZWxGaWxsU3R5bGUgR2V0UGF0dGVyblR5cGUoc3RyaW5nIHBhdHRlcm5UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGF0dGVyblR5cGUgPT0gIiIpIHJldHVybiBFeGNlbEZpbGxTdHlsZS5Ob25lOworICAgICAgICAgICAgcGF0dGVyblR5cGUgPSBwYXR0ZXJuVHlwZS5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHBhdHRlcm5UeXBlLlN1YnN0cmluZygxLCBwYXR0ZXJuVHlwZS5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoRXhjZWxGaWxsU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxGaWxsU3R5bGUpLCBwYXR0ZXJuVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEZpbGxTdHlsZS5Ob25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGF0dGVyblR5cGUgKyBQYXR0ZXJuQ29sb3IuSWQgKyBCYWNrZ3JvdW5kQ29sb3IuSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcworICAgICAgICBjb25zdCBzdHJpbmcgZmlsbFBhdHRlcm5UeXBlUGF0aCA9ICJkOnBhdHRlcm5GaWxsL0BwYXR0ZXJuVHlwZSI7CisgICAgICAgIHByb3RlY3RlZCBFeGNlbEZpbGxTdHlsZSBfZmlsbFBhdHRlcm5UeXBlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDZWxsIGZpbGwgcGF0dGVybiBzdHlsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxGaWxsU3R5bGUgUGF0dGVyblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsUGF0dGVyblR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZmlsbFBhdHRlcm5UeXBlPXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBFeGNlbENvbG9yWG1sIF9wYXR0ZXJuQ29sb3IgPSBudWxsOworICAgICAgICBjb25zdCBzdHJpbmcgX3BhdHRlcm5Db2xvclBhdGggPSAiZDpwYXR0ZXJuRmlsbC9kOmJnQ29sb3IiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQYXR0ZXJuIGNvbG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbENvbG9yWG1sIFBhdHRlcm5Db2xvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3BhdHRlcm5Db2xvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXR0ZXJuQ29sb3IgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgRXhjZWxDb2xvclhtbCBfYmFja2dyb3VuZENvbG9yID0gbnVsbDsKKyAgICAgICAgY29uc3Qgc3RyaW5nIF9iYWNrZ3JvdW5kQ29sb3JQYXRoID0gImQ6cGF0dGVybkZpbGwvZDpmZ0NvbG9yIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2VsbCBiYWNrZ3JvdW5kIGNvbG9yIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb2xvclhtbCBCYWNrZ3JvdW5kQ29sb3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYmFja2dyb3VuZENvbG9yPXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgIC8vaW50ZXJuYWwgRmlsbCBDb3B5KCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIEZpbGwgbmV3RmlsbCA9IG5ldyBGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUuQ2xvbmUoKSk7CisgICAgICAgIC8vICAgIHJldHVybiBuZXdGaWxsOworICAgICAgICAvL30KKworICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIEV4Y2VsRmlsbFhtbCBDb3B5KCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxGaWxsWG1sIG5ld0ZpbGwgPSBuZXcgRXhjZWxGaWxsWG1sKE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgbmV3RmlsbC5QYXR0ZXJuVHlwZSA9IF9maWxsUGF0dGVyblR5cGU7CisgICAgICAgICAgICBuZXdGaWxsLkJhY2tncm91bmRDb2xvciA9IF9iYWNrZ3JvdW5kQ29sb3IuQ29weSgpOworICAgICAgICAgICAgbmV3RmlsbC5QYXR0ZXJuQ29sb3IgPSBfcGF0dGVybkNvbG9yLkNvcHkoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdGaWxsOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGZpbGxQYXR0ZXJuVHlwZVBhdGgsIFNldFBhdHRlcm5TdHJpbmcoX2ZpbGxQYXR0ZXJuVHlwZSkpOworICAgICAgICAgICAgaWYgKFBhdHRlcm5UeXBlICE9IEV4Y2VsRmlsbFN0eWxlLk5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sTm9kZSBwYXR0ZXJuID0gdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKGZpbGxQYXR0ZXJuVHlwZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIGlmIChCYWNrZ3JvdW5kQ29sb3IuRXhpc3RzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfYmFja2dyb3VuZENvbG9yUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIEJhY2tncm91bmRDb2xvci5DcmVhdGVYbWxOb2RlKHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfYmFja2dyb3VuZENvbG9yUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoUGF0dGVybkNvbG9yLkV4aXN0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfcGF0dGVybkNvbG9yUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3RvcE5vZGUuQXBwZW5kQ2hpbGQoUGF0dGVybkNvbG9yLkNyZWF0ZVhtbE5vZGUodG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXR0ZXJuQ29sb3JQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybkNvbG9yLkNyZWF0ZVhtbE5vZGUodG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXR0ZXJuQ29sb3JQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG9wTm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNldFBhdHRlcm5TdHJpbmcoRXhjZWxGaWxsU3R5bGUgcGF0dGVybikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG5ld05hbWUgPSBFbnVtLkdldE5hbWUodHlwZW9mKEV4Y2VsRmlsbFN0eWxlKSwgcGF0dGVybik7CisgICAgICAgICAgICByZXR1cm4gbmV3TmFtZS5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIG5ld05hbWUuU3Vic3RyaW5nKDEsIG5ld05hbWUuTGVuZ3RoIC0gMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsRm9udFhtbC5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxGb250WG1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDc1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsRm9udFhtbC5jcwpAQCAtMCwwICsxLDMzMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBmb250cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbEZvbnRYbWwgOiBTdHlsZVhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxGb250WG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBfbmFtZSA9ICIiOworICAgICAgICAgICAgX3NpemUgPSAwOworICAgICAgICAgICAgX2ZhbWlseSA9IGludC5NaW5WYWx1ZTsKKyAgICAgICAgICAgIF9zY2hlbWUgPSAiIjsKKyAgICAgICAgICAgIF9jb2xvciA9IF9jb2xvciA9IG5ldyBFeGNlbENvbG9yWG1sKE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgX2JvbGQgPSBmYWxzZTsKKyAgICAgICAgICAgIF9pdGFsaWMgPSBmYWxzZTsKKyAgICAgICAgICAgIF9zdHJpa2UgPSBmYWxzZTsKKyAgICAgICAgICAgIF91bmRlcmxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLk5vbmUgOworICAgICAgICAgICAgX3ZlcnRpY2FsQWxpZ24gPSAiIjsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbEZvbnRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkgOgorICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9uYW1lID0gR2V0WG1sTm9kZVN0cmluZyhuYW1lUGF0aCk7CisgICAgICAgICAgICBfc2l6ZSA9IChmbG9hdClHZXRYbWxOb2RlRGVjaW1hbChzaXplUGF0aCk7CisgICAgICAgICAgICBfZmFtaWx5ID0gR2V0WG1sTm9kZUludE51bGwoZmFtaWx5UGF0aCk/P2ludC5NaW5WYWx1ZTsKKyAgICAgICAgICAgIF9zY2hlbWUgPSBHZXRYbWxOb2RlU3RyaW5nKHNjaGVtZVBhdGgpOworICAgICAgICAgICAgX2NvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2NvbG9yUGF0aCwgbnNtKSk7CisgICAgICAgICAgICBfYm9sZCA9IEdldEJvb2xWYWx1ZSh0b3BOb2RlLCBib2xkUGF0aCk7CisgICAgICAgICAgICBfaXRhbGljID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIGl0YWxpY1BhdGgpOworICAgICAgICAgICAgX3N0cmlrZSA9IEdldEJvb2xWYWx1ZSh0b3BOb2RlLCBzdHJpa2VQYXRoKTsKKyAgICAgICAgICAgIF92ZXJ0aWNhbEFsaWduID0gR2V0WG1sTm9kZVN0cmluZyh2ZXJ0aWNhbEFsaWduUGF0aCk7CisgICAgICAgICAgICBpZiAodG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHVuZGVyTGluZWRQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB1dCA9IEdldFhtbE5vZGVTdHJpbmcodW5kZXJMaW5lZFBhdGggKyAiL0B2YWwiKTsKKyAgICAgICAgICAgICAgICBpZiAodXQgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdW5kZXJsaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF91bmRlcmxpbmVUeXBlID0gKEV4Y2VsVW5kZXJMaW5lVHlwZSlFbnVtLlBhcnNlKHR5cGVvZihFeGNlbFVuZGVyTGluZVR5cGUpLCB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF91bmRlcmxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLk5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUgKyAifCIgKyBTaXplICsgInwiICsgRmFtaWx5ICsgInwiICsgQ29sb3IuSWQgKyAifCIgKyBTY2hlbWUgKyAifCIgKyBCb2xkLlRvU3RyaW5nKCkgKyAifCIgKyBJdGFsaWMuVG9TdHJpbmcoKSArICJ8IiArIFN0cmlrZS5Ub1N0cmluZygpICsgInwiICsgVmVydGljYWxBbGlnbiArICJ8IiArIFVuZGVyTGluZVR5cGUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgbmFtZVBhdGggPSAiZDpuYW1lL0B2YWwiOworICAgICAgICBzdHJpbmcgX25hbWU7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmb250CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWUgPSAiIjsgICAgICAgIC8vUmVzZXQgc2NoZW1hIHRvIGF2b2lkIGNvcnJ1cHQgZmlsZSBpZiB1bnN1cHBvcnRlZCBmb250IGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgIF9uYW1lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIHNpemVQYXRoID0gImQ6c3ovQHZhbCI7CisgICAgICAgIGZsb2F0IF9zaXplOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGb250IHNpemUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGZsb2F0IFNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgZmFtaWx5UGF0aCA9ICJkOmZhbWlseS9AdmFsIjsKKyAgICAgICAgaW50IF9mYW1pbHk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbnQgZmFtaWx5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgRmFtaWx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoX2ZhbWlseSA9PSBpbnQuTWluVmFsdWUgPyAwIDogX2ZhbWlseSk7IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9mYW1pbHk9dmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxDb2xvclhtbCBfY29sb3IgPSBudWxsOworICAgICAgICBjb25zdCBzdHJpbmcgX2NvbG9yUGF0aCA9ICJkOmNvbG9yIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGV4dCBjb2xvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb2xvclhtbCBDb2xvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb2xvcj12YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgc2NoZW1lUGF0aCA9ICJkOnNjaGVtZS9AdmFsIjsKKyAgICAgICAgc3RyaW5nIF9zY2hlbWU9IiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbnQgU2NoZW1lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgU2NoZW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpdmF0ZSBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2NoZW1lPXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBib2xkUGF0aCA9ICJkOmIiOworICAgICAgICBib29sIF9ib2xkOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZm9udCBpcyBib2xkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEJvbGQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ib2xkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JvbGQ9dmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIGl0YWxpY1BhdGggPSAiZDppIjsKKyAgICAgICAgYm9vbCBfaXRhbGljOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZm9udCBpcyBpdGFsaWMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgSXRhbGljCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaXRhbGljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2l0YWxpYz12YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgc3RyaWtlUGF0aCA9ICJkOnN0cmlrZSI7CisgICAgICAgIGJvb2wgX3N0cmlrZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGZvbnQgaXMgc3RyaWtlZCBvdXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU3RyaWtlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3RyaWtlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmlrZT12YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgdW5kZXJMaW5lZFBhdGggPSAiZDp1IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGZvbnQgaXMgdW5kZXJsaW5lZC4KKyAgICAgICAgLy8vIFdoZW4gc2V0IHRvIHRydWUgYSB0aGUgdGV4dCBpcyB1bmRlcmxpbmVkIHdpdGggYSBzaW5nbGUgbGluZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBVbmRlckxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVuZGVyTGluZVR5cGUhPUV4Y2VsVW5kZXJMaW5lVHlwZS5Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3VuZGVybGluZVR5cGU9dmFsdWUgPyBFeGNlbFVuZGVyTGluZVR5cGUuU2luZ2xlIDogRXhjZWxVbmRlckxpbmVUeXBlLk5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxVbmRlckxpbmVUeXBlIF91bmRlcmxpbmVUeXBlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZm9udCBpcyB1bmRlcmxpbmVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFVuZGVyTGluZVR5cGUgVW5kZXJMaW5lVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3VuZGVybGluZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdW5kZXJsaW5lVHlwZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyB2ZXJ0aWNhbEFsaWduUGF0aCA9ICJkOnZlcnRBbGlnbi9AdmFsIjsKKyAgICAgICAgc3RyaW5nIF92ZXJ0aWNhbEFsaWduOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWZXJ0aWNhbCBhbGlnbmVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVmVydGljYWxBbGlnbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ZlcnRpY2FsQWxpZ247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmVydGljYWxBbGlnbj12YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBTZXRGcm9tRm9udChTeXN0ZW0uRHJhd2luZy5Gb250IEZvbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWU9Rm9udC5OYW1lOworICAgICAgICAgICAgLy9GYW1pbHk9Zm50LkZvbnRGYW1pbHkuOworICAgICAgICAgICAgU2l6ZT0oaW50KUZvbnQuU2l6ZTsKKyAgICAgICAgICAgIFN0cmlrZT1Gb250LlN0cmlrZW91dDsKKyAgICAgICAgICAgIEJvbGQgPSBGb250LkJvbGQ7CisgICAgICAgICAgICBVbmRlckxpbmU9Rm9udC5VbmRlcmxpbmU7CisgICAgICAgICAgICBJdGFsaWM9Rm9udC5JdGFsaWM7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxGb250WG1sIENvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbEZvbnRYbWwgbmV3Rm9udCA9IG5ldyBFeGNlbEZvbnRYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBuZXdGb250Lk5hbWUgPSBfbmFtZTsKKyAgICAgICAgICAgIG5ld0ZvbnQuU2l6ZSA9IF9zaXplOworICAgICAgICAgICAgbmV3Rm9udC5GYW1pbHkgPSBfZmFtaWx5OworICAgICAgICAgICAgbmV3Rm9udC5TY2hlbWUgPSBfc2NoZW1lOworICAgICAgICAgICAgbmV3Rm9udC5Cb2xkID0gX2JvbGQ7CisgICAgICAgICAgICBuZXdGb250Lkl0YWxpYyA9IF9pdGFsaWM7CisgICAgICAgICAgICBuZXdGb250LlVuZGVyTGluZVR5cGUgPSBfdW5kZXJsaW5lVHlwZTsKKyAgICAgICAgICAgIG5ld0ZvbnQuU3RyaWtlID0gX3N0cmlrZTsKKyAgICAgICAgICAgIG5ld0ZvbnQuVmVydGljYWxBbGlnbiA9IF92ZXJ0aWNhbEFsaWduOworICAgICAgICAgICAgbmV3Rm9udC5Db2xvciA9IENvbG9yLkNvcHkoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdGb250OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wRWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTm9kZSA9IHRvcEVsZW1lbnQ7CisKKyAgICAgICAgICAgIGlmIChfYm9sZCkgQ3JlYXRlTm9kZShib2xkUGF0aCk7IGVsc2UgRGVsZXRlQWxsTm9kZShib2xkUGF0aCk7CisgICAgICAgICAgICBpZiAoX2l0YWxpYykgQ3JlYXRlTm9kZShpdGFsaWNQYXRoKTsgZWxzZSBEZWxldGVBbGxOb2RlKGl0YWxpY1BhdGgpOworICAgICAgICAgICAgaWYgKF9zdHJpa2UpIENyZWF0ZU5vZGUoc3RyaWtlUGF0aCk7IGVsc2UgRGVsZXRlQWxsTm9kZShzdHJpa2VQYXRoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKF91bmRlcmxpbmVUeXBlID09IEV4Y2VsVW5kZXJMaW5lVHlwZS5Ob25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUodW5kZXJMaW5lZFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihfdW5kZXJsaW5lVHlwZT09RXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKHVuZGVyTGluZWRQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdj1fdW5kZXJsaW5lVHlwZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcodW5kZXJMaW5lZFBhdGggKyAiL0B2YWwiLCB2LlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgdi5TdWJzdHJpbmcoMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3ZlcnRpY2FsQWxpZ24hPSIiKSBTZXRYbWxOb2RlU3RyaW5nKHZlcnRpY2FsQWxpZ25QYXRoLCBfdmVydGljYWxBbGlnbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmKF9zaXplPjApIFNldFhtbE5vZGVTdHJpbmcoc2l6ZVBhdGgsIF9zaXplLlRvU3RyaW5nKFN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIGlmIChfY29sb3IuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2NvbG9yUGF0aCk7CisgICAgICAgICAgICAgICAgVG9wTm9kZS5BcHBlbmRDaGlsZChfY29sb3IuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2NvbG9yUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShfbmFtZSkpIFNldFhtbE5vZGVTdHJpbmcobmFtZVBhdGgsIF9uYW1lKTsKKyAgICAgICAgICAgIGlmKF9mYW1pbHk+aW50Lk1pblZhbHVlKSBTZXRYbWxOb2RlU3RyaW5nKGZhbWlseVBhdGgsIF9mYW1pbHkuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoX3NjaGVtZSAhPSAiIikgU2V0WG1sTm9kZVN0cmluZyhzY2hlbWVQYXRoLCBfc2NoZW1lLlRvU3RyaW5nKCkpOworCisgICAgICAgICAgICByZXR1cm4gVG9wTm9kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxHcmFkaWVudEZpbGxYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsR3JhZGllbnRGaWxsWG1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsR3JhZGllbnRGaWxsWG1sLmNzCkBAIC0wLDAgKzEsMTk4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGdyYWRpZW50IGZpbGxzZGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxHcmFkaWVudEZpbGxYbWwgOiBFeGNlbEZpbGxYbWwKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsR3JhZGllbnRGaWxsWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBHcmFkaWVudENvbG9yMSA9IG5ldyBFeGNlbENvbG9yWG1sKG5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgR3JhZGllbnRDb2xvcjIgPSBuZXcgRXhjZWxDb2xvclhtbChuYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbEdyYWRpZW50RmlsbFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgRGVncmVlID0gR2V0WG1sTm9kZURvdWJsZShfZGVncmVlUGF0aCk7CisgICAgICAgICAgICBUeXBlID0gR2V0WG1sTm9kZVN0cmluZyhfdHlwZVBhdGgpPT0icGF0aCIgPyBFeGNlbEZpbGxHcmFkaWVudFR5cGUuUGF0aCA6IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5MaW5lYXI7CisgICAgICAgICAgICBHcmFkaWVudENvbG9yMSA9IG5ldyBFeGNlbENvbG9yWG1sKG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9ncmFkaWVudENvbG9yMVBhdGgsIG5zbSkpOworICAgICAgICAgICAgR3JhZGllbnRDb2xvcjIgPSBuZXcgRXhjZWxDb2xvclhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfZ3JhZGllbnRDb2xvcjJQYXRoLCBuc20pKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVG9wID0gR2V0WG1sTm9kZURvdWJsZShfdG9wUGF0aCk7CisgICAgICAgICAgICBCb3R0b20gPSBHZXRYbWxOb2RlRG91YmxlKF9ib3R0b21QYXRoKTsKKyAgICAgICAgICAgIExlZnQgPSBHZXRYbWxOb2RlRG91YmxlKF9sZWZ0UGF0aCk7CisgICAgICAgICAgICBSaWdodCA9IEdldFhtbE5vZGVEb3VibGUoX3JpZ2h0UGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF90eXBlUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9AdHlwZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGUgb2YgZ3JhZGllbnQgZmlsbC4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEZpbGxHcmFkaWVudFR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9kZWdyZWVQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0BkZWdyZWUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbmdsZSBvZiB0aGUgbGluZWFyIGdyYWRpZW50CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgRGVncmVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2dyYWRpZW50Q29sb3IxUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9kOnN0b3BbQHBvc2l0aW9uPVwiMFwiXS9kOmNvbG9yIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR3JhZGllbnQgY29sb3IgMQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxDb2xvclhtbCBHcmFkaWVudENvbG9yMSAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9ncmFkaWVudENvbG9yMlBhdGggPSAiZDpncmFkaWVudEZpbGwvZDpzdG9wW0Bwb3NpdGlvbj1cIjFcIl0vZDpjb2xvciI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdyYWRpZW50IGNvbG9yIDIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQ29sb3JYbWwgR3JhZGllbnRDb2xvcjIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIF9ib3R0b21QYXRoID0gImQ6Z3JhZGllbnRGaWxsL0Bib3R0b20iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQZXJjZW50YWdlIGZvcm1hdCBib3R0b20KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBCb3R0b20KKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldDsgCisgICAgICAgICAgICBpbnRlcm5hbCBzZXQ7IAorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfdG9wUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9AdG9wIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGVyY2VudGFnZSBmb3JtYXQgdG9wCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgVG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgX2xlZnRQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0BsZWZ0IjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGVyY2VudGFnZSBmb3JtYXQgbGVmdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZG91YmxlIExlZnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBfcmlnaHRQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0ByaWdodCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBlcmNlbnRhZ2UgZm9ybWF0IHJpZ2h0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBkb3VibGUgUmlnaHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5JZCArIERlZ3JlZS5Ub1N0cmluZygpICsgR3JhZGllbnRDb2xvcjEuSWQgKyBHcmFkaWVudENvbG9yMi5JZCArIFR5cGUgKyBMZWZ0LlRvU3RyaW5nKCkgKyBSaWdodC5Ub1N0cmluZygpICsgQm90dG9tLlRvU3RyaW5nKCkgKyBUb3AuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbEZpbGxYbWwgQ29weSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsR3JhZGllbnRGaWxsWG1sIG5ld0ZpbGwgPSBuZXcgRXhjZWxHcmFkaWVudEZpbGxYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBuZXdGaWxsLlBhdHRlcm5UeXBlID0gYmFzZS5fZmlsbFBhdHRlcm5UeXBlOworICAgICAgICAgICAgbmV3RmlsbC5CYWNrZ3JvdW5kQ29sb3IgPSBfYmFja2dyb3VuZENvbG9yLkNvcHkoKTsKKyAgICAgICAgICAgIG5ld0ZpbGwuUGF0dGVybkNvbG9yID0gX3BhdHRlcm5Db2xvci5Db3B5KCk7CisKKyAgICAgICAgICAgIG5ld0ZpbGwuR3JhZGllbnRDb2xvcjEgPSBHcmFkaWVudENvbG9yMS5Db3B5KCk7CisgICAgICAgICAgICBuZXdGaWxsLkdyYWRpZW50Q29sb3IyID0gR3JhZGllbnRDb2xvcjIuQ29weSgpOworICAgICAgICAgICAgbmV3RmlsbC5UeXBlID0gVHlwZTsKKyAgICAgICAgICAgIG5ld0ZpbGwuRGVncmVlID0gRGVncmVlOworICAgICAgICAgICAgbmV3RmlsbC5Ub3AgPSBUb3A7CisgICAgICAgICAgICBuZXdGaWxsLkJvdHRvbSA9IEJvdHRvbTsKKyAgICAgICAgICAgIG5ld0ZpbGwuTGVmdCA9IExlZnQ7CisgICAgICAgICAgICBuZXdGaWxsLlJpZ2h0ID0gUmlnaHQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBuZXdGaWxsOworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOmdyYWRpZW50RmlsbCIpOworICAgICAgICAgICAgaWYoVHlwZT09RXhjZWxGaWxsR3JhZGllbnRUeXBlLlBhdGgpIFNldFhtbE5vZGVTdHJpbmcoX3R5cGVQYXRoLCAicGF0aCIpOworICAgICAgICAgICAgaWYoIWRvdWJsZS5Jc05hTihEZWdyZWUpKSBTZXRYbWxOb2RlU3RyaW5nKF9kZWdyZWVQYXRoLCBEZWdyZWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgaWYgKEdyYWRpZW50Q29sb3IxIT1udWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKiogR3JhZGllbnQgY29sb3Igbm9kZSAxKioqLworICAgICAgICAgICAgICAgIHZhciBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmdyYWRpZW50RmlsbCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIHZhciBzdG9wTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzdG9wIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIHN0b3BOb2RlLlNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCAiMCIpOworICAgICAgICAgICAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoc3RvcE5vZGUpOworICAgICAgICAgICAgICAgIHZhciBjb2xvck5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiY29sb3IiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICAgICAgc3RvcE5vZGUuQXBwZW5kQ2hpbGQoY29sb3JOb2RlKTsKKyAgICAgICAgICAgICAgICBHcmFkaWVudENvbG9yMS5DcmVhdGVYbWxOb2RlKGNvbG9yTm9kZSk7CisKKyAgICAgICAgICAgICAgICAvKioqIEdyYWRpZW50IGNvbG9yIG5vZGUgMioqKi8KKyAgICAgICAgICAgICAgICBzdG9wTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzdG9wIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIHN0b3BOb2RlLlNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCAiMSIpOworICAgICAgICAgICAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoc3RvcE5vZGUpOworICAgICAgICAgICAgICAgIGNvbG9yTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJjb2xvciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBzdG9wTm9kZS5BcHBlbmRDaGlsZChjb2xvck5vZGUpOworCisgICAgICAgICAgICAgICAgR3JhZGllbnRDb2xvcjIuQ3JlYXRlWG1sTm9kZShjb2xvck5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkb3VibGUuSXNOYU4oVG9wKSkgU2V0WG1sTm9kZVN0cmluZyhfdG9wUGF0aCwgVG9wLlRvU3RyaW5nKCJGNSIsQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgaWYgKCFkb3VibGUuSXNOYU4oQm90dG9tKSkgU2V0WG1sTm9kZVN0cmluZyhfYm90dG9tUGF0aCwgQm90dG9tLlRvU3RyaW5nKCJGNSIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIGlmICghZG91YmxlLklzTmFOKExlZnQpKSBTZXRYbWxOb2RlU3RyaW5nKF9sZWZ0UGF0aCwgTGVmdC5Ub1N0cmluZygiRjUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICBpZiAoIWRvdWJsZS5Jc05hTihSaWdodCkpIFNldFhtbE5vZGVTdHJpbmcoX3JpZ2h0UGF0aCwgUmlnaHQuVG9TdHJpbmcoIkY1IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworCisgICAgICAgICAgICByZXR1cm4gdG9wTm9kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOYW1lZFN0eWxlWG1sLmNzIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbE5hbWVkU3R5bGVYbWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZTM5NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOYW1lZFN0eWxlWG1sLmNzCkBAIC0wLDAgKzEsMTQ1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBuYW1lZCBzdHlsZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxOYW1lZFN0eWxlWG1sIDogU3R5bGVYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIEV4Y2VsU3R5bGVzIF9zdHlsZXM7CisgICAgICAgIGludGVybmFsIEV4Y2VsTmFtZWRTdHlsZVhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIEV4Y2VsU3R5bGVzIHN0eWxlcykKKyAgICAgICAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBfc3R5bGVzID0gc3R5bGVzOworICAgICAgICAgICAgQnVpbGRJbklkID0gaW50Lk1pblZhbHVlOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsTmFtZWRTdHlsZVhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxTdHlsZXMgc3R5bGVzKSA6CisgICAgICAgICAgICBiYXNlKE5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0eWxlWGZJZCA9IEdldFhtbE5vZGVJbnQoaWRQYXRoKTsKKyAgICAgICAgICAgIE5hbWUgPSBHZXRYbWxOb2RlU3RyaW5nKG5hbWVQYXRoKTsKKyAgICAgICAgICAgIEJ1aWxkSW5JZCA9IEdldFhtbE5vZGVJbnQoYnVpbGRJbklkUGF0aCk7CisgICAgICAgICAgICBDdXN0b21CdWlsZGluID0gR2V0WG1sTm9kZUJvb2woY3VzdG9tQnVpbHRpblBhdGgpOworCisgICAgICAgICAgICBfc3R5bGVzID0gc3R5bGVzOworICAgICAgICAgICAgX3N0eWxlID0gbmV3IEV4Y2VsU3R5bGUoc3R5bGVzLCBzdHlsZXMuTmFtZWRTdHlsZVByb3BlcnR5Q2hhbmdlLCAtMSwgTmFtZSwgX3N0eWxlWGZJZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBfc3R5bGVYZklkPTA7CisgICAgICAgIGNvbnN0IHN0cmluZyBpZFBhdGggPSAiQHhmSWQiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lZCBzdHlsZSBpbmRleAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFN0eWxlWGZJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlWGZJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHlsZVhmSWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgX3hmSWQgPSBpbnQuTWluVmFsdWU7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0eWxlIGluZGV4CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGludCBYZklkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfeGZJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF94ZklkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIGJ1aWxkSW5JZFBhdGggPSAiQGJ1aWx0aW5JZCI7CisgICAgICAgIHB1YmxpYyBpbnQgQnVpbGRJbklkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIGN1c3RvbUJ1aWx0aW5QYXRoID0gIkBjdXN0b21CdWlsdGluIjsKKyAgICAgICAgcHVibGljIGJvb2wgQ3VzdG9tQnVpbGRpbiB7IGdldDsgc2V0OyB9CisgICAgICAgIGNvbnN0IHN0cmluZyBuYW1lUGF0aCA9ICJAbmFtZSI7CisgICAgICAgIHN0cmluZyBfbmFtZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTmFtZSBvZiB0aGUgc3R5bGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9uYW1lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxTdHlsZSBfc3R5bGUgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgc3R5bGUgb2JqZWN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlIFN0eWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3R5bGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOworICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhuYW1lUGF0aCwgX25hbWUpOworICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHhmSWQiLCBfc3R5bGVzLkNlbGxTdHlsZVhmc1tTdHlsZVhmSWRdLm5ld0lELlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKEJ1aWxkSW5JZD49MCkgU2V0WG1sTm9kZVN0cmluZygiQGJ1aWx0aW5JZCIsIEJ1aWxkSW5JZC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmKEN1c3RvbUJ1aWxkaW4pIFNldFhtbE5vZGVCb29sKGN1c3RvbUJ1aWx0aW5QYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBUb3BOb2RlOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbE51bWJlckZvcm1hdFhtbC5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOdW1iZXJGb3JtYXRYbWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwYTJkZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOdW1iZXJGb3JtYXRYbWwuY3MKQEAgLTAsMCArMSw2NzAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgbnVtYmVyIGZvcm1hdHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxOdW1iZXJGb3JtYXRYbWwgOiBTdHlsZVhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpbnRlcm5hbCBFeGNlbE51bWJlckZvcm1hdFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIGJvb2wgYnVpbGRJbik6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgQnVpbGRJbiA9IGJ1aWxkSW47CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkgOgorICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9udW1GbXRJZCA9IEdldFhtbE5vZGVJbnQoIkBudW1GbXRJZCIpOworICAgICAgICAgICAgX2Zvcm1hdCA9IEdldFhtbE5vZGVTdHJpbmcoIkBmb3JtYXRDb2RlIik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGJvb2wgQnVpbGRJbiB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgaW50IF9udW1GbXRJZDsKKy8vICAgICAgICBjb25zdCBzdHJpbmcgaWRQYXRoID0gIkBudW1GbXRJZCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElkIGZvciBudW1iZXIgZm9ybWF0CisgICAgICAgIC8vLyAKKyAgICAgICAgLy8vIEJ1aWxkIGluIElEJ3MKKyAgICAgICAgLy8vIAorICAgICAgICAvLy8gMCAgIEdlbmVyYWwgCisgICAgICAgIC8vLyAxICAgMCAKKyAgICAgICAgLy8vIDIgICAwLjAwIAorICAgICAgICAvLy8gMyAgICMsIyMwIAorICAgICAgICAvLy8gNCAgICMsIyMwLjAwIAorICAgICAgICAvLy8gOSAgIDAlIAorICAgICAgICAvLy8gMTAgIDAuMDAlIAorICAgICAgICAvLy8gMTEgIDAuMDBFKzAwIAorICAgICAgICAvLy8gMTIgICMgPy8/IAorICAgICAgICAvLy8gMTMgICMgPz8vPz8gCisgICAgICAgIC8vLyAxNCAgbW0tZGQteXkgCisgICAgICAgIC8vLyAxNSAgZC1tbW0teXkgCisgICAgICAgIC8vLyAxNiAgZC1tbW0gCisgICAgICAgIC8vLyAxNyAgbW1tLXl5IAorICAgICAgICAvLy8gMTggIGg6bW0gQU0vUE0gCisgICAgICAgIC8vLyAxOSAgaDptbTpzcyBBTS9QTSAKKyAgICAgICAgLy8vIDIwICBoOm1tIAorICAgICAgICAvLy8gMjEgIGg6bW06c3MgCisgICAgICAgIC8vLyAyMiAgbS9kL3l5IGg6bW0gCisgICAgICAgIC8vLyAzNyAgIywjIzAgOygjLCMjMCkgCisgICAgICAgIC8vLyAzOCAgIywjIzAgO1tSZWRdKCMsIyMwKSAKKyAgICAgICAgLy8vIDM5ICAjLCMjMC4wMDsoIywjIzAuMDApIAorICAgICAgICAvLy8gNDAgICMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSAKKyAgICAgICAgLy8vIDQ1ICBtbTpzcyAKKyAgICAgICAgLy8vIDQ2ICBbaF06bW06c3MgCisgICAgICAgIC8vLyA0NyAgbW1zcy4wIAorICAgICAgICAvLy8gNDggICMjMC4wRSswIAorICAgICAgICAvLy8gNDkgIEAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBOdW1GbXRJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX251bUZtdElkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX251bUZtdElkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZm9ybWF0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBmbXRQYXRoID0gIkBmb3JtYXRDb2RlIjsKKyAgICAgICAgc3RyaW5nIF9mb3JtYXQgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybWF0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZm9ybWF0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX251bUZtdElkID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBfZm9ybWF0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld0lEKGludCBOdW1GbXRJZCwgc3RyaW5nIEZvcm1hdCkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoTnVtRm10SWQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE51bUZtdElkID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KEZvcm1hdCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE51bUZtdElkLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBZGRCdWlsZEluKFhtbE5hbWVzcGFjZU1hbmFnZXIgTmFtZVNwYWNlTWFuYWdlciwgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxOdW1iZXJGb3JtYXRYbWw+IE51bWJlckZvcm1hdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJHZW5lcmFsIixuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlcix0cnVlKXtOdW1GbXRJZD0wLEZvcm1hdD0iR2VuZXJhbCJ9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIwIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsdHJ1ZSkgeyBOdW1GbXRJZCA9IDEsIEZvcm1hdCA9ICIwIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIwLjAwIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsdHJ1ZSkgeyBOdW1GbXRJZCA9IDIsIEZvcm1hdCA9ICIwLjAwIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIjLCMjMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMywgRm9ybWF0ID0gIiMsIyMwIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIjLCMjMC4wMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gNCwgRm9ybWF0ID0gIiMsIyMwLjAwIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIwJSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLHRydWUpIHsgTnVtRm10SWQgPSA5LCBGb3JtYXQgPSAiMCUiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIjAuMDAlIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsdHJ1ZSkgeyBOdW1GbXRJZCA9IDEwLCBGb3JtYXQgPSAiMC4wMCUiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIjAuMDBFKzAwIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAxMSwgRm9ybWF0ID0gIjAuMDBFKzAwIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIjID8vPyIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTIsIEZvcm1hdCA9ICIjID8vPyIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIyA/Py8/PyIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLHRydWUpIHsgTnVtRm10SWQgPSAxMywgRm9ybWF0ID0gIiMgPz8vPz8iIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIm1tLWRkLXl5IiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsdHJ1ZSkgeyBOdW1GbXRJZCA9IDE0LCBGb3JtYXQgPSAibW0tZGQteXkiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoImQtbW1tLXl5IiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAxNSwgRm9ybWF0ID0gImQtbW1tLXl5IiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJkLW1tbSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTYsIEZvcm1hdCA9ICJkLW1tbSIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgibW1tLXl5IiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAxNywgRm9ybWF0ID0gIm1tbS15eSIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiaDptbSBBTS9QTSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTgsIEZvcm1hdCA9ICJoOm1tIEFNL1BNIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJoOm1tOnNzIEFNL1BNIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAxOSwgRm9ybWF0ID0gImg6bW06c3MgQU0vUE0iIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoImg6bW0iLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDIwLCBGb3JtYXQgPSAiaDptbSIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiaDptbTpzcyIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMjEsIEZvcm1hdCA9ICJoOm1tOnNzIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJtL2QveXkgaDptbSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMjIsIEZvcm1hdCA9ICJtL2QveXkgaDptbSIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIywjIzAgOygjLCMjMCkiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDM3LCBGb3JtYXQgPSAiIywjIzAgOygjLCMjMCkiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIiMsIyMwIDtbUmVkXSgjLCMjMCkiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDM4LCBGb3JtYXQgPSAiIywjIzAgO1tSZWRdKCMsIyMwKSIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIywjIzAuMDA7KCMsIyMwLjAwKSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMzksIEZvcm1hdCA9ICIjLCMjMC4wMDsoIywjIzAuMDApIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIjLCMjMC4wMDtbUmVkXSgjLCMjMC4wMCkiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDQwLCBGb3JtYXQgPSAiIywjIzAuMDA7W1JlZF0oIywjKSIgfSk7CisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgibW06c3MiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDQ1LCBGb3JtYXQgPSAibW06c3MiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIltoXTptbTpzcyIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gNDYsIEZvcm1hdCA9ICJbaF06bW06c3MiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIm1tc3MuMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gNDcsIEZvcm1hdCA9ICJtbXNzLjAiIH0pOworICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIiMjMC4wIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSA0OCwgRm9ybWF0ID0gIiMjMC4wIiB9KTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJAIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSA0OSwgRm9ybWF0ID0gIkAiIH0pOworCisgICAgICAgICAgICBOdW1iZXJGb3JtYXRzLk5leHRJZCA9IDE2NDsgLy9TdGFydCBmb3IgY3VzdG9tIGZvcm1hdHMuCisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBudW1GbXRJZCIsIE51bUZtdElkLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGZvcm1hdENvZGUiLCBGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIFRvcE5vZGU7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBlbnVtIGVGb3JtYXRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24gPSAwLAorICAgICAgICAgICAgTnVtYmVyID0gMSwKKyAgICAgICAgICAgIERhdGVUaW1lID0gMiwKKyAgICAgICAgfQorICAgICAgICBFeGNlbEZvcm1hdFRyYW5zbGF0b3IgX3RyYW5zbGF0b3IgPSBudWxsOworICAgICAgICBpbnRlcm5hbCBFeGNlbEZvcm1hdFRyYW5zbGF0b3IgRm9ybWF0VHJhbnNsYXRvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3RyYW5zbGF0b3IgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90cmFuc2xhdG9yID0gbmV3IEV4Y2VsRm9ybWF0VHJhbnNsYXRvcihGb3JtYXQsIE51bUZtdElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc2xhdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNyZWdpb24gRXhjZWwgLS0+IC5OZXQgRm9ybWF0CisgICAgICAgIGludGVybmFsIGNsYXNzIEV4Y2VsRm9ybWF0VHJhbnNsYXRvcgorICAgICAgICB7CisgICAgICAgICAgICBpbnRlcm5hbCBFeGNlbEZvcm1hdFRyYW5zbGF0b3Ioc3RyaW5nIGZvcm1hdCwgaW50IG51bUZtdElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChudW1GbXRJRCA9PSAxNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5ldEZvcm1hdCA9IE5ldEZvcm1hdEZvcldpZHRoID0gImQiOworICAgICAgICAgICAgICAgICAgICBOZXRUZXh0Rm9ybWF0ID0gTmV0VGV4dEZvcm1hdEZvcldpZHRoID0gIiI7CisgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuRGF0ZVRpbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC5FcXVhbHMoImdlbmVyYWwiLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmV0Rm9ybWF0ID0gTmV0Rm9ybWF0Rm9yV2lkdGggPSAiMC4jIyMjIyI7CisgICAgICAgICAgICAgICAgICAgIE5ldFRleHRGb3JtYXQgPSBOZXRUZXh0Rm9ybWF0Rm9yV2lkdGggPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBlRm9ybWF0VHlwZS5OdW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRvTmV0Rm9ybWF0KGZvcm1hdCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBUb05ldEZvcm1hdChmb3JtYXQsIHRydWUpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzdHJpbmcgTmV0VGV4dEZvcm1hdCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIHN0cmluZyBOZXRGb3JtYXQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgICAgICBDdWx0dXJlSW5mbyBfY2kgPSBudWxsOworICAgICAgICAgICAgaW50ZXJuYWwgQ3VsdHVyZUluZm8gQ3VsdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jaSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jaSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIGVGb3JtYXRUeXBlIERhdGFUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIE5ldFRleHRGb3JtYXRGb3JXaWR0aCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIHN0cmluZyBOZXRGb3JtYXRGb3JXaWR0aCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICAgICAgLy9pbnRlcm5hbCBzdHJpbmcgRnJhY3Rpb25Gb3JtYXRJbnRlZ2VyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEZyYWN0aW9uRm9ybWF0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgICAgICAgICAgLy9pbnRlcm5hbCBzdHJpbmcgRnJhY3Rpb25Gb3JtYXQyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgVG9OZXRGb3JtYXQoc3RyaW5nIEV4Y2VsRm9ybWF0LCBib29sIGZvckNvbFdpZHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuVW5rbm93bjsKKyAgICAgICAgICAgICAgICBpbnQgc2VjQ291bnQgPSAwOworICAgICAgICAgICAgICAgIGJvb2wgaXNUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbCBpc0JyYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgYnJhY2tldFRleHQgPSAiIjsKKyAgICAgICAgICAgICAgICBib29sIHByZXZCc2xzaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgdXNlTWludXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbCBwcmV2VW5kZXJTY29yZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgaWdub3JlTmV4dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludCBmcmFjdGlvblBvcyA9IC0xOworICAgICAgICAgICAgICAgIHN0cmluZyBzcGVjaWFsRGF0ZUZvcm1hdCA9ICIiOworICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbnNBbVBtID0gRXhjZWxGb3JtYXQuQ29udGFpbnMoIkFNL1BNIik7CisgICAgICAgICAgICAgICAgTGlzdDxpbnQ+IGxzdERlYz1uZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgQ3VsdHVyZSA9IG51bGw7CisgICAgICAgICAgICAgICAgdmFyIGZvcm1hdCA9ICIiOworICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gIiI7CisgICAgICAgICAgICAgICAgY2hhciBjbGM7CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbVBtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxGb3JtYXQgPSBSZWdleC5SZXBsYWNlKEV4Y2VsRm9ybWF0LCAiQU0vUE0iLCAiIik7CisgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuRGF0ZVRpbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgRXhjZWxGb3JtYXQuTGVuZ3RoOyBwb3MrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IEV4Y2VsRm9ybWF0W3Bvc107CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICciJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNUZXh0ID0gIWlzVGV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVOZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVGV4dCAmJiAhaXNCcmFja2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQnJhY2tldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JyYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyYWNrZXRUZXh0WzBdID09ICckJykgIC8vTG9jYWwgSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdbXSBsaSA9IFJlZ2V4LlNwbGl0KGJyYWNrZXRUZXh0LCAiLSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpWzBdLkxlbmd0aCA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJcIiIgKyBsaVswXS5TdWJzdHJpbmcoMSwgbGlbMF0uTGVuZ3RoIC0gMSkgKyAiXCIiKTsgICAgIC8vQ3VycmVuY3kgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGkuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlbMV0uRXF1YWxzKCJmODAwIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRGF0ZUZvcm1hdCA9ICJEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGlbMV0uRXF1YWxzKCJmNDAwIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRGF0ZUZvcm1hdCA9ICJUIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bSA9IGludC5QYXJzZShsaVsxXSwgTnVtYmVyU3R5bGVzLkhleE51bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdWx0dXJlID0gQ3VsdHVyZUluZm8uR2V0Q3VsdHVyZUluZm8obnVtICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdWx0dXJlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGJyYWNrZXRUZXh0WzBdPT0ndCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiaGgiKTsgLy9UT0RPOlRoaXMgd2lsbCBub3QgYmUgY29ycmVjdCBmb3IgZGF0ZXMgb3ZlciAyNEguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnJhY2tldFRleHRbMF0gPT0gJ2gnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRGF0ZUZvcm1hdCA9ICJoaCI7IC8vVE9ETzpUaGlzIHdpbGwgbm90IGJlIGNvcnJlY3QgZm9yIGRhdGVzIG92ZXIgMjRILgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrZXRUZXh0ICs9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJldlVuZGVyU2NvcmUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvckNvbFdpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJcInswfVwiIiwgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZVbmRlclNjb3JlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzsnKSAvL1dlIHVzZSBmaXJzdCBwYXJ0IChmb3IgcG9zaXRpdmUgb25seSBhdCB0aGlzIHN0YWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERhdGFUeXBlID09IGVGb3JtYXRUeXBlLkRhdGVUaW1lIHx8IHNlY0NvdW50ID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQWRkIHFvdXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERhdGFUeXBlID09IGVGb3JtYXRUeXBlLkRhdGVUaW1lKSBTZXREZWNpbWFsKGxzdERlYywgc2IpOyAvL1JlbW92ZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdERlYyA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xjID0gYy5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSlbMF07ICAvL0xvd2VyY2FzZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIGRhdGV0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEYXRhVHlwZSA9PSBlRm9ybWF0VHlwZS5Vbmtub3duKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnMCcgfHwgYyA9PSAnIycgfHwgYyA9PSAnLicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBlRm9ybWF0VHlwZS5OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGMgPT0gJ3knIHx8IGNsYyA9PSAnbScgfHwgY2xjID09ICdkJyB8fCBjbGMgPT0gJ2gnIHx8IGNsYyA9PSAnbScgfHwgY2xjID09ICdzJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IGVGb3JtYXRUeXBlLkRhdGVUaW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZCc2xzaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZCc2xzaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1snKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFja2V0VGV4dCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCcmFja2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcXCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZCc2xzaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnMCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJyMnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID09ICcuJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnLCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJyUnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGMgPT0gJ2QnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGMgPT0gJ3MnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0nLicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0RGVjLkFkZChzYi5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGMgPT0gJ2gnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbVBtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnaCcpOyA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdIJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNaW51dGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsYyA9PSAnbScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VNaW51dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdtJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdNJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXycpIC8vU2tpcCBuZXh0IGJ1dCB1c2UgZm9yIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VW5kZXJTY29yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnPycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVR5cGUgPT0gZUZvcm1hdFR5cGUuTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uUG9zID0gc2IuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcyA9IHBvcyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0UG9zID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJz8nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJyMnIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJzAnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0UG9zID4gMCkgIC8vUmVtb3ZlUGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5SZW1vdmUoc2IuTGVuZ3RoLShwb3Mtc3RhcnRQb3MtMSksKHBvcy1zdGFydFBvcy0xKSkgOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZFBvcyA9IHBvcyArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVuZFBvcyA8IEV4Y2VsRm9ybWF0Lkxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4Y2VsRm9ybWF0W2VuZFBvc10gPT0gJz8nIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm1hdFtlbmRQb3NdID09ICcjJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4Y2VsRm9ybWF0W2VuZFBvc10gPj0gJzAnICYmIEV4Y2VsRm9ybWF0W2VuZFBvc108PSAnOScpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBlbmRQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWN0aW9uRm9ybWF0ICE9ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhY3Rpb25Gb3JtYXQgPSBFeGNlbEZvcm1hdC5TdWJzdHJpbmcoc3RhcnRQb3MrMSwgZW5kUG9zIC0gc3RhcnRQb3MtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnPycpOyAvL1dpbGwgYmUgcmVwbGFjZWQgbGF0ZXIgb24gYnkgdGhlIGZyYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnKicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVwZWF0IGNoYXItLT4gaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdAJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ7MH0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vQWRkIHFvdXRlcworICAgICAgICAgICAgICAgIGlmIChEYXRhVHlwZSA9PSBlRm9ybWF0VHlwZS5EYXRlVGltZSkgU2V0RGVjaW1hbChsc3REZWMsIHNiKTsgLy9SZW1vdmU/CisKKyAgICAgICAgICAgICAgICAvLyBBTS9QTSBmb3JtYXQKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbVBtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICs9ICJ0dCI7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09ICIiKQorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHNwZWNpYWxEYXRlRm9ybWF0ICE9ICIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gc3BlY2lhbERhdGVGb3JtYXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZvckNvbFdpZHRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmV0Rm9ybWF0Rm9yV2lkdGggPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIE5ldFRleHRGb3JtYXRGb3JXaWR0aCA9IHRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5ldEZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgTmV0VGV4dEZvcm1hdCA9IHRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChDdWx0dXJlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdWx0dXJlID0gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldERlY2ltYWwoTGlzdDxpbnQ+IGxzdERlYywgU3RyaW5nQnVpbGRlciBzYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobHN0RGVjLkNvdW50ID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3REZWMuQ291bnQgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuSW5zZXJ0KGxzdERlY1tpXSArIDEsICdcJycpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuSW5zZXJ0KGxzdERlY1tpXSwgJ1wnJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIHN0cmluZyBGb3JtYXRGcmFjdGlvbihkb3VibGUgZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtZXJhdG9yLCBkZW5vbWVyYXRvcjsKKworICAgICAgICAgICAgICAgIGludCBpbnRQYXJ0ID0gKGludClkOworCisgICAgICAgICAgICAgICAgc3RyaW5nW10gZm10ID0gRnJhY3Rpb25Gb3JtYXQuU3BsaXQoJy8nKTsKKworICAgICAgICAgICAgICAgIGludCBmaXhlZERlbm9taW5hdG9yOworICAgICAgICAgICAgICAgIGlmICghaW50LlRyeVBhcnNlKGZtdFsxXSwgb3V0IGZpeGVkRGVub21pbmF0b3IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZml4ZWREZW5vbWluYXRvciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChkID09IDAgfHwgZG91YmxlLklzTmFOKGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZtdFswXS5UcmltKCkgPT0gIiIgJiYgZm10WzFdLlRyaW0oKSA9PSAiIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmcoJyAnLCBGcmFjdGlvbkZvcm1hdC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuVG9TdHJpbmcoZm10WzBdKSArICIvIiArIDEuVG9TdHJpbmcoZm10WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBtYXhEaWdpdHMgPSBmbXRbMV0uTGVuZ3RoOworICAgICAgICAgICAgICAgIHN0cmluZyBzaWduID0gZCA8IDAgPyAiLSIgOiAiIjsKKyAgICAgICAgICAgICAgICBpZiAoZml4ZWREZW5vbWluYXRvciA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxkb3VibGU+IG51bWVyYXRvcnMgPSBuZXcgTGlzdDxkb3VibGU+KCkgeyAxLCAwIH07CisgICAgICAgICAgICAgICAgICAgIExpc3Q8ZG91YmxlPiBkZW5vbWluYXRvcnMgPSBuZXcgTGlzdDxkb3VibGU+KCkgeyAwLCAxIH07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heERpZ2l0cyA8IDEgJiYgbWF4RGlnaXRzID4gMTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIk51bWJlciBvZiBkaWdpdHMgb3V0IG9mIHJhbmdlICgxLTEyKSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBtYXhOdW0gPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heERpZ2l0czsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhOdW0gKz0gOSAqIChpbnQpKE1hdGguUG93KChkb3VibGUpMTAsIChkb3VibGUpaSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpdlJlcyA9IDEgLyAoKGRvdWJsZSlNYXRoLkFicyhkKSAtIGludFBhcnQpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmVzdWx0LCBwcmV2UmVzdWx0ID0gZG91YmxlLk5hTjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RQb3MgPSAyLCBpbmRleCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGludERpdlJlcyA9IE1hdGguRmxvb3IoZGl2UmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyYXRvcnMuQWRkKChpbnREaXZSZXMgKiBudW1lcmF0b3JzW2luZGV4IC0gMV0gKyBudW1lcmF0b3JzW2luZGV4IC0gMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1lcmF0b3JzW2luZGV4XSA+IG1heE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3JzLkFkZCgoaW50RGl2UmVzICogZGVub21pbmF0b3JzW2luZGV4IC0gMV0gKyBkZW5vbWluYXRvcnNbaW5kZXggLSAyXSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudW1lcmF0b3JzW2luZGV4XSAvIGRlbm9taW5hdG9yc1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVub21pbmF0b3JzW2luZGV4XSA+IG1heE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RQb3MgPSBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBwcmV2UmVzdWx0KSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBkKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJlc3VsdCA9IHJlc3VsdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGl2UmVzID0gMSAvIChkaXZSZXMgLSBpbnREaXZSZXMpOyAgLy9SZXN0CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG51bWVyYXRvciA9IChpbnQpbnVtZXJhdG9yc1tsaXN0UG9zXTsKKyAgICAgICAgICAgICAgICAgICAgZGVub21lcmF0b3IgPSAoaW50KWRlbm9taW5hdG9yc1tsaXN0UG9zXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yID0gKGludClNYXRoLlJvdW5kKChkIC0gaW50UGFydCkgLyAoMUQgLyBmaXhlZERlbm9taW5hdG9yKSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGRlbm9tZXJhdG9yID0gZml4ZWREZW5vbWluYXRvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bWVyYXRvciA9PSBkZW5vbWVyYXRvciB8fCBudW1lcmF0b3I9PTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihudW1lcmF0b3IgPT0gZGVub21lcmF0b3IpIGludFBhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyBpbnRQYXJ0LlRvU3RyaW5nKE5ldEZvcm1hdCkuUmVwbGFjZSgiPyIsIG5ldyBzdHJpbmcoJyAnLCBGcmFjdGlvbkZvcm1hdC5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW50UGFydCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyBGbXRJbnQobnVtZXJhdG9yLCBmbXRbMF0pICsgIi8iICsgRm10SW50KGRlbm9tZXJhdG9yLCBmbXRbMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArIGludFBhcnQuVG9TdHJpbmcoTmV0Rm9ybWF0KS5SZXBsYWNlKCI/IiwgRm10SW50KG51bWVyYXRvciwgZm10WzBdKSArICIvIiArIEZtdEludChkZW5vbWVyYXRvciwgZm10WzFdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0cmluZyBGbXRJbnQoZG91YmxlIHZhbHVlLCBzdHJpbmcgZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gdmFsdWUuVG9TdHJpbmcoIiMiKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGFkID0gIiI7CisgICAgICAgICAgICAgICAgaWYgKHYuTGVuZ3RoIDwgZm9ybWF0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBmb3JtYXQuTGVuZ3RoIC0gdi5MZW5ndGgtMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRbaV0gPT0gJz8nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCArPSAiICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JtYXRbaV0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCArPSAiMCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhZCArIHY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxYZnNYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsWGZzWG1sLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTNlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsWGZzWG1sLmNzCkBAIC0wLDAgKzEsODYwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyB4ZnMgcmVjb3Jkcy4gVGhpcyBpcyB0aGUgdG9wIGxldmVsIHN0eWxlIG9iamVjdC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxYZnMgOiBTdHlsZVhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgRXhjZWxTdHlsZXMgX3N0eWxlczsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBFeGNlbFN0eWxlcyBzdHlsZXMpIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBfc3R5bGVzID0gc3R5bGVzOworICAgICAgICAgICAgaXNCdWlsZEluID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxTdHlsZXMgc3R5bGVzKSA6CisgICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3N0eWxlcyA9IHN0eWxlczsKKyAgICAgICAgICAgIF94ZklEID0gR2V0WG1sTm9kZUludCgiQHhmSWQiKTsKKyAgICAgICAgICAgIGlmIChfeGZJRCA9PSAwKSBpc0J1aWxkSW4gPSB0cnVlOyAvL05vcm1hbCB0YWdnZW4KKyAgICAgICAgICAgIF9udW1GbXRJZCA9IEdldFhtbE5vZGVJbnQoIkBudW1GbXRJZCIpOworICAgICAgICAgICAgX2ZvbnRJZCA9IEdldFhtbE5vZGVJbnQoIkBmb250SWQiKTsKKyAgICAgICAgICAgIF9maWxsSWQgPSBHZXRYbWxOb2RlSW50KCJAZmlsbElkIik7CisgICAgICAgICAgICBfYm9yZGVySWQgPSBHZXRYbWxOb2RlSW50KCJAYm9yZGVySWQiKTsKKyAgICAgICAgICAgIF9yZWFkaW5nT3JkZXIgPSBHZXRSZWFkaW5nT3JkZXIoR2V0WG1sTm9kZVN0cmluZyhyZWFkaW5nT3JkZXJQYXRoKSk7CisgICAgICAgICAgICBfaW5kZW50ID0gR2V0WG1sTm9kZUludChpbmRlbnRQYXRoKTsKKyAgICAgICAgICAgIF9zaHJpbmtUb0ZpdCA9IEdldFhtbE5vZGVTdHJpbmcoc2hyaW5rVG9GaXRQYXRoKSA9PSAiMSIgPyB0cnVlIDogZmFsc2U7IAorICAgICAgICAgICAgX3ZlcnRpY2FsQWxpZ25tZW50ID0gR2V0VmVydGljYWxBbGlnbihHZXRYbWxOb2RlU3RyaW5nKHZlcnRpY2FsQWxpZ25QYXRoKSk7CisgICAgICAgICAgICBfaG9yaXpvbnRhbEFsaWdubWVudCA9IEdldEhvcml6b250YWxBbGlnbihHZXRYbWxOb2RlU3RyaW5nKGhvcml6b250YWxBbGlnblBhdGgpKTsKKyAgICAgICAgICAgIF93cmFwVGV4dCA9IEdldFhtbE5vZGVCb29sKHdyYXBUZXh0UGF0aCk7CisgICAgICAgICAgICBfdGV4dFJvdGF0aW9uID0gR2V0WG1sTm9kZUludCh0ZXh0Um90YXRpb25QYXRoKTsKKyAgICAgICAgICAgIF9oaWRkZW4gPSBHZXRYbWxOb2RlQm9vbChoaWRkZW5QYXRoKTsKKyAgICAgICAgICAgIF9sb2NrZWQgPSBHZXRYbWxOb2RlQm9vbChsb2NrZWRQYXRoLHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFJlYWRpbmdPcmRlciBHZXRSZWFkaW5nT3JkZXIoc3RyaW5nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2godmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiMSI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbFJlYWRpbmdPcmRlci5MZWZ0VG9SaWdodDsKKyAgICAgICAgICAgICAgICBjYXNlICIyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsUmVhZGluZ09yZGVyLlJpZ2h0VG9MZWZ0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbFJlYWRpbmdPcmRlci5Db250ZXh0RGVwZW5kZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQgR2V0SG9yaXpvbnRhbEFsaWduKHN0cmluZyBhbGlnbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFsaWduID09ICIiKSByZXR1cm4gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7CisgICAgICAgICAgICBhbGlnbiA9IGFsaWduLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgYWxpZ24uU3Vic3RyaW5nKDEsIGFsaWduLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEhvcml6b250YWxBbGlnbm1lbnQpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50KSwgYWxpZ24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEV4Y2VsVmVydGljYWxBbGlnbm1lbnQgR2V0VmVydGljYWxBbGlnbihzdHJpbmcgYWxpZ24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbGlnbiA9PSAiIikgcmV0dXJuIEV4Y2VsVmVydGljYWxBbGlnbm1lbnQuQm90dG9tOworICAgICAgICAgICAgYWxpZ24gPSBhbGlnbi5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIGFsaWduLlN1YnN0cmluZygxLCBhbGlnbi5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoRXhjZWxWZXJ0aWNhbEFsaWdubWVudClFbnVtLlBhcnNlKHR5cGVvZihFeGNlbFZlcnRpY2FsQWxpZ25tZW50KSwgYWxpZ24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b207CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBYZl9DaGFuZ2VkRXZlbnQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKF9jZWxsICE9IG51bGwpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIGlmICghU3R5bGVzLkNoYW5nZWRDZWxscy5Db250YWluc0tleShfY2VsbC5JZCkpCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgLy9fY2VsbC5TdHlsZSA9ICIiOworICAgICAgICAgICAgLy8gICAgICAgIF9jZWxsLlNldE5ld1N0eWxlSUQoaW50Lk1pblZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gICAgICAgIFN0eWxlcy5DaGFuZ2VkQ2VsbHMuQWRkKF9jZWxsLklkLCBfY2VsbCk7CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorICAgICAgICBpbnQgX3hmSUQ7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0eWxlIGluZGV4CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgWGZJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3hmSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfeGZJRCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNyZWdpb24gSW50ZXJuYWwgUHJvcGVydGllcworICAgICAgICBpbnQgX251bUZtdElkOworICAgICAgICBpbnRlcm5hbCBpbnQgTnVtYmVyRm9ybWF0SWQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9udW1GbXRJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9udW1GbXRJZCA9IHZhbHVlOworICAgICAgICAgICAgICAgIEFwcGx5TnVtYmVyRm9ybWF0ID0gKHZhbHVlPjApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBfZm9udElkOworICAgICAgICBpbnRlcm5hbCBpbnQgRm9udElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZm9udElkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2ZvbnRJZCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBfZmlsbElkOworICAgICAgICBpbnRlcm5hbCBpbnQgRmlsbElkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbElkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2ZpbGxJZCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBfYm9yZGVySWQ7CisgICAgICAgIGludGVybmFsIGludCBCb3JkZXJJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcklkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JvcmRlcklkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBib29sIGlzQnVpbGRJbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBBcHBseU51bWJlckZvcm1hdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgYm9vbCBBcHBseUZvbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGJvb2wgQXBwbHlGaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEFwcGx5Qm9yZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEFwcGx5QWxpZ25tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBib29sIEFwcGx5UHJvdGVjdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlcyBTdHlsZXMgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE51bWJlcmZvcm1hdCBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbE51bWJlckZvcm1hdFhtbCBOdW1iZXJmb3JtYXQgCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLk51bWJlckZvcm1hdHNbX251bUZtdElkIDwgMCA/IDAgOiBfbnVtRm10SWRdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZvbnQgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxGb250WG1sIEZvbnQgCisgICAgICAgIHsgCisgICAgICAgICAgIGdldAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tfZm9udElkIDwgMCA/IDAgOiBfZm9udElkXTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEZpbGwgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxGaWxsWG1sIEZpbGwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHNbX2ZpbGxJZCA8IDAgPyAwIDogX2ZpbGxJZF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCb3JkZXIgc3R5bGUgcHJvcGVydGllcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJYbWwgQm9yZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbX2JvcmRlcklkIDwgMCA/IDAgOiBfYm9yZGVySWRdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBob3Jpem9udGFsQWxpZ25QYXRoID0gImQ6YWxpZ25tZW50L0Bob3Jpem9udGFsIjsKKyAgICAgICAgRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50IF9ob3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvcml6b250YWwgYWxpZ25tZW50CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQgSG9yaXpvbnRhbEFsaWdubWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2hvcml6b250YWxBbGlnbm1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaG9yaXpvbnRhbEFsaWdubWVudCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyB2ZXJ0aWNhbEFsaWduUGF0aCA9ICJkOmFsaWdubWVudC9AdmVydGljYWwiOworICAgICAgICBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IF92ZXJ0aWNhbEFsaWdubWVudD1FeGNlbFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmVydGljYWwgYWxpZ25tZW50CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IFZlcnRpY2FsQWxpZ25tZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdmVydGljYWxBbGlnbm1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmVydGljYWxBbGlnbm1lbnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgd3JhcFRleHRQYXRoID0gImQ6YWxpZ25tZW50L0B3cmFwVGV4dCI7CisgICAgICAgIGJvb2wgX3dyYXBUZXh0PWZhbHNlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcmFwZWQgdGV4dAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBXcmFwVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3dyYXBUZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dyYXBUZXh0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIHRleHRSb3RhdGlvblBhdGggPSAiZDphbGlnbm1lbnQvQHRleHRSb3RhdGlvbiI7CisgICAgICAgIGludCBfdGV4dFJvdGF0aW9uID0gMDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGV4dCByb3RhdGlvbiBhbmdsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFRleHRSb3RhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKF90ZXh0Um90YXRpb24gPT0gaW50Lk1pblZhbHVlID8gMCA6IF90ZXh0Um90YXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RleHRSb3RhdGlvbiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBsb2NrZWRQYXRoID0gImQ6cHJvdGVjdGlvbi9AbG9ja2VkIjsKKyAgICAgICAgYm9vbCBfbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9ja2VkIHdoZW4gc2hlZXQgaXMgcHJvdGVjdGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIExvY2tlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xvY2tlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9sb2NrZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgaGlkZGVuUGF0aCA9ICJkOnByb3RlY3Rpb24vQGhpZGRlbiI7CisgICAgICAgIGJvb2wgX2hpZGRlbiA9IGZhbHNlOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIaWRlIGZvcm11bGFzIHdoZW4gc2hlZXQgaXMgcHJvdGVjdGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEhpZGRlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2hpZGRlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9oaWRkZW4gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgcmVhZGluZ09yZGVyUGF0aCA9ICJkOmFsaWdubWVudC9AcmVhZGluZ09yZGVyIjsKKyAgICAgICAgRXhjZWxSZWFkaW5nT3JkZXIgX3JlYWRpbmdPcmRlciA9IEV4Y2VsUmVhZGluZ09yZGVyLkNvbnRleHREZXBlbmRlbnQ7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWRpbmdvcmRlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxSZWFkaW5nT3JkZXIgUmVhZGluZ09yZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcmVhZGluZ09yZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3JlYWRpbmdPcmRlciA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBzaHJpbmtUb0ZpdFBhdGggPSAiZDphbGlnbm1lbnQvQHNocmlua1RvRml0IjsKKyAgICAgICAgYm9vbCBfc2hyaW5rVG9GaXQgPSBmYWxzZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hyaW5rIHRvIGZpdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaHJpbmtUb0ZpdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Nocmlua1RvRml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3Nocmlua1RvRml0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIGluZGVudFBhdGggPSAiZDphbGlnbm1lbnQvQGluZGVudCI7CisgICAgICAgIGludCBfaW5kZW50ID0gMDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kZW50YXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBJbmRlbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChfaW5kZW50ID09IGludC5NaW5WYWx1ZSA/IDAgOiBfaW5kZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbmRlbnQ9dmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICBpbnRlcm5hbCB2b2lkIFJlZ2lzdGVyRXZlbnQoRXhjZWxYZnMgeGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXZlbnQoeGYsIHhmLlhmX0NoYW5nZWRFdmVudCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCisgICAgICAgIHsKKworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFhmSWQgKyAifCIgKyBOdW1iZXJGb3JtYXRJZC5Ub1N0cmluZygpICsgInwiICsgRm9udElkLlRvU3RyaW5nKCkgKyAifCIgKyBGaWxsSWQuVG9TdHJpbmcoKSArICJ8IiArIEJvcmRlcklkLlRvU3RyaW5nKCkgKyBWZXJ0aWNhbEFsaWdubWVudC5Ub1N0cmluZygpICsgInwiICsgSG9yaXpvbnRhbEFsaWdubWVudC5Ub1N0cmluZygpICsgInwiICsgV3JhcFRleHQuVG9TdHJpbmcoKSArICJ8IiArIFJlYWRpbmdPcmRlci5Ub1N0cmluZygpICsgInwiICsgaXNCdWlsZEluLlRvU3RyaW5nKCkgKyBUZXh0Um90YXRpb24uVG9TdHJpbmcoKSArIExvY2tlZC5Ub1N0cmluZygpICsgSGlkZGVuLlRvU3RyaW5nKCkgKyBTaHJpbmtUb0ZpdC5Ub1N0cmluZygpICsgSW5kZW50LlRvU3RyaW5nKCk7IAorICAgICAgICAgICAgICAgIC8vcmV0dXJuIE51bWJlcmZvcm1hdC5JZCArICJ8IiArIEZvbnQuSWQgKyAifCIgKyBGaWxsLklkICsgInwiICsgQm9yZGVyLklkICsgVmVydGljYWxBbGlnbm1lbnQuVG9TdHJpbmcoKSArICJ8IiArIEhvcml6b250YWxBbGlnbm1lbnQuVG9TdHJpbmcoKSArICJ8IiArIFdyYXBUZXh0LlRvU3RyaW5nKCkgKyAifCIgKyBSZWFkaW5nT3JkZXIuVG9TdHJpbmcoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMgQ29weSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb3B5KF9zdHlsZXMpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMgQ29weShFeGNlbFN0eWxlcyBzdHlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsWGZzIG5ld1hGID0gbmV3IEV4Y2VsWGZzKE5hbWVTcGFjZU1hbmFnZXIsIHN0eWxlcyk7CisgICAgICAgICAgICBuZXdYRi5OdW1iZXJGb3JtYXRJZCA9IF9udW1GbXRJZDsKKyAgICAgICAgICAgIG5ld1hGLkZvbnRJZCA9IF9mb250SWQ7CisgICAgICAgICAgICBuZXdYRi5GaWxsSWQgPSBfZmlsbElkOworICAgICAgICAgICAgbmV3WEYuQm9yZGVySWQgPSBfYm9yZGVySWQ7CisgICAgICAgICAgICBuZXdYRi5YZklkID0gX3hmSUQ7CisgICAgICAgICAgICBuZXdYRi5SZWFkaW5nT3JkZXIgPSBfcmVhZGluZ09yZGVyOworICAgICAgICAgICAgbmV3WEYuSG9yaXpvbnRhbEFsaWdubWVudCA9IF9ob3Jpem9udGFsQWxpZ25tZW50OworICAgICAgICAgICAgbmV3WEYuVmVydGljYWxBbGlnbm1lbnQgPSBfdmVydGljYWxBbGlnbm1lbnQ7CisgICAgICAgICAgICBuZXdYRi5XcmFwVGV4dCA9IF93cmFwVGV4dDsKKyAgICAgICAgICAgIG5ld1hGLlNocmlua1RvRml0ID0gX3Nocmlua1RvRml0OworICAgICAgICAgICAgbmV3WEYuSW5kZW50ID0gX2luZGVudDsKKyAgICAgICAgICAgIG5ld1hGLlRleHRSb3RhdGlvbiA9IF90ZXh0Um90YXRpb247CisgICAgICAgICAgICBuZXdYRi5Mb2NrZWQgPSBfbG9ja2VkOworICAgICAgICAgICAgbmV3WEYuSGlkZGVuID0gX2hpZGRlbjsKKyAgICAgICAgICAgIHJldHVybiBuZXdYRjsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGludCBHZXROZXdJRChFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4geGZzQ29sLCBTdHlsZUJhc2Ugc3R5bGVPYmplY3QsIGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxYZnMgbmV3WGZzID0gdGhpcy5Db3B5KCk7CisgICAgICAgICAgICBzd2l0Y2goc3R5bGVDbGFzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLk51bWJlcmZvcm1hdDoKKyAgICAgICAgICAgICAgICAgICAgbmV3WGZzLk51bWJlckZvcm1hdElkID0gR2V0SWROdW1iZXJGb3JtYXQoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzdHlsZU9iamVjdC5TZXRJbmRleChuZXdYZnMuTnVtYmVyRm9ybWF0SWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZvbnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdYZnMuRm9udElkID0gR2V0SWRGb250KHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkZvbnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGw6CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsQmFja2dyb3VuZENvbG9yOgorICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuRmlsbFBhdHRlcm5Db2xvcjoKKyAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkZpbGxJZCA9IEdldElkRmlsbChzdHlsZUNsYXNzLCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHN0eWxlT2JqZWN0LlNldEluZGV4KG5ld1hmcy5GaWxsSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbDoKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMToKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMjoKKyAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkZpbGxJZCA9IEdldElkR3JhZGllbnRGaWxsKHN0eWxlQ2xhc3MsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkZpbGxJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyOgorICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tOgorICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyRGlhZ29uYWw6CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgorICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyUmlnaHQ6CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJUb3A6CisgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5Cb3JkZXJJZCA9IEdldElkQm9yZGVyKHN0eWxlQ2xhc3MsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkJvcmRlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5TdHlsZToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHN0eWxlUHJvcGVydHkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuWGZJZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuWGZJZCA9IChpbnQpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5Lkhvcml6b250YWxBbGlnbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuSG9yaXpvbnRhbEFsaWdubWVudD0oRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50KXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5WZXJ0aWNhbEFsaWduOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5WZXJ0aWNhbEFsaWdubWVudCA9IChFeGNlbFZlcnRpY2FsQWxpZ25tZW50KXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5XcmFwVGV4dDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuV3JhcFRleHQgPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuUmVhZGluZ09yZGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5SZWFkaW5nT3JkZXIgPSAoRXhjZWxSZWFkaW5nT3JkZXIpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlNocmlua1RvRml0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5TaHJpbmtUb0ZpdD0oYm9vbCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuSW5kZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5JbmRlbnQgPSAoaW50KXZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5UZXh0Um90YXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3WGZzLlRleHRSb3RhdGlvbiA9IChpbnQpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkxvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuTG9ja2VkID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkhpZGRlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuSGlkZGVuID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IGZvciBjbGFzcyBzdHlsZS4iKSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZCA9IHhmc0NvbC5GaW5kSW5kZXhCeUlEKG5ld1hmcy5JZCk7CisgICAgICAgICAgICBpZiAoaWQgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB4ZnNDb2wuQWRkKG5ld1hmcy5JZCwgbmV3WGZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IEdldElkQm9yZGVyKGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxCb3JkZXJYbWwgYm9yZGVyID0gQm9yZGVyLkNvcHkoKTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHlsZUNsYXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tOgorICAgICAgICAgICAgICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5Cb3R0b20sIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbDoKKyAgICAgICAgICAgICAgICAgICAgU2V0Qm9yZGVySXRlbShib3JkZXIuRGlhZ29uYWwsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgorICAgICAgICAgICAgICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5MZWZ0LCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyUmlnaHQ6CisgICAgICAgICAgICAgICAgICAgIFNldEJvcmRlckl0ZW0oYm9yZGVyLlJpZ2h0LCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wOgorICAgICAgICAgICAgICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5Ub3AsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXI6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkJvcmRlckRpYWdvbmFsVXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci5EaWFnb25hbFVwID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5Cb3JkZXJEaWFnb25hbERvd24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci5EaWFnb25hbERvd24gPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IGZvciBjbGFzcyBCb3JkZXIuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBCb3JkZXIuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN1YklkOworICAgICAgICAgICAgc3RyaW5nIGlkID0gYm9yZGVyLklkOworICAgICAgICAgICAgc3ViSWQgPSBfc3R5bGVzLkJvcmRlcnMuRmluZEluZGV4QnlJRChpZCk7CisgICAgICAgICAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnMuQWRkKGlkLCBib3JkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1YklkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEJvcmRlckl0ZW0oRXhjZWxCb3JkZXJJdGVtWG1sIGV4Y2VsQm9yZGVySXRlbSwgZVN0eWxlUHJvcGVydHkgc3R5bGVQcm9wZXJ0eSwgb2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihzdHlsZVByb3BlcnR5PT1lU3R5bGVQcm9wZXJ0eS5TdHlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleGNlbEJvcmRlckl0ZW0uU3R5bGUgPSAoRXhjZWxCb3JkZXJTdHlsZSl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuQ29sb3IgfHwgc3R5bGVQcm9wZXJ0eT09IGVTdHlsZVByb3BlcnR5LlRpbnQgfHwgc3R5bGVQcm9wZXJ0eT09ZVN0eWxlUHJvcGVydHkuSW5kZXhlZENvbG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleGNlbEJvcmRlckl0ZW0uU3R5bGUgPT0gRXhjZWxCb3JkZXJTdHlsZS5Ob25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGJvcmRlcmNvbG9yIHdoZW4gc3R5bGUgaXMgbm90IHNldC4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4Y2VsQm9yZGVySXRlbS5Db2xvci5SZ2IgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SWRGaWxsKGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxGaWxsWG1sIGZpbGwgPSBGaWxsLkNvcHkoKTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHlsZVByb3BlcnR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuUGF0dGVyblR5cGU6CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxsIGlzIEV4Y2VsR3JhZGllbnRGaWxsWG1sKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gbmV3IEV4Y2VsRmlsbFhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaWxsLlBhdHRlcm5UeXBlID0gKEV4Y2VsRmlsbFN0eWxlKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkNvbG9yOgorICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuVGludDoKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcjoKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkF1dG9Db2xvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGwgaXMgRXhjZWxHcmFkaWVudEZpbGxYbWwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBuZXcgRXhjZWxGaWxsWG1sKE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxsLlBhdHRlcm5UeXBlID09IEV4Y2VsRmlsbFN0eWxlLk5vbmUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHNldCBjb2xvciB3aGVuIHBhdHRlcm50eXBlIGlzIG5vdCBzZXQuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ29sb3JYbWwgZGVzdENvbG9yOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDbGFzcz09ZVN0eWxlQ2xhc3MuRmlsbFBhdHRlcm5Db2xvcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yID0gZmlsbC5QYXR0ZXJuQ29sb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q29sb3IgPSBmaWxsLkJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkNvbG9yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q29sb3IuUmdiID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LlRpbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5UaW50ID0gKGRlY2ltYWwpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5JbmRleGVkQ29sb3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5JbmRleGVkID0gKGludCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5BdXRvID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBGaWxsLiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdWJJZDsKKyAgICAgICAgICAgIHN0cmluZyBpZCA9IGZpbGwuSWQ7CisgICAgICAgICAgICBzdWJJZCA9IF9zdHlsZXMuRmlsbHMuRmluZEluZGV4QnlJRChpZCk7CisgICAgICAgICAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZpbGxzLkFkZChpZCwgZmlsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3ViSWQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SWRHcmFkaWVudEZpbGwoZVN0eWxlQ2xhc3Mgc3R5bGVDbGFzcywgZVN0eWxlUHJvcGVydHkgc3R5bGVQcm9wZXJ0eSwgb2JqZWN0IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbEdyYWRpZW50RmlsbFhtbCBmaWxsOworICAgICAgICAgICAgaWYoRmlsbCBpcyBFeGNlbEdyYWRpZW50RmlsbFhtbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxsID0gKEV4Y2VsR3JhZGllbnRGaWxsWG1sKUZpbGwuQ29weSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGwgPSBuZXcgRXhjZWxHcmFkaWVudEZpbGxYbWwoRmlsbC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBmaWxsLkdyYWRpZW50Q29sb3IxLlNldENvbG9yKENvbG9yLldoaXRlKTsKKyAgICAgICAgICAgICAgICBmaWxsLkdyYWRpZW50Q29sb3IyLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDc5LDEyOSwxODkpKTsKKyAgICAgICAgICAgICAgICBmaWxsLlR5cGU9RXhjZWxGaWxsR3JhZGllbnRUeXBlLkxpbmVhcjsKKyAgICAgICAgICAgICAgICBmaWxsLkRlZ3JlZT05MDsKKyAgICAgICAgICAgICAgICBmaWxsLlRvcCA9IGRvdWJsZS5OYU47CisgICAgICAgICAgICAgICAgZmlsbC5Cb3R0b20gPSBkb3VibGUuTmFOOworICAgICAgICAgICAgICAgIGZpbGwuTGVmdCA9IGRvdWJsZS5OYU47CisgICAgICAgICAgICAgICAgZmlsbC5SaWdodCA9IGRvdWJsZS5OYU47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3R5bGVQcm9wZXJ0eSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VHlwZToKKyAgICAgICAgICAgICAgICAgICAgZmlsbC5UeXBlID0gKEV4Y2VsRmlsbEdyYWRpZW50VHlwZSl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudERlZ3JlZToKKyAgICAgICAgICAgICAgICAgICAgZmlsbC5EZWdyZWUgPSAoZG91YmxlKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VG9wOgorICAgICAgICAgICAgICAgICAgICBmaWxsLlRvcCA9IChkb3VibGUpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRCb3R0b206IAorICAgICAgICAgICAgICAgICAgICBmaWxsLkJvdHRvbSA9IChkb3VibGUpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRMZWZ0OgorICAgICAgICAgICAgICAgICAgICBmaWxsLkxlZnQgPSAoZG91YmxlKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50UmlnaHQ6CisgICAgICAgICAgICAgICAgICAgIGZpbGwuUmlnaHQgPSAoZG91YmxlKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkNvbG9yOgorICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuVGludDoKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcjoKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkF1dG9Db2xvcjoKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxDb2xvclhtbCBkZXN0Q29sb3I7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2xhc3MgPT0gZVN0eWxlQ2xhc3MuRmlsbEdyYWRpZW50Q29sb3IxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q29sb3IgPSBmaWxsLkdyYWRpZW50Q29sb3IxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yID0gZmlsbC5HcmFkaWVudENvbG9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuQ29sb3IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5SZ2IgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuVGludCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yLlRpbnQgPSAoZGVjaW1hbCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yLkluZGV4ZWQgPSAoaW50KXZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yLkF1dG8gPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBGaWxsLiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdWJJZDsKKyAgICAgICAgICAgIHN0cmluZyBpZCA9IGZpbGwuSWQ7CisgICAgICAgICAgICBzdWJJZCA9IF9zdHlsZXMuRmlsbHMuRmluZEluZGV4QnlJRChpZCk7CisgICAgICAgICAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZpbGxzLkFkZChpZCwgZmlsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3ViSWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBHZXRJZE51bWJlckZvcm1hdChlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LCBvYmplY3QgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBpdGVtPW51bGw7CisgICAgICAgICAgICAgICAgaWYgKCFfc3R5bGVzLk51bWJlckZvcm1hdHMuRmluZEJ5SUQodmFsdWUuVG9TdHJpbmcoKSwgcmVmIGl0ZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7IEZvcm1hdCA9IHZhbHVlLlRvU3RyaW5nKCksIE51bUZtdElkID0gX3N0eWxlcy5OdW1iZXJGb3JtYXRzLk5leHRJZCsrIH07CisgICAgICAgICAgICAgICAgICAgIF9zdHlsZXMuTnVtYmVyRm9ybWF0cy5BZGQodmFsdWUuVG9TdHJpbmcoKSwgaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLk51bUZtdElkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IGZvciBjbGFzcyBOdW1iZXJmb3JtYXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SWRGb250KGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxGb250WG1sIGZudCA9IEZvbnQuQ29weSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0eWxlUHJvcGVydHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5OYW1lOgorICAgICAgICAgICAgICAgICAgICBmbnQuTmFtZSA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuU2l6ZToKKyAgICAgICAgICAgICAgICAgICAgZm50LlNpemUgPSAoZmxvYXQpdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuRmFtaWx5OgorICAgICAgICAgICAgICAgICAgICBmbnQuRmFtaWx5ID0gKGludCl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5Cb2xkOgorICAgICAgICAgICAgICAgICAgICBmbnQuQm9sZCA9IChib29sKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5Lkl0YWxpYzoKKyAgICAgICAgICAgICAgICAgICAgZm50Lkl0YWxpYyA9IChib29sKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlN0cmlrZToKKyAgICAgICAgICAgICAgICAgICAgZm50LlN0cmlrZSA9IChib29sKXZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlVuZGVybGluZVR5cGU6CisgICAgICAgICAgICAgICAgICAgIGZudC5VbmRlckxpbmVUeXBlID0gKEV4Y2VsVW5kZXJMaW5lVHlwZSl2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5Db2xvcjoKKyAgICAgICAgICAgICAgICAgICAgZm50LkNvbG9yLlJnYj12YWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlZlcnRpY2FsQWxpZ246CisgICAgICAgICAgICAgICAgICAgIGZudC5WZXJ0aWNhbEFsaWduID0gKChFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udCl2YWx1ZSkgPT0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZSA/ICIiIDogdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSBmb3IgY2xhc3MgRm9udCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdWJJZDsKKyAgICAgICAgICAgIHN0cmluZyBpZCA9IGZudC5JZDsKKyAgICAgICAgICAgIHN1YklkID0gX3N0eWxlcy5Gb250cy5GaW5kSW5kZXhCeUlEKGlkKTsKKyAgICAgICAgICAgIGlmIChzdWJJZCA9PSBpbnQuTWluVmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHMuQWRkKGlkLGZudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3ViSWQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVhtbE5vZGUodG9wTm9kZSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUsIGJvb2wgaXNDZWxsU3R5bGVYc2YpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOworICAgICAgICAgICAgdmFyIGRvU2V0WGZJZCA9ICghaXNDZWxsU3R5bGVYc2YgJiYgX3hmSUQgPiBpbnQuTWluVmFsdWUgJiYgX3N0eWxlcy5DZWxsU3R5bGVYZnMuQ291bnQgPiAwICYmIF9zdHlsZXMuQ2VsbFN0eWxlWGZzW194ZklEXS5uZXdJRCA+IGludC5NaW5WYWx1ZSk7CisgICAgICAgICAgICBpZiAoX251bUZtdElkID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbnVtRm10SWQiLCBfbnVtRm10SWQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYoZG9TZXRYZklkKSBTZXRYbWxOb2RlU3RyaW5nKCJAYXBwbHlOdW1iZXJGb3JtYXQiLCAiMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9mb250SWQgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZm9udElkIiwgX3N0eWxlcy5Gb250c1tfZm9udElkXS5uZXdJRC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9TZXRYZklkKSBTZXRYbWxOb2RlU3RyaW5nKCJAYXBwbHlGb250IiwgIjEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfZmlsbElkID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGZpbGxJZCIsIF9zdHlsZXMuRmlsbHNbX2ZpbGxJZF0ubmV3SUQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRvU2V0WGZJZCkgU2V0WG1sTm9kZVN0cmluZygiQGFwcGx5RmlsbCIsICIxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2JvcmRlcklkID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGJvcmRlcklkIiwgX3N0eWxlcy5Cb3JkZXJzW19ib3JkZXJJZF0ubmV3SUQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRvU2V0WGZJZCkgU2V0WG1sTm9kZVN0cmluZygiQGFwcGx5Qm9yZGVyIiwgIjEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKF9ob3Jpem9udGFsQWxpZ25tZW50ICE9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5HZW5lcmFsKSB0aGlzLlNldFhtbE5vZGVTdHJpbmcoaG9yaXpvbnRhbEFsaWduUGF0aCwgU2V0QWxpZ25TdHJpbmcoX2hvcml6b250YWxBbGlnbm1lbnQpKTsKKyAgICAgICAgICAgIGlmIChkb1NldFhmSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHhmSWQiLCBfc3R5bGVzLkNlbGxTdHlsZVhmc1tfeGZJRF0ubmV3SUQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX3ZlcnRpY2FsQWxpZ25tZW50ICE9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnQuQm90dG9tKSB0aGlzLlNldFhtbE5vZGVTdHJpbmcodmVydGljYWxBbGlnblBhdGgsIFNldEFsaWduU3RyaW5nKF92ZXJ0aWNhbEFsaWdubWVudCkpOworICAgICAgICAgICAgaWYoX3dyYXBUZXh0KSB0aGlzLlNldFhtbE5vZGVTdHJpbmcod3JhcFRleHRQYXRoLCAiMSIpOworICAgICAgICAgICAgaWYoX3JlYWRpbmdPcmRlciE9RXhjZWxSZWFkaW5nT3JkZXIuQ29udGV4dERlcGVuZGVudCkgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKHJlYWRpbmdPcmRlclBhdGgsICgoaW50KV9yZWFkaW5nT3JkZXIpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKF9zaHJpbmtUb0ZpdCkgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKHNocmlua1RvRml0UGF0aCwgIjEiKTsKKyAgICAgICAgICAgIGlmIChfaW5kZW50ID4gMCkgU2V0WG1sTm9kZVN0cmluZyhpbmRlbnRQYXRoLCBfaW5kZW50LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKF90ZXh0Um90YXRpb24gPiAwKSB0aGlzLlNldFhtbE5vZGVTdHJpbmcodGV4dFJvdGF0aW9uUGF0aCwgX3RleHRSb3RhdGlvbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmICghX2xvY2tlZCkgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKGxvY2tlZFBhdGgsICIwIik7CisgICAgICAgICAgICBpZiAoX2hpZGRlbikgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKGhpZGRlblBhdGgsICIxIik7CisgICAgICAgICAgICByZXR1cm4gVG9wTm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNldEFsaWduU3RyaW5nKEVudW0gYWxpZ24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBuZXdOYW1lID0gRW51bS5HZXROYW1lKGFsaWduLkdldFR5cGUoKSwgYWxpZ24pOworICAgICAgICAgICAgcmV0dXJuIG5ld05hbWUuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBuZXdOYW1lLlN1YnN0cmluZygxLCBuZXdOYW1lLkxlbmd0aCAtIDEpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvU3R5bGVYbWxIZWxwZXIuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL1N0eWxlWG1sSGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWFlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL1N0eWxlWG1sSGVscGVyLmNzCkBAIC0wLDAgKzEsNzggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFhtbCBoZWxwZXIgY2xhc3MgZm9yIGNlbGwgc3R5bGUgY2xhc3NlcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzICBTdHlsZVhtbEhlbHBlciA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgU3R5bGVYbWxIZWxwZXIoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeyAKKworICAgICAgICB9CisgICAgICAgIGludGVybmFsIFN0eWxlWG1sSGVscGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlKSA6IGJhc2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGFic3RyYWN0IFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcCk7CisgICAgICAgIGludGVybmFsIGFic3RyYWN0IHN0cmluZyBJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgbG9uZyB1c2VDbnQ9MDsKKyAgICAgICAgaW50ZXJuYWwgaW50IG5ld0lEPWludC5NaW5WYWx1ZTsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgR2V0Qm9vbFZhbHVlKFhtbE5vZGUgdG9wTm9kZSwgc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBub2RlID0gdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKG5vZGUgaXMgWG1sQXR0cmlidXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlLlZhbHVlICE9ICIwIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmICgobm9kZS5BdHRyaWJ1dGVzWyJ2YWwiXSAhPSBudWxsICYmIG5vZGUuQXR0cmlidXRlc1sidmFsIl0uVmFsdWUgIT0gIjAiKSB8fCBub2RlLkF0dHJpYnV0ZXNbInZhbCJdID09IG51bGwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZS5jcyBiL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzkwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZS5jcwpAQCAtMCwwICsxLDYzOSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMzAtQVVHLTIwMTAKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGFibGUgc3R5bGUgRW51bQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gVGFibGVTdHlsZXMKKyAgICB7CisgICAgICAgIE5vbmUsCisgICAgICAgIEN1c3RvbSwKKyAgICAgICAgTGlnaHQxLAorICAgICAgICBMaWdodDIsCisgICAgICAgIExpZ2h0MywKKyAgICAgICAgTGlnaHQ0LAorICAgICAgICBMaWdodDUsCisgICAgICAgIExpZ2h0NiwKKyAgICAgICAgTGlnaHQ3LAorICAgICAgICBMaWdodDgsCisgICAgICAgIExpZ2h0OSwKKyAgICAgICAgTGlnaHQxMCwKKyAgICAgICAgTGlnaHQxMSwKKyAgICAgICAgTGlnaHQxMiwKKyAgICAgICAgTGlnaHQxMywKKyAgICAgICAgTGlnaHQxNCwKKyAgICAgICAgTGlnaHQxNSwKKyAgICAgICAgTGlnaHQxNiwKKyAgICAgICAgTGlnaHQxNywKKyAgICAgICAgTGlnaHQxOCwKKyAgICAgICAgTGlnaHQxOSwKKyAgICAgICAgTGlnaHQyMCwKKyAgICAgICAgTGlnaHQyMSwKKyAgICAgICAgTWVkaXVtMSwKKyAgICAgICAgTWVkaXVtMiwKKyAgICAgICAgTWVkaXVtMywKKyAgICAgICAgTWVkaXVtNCwKKyAgICAgICAgTWVkaXVtNSwKKyAgICAgICAgTWVkaXVtNiwKKyAgICAgICAgTWVkaXVtNywKKyAgICAgICAgTWVkaXVtOCwKKyAgICAgICAgTWVkaXVtOSwKKyAgICAgICAgTWVkaXVtMTAsCisgICAgICAgIE1lZGl1bTExLAorICAgICAgICBNZWRpdW0xMiwKKyAgICAgICAgTWVkaXVtMTMsCisgICAgICAgIE1lZGl1bTE0LAorICAgICAgICBNZWRpdW0xNSwKKyAgICAgICAgTWVkaXVtMTYsCisgICAgICAgIE1lZGl1bTE3LAorICAgICAgICBNZWRpdW0xOCwKKyAgICAgICAgTWVkaXVtMTksCisgICAgICAgIE1lZGl1bTIwLAorICAgICAgICBNZWRpdW0yMSwKKyAgICAgICAgTWVkaXVtMjIsCisgICAgICAgIE1lZGl1bTIzLAorICAgICAgICBNZWRpdW0yNCwKKyAgICAgICAgTWVkaXVtMjUsCisgICAgICAgIE1lZGl1bTI2LAorICAgICAgICBNZWRpdW0yNywKKyAgICAgICAgTWVkaXVtMjgsCisgICAgICAgIERhcmsxLAorICAgICAgICBEYXJrMiwKKyAgICAgICAgRGFyazMsCisgICAgICAgIERhcms0LAorICAgICAgICBEYXJrNSwKKyAgICAgICAgRGFyazYsCisgICAgICAgIERhcms3LAorICAgICAgICBEYXJrOCwKKyAgICAgICAgRGFyazksCisgICAgICAgIERhcmsxMCwKKyAgICAgICAgRGFyazExLAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIEV4Y2VsIFRhYmxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxUYWJsZSA6IFhtbEhlbHBlciwgSUVxdWFsaXR5Q29tcGFyZXI8RXhjZWxUYWJsZT4KKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsVGFibGUoUGFja2FnaW5nLlppcFBhY2thZ2VSZWxhdGlvbnNoaXAgcmVsLCBFeGNlbFdvcmtzaGVldCBzaGVldCkgOiAKKyAgICAgICAgICAgIGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgV29ya1NoZWV0ID0gc2hlZXQ7CisgICAgICAgICAgICBUYWJsZVVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcElEID0gcmVsLklkOworICAgICAgICAgICAgdmFyIHBjayA9IHNoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICBQYXJ0PXBjay5HZXRQYXJ0KFRhYmxlVXJpKTsKKworICAgICAgICAgICAgVGFibGVYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIExvYWRYbWxTYWZlKFRhYmxlWG1sLCBQYXJ0LkdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgICAgIEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShHZXRYbWxOb2RlU3RyaW5nKCJAcmVmIikpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsVGFibGUoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgc3RyaW5nIG5hbWUsIGludCB0YmxJZCkgOiAKKyAgICAgICAgICAgIGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikKKwkgICAgeworICAgICAgICAgICAgV29ya1NoZWV0ID0gc2hlZXQ7CisgICAgICAgICAgICBBZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgIFRhYmxlWG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBMb2FkWG1sU2FmZShUYWJsZVhtbCwgR2V0U3RhcnRYbWwobmFtZSwgdGJsSWQpLCBFbmNvZGluZy5VVEY4KTsgCisgICAgICAgICAgICBUb3BOb2RlID0gVGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OworCisgICAgICAgICAgICBpbml0KCk7CisKKyAgICAgICAgICAgIC8vSWYgdGhlIHRhYmxlIGlzIGp1c3Qgb25lIHJvdyB3ZSBjYW4gbm90IGhhdmUgYSBoZWFkZXIuCisgICAgICAgICAgICBpZiAoYWRkcmVzcy5fZnJvbVJvdyA9PSBhZGRyZXNzLl90b1JvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTaG93SGVhZGVyID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvcE5vZGUgPSBUYWJsZVhtbC5Eb2N1bWVudEVsZW1lbnQ7CisgICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiYXV0b0ZpbHRlciIsICJ0YWJsZUNvbHVtbnMiLCAidGFibGVTdHlsZUluZm8iIH07CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RhcnRYbWwoc3RyaW5nIG5hbWUsIGludCB0YmxJZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHhtbCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIiA/PiI7CisgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHRhYmxlIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgaWQ9XCJ7MH1cIiBuYW1lPVwiezF9XCIgZGlzcGxheU5hbWU9XCJ7Mn1cIiByZWY9XCJ7M31cIiBoZWFkZXJSb3dDb3VudD1cIjFcIj4iLAorICAgICAgICAgICAgdGJsSWQsCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgY2xlYW5EaXNwbGF5TmFtZShuYW1lKSwKKyAgICAgICAgICAgIEFkZHJlc3MuQWRkcmVzcyk7CisgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPGF1dG9GaWx0ZXIgcmVmPVwiezB9XCIgLz4iLCBBZGRyZXNzLkFkZHJlc3MpOworCisgICAgICAgICAgICBpbnQgY29scz1BZGRyZXNzLl90b0NvbC1BZGRyZXNzLl9mcm9tQ29sKzE7CisgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHRhYmxlQ29sdW1ucyBjb3VudD1cInswfVwiPiIsY29scyk7CisgICAgICAgICAgICB2YXIgbmFtZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcihpbnQgaT0xO2k8PWNvbHM7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjZWxsID0gV29ya1NoZWV0LkNlbGxzW0FkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX2Zyb21Db2wraS0xXTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgY29sTmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoY2VsbC5WYWx1ZSA9PSBudWxsIHx8IG5hbWVzLkNvbnRhaW5zS2V5KGNlbGwuVmFsdWUuVG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0dldCBhbiB1bmlxdWUgbmFtZQorICAgICAgICAgICAgICAgICAgICBpbnQgYT1pOworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xOYW1lID0gc3RyaW5nLkZvcm1hdCgiQ29sdW1uezB9IiwgYSsrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmFtZXMuQ29udGFpbnNLZXkoY29sTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2xOYW1lID0gU3lzdGVtLlNlY3VyaXR5LlNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoY2VsbC5WYWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmFtZXMuQWRkKGNvbE5hbWUsIGNvbE5hbWUpOworICAgICAgICAgICAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KCI8dGFibGVDb2x1bW4gaWQ9XCJ7MH1cIiBuYW1lPVwiezF9XCIgLz4iLCBpLGNvbE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeG1sICs9ICI8L3RhYmxlQ29sdW1ucz4iOworICAgICAgICAgICAgeG1sICs9ICI8dGFibGVTdHlsZUluZm8gbmFtZT1cIlRhYmxlU3R5bGVNZWRpdW05XCIgc2hvd0ZpcnN0Q29sdW1uPVwiMFwiIHNob3dMYXN0Q29sdW1uPVwiMFwiIHNob3dSb3dTdHJpcGVzPVwiMVwiIHNob3dDb2x1bW5TdHJpcGVzPVwiMFwiIC8+ICI7CisgICAgICAgICAgICB4bWwgKz0gIjwvdGFibGU+IjsKKworICAgICAgICAgICAgcmV0dXJuIHhtbDsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBjbGVhbkRpc3BsYXlOYW1lKHN0cmluZyBuYW1lKSAKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LlJlcGxhY2UobmFtZSwgQCJbXlx3XC4tX10iLCAiXyIpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkYXRhIHJlcHJlc2VudGluZyB0aGUgdGFibGUgaW4gdGhlIHBhY2thZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBYbWxEb2N1bWVudCBUYWJsZVhtbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBhY2thZ2UgaW50ZXJuYWwgVVJJIHRvIHRoZSBUYWJsZSBYbWwgRG9jdW1lbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBVcmkgVGFibGVVcmkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBSZWxhdGlvbnNoaXBJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIElEX1BBVEggPSAiQGlkIjsKKyAgICAgICAgaW50ZXJuYWwgaW50IElkIAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChJRF9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoSURfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIE5BTUVfUEFUSCA9ICJAbmFtZSI7CisgICAgICAgIGNvbnN0IHN0cmluZyBESVNQTEFZX05BTUVfUEFUSCA9ICJAZGlzcGxheU5hbWUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb2JqZWN0IGluIEV4Y2VsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhOQU1FX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKFdvcmtTaGVldC5Xb3JrYm9vay5FeGlzdHNUYWJsZU5hbWUodmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIGlzIG5vdCB1bmlxdWUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmluZyBwcmV2TmFtZSA9IE5hbWU7CisgICAgICAgICAgICAgICAgaWYgKFdvcmtTaGVldC5UYWJsZXMuX3RhYmxlTmFtZXMuQ29udGFpbnNLZXkocHJldk5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl4PVdvcmtTaGVldC5UYWJsZXMuX3RhYmxlTmFtZXNbcHJldk5hbWVdOworICAgICAgICAgICAgICAgICAgICBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLlJlbW92ZShwcmV2TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtTaGVldC5UYWJsZXMuX3RhYmxlTmFtZXMuQWRkKHZhbHVlLGl4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhOQU1FX1BBVEgsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKERJU1BMQVlfTkFNRV9QQVRILCBjbGVhbkRpc3BsYXlOYW1lKHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHdvcmtzaGVldCBvZiB0aGUgdGFibGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsV29ya3NoZWV0IFdvcmtTaGVldAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEV4Y2VsQWRkcmVzc0Jhc2UgX2FkZHJlc3MgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgYWRkcmVzcyBvZiB0aGUgdGFibGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2UgQWRkcmVzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcm5hbCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByZWYiLHZhbHVlLkFkZHJlc3MpOworICAgICAgICAgICAgICAgIFdyaXRlQXV0b0ZpbHRlcihTaG93VG90YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludGVybmFsIEV4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uIF9jb2xzID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29sbGVjdGlvbiBvZiB0aGUgY29sdW1ucyBpbiB0aGUgdGFibGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uIENvbHVtbnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoX2NvbHM9PW51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY29scyA9IG5ldyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFRhYmxlU3R5bGVzIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuTWVkaXVtNjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHRhYmxlIHN0eWxlLiBJZiB0aGlzIHByb3BlcnR5IGlzIGN1c29tLCB0aGUgc3R5bGUgZnJvbSB0aGUgU3R5bGVOYW1lIHByb3BlcnkgaXMgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRhYmxlU3R5bGVzIFRhYmxlU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90YWJsZVN0eWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RhYmxlU3R5bGU9dmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IFRhYmxlU3R5bGVzLkN1c3RvbSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU1RZTEVOQU1FX1BBVEgsICJUYWJsZVN0eWxlIiArIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgSEVBREVSUk9XQ09VTlRfUEFUSCA9ICJAaGVhZGVyUm93Q291bnQiOworICAgICAgICBjb25zdCBzdHJpbmcgQVVUT0ZJTFRFUl9QQVRIID0gImQ6YXV0b0ZpbHRlci9AcmVmIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGhlYWRlciByb3cgaXMgdmlzaWJsZSBvciBub3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd0hlYWRlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChIRUFERVJST1dDT1VOVF9QQVRIKSE9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChBZGRyZXNzLl90b1JvdyAtIEFkZHJlc3MuX2Zyb21Sb3cgPCAwICYmIHZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MuX3RvUm93IC0gQWRkcmVzcy5fZnJvbVJvdyA9PSAxICYmIHZhbHVlICYmIFNob3dUb3RhbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJDYW50IHNldCBTaG93SGVhZGVyLXByb3BlcnR5LiBUYWJsZSBoYXMgdG9vIGZldyByb3dzIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShIRUFERVJST1dDT1VOVF9QQVRIKTsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVBdXRvRmlsdGVyKFNob3dUb3RhbCk7CisgICAgICAgICAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBDb2x1bW5zLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXIgdiA9IFdvcmtTaGVldC5HZXRWYWx1ZTxzdHJpbmc+KEFkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX2Zyb21Db2wgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSB8fCB2ICE9IF9jb2xzW2ldLk5hbWUpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIF9jb2xzW2ldLk5hbWUgPSB2OworICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEhFQURFUlJPV0NPVU5UX1BBVEgsICIwIik7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoQVVUT0ZJTFRFUl9QQVRIKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzQmFzZSBBdXRvRmlsdGVyQWRkcmVzcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgYT1HZXRYbWxOb2RlU3RyaW5nKEFVVE9GSUxURVJfUEFUSCk7CisgICAgICAgICAgICAgICAgaWYgKGEgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVBdXRvRmlsdGVyKGJvb2wgc2hvd1RvdGFsKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYXV0b2ZpbHRlckFkZHJlc3M7CisgICAgICAgICAgICBpZiAoU2hvd0hlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1RvdGFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0b2ZpbHRlckFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoQWRkcmVzcy5fZnJvbVJvdywgQWRkcmVzcy5fZnJvbUNvbCwgQWRkcmVzcy5fdG9Sb3cgLSAxLCBBZGRyZXNzLl90b0NvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dG9maWx0ZXJBZGRyZXNzID0gQWRkcmVzcy5BZGRyZXNzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEFVVE9GSUxURVJfUEFUSCwgYXV0b2ZpbHRlckFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBoZWFkZXIgcm93IGhhcyBhbiBhdXRvZmlsdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dGaWx0ZXIgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2hvd0hlYWRlciAmJiBBdXRvRmlsdGVyQWRkcmVzcyAhPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFNob3dIZWFkZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlQXV0b0ZpbHRlcihTaG93VG90YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoQVVUT0ZJTFRFUl9QQVRIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkZpbHRlciBjYW4gb25seSBiZSBhcHBsaWVkIHdoZW4gU2hvd0hlYWRlciBpcyBzZXQgdG8gdHJ1ZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFRPVEFMU1JPV0NPVU5UX1BBVEggPSAiQHRvdGFsc1Jvd0NvdW50IjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIFRPVEFMU1JPV1NIT1dOX1BBVEggPSAiQHRvdGFsc1Jvd1Nob3duIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIHRvdGFsIHJvdyBpcyB2aXNpYmxlIG9yIG5vdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaG93VG90YWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoVE9UQUxTUk9XQ09VTlRfUEFUSCkgPT0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBTaG93VG90YWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3M9bmV3IEV4Y2VsQWRkcmVzcyhXb3JrU2hlZXQuTmFtZSwgRXhjZWxBZGRyZXNzQmFzZS5HZXRBZGRyZXNzKEFkZHJlc3MuU3RhcnQuUm93LCBBZGRyZXNzLlN0YXJ0LkNvbHVtbiwgQWRkcmVzcy5FbmQuUm93KzEsIEFkZHJlc3MuRW5kLkNvbHVtbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoV29ya1NoZWV0Lk5hbWUsIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0QWRkcmVzcyhBZGRyZXNzLlN0YXJ0LlJvdywgQWRkcmVzcy5TdGFydC5Db2x1bW4sIEFkZHJlc3MuRW5kLlJvdyAtIDEsIEFkZHJlc3MuRW5kLkNvbHVtbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByZWYiLCBBZGRyZXNzLkFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVE9UQUxTUk9XQ09VTlRfUEFUSCwgIjEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoVE9UQUxTUk9XQ09VTlRfUEFUSCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgV3JpdGVBdXRvRmlsdGVyKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNUWUxFTkFNRV9QQVRIID0gImQ6dGFibGVTdHlsZUluZm8vQG5hbWUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgc3R5bGUgbmFtZSBmb3IgY3VzdHVtIHN0eWxlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhTVFlMRU5BTUVfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiVGFibGVTdHlsZSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gKFRhYmxlU3R5bGVzKUVudW0uUGFyc2UodHlwZW9mKFRhYmxlU3R5bGVzKSwgdmFsdWUuU3Vic3RyaW5nKDEwLHZhbHVlLkxlbmd0aC0xMCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuQ3VzdG9tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJOb25lIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3RhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5DdXN0b207CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU1RZTEVOQU1FX1BBVEgsdmFsdWUsdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNIT1dGSVJTVENPTFVNTl9QQVRIID0gImQ6dGFibGVTdHlsZUluZm8vQHNob3dGaXJzdENvbHVtbiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERpc3BsYXkgc3BlY2lhbCBmb3JtYXR0aW5nIGZvciB0aGUgZmlyc3Qgcm93CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dGaXJzdENvbHVtbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woU0hPV0ZJUlNUQ09MVU1OX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woU0hPV0ZJUlNUQ09MVU1OX1BBVEgsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgICAgICB9ICAgCisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNIT1dMQVNUQ09MVU1OX1BBVEggPSAiZDp0YWJsZVN0eWxlSW5mby9Ac2hvd0xhc3RDb2x1bW4iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEaXNwbGF5IHNwZWNpYWwgZm9ybWF0dGluZyBmb3IgdGhlIGxhc3Qgcm93CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dMYXN0Q29sdW1uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChTSE9XTEFTVENPTFVNTl9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKFNIT1dMQVNUQ09MVU1OX1BBVEgsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNIT1dST1dTVFJJUEVTX1BBVEggPSAiZDp0YWJsZVN0eWxlSW5mby9Ac2hvd1Jvd1N0cmlwZXMiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEaXNwbGF5IGJhbmRlZCByb3dzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dSb3dTdHJpcGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChTSE9XUk9XU1RSSVBFU19QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKFNIT1dST1dTVFJJUEVTX1BBVEgsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIFNIT1dDT0xVTU5TVFJJUEVTX1BBVEggPSAiZDp0YWJsZVN0eWxlSW5mby9Ac2hvd0NvbHVtblN0cmlwZXMiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEaXNwbGF5IGJhbmRlZCBjb2x1bW5zCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dDb2x1bW5TdHJpcGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChTSE9XQ09MVU1OU1RSSVBFU19QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKFNIT1dDT0xVTU5TVFJJUEVTX1BBVEgsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJpbmcgVE9UQUxTUk9XQ0VMTFNUWUxFX1BBVEggPSAiQHRvdGFsc1Jvd0NlbGxTdHlsZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5hbWVkIHN0eWxlIHVzZWQgZm9yIHRoZSB0b3RhbCByb3cKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBUb3RhbHNSb3dDZWxsU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoVE9UQUxTUk9XQ0VMTFNUWUxFX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFdvcmtTaGVldC5Xb3JrYm9vay5TdHlsZXMuTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJRCh2YWx1ZSkgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTmFtZWQgc3R5bGUgezB9IGRvZXMgbm90IGV4aXN0LiIsIHZhbHVlKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIFRPVEFMU1JPV0NFTExTVFlMRV9QQVRILCB2YWx1ZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoU2hvd1RvdGFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV29ya1NoZWV0LkNlbGxzW0FkZHJlc3MuX3RvUm93LCBBZGRyZXNzLl9mcm9tQ29sLCBBZGRyZXNzLl90b1JvdywgQWRkcmVzcy5fdG9Db2xdLlN0eWxlTmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgREFUQUNFTExTVFlMRV9QQVRIID0gIkBkYXRhQ2VsbFN0eWxlIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTmFtZWQgc3R5bGUgdXNlZCBmb3IgdGhlIGRhdGEgY2VsbHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBEYXRhQ2VsbFN0eWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhEQVRBQ0VMTFNUWUxFX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFdvcmtTaGVldC5Xb3JrYm9vay5TdHlsZXMuTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJRCh2YWx1ZSkgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTmFtZWQgc3R5bGUgezB9IGRvZXMgbm90IGV4aXN0LiIsIHZhbHVlKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIERBVEFDRUxMU1RZTEVfUEFUSCwgdmFsdWUsIHRydWUpOworCisgICAgICAgICAgICAgICAgaW50IGZyb21Sb3cgPSBBZGRyZXNzLl9mcm9tUm93ICsgKFNob3dIZWFkZXIgPyAxIDogMCksCisgICAgICAgICAgICAgICAgICAgIHRvUm93ID0gQWRkcmVzcy5fdG9Sb3cgLSAoU2hvd1RvdGFsID8gMSA6IDApOworCisgICAgICAgICAgICAgICAgaWYgKGZyb21Sb3cgPCB0b1JvdykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdvcmtTaGVldC5DZWxsc1tmcm9tUm93LCBBZGRyZXNzLl9mcm9tQ29sLCB0b1JvdywgQWRkcmVzcy5fdG9Db2xdLlN0eWxlTmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgSEVBREVSUk9XQ0VMTFNUWUxFX1BBVEggPSAiQGhlYWRlclJvd0NlbGxTdHlsZSI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5hbWVkIHN0eWxlIHVzZWQgZm9yIHRoZSBoZWFkZXIgcm93CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSGVhZGVyUm93Q2VsbFN0eWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKEhFQURFUlJPV0NFTExTVFlMRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQodmFsdWUpIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5hbWVkIHN0eWxlIHswfSBkb2VzIG5vdCBleGlzdC4iLCB2YWx1ZSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBIRUFERVJST1dDRUxMU1RZTEVfUEFUSCwgdmFsdWUsIHRydWUpOworCisgICAgICAgICAgICAgICAgaWYgKFNob3dIZWFkZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXb3JrU2hlZXQuQ2VsbHNbQWRkcmVzcy5fZnJvbVJvdywgQWRkcmVzcy5fZnJvbUNvbCwgQWRkcmVzcy5fZnJvbVJvdywgQWRkcmVzcy5fdG9Db2xdLlN0eWxlTmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKEV4Y2VsVGFibGUgeCwgRXhjZWxUYWJsZSB5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4geC5Xb3JrU2hlZXQgPT0geS5Xb3JrU2hlZXQgJiYgeC5JZCA9PSB5LklkICYmIHguVGFibGVYbWwuT3V0ZXJYbWwgPT0geS5UYWJsZVhtbC5PdXRlclhtbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgR2V0SGFzaENvZGUoRXhjZWxUYWJsZSBvYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvYmouVGFibGVYbWwuT3V0ZXJYbWwuR2V0SGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sbGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRmMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2xsZWN0aW9uLmNzCkBAIC0wLDAgKzEsMjQ4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkzMC1BVUctMjAxMAorICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgdGFibGUgb2JqZWN0cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVGFibGVDb2xsZWN0aW9uIDogSUVudW1lcmFibGU8RXhjZWxUYWJsZT4KKyAgICB7CisgICAgICAgIExpc3Q8RXhjZWxUYWJsZT4gX3RhYmxlcyA9IG5ldyBMaXN0PEV4Y2VsVGFibGU+KCk7CisgICAgICAgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IF90YWJsZU5hbWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKTsKKyAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dzOyAgICAgICAgCisgICAgICAgIGludGVybmFsIEV4Y2VsVGFibGVDb2xsZWN0aW9uKEV4Y2VsV29ya3NoZWV0IHdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGNrID0gd3MuX3BhY2thZ2UuUGFja2FnZTsKKyAgICAgICAgICAgIF93cyA9IHdzOworICAgICAgICAgICAgZm9yZWFjaChYbWxFbGVtZW50IG5vZGUgaW4gd3MuV29ya3NoZWV0WG1sLlNlbGVjdE5vZGVzKCIvL2Q6dGFibGVQYXJ0cy9kOnRhYmxlUGFydCIsIHdzLk5hbWVTcGFjZU1hbmFnZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByZWwgPSB3cy5QYXJ0LkdldFJlbGF0aW9uc2hpcChub2RlLkdldEF0dHJpYnV0ZSgiaWQiLEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKSk7CisgICAgICAgICAgICAgICAgdmFyIHRibCA9IG5ldyBFeGNlbFRhYmxlKHJlbCwgd3MpOworICAgICAgICAgICAgICAgIF90YWJsZU5hbWVzLkFkZCh0YmwuTmFtZSwgX3RhYmxlcy5Db3VudCk7CisgICAgICAgICAgICAgICAgX3RhYmxlcy5BZGQodGJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIEV4Y2VsVGFibGUgQWRkKEV4Y2VsVGFibGUgdGJsKQorICAgICAgICB7CisgICAgICAgICAgICBfdGFibGVzLkFkZCh0YmwpOworICAgICAgICAgICAgX3RhYmxlTmFtZXMuQWRkKHRibC5OYW1lLCBfdGFibGVzLkNvdW50IC0gMSk7CisgICAgICAgICAgICBpZiAodGJsLklkID49IF93cy5Xb3JrYm9vay5fbmV4dFRhYmxlSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3dzLldvcmtib29rLl9uZXh0VGFibGVJRCA9IHRibC5JZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGJsOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlIGEgdGFibGUgb24gdGhlIHN1cHBsaWVkIHJhbmdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUmFuZ2UiPlRoZSByYW5nZSBhZGRyZXNzIGluY2x1ZGluZyBoZWFkZXIgYW5kIHRvdGFsIHJvdzwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhYmxlLiBNdXN0IGJlIHVuaXF1ZSA8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIHRhYmxlIG9iamVjdDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsVGFibGUgQWRkKEV4Y2VsQWRkcmVzc0Jhc2UgUmFuZ2UsIHN0cmluZyBOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUmFuZ2UuV29ya1NoZWV0ICE9IG51bGwgJiYgUmFuZ2UuV29ya1NoZWV0ICE9IF93cy5OYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUmFuZ2UgZG9lcyBub3QgYmVsb25nIHRvIHdvcmtzaGVldCIsICJSYW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmFtZSA9IEdldE5ld1RhYmxlTmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX3dzLldvcmtib29rLkV4aXN0c1RhYmxlTmFtZShOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUYWJsZW5hbWUgaXMgbm90IHVuaXF1ZSIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmFsaWRhdGVUYWJsZU5hbWUoTmFtZSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIF90YWJsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHQuQWRkcmVzcy5Db2xsaWRlKFJhbmdlKSAhPSBFeGNlbEFkZHJlc3NCYXNlLmVBZGRyZXNzQ29sbGl0aW9uLk5vKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJUYWJsZSByYW5nZSBjb2xsaWRlcyB3aXRoIHRhYmxlIHswfSIsIHQuTmFtZSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWRkKG5ldyBFeGNlbFRhYmxlKF93cywgUmFuZ2UsIE5hbWUsIF93cy5Xb3JrYm9vay5fbmV4dFRhYmxlSUQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZVRhYmxlTmFtZShzdHJpbmcgTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KE5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIGlzIG51bGwgb3IgZW1wdHkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hhciBmaXJzdExldHRlck9mTmFtZSA9IE5hbWVbMF07CisgICAgICAgICAgICBpZiAoQ2hhci5Jc0xldHRlcihmaXJzdExldHRlck9mTmFtZSkgPT0gZmFsc2UgJiYgZmlyc3RMZXR0ZXJPZk5hbWUgIT0gJ18nICYmIGZpcnN0TGV0dGVyT2ZOYW1lICE9ICdcXCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUYWJsZW5hbWUgc3RhcnQgd2l0aCBpbnZhbGlkIGNoYXJhY3RlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTmFtZS5Db250YWlucygiICIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIGhhcyBzcGFjZXMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlKGludCBJbmRleCwgYm9vbCBDbGVhclJhbmdlID0gZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZSh0aGlzW0luZGV4XSwgQ2xlYXJSYW5nZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGUoc3RyaW5nIE5hbWUsIGJvb2wgQ2xlYXJSYW5nZSA9IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpc1tOYW1lXSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RhbnQgdGFibGUgezB9IGluIHNoZWV0IHsxfS4iLCBOYW1lLCBfd3MuTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVsZXRlKHRoaXNbTmFtZV0sIENsZWFyUmFuZ2UpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGUoRXhjZWxUYWJsZSBUYWJsZSwgYm9vbCBDbGVhclJhbmdlID0gZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5fdGFibGVzLkNvbnRhaW5zKFRhYmxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJUYWJsZSIsIFN0cmluZy5Gb3JtYXQoIlRhYmxlIHswfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGNvbGxlY3Rpb24iLCBUYWJsZS5OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IF93cy5DZWxsc1tUYWJsZS5BZGRyZXNzLkFkZHJlc3NdOworICAgICAgICAgICAgICAgIF90YWJsZU5hbWVzLlJlbW92ZShUYWJsZS5OYW1lKTsKKyAgICAgICAgICAgICAgICBfdGFibGVzLlJlbW92ZShUYWJsZSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNoZWV0IGluIFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRhYmxlIGluIHNoZWV0LlRhYmxlcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlLklkID4gVGFibGUuSWQpIHRhYmxlLklkLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGFibGUuV29ya1NoZWV0Lldvcmtib29rLl9uZXh0VGFibGVJRC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQ2xlYXJSYW5nZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJhbmdlLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0TmV3VGFibGVOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAiVGFibGUxIjsKKyAgICAgICAgICAgIGludCBpID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChfd3MuV29ya2Jvb2suRXhpc3RzVGFibGVOYW1lKG5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWUgPSBzdHJpbmcuRm9ybWF0KCJUYWJsZXswfSIsIGkrKyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RhYmxlcy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXQgdGhlIHRhYmxlIG9iamVjdCBmcm9tIGEgcmFuZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUmFuZ2UiPlRoZSByYW5nZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdGFibGUuIE51bGwgaWYgbm8gcmFuZ2UgbWF0Y2hlczwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsVGFibGUgR2V0RnJvbVJhbmdlKEV4Y2VsUmFuZ2VCYXNlIFJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIFJhbmdlLldvcmtzaGVldC5UYWJsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRibC5BZGRyZXNzLl9hZGRyZXNzID09IFJhbmdlLl9hZGRyZXNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRibDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdGFibGUgSW5kZXguIEJhc2UgMC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsVGFibGUgdGhpc1tpbnQgSW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDAgfHwgSW5kZXggPj0gX3RhYmxlcy5Db3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJUYWJsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfdGFibGVzW0luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRleGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhYmxlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB0YWJsZS4gTnVsbCBpZiB0aGUgdGFibGUgbmFtZSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb248L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlIHRoaXNbc3RyaW5nIE5hbWVdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdGFibGVOYW1lcy5Db250YWluc0tleShOYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGFibGVzW190YWJsZU5hbWVzW05hbWVdXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFRhYmxlPiBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF90YWJsZXMuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF90YWJsZXMuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2x1bW4uY3MgYi9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZUNvbHVtbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzQ1NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2x1bW4uY3MKQEAgLTAsMCArMSwyNDAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTMwLUFVRy0yMDEwCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBCdWlsZC1pbiB0YWJsZSByb3cgZnVuY3Rpb25zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBSb3dGdW5jdGlvbnMKKyAgICB7CisgICAgICAgIEF2ZXJhZ2UsICAgICAgICAKKyAgICAgICAgQ291bnQsCisgICAgICAgIENvdW50TnVtcywKKyAgICAgICAgQ3VzdG9tLAorICAgICAgICBNYXgsCisgICAgICAgIE1pbiwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgU3RkRGV2LAorICAgICAgICBTdW0sCisgICAgICAgIFZhcgorICAgIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSB0YWJsZSBjb2x1bW4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFRhYmxlQ29sdW1uIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbFRhYmxlIF90Ymw7CisgICAgICAgIGludGVybmFsIEV4Y2VsVGFibGVDb2x1bW4oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFRhYmxlIHRibCwgaW50IHBvcykgOgorICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3RibCA9IHRibDsKKyAgICAgICAgICAgIFBvc2l0aW9uID0gcG9zOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2x1bW4gaWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBJZCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBpZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGlkIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBQb3NpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgY29sdW1uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbj1HZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOworICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdGJsLlNob3dIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyhfdGJsLldvcmtTaGVldC5HZXRWYWx1ZTxzdHJpbmc+KF90YmwuQWRkcmVzcy5fZnJvbVJvdywgX3RibC5BZGRyZXNzLl9mcm9tQ29sICsgdGhpcy5Qb3NpdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICJDb2x1bW4iICsgKHRoaXMuUG9zaXRpb24rMSkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ID0gQ29udmVydFV0aWwuRXhjZWxFbmNvZGVTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdik7CisgICAgICAgICAgICAgICAgaWYgKF90YmwuU2hvd0hlYWRlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90YmwuV29ya1NoZWV0LlNldFZhbHVlKF90YmwuQWRkcmVzcy5fZnJvbVJvdywgX3RibC5BZGRyZXNzLl9mcm9tQ29sICsgdGhpcy5Qb3NpdGlvbiwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfdGJsLldvcmtTaGVldC5TZXRUYWJsZVRvdGFsRnVuY3Rpb24oX3RibCwgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBzdHJpbmcgdGV4dCBpbiB0aGUgdG90YWwgcm93CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVG90YWxzUm93TGFiZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dMYWJlbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0xhYmVsIiwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEJ1aWxkLWluIHRvdGFsIHJvdyBmdW5jdGlvbnMuCisgICAgICAgIC8vLyBUbyBzZXQgYSBjdXN0b20gVG90YWwgcm93IGZvcm11bGEgdXNlIHRoZSBUb3RhbHNSb3dGb3JtdWxhIHByb3BlcnR5CisgICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUb3RhbHNSb3dGb3JtdWxhIi8+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBSb3dGdW5jdGlvbnMgVG90YWxzUm93RnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEdldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dGdW5jdGlvbiIpID09ICIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJvd0Z1bmN0aW9ucy5Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFJvd0Z1bmN0aW9ucylFbnVtLlBhcnNlKHR5cGVvZihSb3dGdW5jdGlvbnMpLCBHZXRYbWxOb2RlU3RyaW5nKCJAdG90YWxzUm93RnVuY3Rpb24iKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFJvd0Z1bmN0aW9ucy5DdXN0b20pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgRXhjZXB0aW9uKCJVc2UgdGhlIFRvdGFsc1Jvd0Zvcm11bGEtcHJvcGVydHkgdG8gc2V0IGEgY3VzdG9tIHRhYmxlIGZvcm11bGEiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmluZyBzID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzID0gcy5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHMuU3Vic3RyaW5nKDEsIHMuTGVuZ3RoIC0gMSk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0Z1bmN0aW9uIiwgcyk7CisgICAgICAgICAgICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VGFibGVUb3RhbEZ1bmN0aW9uKF90YmwsIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBUT1RBTFNST1dGT1JNVUxBX1BBVEggPSAiZDp0b3RhbHNSb3dGb3JtdWxhIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2V0cyBhIGN1c3RvbSBUb3RhbHMgcm93IEZvcm11bGEuCisgICAgICAgIC8vLyBCZSBjYXJlZnVsbCB3aXRoIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgbm90IHZhbGlkYXRlZC4gCisgICAgICAgIC8vLyA8ZXhhbXBsZT4KKyAgICAgICAgLy8vIHRibC5Db2x1bW5zWzldLlRvdGFsc1Jvd0Zvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVU0oW3swfV0pIix0YmwuQ29sdW1uc1s5XS5OYW1lKTsKKyAgICAgICAgLy8vIDwvZXhhbXBsZT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBUb3RhbHNSb3dGb3JtdWxhCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFRPVEFMU1JPV0ZPUk1VTEFfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiPSIpKSB2YWx1ZSA9IHZhbHVlLlN1YnN0cmluZygxLCB2YWx1ZS5MZW5ndGggLSAxKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdG90YWxzUm93RnVuY3Rpb24iLCAiY3VzdG9tIik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVE9UQUxTUk9XRk9STVVMQV9QQVRILCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VGFibGVUb3RhbEZ1bmN0aW9uKF90YmwsIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBEQVRBQ0VMTFNUWUxFX1BBVEggPSAiQGRhdGFDZWxsU3R5bGUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZWQgc3R5bGUgZm9yIGRhdGFjZWxscyBpbiB0aGUgY29sdW1uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRGF0YUNlbGxTdHlsZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoREFUQUNFTExTVFlMRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKF90YmwuV29ya1NoZWV0Lldvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlcy5GaW5kSW5kZXhCeUlEKHZhbHVlKTwwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJOYW1lZCBzdHlsZSB7MH0gZG9lcyBub3QgZXhpc3QuIix2YWx1ZSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBEQVRBQ0VMTFNUWUxFX1BBVEgsIHZhbHVlLHRydWUpOworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IGZyb21Sb3c9X3RibC5BZGRyZXNzLl9mcm9tUm93ICsgKF90YmwuU2hvd0hlYWRlcj8xOjApLAorICAgICAgICAgICAgICAgICAgICB0b1Jvdz1fdGJsLkFkZHJlc3MuX3RvUm93IC0gKF90YmwuU2hvd1RvdGFsPzE6MCksCisgICAgICAgICAgICAgICAgICAgIGNvbD1fdGJsLkFkZHJlc3MuX2Zyb21Db2wrUG9zaXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoZnJvbVJvdyA8PSB0b1JvdykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90YmwuV29ya1NoZWV0LkNlbGxzW2Zyb21Sb3csIGNvbCwgdG9Sb3csIGNvbF0uU3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgIAkJY29uc3Qgc3RyaW5nIENBTENVTEFURURDT0xVTU5GT1JNVUxBX1BBVEggPSAiZDpjYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSI7CisgCQkvLy8gPHN1bW1hcnk+CisgCQkvLy8gU2V0cyBhIGNhbGN1bGF0ZWQgY29sdW1uIEZvcm11bGEuCisgCQkvLy8gQmUgY2FyZWZ1bGwgd2l0aCB0aGlzIHByb3BlcnR5IHNpbmNlIGl0IGlzIG5vdCB2YWxpZGF0ZWQuIAorIAkJLy8vIDxleGFtcGxlPgorIAkJLy8vIHRibC5Db2x1bW5zWzldLkNhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiU1VNKE15RGF0YVRhYmxlW1sjVGhpcyBSb3ddLFt7MH1dXSkiLHRibC5Db2x1bW5zWzldLk5hbWUpOworIAkJLy8vIDwvZXhhbXBsZT4KKyAJCS8vLyA8L3N1bW1hcnk+CisgCQlwdWJsaWMgc3RyaW5nIENhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhCisgCQl7CisgCQkJZ2V0CisgCQkJeworIAkJCQlyZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhDQUxDVUxBVEVEQ09MVU1ORk9STVVMQV9QQVRIKTsKKyAJCQl9CisgCQkJc2V0CisgCQkJeworIAkJCQlpZiAodmFsdWUuU3RhcnRzV2l0aCgiPSIpKSB2YWx1ZSA9IHZhbHVlLlN1YnN0cmluZygxLCB2YWx1ZS5MZW5ndGggLSAxKTsKKyAJCQkJU2V0WG1sTm9kZVN0cmluZyhDQUxDVUxBVEVEQ09MVU1ORk9STVVMQV9QQVRILCB2YWx1ZSk7CisgCQkJfQorIAkJfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uLmNzIGIvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNGQyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwxMzUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTMwLUFVRy0yMDEwCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgY29sbGVjdGlvbiBvZiB0YWJsZSBjb2x1bW5zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbFRhYmxlQ29sdW1uPgorICAgIHsKKyAgICAgICAgTGlzdDxFeGNlbFRhYmxlQ29sdW1uPiBfY29scyA9IG5ldyBMaXN0PEV4Y2VsVGFibGVDb2x1bW4+KCk7CisgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IF9jb2xOYW1lcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7CisgICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbihFeGNlbFRhYmxlIHRhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBUYWJsZSA9IHRhYmxlOworICAgICAgICAgICAgZm9yZWFjaChYbWxOb2RlIG5vZGUgaW4gdGFibGUuVGFibGVYbWwuU2VsZWN0Tm9kZXMoIi8vZDp0YWJsZS9kOnRhYmxlQ29sdW1ucy9kOnRhYmxlQ29sdW1uIix0YWJsZS5OYW1lU3BhY2VNYW5hZ2VyKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX2NvbHMuQWRkKG5ldyBFeGNlbFRhYmxlQ29sdW1uKHRhYmxlLk5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsIHRhYmxlLCBfY29scy5Db3VudCkpOworICAgICAgICAgICAgICAgIF9jb2xOYW1lcy5BZGQoX2NvbHNbX2NvbHMuQ291bnQgLSAxXS5OYW1lLCBfY29scy5Db3VudCAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSB0YWJsZSBvYmplY3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVGFibGUgVGFibGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xzLkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjb2x1bW4gSW5kZXguIEJhc2UgMC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsVGFibGVDb2x1bW4gdGhpc1tpbnQgSW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDAgfHwgSW5kZXggPj0gX2NvbHMuQ291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xzW0luZGV4XSBhcyBFeGNlbFRhYmxlQ29sdW1uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGV4ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgdGFibGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIHRhYmxlIGNvbHVtbi4gTnVsbCBpZiB0aGUgdGFibGUgbmFtZSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb248L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uIHRoaXNbc3RyaW5nIE5hbWVdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY29sTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbHNbX2NvbE5hbWVzW05hbWVdXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8RXhjZWxUYWJsZUNvbHVtbj4gSUVudW1lcmFibGU8RXhjZWxUYWJsZUNvbHVtbj4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfY29scy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NvbHMuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBHZXRVbmlxdWVOYW1lKHN0cmluZyBuYW1lKQorICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoX2NvbE5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBuZXdOYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICB2YXIgaSA9IDI7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuYW1lKyhpKyspLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoX2NvbE5hbWVzLkNvbnRhaW5zS2V5KG5ld05hbWUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbi5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4MTJlYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24uY3MKQEAgLTAsMCArMSwyOTQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGF0YS5TcWxDbGllbnQ7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlCit7CisgICAgcHVibGljIGVudW0gZVNvdXJjZVR5cGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBjYWNoZSBjb250YWlucyBkYXRhIHRoYXQgY29uc29saWRhdGVzIHJhbmdlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgQ29uc29saWRhdGlvbiwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGNhY2hlIGNvbnRhaW5zIGRhdGEgZnJvbSBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRXh0ZXJuYWwsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBjYWNoZSBjb250YWlucyBhIHNjZW5hcmlvIHN1bW1hcnkgcmVwb3J0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFNjZW5hcmlvLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgY29udGFpbnMgd29ya3NoZWV0IGRhdGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgV29ya3NoZWV0CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ2FjaGUgZGVmaW5pdGlvbi4gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBzb3VyY2UgZGF0YS4gTm90ZSB0aGF0IG9uZSBjYWNoZSBkZWZpbml0aW9uIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBtYW55IHBpdm90IHRhYmxlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIEV4Y2VsUGl2b3RUYWJsZSBwaXZvdFRhYmxlKSA6CisgICAgICAgICAgICBiYXNlKG5zLCBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgciBpbiBwaXZvdFRhYmxlLlBhcnQuR2V0UmVsYXRpb25zaGlwc0J5VHlwZShFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvcGl2b3RDYWNoZURlZmluaXRpb24iKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgPSByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2FjaGVEZWZpbml0aW9uVXJpID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKFJlbGF0aW9uc2hpcC5Tb3VyY2VVcmksIFJlbGF0aW9uc2hpcC5UYXJnZXRVcmkpOworCisgICAgICAgICAgICB2YXIgcGNrID0gcGl2b3RUYWJsZS5Xb3JrU2hlZXQuX3BhY2thZ2UuUGFja2FnZTsKKyAgICAgICAgICAgIFBhcnQgPSBwY2suR2V0UGFydChDYWNoZURlZmluaXRpb25VcmkpOworICAgICAgICAgICAgQ2FjaGVEZWZpbml0aW9uWG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBMb2FkWG1sU2FmZShDYWNoZURlZmluaXRpb25YbWwsIFBhcnQuR2V0U3RyZWFtKCkpOworCisgICAgICAgICAgICBUb3BOb2RlID0gQ2FjaGVEZWZpbml0aW9uWG1sLkRvY3VtZW50RWxlbWVudDsKKyAgICAgICAgICAgIFBpdm90VGFibGUgPSBwaXZvdFRhYmxlOworICAgICAgICAgICAgaWYgKENhY2hlU291cmNlID09IGVTb3VyY2VUeXBlLldvcmtzaGVldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0TmFtZSA9IEdldFhtbE5vZGVTdHJpbmcoX3NvdXJjZVdvcmtzaGVldFBhdGgpOworICAgICAgICAgICAgICAgIGlmIChwaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFueSh0ID0+IHQuTmFtZSA9PSB3b3Jrc2hlZXROYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IHBpdm90VGFibGUuV29ya1NoZWV0Lldvcmtib29rLldvcmtzaGVldHNbd29ya3NoZWV0TmFtZV0uQ2VsbHNbR2V0WG1sTm9kZVN0cmluZyhfc291cmNlQWRkcmVzc1BhdGgpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBFeGNlbFBpdm90VGFibGUgcGl2b3RUYWJsZSwgRXhjZWxSYW5nZUJhc2Ugc291cmNlQWRkcmVzcywgaW50IHRibElkKSA6CisgICAgICAgICAgICBiYXNlKG5zLCBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBQaXZvdFRhYmxlID0gcGl2b3RUYWJsZTsKKworICAgICAgICAgICAgdmFyIHBjayA9IHBpdm90VGFibGUuV29ya1NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQ2FjaGVEZWZpbml0aW9uCisgICAgICAgICAgICBDYWNoZURlZmluaXRpb25YbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIExvYWRYbWxTYWZlKENhY2hlRGVmaW5pdGlvblhtbCwgR2V0U3RhcnRYbWwoc291cmNlQWRkcmVzcyksIEVuY29kaW5nLlVURjgpOworICAgICAgICAgICAgQ2FjaGVEZWZpbml0aW9uVXJpID0gR2V0TmV3VXJpKHBjaywgIi94bC9waXZvdENhY2hlL3Bpdm90Q2FjaGVEZWZpbml0aW9uezB9LnhtbCIsIHRibElkKTsgCisgICAgICAgICAgICBQYXJ0ID0gcGNrLkNyZWF0ZVBhcnQoQ2FjaGVEZWZpbml0aW9uVXJpLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUGl2b3RDYWNoZURlZmluaXRpb24pOworICAgICAgICAgICAgVG9wTm9kZSA9IENhY2hlRGVmaW5pdGlvblhtbC5Eb2N1bWVudEVsZW1lbnQ7CisKKyAgICAgICAgICAgIC8vQ2FjaGVSZWNvcmQuIENyZWF0ZSBhbiBlbXB0eSBvbmUuCisgICAgICAgICAgICBDYWNoZVJlY29yZFVyaSA9IEdldE5ld1VyaShwY2ssICIveGwvcGl2b3RDYWNoZS9waXZvdENhY2hlUmVjb3Jkc3swfS54bWwiLCB0YmxJZCk7IAorICAgICAgICAgICAgdmFyIGNhY2hlUmVjb3JkID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBjYWNoZVJlY29yZC5Mb2FkWG1sKCI8cGl2b3RDYWNoZVJlY29yZHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiIGNvdW50PVwiMFwiIC8+Iik7CisgICAgICAgICAgICB2YXIgcmVjUGFydCA9IHBjay5DcmVhdGVQYXJ0KENhY2hlUmVjb3JkVXJpLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUGl2b3RDYWNoZVJlY29yZHMpOworICAgICAgICAgICAgY2FjaGVSZWNvcmQuU2F2ZShyZWNQYXJ0LkdldFN0cmVhbSgpKTsKKworICAgICAgICAgICAgUmVjb3JkUmVsYXRpb25zaGlwID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKENhY2hlRGVmaW5pdGlvblVyaSwgQ2FjaGVSZWNvcmRVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90Q2FjaGVSZWNvcmRzIik7CisgICAgICAgICAgICBSZWNvcmRSZWxhdGlvbnNoaXBJRCA9IFJlY29yZFJlbGF0aW9uc2hpcC5JZDsKKworICAgICAgICAgICAgQ2FjaGVEZWZpbml0aW9uWG1sLlNhdmUoUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHBhY2thZ2UgcGFydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgUGFydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZGF0YSByZXByZXNlbnRpbmcgdGhlIGNhY2hlIGRlZmluaXRpb24gaW4gdGhlIHBhY2thZ2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBYbWxEb2N1bWVudCBDYWNoZURlZmluaXRpb25YbWwgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGludGVybmFsIFVSSSB0byB0aGUgcGl2b3R0YWJsZSBjYWNoZSBkZWZpbml0aW9uIFhtbCBEb2N1bWVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFVyaSBDYWNoZURlZmluaXRpb25VcmkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIFVyaSBDYWNoZVJlY29yZFVyaQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VSZWxhdGlvbnNoaXAgUmVsYXRpb25zaGlwCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBSZWNvcmRSZWxhdGlvbnNoaXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBSZWNvcmRSZWxhdGlvbnNoaXBJRCAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkByOmlkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAcjppZCIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWZlcmVjZSB0byB0aGUgUGl2b1RhYmxlIG9iamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNvbnN0IHN0cmluZyBfc291cmNlV29ya3NoZWV0UGF0aD0iZDpjYWNoZVNvdXJjZS9kOndvcmtzaGVldFNvdXJjZS9Ac2hlZXQiOworICAgICAgICBjb25zdCBzdHJpbmcgX3NvdXJjZU5hbWVQYXRoID0gImQ6Y2FjaGVTb3VyY2UvZDp3b3Jrc2hlZXRTb3VyY2UvQG5hbWUiOworICAgICAgICBjb25zdCBzdHJpbmcgX3NvdXJjZUFkZHJlc3NQYXRoID0gImQ6Y2FjaGVTb3VyY2UvZDp3b3Jrc2hlZXRTb3VyY2UvQHJlZiI7CisgICAgICAgIGludGVybmFsIEV4Y2VsUmFuZ2VCYXNlIF9zb3VyY2VSYW5nZSA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBzb3VyY2UgZGF0YSByYW5nZSB3aGVuIHRoZSBwaXZvdHRhYmxlIGhhcyBhIHdvcmtzaGVldCBkYXRhc291cmNlLiAKKyAgICAgICAgLy8vIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgcmFuZ2UgbXVzdCBiZSBpbnRhY3QgaWYgdGhpcyBwcm9wZXJ0eSBpcyBjaGFuZ2VkLgorICAgICAgICAvLy8gVGhlIHJhbmdlIG11c3QgYmUgaW4gdGhlIHNhbWUgd29ya2Jvb2sgYXMgdGhlIHBpdm90dGFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBTb3VyY2VSYW5nZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3NvdXJjZVJhbmdlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ2FjaGVTb3VyY2UgPT0gZVNvdXJjZVR5cGUuV29ya3NoZWV0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3MgPSBQaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzW0dldFhtbE5vZGVTdHJpbmcoX3NvdXJjZVdvcmtzaGVldFBhdGgpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cyA9PSBudWxsKSAvL05vdCB3b3Jrc2hlZXQsIGNoZWNrIG5hbWUgb3IgdGFibGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gR2V0WG1sTm9kZVN0cmluZyhfc291cmNlTmFtZVBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBuIGluIFBpdm90VGFibGUuV29ya1NoZWV0Lldvcmtib29rLk5hbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmFtZS5FcXVhbHMobi5OYW1lLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc291cmNlUmFuZ2UgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zb3VyY2VSYW5nZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdyBpbiBQaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcuVGFibGVzLl90YWJsZU5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc291cmNlUmFuZ2UgPSB3LkNlbGxzW3cuVGFibGVzW25hbWVdLkFkZHJlc3MuQWRkcmVzc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbiBpbiB3Lk5hbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5FcXVhbHMobi5OYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc291cmNlUmFuZ2UgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IHdzLkNlbGxzW0dldFhtbE5vZGVTdHJpbmcoX3NvdXJjZUFkZHJlc3NQYXRoKV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2FjaGVzb3VyY2UgaXMgbm90IGEgd29ya3NoZWV0IikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfc291cmNlUmFuZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoUGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2sgIT0gdmFsdWUuV29ya3NoZWV0Lldvcmtib29rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUmFuZ2UgbXVzdCBiZSBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSBwaXZvdHRhYmxlIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBzcj1Tb3VyY2VSYW5nZTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuRW5kLkNvbHVtbiAtIHZhbHVlLlN0YXJ0LkNvbHVtbiAhPSBzci5FbmQuQ29sdW1uIC0gc3IuU3RhcnQuQ29sdW1uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG5vdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBjb2x1bW5zKGZpZWxkcykgaW4gdGhlIFNvdXJjZVJhbmdlIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3NvdXJjZVdvcmtzaGVldFBhdGgsIHZhbHVlLldvcmtzaGVldC5OYW1lKTsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zb3VyY2VBZGRyZXNzUGF0aCwgdmFsdWUuRmlyc3RBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBfc291cmNlUmFuZ2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUeXBlIG9mIHNvdXJjZSBkYXRhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlU291cmNlVHlwZSBDYWNoZVNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcz1HZXRYbWxOb2RlU3RyaW5nKCJkOmNhY2hlU291cmNlL0B0eXBlIik7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNvdXJjZVR5cGUuV29ya3NoZWV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVTb3VyY2VUeXBlKUVudW0uUGFyc2UodHlwZW9mKGVTb3VyY2VUeXBlKSwgcywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFN0YXJ0WG1sKEV4Y2VsUmFuZ2VCYXNlIHNvdXJjZUFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB4bWw9IjxwaXZvdENhY2hlRGVmaW5pdGlvbiB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgcjppZD1cIlwiIHJlZnJlc2hPbkxvYWQ9XCIxXCIgcmVmcmVzaGVkQnk9XCJTb21lVXNlclwiIHJlZnJlc2hlZERhdGU9XCI0MDUwNC41ODI0MDMxMjUwMDFcIiBjcmVhdGVkVmVyc2lvbj1cIjFcIiByZWZyZXNoZWRWZXJzaW9uPVwiM1wiIHJlY29yZENvdW50PVwiNVwiIHVwZ3JhZGVPblJlZnJlc2g9XCIxXCI+IjsKKworICAgICAgICAgICAgeG1sICs9ICI8Y2FjaGVTb3VyY2UgdHlwZT1cIndvcmtzaGVldFwiPiI7CisgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHdvcmtzaGVldFNvdXJjZSByZWY9XCJ7MH1cIiBzaGVldD1cInsxfVwiIC8+ICIsIHNvdXJjZUFkZHJlc3MuQWRkcmVzcywgc291cmNlQWRkcmVzcy5Xb3JrU2hlZXQpOworICAgICAgICAgICAgeG1sICs9ICI8L2NhY2hlU291cmNlPiI7CisgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPGNhY2hlRmllbGRzIGNvdW50PVwiezB9XCI+Iiwgc291cmNlQWRkcmVzcy5fdG9Db2wgLSBzb3VyY2VBZGRyZXNzLl9mcm9tQ29sICsgMSk7CisgICAgICAgICAgICB2YXIgc291cmNlV29ya3NoZWV0ID0gUGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suV29ya3NoZWV0c1tzb3VyY2VBZGRyZXNzLldvcmtTaGVldF07CisgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzb3VyY2VBZGRyZXNzLl9mcm9tQ29sOyBjb2wgPD0gc291cmNlQWRkcmVzcy5fdG9Db2w7IGNvbCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VXb3Jrc2hlZXQgPT0gbnVsbCB8fCBzb3VyY2VXb3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShzb3VyY2VBZGRyZXNzLl9mcm9tUm93LCBjb2wpID09IG51bGwgfHwgc291cmNlV29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoc291cmNlQWRkcmVzcy5fZnJvbVJvdywgY29sKS5Ub1N0cmluZygpLlRyaW0oKSA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KCI8Y2FjaGVGaWVsZCBuYW1lPVwiQ29sdW1uezB9XCIgbnVtRm10SWQ9XCIwXCI+IiwgY29sIC0gc291cmNlQWRkcmVzcy5fZnJvbUNvbCArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPGNhY2hlRmllbGQgbmFtZT1cInswfVwiIG51bUZtdElkPVwiMFwiPiIsIHNvdXJjZVdvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHNvdXJjZUFkZHJlc3MuX2Zyb21Sb3csIGNvbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3htbCArPSAiPHNoYXJlZEl0ZW1zIGNvbnRhaW5zTm9uRGF0ZT1cIjBcIiBjb250YWluc1N0cmluZz1cIjBcIiBjb250YWluc0JsYW5rPVwiMVwiIC8+ICI7CisgICAgICAgICAgICAgICAgeG1sICs9ICI8c2hhcmVkSXRlbXMgY29udGFpbnNCbGFuaz1cIjFcIiAvPiAiOworICAgICAgICAgICAgICAgIHhtbCArPSAiPC9jYWNoZUZpZWxkPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4bWwgKz0gIjwvY2FjaGVGaWVsZHM+IjsKKyAgICAgICAgICAgIHhtbCArPSAiPC9waXZvdENhY2hlRGVmaW5pdGlvbj4iOworCisgICAgICAgICAgICByZXR1cm4geG1sOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlLmNzIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDk5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGUuY3MKQEAgLTAsMCArMSw5NDkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gRXhjZWwgUGl2b3R0YWJsZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZSA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlKFBhY2thZ2luZy5aaXBQYWNrYWdlUmVsYXRpb25zaGlwIHJlbCwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQpIDogCisgICAgICAgICAgICBiYXNlKHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdvcmtTaGVldCA9IHNoZWV0OworICAgICAgICAgICAgUGl2b3RUYWJsZVVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKyAgICAgICAgICAgIFJlbGF0aW9uc2hpcCA9IHJlbDsKKyAgICAgICAgICAgIHZhciBwY2sgPSBzaGVldC5fcGFja2FnZS5QYWNrYWdlOworICAgICAgICAgICAgUGFydD1wY2suR2V0UGFydChQaXZvdFRhYmxlVXJpKTsKKworICAgICAgICAgICAgUGl2b3RUYWJsZVhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgTG9hZFhtbFNhZmUoUGl2b3RUYWJsZVhtbCwgUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICBUb3BOb2RlID0gUGl2b3RUYWJsZVhtbC5Eb2N1bWVudEVsZW1lbnQ7CisgICAgICAgICAgICBBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoR2V0WG1sTm9kZVN0cmluZygiZDpsb2NhdGlvbi9AcmVmIikpOworCisgICAgICAgICAgICBfY2FjaGVEZWZpbml0aW9uID0gbmV3IEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24oc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgdGhpcyk7CisgICAgICAgICAgICBMb2FkRmllbGRzKCk7CisKKyAgICAgICAgICAgIC8vQWRkIHJvdyBmaWVsZHMuCisgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IHJvd0VsZW0gaW4gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDpyb3dGaWVsZHMvZDpmaWVsZCIsIE5hbWVTcGFjZU1hbmFnZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2Uocm93RWxlbS5HZXRBdHRyaWJ1dGUoIngiKSwgb3V0IHgpICYmIHggPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJvd0ZpZWxkcy5BZGRJbnRlcm5hbChGaWVsZHNbeF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb3dFbGVtLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQocm93RWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8vQWRkIGNvbHVtbiBmaWVsZHMuCisgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IGNvbEVsZW0gaW4gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDpjb2xGaWVsZHMvZDpmaWVsZCIsIE5hbWVTcGFjZU1hbmFnZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGlmKGludC5UcnlQYXJzZShjb2xFbGVtLkdldEF0dHJpYnV0ZSgieCIpLG91dCB4KSAmJiB4ID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWVsZHMuQWRkSW50ZXJuYWwoRmllbGRzW3hdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29sRWxlbS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNvbEVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9BZGQgUGFnZSBlbGVtZW50cworICAgICAgICAgICAgLy9pbnQgaW5kZXggPSAwOworICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBwYWdlRWxlbSBpbiBUb3BOb2RlLlNlbGVjdE5vZGVzKCJkOnBhZ2VGaWVsZHMvZDpwYWdlRmllbGQiLCBOYW1lU3BhY2VNYW5hZ2VyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxkOworICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocGFnZUVsZW0uR2V0QXR0cmlidXRlKCJmbGQiKSwgb3V0IGZsZCkgJiYgZmxkID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBGaWVsZHNbZmxkXTsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuX3BhZ2VGaWVsZFNldHRpbmdzID0gbmV3IEV4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzKE5hbWVTcGFjZU1hbmFnZXIsIHBhZ2VFbGVtLCBmaWVsZCwgZmxkKTsKKyAgICAgICAgICAgICAgICAgICAgUGFnZUZpZWxkcy5BZGRJbnRlcm5hbChmaWVsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0FkZCBkYXRhIGVsZW1lbnRzCisgICAgICAgICAgICAvL2luZGV4ID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgZGF0YUVsZW0gaW4gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDpkYXRhRmllbGRzL2Q6ZGF0YUZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZsZDsKKyAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKGRhdGFFbGVtLkdldEF0dHJpYnV0ZSgiZmxkIiksIG91dCBmbGQpICYmIGZsZCA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gRmllbGRzW2ZsZF07CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhRmllbGQgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkKE5hbWVTcGFjZU1hbmFnZXIsIGRhdGFFbGVtLCBmaWVsZCk7CisgICAgICAgICAgICAgICAgICAgIERhdGFGaWVsZHMuQWRkSW50ZXJuYWwoZGF0YUZpZWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgbmV3IHBpdm90dGFibGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzaGVldCI+VGhlIHdvcmtzaGVldDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIGFkZHJlc3Mgb2YgdGhlIHBpdm90dGFibGU8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZUFkZHJlc3MiPlRoZSBhZGRyZXNzIG9mIHRoZSBTb3VyY2UgZGF0YTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YmxJZCI+PC9wYXJhbT4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlKEV4Y2VsV29ya3NoZWV0IHNoZWV0LCBFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsRXhjZWxSYW5nZUJhc2Ugc291cmNlQWRkcmVzcywgc3RyaW5nIG5hbWUsIGludCB0YmxJZCkgOiAKKyAgICAgICAgICAgIGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikKKwkgICAgeworICAgICAgICAgICAgV29ya1NoZWV0ID0gc2hlZXQ7CisgICAgICAgICAgICBBZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgIHZhciBwY2sgPSBzaGVldC5fcGFja2FnZS5QYWNrYWdlOworCisgICAgICAgICAgICBQaXZvdFRhYmxlWG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBMb2FkWG1sU2FmZShQaXZvdFRhYmxlWG1sLCBHZXRTdGFydFhtbChuYW1lLCB0YmxJZCwgYWRkcmVzcywgc291cmNlQWRkcmVzcyksIEVuY29kaW5nLlVURjgpOworICAgICAgICAgICAgVG9wTm9kZSA9IFBpdm90VGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OworICAgICAgICAgICAgUGl2b3RUYWJsZVVyaSA9ICBHZXROZXdVcmkocGNrLCAiL3hsL3Bpdm90VGFibGVzL3Bpdm90VGFibGV7MH0ueG1sIiwgdGJsSWQpOworICAgICAgICAgICAgaW5pdCgpOworCisgICAgICAgICAgICBQYXJ0ID0gcGNrLkNyZWF0ZVBhcnQoUGl2b3RUYWJsZVVyaSwgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90VGFibGUpOworICAgICAgICAgICAgUGl2b3RUYWJsZVhtbC5TYXZlKFBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL1dvcmtzaGVldC1QaXZvdHRhYmxlIHJlbGF0aW9uc2hpcAorICAgICAgICAgICAgUmVsYXRpb25zaGlwID0gc2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHNoZWV0LldvcmtzaGVldFVyaSwgUGl2b3RUYWJsZVVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvcGl2b3RUYWJsZSIpOworCisgICAgICAgICAgICBfY2FjaGVEZWZpbml0aW9uID0gbmV3IEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24oc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgdGhpcywgc291cmNlQWRkcmVzcywgdGJsSWQpOworICAgICAgICAgICAgX2NhY2hlRGVmaW5pdGlvbi5SZWxhdGlvbnNoaXA9UGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKFBpdm90VGFibGVVcmksIF9jYWNoZURlZmluaXRpb24uQ2FjaGVEZWZpbml0aW9uVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdENhY2hlRGVmaW5pdGlvbiIpOworCisgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5BZGRQaXZvdFRhYmxlKENhY2hlSUQuVG9TdHJpbmcoKSwgX2NhY2hlRGVmaW5pdGlvbi5DYWNoZURlZmluaXRpb25VcmkpOworCisgICAgICAgICAgICBMb2FkRmllbGRzKCk7CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcj1zaGVldC5DZWxsc1thZGRyZXNzLkFkZHJlc3NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIuQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJsb2NhdGlvbiIsICJwaXZvdEZpZWxkcyIsICJyb3dGaWVsZHMiLCAicm93SXRlbXMiLCAiY29sRmllbGRzIiwgImNvbEl0ZW1zIiwgInBhZ2VGaWVsZHMiLCAicGFnZUl0ZW1zIiwgImRhdGFGaWVsZHMiLCAiZGF0YUl0ZW1zIiwgImZvcm1hdHMiLCAicGl2b3RUYWJsZVN0eWxlSW5mbyIgfTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgTG9hZEZpZWxkcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRmllbGRzLkNsZWFyKCk7CisgICAgICAgICAgICAvL2ludCBpeD0wOworICAgICAgICAgICAgLy9mb3JlYWNoKFhtbEVsZW1lbnQgZmllbGROb2RlIGluIFBpdm90WG1sLlNlbGVjdE5vZGVzKCIvL2Q6cGl2b3RGaWVsZHMvZDpwaXZvdEZpZWxkIixOYW1lU3BhY2VNYW5hZ2VyKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgRmllbGRzLkFkZEludGVybmFsKG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZChOYW1lU3BhY2VNYW5hZ2VyLCBmaWVsZE5vZGUsIHRoaXMsIGl4KyspKTsKKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgLy9BZGQgZmllbGRzLgorICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBmaWVsZEVsZW0gaW4gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDpwaXZvdEZpZWxkcy9kOnBpdm90RmllbGQiLCBOYW1lU3BhY2VNYW5hZ2VyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmxkID0gbmV3IEV4Y2VsUGl2b3RUYWJsZUZpZWxkKE5hbWVTcGFjZU1hbmFnZXIsIGZpZWxkRWxlbSwgdGhpcywgaW5kZXgsIGluZGV4KyspOworICAgICAgICAgICAgICAgIEZpZWxkcy5BZGRJbnRlcm5hbChmbGQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0FkZCBmaWVsZHMuCisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IGZpZWxkRWxlbSBpbiBfY2FjaGVEZWZpbml0aW9uLlRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6Y2FjaGVGaWVsZHMvZDpjYWNoZUZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZsZCA9IEZpZWxkc1tpbmRleCsrXTsKKyAgICAgICAgICAgICAgICBmbGQuU2V0Q2FjaGVGaWVsZE5vZGUoZmllbGRFbGVtKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RhcnRYbWwoc3RyaW5nIG5hbWUsIGludCBpZCwgRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzLCBFeGNlbEFkZHJlc3NCYXNlIHNvdXJjZUFkZHJlc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB4bWwgPSBzdHJpbmcuRm9ybWF0KCI8cGl2b3RUYWJsZURlZmluaXRpb24geG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiBuYW1lPVwiezB9XCIgY2FjaGVJZD1cInsxfVwiIGRhdGFPblJvd3M9XCIxXCIgYXBwbHlOdW1iZXJGb3JtYXRzPVwiMFwiIGFwcGx5Qm9yZGVyRm9ybWF0cz1cIjBcIiBhcHBseUZvbnRGb3JtYXRzPVwiMFwiIGFwcGx5UGF0dGVybkZvcm1hdHM9XCIwXCIgYXBwbHlBbGlnbm1lbnRGb3JtYXRzPVwiMFwiIGFwcGx5V2lkdGhIZWlnaHRGb3JtYXRzPVwiMVwiIGRhdGFDYXB0aW9uPVwiRGF0YVwiICBjcmVhdGVkVmVyc2lvbj1cIjRcIiBzaG93TWVtYmVyUHJvcGVydHlUaXBzPVwiMFwiIHVzZUF1dG9Gb3JtYXR0aW5nPVwiMVwiIGl0ZW1QcmludFRpdGxlcz1cIjFcIiBpbmRlbnQ9XCIwXCIgY29tcGFjdD1cIjBcIiBjb21wYWN0RGF0YT1cIjBcIiBncmlkRHJvcFpvbmVzPVwiMVwiPiIsIG5hbWUsIGlkKTsKKworICAgICAgICAgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoIjxsb2NhdGlvbiByZWY9XCJ7MH1cIiBmaXJzdEhlYWRlclJvdz1cIjFcIiBmaXJzdERhdGFSb3c9XCIxXCIgZmlyc3REYXRhQ29sPVwiMVwiIC8+ICIsIGFkZHJlc3MuRmlyc3RBZGRyZXNzKTsKKyAgICAgICAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KCI8cGl2b3RGaWVsZHMgY291bnQ9XCJ7MH1cIj4iLCBzb3VyY2VBZGRyZXNzLl90b0NvbC1zb3VyY2VBZGRyZXNzLl9mcm9tQ29sKzEpOworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc291cmNlQWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IHNvdXJjZUFkZHJlc3MuX3RvQ29sOyBjb2wrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4bWwgKz0gIjxwaXZvdEZpZWxkIHNob3dBbGw9XCIwXCIgLz4iOyAvL2NvbXBhY3Q9XCIwXCIgb3V0bGluZT1cIjBcIiBzdWJ0b3RhbFRvcD1cIjBcIiBpbmNsdWRlTmV3SXRlbXNJbkZpbHRlcj1cIjFcIiAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHhtbCArPSAiPC9waXZvdEZpZWxkcz4iOworICAgICAgICAgICAgeG1sICs9ICI8cGl2b3RUYWJsZVN0eWxlSW5mbyBuYW1lPVwiUGl2b3RTdHlsZU1lZGl1bTlcIiBzaG93Um93SGVhZGVycz1cIjFcIiBzaG93Q29sSGVhZGVycz1cIjFcIiBzaG93Um93U3RyaXBlcz1cIjBcIiBzaG93Q29sU3RyaXBlcz1cIjBcIiBzaG93TGFzdENvbHVtbj1cIjFcIiAvPiI7CisgICAgICAgICAgICB4bWwgKz0gIjwvcGl2b3RUYWJsZURlZmluaXRpb24+IjsKKyAgICAgICAgICAgIHJldHVybiB4bWw7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBwaXZvdHRhYmxlIGluIHRoZSBwYWNrYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgUGl2b3RUYWJsZVhtbCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBhY2thZ2UgaW50ZXJuYWwgVVJJIHRvIHRoZSBwaXZvdHRhYmxlIFhtbCBEb2N1bWVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFVyaSBQaXZvdFRhYmxlVXJpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIGludGVybmFsIHNldDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBSZWxhdGlvbnNoaXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vY29uc3Qgc3RyaW5nIElEX1BBVEggPSAiQGlkIjsKKyAgICAgICAgLy9pbnRlcm5hbCBpbnQgSWQKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGdldAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChJRF9QQVRIKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBzZXQKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhJRF9QQVRILCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30KKyAgICAgICAgY29uc3Qgc3RyaW5nIE5BTUVfUEFUSCA9ICJAbmFtZSI7CisgICAgICAgIGNvbnN0IHN0cmluZyBESVNQTEFZX05BTUVfUEFUSCA9ICJAZGlzcGxheU5hbWUiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOYW1lIG9mIHRoZSBwaXZvdHRhYmxlIG9iamVjdCBpbiBFeGNlbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoTkFNRV9QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suRXhpc3RzVGFibGVOYW1lKHZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlBpdm90VGFibGUgbmFtZSBpcyBub3QgdW5pcXVlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmcgcHJldk5hbWUgPSBOYW1lOworICAgICAgICAgICAgICAgIGlmIChXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLkNvbnRhaW5zS2V5KHByZXZOYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IFdvcmtTaGVldC5UYWJsZXMuX3RhYmxlTmFtZXNbcHJldk5hbWVdOworICAgICAgICAgICAgICAgICAgICBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLlJlbW92ZShwcmV2TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtTaGVldC5UYWJsZXMuX3RhYmxlTmFtZXMuQWRkKHZhbHVlLCBpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoTkFNRV9QQVRILCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhESVNQTEFZX05BTUVfUEFUSCwgY2xlYW5EaXNwbGF5TmFtZSh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbiBfY2FjaGVEZWZpbml0aW9uID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBwaXZvdCB0YWJsZSBjYWNoZSBkZWZpbml0aW9uIG9iamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbiBDYWNoZURlZmluaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jYWNoZURlZmluaXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jYWNoZURlZmluaXRpb24gPSBuZXcgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbihOYW1lU3BhY2VNYW5hZ2VyLCB0aGlzLCBudWxsLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jYWNoZURlZmluaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgY2xlYW5EaXNwbGF5TmFtZShzdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LlJlcGxhY2UobmFtZSwgQCJbXlx3XC4tX10iLCAiXyIpOworICAgICAgICB9CisgICAgICAgICNyZWdpb24gIlB1YmxpYyBQcm9wZXJ0aWVzIgorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIHBpdm90dGFibGUgaXMgbG9jYXRlZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya1NoZWV0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHBpdm90IHRhYmxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIEFkZHJlc3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgaW50ZXJuYWwgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIG11bHRpcGxlIGRhdGFmaWVsZHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgcm93IGFyZWEgb3IgdGhlIGNvbHVtbiBhcmVhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIERhdGFPblJvd3MgCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBkYXRhT25Sb3dzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGRhdGFPblJvd3MiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBpZiB0cnVlIGFwcGx5IGxlZ2FjeSB0YWJsZSBhdXRvZm9ybWF0IG51bWJlciBmb3JtYXQgcHJvcGVydGllcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQXBwbHlOdW1iZXJGb3JtYXRzIAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAYXBwbHlOdW1iZXJGb3JtYXRzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGFwcGx5TnVtYmVyRm9ybWF0cyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgYXBwbHkgbGVnYWN5IHRhYmxlIGF1dG9mb3JtYXQgYm9yZGVyIHByb3BlcnRpZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQXBwbHlCb3JkZXJGb3JtYXRzIAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAYXBwbHlCb3JkZXJGb3JtYXRzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGFwcGx5Qm9yZGVyRm9ybWF0cyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgYXBwbHkgbGVnYWN5IHRhYmxlIGF1dG9mb3JtYXQgZm9udCBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFwcGx5Rm9udEZvcm1hdHMKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGFwcGx5Rm9udEZvcm1hdHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAYXBwbHlGb250Rm9ybWF0cyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgYXBwbHkgbGVnYWN5IHRhYmxlIGF1dG9mb3JtYXQgcGF0dGVybiBwcm9wZXJ0aWVzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFwcGx5UGF0dGVybkZvcm1hdHMKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGFwcGx5UGF0dGVybkZvcm1hdHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAYXBwbHlQYXR0ZXJuRm9ybWF0cyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRydWUgYXBwbHkgbGVnYWN5IHRhYmxlIGF1dG9mb3JtYXQgd2lkdGgvaGVpZ2h0IHByb3BlcnRpZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEFwcGx5V2lkdGhIZWlnaHRGb3JtYXRzCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBhcHBseVdpZHRoSGVpZ2h0Rm9ybWF0cyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBhcHBseVdpZHRoSGVpZ2h0Rm9ybWF0cyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNob3cgbWVtYmVyIHByb3BlcnR5IGluZm9ybWF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dNZW1iZXJQcm9wZXJ0eVRpcHMKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHNob3dNZW1iZXJQcm9wZXJ0eVRpcHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAc2hvd01lbWJlclByb3BlcnR5VGlwcyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNob3cgdGhlIGRyaWxsIGluZGljYXRvcnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgU2hvd0NhbGNNZW1iZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd0NhbGNNYnJzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dDYWxjTWJycyIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIHVzZXIgaXMgcHJldmVudGVkIGZyb20gZHJpbGxpbmcgZG93biBvbiBhIFBpdm90SXRlbSBvciBhZ2dyZWdhdGUgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgRW5hYmxlRHJpbGwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAZW5hYmxlRHJpbGwiLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAZW5hYmxlRHJpbGwiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvdyB0aGUgZHJpbGwgZG93biBidXR0b25zCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dEcmlsbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93RHJpbGwiLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAc2hvd0RyaWxsIiwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSB0b29sdGlwcyBzaG91bGQgYmUgZGlzcGxheWVkIGZvciBQaXZvdFRhYmxlIGRhdGEgY2VsbHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dEYXRhVGlwcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93RGF0YVRpcHMiLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAc2hvd0RhdGFUaXBzIiwgdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSByb3cgYW5kIGNvbHVtbiB0aXRsZXMgZnJvbSB0aGUgUGl2b3RUYWJsZSBzaG91bGQgYmUgcHJpbnRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgRmllbGRQcmludFRpdGxlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBmaWVsZFByaW50VGl0bGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGZpZWxkUHJpbnRUaXRsZXMiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIHJvdyBhbmQgY29sdW1uIHRpdGxlcyBmcm9tIHRoZSBQaXZvdFRhYmxlIHNob3VsZCBiZSBwcmludGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBJdGVtUHJpbnRUaXRsZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAaXRlbVByaW50VGl0bGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGl0ZW1QcmludFRpdGxlcyIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZ3JhbmQgdG90YWxzIHNob3VsZCBiZSBkaXNwbGF5ZWQgZm9yIHRoZSBQaXZvdFRhYmxlIGNvbHVtbnMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQ29sdW1HcmFuZFRvdGFscworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBjb2xHcmFuZFRvdGFscyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBjb2xHcmFuZFRvdGFscyIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBncmFuZCB0b3RhbHMgc2hvdWxkIGJlIGRpc3BsYXllZCBmb3IgdGhlIFBpdm90VGFibGUgcm93cworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBSb3dHcmFuZFRvdGFscworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkByb3dHcmFuZFRvdGFscyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkByb3dHcmFuZFRvdGFscyIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBkcmlsbCBpbmRpY2F0b3JzIGV4cGFuZCBjb2xsYXBzZSBidXR0b25zIHNob3VsZCBiZSBwcmludGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQcmludERyaWxsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHByaW50RHJpbGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAcHJpbnREcmlsbCIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgZXJyb3IgbWVzc2FnZXMgaW4gY2VsbHMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dFcnJvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93RXJyb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAc2hvd0Vycm9yIiwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgaW4gY2VsbHMgdGhhdCBjb250YWluIGVycm9ycy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBFcnJvckNhcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBlcnJvckNhcHRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBlcnJvckNhcHRpb24iLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHZhbHVlIGFyZWEgZmllbGQgaGVhZGVyIGluIHRoZSBQaXZvdFRhYmxlLiAKKyAgICAgICAgLy8vIFRoaXMgY2FwdGlvbiBpcyBzaG93biB3aGVuIHRoZSBQaXZvdFRhYmxlIHdoZW4gdHdvIG9yIG1vcmUgZmllbGRzIGFyZSBpbiB0aGUgdmFsdWVzIGFyZWEuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRGF0YUNhcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBkYXRhQ2FwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGRhdGFDYXB0aW9uIiwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2hvdyBmaWVsZCBoZWFkZXJzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFNob3dIZWFkZXJzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHNob3dIZWFkZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dIZWFkZXJzIiwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBudW1iZXIgb2YgcGFnZSBmaWVsZHMgdG8gZGlzcGxheSBiZWZvcmUgc3RhcnRpbmcgYW5vdGhlciByb3cgb3IgY29sdW1uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgUGFnZVdyYXAKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBwYWdlV3JhcCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodmFsdWU8MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlZhbHVlIGNhbid0IGJlIG5lZ2F0aXZlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBwYWdlV3JhcCIsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGxlZ2FjeSBhdXRvIGZvcm1hdHRpbmcgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgUGl2b3RUYWJsZSB2aWV3CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFVzZUF1dG9Gb3JtYXR0aW5nCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkB1c2VBdXRvRm9ybWF0dGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkB1c2VBdXRvRm9ybWF0dGluZyIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW4tZ3JpZCBkcm9wIHpvbmVzIHNob3VsZCBiZSBkaXNwbGF5ZWQgYXQgcnVudGltZSwgYW5kIHdoZXRoZXIgY2xhc3NpYyBsYXlvdXQgaXMgYXBwbGllZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBHcmlkRHJvcFpvbmVzCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBncmlkRHJvcFpvbmVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGdyaWREcm9wWm9uZXMiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uIGluY3JlbWVudCBmb3IgY29tcGFjdCBheGlzIGFuZCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIFJlcG9ydCBMYXlvdXQgdG8gQ29tcGFjdCBGb3JtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgSW5kZW50CisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGluZGVudCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGluZGVudCIsdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgZGF0YSBmaWVsZHMgaW4gdGhlIFBpdm90VGFibGUgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBvdXRsaW5lIGZvcm0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgT3V0bGluZURhdGEKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAb3V0bGluZURhdGEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAb3V0bGluZURhdGEiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gYSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgbmV3IGZpZWxkcyBzaG91bGQgaGF2ZSB0aGVpciBvdXRsaW5lIGZsYWcgc2V0IHRvIHRydWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgT3V0bGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQG91dGxpbmUiLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkcyBvZiBhIFBpdm90VGFibGUgY2FuIGhhdmUgbXVsdGlwbGUgZmlsdGVycyBzZXQgb24gdGhlbQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBNdWx0aXBsZUZpZWxkRmlsdGVycworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBtdWx0aXBsZUZpZWxkRmlsdGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBtdWx0aXBsZUZpZWxkRmlsdGVycyIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBuZXcgZmllbGRzIHNob3VsZCBoYXZlIHRoZWlyIGNvbXBhY3QgZmxhZyBzZXQgdG8gdHJ1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBDb21wYWN0CisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBjb21wYWN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3QiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBuZXh0IHRvIHRoZSBkYXRhIGZpZWxkIGluIHRoZSBQaXZvdFRhYmxlIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgY29sdW1uIG9mIHRoZSBzcHJlYWRzaGVldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBDb21wYWN0RGF0YQorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAY29tcGFjdERhdGEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAY29tcGFjdERhdGEiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgZm9yIGdyYW5kIHRvdGFscy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBHcmFuZFRvdGFsQ2FwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQGdyYW5kVG90YWxDYXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZ3JhbmRUb3RhbENhcHRpb24iLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGluIHJvdyBoZWFkZXIgaW4gY29tcGFjdCBtb2RlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFJvd0hlYWRlckNhcHRpb24gCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAcm93SGVhZGVyQ2FwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHJvd0hlYWRlckNhcHRpb24iLCB2YWx1ZSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCBpbiBjZWxscyB3aXRoIG5vIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTWlzc2luZ0NhcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBtaXNzaW5nQ2FwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQG1pc3NpbmdDYXB0aW9uIiwgdmFsdWUpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgRklSU1RIRUFERVJST1dfUEFUSD0iZDpsb2NhdGlvbi9AZmlyc3RIZWFkZXJSb3ciOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGZpcnN0IHJvdyBvZiB0aGUgUGl2b3RUYWJsZSBoZWFkZXIsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGVmdCBjZWxsIGluIHRoZSByZWYgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBGaXJzdEhlYWRlclJvdworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChGSVJTVEhFQURFUlJPV19QQVRIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRklSU1RIRUFERVJST1dfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIEZJUlNUREFUQVJPV19QQVRIID0gImQ6bG9jYXRpb24vQGZpcnN0RGF0YVJvdyI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBQaXZvdFRhYmxlIGRhdGEsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGVmdCBjZWxsIGluIHRoZSByZWYgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBGaXJzdERhdGFSb3cKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoRklSU1REQVRBUk9XX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhGSVJTVERBVEFST1dfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIEZJUlNUREFUQUNPTF9QQVRIID0gImQ6bG9jYXRpb24vQGZpcnN0RGF0YUNvbCI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBQaXZvdFRhYmxlIGRhdGEsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGVmdCBjZWxsIGluIHRoZSByZWYgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBGaXJzdERhdGFDb2wKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoRklSU1REQVRBQ09MX1BBVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhGSVJTVERBVEFDT0xfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uIF9maWVsZHMgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZmllbGRzIGluIHRoZSB0YWJsZSAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbiBGaWVsZHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maWVsZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maWVsZHMgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uKHRoaXMsICIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9maWVsZHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIF9yb3dGaWVsZHMgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSb3cgbGFiZWwgZmllbGRzIAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIFJvd0ZpZWxkcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3Jvd0ZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3Jvd0ZpZWxkcyA9IG5ldyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24odGhpcywgInJvd0ZpZWxkcyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jvd0ZpZWxkczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gX2NvbHVtbkZpZWxkcyA9IG51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbHVtbiBsYWJlbCBmaWVsZHMgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gQ29sdW1uRmllbGRzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY29sdW1uRmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY29sdW1uRmllbGRzID0gbmV3IEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbih0aGlzLCAiY29sRmllbGRzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfY29sdW1uRmllbGRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZENvbGxlY3Rpb24gX2RhdGFGaWVsZHMgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWYWx1ZSBmaWVsZHMgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uIERhdGFGaWVsZHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9kYXRhRmllbGRzID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZGF0YUZpZWxkcyA9IG5ldyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFGaWVsZHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIF9wYWdlRmllbGRzID0gbnVsbDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVwb3J0IGZpbHRlciBmaWVsZHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbiBQYWdlRmllbGRzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcGFnZUZpZWxkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3BhZ2VGaWVsZHMgPSBuZXcgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uKHRoaXMsICJwYWdlRmllbGRzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZUZpZWxkczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgU1RZTEVOQU1FX1BBVEggPSAiZDpwaXZvdFRhYmxlU3R5bGVJbmZvL0BuYW1lIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUGl2b3Qgc3R5bGUgbmFtZS4gVXNlZCBmb3IgY3VzdG9tIHN0eWxlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhTVFlMRU5BTUVfUEFUSCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiUGl2b3RTdHlsZSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gKFRhYmxlU3R5bGVzKUVudW0uUGFyc2UodHlwZW9mKFRhYmxlU3R5bGVzKSwgdmFsdWUuU3Vic3RyaW5nKDEwLCB2YWx1ZS5MZW5ndGggLSAxMCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuQ3VzdG9tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09ICJOb25lIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3RhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5DdXN0b207CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU1RZTEVOQU1FX1BBVEgsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBUYWJsZVN0eWxlcyBfdGFibGVTdHlsZSA9IFRhYmxlLlRhYmxlU3R5bGVzLk1lZGl1bTY7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0YWJsZSBzdHlsZS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBjdXNvbSB0aGUgc3R5bGUgZnJvbSB0aGUgU3R5bGVOYW1lIHByb3BlcnkgaXMgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRhYmxlU3R5bGVzIFRhYmxlU3R5bGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90YWJsZVN0eWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RhYmxlU3R5bGU9dmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IFRhYmxlU3R5bGVzLkN1c3RvbSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU1RZTEVOQU1FX1BBVEgsICJQaXZvdFN0eWxlIiArIHZhbHVlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgI3JlZ2lvbiAiSW50ZXJuYWwgUHJvcGVydGllcyIKKyAgICAgICAgaW50ZXJuYWwgaW50IENhY2hlSUQgCisgICAgICAgIHsgCisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGNhY2hlSWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAY2FjaGVJZCIsdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmNDc1MAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24uY3MKQEAgLTAsMCArMSwxNjUgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgY29sbGVjdGlvbiBvZiBwaXZvdHRhYmxlIG9iamVjdHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uIDogSUVudW1lcmFibGU8RXhjZWxQaXZvdFRhYmxlPgorICAgIHsKKyAgICAgICAgTGlzdDxFeGNlbFBpdm90VGFibGU+IF9waXZvdFRhYmxlcyA9IG5ldyBMaXN0PEV4Y2VsUGl2b3RUYWJsZT4oKTsKKyAgICAgICAgaW50ZXJuYWwgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX3Bpdm90VGFibGVOYW1lcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpOworICAgICAgICBFeGNlbFdvcmtzaGVldCBfd3M7ICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlQ29sbGVjdGlvbihFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBjayA9IHdzLl9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICBfd3MgPSB3czsgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcmVhY2godmFyIHJlbCBpbiB3cy5QYXJ0LkdldFJlbGF0aW9uc2hpcHMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVsLlJlbGF0aW9uc2hpcFR5cGUgPT0gRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90VGFibGUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRibCA9IG5ldyBFeGNlbFBpdm90VGFibGUocmVsLCB3cyk7CisgICAgICAgICAgICAgICAgICAgIF9waXZvdFRhYmxlTmFtZXMuQWRkKHRibC5OYW1lLCBfcGl2b3RUYWJsZXMuQ291bnQpOworICAgICAgICAgICAgICAgICAgICBfcGl2b3RUYWJsZXMuQWRkKHRibCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgRXhjZWxQaXZvdFRhYmxlIEFkZChFeGNlbFBpdm90VGFibGUgdGJsKQorICAgICAgICB7CisgICAgICAgICAgICBfcGl2b3RUYWJsZXMuQWRkKHRibCk7CisgICAgICAgICAgICBfcGl2b3RUYWJsZU5hbWVzLkFkZCh0YmwuTmFtZSwgX3Bpdm90VGFibGVzLkNvdW50IC0gMSk7CisgICAgICAgICAgICBpZiAodGJsLkNhY2hlSUQgPj0gX3dzLldvcmtib29rLl9uZXh0UGl2b3RUYWJsZUlEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF93cy5Xb3JrYm9vay5fbmV4dFBpdm90VGFibGVJRCA9IHRibC5DYWNoZUlEICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0Ymw7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGUgYSBwaXZvdHRhYmxlIG9uIHRoZSBzdXBwbGllZCByYW5nZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJhbmdlIj5UaGUgcmFuZ2UgYWRkcmVzcyBpbmNsdWRpbmcgaGVhZGVyIGFuZCB0b3RhbCByb3c8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlNvdXJjZSI+VGhlIFNvdXJjZSBkYXRhIHJhbmdlIGFkZHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gTXVzdCBiZSB1bmlxdWUgPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwaXZvdHRhYmxlIG9iamVjdDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZSBBZGQoRXhjZWxBZGRyZXNzQmFzZSBSYW5nZSwgRXhjZWxSYW5nZUJhc2UgU291cmNlLCBzdHJpbmcgTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KE5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5hbWUgPSBHZXROZXdUYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChSYW5nZS5Xb3JrU2hlZXQgIT0gX3dzLk5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiVGhlIFJhbmdlIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgd29ya3NoZWV0IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoX3dzLldvcmtib29rLkV4aXN0c1RhYmxlTmFtZShOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUYWJsZW5hbWUgaXMgbm90IHVuaXF1ZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIF9waXZvdFRhYmxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodC5BZGRyZXNzLkNvbGxpZGUoUmFuZ2UpICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRhYmxlIHJhbmdlIGNvbGxpZGVzIHdpdGggdGFibGUgezB9IiwgdC5OYW1lKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBZGQobmV3IEV4Y2VsUGl2b3RUYWJsZShfd3MsIFJhbmdlLCBTb3VyY2UsIE5hbWUsIF93cy5Xb3JrYm9vay5fbmV4dFBpdm90VGFibGVJRCsrKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0TmV3VGFibGVOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSAiUGl2b3R0YWJsZTEiOworICAgICAgICAgICAgaW50IGkgPSAyOworICAgICAgICAgICAgd2hpbGUgKF93cy5Xb3JrYm9vay5FeGlzdHNQaXZvdFRhYmxlTmFtZShuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gc3RyaW5nLkZvcm1hdCgiUGl2b3R0YWJsZXswfSIsIGkrKyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcGl2b3RUYWJsZXMuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBpdm90dGFibGUgSW5kZXguIEJhc2UgMC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZSB0aGlzW2ludCBJbmRleF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEluZGV4IDwgMCB8fCBJbmRleCA+PSBfcGl2b3RUYWJsZXMuQ291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUGl2b3RUYWJsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfcGl2b3RUYWJsZXNbSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBpdm90dGFiZXMgYWNjZXNlZCBieSBuYW1lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHBpdm90dGFibGU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIFBpdm90YWJsZS4gTnVsbCBpZiB0aGUgbm8gbWF0Y2ggaXMgZm91bmQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGUgdGhpc1tzdHJpbmcgTmFtZV0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9waXZvdFRhYmxlTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Bpdm90VGFibGVzW19waXZvdFRhYmxlTmFtZXNbTmFtZV1dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPEV4Y2VsUGl2b3RUYWJsZT4gR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfcGl2b3RUYWJsZXMuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9waXZvdFRhYmxlcy5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVEYXRhRmllbGQuY3MgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVEYXRhRmllbGQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhN2RjNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZC5jcwpAQCAtMCwwICsxLDIzMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcGl2byB0YWJsZSBkYXRhIGZpZWxkCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVEYXRhRmllbGQoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkKSA6CisgICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG9wTm9kZS5BdHRyaWJ1dGVzLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5kZXggPSBmaWVsZC5JbmRleDsKKyAgICAgICAgICAgICAgICBCYXNlRmllbGQgPSAwOworICAgICAgICAgICAgICAgIEJhc2VJdGVtID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgRmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZmllbGQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEZpZWxkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBpbmRleCBvZiB0aGUgZGF0YWZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgSW5kZXggCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGZsZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGZsZCIsdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIGRhdGFmaWVsZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoRmllbGQuX3RhYmxlLkRhdGFGaWVsZHMuRXhpc3RzRGZOYW1lKHZhbHVlLCB0aGlzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRHVwbGljYXRlIGRhdGFmaWVsZCBuYW1lIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBGaWVsZCBpbmRleC4gUmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBjb2xsZWN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQmFzZUZpZWxkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAYmFzZUZpZWxkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYmFzZUZpZWxkIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBpbmRleCB0byB0aGUgYmFzZSBpdGVtIHdoZW4gdGhlIFNob3dEYXRhQXMgY2FsY3VsYXRpb24gaXMgaW4gdXNlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgQmFzZUl0ZW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBiYXNlSXRlbSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGJhc2VJdGVtIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTnVtYmVyIGZvcm1hdCBpZC4gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIGludCBOdW1GbXRJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQG51bUZtdElkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbnVtRm10SWQiLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOdW1iZXIgZm9ybWF0IGZvciB0aGUgZGF0YSBjb2x1bW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBGb3JtYXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG5mIGluIEZpZWxkLl90YWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk51bWJlckZvcm1hdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobmYuTnVtRm10SWQgPT0gTnVtRm10SWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZi5Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkLl90YWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk51bWJlckZvcm1hdHNbMF0uRm9ybWF0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN0eWxlcyA9IEZpZWxkLl90YWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzOworCisgICAgICAgICAgICAgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwgbmYgPSBudWxsOworICAgICAgICAgICAgICAgIGlmICghc3R5bGVzLk51bWJlckZvcm1hdHMuRmluZEJ5SUQodmFsdWUsIHJlZiBuZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZiA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7IEZvcm1hdCA9IHZhbHVlLCBOdW1GbXRJZCA9IHN0eWxlcy5OdW1iZXJGb3JtYXRzLk5leHRJZCsrIH07CisgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5OdW1iZXJGb3JtYXRzLkFkZCh2YWx1ZSwgbmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBOdW1GbXRJZCA9IG5mLk51bUZtdElkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGUgb2YgYWdncmVnYXRlIGZ1bmN0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBEYXRhRmllbGRGdW5jdGlvbnMgRnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHM9R2V0WG1sTm9kZVN0cmluZygiQHN1YnRvdGFsIik7CisgICAgICAgICAgICAgICAgaWYocz09IiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGF0YUZpZWxkRnVuY3Rpb25zKUVudW0uUGFyc2UodHlwZW9mKERhdGFGaWVsZEZ1bmN0aW9ucyksIHMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2OworICAgICAgICAgICAgICAgIHN3aXRjaCh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJAc3VidG90YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhRmllbGRGdW5jdGlvbnMuQ291bnROdW1zOgorICAgICAgICAgICAgICAgICAgICAgICAgdj0iQ291bnROdW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFGaWVsZEZ1bmN0aW9ucy5TdGREZXY6CisgICAgICAgICAgICAgICAgICAgICAgICB2PSJzdGREZXYiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YUZpZWxkRnVuY3Rpb25zLlN0ZERldlA6CisgICAgICAgICAgICAgICAgICAgICAgICB2PSJzdGREZXZQIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdj12YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzdWJ0b3RhbCIsIHYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLy8vU2luY2Ugd2UgaGF2ZSBubyBpdGVtcywgRXhjZWwgd2lsbCBjcmFzaCB3aGVuIHdlIHVzZSBzaG93RGF0YUFzIG9wdGlvbnMgdGhhdCByZXF1aXJlIGJhc2VJdGVtJ3MKKyAgICAgICAgLy9wdWJsaWMgZVNob3dEYXRhQXMgU2hvd0RhdGFBcworICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0CisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHN0cmluZyBzID0gR2V0WG1sTm9kZVN0cmluZygiQHNob3dEYXRhQXMiKTsKKyAgICAgICAgLy8gICAgICAgIGlmIChzID09ICIiKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBlU2hvd0RhdGFBcy5Ob3JtYWw7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIChlU2hvd0RhdGFBcylFbnVtLlBhcnNlKHR5cGVvZihlU2hvd0RhdGFBcyksIHMsIHRydWUpOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHNldAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBzdHJpbmcgdiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgIC8vICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcigpICsgdi5TdWJzdHJpbmcoMSk7CisgICAgICAgIC8vICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc2hvd0RhdGFBcyIsIHYpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkLmNzIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4OTdhYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkLmNzCkBAIC0wLDAgKzEsMTA3NiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlCit7CisgICAgCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEZWZpbmVzIHRoZSBheGlzIGZvciBhIFBpdm90VGFibGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVQaXZvdEZpZWxkQXhpcworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm9uZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBOb25lPS0xLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb2x1bW4gYXhpcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBDb2x1bW4sCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBhZ2UgYXhpcyAoSW5jbHVkZSBDb3VudCBGaWx0ZXIpIAorICAgICAgICAvLy8gCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBhZ2UsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJvdyBheGlzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFJvdywKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVmFsdWVzIGF4aXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVmFsdWVzIAorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJ1aWxkLWluIHRhYmxlIHJvdyBmdW5jdGlvbnMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIERhdGFGaWVsZEZ1bmN0aW9ucworICAgIHsKKyAgICAgICAgQXZlcmFnZSwKKyAgICAgICAgQ291bnQsCisgICAgICAgIENvdW50TnVtcywKKyAgICAgICAgTWF4LAorICAgICAgICBNaW4sCisgICAgICAgIFByb2R1Y3QsCisgICAgICAgIE5vbmUsCisgICAgICAgIFN0ZERldiwKKyAgICAgICAgU3RkRGV2UCwKKyAgICAgICAgU3VtLAorICAgICAgICBWYXIsCisgICAgICAgIFZhclAKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEZWZpbmVzIHRoZSBkYXRhIGZvcm1hdHMgZm9yIGEgZmllbGQgaW4gdGhlIFBpdm90VGFibGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVTaG93RGF0YUFzCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAiZGlmZmVyZW5jZSBmcm9tIiBhIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBEaWZmZXJlbmNlLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAiaW5kZXguCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIEluZGV4LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIGlzIHNob3duIGFzIGl0cyBub3JtYWwgZGF0YXR5cGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5vcm1hbCwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIC9JbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3cgYXMgdGhlICJwZXJjZW50YWdlIG9mIiBhIHZhbHVlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBlcmNlbnQsIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAicGVyY2VudGFnZSBkaWZmZXJlbmNlIGZyb20iIGEgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBlcmNlbnREaWZmLCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyB0aGUgcGVyY2VudGFnZSBvZiBjb2x1bW4uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFBlcmNlbnRPZkNvbCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyB0aGUgcGVyY2VudGFnZSBvZiByb3cKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgUGVyY2VudE9mUm93LCAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyBwZXJjZW50YWdlIG9mIHRvdGFsLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBQZXJjZW50T2ZUb3RhbCwgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGljYXRlcyB0aGUgZmllbGQgaXMgc2hvd24gYXMgcnVubmluZyB0b3RhbCBpbiB0aGUgdGFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFJ1blRvdGFsLCAgICAgICAgCisgICAgfQorICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAvLy8gQnVpbHQtaW4gc3VidG90YWwgZnVuY3Rpb25zCisgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgW0ZsYWdzXSAKKyAgICBwdWJsaWMgZW51bSBlU3ViVG90YWxGdW5jdGlvbnMgCisgICAgIHsKKyAgICAgICAgIE5vbmU9MSwKKyAgICAgICAgIENvdW50PTIsIAorICAgICAgICAgQ291bnRBPTQsIAorICAgICAgICAgQXZnPTgsIAorICAgICAgICAgRGVmYXVsdD0xNiwgCisgICAgICAgICBNaW49MzIsIAorICAgICAgICAgTWF4PTY0LCAKKyAgICAgICAgIFByb2R1Y3Q9MTI4LCAKKyAgICAgICAgIFN0ZERldj0yNTYsIAorICAgICAgICAgU3RkRGV2UD01MTIsIAorICAgICAgICAgU3VtPTEwMjQsIAorICAgICAgICAgVmFyPTIwNDgsIAorICAgICAgICAgVmFyUD00MDk2CisgICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERhdGEgZ3JvdXBpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFtGbGFnc10KKyAgICBwdWJsaWMgZW51bSBlRGF0ZUdyb3VwQnkKKyAgICB7CisgICAgICAgIFllYXJzID0gMSwKKyAgICAgICAgUXVhcnRlcnMgPSAyLAorICAgICAgICBNb250aHMgPSA0LAorICAgICAgICBEYXlzID0gOCwKKyAgICAgICAgSG91cnMgPSAxNiwKKyAgICAgICAgTWludXRlcyA9IDMyLAorICAgICAgICBTZWNvbmRzID0gNjQKKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTb3J0aW5nCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgZW51bSBlU29ydFR5cGUKKyAgICB7CisgICAgICAgIE5vbmUsCisgICAgICAgIEFzY2VuZGluZywKKyAgICAgICAgRGVzY2VuZGluZworICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcGl2b3QgdGFibGUgZmllbGQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGQgOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZSBfdGFibGU7CisgICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSxFeGNlbFBpdm90VGFibGUgdGFibGUsIGludCBpbmRleCwgaW50IGJhc2VJbmRleCkgOgorICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIEJhc2VJbmRleCA9IGJhc2VJbmRleDsKKyAgICAgICAgICAgIF90YWJsZSA9IHRhYmxlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIGludGVybmFsIGludCBCYXNlSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5hbWUgb2YgdGhlIGZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZygiQG5hbWUiKTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSAiIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY2FjaGVGaWVsZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21wYWN0IG1vZGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQ29tcGFjdAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAY29tcGFjdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBjb21wYWN0Iix2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGl0ZW1zIGluIHRoaXMgZmllbGQgc2hvdWxkIGJlIHNob3duIGluIE91dGxpbmUgZm9ybQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBPdXRsaW5lIAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAb3V0bGluZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lIix2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGN1c3RvbSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGZvciB0aGUgc3VidG90YWxzIGxhYmVsCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIFN1YnRvdGFsVG9wIAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc3VidG90YWxUb3AiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAc3VidG90YWxUb3AiLHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IGFsbCBpdGVtcyBmb3IgdGhpcyBmaWVsZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBTaG93QWxsIAorICAgICAgICB7IAorICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd0FsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBzaG93QWxsIix2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHR5cGUgb2Ygc29ydCB0aGF0IGlzIGFwcGxpZWQgdG8gdGhpcyBmaWVsZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZVNvcnRUeXBlIFNvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHYgPSBHZXRYbWxOb2RlU3RyaW5nKCJAc29ydFR5cGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdiA9PSAiIiA/IGVTb3J0VHlwZS5Ob25lIDogKGVTb3J0VHlwZSlFbnVtLlBhcnNlKHR5cGVvZihlU29ydFR5cGUpLCB2LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBlU29ydFR5cGUuTm9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoIkBzb3J0VHlwZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc29ydFR5cGUiLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBtYW51YWwgZmlsdGVyIGlzIGluIGluY2x1c2l2ZSBtb2RlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEluY2x1ZGVOZXdJdGVtc0luRmlsdGVyCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBpbmNsdWRlTmV3SXRlbXNJbkZpbHRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBpbmNsdWRlTmV3SXRlbXNJbkZpbHRlciIsdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAvLy8gRW51bWVyYXRpb24gb2YgdGhlIGRpZmZlcmVudCBzdWJ0b3RhbCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gcGFnZSwgcm93IG9yIGNvbHVtbiBmaWVsZHMKKyAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICBwdWJsaWMgZVN1YlRvdGFsRnVuY3Rpb25zIFN1YlRvdGFsRnVuY3Rpb25zCisgICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlU3ViVG90YWxGdW5jdGlvbnMgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBYbWxOb2RlTGlzdCBubCA9IFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6aXRlbXMvZDppdGVtL0B0IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgaWYgKG5sLkNvdW50ID09IDApIHJldHVybiBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxBdHRyaWJ1dGUgaXRlbSBpbiBubCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgfD0gKGVTdWJUb3RhbEZ1bmN0aW9ucylFbnVtLlBhcnNlKHR5cGVvZihlU3ViVG90YWxGdW5jdGlvbnMpLCBpdGVtLlZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIHZhbHVlIG9mICIgKyBpdGVtLlZhbHVlICsgIiB0byBhIHZhbGlkIHBpdm90IHRhYmxlIHN1YnRvdGFsIGZ1bmN0aW9uIiwgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIGVTdWJUb3RhbEZ1bmN0aW9ucy5Ob25lKSA9PSBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZSAmJiAodmFsdWUgIT0gZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmUpKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBOb25lIGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB2YWx1ZXMuIikpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgJiBlU3ViVG90YWxGdW5jdGlvbnMuRGVmYXVsdCkgPT0gZVN1YlRvdGFsRnVuY3Rpb25zLkRlZmF1bHQgJiYgKHZhbHVlICE9IGVTdWJUb3RhbEZ1bmN0aW9ucy5EZWZhdWx0KSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgRGVmYXVsdCBjYW4gbm90IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgdmFsdWVzLiIpKTsKKyAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBhdHRyaWJ1dGUgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICBYbWxOb2RlTGlzdCBubCA9IFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6aXRlbXMvZDppdGVtL0B0IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgIGlmIChubC5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbEF0dHJpYnV0ZSBpdGVtIGluIG5sKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoIkAiICsgaXRlbS5WYWx1ZSArICJTdWJ0b3RhbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uT3duZXJFbGVtZW50LlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoaXRlbS5Pd25lckVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIAorIAorICAgICAgICAgICAgICAgICBpZiAodmFsdWU9PWVTdWJUb3RhbEZ1bmN0aW9ucy5Ob25lKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm8gc3VidG90YWxzLCBzZXQgZGVmYXVsdFN1YnRvdGFsIHRvIG9mZgorICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBkZWZhdWx0U3VidG90YWwiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gIiI7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5uZXJYbWwgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChlU3ViVG90YWxGdW5jdGlvbnMgZSBpbiBFbnVtLkdldFZhbHVlcyh0eXBlb2YoZVN1YlRvdGFsRnVuY3Rpb25zKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgJiBlKSA9PSBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUb3RhbFR5cGUgPSBlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsVHlwZSA9IGNoYXIuVG9Mb3dlcihuZXdUb3RhbFR5cGVbMF0sIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgbmV3VG90YWxUeXBlLlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAIiArIHRvdGFsVHlwZSArICJTdWJ0b3RhbCIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyWG1sICs9ICI8aXRlbSB0PVwiIiArIHRvdGFsVHlwZSArICJcIiAvPiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gc3RyaW5nLkZvcm1hdCgiPGl0ZW1zIGNvdW50PVwiezB9XCI+ezF9PC9pdGVtcz4iLCBjb3VudCwgaW5uZXJYbWwpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUeXBlIG9mIGF4aXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVQaXZvdEZpZWxkQXhpcyBBeGlzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChHZXRYbWxOb2RlU3RyaW5nKCJAYXhpcyIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXhpc1JvdyI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVBpdm90RmllbGRBeGlzLlJvdzsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXhpc0NvbCI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVBpdm90RmllbGRBeGlzLkNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXhpc1BhZ2UiOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQaXZvdEZpZWxkQXhpcy5QYWdlOworICAgICAgICAgICAgICAgICAgICBjYXNlICJheGlzVmFsdWVzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlUGl2b3RGaWVsZEF4aXMuVmFsdWVzOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQaXZvdEZpZWxkQXhpcy5Ob25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5Sb3c6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYXhpcyIsImF4aXNSb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5Db2x1bW46CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYXhpcyIsImF4aXNDb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5WYWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYXhpcyIsICJheGlzVmFsdWVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBlUGl2b3RGaWVsZEF4aXMuUGFnZToKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBheGlzIiwgImF4aXNQYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoIkBheGlzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZmllbGQgaXMgYSByb3cgZmllbGQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgSXNSb3dGaWVsZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCIuLi8uLi9kOnJvd0ZpZWxkcy9kOmZpZWxkW0B4PXswfV0iLCBJbmRleCksIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3NOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOnJvd0ZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAocm93c05vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLkNyZWF0ZU5vZGUoImQ6cm93RmllbGRzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcm93c05vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6cm93RmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICAgICAgQXBwZW5kRmllbGQocm93c05vZGUsIEluZGV4LCAiZmllbGQiLCAieCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoQmFzZUluZGV4ID09IEluZGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gIjxpdGVtcyBjb3VudD1cIjFcIj48aXRlbSB0PVwiZGVmYXVsdFwiIC8+PC9pdGVtcz4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVG9wTm9kZS5Jbm5lclhtbCA9ICI8aXRlbXMgY291bnQ9XCIwXCI+PC9pdGVtcz4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCIuLi8uLi9kOnJvd0ZpZWxkcy9kOmZpZWxkW0B4PXswfV0iLCBJbmRleCksIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGZpZWxkIGlzIGEgY29sdW1uIGZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIElzQ29sdW1uRmllbGQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpjb2xGaWVsZHMvZDpmaWVsZFtAeD17MH1dIiwgSW5kZXgpLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5zTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpjb2xGaWVsZHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbnNOb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5DcmVhdGVOb2RlKCJkOmNvbEZpZWxkcyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOmNvbEZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgICAgICAgICAgICAgICAgIEFwcGVuZEZpZWxkKGNvbHVtbnNOb2RlLCBJbmRleCwgImZpZWxkIiwgIngiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJhc2VJbmRleCA9PSBJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVG9wTm9kZS5Jbm5lclhtbCA9ICI8aXRlbXMgY291bnQ9XCIxXCI+PGl0ZW0gdD1cImRlZmF1bHRcIiAvPjwvaXRlbXM+IjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSAiPGl0ZW1zIGNvdW50PVwiMFwiPjwvaXRlbXM+IjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpjb2xGaWVsZHMvZDpmaWVsZFtAeD17MH1dIiwgSW5kZXgpLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIGZpZWxkIGlzIGEgZGF0YWZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIElzRGF0YUZpZWxkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGRhdGFGaWVsZCIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB0aGUgZmllbGQgaXMgYSBwYWdlIGZpZWxkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBJc1BhZ2VGaWVsZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEF4aXM9PWVQaXZvdEZpZWxkQXhpcy5QYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhRmllbGRzTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpwYWdlRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhRmllbGRzTm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGUuQ3JlYXRlTm9kZSgiZDpwYWdlRmllbGRzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGRzTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpwYWdlRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gIjxpdGVtcyBjb3VudD1cIjFcIj48aXRlbSB0PVwiZGVmYXVsdFwiIC8+PC9pdGVtcz4iOworCisgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9IEFwcGVuZEZpZWxkKGRhdGFGaWVsZHNOb2RlLCBJbmRleCwgInBhZ2VGaWVsZCIsICJmbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgX3BhZ2VGaWVsZFNldHRpbmdzID0gbmV3IEV4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzKE5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsIHRoaXMsIEluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3BhZ2VGaWVsZFNldHRpbmdzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoIi4uLy4uL2Q6cGFnZUZpZWxkcy9kOnBhZ2VGaWVsZFtAZmxkPXswfV0iLCBJbmRleCksIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL3B1YmxpYyBFeGNlbFBpdm90R3JvdXBpbmcgRGF0ZUdyb3VwaW5nCisgICAgICAgIC8veworCisgICAgICAgIC8vfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncyBfcGFnZUZpZWxkU2V0dGluZ3MgPSBudWxsOworICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MgUGFnZUZpZWxkU2V0dGluZ3MKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9wYWdlRmllbGRTZXR0aW5nczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBlRGF0ZUdyb3VwQnkgRGF0ZUdyb3VwaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorICAgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwIF9ncm91cGluZz1udWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHcm91cGluZyBzZXR0aW5ncy4gCisgICAgICAgIC8vLyBOdWxsIGlmIHRoZSBmaWVsZCBoYXMgbm8gZ3JvdXBpbmcgb3RoZXJ3aXNlIEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwIG9yIEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgICAgICAgCisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwIEdyb3VwaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZ3JvdXBpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBQcml2YXRlICYgaW50ZXJuYWwgTWV0aG9kcworICAgICAgICBpbnRlcm5hbCBYbWxFbGVtZW50IEFwcGVuZEZpZWxkKFhtbE5vZGUgcm93c05vZGUsIGludCBpbmRleCwgc3RyaW5nIGZpZWxkTm9kZVRleHQsIHN0cmluZyBpbmRleEF0dHJUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBYbWxFbGVtZW50IHByZXZGaWVsZCA9IG51bGwsIG5ld0VsZW1lbnQ7CisgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IGZpZWxkIGluIHJvd3NOb2RlLkNoaWxkTm9kZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHggPSBmaWVsZC5HZXRBdHRyaWJ1dGUoaW5kZXhBdHRyVGV4dCk7CisgICAgICAgICAgICAgICAgaW50IGZpZWxkSW5kZXg7CisgICAgICAgICAgICAgICAgaWYoaW50LlRyeVBhcnNlKHgsIG91dCBmaWVsZEluZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZEluZGV4ID09IGluZGV4KSAgICAvL1JvdyBhbHJlYWR5IGV4aXN0cworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9lbHNlIGlmIChmaWVsZEluZGV4ID4gaW5kZXgpCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICBuZXdFbGVtZW50ID0gcm93c05vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KGZpZWxkTm9kZVRleHQsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbmV3RWxlbWVudC5TZXRBdHRyaWJ1dGUoaW5kZXhBdHRyVGV4dCwgaW5kZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHJvd3NOb2RlLkluc2VydEFmdGVyKG5ld0VsZW1lbnQsIGZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZGaWVsZD1maWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld0VsZW1lbnQgPSByb3dzTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoZmllbGROb2RlVGV4dCwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgbmV3RWxlbWVudC5TZXRBdHRyaWJ1dGUoaW5kZXhBdHRyVGV4dCwgaW5kZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICByb3dzTm9kZS5JbnNlcnRBZnRlcihuZXdFbGVtZW50LCBwcmV2RmllbGQpOworCisgICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBYbWxIZWxwZXJJbnN0YW5jZSBfY2FjaGVGaWVsZEhlbHBlciA9IG51bGw7CisgICAgICAgIGludGVybmFsIHZvaWQgU2V0Q2FjaGVGaWVsZE5vZGUoWG1sTm9kZSBjYWNoZUZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlciA9IG5ldyBYbWxIZWxwZXJJbnN0YW5jZShOYW1lU3BhY2VNYW5hZ2VyLCBjYWNoZUZpZWxkKTsKKyAgICAgICAgICAgIHZhciBncm91cE5vZGUgPSBjYWNoZUZpZWxkLlNlbGVjdFNpbmdsZU5vZGUoImQ6ZmllbGRHcm91cCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKGdyb3VwTm9kZSE9bnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZ3JvdXBCeSA9IGdyb3VwTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnJhbmdlUHIvQGdyb3VwQnkiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBCeT09bnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ncm91cGluZyA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cChOYW1lU3BhY2VNYW5hZ2VyLCBjYWNoZUZpZWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0ZUdyb3VwaW5nPShlRGF0ZUdyb3VwQnkpRW51bS5QYXJzZSh0eXBlb2YoZURhdGVHcm91cEJ5KSwgZ3JvdXBCeS5WYWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIF9ncm91cGluZyA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cChOYW1lU3BhY2VNYW5hZ2VyLCBncm91cE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgICNyZWdpb24gR3JvdXBpbmcKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXAgU2V0RGF0ZUdyb3VwKGVEYXRlR3JvdXBCeSBHcm91cEJ5LCBEYXRlVGltZSBTdGFydERhdGUsIERhdGVUaW1lIEVuZERhdGUsIGludCBpbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXAgZ3JvdXA7CisgICAgICAgICAgICBncm91cCA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cChOYW1lU3BhY2VNYW5hZ2VyLCBfY2FjaGVGaWVsZEhlbHBlci5Ub3BOb2RlKTsKKyAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc0RhdGUiLCB0cnVlKTsKKyAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc05vbkRhdGUiLCBmYWxzZSk7CisgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNTZW1pTWl4ZWRUeXBlcyIsIGZhbHNlKTsKKworICAgICAgICAgICAgZ3JvdXAuVG9wTm9kZS5Jbm5lclhtbCArPSBzdHJpbmcuRm9ybWF0KCI8ZmllbGRHcm91cCBiYXNlPVwiezB9XCI+PHJhbmdlUHIgZ3JvdXBCeT1cInsxfVwiIC8+PGdyb3VwSXRlbXMgLz48L2ZpZWxkR3JvdXA+IiwgQmFzZUluZGV4LCBHcm91cEJ5LlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisKKyAgICAgICAgICAgIGlmIChTdGFydERhdGUuWWVhciA8IDE5MDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9Ac3RhcnREYXRlIiwgIjE5MDAtMDEtMDFUMDA6MDA6MDAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BzdGFydERhdGUiLCBTdGFydERhdGUuVG9TdHJpbmcoInMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9AYXV0b1N0YXJ0IiwgIjAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEVuZERhdGU9PURhdGVUaW1lLk1heFZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGVuZERhdGUiLCAiOTk5OS0xMi0zMVQwMDowMDowMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGVuZERhdGUiLCBFbmREYXRlLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGF1dG9FbmQiLCAiMCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaXRlbXMgPSBBZGREYXRlR3JvdXBJdGVtcyhncm91cCwgR3JvdXBCeSwgU3RhcnREYXRlLCBFbmREYXRlLCBpbnRlcnZhbCk7CisgICAgICAgICAgICBBZGRGaWVsZEl0ZW1zKGl0ZW1zKTsKKworICAgICAgICAgICAgX2dyb3VwaW5nID0gZ3JvdXA7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAgU2V0TnVtZXJpY0dyb3VwKGRvdWJsZSBzdGFydCwgZG91YmxlIGVuZCwgZG91YmxlIGludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCBncm91cDsKKyAgICAgICAgICAgIGdyb3VwID0gbmV3IEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwKE5hbWVTcGFjZU1hbmFnZXIsIF9jYWNoZUZpZWxkSGVscGVyLlRvcE5vZGUpOworICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZUJvb2woImQ6c2hhcmVkSXRlbXMvQGNvbnRhaW5zTnVtYmVyIiwgdHJ1ZSk7CisgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNJbnRlZ2VyIiwgdHJ1ZSk7CisgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNTZW1pTWl4ZWRUeXBlcyIsIGZhbHNlKTsKKyAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc1N0cmluZyIsIGZhbHNlKTsKKworICAgICAgICAgICAgZ3JvdXAuVG9wTm9kZS5Jbm5lclhtbCArPSBzdHJpbmcuRm9ybWF0KCI8ZmllbGRHcm91cCBiYXNlPVwiezB9XCI+PHJhbmdlUHIgYXV0b1N0YXJ0PVwiMFwiIGF1dG9FbmQ9XCIwXCIgc3RhcnROdW09XCJ7MX1cIiBlbmROdW09XCJ7Mn1cIiBncm91cEludGVydmFsPVwiezN9XCIvPjxncm91cEl0ZW1zIC8+PC9maWVsZEdyb3VwPiIsIEJhc2VJbmRleCwgc3RhcnQuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIGVuZC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwgaW50ZXJ2YWwuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgaW50IGl0ZW1zID0gQWRkTnVtZXJpY0dyb3VwSXRlbXMoZ3JvdXAsIHN0YXJ0LCBlbmQsIGludGVydmFsKTsKKyAgICAgICAgICAgIEFkZEZpZWxkSXRlbXMoaXRlbXMpOworCisgICAgICAgICAgICBfZ3JvdXBpbmcgPSBncm91cDsKKyAgICAgICAgICAgIHJldHVybiBncm91cDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IEFkZE51bWVyaWNHcm91cEl0ZW1zKEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwIGdyb3VwLCBkb3VibGUgc3RhcnQsIGRvdWJsZSBlbmQsIGRvdWJsZSBpbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludGVydmFsIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiVGhlIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIlRoZW4gRW5kIG51bWJlciBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBTdGFydCBudW1iZXIiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFhtbEVsZW1lbnQgZ3JvdXBJdGVtcyA9IGdyb3VwLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpmaWVsZEdyb3VwL2Q6Z3JvdXBJdGVtcyIsIGdyb3VwLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgICAgICBpbnQgaXRlbXMgPSAyOworICAgICAgICAgICAgLy9GaXJzdCBkYXRlCisgICAgICAgICAgICBkb3VibGUgaW5kZXg9c3RhcnQ7CisgICAgICAgICAgICBkb3VibGUgbmV4dEluZGV4PXN0YXJ0K2ludGVydmFsOworICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICI8IiArIHN0YXJ0LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCBzdHJpbmcuRm9ybWF0KCJ7MH0tezF9IiwgaW5kZXguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIG5leHRJbmRleC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpOworICAgICAgICAgICAgICAgIGluZGV4PW5leHRJbmRleDsKKyAgICAgICAgICAgICAgICBuZXh0SW5kZXgrPWludGVydmFsOworICAgICAgICAgICAgICAgIGl0ZW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIj4iICsgbmV4dEluZGV4LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRGaWVsZEl0ZW1zKGludCBpdGVtcykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sRWxlbWVudCBwcmV2Tm9kZSA9IG51bGw7CisgICAgICAgICAgICBYbWxFbGVtZW50IGl0ZW1zTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDppdGVtcyIsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGl0ZW1zOyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGl0ZW1Ob2RlID0gaXRlbXNOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiaXRlbSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICBpdGVtTm9kZS5TZXRBdHRyaWJ1dGUoIngiLCB4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbXNOb2RlLlByZXBlbmRDaGlsZChpdGVtTm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zTm9kZS5JbnNlcnRBZnRlcihpdGVtTm9kZSwgcHJldk5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2Tm9kZSA9IGl0ZW1Ob2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlbXNOb2RlLlNldEF0dHJpYnV0ZSgiY291bnQiLCAoaXRlbXMgKyAxKS5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IEFkZERhdGVHcm91cEl0ZW1zKEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAgZ3JvdXAsIGVEYXRlR3JvdXBCeSBHcm91cEJ5LCBEYXRlVGltZSBTdGFydERhdGUsIERhdGVUaW1lIEVuZERhdGUsIGludCBpbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sRWxlbWVudCBncm91cEl0ZW1zID0gZ3JvdXAuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmZpZWxkR3JvdXAvZDpncm91cEl0ZW1zIiwgZ3JvdXAuTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICAgIGludCBpdGVtcyA9IDI7CisgICAgICAgICAgICAvL0ZpcnN0IGRhdGUKKyAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiPCIgKyBTdGFydERhdGUuVG9TdHJpbmcoInMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKS5TdWJzdHJpbmcoMCwgMTApKTsKKworICAgICAgICAgICAgc3dpdGNoIChHcm91cEJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZURhdGVHcm91cEJ5LlNlY29uZHM6CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuTWludXRlczoKKyAgICAgICAgICAgICAgICAgICAgQWRkVGltZVNlcmllKDYwLCBncm91cEl0ZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMgKz0gNjA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGVHcm91cEJ5LkhvdXJzOgorICAgICAgICAgICAgICAgICAgICBBZGRUaW1lU2VyaWUoMjQsIGdyb3VwSXRlbXMpOworICAgICAgICAgICAgICAgICAgICBpdGVtcyArPSAyNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuRGF5czoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGR0ID0gbmV3IERhdGVUaW1lKDIwMDgsIDEsIDEpOyAvL3BpY2sgYSB5ZWFyIHdpdGggMzY2IGRheXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkdC5ZZWFyID09IDIwMDgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsIGR0LlRvU3RyaW5nKCJkZC1NTU0iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQgPSBkdC5BZGREYXlzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgKz0gMzY2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgZHQgPSBTdGFydERhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZHQgPCBFbmREYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCBkdC5Ub1N0cmluZygiZGQtTU1NIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0ID0gZHQuQWRkRGF5cyhpbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5Nb250aHM6CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiamFuIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiZmViIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAibWFyIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiYXByIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAibWF5Iik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAianVuIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAianVsIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiYXVnIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAic2VwIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAib2N0Iik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAibm92Iik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiZGVjIik7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zICs9IDEyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5RdWFydGVyczoKKyAgICAgICAgICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICJRdHIxIik7CisgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiUXRyMiIpOworICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIlF0cjMiKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICJRdHI0Iik7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgZURhdGVHcm91cEJ5LlllYXJzOgorICAgICAgICAgICAgICAgICAgICBpZihTdGFydERhdGUuWWVhcj49MTkwMCAmJiBFbmREYXRlIT1EYXRlVGltZS5NYXhWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeWVhciA9IFN0YXJ0RGF0ZS5ZZWFyOyB5ZWFyIDw9IEVuZERhdGUuWWVhcjsgeWVhcisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCB5ZWFyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgKz0gRW5kRGF0ZS5ZZWFyIC0gU3RhcnREYXRlLlllYXIrMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgZ3JvdXBpbmciKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vTGFzdGRhdGUKKyAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiPiIgKyBFbmREYXRlLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuU3Vic3RyaW5nKDAsIDEwKSk7CisgICAgICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgQWRkVGltZVNlcmllKGludCBjb3VudCwgWG1sRWxlbWVudCBncm91cEl0ZW1zKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsIHN0cmluZy5Gb3JtYXQoInswOjAwfSIsIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRHcm91cEl0ZW0oWG1sRWxlbWVudCBncm91cEl0ZW1zLCBzdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzID0gZ3JvdXBJdGVtcy5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInMiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgICAgICBzLlNldEF0dHJpYnV0ZSgidiIsIHZhbHVlKTsKKyAgICAgICAgICAgIGdyb3VwSXRlbXMuQXBwZW5kQ2hpbGQocyk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbT4gX2l0ZW1zPW51bGw7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBpdm90dGFibGUgZmllbGQgSXRlbXMuIFVzZWQgZm9yIGdyb3VwaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZTxFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0+IEl0ZW1zCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfaXRlbXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pdGVtcyA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbT4oX3RhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBub2RlIGluIFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6aXRlbXMvL2Q6aXRlbSIsIE5hbWVTcGFjZU1hbmFnZXIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0oTmFtZVNwYWNlTWFuYWdlciwgbm9kZSx0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLlQgPT0gIiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2l0ZW1zLkFkZEludGVybmFsKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKF9ncm91cGluZyBpcyBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cCkKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgIC8vICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIGR0Z3JwID0gKChFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cClfZ3JvdXBpbmcpOworCisgICAgICAgICAgICAgICAgICAgIC8vICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbSBtaW5JdGVtPW51bGwsIG1heEl0ZW09bnVsbDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2l0ZW1zKQorICAgICAgICAgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBpZiAoaXRlbS5YID09IDApCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgbWluSXRlbSA9IGl0ZW07CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBlbHNlIGlmIChtYXhJdGVtID09IG51bGwgfHwgbWF4SXRlbS5YIDwgaXRlbS5YKQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIG1heEl0ZW0gPSBpdGVtOworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vICAgIGlmIChkdGdycC5BdXRvU3RhcnQpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIF9pdGVtcy5fbGlzdC5SZW1vdmUobWluSXRlbSk7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgaWYgKGR0Z3JwLkF1dG9FbmQpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIF9pdGVtcy5fbGlzdC5SZW1vdmUobWF4SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pdGVtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgbnVtYmVyaWMgZ3JvdXBpbmcgdG8gdGhlIGZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU3RhcnQiPlN0YXJ0IHZhbHVlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJFbmQiPkVuZCB2YWx1ZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW50ZXJ2YWwiPkludGVydmFsPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkTnVtZXJpY0dyb3VwaW5nKGRvdWJsZSBTdGFydCwgZG91YmxlIEVuZCwgZG91YmxlIEludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICBWYWxpZGF0ZUdyb3VwaW5nKCk7CisgICAgICAgICAgICBTZXROdW1lcmljR3JvdXAoU3RhcnQsIEVuZCwgSW50ZXJ2YWwpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIGRhdGUgZ3JvdXBpbmcgb24gdGhpcyBmaWVsZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJncm91cEJ5Ij5Hcm91cCBieTwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkgZ3JvdXBCeSkKKyAgICAgICAgeworICAgICAgICAgICAgQWRkRGF0ZUdyb3VwaW5nKGdyb3VwQnksIERhdGVUaW1lLk1pblZhbHVlLCBEYXRlVGltZS5NYXhWYWx1ZSwxKTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgYSBkYXRlIGdyb3VwaW5nIG9uIHRoaXMgZmllbGQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZ3JvdXBCeSI+R3JvdXAgYnk8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXJ0RGF0ZSI+Rml4ZWQgc3RhcnQgZGF0ZS4gVXNlIERhdGVUaW1lLk1pblZhbHVlIGZvciBhdXRvPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmREYXRlIj5GaXhlZCBlbmQgZGF0ZS4gVXNlIERhdGVUaW1lLk1heFZhbHVlIGZvciBhdXRvPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkRGF0ZUdyb3VwaW5nKGVEYXRlR3JvdXBCeSBncm91cEJ5LCBEYXRlVGltZSBzdGFydERhdGUsIERhdGVUaW1lIGVuZERhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZERhdGVHcm91cGluZyhncm91cEJ5LCBzdGFydERhdGUsIGVuZERhdGUsIDEpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIGRhdGUgZ3JvdXBpbmcgb24gdGhpcyBmaWVsZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXlzIj5OdW1iZXIgb2YgZGF5cyB3aGVuIGdyb3VwaW5nIG9uIGRheXM8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXJ0RGF0ZSI+Rml4ZWQgc3RhcnQgZGF0ZS4gVXNlIERhdGVUaW1lLk1pblZhbHVlIGZvciBhdXRvPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbmREYXRlIj5GaXhlZCBlbmQgZGF0ZS4gVXNlIERhdGVUaW1lLk1heFZhbHVlIGZvciBhdXRvPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgQWRkRGF0ZUdyb3VwaW5nKGludCBkYXlzLCBEYXRlVGltZSBzdGFydERhdGUsIERhdGVUaW1lIGVuZERhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkuRGF5cywgc3RhcnREYXRlLCBlbmREYXRlLCBkYXlzKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgQWRkRGF0ZUdyb3VwaW5nKGVEYXRlR3JvdXBCeSBncm91cEJ5LCBEYXRlVGltZSBzdGFydERhdGUsIERhdGVUaW1lIGVuZERhdGUsIGludCBncm91cEludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ3JvdXBJbnRlcnZhbCA8IDEgfHwgZ3JvdXBJbnRlcnZhbCA+PSBJbnQxNi5NYXhWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiR3JvdXAgaW50ZXJ2YWwgaXMgb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdyb3VwSW50ZXJ2YWwgPiAxICYmIGdyb3VwQnkgIT0gZURhdGVHcm91cEJ5LkRheXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiR3JvdXAgaW50ZXJ2YWwgaXMgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIGdyb3VwQnkgaXMgRGF5cyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZhbGlkYXRlR3JvdXBpbmcoKTsKKworICAgICAgICAgICAgYm9vbCBmaXJzdEZpZWxkID0gdHJ1ZTsgICAgICAgICAgICAKKyAgICAgICAgICAgIExpc3Q8RXhjZWxQaXZvdFRhYmxlRmllbGQ+IGZpZWxkcz1uZXcgTGlzdDxFeGNlbFBpdm90VGFibGVGaWVsZD4oKTsKKyAgICAgICAgICAgIC8vU2Vjb25kcworICAgICAgICAgICAgaWYgKChncm91cEJ5ICYgZURhdGVHcm91cEJ5LlNlY29uZHMpID09IGVEYXRlR3JvdXBCeS5TZWNvbmRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5LlNlY29uZHMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vTWludXRlcworICAgICAgICAgICAgaWYgKChncm91cEJ5ICYgZURhdGVHcm91cEJ5Lk1pbnV0ZXMpID09IGVEYXRlR3JvdXBCeS5NaW51dGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5Lk1pbnV0ZXMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vSG91cnMKKyAgICAgICAgICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5Ib3VycykgPT0gZURhdGVHcm91cEJ5LkhvdXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5LkhvdXJzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0RheXMKKyAgICAgICAgICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5EYXlzKSA9PSBlRGF0ZUdyb3VwQnkuRGF5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5EYXlzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkLCBncm91cEludGVydmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL01vbnRoCisgICAgICAgICAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuTW9udGhzKSA9PSBlRGF0ZUdyb3VwQnkuTW9udGhzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5Lk1vbnRocywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9RdWFydGVycworICAgICAgICAgICAgaWYgKChncm91cEJ5ICYgZURhdGVHcm91cEJ5LlF1YXJ0ZXJzKSA9PSBlRGF0ZUdyb3VwQnkuUXVhcnRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRzLkFkZChBZGRGaWVsZChlRGF0ZUdyb3VwQnkuUXVhcnRlcnMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vWWVhcnMKKyAgICAgICAgICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5ZZWFycykgPT0gZURhdGVHcm91cEJ5LlllYXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5LlllYXJzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWVsZHMuQ291bnQgPiAxKSBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJkOmZpZWxkR3JvdXAvQHBhciIsIChfdGFibGUuRmllbGRzLkNvdW50IC0gMSkuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoZ3JvdXBJbnRlcnZhbCAhPSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGdyb3VwSW50ZXJ2YWwiLCBncm91cEludGVydmFsLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLkRlbGV0ZU5vZGUoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGdyb3VwSW50ZXJ2YWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pdGVtcyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVHcm91cGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKElzQ29sdW1uRmllbGQgfHwgSXNSb3dGaWVsZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkZpZWxkIG11c3QgYmUgYSByb3cgb3IgY29sdW1uIGZpZWxkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpZWxkIGluIF90YWJsZS5GaWVsZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLkdyb3VwaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiR3JvdXBpbmcgYWxyZWFkeSBleGlzdHMiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgRXhjZWxQaXZvdFRhYmxlRmllbGQgQWRkRmllbGQoZURhdGVHcm91cEJ5IGdyb3VwQnksIERhdGVUaW1lIHN0YXJ0RGF0ZSwgRGF0ZVRpbWUgZW5kRGF0ZSwgcmVmICBib29sIGZpcnN0RmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRGaWVsZChncm91cEJ5LCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkLDEpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgRXhjZWxQaXZvdFRhYmxlRmllbGQgQWRkRmllbGQoZURhdGVHcm91cEJ5IGdyb3VwQnksIERhdGVUaW1lIHN0YXJ0RGF0ZSwgRGF0ZVRpbWUgZW5kRGF0ZSwgcmVmICBib29sIGZpcnN0RmllbGQsIGludCBpbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0RmllbGQgPT0gZmFsc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9QaXZvdCBmaWVsZAorICAgICAgICAgICAgICAgIHZhciB0b3BOb2RlID0gX3RhYmxlLlBpdm90VGFibGVYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnBpdm90RmllbGRzIiwgX3RhYmxlLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgICAgIHZhciBmaWVsZE5vZGUgPSBfdGFibGUuUGl2b3RUYWJsZVhtbC5DcmVhdGVFbGVtZW50KCJwaXZvdEZpZWxkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCAiMCIpOworICAgICAgICAgICAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoIm91dGxpbmUiLCAiMCIpOworICAgICAgICAgICAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoInNob3dBbGwiLCAiMCIpOworICAgICAgICAgICAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoImRlZmF1bHRTdWJ0b3RhbCIsICIwIik7CisgICAgICAgICAgICAgICAgdG9wTm9kZS5BcHBlbmRDaGlsZChmaWVsZE5vZGUpOworCisgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IEV4Y2VsUGl2b3RUYWJsZUZpZWxkKF90YWJsZS5OYW1lU3BhY2VNYW5hZ2VyLCBmaWVsZE5vZGUsIF90YWJsZSwgX3RhYmxlLkZpZWxkcy5Db3VudCwgSW5kZXgpOworICAgICAgICAgICAgICAgIGZpZWxkLkRhdGVHcm91cGluZyA9IGdyb3VwQnk7CisKKyAgICAgICAgICAgICAgICBYbWxOb2RlIHJvd0NvbEZpZWxkczsKKyAgICAgICAgICAgICAgICBpZiAoSXNSb3dGaWVsZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvd0NvbEZpZWxkcz1Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6cm93RmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvd0NvbEZpZWxkcyA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpjb2xGaWVsZHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgZmllbGRJbmRleCwgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgcm93ZmllbGQgaW4gcm93Q29sRmllbGRzLkNoaWxkTm9kZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHJvd2ZpZWxkLkdldEF0dHJpYnV0ZSgieCIpLCBvdXQgZmllbGRJbmRleCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGFibGUuRmllbGRzW2ZpZWxkSW5kZXhdLkJhc2VJbmRleCA9PSBCYXNlSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSByb3dDb2xGaWVsZHMuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJmaWVsZCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LlNldEF0dHJpYnV0ZSgieCIsIGZpZWxkLkluZGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvbEZpZWxkcy5JbnNlcnRCZWZvcmUobmV3RWxlbWVudCwgcm93ZmllbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKElzUm93RmllbGQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGFibGUuUm93RmllbGRzLkluc2VydChmaWVsZCwgaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGFibGUuQ29sdW1uRmllbGRzLkluc2VydChmaWVsZCwgaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBfdGFibGUuRmllbGRzLkFkZEludGVybmFsKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIEFkZENhY2hlRmllbGQoZmllbGQsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgaW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdEZpZWxkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgRGF0ZUdyb3VwaW5nID0gZ3JvdXBCeTsKKyAgICAgICAgICAgICAgICBDb21wYWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU2V0RGF0ZUdyb3VwKGdyb3VwQnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgaW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRDYWNoZUZpZWxkKEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkLCBEYXRlVGltZSBzdGFydERhdGUsIERhdGVUaW1lIGVuZERhdGUsIGludCBpbnRlcnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9BZGQgQ2FjaGUgZGVmaW5pdGlvbiBmaWVsZC4KKyAgICAgICAgICAgIHZhciBjYWNoZVRvcE5vZGUgPSBfdGFibGUuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y2FjaGVGaWVsZHMiLCBfdGFibGUuTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICB2YXIgY2FjaGVGaWVsZE5vZGUgPSBfdGFibGUuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5DcmVhdGVFbGVtZW50KCJjYWNoZUZpZWxkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworCisgICAgICAgICAgICBjYWNoZUZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBmaWVsZC5EYXRlR3JvdXBpbmcuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBjYWNoZUZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoImRhdGFiYXNlRmllbGQiLCAiMCIpOworICAgICAgICAgICAgY2FjaGVUb3BOb2RlLkFwcGVuZENoaWxkKGNhY2hlRmllbGROb2RlKTsKKyAgICAgICAgICAgIGZpZWxkLlNldENhY2hlRmllbGROb2RlKGNhY2hlRmllbGROb2RlKTsKKworICAgICAgICAgICAgZmllbGQuU2V0RGF0ZUdyb3VwKGZpZWxkLkRhdGVHcm91cGluZywgc3RhcnREYXRlLCBlbmREYXRlLCBpbnRlcnZhbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3MzZjZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbi5jcwpAQCAtMCwwICsxLDMyMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFzZSBjb2xsZWN0aW9uIGNsYXNzIGZvciBwaXZvdHRhYmxlIGZpZWxkcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbkJhc2U8VD4gOiBJRW51bWVyYWJsZTxUPgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VsUGl2b3RUYWJsZSBfdGFibGU7CisgICAgICAgIGludGVybmFsIExpc3Q8VD4gX2xpc3QgPSBuZXcgTGlzdDxUPigpOworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3RhYmxlID0gdGFibGU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZEludGVybmFsKFQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0LkFkZChmaWVsZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0LkNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFQgdGhpc1tpbnQgSW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDAgfHwgSW5kZXggPj0gX2xpc3QuQ291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiSW5kZXggb3V0IG9mIHJhbmdlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24gOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkPgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSwgc3RyaW5nIHRvcE5vZGUpIDoKKyAgICAgICAgICAgIGJhc2UodGFibGUpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluZGV4ZXIgYnkgbmFtZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZCB0aGlzW3N0cmluZyBuYW1lXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmllbGQgaW4gX2xpc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuTmFtZS5FcXVhbHMobmFtZSxTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybnMgdGhlIGRhdGUgZ3JvdXAgZmllbGQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iR3JvdXBCeSI+VGhlIHR5cGUgb2YgZ3JvdXBpbmc8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG1hdGNoaW5nIGZpZWxkLiBJZiBub25lIGlzIGZvdW5kIG51bGwgaXMgcmV0dXJuZWQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZCBHZXREYXRlR3JvdXBGaWVsZChlRGF0ZUdyb3VwQnkgR3JvdXBCeSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZsZCBpbiBfbGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLkdyb3VwaW5nIGlzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwICYmICgoKEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwKWZsZC5Hcm91cGluZykuR3JvdXBCeSkgPT0gR3JvdXBCeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtZXJpYyBncm91cCBmaWVsZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBtYXRjaGluZyBmaWVsZC4gSWYgbm9uZSBpcyBmb3VuZCBudWxsIGlzIHJldHVybmVkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgR2V0TnVtZXJpY0dyb3VwRmllbGQoKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZmxkIGluIF9saXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmbGQuR3JvdXBpbmcgaXMgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ29sbGVjdGlvbiBjbGFzcyBmb3IgUm93IGFuZCBjb2x1bW4gZmllbGRzIGluIGEgUGl2b3R0YWJsZSAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkPgorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIF90b3BOb2RlOworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24oRXhjZWxQaXZvdFRhYmxlIHRhYmxlLCBzdHJpbmcgdG9wTm9kZSkgOgorICAgICAgICAgICAgYmFzZSh0YWJsZSkKKwkgICAgeworICAgICAgICAgICAgX3RvcE5vZGU9dG9wTm9kZTsKKwkgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBhIG5ldyByb3cvY29sdW1uIGZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRmllbGQiPlRoZSBmaWVsZDwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbmV3IGZpZWxkPC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgQWRkKEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRGbGFnKEZpZWxkLCB0cnVlKTsKKyAgICAgICAgICAgIF9saXN0LkFkZChGaWVsZCk7CisgICAgICAgICAgICByZXR1cm4gRmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5zZXJ0IGEgbmV3IHJvdy9jb2x1bW4gZmllbGQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGaWVsZCI+VGhlIGZpZWxkPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+VGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgZmllbGQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5ldyBmaWVsZDwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGQgSW5zZXJ0KEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEZpZWxkLCBpbnQgSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldEZsYWcoRmllbGQsIHRydWUpOworICAgICAgICAgICAgX2xpc3QuSW5zZXJ0KEluZGV4LCBGaWVsZCk7CisgICAgICAgICAgICByZXR1cm4gRmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEZsYWcoRXhjZWxQaXZvdFRhYmxlRmllbGQgZmllbGQsIGJvb2wgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX3RvcE5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAicm93RmllbGRzIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzQ29sdW1uRmllbGQgfHwgZmllbGQuSXNQYWdlRmllbGQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIlRoaXMgZmllbGQgaXMgYSBjb2x1bW4gb3IgcGFnZSBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBSb3dGaWVsZHMgY29sbGVjdGlvbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaWVsZC5Jc1Jvd0ZpZWxkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuUm93OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJjb2xGaWVsZHMiOgorICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSb3dGaWVsZCB8fCBmaWVsZC5Jc1BhZ2VGaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIlRoaXMgZmllbGQgaXMgYSByb3cgb3IgcGFnZSBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBDb2x1bW5GaWVsZHMgY29sbGVjdGlvbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaWVsZC5Jc0NvbHVtbkZpZWxkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuQ29sdW1uOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJwYWdlRmllbGRzIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzQ29sdW1uRmllbGQgfHwgZmllbGQuSXNSb3dGaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkZpZWxkIGlzIGEgY29sdW1uIG9yIHJvdyBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBQYWdlRmllbGRzIGNvbGxlY3Rpb24iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF90YWJsZS5BZGRyZXNzLl9mcm9tUm93IDwgMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJBIHBpdm90IHRhYmxlIHdpdGggcGFnZSBmaWVsZHMgbXVzdCBiZSBsb2NhdGVkIGFib3ZlIHJvdyAzLiBDdXJyZW5jdCBsb2NhdGlvbiBpcyB7MH0iLCBfdGFibGUuQWRkcmVzcy5BZGRyZXNzKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpZWxkLklzUGFnZUZpZWxkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuUGFnZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiZGF0YUZpZWxkcyI6CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmUgYSBmaWVsZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZpZWxkIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxQaXZvdFRhYmxlRmllbGQgRmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFfbGlzdC5Db250YWlucyhGaWVsZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBub3QgaW4gY29sbGVjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0RmxhZyhGaWVsZCwgZmFsc2UpOyAgICAgICAgICAgIAorICAgICAgICAgICAgX2xpc3QuUmVtb3ZlKEZpZWxkKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmUgYSBmaWVsZCBhdCBhIHNwZWNpZmljIHBvc2l0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEluZGV4ID4gLTEgJiYgSW5kZXggPCBfbGlzdC5Db3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0RmxhZyhfbGlzdFtJbmRleF0sIGZhbHNlKTsKKyAgICAgICAgICAgIF9saXN0LlJlbW92ZUF0KEluZGV4KTsgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIGRhdGEgZmllbGRzIGluIGEgUGl2b3R0YWJsZSAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uIDogRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZTxFeGNlbFBpdm90VGFibGVEYXRhRmllbGQ+CisgICAgeworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSkgOgorICAgICAgICAgICAgYmFzZSh0YWJsZSkKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkIGEgbmV3IGRhdGFmaWVsZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpZWxkIj5UaGUgZmllbGQ8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5ldyBkYXRhZmllbGQ8L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgQWRkKEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGF0YUZpZWxkc05vZGUgPSBmaWVsZC5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6ZGF0YUZpZWxkcyIsIGZpZWxkLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgaWYgKGRhdGFGaWVsZHNOb2RlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RhYmxlLkNyZWF0ZU5vZGUoImQ6ZGF0YUZpZWxkcyIpOworICAgICAgICAgICAgICAgIGRhdGFGaWVsZHNOb2RlID0gZmllbGQuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOmRhdGFGaWVsZHMiLCBmaWVsZC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgWG1sRWxlbWVudCBub2RlID0gX3RhYmxlLlBpdm90VGFibGVYbWwuQ3JlYXRlRWxlbWVudCgiZGF0YUZpZWxkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOworICAgICAgICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoImZsZCIsIGZpZWxkLkluZGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgZGF0YUZpZWxkc05vZGUuQXBwZW5kQ2hpbGQobm9kZSk7CisKKyAgICAgICAgICAgIC8vWG1sRWxlbWVudCBub2RlID0gZmllbGQuQXBwZW5kRmllbGQoZGF0YUZpZWxkc05vZGUsIGZpZWxkLkluZGV4LCAiZGF0YUZpZWxkIiwgImZsZCIpOworICAgICAgICAgICAgZmllbGQuU2V0WG1sTm9kZUJvb2woIkBkYXRhRmllbGQiLCB0cnVlLGZhbHNlKTsKKworICAgICAgICAgICAgdmFyIGRhdGFGaWVsZCA9IG5ldyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGQoZmllbGQuTmFtZVNwYWNlTWFuYWdlciwgbm9kZSwgZmllbGQpOworICAgICAgICAgICAgVmFsaWRhdGVEdXBOYW1lKGRhdGFGaWVsZCk7CisKKyAgICAgICAgICAgIF9saXN0LkFkZChkYXRhRmllbGQpOworICAgICAgICAgICAgcmV0dXJuIGRhdGFGaWVsZDsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVEdXBOYW1lKEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZCBkYXRhRmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKEV4aXN0c0RmTmFtZShkYXRhRmllbGQuRmllbGQuTmFtZSwgbnVsbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMjsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGRhdGFGaWVsZC5GaWVsZC5OYW1lICsgIl8iICsgaW5kZXgrKy5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoRXhpc3RzRGZOYW1lKG5hbWUsbnVsbCkpOworICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzRGZOYW1lKHN0cmluZyBuYW1lLCBFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgZGF0YWZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGYgaW4gX2xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgoIXN0cmluZy5Jc051bGxPckVtcHR5KGRmLk5hbWUpICYmIGRmLk5hbWUuRXF1YWxzKG5hbWUsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZGYuTmFtZSkgJiYgZGYuRmllbGQuTmFtZS5FcXVhbHMobmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpKSkgJiYgZGF0YWZpZWxkICE9IGRmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZSBhIGRhdGFmaWVsZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGFGaWVsZCI+PC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZCBkYXRhRmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9IGRhdGFGaWVsZC5GaWVsZC5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpkYXRhRmllbGRzL2Q6ZGF0YUZpZWxkW0BmbGQ9ezB9XSIsIGRhdGFGaWVsZC5JbmRleCksIGRhdGFGaWVsZC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbGlzdC5SZW1vdmUoZGF0YUZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwLmNzIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWMwOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cC5jcwpAQCAtMCwwICsxLDE2MCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHBpdm90IHRhYmxlIGZpZWxkIGdyb3VwcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAgOiBYbWxIZWxwZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgZGF0ZSBncm91cAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIDogRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cAorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXAoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlKSA6CisgICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RyaW5nIGdyb3VwQnlQYXRoID0gImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGdyb3VwQnkiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIb3cgdG8gZ3JvdXAgdGhlIGRhdGUgZmllbGQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVEYXRlR3JvdXBCeSBHcm91cEJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZyhncm91cEJ5UGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVEYXRlR3JvdXBCeSlFbnVtLlBhcnNlKHR5cGVvZihlRGF0ZUdyb3VwQnkpLCB2LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkludmFsaWQgZGF0ZSBHcm91cGJ5IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhncm91cEJ5UGF0aCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBdXRvIGRldGVjdCBzdGFydCBkYXRlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBib29sIEF1dG9TdGFydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBhdXRvU3RhcnQiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQXV0byBkZXRlY3QgZW5kIGRhdGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgQXV0b0VuZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBhdXRvU3RhcnQiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHBpdm90IHRhYmxlIGZpZWxkIG51bWVyaWMgZ3JvdXBpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCA6IEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAKKyAgICB7CisgICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkgOgorICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBzdGFydFBhdGggPSAiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9Ac3RhcnROdW0iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdGFydCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgZG91YmxlIFN0YXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlKUdldFhtbE5vZGVEb3VibGVOdWxsKHN0YXJ0UGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc3RhcnRQYXRoLHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcgZW5kUGF0aCA9ICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BlbmROdW0iOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBFbmQgdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBFbmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpR2V0WG1sTm9kZURvdWJsZU51bGwoZW5kUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoZW5kUGF0aCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyBncm91cEludGVydmFsUGF0aCA9ICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEludGVydmFsIjsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZXJ2YWwKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGRvdWJsZSBJbnRlcnZhbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSlHZXRYbWxOb2RlRG91YmxlTnVsbChncm91cEludGVydmFsUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoZ3JvdXBJbnRlcnZhbFBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbS5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE1MDdlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtLmNzCkBAIC0wLDAgKzEsOTIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBmaWVsZCBJdGVtLiBVc2VkIGZvciBncm91cGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbSA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgRXhjZWxQaXZvdFRhYmxlRmllbGQgX2ZpZWxkOworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCkgOgorICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICBfZmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdGV4dC4gVW5pcXVlIHZhbHVlcyBvbmx5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoIkBuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2ZpZWxkLkl0ZW1zKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uVGV4dCA9PSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEdXBsaWNhdGUgVGV4dCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbiIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgWAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQHgiKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncy5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNWJhODUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncy5jcwpAQCAtMCwwICsxLDExOCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKKyAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlhtbDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBwYWdlIC8gcmVwb3J0IGZpbHRlciBmaWVsZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzICA6IFhtbEhlbHBlcgorICAgIHsKKyAgICAgICAgRXhjZWxQaXZvdFRhYmxlRmllbGQgX2ZpZWxkOworICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkLCBpbnQgaW5kZXgpIDoKKyAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChHZXRYbWxOb2RlU3RyaW5nKCJAaGllciIpPT0iIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIaWVyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZmllbGQgPSBmaWVsZDsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgSW5kZXggCisgICAgICAgIHsgCisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGZsZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGZsZCIsdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIE5hbWUgb2YgdGhlIGZpZWxkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQG5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKioqKiBEb250IHdvcmsuIE5lZWQgaXRlbXMgdG8gYmUgcG9wdWxhdGVkLiAqKioqLworICAgICAgICAvLy8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vLy8gVGhlIHNlbGVjdGVkIGl0ZW0gCisgICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy9wdWJsaWMgaW50IFNlbGVjdGVkSXRlbQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZ2V0CisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAaXRlbSIpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHNldAorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBpZiAodmFsdWUgPCAwKSB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgLy8gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBpdGVtIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy99CisgICAgICAgIGludGVybmFsIGludCBOdW1GbXRJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQG51bUZtdElkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbnVtRm10SWQiLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBpbnQgSGllcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGhpZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBoaWVyIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvQWRkcmVzc1V0aWxpdHkuY3MgYi9FUFBsdXMvVXRpbHMvQWRkcmVzc1V0aWxpdHkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxYzhmYwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9VdGlscy9BZGRyZXNzVXRpbGl0eS5jcwpAQCAtMCwwICsxLDI5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGRyZXNzVXRpbGl0eQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUGFyc2VFbnRpcmVDb2x1bW5TZWxlY3Rpb25zKHN0cmluZyBhZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcGFyc2VkQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IFJlZ2V4Lk1hdGNoZXMoYWRkcmVzcywgIltBLVpdKzpbQS1aXSsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKE1hdGNoIG1hdGNoIGluIG1hdGNoZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkUm93TnVtYmVyc1RvRW50aXJlQ29sdW1uUmFuZ2UocmVmIHBhcnNlZEFkZHJlc3MsIG1hdGNoLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXJzZWRBZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRSb3dOdW1iZXJzVG9FbnRpcmVDb2x1bW5SYW5nZShyZWYgc3RyaW5nIGFkZHJlc3MsIHN0cmluZyByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnNlZFJhbmdlID0gc3RyaW5nLkZvcm1hdCgiezB9ezF9IiwgcmFuZ2UsIEV4Y2VsUGFja2FnZS5NYXhSb3dzKTsKKyAgICAgICAgICAgIHZhciBzcGxpdEFyciA9IHBhcnNlZFJhbmdlLlNwbGl0KG5ldyBjaGFyW10geyAnOicgfSk7CisgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5SZXBsYWNlKHJhbmdlLCBzdHJpbmcuRm9ybWF0KCJ7MH0xOnsxfSIsIHNwbGl0QXJyWzBdLCBzcGxpdEFyclsxXSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL0FyZ3VtZW50LmNzIGIvRVBQbHVzL1V0aWxzL0FyZ3VtZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjBhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVXRpbHMvQXJndW1lbnQuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5VdGlscworeworICAgIGludGVybmFsIGNsYXNzIEFyZ3VtZW50PFQ+IDogSUFyZ3VtZW50PFQ+CisgICAgeworICAgICAgICBwdWJsaWMgQXJndW1lbnQoVCBAdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF92YWx1ZSA9IEB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVCBfdmFsdWU7CisKKyAgICAgICAgVCBJQXJndW1lbnQ8VD4uVmFsdWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZTsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL0FyZ3VtZW50RXh0ZW5zaW9ucy5jcyBiL0VQUGx1cy9VdGlscy9Bcmd1bWVudEV4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkZDZjNAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9VdGlscy9Bcmd1bWVudEV4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSw5NSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBFeHRlbnNpb24gbWV0aG9kcyBmb3IgZ3VhcmRpbmcKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJndW1lbnRFeHRlbnNpb25zCisgICAgeworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRocm93cyBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaWYgYXJndW1lbnQgaXMgbnVsbAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5Bcmd1bWVudCB0eXBlPC90eXBlcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnQiPkFyZ3VtZW50IHRvIGNoZWNrPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudE5hbWUiPnBhcmFtZXRlci9hcmd1bWVudCBuYW1lPC9wYXJhbT4KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIElzTm90TnVsbDxUPih0aGlzIElBcmd1bWVudDxUPiBhcmd1bWVudCwgc3RyaW5nIGFyZ3VtZW50TmFtZSkKKyAgICAgICAgICAgIHdoZXJlIFQgOiBjbGFzcworICAgICAgICB7CisgICAgICAgICAgICBhcmd1bWVudE5hbWUgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhcmd1bWVudE5hbWUpID8gInZhbHVlIiA6IGFyZ3VtZW50TmFtZTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudC5WYWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oYXJndW1lbnROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRocm93cyBhbiA8c2VlIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiIvPiBpZiB0aGUgc3RyaW5nIGFyZ3VtZW50IGlzIG51bGwgb3IgZW1wdHkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudCI+QXJndW1lbnQgdG8gY2hlY2s8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50TmFtZSI+cGFyYW1ldGVyL2FyZ3VtZW50IG5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgSXNOb3ROdWxsT3JFbXB0eSh0aGlzIElBcmd1bWVudDxzdHJpbmc+IGFyZ3VtZW50LCBzdHJpbmcgYXJndW1lbnROYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYXJndW1lbnQuVmFsdWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oYXJndW1lbnROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRocm93cyBhbiBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gaWYgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBvdXQgb2YgdGhlIHN1cHBsaWVkIHJhbmdlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlR5cGUgaW1wbGVtZW50aW5nIDxzZWUgY3JlZj0iSUNvbXBhcmFibGUiLz48L3R5cGVwYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudCI+VGhlIGFyZ3VtZW50IHRvIGNoZWNrPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtaW4iPk1pbiB2YWx1ZSBvZiB0aGUgc3VwcGxpZWQgcmFuZ2U8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1heCI+TWF4IHZhbHVlIG9mIHRoZSBzdXBwbGllZCByYW5nZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnROYW1lIj5wYXJhbWV0ZXIvYXJndW1lbnQgbmFtZTwvcGFyYW0+CisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+PC9leGNlcHRpb24+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc0luUmFuZ2U8VD4odGhpcyBJQXJndW1lbnQ8VD4gYXJndW1lbnQsIFQgbWluLCBUIG1heCwgc3RyaW5nIGFyZ3VtZW50TmFtZSkKKyAgICAgICAgICAgIHdoZXJlIFQgOiBJQ29tcGFyYWJsZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShhcmd1bWVudC5WYWx1ZS5Db21wYXJlVG8obWluKSA+PSAwICYmIGFyZ3VtZW50LlZhbHVlLkNvbXBhcmVUbyhtYXgpIDw9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oYXJndW1lbnROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9Db21wb3VuZERvY3VtZW50LmNzIGIvRVBQbHVzL1V0aWxzL0NvbXBvdW5kRG9jdW1lbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjNGNlMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9VdGlscy9Db21wb3VuZERvY3VtZW50LmNzCkBAIC0wLDAgKzEsNzU1IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTAxLTAxLTIwMTIKKyAqIEphbiBLw6RsbG1hbiAgICAgIEFkZGVkIGNvbXByZXNzaW9uIHN1cHBvcnQgMjctMDMtMjAxMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Cit1c2luZyBjb21UeXBlcyA9IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKK3sKKyNpZiAhTU9OTworICAgIGludGVybmFsIGNsYXNzIENvbXBvdW5kRG9jdW1lbnQKKyAgICB7ICAgICAgICAKKyAgICAgICAgaW50ZXJuYWwgY2xhc3MgU3RvcmFnZVBhcnQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFN0b3JhZ2VQYXJ0KCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50ZXJuYWwgRGljdGlvbmFyeTxzdHJpbmcsIFN0b3JhZ2VQYXJ0PiBTdWJTdG9yYWdlID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBTdG9yYWdlUGFydD4oKTsKKyAgICAgICAgICAgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBieXRlW10+IERhdGFTdHJlYW1zID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBieXRlW10+KCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgU3RvcmFnZVBhcnQgU3RvcmFnZSA9IG51bGw7CisgICAgICAgIGludGVybmFsIENvbXBvdW5kRG9jdW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBTdG9yYWdlID0gbmV3IENvbXBvdW5kRG9jdW1lbnQuU3RvcmFnZVBhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBDb21wb3VuZERvY3VtZW50KEZpbGVJbmZvIGZpKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkKGZpKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBDb21wb3VuZERvY3VtZW50KElMb2NrQnl0ZXMgbGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWQobGIpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIENvbXBvdW5kRG9jdW1lbnQoYnl0ZVtdIGRvYykKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZChkb2MpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsIHZvaWQgUmVhZChGaWxlSW5mbyBmaSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGIgPSBGaWxlLlJlYWRBbGxCeXRlcyhmaS5GdWxsTmFtZSk7CisgICAgICAgICAgICBSZWFkKGIpOworICAgICAgICB9CisgICAgICAgIFtTZWN1cml0eVNhZmVDcml0aWNhbF0KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBSZWFkKGJ5dGVbXSBkb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIElMb2NrQnl0ZXMgbGI7CisgICAgICAgICAgICB2YXIgaXJldCA9IENyZWF0ZUlMb2NrQnl0ZXNPbkhHbG9iYWwoSW50UHRyLlplcm8sIHRydWUsIG91dCBsYik7CisKKyAgICAgICAgICAgIEludFB0ciBidWZmZXIgPSBNYXJzaGFsLkFsbG9jSEdsb2JhbChkb2MuTGVuZ3RoKTsKKyAgICAgICAgICAgIE1hcnNoYWwuQ29weShkb2MsIDAsIGJ1ZmZlciwgZG9jLkxlbmd0aCk7CisgICAgICAgICAgICBVSW50UHRyIHJlYWRTaXplOworICAgICAgICAgICAgbGIuV3JpdGVBdCgwLCBidWZmZXIsIGRvYy5MZW5ndGgsIG91dCByZWFkU2l6ZSk7CisgICAgICAgICAgICBNYXJzaGFsLkZyZWVIR2xvYmFsKGJ1ZmZlcik7CisKKyAgICAgICAgICAgIFJlYWQobGIpOworICAgICAgICB9CisKKyAgICAgICAgW1NlY3VyaXR5U2FmZUNyaXRpY2FsXQorICAgICAgICBpbnRlcm5hbCB2b2lkIFJlYWQoSUxvY2tCeXRlcyBsYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN0Z0lzU3RvcmFnZUlMb2NrQnl0ZXMobGIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVN0b3JhZ2Ugc3RvcmFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFN0Z09wZW5TdG9yYWdlT25JTG9ja0J5dGVzKAorICAgICAgICAgICAgICAgICAgICBsYiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgU1RHTS5ESVJFQ1QgfCBTVEdNLlJFQUQgfCBTVEdNLlNIQVJFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgSW50UHRyLlplcm8sCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIG91dCBzdG9yYWdlKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RvcmFnZSA9IG5ldyBTdG9yYWdlUGFydCgpOworICAgICAgICAgICAgICAgICAgICBSZWFkUGFydHMoc3RvcmFnZSwgU3RvcmFnZSk7CisgICAgICAgICAgICAgICAgICAgIE1hcnNoYWwuUmVsZWFzZUNvbU9iamVjdChzdG9yYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJQYXJ0IGlzIG5vdCBhIGNvbXBvdW5kIGRvY3VtZW50IikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uICBDb21wcmVzc2lvbgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb21wcmVzc2lvbiB1c2luZyBhIHJ1biBsZW5ndGggZW5jb2RpbmcgYWxnb3JpdGhtLgorICAgICAgICAvLy8gU2VlIE1TLU9WQkEgU2VjdGlvbiAyLjQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXJ0Ij5CeXRlIGFycmF5IHRvIGRlY29tcHJlc3M8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENvbXByZXNzUGFydChieXRlW10gcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSg0MDk2KTsKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBiciA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOworICAgICAgICAgICAgYnIuV3JpdGUoKGJ5dGUpMSk7CisKKyAgICAgICAgICAgIGludCBjb21wU3RhcnQgPSAxOworICAgICAgICAgICAgaW50IGNvbXBFbmQgPSA0MDk4OworICAgICAgICAgICAgaW50IGRlY29tcFN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGludCBkZWNvbXBFbmQgPSBwYXJ0Lkxlbmd0aCA8IDQwOTYgPyBwYXJ0Lkxlbmd0aCA6IDQwOTY7CisKKyAgICAgICAgICAgIHdoaWxlIChkZWNvbXBTdGFydCA8IGRlY29tcEVuZCAmJiBjb21wU3RhcnQgPCBjb21wRW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBjaHVuayA9IENvbXByZXNzQ2h1bmsocGFydCwgcmVmIGRlY29tcFN0YXJ0KTsKKyAgICAgICAgICAgICAgICB1c2hvcnQgaGVhZGVyOworICAgICAgICAgICAgICAgIGlmIChjaHVuayA9PSBudWxsIHx8IGNodW5rLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gNDA5NiB8IDB4NjAwOyAgLy9CPTAxMSBBPTAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gKHVzaG9ydCkoKChjaHVuay5MZW5ndGggLSAxKSAmIDB4RkZGKSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlciB8PSAweEIwMDA7ICAgLy9CPTAxMSBBPTEKKyAgICAgICAgICAgICAgICAgICAgYnIuV3JpdGUoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnIuV3JpdGUoY2h1bmspOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlY29tcEVuZCA9IHBhcnQuTGVuZ3RoIDwgZGVjb21wU3RhcnQgKyA0MDk2ID8gcGFydC5MZW5ndGggOiBkZWNvbXBTdGFydCs0MDk2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyLkZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIENvbXByZXNzQ2h1bmsoYnl0ZVtdIGJ1ZmZlciwgcmVmIGludCBzdGFydFBvcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbXByQnVmZmVyPW5ldyBieXRlWzQwOTZdOworICAgICAgICAgICAgaW50IGZsYWdQb3MgPSAwOworICAgICAgICAgICAgaW50IGNQb3M9MTsKKyAgICAgICAgICAgIGludCBkUG9zID0gc3RhcnRQb3M7CisgICAgICAgICAgICBpbnQgZEVuZD1zdGFydFBvcys0MDk2IDwgYnVmZmVyLkxlbmd0aD8gc3RhcnRQb3MrNDA5NiA6IGJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICB3aGlsZShkUG9zPGRFbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSB0b2tlbkZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkUG9zIC0gc3RhcnRQb3MgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdENhbmRpZGF0ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlc3RMZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbmRpZGF0ZSA9IGRQb3MgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdENvdW50ID0gR2V0TGVuZ3RoQml0cyhkUG9zLXN0YXJ0UG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzID0gKDE2IC0gYml0Q291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGxlbmd0aE1hc2sgPSAodXNob3J0KSgoMHhGRkZGKSA+PiBiaXRzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNhbmRpZGF0ZSA+PSBzdGFydFBvcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW2NhbmRpZGF0ZV0gPT0gYnVmZmVyW2RQb3NdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZmZlci5MZW5ndGggPiBkUG9zICsgbGVuZ3RoICYmIGJ1ZmZlcltjYW5kaWRhdGUgKyBsZW5ndGhdID09IGJ1ZmZlcltkUG9zICsgbGVuZ3RoXSAmJiBsZW5ndGggPCBsZW5ndGhNYXNrICYmIGRQb3MrbGVuZ3RoIDwgZEVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IGJlc3RMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RDYW5kaWRhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RMZW5ndGggPT0gbGVuZ3RoTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZXN0TGVuZ3RoID49IDMpICAgIC8vQ29weSB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuRmxhZ3MgfD0gKGJ5dGUpKDEgPDwgaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MTYgb2Zmc2V0TWFzayA9ICh1c2hvcnQpfmxlbmd0aE1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHRva2VuID0gKHVzaG9ydCkoKCh1c2hvcnQpKGRQb3MgLSAoYmVzdENhbmRpZGF0ZSsxKSkpIDw8IChiaXRDb3VudCkgfCAodXNob3J0KShiZXN0TGVuZ3RoIC0gMykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoQml0Q29udmVydGVyLkdldEJ5dGVzKHRva2VuKSwgMCwgY29tcHJCdWZmZXIsIGNQb3MsIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRQb3MgPSBkUG9zICsgYmVzdExlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjUG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXRDb3B5IFRva2VuICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJCdWZmZXJbY1BvcysrXSA9IGJ1ZmZlcltkUG9zKytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByQnVmZmVyW2NQb3MrK10gPSBidWZmZXJbZFBvcysrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZFBvcyA+PSBkRW5kKSBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcHJCdWZmZXJbZmxhZ1Bvc10gPSB0b2tlbkZsYWdzOworICAgICAgICAgICAgICAgIGZsYWdQb3MgPSBjUG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcmV0ID0gbmV3IGJ5dGVbY1BvcyAtIDFdOworICAgICAgICAgICAgQXJyYXkuQ29weShjb21wckJ1ZmZlciwgcmV0LCByZXQuTGVuZ3RoKTsKKyAgICAgICAgICAgIHN0YXJ0UG9zID0gZEVuZDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBEZWNvbXByZXNzUGFydChieXRlW10gcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIERlY29tcHJlc3NQYXJ0KHBhcnQsIDApOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlY29tcHJlc3Npb24gdXNpbmcgYSBydW4gbGVuZ3RoIGVuY29kaW5nIGFsZ29yaXRobS4KKyAgICAgICAgLy8vIFNlZSBNUy1PVkJBIFNlY3Rpb24gMi40CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFydCI+Qnl0ZSBhcnJheSB0byBkZWNvbXByZXNzPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydFBvcyI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBEZWNvbXByZXNzUGFydChieXRlW10gcGFydCwgaW50IHN0YXJ0UG9zKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmIChwYXJ0W3N0YXJ0UG9zXSAhPSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSg0MDk2KTsKKyAgICAgICAgICAgIGludCBjb21wcmVzc1BvcyA9IHN0YXJ0UG9zICsgMTsKKyAgICAgICAgICAgIHdoaWxlKGNvbXByZXNzUG9zIDwgcGFydC5MZW5ndGgtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNvbXByZXNzQ2h1bmsobXMsIHBhcnQsIHJlZiBjb21wcmVzc1Bvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGVjb21wcmVzc0NodW5rKE1lbW9yeVN0cmVhbSBtcywgYnl0ZVtdIGNvbXBCdWZmZXIsIHJlZiBpbnQgcG9zKQorICAgICAgICB7CisgICAgICAgICAgICB1c2hvcnQgaGVhZGVyID0gQml0Q29udmVydGVyLlRvVUludDE2KGNvbXBCdWZmZXIsIHBvcyk7CisgICAgICAgICAgICBpbnQgIGRlY29tcHJQb3M9MDsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MTk4XTsgLy9BZGQgYW4gZXh0cmEgMTAwIGJ5dGUuIFNvbWUgd29ya2Jvb2tzIGhhdmUgb3ZlcmZsb3dpbmcgd29ya3NoZWV0cy4KKyAgICAgICAgICAgIGludCBzaXplID0gKGludCkoaGVhZGVyICYgMHhGRkYpKzM7CisgICAgICAgICAgICBpbnQgZW5kUG9zID0gcG9zK3NpemU7CisgICAgICAgICAgICBpbnQgYSA9IChpbnQpKGhlYWRlciAmIDB4NzAwMCkgPj4gMTI7CisgICAgICAgICAgICBpbnQgYiA9IChpbnQpKGhlYWRlciAmIDB4ODAwMCkgPj4gMTU7CisgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgIGlmIChiID09IDEpIC8vQ29tcHJlc3NlZCBjaHVuaworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBjb21wQnVmZmVyLkxlbmd0aCAmJiBwb3MgPCBlbmRQb3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0RlY29tcHJlc3MgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgYnl0ZSB0b2tlbiA9IGNvbXBCdWZmZXJbcG9zKytdOworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGVuZFBvcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9MaXRlcmFsIHRva2VuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRva2VuICYgKDEgPDwgaSkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXMuV3JpdGVCeXRlKGNvbXBCdWZmZXJbcG9zXSk7ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbZGVjb21wclBvcysrXSA9IGNvbXBCdWZmZXJbcG9zKytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvL2NvcHkgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEJpdENvbnZlcnRlci5Ub1VJbnQxNihjb21wQnVmZmVyLCBwb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRDb3VudCA9IEdldExlbmd0aEJpdHMoZGVjb21wclBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMgPSAoMTYgLSBiaXRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGxlbmd0aE1hc2sgPSAodXNob3J0KSgoMHhGRkZGKSA+PiBiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MTYgb2Zmc2V0TWFzayA9ICh1c2hvcnQpfmxlbmd0aE1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IChsZW5ndGhNYXNrICYgdCkgKyAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAob2Zmc2V0TWFzayAmIHQpID4+IChiaXRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZSA9IGRlY29tcHJQb3MgLSBvZmZzZXQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvbXByUG9zICsgbGVuZ3RoID49IGJ1ZmZlci5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCZSBsZW5pZW50IG9uIGRlY29tcHJlc3Npb24sIHNvIGV4dGVuZCBvdXIgZGVjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIuIEV4Y2VsIGdlbmVyYXRlZCBWQkEgcHJvamVjdHMgZG8gZW5jb3VudGVyIHRoaXMgaXNzdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSB3b3VsZCB0aGluayAobm90IHN1cnByaXNpbmdseSB0aGF0IHRoZSBWQkEgcHJvamVjdCBzcGVjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIGVtcGhhc2l6ZXMgdGhlIHNpemUgcmVzdHJpY3Rpb25zIG9mIGEgRGVjb21wcmVzc2lvbkNodW5rLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFyZ2VyQnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyLkxlbmd0aCArIDQwOThdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGJ1ZmZlciwgbGFyZ2VyQnVmZmVyLCBkZWNvbXByUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbGFyZ2VyQnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSd2ZSB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc3RpbGwgc2hvdWxkIGRlY29tcHJlc3MgdGhlIHRva2VuIGludG8gdGhpcyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIGEgbGF0ZXIgdG9rZW4gbmVlZHMgdG8gdXNlIHRoZSBieXRlcyB3ZSdyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3V0IHRvIGRlY29tcHJlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBsZW5ndGg7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlQnl0ZShidWZmZXJbc291cmNlXSk7IC8vTXVzdCBjb3B5IGJ5dGUtd2lzZSBiZWNhdXNlIGNvcHl0b2tlbnMgY2FuIG92ZXJsYXAgY29tcHJlc3NlZCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltkZWNvbXByUG9zKytdID0gYnVmZmVyW3NvdXJjZSsrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBlbmRQb3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL1JhdyBjaHVuaworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zLldyaXRlKGNvbXBCdWZmZXIsIHBvcywgc2l6ZSk7CisgICAgICAgICAgICAgICAgcG9zICs9IHNpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBHZXRMZW5ndGhCaXRzKGludCBkZWNvbXBQb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWNvbXBQb3MgPD0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGVjb21wUG9zIDw9IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRlY29tcFBvcyA8PSA2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkZWNvbXBQb3MgPD0gMTI4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGVjb21wUG9zIDw9IDI1NikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRlY29tcFBvcyA8PSA1MTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkZWNvbXBQb3MgPD0gMTAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRlY29tcFBvcyA8PSAyMDQ4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGVjb21wUG9zIDw9IDQwOTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9XZSBzaG91bGQgbmV2ZXIgZW5kIHVwIGhlcmUsIGJ1dCBpZiBzbyB0aGlzIGlzIHRoZSBmb3JtdWxhIHRvIGNhbGN1bGF0ZSB0aGUgYml0cy4uLgorICAgICAgICAgICAgICAgIHJldHVybiAxMiAtIChpbnQpTWF0aC5UcnVuY2F0ZShNYXRoLkxvZyhkZWNvbXBQb3MgLSAxID4+IDQsIDIpICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICAjcmVnaW9uICJBUEkgZGVjbGFyZSIKKyAgICAgICAgW0NvbUltcG9ydF0KKyAgICAgICAgW0d1aWQoIjAwMDAwMDBkLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0NiIpXQorICAgICAgICBbSW50ZXJmYWNlVHlwZShDb21JbnRlcmZhY2VUeXBlLkludGVyZmFjZUlzSVVua25vd24pXQorICAgICAgICBpbnRlcm5hbCBpbnRlcmZhY2UgSUVudW1TVEFUU1RHCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSB1c2VyIG5lZWRzIHRvIGFsbG9jYXRlIGFuIFNUQVRTVEcgYXJyYXkgd2hvc2Ugc2l6ZSBpcyBjZWx0LiAKKyAgICAgICAgICAgIFtQcmVzZXJ2ZVNpZ10KKyAgICAgICAgICAgIHVpbnQgTmV4dCgKKyAgICAgICAgICAgICAgICB1aW50IGNlbHQsCisgICAgICAgICAgICAgICAgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQQXJyYXkpLCBPdXRdIAorICAgICAgICAgICAgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNvbVR5cGVzLlNUQVRTVEdbXSByZ2VsdCwKKyAgICAgICAgICAgICAgICBvdXQgdWludCBwY2VsdEZldGNoZWQKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHZvaWQgU2tpcCh1aW50IGNlbHQpOworCisgICAgICAgICAgICB2b2lkIFJlc2V0KCk7CisKKyAgICAgICAgICAgIFtyZXR1cm46IE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkludGVyZmFjZSldCisgICAgICAgICAgICBJRW51bVNUQVRTVEcgQ2xvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb21JbXBvcnRdCisgICAgICAgIFtHdWlkKCIwMDAwMDAwYi0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDYiKV0KKyAgICAgICAgW0ludGVyZmFjZVR5cGUoQ29tSW50ZXJmYWNlVHlwZS5JbnRlcmZhY2VJc0lVbmtub3duKV0KKyAgICAgICAgaW50ZXJmYWNlIElTdG9yYWdlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQgQ3JlYXRlU3RyZWFtKAorICAgICAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc05hbWUsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IGdyZk1vZGUsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMSwKKyAgICAgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgcmVzZXJ2ZWQyLAorICAgICAgICAgICAgICAgIC8qIFtvdXRdICovIG91dCBjb21UeXBlcy5JU3RyZWFtIHBwc3RtKTsKKworICAgICAgICAgICAgdm9pZCBPcGVuU3RyZWFtKAorICAgICAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc05hbWUsCisgICAgICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIEludFB0ciByZXNlcnZlZDEsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IGdyZk1vZGUsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMiwKKyAgICAgICAgICAgICAgICAvKiBbb3V0XSAqLyBvdXQgY29tVHlwZXMuSVN0cmVhbSBwcHN0bSk7CisKKyAgICAgICAgICAgIHZvaWQgQ3JlYXRlU3RvcmFnZSgKKyAgICAgICAgICAgICAgICAvKiBbc3RyaW5nXVtpbl0gKi8gc3RyaW5nIHB3Y3NOYW1lLAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZNb2RlLAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCByZXNlcnZlZDEsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMiwKKyAgICAgICAgICAgICAgICAvKiBbb3V0XSAqLyBvdXQgSVN0b3JhZ2UgcHBzdGcpOworCisgICAgICAgICAgICB2b2lkIE9wZW5TdG9yYWdlKAorICAgICAgICAgICAgICAgIC8qIFtzdHJpbmddW3VuaXF1ZV1baW5dICovIHN0cmluZyBwd2NzTmFtZSwKKyAgICAgICAgICAgICAgICAvKiBbdW5pcXVlXVtpbl0gKi8gSVN0b3JhZ2UgcHN0Z1ByaW9yaXR5LAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gU1RHTSBncmZNb2RlLAorICAgICAgICAgICAgICAgIC8qIFt1bmlxdWVdW2luXSAqLyBJbnRQdHIgc25iRXhjbHVkZSwKKyAgICAgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgcmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgLyogW291dF0gKi8gb3V0IElTdG9yYWdlIHBwc3RnKTsKKworICAgICAgICAgICAgdm9pZCBDb3B5VG8oCisgICAgICAgICAgICAgICAgW0luQXR0cmlidXRlXSB1aW50IGNpaWRFeGNsdWRlLAorICAgICAgICAgICAgICAgIFtJbkF0dHJpYnV0ZV0gR3VpZFtdIHJnaWlkRXhjbHVkZSwKKyAgICAgICAgICAgICAgICBbSW5BdHRyaWJ1dGVdIEludFB0ciBzbmJFeGNsdWRlLAorICAgICAgICAgICAgICAgIFtJbkF0dHJpYnV0ZV0gSVN0b3JhZ2UgcHN0Z0Rlc3QKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHZvaWQgTW92ZUVsZW1lbnRUbygKKyAgICAgICAgICAgICAgICAvKiBbc3RyaW5nXVtpbl0gKi8gc3RyaW5nIHB3Y3NOYW1lLAorICAgICAgICAgICAgICAgIC8qIFt1bmlxdWVdW2luXSAqLyBJU3RvcmFnZSBwc3RnRGVzdCwKKyAgICAgICAgICAgICAgICAvKiBbc3RyaW5nXVtpbl0gKi8gc3RyaW5nIHB3Y3NOZXdOYW1lLAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZGbGFncyk7CisKKyAgICAgICAgICAgIHZvaWQgQ29tbWl0KAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZDb21taXRGbGFncyk7CisKKyAgICAgICAgICAgIHZvaWQgUmV2ZXJ0KCk7CisKKyAgICAgICAgICAgIHZvaWQgRW51bUVsZW1lbnRzKAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCByZXNlcnZlZDEsCisgICAgICAgICAgICAgICAgLyogW3NpemVfaXNdW3VuaXF1ZV1baW5dICovIEludFB0ciByZXNlcnZlZDIsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMywKKyAgICAgICAgICAgICAgICAvKiBbb3V0XSAqLyBvdXQgSUVudW1TVEFUU1RHIHBwZW51bSk7CisKKyAgICAgICAgICAgIHZvaWQgRGVzdHJveUVsZW1lbnQoCisgICAgICAgICAgICAgICAgLyogW3N0cmluZ11baW5dICovIHN0cmluZyBwd2NzTmFtZSk7CisKKyAgICAgICAgICAgIHZvaWQgUmVuYW1lRWxlbWVudCgKKyAgICAgICAgICAgICAgICAvKiBbc3RyaW5nXVtpbl0gKi8gc3RyaW5nIHB3Y3NPbGROYW1lLAorICAgICAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc05ld05hbWUpOworCisgICAgICAgICAgICB2b2lkIFNldEVsZW1lbnRUaW1lcygKKyAgICAgICAgICAgICAgICAvKiBbc3RyaW5nXVt1bmlxdWVdW2luXSAqLyBzdHJpbmcgcHdjc05hbWUsCisgICAgICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5GSUxFVElNRSBwY3RpbWUsCisgICAgICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5GSUxFVElNRSBwYXRpbWUsCisgICAgICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5GSUxFVElNRSBwbXRpbWUpOworCisgICAgICAgICAgICB2b2lkIFNldENsYXNzKAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gR3VpZCBjbHNpZCk7CisKKyAgICAgICAgICAgIHZvaWQgU2V0U3RhdGVCaXRzKAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZTdGF0ZUJpdHMsCisgICAgICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IGdyZk1hc2spOworCisgICAgICAgICAgICB2b2lkIFN0YXQoCisgICAgICAgICAgICAgICAgLyogW291dF0gKi8gb3V0IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5TVEFUU1RHIHBzdGF0c3RnLAorICAgICAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZTdGF0RmxhZyk7CisKKyAgICAgICAgfQorICAgICAgICBbQ29tVmlzaWJsZShmYWxzZSldCisgICAgICAgIFtDb21JbXBvcnQsIEludGVyZmFjZVR5cGUoQ29tSW50ZXJmYWNlVHlwZS5JbnRlcmZhY2VJc0lVbmtub3duKSwgR3VpZCgiMDAwMDAwMEEtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2IildCisgICAgICAgIGludGVybmFsIGludGVyZmFjZSBJTG9ja0J5dGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQgUmVhZEF0KGxvbmcgdWxPZmZzZXQsIFN5c3RlbS5JbnRQdHIgcHYsIGludCBjYiwgb3V0IFVJbnRQdHIgcGNiUmVhZCk7CisgICAgICAgICAgICB2b2lkIFdyaXRlQXQobG9uZyB1bE9mZnNldCwgU3lzdGVtLkludFB0ciBwdiwgaW50IGNiLCBvdXQgVUludFB0ciBwY2JXcml0dGVuKTsKKyAgICAgICAgICAgIHZvaWQgRmx1c2goKTsKKyAgICAgICAgICAgIHZvaWQgU2V0U2l6ZShsb25nIGNiKTsKKyAgICAgICAgICAgIHZvaWQgTG9ja1JlZ2lvbihsb25nIGxpYk9mZnNldCwgbG9uZyBjYiwgaW50IGR3TG9ja1R5cGUpOworICAgICAgICAgICAgdm9pZCBVbmxvY2tSZWdpb24obG9uZyBsaWJPZmZzZXQsIGxvbmcgY2IsIGludCBkd0xvY2tUeXBlKTsKKyAgICAgICAgICAgIHZvaWQgU3RhdChvdXQgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNvbVR5cGVzLlNUQVRTVEcgcHN0YXRzdGcsIGludCBncmZTdGF0RmxhZyk7CisgICAgICAgIH0KKyAgICAgICAgW0ZsYWdzXQorICAgICAgICBpbnRlcm5hbCBlbnVtIFNUR00gOiBpbnQKKyAgICAgICAgeworICAgICAgICAgICAgRElSRUNUID0gMHgwMDAwMDAwMCwKKyAgICAgICAgICAgIFRSQU5TQUNURUQgPSAweDAwMDEwMDAwLAorICAgICAgICAgICAgU0lNUExFID0gMHgwODAwMDAwMCwKKyAgICAgICAgICAgIFJFQUQgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgV1JJVEUgPSAweDAwMDAwMDAxLAorICAgICAgICAgICAgUkVBRFdSSVRFID0gMHgwMDAwMDAwMiwKKyAgICAgICAgICAgIFNIQVJFX0RFTllfTk9ORSA9IDB4MDAwMDAwNDAsCisgICAgICAgICAgICBTSEFSRV9ERU5ZX1JFQUQgPSAweDAwMDAwMDMwLAorICAgICAgICAgICAgU0hBUkVfREVOWV9XUklURSA9IDB4MDAwMDAwMjAsCisgICAgICAgICAgICBTSEFSRV9FWENMVVNJVkUgPSAweDAwMDAwMDEwLAorICAgICAgICAgICAgUFJJT1JJVFkgPSAweDAwMDQwMDAwLAorICAgICAgICAgICAgREVMRVRFT05SRUxFQVNFID0gMHgwNDAwMDAwMCwKKyAgICAgICAgICAgIE5PU0NSQVRDSCA9IDB4MDAxMDAwMDAsCisgICAgICAgICAgICBDUkVBVEUgPSAweDAwMDAxMDAwLAorICAgICAgICAgICAgQ09OVkVSVCA9IDB4MDAwMjAwMDAsCisgICAgICAgICAgICBGQUlMSUZUSEVSRSA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBOT1NOQVBTSE9UID0gMHgwMDIwMDAwMCwKKyAgICAgICAgICAgIERJUkVDVF9TV01SID0gMHgwMDQwMDAwMCwKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGVudW0gU1RBVEZMQUcgOiB1aW50CisgICAgICAgIHsKKyAgICAgICAgICAgIFNUQVRGTEFHX0RFRkFVTFQgPSAwLAorICAgICAgICAgICAgU1RBVEZMQUdfTk9OQU1FID0gMSwKKyAgICAgICAgICAgIFNUQVRGTEFHX05PT1BFTiA9IDIKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGVudW0gU1RHVFkgOiBpbnQKKyAgICAgICAgeworICAgICAgICAgICAgU1RHVFlfU1RPUkFHRSA9IDEsCisgICAgICAgICAgICBTVEdUWV9TVFJFQU0gPSAyLAorICAgICAgICAgICAgU1RHVFlfTE9DS0JZVEVTID0gMywKKyAgICAgICAgICAgIFNUR1RZX1BST1BFUlRZID0gNAorICAgICAgICB9CisKKyAgICAgICAgW0RsbEltcG9ydCgib2xlMzIuZGxsIildCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgU3RnSXNTdG9yYWdlRmlsZSgKKyAgICAgICAgICAgIFtNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUFdTdHIpXSBzdHJpbmcgcHdjc05hbWUpOworICAgICAgICBbRGxsSW1wb3J0KCJvbGUzMi5kbGwiKV0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBTdGdJc1N0b3JhZ2VJTG9ja0J5dGVzKAorICAgICAgICAgICAgSUxvY2tCeXRlcyBwbGtieXQpOworCisKKyAgICAgICAgW0RsbEltcG9ydCgib2xlMzIuZGxsIildCisgICAgICAgIHN0YXRpYyBleHRlcm4gaW50IFN0Z09wZW5TdG9yYWdlKAorICAgICAgICAgICAgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQV1N0cildIHN0cmluZyBwd2NzTmFtZSwKKyAgICAgICAgICAgIElTdG9yYWdlIHBzdGdQcmlvcml0eSwKKyAgICAgICAgICAgIFNUR00gZ3JmTW9kZSwKKyAgICAgICAgICAgIEludFB0ciBzbmJFeGNsdWRlLAorICAgICAgICAgICAgdWludCByZXNlcnZlZCwKKyAgICAgICAgICAgIG91dCBJU3RvcmFnZSBwcHN0Z09wZW4pOworCisgICAgICAgIFtEbGxJbXBvcnQoIm9sZTMyLmRsbCIpXQorICAgICAgICBzdGF0aWMgZXh0ZXJuIGludCBTdGdPcGVuU3RvcmFnZU9uSUxvY2tCeXRlcygKKyAgICAgICAgICAgIElMb2NrQnl0ZXMgcGxrYnl0LAorICAgICAgICAgICAgSVN0b3JhZ2UgcFN0Z1ByaW9yaXR5LAorICAgICAgICAgICAgU1RHTSBncmZNb2RlLAorICAgICAgICAgICAgSW50UHRyIHNuYkVuY2x1ZGUsCisgICAgICAgICAgICB1aW50IHJlc2VydmVkLAorICAgICAgICAgICAgb3V0IElTdG9yYWdlIHBwc3RnT3Blbik7CisgICAgICAgIFtEbGxJbXBvcnQoIm9sZTMyLmRsbCIpXQorICAgICAgICBzdGF0aWMgZXh0ZXJuIGludCBDcmVhdGVJTG9ja0J5dGVzT25IR2xvYmFsKAorICAgICAgICAgICAgSW50UHRyIGhHbG9iYWwsCisgICAgICAgICAgICBib29sIGZEZWxldGVPblJlbGVhc2UsCisgICAgICAgICAgICBvdXQgSUxvY2tCeXRlcyBwcExrYnl0KTsKKworICAgICAgICBbRGxsSW1wb3J0KCJvbGUzMi5kbGwiKV0KKyAgICAgICAgc3RhdGljIGV4dGVybiBpbnQgU3RnQ3JlYXRlRG9jZmlsZU9uSUxvY2tCeXRlcyhJTG9ja0J5dGVzIHBsa2J5dCwgU1RHTSBncmZNb2RlLCBpbnQgcmVzZXJ2ZWQsIG91dCBJU3RvcmFnZSBwcHN0Z09wZW4pOworCisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgW1NlY3VyaXR5U2FmZUNyaXRpY2FsXQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgaW50IElzU3RvcmFnZUZpbGUoc3RyaW5nIE5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdGdJc1N0b3JhZ2VGaWxlKE5hbWUpOworICAgICAgICB9CisgICAgICAgIFtTZWN1cml0eVNhZmVDcml0aWNhbF0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGludCBJc1N0b3JhZ2VJTG9ja0J5dGVzKElMb2NrQnl0ZXMgbGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdGdJc1N0b3JhZ2VJTG9ja0J5dGVzKGxiKTsKKyAgICAgICAgfQorICAgICAgICBbU2VjdXJpdHlTYWZlQ3JpdGljYWxdCisgICAgICAgIGludGVybmFsIHN0YXRpYyBJTG9ja0J5dGVzIEdldExvY2tieXRlKE1lbW9yeVN0cmVhbSBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIElMb2NrQnl0ZXMgbGI7CisgICAgICAgICAgICB2YXIgaXJldCA9IENyZWF0ZUlMb2NrQnl0ZXNPbkhHbG9iYWwoSW50UHRyLlplcm8sIHRydWUsIG91dCBsYik7CisgICAgICAgICAgICBieXRlW10gZG9jQXJyYXkgPSBzdHJlYW0uR2V0QnVmZmVyKCk7CisKKyAgICAgICAgICAgIEludFB0ciBidWZmZXIgPSBNYXJzaGFsLkFsbG9jSEdsb2JhbChkb2NBcnJheS5MZW5ndGgpOworICAgICAgICAgICAgTWFyc2hhbC5Db3B5KGRvY0FycmF5LCAwLCBidWZmZXIsIGRvY0FycmF5Lkxlbmd0aCk7CisgICAgICAgICAgICBVSW50UHRyIHJlYWRTaXplOworICAgICAgICAgICAgbGIuV3JpdGVBdCgwLCBidWZmZXIsIGRvY0FycmF5Lkxlbmd0aCwgb3V0IHJlYWRTaXplKTsKKyAgICAgICAgICAgIE1hcnNoYWwuRnJlZUhHbG9iYWwoYnVmZmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIGxiOworICAgICAgICB9CisgICAgICAgIFtTZWN1cml0eVNhZmVDcml0aWNhbF0KKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gUmVhZFBhcnRzKElTdG9yYWdlIHN0b3JhZ2UsIFN0b3JhZ2VQYXJ0IHN0b3JhZ2VQYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gcmV0ID0gbnVsbDsKKyAgICAgICAgICAgIGNvbVR5cGVzLlNUQVRTVEcgc3RhdHN0ZzsKKworICAgICAgICAgICAgc3RvcmFnZS5TdGF0KG91dCBzdGF0c3RnLCAodWludClTVEFURkxBRy5TVEFURkxBR19ERUZBVUxUKTsKKworICAgICAgICAgICAgSUVudW1TVEFUU1RHIHBJRW51bVN0YXRTdGcgPSBudWxsOworICAgICAgICAgICAgc3RvcmFnZS5FbnVtRWxlbWVudHMoMCwgSW50UHRyLlplcm8sIDAsIG91dCBwSUVudW1TdGF0U3RnKTsKKworICAgICAgICAgICAgY29tVHlwZXMuU1RBVFNUR1tdIHJlZ2VsdCA9IHsgc3RhdHN0ZyB9OworICAgICAgICAgICAgdWludCBmZXRjaGVkID0gMDsKKyAgICAgICAgICAgIHVpbnQgcmVzID0gcElFbnVtU3RhdFN0Zy5OZXh0KDEsIHJlZ2VsdCwgb3V0IGZldGNoZWQpOworCisgICAgICAgICAgICAvL2lmIChyZWdlbHRbMF0ucHdjc05hbWUgPT0gIgZEYXRhU3BhY2VzIikKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgUHJpbnRTdG9yYWdlKHN0b3JhZ2UsIHJlZ2VsdFswXSwiIik7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIHdoaWxlIChyZXMgIT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiByZWdlbHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElTdG9yYWdlIHN1YlN0b3JhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLk9wZW5TdG9yYWdlKGl0ZW0ucHdjc05hbWUsIG51bGwsIFNUR00uRElSRUNUIHwgU1RHTS5SRUFEIHwgU1RHTS5TSEFSRV9FWENMVVNJVkUsIEludFB0ci5aZXJvLCAwLCBvdXQgc3ViU3RvcmFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUGFydCBzdWJTdG9yYWdlUGFydD1uZXcgU3RvcmFnZVBhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VQYXJ0LlN1YlN0b3JhZ2UuQWRkKGl0ZW0ucHdjc05hbWUsIHN1YlN0b3JhZ2VQYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRQYXJ0cyhzdWJTdG9yYWdlLCBzdWJTdG9yYWdlUGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlUGFydC5EYXRhU3RyZWFtcy5BZGQoaXRlbS5wd2NzTmFtZSwgR2V0T2xlU3RyZWFtKHN0b3JhZ2UsIGl0ZW0pKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcyA9IHBJRW51bVN0YXRTdGcuTmV4dCgxLCByZWdlbHQsIG91dCBmZXRjaGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1hcnNoYWwuUmVsZWFzZUNvbU9iamVjdChwSUVudW1TdGF0U3RnKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gSGVscCBtZXRob2QgdG8gcHJpbnQgYSBzdG9yYWdlIHBhcnQgYmluYXJ5IHRvIGM6XHRlbXAKKyAgICAgICAgLy9wcml2YXRlIHZvaWQgUHJpbnRTdG9yYWdlKElTdG9yYWdlIHN0b3JhZ2UsIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5TVEFUU1RHIHNUQVRTVEcsIHN0cmluZyB0b3BOYW1lKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgSVN0b3JhZ2UgZHM7CisgICAgICAgIC8vICAgIGlmICh0b3BOYW1lLkxlbmd0aCA+IDApCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHRvcE5hbWUgPSB0b3BOYW1lWzBdIDwgJ0EnID8gdG9wTmFtZS5TdWJzdHJpbmcoMSwgdG9wTmFtZS5MZW5ndGggLSAxKSA6IHRvcE5hbWU7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgc3RvcmFnZS5PcGVuU3RvcmFnZShzVEFUU1RHLnB3Y3NOYW1lLAorICAgICAgICAvLyAgICAgICAgbnVsbCwKKyAgICAgICAgLy8gICAgICAgICh1aW50KShTVEdNLkRJUkVDVCB8IFNUR00uUkVBRCB8IFNUR00uU0hBUkVfRVhDTFVTSVZFKSwKKyAgICAgICAgLy8gICAgICAgIEludFB0ci5aZXJvLAorICAgICAgICAvLyAgICAgICAgMCwKKyAgICAgICAgLy8gICAgICAgIG91dCBkcyk7CisKKyAgICAgICAgLy8gICAgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNvbVR5cGVzLlNUQVRTVEcgc3RhdHN0Z1N1YjsKKyAgICAgICAgLy8gICAgZHMuU3RhdChvdXQgc3RhdHN0Z1N1YiwgKHVpbnQpU1RBVEZMQUcuU1RBVEZMQUdfREVGQVVMVCk7CisKKyAgICAgICAgLy8gICAgSUVudW1TVEFUU1RHIHBJRW51bVN0YXRTdGdTdWIgPSBudWxsOworICAgICAgICAvLyAgICBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ29tVHlwZXMuU1RBVFNUR1tdIHJlZ2VsdFN1YiA9IHsgc3RhdHN0Z1N1YiB9OworICAgICAgICAvLyAgICBkcy5FbnVtRWxlbWVudHMoMCwgSW50UHRyLlplcm8sIDAsIG91dCBwSUVudW1TdGF0U3RnU3ViKTsKKworICAgICAgICAvLyAgICB1aW50IGZldGNoZWQgPSAwOworICAgICAgICAvLyAgICB3aGlsZSAocElFbnVtU3RhdFN0Z1N1Yi5OZXh0KDEsIHJlZ2VsdFN1Yiwgb3V0IGZldGNoZWQpID09IDApCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHN0cmluZyBzTmFtZSA9IHJlZ2VsdFN1YlswXS5wd2NzTmFtZVswXSA8ICdBJyA/IHJlZ2VsdFN1YlswXS5wd2NzTmFtZS5TdWJzdHJpbmcoMSwgcmVnZWx0U3ViWzBdLnB3Y3NOYW1lLkxlbmd0aCAtIDEpIDogcmVnZWx0U3ViWzBdLnB3Y3NOYW1lOworICAgICAgICAvLyAgICAgICAgaWYgKHJlZ2VsdFN1YlswXS50eXBlID09IDEpCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgUHJpbnRTdG9yYWdlKGRzLCByZWdlbHRTdWJbMF0sIHRvcE5hbWUgKyBzTmFtZSArICJfIik7CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlIGlmKHJlZ2VsdFN1YlswXS50eXBlPT0yKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxCeXRlcyhAImM6XHRlbXBcIiArIHRvcE5hbWUgKyBzTmFtZSArICIuYmluIiwgR2V0T2xlU3RyZWFtKGRzLCByZWdlbHRTdWJbMF0pKTsKKyAgICAgICAgLy8gICAgICAgIH0KKyAgICAgICAgLy8gICAgfQorICAgICAgICAvL30gICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIHRoZSBzdHJlYW0gYW5kIHJldHVybiBpdCBhcyBhIGJ5dGUtYXJyYXkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdG9yYWdlIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN0YXRzdGciPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIFtTZWN1cml0eVNhZmVDcml0aWNhbF0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gR2V0T2xlU3RyZWFtKElTdG9yYWdlIHN0b3JhZ2UsIGNvbVR5cGVzLlNUQVRTVEcgc3RhdHN0ZykKKyAgICAgICAgeworICAgICAgICAgICAgY29tVHlwZXMuSVN0cmVhbSBwSVN0cmVhbTsKKyAgICAgICAgICAgIHN0b3JhZ2UuT3BlblN0cmVhbShzdGF0c3RnLnB3Y3NOYW1lLAorICAgICAgICAgICAgICAgSW50UHRyLlplcm8sCisgICAgICAgICAgICAgICAodWludCkoU1RHTS5SRUFEIHwgU1RHTS5TSEFSRV9FWENMVVNJVkUpLAorICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgIG91dCBwSVN0cmVhbSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbc3RhdHN0Zy5jYlNpemVdOworICAgICAgICAgICAgcElTdHJlYW0uUmVhZChkYXRhLCAoaW50KXN0YXRzdGcuY2JTaXplLCBJbnRQdHIuWmVybyk7CisgICAgICAgICAgICBNYXJzaGFsLlJlbGVhc2VDb21PYmplY3QocElTdHJlYW0pOworCisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIFtTZWN1cml0eVNhZmVDcml0aWNhbF0KKyAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIFNhdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBJTG9ja0J5dGVzIGxiOworICAgICAgICAgICAgdmFyIGlyZXQgPSBDcmVhdGVJTG9ja0J5dGVzT25IR2xvYmFsKEludFB0ci5aZXJvLCB0cnVlLCBvdXQgbGIpOworCisgICAgICAgICAgICBJU3RvcmFnZSBzdG9yYWdlID0gbnVsbDsKKyAgICAgICAgICAgIGJ5dGVbXSByZXQgPSBudWxsOworCisgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgZG9jdW1lbnQgaW4tbWVtb3J5CisgICAgICAgICAgICBpZiAoU3RnQ3JlYXRlRG9jZmlsZU9uSUxvY2tCeXRlcyhsYiwKKyAgICAgICAgICAgICAgICAgICAgU1RHTS5DUkVBVEUgfCBTVEdNLlJFQURXUklURSB8IFNUR00uU0hBUkVfRVhDTFVTSVZFIHwgU1RHTS5UUkFOU0FDVEVELCAKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgb3V0IHN0b3JhZ2UpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2godmFyIHN0b3JlIGluIHRoaXMuU3RvcmFnZS5TdWJTdG9yYWdlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlU3RvcmUoc3RvcmUuS2V5LCBzdG9yZS5WYWx1ZSwgc3RvcmFnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENyZWF0ZVN0cmVhbXModGhpcy5TdG9yYWdlLCBzdG9yYWdlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxiLkZsdXNoKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9Ob3cgY29weSB0aGUgdW5tYW5hZ2VkIHN0cmVhbSB0byBhIGJ5dGUgYXJyYXkgLS0+IG1lbW9yeSBzdHJlYW0KKyAgICAgICAgICAgICAgICB2YXIgc3RhdHN0ZyA9IG5ldyBjb21UeXBlcy5TVEFUU1RHKCk7CisgICAgICAgICAgICAgICAgbGIuU3RhdChvdXQgc3RhdHN0ZywgMCk7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KXN0YXRzdGcuY2JTaXplOworICAgICAgICAgICAgICAgIEludFB0ciBidWZmZXIgPSBNYXJzaGFsLkFsbG9jSEdsb2JhbChzaXplKTsKKyAgICAgICAgICAgICAgICBVSW50UHRyIHJlYWRTaXplOworICAgICAgICAgICAgICAgIHJldD1uZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICBsYi5SZWFkQXQoMCwgYnVmZmVyLCBzaXplLCBvdXQgcmVhZFNpemUpOworICAgICAgICAgICAgICAgIE1hcnNoYWwuQ29weShidWZmZXIsIHJldCwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgTWFyc2hhbC5GcmVlSEdsb2JhbChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFyc2hhbC5SZWxlYXNlQ29tT2JqZWN0KHN0b3JhZ2UpOworICAgICAgICAgICAgTWFyc2hhbC5SZWxlYXNlQ29tT2JqZWN0KGxiKTsKKworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVTdG9yZShzdHJpbmcgbmFtZSwgU3RvcmFnZVBhcnQgc3ViU3RvcmUsIElTdG9yYWdlIHN0b3JhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIElTdG9yYWdlIHN1YlN0b3JhZ2U7CisgICAgICAgICAgICBzdG9yYWdlLkNyZWF0ZVN0b3JhZ2UobmFtZSwgKHVpbnQpKFNUR00uQ1JFQVRFIHwgU1RHTS5XUklURSB8IFNUR00uRElSRUNUIHwgU1RHTS5TSEFSRV9FWENMVVNJVkUpLCAwLCAwLCBvdXQgc3ViU3RvcmFnZSk7CisgICAgICAgICAgICBzdG9yYWdlLkNvbW1pdCgwKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzdG9yZSBpbiBzdWJTdG9yZS5TdWJTdG9yYWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyZWF0ZVN0b3JlKHN0b3JlLktleSwgc3RvcmUuVmFsdWUsIHN1YlN0b3JhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBDcmVhdGVTdHJlYW1zKHN1YlN0b3JlLCBzdWJTdG9yYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVTdHJlYW1zKFN0b3JhZ2VQYXJ0IHN1YlN0b3JlLCBJU3RvcmFnZSBzdWJTdG9yYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZHMgaW4gc3ViU3RvcmUuRGF0YVN0cmVhbXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tVHlwZXMuSVN0cmVhbSBzdHJlYW07CisgICAgICAgICAgICAgICAgc3ViU3RvcmFnZS5DcmVhdGVTdHJlYW0oZHMuS2V5LCAodWludCkoU1RHTS5DUkVBVEUgfCBTVEdNLldSSVRFIHwgU1RHTS5ESVJFQ1QgfCBTVEdNLlNIQVJFX0VYQ0xVU0lWRSksIDAsIDAsIG91dCBzdHJlYW0pOworICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShkcy5WYWx1ZSwgZHMuVmFsdWUuTGVuZ3RoLCBJbnRQdHIuWmVybyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWJTdG9yYWdlLkNvbW1pdCgwKTsKKyAgICAgICAgfQorCQkJCisgICAgfQorI2VuZGlmCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL0NvbnZlcnRVdGlsLmNzIGIvRVBQbHVzL1V0aWxzL0NvbnZlcnRVdGlsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Mjg0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVXRpbHMvQ29udmVydFV0aWwuY3MKQEAgLTAsMCArMSwxOTYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCit7CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIENvbnZlcnRVdGlsCisgICAgeworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc051bWVyaWMob2JqZWN0IGNhbmRpZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKGNhbmRpZGF0ZS5HZXRUeXBlKCkuSXNQcmltaXRpdmUgfHwgY2FuZGlkYXRlIGlzIGRvdWJsZSB8fCBjYW5kaWRhdGUgaXMgZGVjaW1hbCB8fCBjYW5kaWRhdGUgaXMgRGF0ZVRpbWUgfHwgY2FuZGlkYXRlIGlzIFRpbWVTcGFuIHx8IGNhbmRpZGF0ZSBpcyBsb25nKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIElzTnVtZXJpY1N0cmluZyhvYmplY3QgY2FuZGlkYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LklzTWF0Y2goY2FuZGlkYXRlLlRvU3RyaW5nKCksIEAiXltcZF0rKFwsW1xkXSk/Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGFuIG9iamVjdCB2YWx1ZSB0byBhIGRvdWJsZSAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlnbm9yZUJvb2wiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBkb3VibGUgR2V0VmFsdWVEb3VibGUob2JqZWN0IHYsIGJvb2wgaWdub3JlQm9vbCA9IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpZ25vcmVCb29sICYmIHYgaXMgYm9vbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoSXNOdW1lcmljKHYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgaXMgRGF0ZVRpbWUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKERhdGVUaW1lKXYpLlRvT0FEYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpcyBUaW1lU3BhbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZCA9IERhdGVUaW1lLkZyb21PQURhdGUoMCkuQWRkKChUaW1lU3Bhbil2KS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZCA9IENvbnZlcnQuVG9Eb3VibGUodiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXRjaAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gT09YTUwgcmVxdWlyZXMgdGhhdCAiLCIgLCBhbmQgJmFtcDsgYmUgZXNjYXBlZCwgYnV0ICcgYW5kICIgc2hvdWxkICpub3QqIGJlIGVzY2FwZWQsIG5vciBzaG91bGQKKyAgICAgICAgLy8vIGFueSBleHRlbmRlZCBVbmljb2RlIGNoYXJhY3RlcnMuIFRoaXMgZnVuY3Rpb24gb25seSBlbmNvZGVzIHRoZSByZXF1aXJlZCBjaGFyYWN0ZXJzLgorICAgICAgICAvLy8gU3lzdGVtLlNlY3VyaXR5LlNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoKSBlc2NhcGVzICcgYW5kICIgYXMgICZhcG9zOyBhbmQgJnF1b3Q7LCBzbyBpdCBjYW5ub3QKKyAgICAgICAgLy8vIGJlIHVzZWQgcmVsaWFibHkuIFN5c3RlbS5XZWIuSHR0cFV0aWxpdHkuSHRtbEVuY29kZSBvdmVycmVhY2hlcyBhcyB3ZWxsIGFuZCB1c2VzIHRoZSBudW1lcmljCisgICAgICAgIC8vLyBlc2NhcGUgZXF1aXZhbGVudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEV4Y2VsRXNjYXBlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcy5SZXBsYWNlKCImIiwgIiZhbXA7IikuUmVwbGFjZSgiPCIsICImbHQ7IikuUmVwbGFjZSgiPiIsICImZ3Q7Iik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBwcmVzZXJ2ZSBzcGFjZSBhdHRyaWJ1dGUgaXMgc2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN3Ij48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InQiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEV4Y2VsRW5jb2RlU3RyaW5nKFN0cmVhbVdyaXRlciBzdywgc3RyaW5nIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKHQsICIoX3hbMC05QS1GXXs0LDR9XykiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBSZWdleC5NYXRjaCh0LCAiKF94WzAtOUEtRl17NCw0fV8pIik7CisgICAgICAgICAgICAgICAgaW50IGluZGV4QWRkID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2guU3VjY2VzcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQgPSB0Lkluc2VydChtYXRjaC5JbmRleCArIGluZGV4QWRkLCAiX3gwMDVGIik7CisgICAgICAgICAgICAgICAgICAgIGluZGV4QWRkICs9IDY7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2guTmV4dE1hdGNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0Lkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0W2ldIDw9IDB4MWYgJiYgdFtpXSAhPSAnXHQnICYmIHRbaV0gIT0gJ1xuJyAmJiB0W2ldICE9ICdccicpIC8vTm90IFRhYiwgQ1Igb3IgTEYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCJfeDAwezB9XyIsICh0W2ldIDwgMHhmID8gIjAiIDogIiIpICsgKChpbnQpdFtpXSkuVG9TdHJpbmcoIlgiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKHRbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHByZXNlcnZlIHNwYWNlIGF0dHJpYnV0ZSBpcyBzZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2IiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRXhjZWxFbmNvZGVTdHJpbmcoU3RyaW5nQnVpbGRlciBzYiwgc3RyaW5nIHQsIGJvb2wgZW5jb2RlVGFiQ1JMRj1mYWxzZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2godCwgIihfeFswLTlBLUZdezQsNH1fKSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IFJlZ2V4Lk1hdGNoKHQsICIoX3hbMC05QS1GXXs0LDR9XykiKTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXhBZGQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaC5TdWNjZXNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IHQuSW5zZXJ0KG1hdGNoLkluZGV4ICsgaW5kZXhBZGQsICJfeDAwNUYiKTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhBZGQgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5OZXh0TWF0Y2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRbaV0gPD0gMHgxZiAmJiAoKHRbaV0gIT0gJ1x0JyAmJiB0W2ldICE9ICdcbicgJiYgdFtpXSAhPSAnXHInICYmIGVuY29kZVRhYkNSTEYgPT0gZmFsc2UpIHx8IGVuY29kZVRhYkNSTEYpKSAvL05vdCBUYWIsIENSIG9yIExGCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIl94MDB7MH1fIiwgKHRbaV0gPCAweGYgPyAiMCIgOiAiIikgKyAoKGludCl0W2ldKS5Ub1N0cmluZygiWCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHRbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHByZXNlcnZlIHNwYWNlIGF0dHJpYnV0ZSBpcyBzZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2IiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idCI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBFeGNlbEVuY29kZVN0cmluZyhzdHJpbmcgdCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYj1uZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgdD10LlJlcGxhY2UoIlxyXG4iLCAiXG4iKTsgLy9Gb3Igc29tZSByZWFzb24gY2FuJ3QgdGFibGUgbmFtZSBoYXZlIGNyIGluIHRoZW0uIFJlcGxhY2Ugd2l0aCBubAorICAgICAgICAgICAgRXhjZWxFbmNvZGVTdHJpbmcoc2IsIHQsIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBFeGNlbERlY29kZVN0cmluZyhzdHJpbmcgdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG1hdGNoID0gUmVnZXguTWF0Y2godCwgIihfeDAwNUZ8X3hbMC05QS1GXXs0LDR9XykiKTsKKyAgICAgICAgICAgIGlmICghbWF0Y2guU3VjY2VzcykgcmV0dXJuIHQ7CisKKyAgICAgICAgICAgIHZhciB1c2VOZXh0VmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgIHZhciByZXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgdmFyIHByZXZJbmRleCA9IDA7CisgICAgICAgICAgICB3aGlsZSAobWF0Y2guU3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJldkluZGV4IDwgbWF0Y2guSW5kZXgpIHJldC5BcHBlbmQodC5TdWJzdHJpbmcocHJldkluZGV4LCBtYXRjaC5JbmRleCAtIHByZXZJbmRleCkpOworICAgICAgICAgICAgICAgIGlmICghdXNlTmV4dFZhbHVlICYmIG1hdGNoLlZhbHVlID09ICJfeDAwNUYiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlTmV4dFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZU5leHRWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LkFwcGVuZChtYXRjaC5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VOZXh0VmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5BcHBlbmQoKGNoYXIpaW50LlBhcnNlKG1hdGNoLlZhbHVlLlN1YnN0cmluZygyLCA0KSwgTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldkluZGV4ID0gbWF0Y2guSW5kZXggKyBtYXRjaC5MZW5ndGg7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5OZXh0TWF0Y2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldC5BcHBlbmQodC5TdWJzdHJpbmcocHJldkluZGV4LCB0Lkxlbmd0aCAtIHByZXZJbmRleCkpOworICAgICAgICAgICAgcmV0dXJuIHJldC5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL0VuY3J5cHRlZFBhY2thZ2VIYW5kbGVyLmNzIGIvRVBQbHVzL1V0aWxzL0VuY3J5cHRlZFBhY2thZ2VIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjRjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVXRpbHMvRW5jcnlwdGVkUGFja2FnZUhhbmRsZXIuY3MKQEAgLTAsMCArMSwyMDAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgY2xhc3MgaXMgY3JlYXRlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBNUy1PRkZDUllQVE8gUERGIGRvY3VtZW50YXRpb24uLi4gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjMzEzMDcxKG9mZmljZS4xMikuYXNweAorICogRGVjcnlwdGlvbiBsaWJyYXJ5IGZvciBPZmZpY2UgT3BlbiBYTUwgZmlsZXMoTHlxdWlkaXR5KSBhbmQgU21pbmtzIHZlcnkgbmljZSBleGFtcGxlIAorICogb24gIlJlYWRpbmcgY29tcG91bmQgZG9jdW1lbnRzIGluIGMjIiBvbiBTdGFja292ZXJmbG93LiBNYW55IHRoYW5rcyEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTEwLUFVRy0yMDEwCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsgCit1c2luZyBjb21UeXBlcz1TeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ29tVHlwZXM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5OwordXNpbmcgU3lzdGVtLlhtbDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCit7CisgICAgW0NvbUltcG9ydF0gCisgICAgW0d1aWQoIjAwMDAwMDBkLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0NiIpXSAKKyAgICBbSW50ZXJmYWNlVHlwZShDb21JbnRlcmZhY2VUeXBlLkludGVyZmFjZUlzSVVua25vd24pXSAKKyAgICBpbnRlcm5hbCBpbnRlcmZhY2UgSUVudW1TVEFUU1RHIAorICAgIHsgCisgICAgICAgIC8vIFRoZSB1c2VyIG5lZWRzIHRvIGFsbG9jYXRlIGFuIFNUQVRTVEcgYXJyYXkgd2hvc2Ugc2l6ZSBpcyBjZWx0LiAKKyAgICAgICAgW1ByZXNlcnZlU2lnXSAKKyAgICAgICAgdWludCBOZXh0KCAKKyAgICAgICAgICAgIHVpbnQgY2VsdCwgCisgICAgICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSksIE91dF0gCisgICAgICAgICAgICBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ29tVHlwZXMuU1RBVFNUR1tdIHJnZWx0LCAKKyAgICAgICAgICAgIG91dCB1aW50IHBjZWx0RmV0Y2hlZCAKKyAgICAgICAgKTsgCisgCisgICAgICAgIHZvaWQgU2tpcCh1aW50IGNlbHQpOyAKKyAKKyAgICAgICAgdm9pZCBSZXNldCgpOyAKKyAKKyAgICAgICAgW3JldHVybjogTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuSW50ZXJmYWNlKV0gCisgICAgICAgIElFbnVtU1RBVFNURyBDbG9uZSgpOyAKKyAgICB9IAorIAorICAgIFtDb21JbXBvcnRdIAorICAgIFtHdWlkKCIwMDAwMDAwYi0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDYiKV0gCisgICAgW0ludGVyZmFjZVR5cGUoQ29tSW50ZXJmYWNlVHlwZS5JbnRlcmZhY2VJc0lVbmtub3duKV0gCisgICAgaW50ZXJmYWNlIElTdG9yYWdlIAorICAgIHsgCisgICAgICAgIHZvaWQgQ3JlYXRlU3RyZWFtKCAKKyAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc05hbWUsIAorICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IGdyZk1vZGUsIAorICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMSwgCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgcmVzZXJ2ZWQyLCAKKyAgICAgICAgICAgIC8qIFtvdXRdICovIG91dCBjb21UeXBlcy5JU3RyZWFtIHBwc3RtKTsgCisgICAgICAgIAorICAgICAgICB2b2lkIE9wZW5TdHJlYW0oIAorICAgICAgICAgICAgLyogW3N0cmluZ11baW5dICovIHN0cmluZyBwd2NzTmFtZSwgCisgICAgICAgICAgICAvKiBbdW5pcXVlXVtpbl0gKi8gSW50UHRyIHJlc2VydmVkMSwgCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgZ3JmTW9kZSwgCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgcmVzZXJ2ZWQyLAorICAgICAgICAgICAgLyogW291dF0gKi8gb3V0IGNvbVR5cGVzLklTdHJlYW0gcHBzdG0pOyAKKyAKKyAgICAgICAgdm9pZCBDcmVhdGVTdG9yYWdlKCAKKyAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc05hbWUsIAorICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IGdyZk1vZGUsIAorICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMSwgCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgcmVzZXJ2ZWQyLCAKKyAgICAgICAgICAgIC8qIFtvdXRdICovIG91dCBJU3RvcmFnZSBwcHN0Zyk7IAorIAorICAgICAgICB2b2lkIE9wZW5TdG9yYWdlKCAKKyAgICAgICAgICAgIC8qIFtzdHJpbmddW3VuaXF1ZV1baW5dICovIHN0cmluZyBwd2NzTmFtZSwgCisgICAgICAgICAgICAvKiBbdW5pcXVlXVtpbl0gKi8gSVN0b3JhZ2UgcHN0Z1ByaW9yaXR5LCAKKyAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZNb2RlLCAKKyAgICAgICAgICAgIC8qIFt1bmlxdWVdW2luXSAqLyBJbnRQdHIgc25iRXhjbHVkZSwgCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgcmVzZXJ2ZWQsIAorICAgICAgICAgICAgLyogW291dF0gKi8gb3V0IElTdG9yYWdlIHBwc3RnKTsKKworICAgICAgICB2b2lkIENvcHlUbygKKyAgICAgICAgICAgIFtJbkF0dHJpYnV0ZV0gdWludCBjaWlkRXhjbHVkZSwKKyAgICAgICAgICAgIFtJbkF0dHJpYnV0ZV0gR3VpZFtdIHJnaWlkRXhjbHVkZSwKKyAgICAgICAgICAgIFtJbkF0dHJpYnV0ZV0gSW50UHRyIHNuYkV4Y2x1ZGUsCisgICAgICAgICAgICBbSW5BdHRyaWJ1dGVdIElTdG9yYWdlIHBzdGdEZXN0CisgICAgICAgICk7CisgCisgICAgICAgIHZvaWQgTW92ZUVsZW1lbnRUbyggCisgICAgICAgICAgICAvKiBbc3RyaW5nXVtpbl0gKi8gc3RyaW5nIHB3Y3NOYW1lLCAKKyAgICAgICAgICAgIC8qIFt1bmlxdWVdW2luXSAqLyBJU3RvcmFnZSBwc3RnRGVzdCwgCisgICAgICAgICAgICAvKiBbc3RyaW5nXVtpbl0gKi8gc3RyaW5nIHB3Y3NOZXdOYW1lLCAKKyAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZGbGFncyk7IAorIAorICAgICAgICB2b2lkIENvbW1pdCggCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgZ3JmQ29tbWl0RmxhZ3MpOyAKKyAKKyAgICAgICAgdm9pZCBSZXZlcnQoKTsgCisgCisgICAgICAgIHZvaWQgRW51bUVsZW1lbnRzKCAKKyAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCByZXNlcnZlZDEsIAorICAgICAgICAgICAgLyogW3NpemVfaXNdW3VuaXF1ZV1baW5dICovIEludFB0ciByZXNlcnZlZDIsIAorICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IHJlc2VydmVkMywgCisgICAgICAgICAgICAvKiBbb3V0XSAqLyBvdXQgSUVudW1TVEFUU1RHIHBwZW51bSk7IAorIAorICAgICAgICB2b2lkIERlc3Ryb3lFbGVtZW50KCAKKyAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc05hbWUpOyAKKyAKKyAgICAgICAgdm9pZCBSZW5hbWVFbGVtZW50KCAKKyAgICAgICAgICAgIC8qIFtzdHJpbmddW2luXSAqLyBzdHJpbmcgcHdjc09sZE5hbWUsIAorICAgICAgICAgICAgLyogW3N0cmluZ11baW5dICovIHN0cmluZyBwd2NzTmV3TmFtZSk7IAorIAorICAgICAgICB2b2lkIFNldEVsZW1lbnRUaW1lcyggCisgICAgICAgICAgICAvKiBbc3RyaW5nXVt1bmlxdWVdW2luXSAqLyBzdHJpbmcgcHdjc05hbWUsIAorICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5GSUxFVElNRSBwY3RpbWUsIAorICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5GSUxFVElNRSBwYXRpbWUsIAorICAgICAgICAgICAgLyogW3VuaXF1ZV1baW5dICovIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5GSUxFVElNRSBwbXRpbWUpOyAKKyAKKyAgICAgICAgdm9pZCBTZXRDbGFzcyggCisgICAgICAgICAgICAvKiBbaW5dICovIEd1aWQgY2xzaWQpOyAKKyAKKyAgICAgICAgdm9pZCBTZXRTdGF0ZUJpdHMoIAorICAgICAgICAgICAgLyogW2luXSAqLyB1aW50IGdyZlN0YXRlQml0cywgCisgICAgICAgICAgICAvKiBbaW5dICovIHVpbnQgZ3JmTWFzayk7IAorIAorICAgICAgICB2b2lkIFN0YXQoIAorICAgICAgICAgICAgLyogW291dF0gKi8gb3V0IFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21UeXBlcy5TVEFUU1RHIHBzdGF0c3RnLCAKKyAgICAgICAgICAgIC8qIFtpbl0gKi8gdWludCBncmZTdGF0RmxhZyk7IAorIAorICAgIH0KKyAgICBbQ29tVmlzaWJsZShmYWxzZSldCisgICAgW0NvbUltcG9ydCwgSW50ZXJmYWNlVHlwZShDb21JbnRlcmZhY2VUeXBlLkludGVyZmFjZUlzSVVua25vd24pLCBHdWlkKCIwMDAwMDAwQS0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDYiKV0KKyAgICBpbnRlcm5hbCBpbnRlcmZhY2UgSUxvY2tCeXRlcworICAgIHsKKyAgICAgICAgdm9pZCBSZWFkQXQobG9uZyB1bE9mZnNldCwgU3lzdGVtLkludFB0ciBwdiwgaW50IGNiLCBvdXQgVUludFB0ciBwY2JSZWFkKTsKKyAgICAgICAgdm9pZCBXcml0ZUF0KGxvbmcgdWxPZmZzZXQsIFN5c3RlbS5JbnRQdHIgcHYsIGludCBjYiwgb3V0IFVJbnRQdHIgcGNiV3JpdHRlbik7CisgICAgICAgIHZvaWQgRmx1c2goKTsKKyAgICAgICAgdm9pZCBTZXRTaXplKGxvbmcgY2IpOworICAgICAgICB2b2lkIExvY2tSZWdpb24obG9uZyBsaWJPZmZzZXQsIGxvbmcgY2IsIGludCBkd0xvY2tUeXBlKTsKKyAgICAgICAgdm9pZCBVbmxvY2tSZWdpb24obG9uZyBsaWJPZmZzZXQsIGxvbmcgY2IsIGludCBkd0xvY2tUeXBlKTsKKyAgICAgICAgdm9pZCBTdGF0KG91dCBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuQ29tVHlwZXMuU1RBVFNURyBwc3RhdHN0ZywgaW50IGdyZlN0YXRGbGFnKTsKKyAgICB9CisgICAgW0ZsYWdzXSAKKyAgICBpbnRlcm5hbCBlbnVtIFNUR00gOiBpbnQgCisgICAgeyAKKyAgICAgICAgRElSRUNUID0gMHgwMDAwMDAwMCwgCisgICAgICAgIFRSQU5TQUNURUQgPSAweDAwMDEwMDAwLCAKKyAgICAgICAgU0lNUExFID0gMHgwODAwMDAwMCwgCisgICAgICAgIFJFQUQgPSAweDAwMDAwMDAwLCAKKyAgICAgICAgV1JJVEUgPSAweDAwMDAwMDAxLCAKKyAgICAgICAgUkVBRFdSSVRFID0gMHgwMDAwMDAwMiwgCisgICAgICAgIFNIQVJFX0RFTllfTk9ORSA9IDB4MDAwMDAwNDAsIAorICAgICAgICBTSEFSRV9ERU5ZX1JFQUQgPSAweDAwMDAwMDMwLCAKKyAgICAgICAgU0hBUkVfREVOWV9XUklURSA9IDB4MDAwMDAwMjAsIAorICAgICAgICBTSEFSRV9FWENMVVNJVkUgPSAweDAwMDAwMDEwLCAKKyAgICAgICAgUFJJT1JJVFkgPSAweDAwMDQwMDAwLCAKKyAgICAgICAgREVMRVRFT05SRUxFQVNFID0gMHgwNDAwMDAwMCwgCisgICAgICAgIE5PU0NSQVRDSCA9IDB4MDAxMDAwMDAsIAorICAgICAgICBDUkVBVEUgPSAweDAwMDAxMDAwLCAKKyAgICAgICAgQ09OVkVSVCA9IDB4MDAwMjAwMDAsIAorICAgICAgICBGQUlMSUZUSEVSRSA9IDB4MDAwMDAwMDAsIAorICAgICAgICBOT1NOQVBTSE9UID0gMHgwMDIwMDAwMCwgCisgICAgICAgIERJUkVDVF9TV01SID0gMHgwMDQwMDAwMCwgCisgICAgfSAKKyAKKyAgICBpbnRlcm5hbCBlbnVtIFNUQVRGTEFHIDogdWludCAKKyAgICB7IAorICAgICAgICBTVEFURkxBR19ERUZBVUxUID0gMCwgCisgICAgICAgIFNUQVRGTEFHX05PTkFNRSA9IDEsIAorICAgICAgICBTVEFURkxBR19OT09QRU4gPSAyIAorICAgIH0gCisgCisgICAgaW50ZXJuYWwgZW51bSBTVEdUWSA6IGludCAKKyAgICB7IAorICAgICAgICBTVEdUWV9TVE9SQUdFID0gMSwgCisgICAgICAgIFNUR1RZX1NUUkVBTSA9IDIsIAorICAgICAgICBTVEdUWV9MT0NLQllURVMgPSAzLCAKKyAgICAgICAgU1RHVFlfUFJPUEVSVFkgPSA0IAorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9JQXJndW1lbnQuY3MgYi9FUFBsdXMvVXRpbHMvSUFyZ3VtZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNGE1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVXRpbHMvSUFyZ3VtZW50LmNzCkBAIC0wLDAgKzEsNDggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5VdGlscworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXJndW1lbnQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPkFyZ3VtZW50IFR5cGU8L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElBcmd1bWVudDxUPgorICAgIHsKKyAgICAgICAgVCBWYWx1ZSB7IGdldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9JRXhjZWxDZWxsLmNzIGIvRVBQbHVzL1V0aWxzL0lFeGNlbENlbGwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0Nzk1MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9VdGlscy9JRXhjZWxDZWxsLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKK3sKKyAgICBpbnRlcm5hbCBpbnRlcmZhY2UgSUV4Y2VsQ2VsbAorICAgIHsKKyAgICAgICAgI3JlZ2lvbiAicHVibGljIHByb3BlcnRpZXMiCisgICAgICAgIG9iamVjdCBWYWx1ZSB7Z2V0O3NldDt9CisgICAgICAgIHN0cmluZyBTdHlsZU5hbWUgeyBnZXQ7IH0KKyAgICAgICAgaW50IFN0eWxlSUQgeyBnZXQ7IHNldDsgfQorICAgICAgICBFeGNlbFN0eWxlIFN0eWxlIHsgZ2V0OyB9CisgICAgICAgIFVyaSBIeXBlcmxpbmsgeyBnZXQ7IHNldDsgfQorICAgICAgICBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisgICAgICAgIHN0cmluZyBGb3JtdWxhUjFDMSB7IGdldDsgc2V0OyB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvSVZhbGlkYXRpb25SZXN1bHQuY3MgYi9FUFBsdXMvVXRpbHMvSVZhbGlkYXRpb25SZXN1bHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliNDk4NgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9VdGlscy9JVmFsaWRhdGlvblJlc3VsdC5jcwpAQCAtMCwwICsxLDEzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCit7CisgICAgcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblJlc3VsdAorICAgIHsKKyAgICAgICAgdm9pZCBJc1RydWUoKTsKKyAgICAgICAgdm9pZCBJc0ZhbHNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL1JlcXVpcmUuY3MgYi9FUFBsdXMvVXRpbHMvUmVxdWlyZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjk5NDNmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1V0aWxzL1JlcXVpcmUuY3MKQEAgLTAsMCArMSw1MiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBVdGlsaXR5IGZvciB2YWxpZGF0aW9uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVpcmUKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUFyZ3VtZW50PFQ+IEFyZ3VtZW50PFQ+KFQgYXJndW1lbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJndW1lbnQ8VD4oYXJndW1lbnQpOworICAgICAgICB9CisKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9TcVJlZlV0aWxpdHkuY3MgYi9FUFBsdXMvVXRpbHMvU3FSZWZVdGlsaXR5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzA0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVXRpbHMvU3FSZWZVdGlsaXR5LmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENsYXNzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbiBiZXR3ZWVuIEV4Y2VsQWRkcmVzc2VzIGFuZCBzcXJlZiBhZGRyZXNzZXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNxUmVmVXRpbGl0eQorICAgIHsKKyAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgLy8vIFRyYW5zZm9ybXMgYW4gYWRkcmVzcyB0byBhIHZhbGlkIHNxUmVmIGFkZHJlc3MuCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzIHRvIHRyYW5zZm9ybTwvcGFyYW0+CisgICAgICAgLy8vIDxyZXR1cm5zPkEgdmFsaWQgU3FSZWYgYWRkcmVzczwvcmV0dXJucz4KKyAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBUb1NxUmVmQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKKyAgICAgICB7CisgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsT3JFbXB0eShhZGRyZXNzKTsKKyAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuUmVwbGFjZSgiLCIsICIgIik7CisgICAgICAgICAgIGFkZHJlc3MgPSBuZXcgUmVnZXgoIlsgXSsiKS5SZXBsYWNlKGFkZHJlc3MsICIgIik7CisgICAgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgICAgIH0KKworICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAvLy8gVHJhbnNmb3JtcyBhbiBzcVJlZiBhZGRyZXNzIGludG8gYSBleGNlbCBhZGRyZXNzCisgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzIHRvIHRyYW5zZm9ybTwvcGFyYW0+CisgICAgICAgLy8vIDxyZXR1cm5zPkEgdmFsaWQgZXhjZWwgYWRkcmVzczwvcmV0dXJucz4KKyAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBGcm9tU3FSZWZBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgIHsKKyAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGxPckVtcHR5KGFkZHJlc3MpOworICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5SZXBsYWNlKCIgIiwgIiwiKTsKKyAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9VcmlIZWxwZXIuY3MgYi9FUFBsdXMvVXRpbHMvVXJpSGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmY5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVXRpbHMvVXJpSGVscGVyLmNzCkBAIC0wLDAgKzEsOTEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKK3sKKyAgICBpbnRlcm5hbCBjbGFzcyBVcmlIZWxwZXIKKyAgICB7CisgICAgICAgIGludGVybmFsIHN0YXRpYyBVcmkgUmVzb2x2ZVBhcnRVcmkoVXJpIHNvdXJjZVVyaSwgVXJpIHRhcmdldFVyaSkKKyAgICAgICAgeworICAgICAgICAgICBpZih0YXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcuU3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRVcmk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmdbXSBzb3VyY2UgPSBzb3VyY2VVcmkuT3JpZ2luYWxTdHJpbmcuU3BsaXQoJy8nKTsKKyAgICAgICAgICAgIHN0cmluZ1tdIHRhcmdldCA9IHRhcmdldFVyaS5PcmlnaW5hbFN0cmluZy5TcGxpdCgnLycpOworCisgICAgICAgICAgICBpbnQgdCA9IHRhcmdldC5MZW5ndGggLSAxOworICAgICAgICAgICAgaW50IHM7CisgICAgICAgICAgICBpZihzb3VyY2VVcmkuT3JpZ2luYWxTdHJpbmcuRW5kc1dpdGgoIi8iKSkgLy9pcyB0aGUgc291cmNlIGEgZGlyZWN0b3J5PworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSBzb3VyY2UuTGVuZ3RoLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcz1zb3VyY2UuTGVuZ3RoLTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyBmaWxlID0gdGFyZ2V0W3QtLV07CisKKyAgICAgICAgICAgIHdoaWxlICh0ID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldFt0XSA9PSAiLiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0W3RdID09ICIuLiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzLS07CisgICAgICAgICAgICAgICAgICAgIHQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHRhcmdldFt0LS1dICsgIi8iICsgZmlsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocyA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpbnQgaT1zO2k+PTA7aS0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHNvdXJjZVtpXSArICIvIiArIGZpbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmkoZmlsZSxVcmlLaW5kLlJlbGF0aXZlT3JBYnNvbHV0ZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVXJpIEdldFJlbGF0aXZlVXJpKFVyaSBXb3Jrc2hlZXRVcmksIFVyaSB1cmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIHNvdXJjZSA9IFdvcmtzaGVldFVyaS5PcmlnaW5hbFN0cmluZy5TcGxpdCgnLycpOworICAgICAgICAgICAgc3RyaW5nW10gdGFyZ2V0ID0gdXJpLk9yaWdpbmFsU3RyaW5nLlNwbGl0KCcvJyk7CisKKyAgICAgICAgICAgIGludCBzbGVuOworICAgICAgICAgICAgaWYgKFdvcmtzaGVldFVyaS5PcmlnaW5hbFN0cmluZy5FbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsZW4gPSBzb3VyY2UuTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsZW4gPSBzb3VyY2UuTGVuZ3RoLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaSA8IHNsZW4gJiYgaSA8IHRhcmdldC5MZW5ndGggJiYgc291cmNlW2ldID09IHRhcmdldFtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyBkaXJVcD0iIjsKKyAgICAgICAgICAgIGZvciAoaW50IHMgPSBpOyBzIDwgc2xlbjsgcysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpclVwICs9ICIuLi8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSAiIjsKKyAgICAgICAgICAgIGZvciAoaW50IHQgPSBpOyB0IDwgdGFyZ2V0Lkxlbmd0aDsgdCsrKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmaWxlICs9IChmaWxlPT0iIj8iIjoiLyIpICsgdGFyZ2V0W3RdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmkoZGlyVXArZmlsZSxVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9WYWxpZGF0aW9uUmVzdWx0LmNzIGIvRVBQbHVzL1V0aWxzL1ZhbGlkYXRpb25SZXN1bHQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwNGRhYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9VdGlscy9WYWxpZGF0aW9uUmVzdWx0LmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKK3sKKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlc3VsdCA6IElWYWxpZGF0aW9uUmVzdWx0CisgICAgeworICAgICAgICBwdWJsaWMgVmFsaWRhdGlvblJlc3VsdChib29sIHJlc3VsdCkKKyAgICAgICAgICAgIDogdGhpcyhyZXN1bHQsIG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZhbGlkYXRpb25SZXN1bHQoYm9vbCByZXN1bHQsIHN0cmluZyBlcnJvck1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBfZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9yZXN1bHQ7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9lcnJvck1lc3NhZ2U7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFRocm93KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkoX2Vycm9yTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKF9lcnJvck1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJVmFsaWRhdGlvblJlc3VsdC5Jc1RydWUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9yZXN1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyb3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgSVZhbGlkYXRpb25SZXN1bHQuSXNGYWxzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRocm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvVkJBL0V4Y2VsVkJBTW9kdWxlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9WQkEvRXhjZWxWQkFNb2R1bGVDb2xsZWN0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjU1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVkJBL0V4Y2VsVkJBTW9kdWxlQ29sbGVjdGlvbi5jcwpAQCAtMCwwICsxLDIxMCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICoKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkxMi1BUFItMjAxMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgVkJBIGNvbGxlY3Rpb25zCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj48L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxWQkFDb2xsZWN0aW9uQmFzZTxUPiA6IElFbnVtZXJhYmxlPFQ+CisgICAgeworICAgICAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgTGlzdDxUPiBfbGlzdD1uZXcgTGlzdDxUPigpOyAgICAgICAgCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxUPiBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kZXhlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPk5hbWU8L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgVCB0aGlzIFtzdHJpbmcgTmFtZV0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkZpbmQoKGYpID0+IGYuR2V0VHlwZSgpLkdldFByb3BlcnR5KCJOYW1lIikuR2V0VmFsdWUoZiwgbnVsbCkuVG9TdHJpbmcoKS5FcXVhbHMoTmFtZSxTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5kZXhlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5Qb3NpdGlvbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHB1YmxpYyBUIHRoaXNbaW50IEluZGV4XQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfbGlzdC5Db3VudDsgfQorICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIGEgc3BlY2lmaWMgbmFtZSBleGlzdHMgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UcnVlIGlmIHRoZSBuYW1lIGV4aXN0czwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIGJvb2wgRXhpc3RzKHN0cmluZyBOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2xpc3QuRXhpc3RzKChmKSA9PiBmLkdldFR5cGUoKS5HZXRQcm9wZXJ0eSgiTmFtZSIpLkdldFZhbHVlKGYsIG51bGwpLlRvU3RyaW5nKCkuRXF1YWxzKE5hbWUsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlbW92ZXMgdGhlIGl0ZW0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJdGVtIj48L3BhcmFtPgorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoVCBJdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdC5SZW1vdmUoSXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPlRIZSBpbmRleDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3QuUmVtb3ZlQXQoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3QuQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIFZCQSBtb2R1bGVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uIDogRXhjZWxWQkFDb2xsZWN0aW9uQmFzZTxFeGNlbFZCQU1vZHVsZT4KKyAgICB7CisgICAgICAgIEV4Y2VsVmJhUHJvamVjdCBfcHJvamVjdDsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uIChFeGNlbFZiYVByb2plY3QgcHJvamVjdCkKKwkgICAgeworICAgICAgICAgICAgX3Byb2plY3Q9cHJvamVjdDsKKwkgICAgfQorICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZChFeGNlbFZCQU1vZHVsZSBJdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdC5BZGQoSXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIG5ldyBWQkEgTW9kdWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIG1vZHVsZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbW9kdWxlIG9iamVjdDwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIEV4Y2VsVkJBTW9kdWxlIEFkZE1vZHVsZShzdHJpbmcgTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXNbTmFtZV0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZiYSBtb2R1bGVuYW1lIGFscmVhZHkgZXhpc3QuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG0gPSBuZXcgRXhjZWxWQkFNb2R1bGUoKTsKKyAgICAgICAgICAgIG0uTmFtZSA9IE5hbWU7CisgICAgICAgICAgICBtLlR5cGUgPSBlTW9kdWxlVHlwZS5Nb2R1bGU7CisgICAgICAgICAgICBtLkF0dHJpYnV0ZXMuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9OYW1lIiwgVmFsdWUgPSBOYW1lLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5TdHJpbmcgfSk7CisgICAgICAgICAgICBtLlR5cGUgPSBlTW9kdWxlVHlwZS5Nb2R1bGU7CisgICAgICAgICAgICBfbGlzdC5BZGQobSk7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgbmV3IFZCQSBjbGFzcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSBjbGFzczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRXhwb3NlZCI+UHJpdmF0ZSBvciBQdWJsaWMgbm90IGNyZWF0ZWJsZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2xhc3Mgb2JqZWN0PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgRXhjZWxWQkFNb2R1bGUgQWRkQ2xhc3Moc3RyaW5nIE5hbWUsIGJvb2wgRXhwb3NlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG0gPSBuZXcgRXhjZWxWQkFNb2R1bGUoKTsKKyAgICAgICAgICAgIG0uTmFtZSA9IE5hbWU7ICAgICAgICAgICAgCisgICAgICAgICAgICBtLlR5cGUgPSBlTW9kdWxlVHlwZS5DbGFzczsKKyAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX05hbWUiLCBWYWx1ZSA9IE5hbWUsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLlN0cmluZyB9KTsKKyAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0Jhc2UiLCBWYWx1ZSA9ICIwe0ZDRkIzRDJBLUEwRkEtMTA2OC1BNzM4LTA4MDAyQjMzNzFCNX0iLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5TdHJpbmcgfSk7CisgICAgICAgICAgICBtLkF0dHJpYnV0ZXMuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9HbG9iYWxOYW1lU3BhY2UiLCBWYWx1ZSA9ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKKyAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0NyZWF0YWJsZSIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworICAgICAgICAgICAgbS5BdHRyaWJ1dGVzLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfUHJlZGVjbGFyZWRJZCIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworICAgICAgICAgICAgbS5BdHRyaWJ1dGVzLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfRXhwb3NlZCIsIFZhbHVlID0gRXhwb3NlZCA/ICJUcnVlIiA6ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKKyAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX1RlbXBsYXRlRGVyaXZlZCIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworICAgICAgICAgICAgbS5BdHRyaWJ1dGVzLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfQ3VzdG9taXphYmxlIiwgVmFsdWUgPSAiRmFsc2UiLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5Ob25TdHJpbmcgfSk7CisKKyAgICAgICAgICAgIC8vbS5Db2RlID0gX3Byb2plY3QuR2V0QmxhbmtDbGFzc01vZHVsZShOYW1lLCBFeHBvc2VkKTsKKyAgICAgICAgICAgIG0uUHJpdmF0ZSA9ICFFeHBvc2VkOworICAgICAgICAgICAgLy9tLkNsYXNzSUQ9CisgICAgICAgICAgICBfbGlzdC5BZGQobSk7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgY29sbGVjdGlvbiBvZiB0aGUgdmJhIHByb2plY3RzIHJlZmVyZW5jZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZiYVJlZmVyZW5jZUNvbGxlY3Rpb24gOiBFeGNlbFZCQUNvbGxlY3Rpb25CYXNlPEV4Y2VsVmJhUmVmZXJlbmNlPgorICAgIHsgICAgICAgIAorICAgICAgICBpbnRlcm5hbCBFeGNlbFZiYVJlZmVyZW5jZUNvbGxlY3Rpb24oKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgbmV3IHJlZmVyZW5jZSAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJdGVtIj5UaGUgcmVmZXJlbmNlIG9iamVjdDwvcGFyYW0+CisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChFeGNlbFZiYVJlZmVyZW5jZSBJdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdC5BZGQoSXRlbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgdGhlIG1vZHVsZSBsZXZlbCBhdHRyaWJ1dGVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGVzQ29sbGVjdGlvbiA6IEV4Y2VsVkJBQ29sbGVjdGlvbkJhc2U8RXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGU+CisgICAgeworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0QXR0cmlidXRlVGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2I9bmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGF0dHIgaW4gdGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkF0dHJpYnV0ZSB7MH0gPSB7MX1cclxuIiwgYXR0ci5OYW1lLCBhdHRyLkRhdGFUeXBlPT1lQXR0cmlidXRlRGF0YVR5cGUuU3RyaW5nID8gIlwiIiArIGF0dHIuVmFsdWUgKyAiXCIiIDogYXR0ci5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWQkFQcm9qZWN0LmNzIGIvRVBQbHVzL1ZCQS9FeGNlbFZCQVByb2plY3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkYjQ3MgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9WQkEvRXhjZWxWQkFQcm9qZWN0LmNzCkBAIC0wLDAgKzEsMTE0NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKgorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogSWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB0aGlzIGNvZGUgaGF2ZSBhIGxvb2sgYXQgdGhlIE9mZmljZSBWQkEgRmlsZSBGb3JtYXQgU3RydWN0dXJlIFNwZWNpZmljYXRpb24gKE1TLU9WQkEuUERGKSBvcgorICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjMzEzMDk0KHY9b2ZmaWNlLjEyKS5hc3B4CisgKiAKKyAqICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjYtTUFSLTIwMTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5Qa2NzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVkJBCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXByZXNlbnRzIHRoZSBWQkEgcHJvamVjdCBwYXJ0IG9mIHRoZSBwYWNrYWdlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFQcm9qZWN0CisgICAgeworICAgICAgICBjb25zdCBzdHJpbmcgc2NoZW1hUmVsVmJhID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDYvcmVsYXRpb25zaGlwcy92YmFQcm9qZWN0IjsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFBhcnRVcmkgPSBAIi94bC92YmFQcm9qZWN0LmJpbiI7CisgICAgICAgICNyZWdpb24gQ2xhc3NlcyAmIEVudW1zCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGUgb2Ygc3lzdGVtIHdoZXJlIHRoZSBWQkEgcHJvamVjdCB3YXMgY3JlYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGVudW0gZVN5c2tpbmQKKyAgICAgICAgeworICAgICAgICAgICAgV2luMTYgPSAwLAorICAgICAgICAgICAgV2luMzIgPSAxLAorICAgICAgICAgICAgTWFjaW50b3NoID0gMiwKKyAgICAgICAgICAgIFdpbjY0ID0gMworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICBpbnRlcm5hbCBFeGNlbFZiYVByb2plY3QoRXhjZWxXb3JrYm9vayB3YikKKyAgICAgICAgeworICAgICAgICAgICAgX3diID0gd2I7CisgICAgICAgICAgICBfcGNrID0gX3diLl9wYWNrYWdlLlBhY2thZ2U7CisgICAgICAgICAgICBSZWZlcmVuY2VzID0gbmV3IEV4Y2VsVmJhUmVmZXJlbmNlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgTW9kdWxlcyA9IG5ldyBFeGNlbFZiYU1vZHVsZUNvbGxlY3Rpb24odGhpcyk7CisgICAgICAgICAgICB2YXIgcmVsID0gX3diLlBhcnQuR2V0UmVsYXRpb25zaGlwc0J5VHlwZShzY2hlbWFSZWxWYmEpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAocmVsICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXJpID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHJlbC5Tb3VyY2VVcmksIHJlbC5UYXJnZXRVcmkpOworICAgICAgICAgICAgICAgIFBhcnQgPSBfcGNrLkdldFBhcnQoVXJpKTsKKyNpZiAhTU9OTworICAgICAgICAgICAgICAgIEdldFByb2plY3QoKTsgICAgICAgICAgICAgICAgCisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMY2lkID0gMDsKKyAgICAgICAgICAgICAgICBQYXJ0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtib29rIF93YjsKKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2UgX3BjazsKKyAgICAgICAgI3JlZ2lvbiBEaXIgU3RyZWFtIFByb3BlcnRpZXMKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3lzdGVtIGtpbmQuIERlZmF1bHQgV2luMzIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlU3lza2luZCBTeXN0ZW1LaW5kIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTmFtZSBvZiB0aGUgcHJvamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgRGVzY3JpcHRpb24geyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGhlbHBmaWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSGVscEZpbGUxIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2Vjb25kYXJ5IGhlbHBmaWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgSGVscEZpbGUyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udGV4dCBpZiByZWZlcmluZyB0aGUgaGVscGZpbGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBIZWxwQ29udGV4dElEIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gY29uc3RhbnRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgQ29uc3RhbnRzIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29kZXBhZ2UgZm9yIGVuY29kaW5nLiBEZWZhdWx0IGlzIGN1cnJlbnQgcmVnaW9uYWwgc2V0dGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBDb2RlUGFnZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgICAgICAgIGludGVybmFsIGludCBMaWJGbGFncyB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIGludCBNYWpvclZlcnNpb24geyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBpbnQgTWlub3JWZXJzaW9uIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgaW50IExjaWQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBpbnQgTGNpZEludm9rZSB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIHN0cmluZyBQcm9qZWN0SUQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUHJvamVjdFN0cmVhbVRleHQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm9qZWN0IHJlZmVyZW5jZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgIAorICAgICAgICBwdWJsaWMgRXhjZWxWYmFSZWZlcmVuY2VDb2xsZWN0aW9uIFJlZmVyZW5jZXMgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb2RlIE1vZHVsZXMgKE1vZHVsZXMsIGNsYXNzZXMsIGRlc2lnbmVyIGNvZGUpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFZiYU1vZHVsZUNvbGxlY3Rpb24gTW9kdWxlcyB7IGdldDsgc2V0OyB9CisgICAgICAgIEV4Y2VsVmJhU2lnbmF0dXJlIF9zaWduYXR1cmUgPSBudWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZGlnaXRhbCBzaWduYXR1cmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVmJhU2lnbmF0dXJlIFNpZ25hdHVyZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3NpZ25hdHVyZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NpZ25hdHVyZT1uZXcgRXhjZWxWYmFTaWduYXR1cmUoUGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfc2lnbmF0dXJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VsVmJhUHJvdGVjdGlvbiBfcHJvdGVjdGlvbj1udWxsOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWQkEgcHJvdGVjdGlvbiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVmJhUHJvdGVjdGlvbiBQcm90ZWN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcHJvdGVjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24gPSBuZXcgRXhjZWxWYmFQcm90ZWN0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX3Byb3RlY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorI2lmICFNT05PCisgICAgICAgICNyZWdpb24gUmVhZCBQcm9qZWN0CisgICAgICAgIHByaXZhdGUgdm9pZCBHZXRQcm9qZWN0KCkKKyAgICAgICAgeworCisgICAgICAgICAgICB2YXIgc3RyZWFtID0gUGFydC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSB2YmE7CisgICAgICAgICAgICB2YmEgPSBuZXcgYnl0ZVtzdHJlYW0uTGVuZ3RoXTsKKyAgICAgICAgICAgIHN0cmVhbS5SZWFkKHZiYSwgMCwgKGludClzdHJlYW0uTGVuZ3RoKTsKKyAgICAgICAgICAgIERvY3VtZW50ID0gbmV3IENvbXBvdW5kRG9jdW1lbnQodmJhKTsKKworICAgICAgICAgICAgUmVhZERpclN0cmVhbSgpOworICAgICAgICAgICAgUHJvamVjdFN0cmVhbVRleHQgPSBFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0U3RyaW5nKERvY3VtZW50LlN0b3JhZ2UuRGF0YVN0cmVhbXNbIlBST0pFQ1QiXSk7CisgICAgICAgICAgICBSZWFkTW9kdWxlcygpOworICAgICAgICAgICAgUmVhZFByb2plY3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRNb2R1bGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIG1vZHVsIGluIE1vZHVsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IERvY3VtZW50LlN0b3JhZ2UuU3ViU3RvcmFnZVsiVkJBIl0uRGF0YVN0cmVhbXNbbW9kdWwuc3RyZWFtTmFtZV07CisgICAgICAgICAgICAgICAgdmFyIGJ5Q29kZSA9IENvbXBvdW5kRG9jdW1lbnQuRGVjb21wcmVzc1BhcnQoc3RyZWFtLCAoaW50KW1vZHVsLk1vZHVsZU9mZnNldCk7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNvZGUgPSBFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0U3RyaW5nKGJ5Q29kZSk7CisgICAgICAgICAgICAgICAgaW50IHBvcz0wOworICAgICAgICAgICAgICAgIHdoaWxlKHBvcys5PGNvZGUuTGVuZ3RoICYmIGNvZGUuU3Vic3RyaW5nKHBvcyw5KT09IkF0dHJpYnV0ZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGluZVBvcz1jb2RlLkluZGV4T2YoIlxyXG4iLHBvcyk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIGxpbmVTcGxpdDsKKyAgICAgICAgICAgICAgICAgICAgaWYobGluZVBvcz4wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3BsaXQgPSBjb2RlLlN1YnN0cmluZyhwb3MgKyA5LCBsaW5lUG9zIC0gcG9zIC0gOSkuU3BsaXQoJz0nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGxpdD1jb2RlLlN1YnN0cmluZyhwb3MrOSkuU3BsaXQobmV3IGNoYXJbXXsnPSd9LDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lU3BsaXQuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNwbGl0WzFdID0gbGluZVNwbGl0WzFdLlRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gbGluZVNwbGl0WzBdLlRyaW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IGxpbmVTcGxpdFsxXS5TdGFydHNXaXRoKCJcIiIpID8gZUF0dHJpYnV0ZURhdGFUeXBlLlN0cmluZyA6IGVBdHRyaWJ1dGVEYXRhVHlwZS5Ob25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBsaW5lU3BsaXRbMV0uU3RhcnRzV2l0aCgiXCIiKSA/IGxpbmVTcGxpdFsxXS5TdWJzdHJpbmcoMSwgbGluZVNwbGl0WzFdLkxlbmd0aCAtIDIpIDogbGluZVNwbGl0WzFdCisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWwuQXR0cmlidXRlcy5fbGlzdC5BZGQoYXR0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9zID0gbGluZVBvcyArIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1vZHVsLkNvZGU9Y29kZS5TdWJzdHJpbmcocG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkUHJvamVjdFByb3BlcnRpZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBfcHJvdGVjdGlvbiA9IG5ldyBFeGNlbFZiYVByb3RlY3Rpb24odGhpcyk7CisgICAgICAgICAgICBzdHJpbmcgcHJldlBhY2thZ2UgPSAiIjsKKyAgICAgICAgICAgIHZhciBsaW5lcyA9IFJlZ2V4LlNwbGl0KFByb2plY3RTdHJlYW1UZXh0LCAiXHJcbiIpOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGxpbmUgaW4gbGluZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuU3RhcnRzV2l0aCgiWyIpKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3BsaXQgPSBsaW5lLlNwbGl0KCc9Jyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5MZW5ndGggPiAxICYmIHNwbGl0WzFdLkxlbmd0aCA+IDEgJiYgc3BsaXRbMV0uU3RhcnRzV2l0aCgiXCIiKSkgLy9SZW1vdmUgYW55IGRvdWJsZSBxb3VhdGVzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0WzFdID0gc3BsaXRbMV0uU3Vic3RyaW5nKDEsIHNwbGl0WzFdLkxlbmd0aCAtIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3BsaXRbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIklEIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0SUQgPSBzcGxpdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkRvY3VtZW50IjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbW4gPSBzcGxpdFsxXS5TdWJzdHJpbmcoMCwgc3BsaXRbMV0uSW5kZXhPZigiLyZIIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZXNbbW5dLlR5cGUgPSBlTW9kdWxlVHlwZS5Eb2N1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIlBhY2thZ2UiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZQYWNrYWdlID0gc3BsaXRbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJCYXNlQ2xhc3MiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZXNbc3BsaXRbMV1dLlR5cGUgPSBlTW9kdWxlVHlwZS5EZXNpZ25lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVzW3NwbGl0WzFdXS5DbGFzc0lEID0gcHJldlBhY2thZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJNb2R1bGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZXNbc3BsaXRbMV1dLlR5cGUgPSBlTW9kdWxlVHlwZS5Nb2R1bGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJDbGFzcyI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlc1tzcGxpdFsxXV0uVHlwZSA9IGVNb2R1bGVUeXBlLkNsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiSGVscEZpbGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiTmFtZSI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJIZWxwQ29udGV4dElEIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkRlc2NyaXB0aW9uIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIlZlcnNpb25Db21wYXRpYmxlMzIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8zOTMyMjIwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJDTUciOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjbWcgPSBEZWNyeXB0KHNwbGl0WzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJvdGVjdGlvbi5Vc2VyUHJvdGVjdGVkID0gKGNtZ1swXSAmIDEpICE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uSG9zdFByb3RlY3RlZCA9IChjbWdbMF0gJiAyKSAhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLlZiZVByb3RlY3RlZCA9IChjbWdbMF0gJiA0KSAhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiRFBCIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZHBiID0gRGVjcnlwdChzcGxpdFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRwYi5MZW5ndGggPj0gMjgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIHJlc2VydmVkID0gZHBiWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmxhZ3MgPSBuZXcgYnl0ZVszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShkcGIsIDEsIGZsYWdzLCAwLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleU5vTnVsbHMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uUGFzc3dvcmRLZXkgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShkcGIsIDQsIGtleU5vTnVsbHMsIDAsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFzaE5vTnVsbHMgPSBuZXcgYnl0ZVsyMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLlBhc3N3b3JkSGFzaCA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShkcGIsIDgsIGhhc2hOb051bGxzLCAwLCAyMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGFuZGxlIDB4MDAgYml0d2lzZSAyLjQuNC4zIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXQgPSAxMjggPj4gKGludCkoKGkgJSA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpKGZsYWdzWzBdICYgYml0KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uUGFzc3dvcmRLZXlbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJvdGVjdGlvbi5QYXNzd29yZEtleVtpXSA9IGtleU5vTnVsbHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnSW5kZXggPSAoaSAtIGkgJSA4KSAvIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpKGZsYWdzW2ZsYWdJbmRleF0gJiBiaXQpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJvdGVjdGlvbi5QYXNzd29yZEhhc2hbaSAtIDRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uUGFzc3dvcmRIYXNoW2kgLSA0XSA9IGhhc2hOb051bGxzW2kgLSA0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJHQyI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uVmlzaWJpbGl0eVN0YXRlID0gRGVjcnlwdChzcGxpdFsxXSlbMF0gPT0gMHhGRjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gMi40LjMuMyBEZWNyeXB0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPkJ5dGUgaGV4IHN0cmluZzwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGVjcnlwdGVkIHZhbHVlPC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBEZWNyeXB0KHN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGVuYyA9IEdldEJ5dGUodmFsdWUpOworICAgICAgICAgICAgYnl0ZVtdIGRlYyA9IG5ldyBieXRlWyh2YWx1ZS5MZW5ndGggLSAxKV07CisgICAgICAgICAgICBieXRlIHNlZWQsIHZlcnNpb24sIHByb2pLZXksIGlnbm9yZWRMZW5ndGg7CisgICAgICAgICAgICBzZWVkID0gZW5jWzBdOworICAgICAgICAgICAgZGVjWzBdID0gKGJ5dGUpKGVuY1sxXSBeIHNlZWQpOworICAgICAgICAgICAgZGVjWzFdID0gKGJ5dGUpKGVuY1syXSBeIHNlZWQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBlbmMuTGVuZ3RoIC0gMTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlY1tpXSA9IChieXRlKShlbmNbaSArIDFdIF4gKGVuY1tpIC0gMV0gKyBkZWNbaSAtIDFdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ZXJzaW9uID0gZGVjWzBdOworICAgICAgICAgICAgcHJvaktleSA9IGRlY1sxXTsKKyAgICAgICAgICAgIGlnbm9yZWRMZW5ndGggPSAoYnl0ZSkoKHNlZWQgJiA2KSAvIDIpOworICAgICAgICAgICAgaW50IGRhdGFsZW5ndGggPSBCaXRDb252ZXJ0ZXIuVG9JbnQzMihkZWMsIGlnbm9yZWRMZW5ndGggKyAyKTsKKyAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IGJ5dGVbZGF0YWxlbmd0aF07CisgICAgICAgICAgICBBcnJheS5Db3B5KGRlYywgNiArIGlnbm9yZWRMZW5ndGgsIGRhdGEsIDAsIGRhdGFsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gMi40LjMuMiBFbmNyeXB0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz5CeXRlIGhleCBzdHJpbmc8L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIEVuY3J5cHQoYnl0ZVtdIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gc2VlZCA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgdmFyIHJuID0gUmFuZG9tTnVtYmVyR2VuZXJhdG9yLkNyZWF0ZSgpOworICAgICAgICAgICAgcm4uR2V0Qnl0ZXMoc2VlZCk7CisgICAgICAgICAgICBCaW5hcnlXcml0ZXIgYnIgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7CisgICAgICAgICAgICBieXRlW10gZW5jID0gbmV3IGJ5dGVbdmFsdWUuTGVuZ3RoICsgMTBdOworICAgICAgICAgICAgZW5jWzBdID0gc2VlZFswXTsKKyAgICAgICAgICAgIGVuY1sxXSA9IChieXRlKSgyIF4gc2VlZFswXSk7CisKKyAgICAgICAgICAgIGJ5dGUgcHJvaktleSA9IDA7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIFByb2plY3RJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm9qS2V5ICs9IChieXRlKWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmNbMl0gPSAoYnl0ZSkocHJvaktleSBeIHNlZWRbMF0pOworICAgICAgICAgICAgdmFyIGlnbm9yZWRMZW5ndGggPSAoc2VlZFswXSAmIDYpIC8gMjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlZExlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyLldyaXRlKHNlZWRbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuV3JpdGUodmFsdWUuTGVuZ3RoKTsKKyAgICAgICAgICAgIGJyLldyaXRlKHZhbHVlKTsKKworICAgICAgICAgICAgaW50IHBvcyA9IDM7CisgICAgICAgICAgICBieXRlIHBiID0gcHJvaktleTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBiIGluICgoTWVtb3J5U3RyZWFtKWJyLkJhc2VTdHJlYW0pLlRvQXJyYXkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmNbcG9zXSA9IChieXRlKShiIF4gKGVuY1twb3MgLSAyXSArIHBiKSk7CisgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgcGIgPSBiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gR2V0U3RyaW5nKGVuYywgcG9zIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RyaW5nKGJ5dGVbXSB2YWx1ZSwgaW50IG1heCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJldCA9ICIiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlW2ldIDwgMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgKz0gIjAiICsgdmFsdWVbaV0uVG9TdHJpbmcoIngiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHZhbHVlW2ldLlRvU3RyaW5nKCJ4Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldC5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldEJ5dGUoc3RyaW5nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gcmV0ID0gbmV3IGJ5dGVbdmFsdWUuTGVuZ3RoIC8gMl07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldC5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXRbaV0gPSBieXRlLlBhcnNlKHZhbHVlLlN1YnN0cmluZyhpICogMiwgMiksIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkRGlyU3RyZWFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGRpciA9IENvbXBvdW5kRG9jdW1lbnQuRGVjb21wcmVzc1BhcnQoRG9jdW1lbnQuU3RvcmFnZS5TdWJTdG9yYWdlWyJWQkEiXS5EYXRhU3RyZWFtc1siZGlyIl0pOworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbShkaXIpOworICAgICAgICAgICAgQmluYXJ5UmVhZGVyIGJyID0gbmV3IEJpbmFyeVJlYWRlcihtcyk7CisgICAgICAgICAgICBFeGNlbFZiYVJlZmVyZW5jZSBjdXJyZW50UmVmID0gbnVsbDsKKyAgICAgICAgICAgIHN0cmluZyByZWZlcmVuY2VOYW1lID0gIiI7CisgICAgICAgICAgICBFeGNlbFZCQU1vZHVsZSBjdXJyZW50TW9kdWxlID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2wgdGVybWluYXRlID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoYnIuQmFzZVN0cmVhbS5Qb3NpdGlvbiA8IGJyLkJhc2VTdHJlYW0uTGVuZ3RoICYmIHRlcm1pbmF0ZSA9PSBmYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2hvcnQgaWQgPSBici5SZWFkVUludDE2KCk7CisgICAgICAgICAgICAgICAgdWludCBzaXplID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoaWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LaW5kID0gKGVTeXNraW5kKWJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgICAgICAgICBMY2lkID0gKGludClici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVBhZ2UgPSAoaW50KWJyLlJlYWRVSW50MTYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gR2V0U3RyaW5nKGJyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDU6CisgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IEdldFVuaWNvZGVTdHJpbmcoYnIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEhlbHBGaWxlMSA9IEdldFN0cmluZyhiciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDNEOgorICAgICAgICAgICAgICAgICAgICAgICAgSGVscEZpbGUyID0gR2V0U3RyaW5nKGJyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDc6CisgICAgICAgICAgICAgICAgICAgICAgICBIZWxwQ29udGV4dElEID0gKGludClici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA4OgorICAgICAgICAgICAgICAgICAgICAgICAgTGliRmxhZ3MgPSAoaW50KWJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDk6CisgICAgICAgICAgICAgICAgICAgICAgICBNYWpvclZlcnNpb24gPSAoaW50KWJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pbm9yVmVyc2lvbiA9IChpbnQpYnIuUmVhZFVJbnQxNigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cyA9IEdldFVuaWNvZGVTdHJpbmcoYnIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgc2l6ZUxpYklEID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ1JlZiA9IG5ldyBFeGNlbFZiYVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnUmVmLk5hbWUgPSByZWZlcmVuY2VOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnUmVmLlJlZmVyZW5jZVJlY29yZElEID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdSZWYuTGliaWQgPSBHZXRTdHJpbmcoYnIsIHNpemVMaWJJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHJlc2VydmVkMSA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCByZXNlcnZlZDIgPSBici5SZWFkVUludDE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VzLkFkZChyZWdSZWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9qUmVmID0gbmV3IEV4Y2VsVmJhUmVmZXJlbmNlUHJvamVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvalJlZi5SZWZlcmVuY2VSZWNvcmRJRCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvalJlZi5OYW1lID0gcmVmZXJlbmNlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVMaWJJRCA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2pSZWYuTGliaWQgPSBHZXRTdHJpbmcoYnIsIHNpemVMaWJJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplTGliSUQgPSBici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qUmVmLkxpYklkUmVsYXRpdmUgPSBHZXRTdHJpbmcoYnIsIHNpemVMaWJJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qUmVmLk1ham9yVmVyc2lvbiA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2pSZWYuTWlub3JWZXJzaW9uID0gYnIuUmVhZFVJbnQxNigpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlcy5BZGQocHJvalJlZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBGOgorICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IG1vZHVhbENvdW50ID0gYnIuUmVhZFVJbnQxNigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBjb29raWUgPSBici5SZWFkVUludDE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgTGNpZEludm9rZSA9IChpbnQpYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZU5hbWUgPSBHZXRVbmljb2RlU3RyaW5nKGJyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlID0gbmV3IEV4Y2VsVkJBTW9kdWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLk5hbWUgPSBHZXRVbmljb2RlU3RyaW5nKGJyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZXMuQWRkKGN1cnJlbnRNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxQToKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuc3RyZWFtTmFtZSA9IEdldFVuaWNvZGVTdHJpbmcoYnIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuRGVzY3JpcHRpb24gPSBHZXRVbmljb2RlU3RyaW5nKGJyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MUU6CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLkhlbHBDb250ZXh0ID0gKGludClici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDIxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDJCOiAgICAgIC8vTW9kdWwgVGVybWluYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuQ29va2llID0gYnIuUmVhZFVJbnQxNigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuTW9kdWxlT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4dFJlZiA9IChFeGNlbFZiYVJlZmVyZW5jZUNvbnRyb2wpY3VycmVudFJlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplRXh0ID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0UmVmLkxpYklkRXh0ZXJuYWwgPSBHZXRTdHJpbmcoYnIsIHNpemVFeHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHJlc2VydmVkNCA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCByZXNlcnZlZDUgPSBici5SZWFkVUludDE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRSZWYuT3JpZ2luYWxUeXBlTGliID0gbmV3IEd1aWQoYnIuUmVhZEJ5dGVzKDE2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRSZWYuQ29va2llID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZWYgPSBuZXcgRXhjZWxWYmFSZWZlcmVuY2VDb250cm9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVmLlJlZmVyZW5jZVJlY29yZElEID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVmLk5hbWUgPSByZWZlcmVuY2VOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlZi5MaWJpZCA9IEdldFN0cmluZyhiciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VzLkFkZChjdXJyZW50UmVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MkY6CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udHJSZWYgPSAoRXhjZWxWYmFSZWZlcmVuY2VDb250cm9sKWN1cnJlbnRSZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250clJlZi5SZWZlcmVuY2VSZWNvcmRJRCA9IGlkOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZVR3aWRkbGVkID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udHJSZWYuTGliSWRUd2lkZGxlZCA9IEdldFN0cmluZyhiciwgc2l6ZVR3aWRkbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByMSA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciByMiA9IGJyLlJlYWRVSW50MTYoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuUmVhZE9ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUuUHJpdmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBTYXZlIFByb2plY3QKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBTYXZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFZhbGlkYXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29tcG91bmREb2N1bWVudCBkb2MgPSBuZXcgQ29tcG91bmREb2N1bWVudCgpOworICAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlID0gbmV3IENvbXBvdW5kRG9jdW1lbnQuU3RvcmFnZVBhcnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSBuZXcgQ29tcG91bmREb2N1bWVudC5TdG9yYWdlUGFydCgpOworICAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlLlN1YlN0b3JhZ2UuQWRkKCJWQkEiLCBzdG9yZSk7CisKKyAgICAgICAgICAgICAgICBzdG9yZS5EYXRhU3RyZWFtcy5BZGQoIl9WQkFfUFJPSkVDVCIsIENyZWF0ZVZCQVByb2plY3RTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgc3RvcmUuRGF0YVN0cmVhbXMuQWRkKCJkaXIiLCBDcmVhdGVEaXJTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG1vZHVsZSBpbiBNb2R1bGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuRGF0YVN0cmVhbXMuQWRkKG1vZHVsZS5OYW1lLCBDb21wb3VuZERvY3VtZW50LkNvbXByZXNzUGFydChFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMobW9kdWxlLkF0dHJpYnV0ZXMuR2V0QXR0cmlidXRlVGV4dCgpICsgbW9kdWxlLkNvZGUpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9Db3B5IHN0cmVhbXMgZnJvbSB0aGUgdGVtcGxhdGUsIGlmIHVzZWQuCisgICAgICAgICAgICAgICAgaWYgKERvY3VtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc3MgaW4gRG9jdW1lbnQuU3RvcmFnZS5TdWJTdG9yYWdlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3MuS2V5ICE9ICJWQkEiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlLlN1YlN0b3JhZ2UuQWRkKHNzLktleSwgc3MuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIERvY3VtZW50LlN0b3JhZ2UuRGF0YVN0cmVhbXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLktleSAhPSAiZGlyIiAmJiBzLktleSAhPSAiUFJPSkVDVCIgJiYgcy5LZXkgIT0gIlBST0pFQ1R3bSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLlN0b3JhZ2UuRGF0YVN0cmVhbXMuQWRkKHMuS2V5LCBzLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlLkRhdGFTdHJlYW1zLkFkZCgiUFJPSkVDVCIsIENyZWF0ZVByb2plY3RTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgZG9jLlN0b3JhZ2UuRGF0YVN0cmVhbXMuQWRkKCJQUk9KRUNUd20iLCBDcmVhdGVQcm9qZWN0d21TdHJlYW0oKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoUGFydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVXJpID0gbmV3IFVyaShQYXJ0VXJpLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgUGFydCA9IF9wY2suQ3JlYXRlUGFydChVcmksIEV4Y2VsUGFja2FnZS5zY2hlbWFWQkEpOworICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gX3diLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIHNjaGVtYVJlbFZiYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhciB2YmFCdWZmZXI9ZG9jLlNhdmUoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3QgPSBQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUpOworICAgICAgICAgICAgICAgIHN0LldyaXRlKHZiYUJ1ZmZlciwgMCwgdmJhQnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgc3QuRmx1c2goKTsKKyAgICAgICAgICAgICAgICAvL1NhdmUgdGhlIGRpZ2l0YWwgc2lnbnR1cmUKKyAgICAgICAgICAgICAgICBTaWduYXR1cmUuU2F2ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24gPz8gIiI7CisgICAgICAgICAgICBIZWxwRmlsZTEgPSBIZWxwRmlsZTEgPz8gIiI7CisgICAgICAgICAgICBIZWxwRmlsZTIgPSBIZWxwRmlsZTIgPz8gIiI7CisgICAgICAgICAgICBDb25zdGFudHMgPSBDb25zdGFudHMgPz8gIiI7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1TLU9WQkEgMi4zLjQuMQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBDcmVhdGVWQkFQcm9qZWN0U3RyZWFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5V3JpdGVyIGJ3ID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDYxQ0MpOyAvL1Jlc2VydmVkMQorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweEZGRkYpOyAvL1ZlcnNpb24KKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MCk7IC8vUmVzZXJ2ZWQzCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MCk7IC8vUmVzZXJ2ZWQ0CisgICAgICAgICAgICByZXR1cm4gKChNZW1vcnlTdHJlYW0pYncuQmFzZVN0cmVhbSkuVG9BcnJheSgpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1TLU9WQkEgMi4zLjQuMQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBDcmVhdGVEaXJTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnlXcml0ZXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7CisKKyAgICAgICAgICAgIC8qKioqKiogUFJPSkVDVElORk9STUFUSU9OIFJlY29yZCAqKioqKiovCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTEpOyAgICAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7ICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpU3lzdGVtS2luZCk7IC8vU3lzS2luZAorCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTIpOyAgICAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7ICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpTGNpZCk7ICAgICAgIC8vTGNpZAorCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MTQpOyAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7ICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpTGNpZEludm9rZSk7IC8vTGNpZCBJbnZva2UKKworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkzKTsgICAgICAgIC8vSUQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTIpOyAgICAgICAgICAvL1NpemUKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpQ29kZVBhZ2UpOyAgIC8vQ29kZXBhZ2UKKworICAgICAgICAgICAgLy9Qcm9qZWN0TmFtZQorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCk0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KU5hbWUuTGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKE5hbWUpKTsgLy9Qcm9qZWN0IE5hbWUKKworICAgICAgICAgICAgLy9EZXNjcmlwdGlvbgorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCk1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KURlc2NyaXB0aW9uLkxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NpemUKKyAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhEZXNjcmlwdGlvbikpOyAvL1Byb2plY3QgTmFtZQorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpRGVzY3JpcHRpb24uTGVuZ3RoKjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhEZXNjcmlwdGlvbikpOyAgICAgICAgICAgICAgIC8vUHJvamVjdCBEZXNjcmlwdGlvbgorCisgICAgICAgICAgICAvL0hlbHBmaWxlcworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCk2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpSGVscEZpbGUxLkxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TaXplCisgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMoSGVscEZpbGUxKSk7ICAvL0hlbHBGaWxlMSAgICAgICAgICAgIAorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDNEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpSGVscEZpbGUyLkxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TaXplCisgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMoSGVscEZpbGUyKSk7ICAvL0hlbHBGaWxlMgorCisgICAgICAgICAgICAvL0hlbHAgY29udGV4dCBpZAorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCk3KTsgICAgICAgICAgICAvL0lECisgICAgICAgICAgICBidy5Xcml0ZSgodWludCk0KTsgICAgICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpSGVscENvbnRleHRJRCk7ICAvL0hlbHAgY29udGV4dCBpZAorCisgICAgICAgICAgICAvL0xpYmZsYWdzCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTgpOyAgICAgICAgICAgIC8vSUQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOyAgICAgICAgICAgICAgLy9TaXplCisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsgIC8vSGVscCBjb250ZXh0IGlkCisKKyAgICAgICAgICAgIC8vVmJhIFZlcnNpb24KKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpOSk7ICAgICAgICAgICAgLy9JRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7ICAgICAgICAgICAgICAvL1Jlc2VydmVkCisgICAgICAgICAgICBidy5Xcml0ZSgodWludClNYWpvclZlcnNpb24pOyAgIC8vUmVzZXJ2ZWQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpTWlub3JWZXJzaW9uKTsgLy9IZWxwIGNvbnRleHQgaWQKKworICAgICAgICAgICAgLy9Db25zdGFudHMKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgwQyk7ICAgICAgICAgICAvL0lECisgICAgICAgICAgICBidy5Xcml0ZSgodWludClDb25zdGFudHMuTGVuZ3RoKTsgICAgICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKENvbnN0YW50cykpOyAgICAgICAgICAgICAgLy9IZWxwIGNvbnRleHQgaWQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgzQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KUNvbnN0YW50cy5MZW5ndGgvMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TaXplCisgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKENvbnN0YW50cykpOyAgLy9IZWxwRmlsZTIKKworICAgICAgICAgICAgLyoqKioqKiBQUk9KRUNUUkVGRVJFTkNFUyBSZWNvcmQgKioqKioqLworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJlZmVyZW5jZSBpbiBSZWZlcmVuY2VzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlTmFtZVJlZmVyZW5jZShidywgcmVmZXJlbmNlKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UuUmVmZXJlbmNlUmVjb3JkSUQgPT0gMHgyRikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlQ29udHJvbFJlZmVyZW5jZShidywgcmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJlbmNlLlJlZmVyZW5jZVJlY29yZElEID09IDB4MzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXcml0ZU9yZ2luYWxSZWZlcmVuY2UoYncsIHJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVyZW5jZS5SZWZlcmVuY2VSZWNvcmRJRCA9PSAweDBEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVSZWdpc3RlcmVkUmVmZXJlbmNlKGJ3LCByZWZlcmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcmVuY2UuUmVmZXJlbmNlUmVjb3JkSUQgPT0gMHgwRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlUHJvamVjdFJlZmVyZW5jZShidywgcmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgwRik7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkweDAyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpTW9kdWxlcy5Db3VudCk7CisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MTMpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMHgwMik7CisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4RkZGRik7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtb2R1bGUgaW4gTW9kdWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZU1vZHVsZVJlY29yZChidywgbW9kdWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgxMCk7ICAgICAgICAgICAgIC8vVGVybWluYXRvcgorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAKKworICAgICAgICAgICAgcmV0dXJuIENvbXBvdW5kRG9jdW1lbnQuQ29tcHJlc3NQYXJ0KCgoTWVtb3J5U3RyZWFtKWJ3LkJhc2VTdHJlYW0pLlRvQXJyYXkoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVNb2R1bGVSZWNvcmQoQmluYXJ5V3JpdGVyIGJ3LCBFeGNlbFZCQU1vZHVsZSBtb2R1bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgxOSk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCltb2R1bGUuTmFtZS5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKG1vZHVsZS5OYW1lKSk7ICAgICAvL05hbWUKKworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDQ3KTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KW1vZHVsZS5OYW1lLkxlbmd0aCoyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMobW9kdWxlLk5hbWUpKTsgICAgICAgICAgICAgICAgICAgLy9OYW1lCisKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgxQSk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCltb2R1bGUuTmFtZS5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKG1vZHVsZS5OYW1lKSk7ICAgICAvL1N0cmVhbSBOYW1lICAKKworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDMyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KW1vZHVsZS5OYW1lLkxlbmd0aCoyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMobW9kdWxlLk5hbWUpKTsgICAgICAgICAgICAgICAgICAgLy9TdHJlYW0gTmFtZQorCisgICAgICAgICAgICBtb2R1bGUuRGVzY3JpcHRpb24gPSBtb2R1bGUuRGVzY3JpcHRpb24gPz8gIiI7CisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MUMpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpbW9kdWxlLkRlc2NyaXB0aW9uLkxlbmd0aCk7CisgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMobW9kdWxlLkRlc2NyaXB0aW9uKSk7ICAgICAvL0Rlc2NyaXB0aW9uCisKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHg0OCk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCltb2R1bGUuRGVzY3JpcHRpb24uTGVuZ3RoKjIpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhtb2R1bGUuRGVzY3JpcHRpb24pKTsgICAgICAgICAgICAgICAgICAgLy9EZXNjcmlwdGlvbgorCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MzEpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZHVsZSBTdHJlYW0gT2Zmc2V0IChObyBQZXJmb3JtYW5jZUNhY2hlKQorCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MUUpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCltb2R1bGUuSGVscENvbnRleHQpOyAgICAgICAgICAgIC8vSGVscCBjb250ZXh0IElECisKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgyQyk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkyKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHhGRkZGKTsgICAgICAgICAgICAvL0hlbHAgY29udGV4dCBJRAorCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KShtb2R1bGUuVHlwZSA9PSBlTW9kdWxlVHlwZS5Nb2R1bGUgPyAweDIxIDogMHgyMikpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7CisKKyAgICAgICAgICAgIGlmIChtb2R1bGUuUmVhZE9ubHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDI1KTsKKyAgICAgICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsgICAgICAgICAgICAgIC8vUmVhZG9ubHkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1vZHVsZS5Qcml2YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgyOCk7CisgICAgICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAvL1ByaXZhdGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDJCKTsgICAgICAgICAgICAgLy9UZXJtaW5hdG9yCisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlTmFtZVJlZmVyZW5jZShCaW5hcnlXcml0ZXIgYncsIEV4Y2VsVmJhUmVmZXJlbmNlIHJlZmVyZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9OYW1lIHJlY29yZAorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lECisgICAgICAgICAgICBidy5Xcml0ZSgodWludClyZWZlcmVuY2UuTmFtZS5MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQorICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKHJlZmVyZW5jZS5OYW1lKSk7ICAvL0hlbHBGaWxlMQorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lECisgICAgICAgICAgICBidy5Xcml0ZSgodWludClyZWZlcmVuY2UuTmFtZS5MZW5ndGggKiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TaXplCisgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKHJlZmVyZW5jZS5OYW1lKSk7ICAgICAgICAgICAgICAgIC8vSGVscEZpbGUyCisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQ29udHJvbFJlZmVyZW5jZShCaW5hcnlXcml0ZXIgYncsIEV4Y2VsVmJhUmVmZXJlbmNlIHJlZmVyZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVPcmdpbmFsUmVmZXJlbmNlKGJ3LCByZWZlcmVuY2UpOworCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MkYpOworICAgICAgICAgICAgdmFyIGNvbnRyb2xSZWY9KEV4Y2VsVmJhUmVmZXJlbmNlQ29udHJvbClyZWZlcmVuY2U7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkoNCArIGNvbnRyb2xSZWYuTGliSWRUd2lkZGxlZC5MZW5ndGggKyA0ICsgMikpOyAgICAvLyBTaXplIG9mIFNpemVPZkxpYmlkVHdpZGRsZWQsIExpYmlkVHdpZGRsZWQsIFJlc2VydmVkMSwgYW5kIFJlc2VydmVkMi4KKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KWNvbnRyb2xSZWYuTGliSWRUd2lkZGxlZC5MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZSAgICAgICAgICAgIAorICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKGNvbnRyb2xSZWYuTGliSWRUd2lkZGxlZCkpOyAgLy9MaWJJRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgLy9SZXNlcnZlZDEKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMCk7ICAgIC8vUmVzZXJ2ZWQyCisgICAgICAgICAgICBXcml0ZU5hbWVSZWZlcmVuY2UoYncsIHJlZmVyZW5jZSk7ICAvL05hbWUgcmVjb3JkIGFnYWluCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MzApOyAvL1Jlc2VydmVkMworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpKDQgKyBjb250cm9sUmVmLkxpYklkRXh0ZXJuYWwuTGVuZ3RoICsgNCArIDIgKyAxNiArIDQpKTsgICAgLy9TaXplIG9mIFNpemVPZkxpYmlkRXh0ZW5kZWQsIExpYmlkRXh0ZW5kZWQsIFJlc2VydmVkNCwgUmVzZXJ2ZWQ1LCBPcmlnaW5hbFR5cGVMaWIsIGFuZCBDb29raWUKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KWNvbnRyb2xSZWYuTGliSWRFeHRlcm5hbC5MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZSAgICAgICAgICAgIAorICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKGNvbnRyb2xSZWYuTGliSWRFeHRlcm5hbCkpOyAgLy9MaWJJRAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgLy9SZXNlcnZlZDQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMCk7ICAgIC8vUmVzZXJ2ZWQ1CisgICAgICAgICAgICBidy5Xcml0ZShjb250cm9sUmVmLk9yaWdpbmFsVHlwZUxpYi5Ub0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KWNvbnRyb2xSZWYuQ29va2llKTsgICAgICAvL0Nvb2tpZQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlT3JnaW5hbFJlZmVyZW5jZShCaW5hcnlXcml0ZXIgYncsIEV4Y2VsVmJhUmVmZXJlbmNlIHJlZmVyZW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDMzKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KXJlZmVyZW5jZS5MaWJpZC5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKHJlZmVyZW5jZS5MaWJpZCkpOyAgLy9MaWJJRAorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVByb2plY3RSZWZlcmVuY2UoQmluYXJ5V3JpdGVyIGJ3LCBFeGNlbFZiYVJlZmVyZW5jZSByZWZlcmVuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgwRSk7CisgICAgICAgICAgICB2YXIgcHJvalJlZiA9IChFeGNlbFZiYVJlZmVyZW5jZVByb2plY3QpcmVmZXJlbmNlOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpKDQgKyBwcm9qUmVmLkxpYmlkLkxlbmd0aCArIDQgKyBwcm9qUmVmLkxpYklkUmVsYXRpdmUuTGVuZ3RoKzQrMikpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpcHJvalJlZi5MaWJpZC5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKHByb2pSZWYuTGliaWQpKTsgIC8vTGliQWJzb2x1dGUKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KXByb2pSZWYuTGliSWRSZWxhdGl2ZS5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKHByb2pSZWYuTGliSWRSZWxhdGl2ZSkpOyAgLy9MaWJJZFJlbGF0aXZlCisgICAgICAgICAgICBidy5Xcml0ZShwcm9qUmVmLk1ham9yVmVyc2lvbik7CisgICAgICAgICAgICBidy5Xcml0ZShwcm9qUmVmLk1pbm9yVmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVSZWdpc3RlcmVkUmVmZXJlbmNlKEJpbmFyeVdyaXRlciBidywgRXhjZWxWYmFSZWZlcmVuY2UgcmVmZXJlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MEQpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpKDQrcmVmZXJlbmNlLkxpYmlkLkxlbmd0aCs0KzIpKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KXJlZmVyZW5jZS5MaWJpZC5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKHJlZmVyZW5jZS5MaWJpZCkpOyAgLy9MaWJJRCAgICAgICAgICAgIAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgLy9SZXNlcnZlZDEKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMCk7ICAgIC8vUmVzZXJ2ZWQyCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBDcmVhdGVQcm9qZWN0d21TdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBCaW5hcnlXcml0ZXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtb2R1bGUgaW4gTW9kdWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMobW9kdWxlLk5hbWUpKTsgICAgIC8vTmFtZQorICAgICAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTApOyAvL051bGwKKyAgICAgICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKG1vZHVsZS5OYW1lKSk7ICAgICAgICAgICAgICAgICAgIC8vTmFtZQorICAgICAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMCk7IC8vTnVsbAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkwKTsgLy9OdWxsCisgICAgICAgICAgICByZXR1cm4gQ29tcG91bmREb2N1bWVudC5Db21wcmVzc1BhcnQoKChNZW1vcnlTdHJlYW0pYncuQmFzZVN0cmVhbSkuVG9BcnJheSgpKTsKKyAgICAgICAgfSAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gQ3JlYXRlUHJvamVjdFN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJJRD1cInswfVwiXHJcbiIsIFByb2plY3RJRCk7CisgICAgICAgICAgICBmb3JlYWNoKHZhciBtb2R1bGUgaW4gTW9kdWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlLlR5cGUgPT0gZU1vZHVsZVR5cGUuRG9jdW1lbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkRvY3VtZW50PXswfS8mSDAwMDAwMDAwXHJcbiIsIG1vZHVsZS5OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kdWxlLlR5cGUgPT0gZU1vZHVsZVR5cGUuTW9kdWxlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJNb2R1bGU9ezB9XHJcbiIsIG1vZHVsZS5OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kdWxlLlR5cGUgPT0gZU1vZHVsZVR5cGUuQ2xhc3MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkNsYXNzPXswfVxyXG4iLCBtb2R1bGUuTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vRGVzaWduZXIKKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJQYWNrYWdlPXswfVxyXG4iLCBtb2R1bGUuQ2xhc3NJRCk7CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiQmFzZUNsYXNzPXswfVxyXG4iLCBtb2R1bGUuTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhlbHBGaWxlMSAhPSAiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkhlbHBGaWxlPXswfVxyXG4iLCBIZWxwRmlsZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJOYW1lPVwiezB9XCJcclxuIiwgTmFtZSk7CisgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkhlbHBDb250ZXh0SUQ9ezB9XHJcbiIsIEhlbHBDb250ZXh0SUQpOworCisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KERlc2NyaXB0aW9uKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkRlc2NyaXB0aW9uPVwiezB9XCJcclxuIiwgRGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJWZXJzaW9uQ29tcGF0aWJsZTMyPVwiMzkzMjIyMDAwXCJcclxuIik7CisKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiQ01HPVwiezB9XCJcclxuIiwgV3JpdGVQcm90ZWN0aW9uU3RhdCgpKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiRFBCPVwiezB9XCJcclxuIiwgV3JpdGVQYXNzd29yZCgpKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiR0M9XCJ7MH1cIlxyXG5cclxuIiwgV3JpdGVWaXNpYmlsaXR5U3RhdGUoKSk7CisKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiW0hvc3QgRXh0ZW5kZXIgSW5mb11cclxuIik7CisgICAgICAgICAgICBzYi5BcHBlbmQoIiZIMDAwMDAwMDE9ezM4MzJENjQwLUNGOTAtMTFDRi04RTQzLTAwQTBDOTExMDA1QX07VkJFOyZIMDAwMDAwMDBcclxuIik7CisgICAgICAgICAgICBzYi5BcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZCgiW1dvcmtzcGFjZV1cclxuIik7CisgICAgICAgICAgICBmb3JlYWNoKHZhciBtb2R1bGUgaW4gTW9kdWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfT0wLCAwLCAwLCAwLCBDIFxyXG4iLG1vZHVsZS5OYW1lKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIHMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhzKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBXcml0ZVByb3RlY3Rpb25TdGF0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN0YXQ9KF9wcm90ZWN0aW9uLlVzZXJQcm90ZWN0ZWQgPyAxOjApIHwgIAorICAgICAgICAgICAgICAgICAgICAgKF9wcm90ZWN0aW9uLkhvc3RQcm90ZWN0ZWQgPyAyOjApIHwKKyAgICAgICAgICAgICAgICAgICAgIChfcHJvdGVjdGlvbi5WYmVQcm90ZWN0ZWQgPyA0OjApOworCisgICAgICAgICAgICByZXR1cm4gRW5jcnlwdChCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoc3RhdCkpOyAgICAKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBXcml0ZVBhc3N3b3JkKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIG51bGxCaXRzPW5ldyBieXRlWzNdOworICAgICAgICAgICAgYnl0ZVtdIG51bGxLZXkgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGJ5dGVbXSBudWxsSGFzaCA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgICAgIGlmIChQcm90ZWN0aW9uLlBhc3N3b3JkS2V5ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVuY3J5cHQobmV3IGJ5dGVbXSB7IDAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXJyYXkuQ29weShQcm90ZWN0aW9uLlBhc3N3b3JkS2V5LCBudWxsS2V5LCA0KTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KFByb3RlY3Rpb24uUGFzc3dvcmRIYXNoLCBudWxsSGFzaCwgMjApOworCisgICAgICAgICAgICAgICAgLy9TZXQgTnVsbCBiaXRzCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZSBiaXQgPSAoYnl0ZSkoMTI4ID4+IChpbnQpKChpICUgOCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbEtleVtpXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxLZXlbaV0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxCaXRzWzBdIHw9IGJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsSGFzaFtpIC0gNF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsSGFzaFtpIC0gNF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlSW5kZXggPSAoaSAtIGkgJSA4KSAvIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbEJpdHNbYnl0ZUluZGV4XSB8PSBiaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9Xcml0ZSB0aGUgUGFzc3dvcmQgSGFzaCBEYXRhIFN0cnVjdHVyZSAoMi40LjQuMSkKKyAgICAgICAgICAgICAgICBCaW5hcnlXcml0ZXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHhGRik7CisgICAgICAgICAgICAgICAgYncuV3JpdGUobnVsbEJpdHMpOworICAgICAgICAgICAgICAgIGJ3LldyaXRlKG51bGxLZXkpOworICAgICAgICAgICAgICAgIGJ3LldyaXRlKG51bGxIYXNoKTsKKyAgICAgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRW5jcnlwdCgoKE1lbW9yeVN0cmVhbSlidy5CYXNlU3RyZWFtKS5Ub0FycmF5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFdyaXRlVmlzaWJpbGl0eVN0YXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVuY3J5cHQobmV3IGJ5dGVbXSB7IChieXRlKShQcm90ZWN0aW9uLlZpc2liaWxpdHlTdGF0ZSA/IDB4RkYgOiAwKSB9KTsgCisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRTdHJpbmcoQmluYXJ5UmVhZGVyIGJyLCB1aW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRTdHJpbmcoYnIsIHNpemUsIFN5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RyaW5nKEJpbmFyeVJlYWRlciBiciwgdWludCBzaXplLCBFbmNvZGluZyBlbmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gYnl0ZVRlbXAgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICBieXRlVGVtcCA9IGJyLlJlYWRCeXRlcygoaW50KXNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBlbmMuR2V0U3RyaW5nKGJ5dGVUZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0VW5pY29kZVN0cmluZyhCaW5hcnlSZWFkZXIgYnIsIHVpbnQgc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHMgPSBHZXRTdHJpbmcoYnIsIHNpemUpOworICAgICAgICAgICAgaW50IHJlc2VydmVkID0gYnIuUmVhZFVJbnQxNigpOworICAgICAgICAgICAgdWludCBzaXplVUMgPSBici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICBzdHJpbmcgc1VDID0gR2V0U3RyaW5nKGJyLCBzaXplVUMsIFN5c3RlbS5UZXh0LkVuY29kaW5nLlVuaWNvZGUpOworICAgICAgICAgICAgcmV0dXJuIHNVQy5MZW5ndGggPT0gMCA/IHMgOiBzVUM7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgQ29tcG91bmREb2N1bWVudCBEb2N1bWVudCB7IGdldDsgc2V0OyB9CisjZW5kaWYKKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBVcmkgVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorI2lmICFNT05PCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZSBhIG5ldyBWQkEgUHJvamVjdAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCB2b2lkIENyZWF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKExjaWQ+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlBhY2thZ2UgYWxyZWFkeSBjb250YWlucyBhIFZCQVByb2plY3QiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcm9qZWN0SUQgPSAiezVERDkwRDc2LTQ5MDQtNDdBMi1BRjBELUQ2OUI0NjczNjA0RX0iOworICAgICAgICAgICAgTmFtZSA9ICJWQkFQcm9qZWN0IjsKKyAgICAgICAgICAgIFN5c3RlbUtpbmQgPSBlU3lza2luZC5XaW4zMjsgICAgICAgICAgICAvL0RlZmF1bHQKKyAgICAgICAgICAgIExjaWQgPSAxMDMzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0VuZ2xpc2ggLSBVbml0ZWQgU3RhdGVzCisgICAgICAgICAgICBMY2lkSW52b2tlID0gMTAzMzsgICAgICAgICAgICAgICAgICAgICAgLy9FbmdsaXNoIC0gVW5pdGVkIFN0YXRlcworICAgICAgICAgICAgQ29kZVBhZ2UgPSBFbmNvZGluZy5EZWZhdWx0LkNvZGVQYWdlOworICAgICAgICAgICAgTWFqb3JWZXJzaW9uID0gMTM2MTAyNDQyMTsKKyAgICAgICAgICAgIE1pbm9yVmVyc2lvbiA9IDY7CisgICAgICAgICAgICBIZWxwQ29udGV4dElEID0gMDsKKyAgICAgICAgICAgIE1vZHVsZXMuQWRkKG5ldyBFeGNlbFZCQU1vZHVsZShfd2IuQ29kZU5hbWVDaGFuZ2UpIHsgTmFtZSA9ICJUaGlzV29ya2Jvb2siLCBDb2RlID0gIiIsIEF0dHJpYnV0ZXM9R2V0RG9jdW1lbnRBdHRyaWJ1dGVzKCJUaGlzV29ya2Jvb2siLCAiMHswMDAyMDgxOS0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9IiksIFR5cGUgPSBlTW9kdWxlVHlwZS5Eb2N1bWVudCwgSGVscENvbnRleHQgPSAwIH0pOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNoZWV0IGluIF93Yi5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBuYW1lID0gR2V0TW9kdWxlTmFtZUZyb21Xb3Jrc2hlZXQoc2hlZXQpOworICAgICAgICAgICAgICAgIGlmICghTW9kdWxlcy5FeGlzdHMobmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNb2R1bGVzLkFkZChuZXcgRXhjZWxWQkFNb2R1bGUoc2hlZXQuQ29kZU5hbWVDaGFuZ2UpIHsgTmFtZSA9IG5hbWUsIENvZGUgPSAiIiwgQXR0cmlidXRlcyA9IEdldERvY3VtZW50QXR0cmlidXRlcyhzaGVldC5OYW1lLCAiMHswMDAyMDgyMC0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9IiksIFR5cGUgPSBlTW9kdWxlVHlwZS5Eb2N1bWVudCwgSGVscENvbnRleHQgPSAwIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9wcm90ZWN0aW9uID0gbmV3IEV4Y2VsVmJhUHJvdGVjdGlvbih0aGlzKSB7IFVzZXJQcm90ZWN0ZWQgPSBmYWxzZSwgSG9zdFByb3RlY3RlZCA9IGZhbHNlLCBWYmVQcm90ZWN0ZWQgPSBmYWxzZSwgVmlzaWJpbGl0eVN0YXRlID0gdHJ1ZSB9OworICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE1vZHVsZU5hbWVGcm9tV29ya3NoZWV0KEV4Y2VsV29ya3NoZWV0IHNoZWV0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbmFtZSA9IHNoZWV0Lk5hbWU7CisgICAgICAgICAgICBpZiAobmFtZS5BbnkoYyA9PiBjID4gMjU1KSB8fCB0aGlzLk1vZHVsZXNbbmFtZV0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IHNoZWV0LlBvc2l0aW9uSUQ7CisgICAgICAgICAgICAgICAgbmFtZSA9ICJTaGVldCIgKyBpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuTW9kdWxlc1tuYW1lXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTaGVldCIgKyAoKytpKS5Ub1N0cmluZygpOyA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGVzQ29sbGVjdGlvbiBHZXREb2N1bWVudEF0dHJpYnV0ZXMoc3RyaW5nIG5hbWUsIHN0cmluZyBjbHNpZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGF0dHIgPSBuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGVzQ29sbGVjdGlvbigpOworICAgICAgICAgICAgYXR0ci5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX05hbWUiLCBWYWx1ZSA9IG5hbWUsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLlN0cmluZyB9KTsKKyAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9CYXNlIiwgVmFsdWUgPSBjbHNpZCwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuU3RyaW5nIH0pOworICAgICAgICAgICAgYXR0ci5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0dsb2JhbE5hbWVTcGFjZSIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworICAgICAgICAgICAgYXR0ci5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0NyZWF0YWJsZSIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworICAgICAgICAgICAgYXR0ci5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX1ByZWRlY2xhcmVkSWQiLCBWYWx1ZSA9ICJUcnVlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworICAgICAgICAgICAgYXR0ci5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0V4cG9zZWQiLCBWYWx1ZSA9ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKKyAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9UZW1wbGF0ZURlcml2ZWQiLCBWYWx1ZSA9ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKKyAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9DdXN0b21pemFibGUiLCBWYWx1ZSA9ICJUcnVlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOworCisgICAgICAgICAgICByZXR1cm4gYXR0cjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy9pbnRlcm5hbCBzdHJpbmcgR2V0QmxhbmtEb2N1bWVudE1vZHVsZShzdHJpbmcgbmFtZSwgc3RyaW5nIGNsc2lkKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgc3RyaW5nIHJldD1zdHJpbmcuRm9ybWF0KCJBdHRyaWJ1dGUgVkJfTmFtZSA9IFwiezB9XCJcclxuIixuYW1lKTsKKyAgICAgICAgLy8gICAgcmV0ICs9IHN0cmluZy5Gb3JtYXQoIkF0dHJpYnV0ZSBWQl9CYXNlID0gXCJ7MH1cIlxyXG4iLCBjbHNpZCk7ICAvL01pY3Jvc29mdC5PZmZpY2UuSW50ZXJvcC5FeGNlbC5Xb3Jrc2hlZXRDbGFzcworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9HbG9iYWxOYW1lU3BhY2UgPSBGYWxzZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9DcmVhdGFibGUgPSBGYWxzZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9QcmVkZWNsYXJlZElkID0gVHJ1ZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9FeHBvc2VkID0gVHJ1ZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9UZW1wbGF0ZURlcml2ZWQgPSBGYWxzZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9DdXN0b21pemFibGUgPSBUcnVlIjsKKyAgICAgICAgLy8gICAgcmV0dXJuIHJldDsKKyAgICAgICAgLy99CisgICAgICAgIC8vaW50ZXJuYWwgc3RyaW5nIEdldEJsYW5rTW9kdWxlKHN0cmluZyBuYW1lKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIkF0dHJpYnV0ZSBWQl9OYW1lID0gXCJ7MH1cIlxyXG4iLCBuYW1lKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vaW50ZXJuYWwgc3RyaW5nIEdldEJsYW5rQ2xhc3NNb2R1bGUoc3RyaW5nIG5hbWUsIGJvb2wgZXhwb3NlZCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHN0cmluZyByZXQ9c3RyaW5nLkZvcm1hdCgiQXR0cmlidXRlIFZCX05hbWUgPSBcInswfVwiXHJcbiIsbmFtZSk7CisgICAgICAgIC8vICAgIHJldCArPSBzdHJpbmcuRm9ybWF0KCJBdHRyaWJ1dGUgVkJfQmFzZSA9IFwiezB9XCJcclxuIiwgIjB7RkNGQjNEMkEtQTBGQS0xMDY4LUE3MzgtMDgwMDJCMzM3MUI1fSIpOyAgCisgICAgICAgIC8vICAgIHJldCArPSAiQXR0cmlidXRlIFZCX0dsb2JhbE5hbWVTcGFjZSA9IEZhbHNlXHJcbiI7CisgICAgICAgIC8vICAgIHJldCArPSAiQXR0cmlidXRlIFZCX0NyZWF0YWJsZSA9IEZhbHNlXHJcbiI7CisgICAgICAgIC8vICAgIHJldCArPSAiQXR0cmlidXRlIFZCX1ByZWRlY2xhcmVkSWQgPSBGYWxzZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gc3RyaW5nLkZvcm1hdCgiQXR0cmlidXRlIFZCX0V4cG9zZWQgPSB7MH1cclxuIiwgZXhwb3NlZCA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9UZW1wbGF0ZURlcml2ZWQgPSBGYWxzZVxyXG4iOworICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9DdXN0b21pemFibGUgPSBGYWxzZVxyXG4iOworICAgICAgICAvLyAgICByZXR1cm4gcmV0OworICAgICAgICAvL30KKyNlbmRpZgorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgcGFja2FnZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUGFydCA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZWwgaW4gUGFydC5HZXRSZWxhdGlvbnNoaXBzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3Bjay5EZWxldGVSZWxhdGlvbnNoaXAocmVsLklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfcGNrLlBhcnRFeGlzdHMoVXJpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGNrLkRlbGV0ZVBhcnQoVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcnQgPSBudWxsOworICAgICAgICAgICAgTW9kdWxlcy5DbGVhcigpOworICAgICAgICAgICAgUmVmZXJlbmNlcy5DbGVhcigpOworICAgICAgICAgICAgTGNpZCA9IDA7CisgICAgICAgICAgICBMY2lkSW52b2tlID0gMDsKKyAgICAgICAgICAgIENvZGVQYWdlID0gMDsKKyAgICAgICAgICAgIE1ham9yVmVyc2lvbiA9IDA7CisgICAgICAgICAgICBNaW5vclZlcnNpb24gPSAwOworICAgICAgICAgICAgSGVscENvbnRleHRJRCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1ZCQS9FeGNlbFZCQVJlZmVyZW5jZS5jcyBiL0VQUGx1cy9WQkEvRXhjZWxWQkFSZWZlcmVuY2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlMWRkOQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9WQkEvRXhjZWxWQkFSZWZlcmVuY2UuY3MKQEAgLTAsMCArMSwxMjkgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjYtTUFSLTIwMTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5WQkEKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgVkJBIHJlZmVyZW5jZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVmJhUmVmZXJlbmNlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICAgICAgLy8vIERlZmF1bHRzIFJlZmVyZW5jZVJlY29yZElEIHRvIDB4RAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxWYmFSZWZlcmVuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWZlcmVuY2VSZWNvcmRJRCA9IDB4RDsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcmVmZXJlbmNlIHJlY29yZCBJRC4gU2VlIE1TLU9WQkEgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBSZWZlcmVuY2VSZWNvcmRJRCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGliSUQKKyAgICAgICAgLy8vIEZvciBtb3JlIGluZm8gY2hlY2sgTVMtT1ZCQSAyLjEuMS44IExpYmlkUmVmZXJlbmNlIGFuZCAyLjMuNC4yLjIgUFJPSkVDVFJFRkVSRU5DRVMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBMaWJpZCB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QgKHRoZSBOYW1lKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBIHJlZmVyZW5jZSB0byBhIHR3aWRkbGVkIHR5cGUgbGlicmFyeQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVmJhUmVmZXJlbmNlQ29udHJvbCA6IEV4Y2VsVmJhUmVmZXJlbmNlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICAgICAgLy8vIFNldHMgUmVmZXJlbmNlUmVjb3JkSUQgdG8gMHgyRgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgRXhjZWxWYmFSZWZlcmVuY2VDb250cm9sKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVmZXJlbmNlUmVjb3JkSUQgPSAweDJGOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExpYklkRXh0ZXJuYWwgCisgICAgICAgIC8vLyBGb3IgbW9yZSBpbmZvIGNoZWNrIE1TLU9WQkEgMi4xLjEuOCBMaWJpZFJlZmVyZW5jZSBhbmQgMi4zLjQuMi4yIFBST0pFQ1RSRUZFUkVOQ0VTCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTGliSWRFeHRlcm5hbCB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExpYklkVHdpZGRsZWQKKyAgICAgICAgLy8vIEZvciBtb3JlIGluZm8gY2hlY2sgTVMtT1ZCQSAyLjEuMS44IExpYmlkUmVmZXJlbmNlIGFuZCAyLjMuNC4yLjIgUFJPSkVDVFJFRkVSRU5DRVMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBMaWJJZFR3aWRkbGVkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSBHVUlEIHRoYXQgc3BlY2lmaWVzIHRoZSBBdXRvbWF0aW9uIHR5cGUgbGlicmFyeSB0aGUgZXh0ZW5kZWQgdHlwZSBsaWJyYXJ5IHdhcyBnZW5lcmF0ZWQgZnJvbS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEd1aWQgT3JpZ2luYWxUeXBlTGliIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgdWludCBDb29raWUgeyBnZXQ7IHNldDsgfQorICAgIH0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIFZCQSBwcm9qZWN0CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFSZWZlcmVuY2VQcm9qZWN0IDogRXhjZWxWYmFSZWZlcmVuY2UKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnN0cnVjdG9yLgorICAgICAgICAvLy8gU2V0cyBSZWZlcmVuY2VSZWNvcmRJRCB0byAweDBFCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBFeGNlbFZiYVJlZmVyZW5jZVByb2plY3QoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWZlcmVuY2VSZWNvcmRJRCA9IDB4MEU7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTGliSWRSZWxhdGl2ZQorICAgICAgICAvLy8gRm9yIG1vcmUgaW5mbyBjaGVjayBNUy1PVkJBIDIuMS4xLjggTGliaWRSZWZlcmVuY2UgYW5kIDIuMy40LjIuMiBQUk9KRUNUUkVGRVJFTkNFUworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIExpYklkUmVsYXRpdmUgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNYWpvciB2ZXJzaW9uIG9mIHRoZSByZWZlcmVuY2VkIFZCQSBwcm9qZWN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB1aW50IE1ham9yVmVyc2lvbiB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE1pbm9yIHZlcnNpb24gb2YgdGhlIHJlZmVyZW5jZWQgVkJBIHByb2plY3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHVzaG9ydCBNaW5vclZlcnNpb24geyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWQkFTaWduYXR1cmUuY3MgYi9FUFBsdXMvVkJBL0V4Y2VsVkJBU2lnbmF0dXJlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTI4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVkJBL0V4Y2VsVkJBU2lnbmF0dXJlLmNzCkBAIC0wLDAgKzEsMzg0IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI2LU1BUi0yMDEyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuUGtjczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGNvZGUgc2lnbmF0dXJlIHByb3BlcnRpZXMgb2YgdGhlIHByb2plY3QKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZiYVNpZ25hdHVyZQorICAgIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nIHNjaGVtYVJlbFZiYVNpZ25hdHVyZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMvdmJhUHJvamVjdFNpZ25hdHVyZSI7CisgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBfdmJhUGFydCA9IG51bGw7CisgICAgICAgIGludGVybmFsIEV4Y2VsVmJhU2lnbmF0dXJlKFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCB2YmFQYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBfdmJhUGFydCA9IHZiYVBhcnQ7CisgICAgICAgICAgICBHZXRTaWduYXR1cmUoKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgR2V0U2lnbmF0dXJlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF92YmFQYXJ0ID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIHZhciByZWwgPSBfdmJhUGFydC5HZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHNjaGVtYVJlbFZiYVNpZ25hdHVyZSkuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChyZWwgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgICAgICAgICAgICAgUGFydCA9IF92YmFQYXJ0LlBhY2thZ2UuR2V0UGFydChVcmkpOworCisgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFBhcnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgQmluYXJ5UmVhZGVyIGJyID0gbmV3IEJpbmFyeVJlYWRlcihzdHJlYW0pOworICAgICAgICAgICAgICAgIHVpbnQgY2JTaWduYXR1cmUgPSBici5SZWFkVUludDMyKCk7ICAgICAgICAKKyAgICAgICAgICAgICAgICB1aW50IHNpZ25hdHVyZU9mZnNldCA9IGJyLlJlYWRVSW50MzIoKTsgICAgIC8vNDQgPz8KKyAgICAgICAgICAgICAgICB1aW50IGNiU2lnbmluZ0NlcnRTdG9yZSA9IGJyLlJlYWRVSW50MzIoKTsgIAorICAgICAgICAgICAgICAgIHVpbnQgY2VydFN0b3JlT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOyAgICAgCisgICAgICAgICAgICAgICAgdWludCBjYlByb2plY3ROYW1lID0gYnIuUmVhZFVJbnQzMigpOyAgICAgICAKKyAgICAgICAgICAgICAgICB1aW50IHByb2plY3ROYW1lT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOyAgIAorICAgICAgICAgICAgICAgIHVpbnQgZlRpbWVzdGFtcCA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICB1aW50IGNiVGltZXN0YW1wVXJsID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgIHVpbnQgdGltZXN0YW1wVXJsT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOyAgCisgICAgICAgICAgICAgICAgYnl0ZVtdIHNpZ25hdHVyZSA9IGJyLlJlYWRCeXRlcygoaW50KWNiU2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICB1aW50IHZlcnNpb24gPSBici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgdWludCBmaWxlVHlwZSA9IGJyLlJlYWRVSW50MzIoKTsKKworICAgICAgICAgICAgICAgIHVpbnQgaWQgPSBici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlkICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50IGVuY29kaW5nVHlwZSA9IGJyLlJlYWRVSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludCBsZW5ndGggPSBici5SZWFkVUludDMyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdmFsdWUgPSBici5SZWFkQnl0ZXMoKGludClsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FkZCBwcm9wZXJ0eSB2YWx1ZXMgaGVyZS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgPSBuZXcgWDUwOUNlcnRpZmljYXRlMih2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlkID0gYnIuUmVhZFVJbnQzMigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aW50IGVuZGVsMSA9IGJyLlJlYWRVSW50MzIoKTsgIC8vMAorICAgICAgICAgICAgICAgIHVpbnQgZW5kZWwyID0gYnIuUmVhZFVJbnQzMigpOyAgLy8wCisgICAgICAgICAgICAgICAgdXNob3J0IHJnY2hQcm9qZWN0TmFtZUJ1ZmZlciA9IGJyLlJlYWRVSW50MTYoKTsKKyAgICAgICAgICAgICAgICB1c2hvcnQgcmdjaFRpbWVzdGFtcEJ1ZmZlciA9IGJyLlJlYWRVSW50MTYoKTsKKyAgICAgICAgICAgICAgICBWZXJpZmllciA9IG5ldyBTaWduZWRDbXMoKTsKKyAgICAgICAgICAgICAgICBWZXJpZmllci5EZWNvZGUoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgVmVyaWZpZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vQ3JlYXRlIE9pZCBmcm9tIGEgYnl0ZWFycmF5CisgICAgICAgIC8vcHJpdmF0ZSBzdHJpbmcgUmVhZEhhc2goYnl0ZVtdIGNvbnRlbnQpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAvLyAgICBpbnQgb2Zmc2V0ID0gMHg2OworICAgICAgICAvLyAgICBpZiAoMCA8IChjb250ZW50Lkxlbmd0aCkpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGJ5dGUgbnVtID0gY29udGVudFtvZmZzZXRdOworICAgICAgICAvLyAgICAgICAgYnl0ZSBudW0yID0gKGJ5dGUpKG51bSAvIDQwKTsKKyAgICAgICAgLy8gICAgICAgIGJ1aWxkZXIuQXBwZW5kKG51bTIuVG9TdHJpbmcobnVsbCwgbnVsbCkpOworICAgICAgICAvLyAgICAgICAgYnVpbGRlci5BcHBlbmQoIi4iKTsKKyAgICAgICAgLy8gICAgICAgIG51bTIgPSAoYnl0ZSkobnVtICUgNDApOworICAgICAgICAvLyAgICAgICAgYnVpbGRlci5BcHBlbmQobnVtMi5Ub1N0cmluZyhudWxsLCBudWxsKSk7CisgICAgICAgIC8vICAgICAgICB1bG9uZyBudW0zID0gMEw7CisgICAgICAgIC8vICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0ICsgMTsgaSA8IGNvbnRlbnQuTGVuZ3RoOyBpKyspCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgbnVtMiA9IGNvbnRlbnRbaV07CisgICAgICAgIC8vICAgICAgICAgICAgbnVtMyA9ICh1bG9uZykodWxvbmcpKG51bTMgPDwgNykgKyAoKGJ5dGUpKG51bTIgJiAweDdmKSk7CisgICAgICAgIC8vICAgICAgICAgICAgaWYgKChudW0yICYgMHg4MCkgPT0gMCkKKyAgICAgICAgLy8gICAgICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCIuIik7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKG51bTMuVG9TdHJpbmcobnVsbCwgbnVsbCkpOworICAgICAgICAvLyAgICAgICAgICAgICAgICBudW0zID0gMEw7CisgICAgICAgIC8vICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgICAgIC8vMS4yLjg0MC4xMTM1NDkuMi41CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH0KKworCisgICAgICAgIC8vICAgIHN0cmluZyBvSWQgPSBidWlsZGVyLlRvU3RyaW5nKCk7CisKKyAgICAgICAgLy8gICAgcmV0dXJuIG9JZDsKKyAgICAgICAgLy99CisgICAgICAgIGludGVybmFsIHZvaWQgU2F2ZShFeGNlbFZiYVByb2plY3QgcHJvaikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoQ2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleT09ZmFsc2UpICAgIC8vTm8gc2lnbmF0dXJlLiBSZW1vdmUgYW55IFNpZ25hdHVyZSBwYXJ0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN0b3JlQ2VydCA9IEdldENlcnRGcm9tU3RvcmUoU3RvcmVMb2NhdGlvbi5DdXJyZW50VXNlcik7CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlQ2VydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVDZXJ0ID0gR2V0Q2VydEZyb21TdG9yZShTdG9yZUxvY2F0aW9uLkxvY2FsTWFjaGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdG9yZUNlcnQgIT0gbnVsbCAmJiBzdG9yZUNlcnQuSGFzUHJpdmF0ZUtleSA9PSB0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgPSBzdG9yZUNlcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIFBhcnQuR2V0UmVsYXRpb25zaGlwcygpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChyLklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQYXJ0LlBhY2thZ2UuRGVsZXRlUGFydChQYXJ0LlVyaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG1zKTsKKworICAgICAgICAgICAgYnl0ZVtdIGNlcnRTdG9yZSA9IEdldENlcnRTdG9yZSgpOworCisgICAgICAgICAgICBieXRlW10gY2VydCA9IFNpZ25Qcm9qZWN0KHByb2opOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpY2VydC5MZW5ndGgpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNDQpOyAgICAgICAgICAgICAgICAgIC8vPz8gMzYgcmVmIGluc2lkZSBjZXJ0ID8/CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCljZXJ0U3RvcmUuTGVuZ3RoKTsgICAgLy9jYlNpZ25pbmdDZXJ0U3RvcmUKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KShjZXJ0Lkxlbmd0aCArIDQ0KSk7ICAvL2NlcnRTdG9yZU9mZnNldAorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAgICAgIC8vY2JQcm9qZWN0TmFtZQorICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpKGNlcnQuTGVuZ3RoICsgY2VydFN0b3JlLkxlbmd0aCArIDQ0KSk7ICAgIC8vcHJvamVjdE5hbWVPZmZzZXQKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAvL2ZUaW1lc3RhbXAKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAvL2NiVGltZXN0YW1wVXJsCisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkoY2VydC5MZW5ndGggKyBjZXJ0U3RvcmUuTGVuZ3RoICsgNDQgKyAyKSk7ICAgIC8vdGltZXN0YW1wVXJsT2Zmc2V0CisgICAgICAgICAgICBidy5Xcml0ZShjZXJ0KTsKKyAgICAgICAgICAgIGJ3LldyaXRlKGNlcnRTdG9yZSk7CisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOy8vcmdjaFByb2plY3ROYW1lQnVmZmVyCisgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOy8vcmdjaFRpbWVzdGFtcEJ1ZmZlcgorICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkwKTsKKyAgICAgICAgICAgIGJ3LkZsdXNoKCk7CisKKyAgICAgICAgICAgIHZhciByZWwgPSBwcm9qLlBhcnQuR2V0UmVsYXRpb25zaGlwc0J5VHlwZShzY2hlbWFSZWxWYmFTaWduYXR1cmUpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoUGFydCA9PSBudWxsKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKHJlbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVXJpID0gcmVsLlRhcmdldFVyaTsKKyAgICAgICAgICAgICAgICAgICAgUGFydCA9IHByb2ouX3Bjay5HZXRQYXJ0KHJlbC5UYXJnZXRVcmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVcmkgPSBuZXcgVXJpKCIveGwvdmJhUHJvamVjdFNpZ25hdHVyZS5iaW4iLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgUGFydCA9IHByb2ouX3Bjay5DcmVhdGVQYXJ0KFVyaSwgRXhjZWxQYWNrYWdlLnNjaGVtYVZCQVNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlbCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb2ouUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHByb2ouVXJpLCBVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgc2NoZW1hUmVsVmJhU2lnbmF0dXJlKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgYiA9IG1zLlRvQXJyYXkoKTsKKyAgICAgICAgICAgIFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRGcm9tU3RvcmUoU3RvcmVMb2NhdGlvbiBsb2MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFg1MDlTdG9yZSBzdG9yZSA9IG5ldyBYNTA5U3RvcmUobG9jKTsKKyAgICAgICAgICAgICAgICBzdG9yZS5PcGVuKE9wZW5GbGFncy5SZWFkT25seSk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmVDZXJ0ID0gc3RvcmUuQ2VydGlmaWNhdGVzLkZpbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5RmluZFR5cGUuRmluZEJ5VGh1bWJwcmludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlLlRodW1icHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLk9mVHlwZTxYNTA5Q2VydGlmaWNhdGUyPigpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZUNlcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldENlcnRTdG9yZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHZhciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOworCisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsgLy9WZXJzaW9uCisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkweDU0NTI0NTQzKTsgLy9maWxlVHlwZQorCisgICAgICAgICAgICAvL1NlcmlhbGl6ZWRDZXJ0aWZpY2F0ZUVudHJ5CisgICAgICAgICAgICB2YXIgY2VydERhdGEgPSBDZXJ0aWZpY2F0ZS5SYXdEYXRhOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMHgyMCk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkxKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KWNlcnREYXRhLkxlbmd0aCk7CisgICAgICAgICAgICBidy5Xcml0ZShjZXJ0RGF0YSk7CisKKyAgICAgICAgICAgIC8vRW5kRWxlbWVudE1hcmtlckVudHJ5CisgICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKCh1bG9uZykwKTsKKworICAgICAgICAgICAgYncuRmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVQcm9wKEJpbmFyeVdyaXRlciBidywgaW50IGlkLCBieXRlW10gZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpaWQpOworICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMSk7CisgICAgICAgICAgICBidy5Xcml0ZSgodWludClkYXRhLkxlbmd0aCk7CisgICAgICAgICAgICBidy5Xcml0ZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBieXRlW10gU2lnblByb2plY3QoRXhjZWxWYmFQcm9qZWN0IHByb2opCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghQ2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3Rocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGNlcnRpZmljYXRlIGRvZXNuJ3QgaGF2ZSBhIHByaXZhdGUga2V5IikpOworICAgICAgICAgICAgICAgIENlcnRpZmljYXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBoYXNoID0gR2V0Q29udGVudEhhc2gocHJvaik7CisKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MzApOyAvL0NvbnN0cnVjdGVkIFR5cGUgCisgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDMyKTsgLy9Ub3RhbCBsZW5ndGgKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MzApOyAvL0NvbnN0cnVjdGVkIFR5cGUgCisgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDBFKTsgLy9MZW5ndGggU3BjSW5kaXJlY3REYXRhQ29udGVudAorICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHgwNik7IC8vT2lkIFRhZyBJbmRlbnRpZmllciAKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MEEpOyAvL0xlbmdodCBPSWQKKyAgICAgICAgICAgIGJ3LldyaXRlKG5ldyBieXRlW10geyAweDJCLCAweDA2LCAweDAxLCAweDA0LCAweDAxLCAweDgyLCAweDM3LCAweDAyLCAweDAxLCAweDFEIH0pOyAvL0VuY29kZWQgT2lkIDEuMy42LjEuNC4xLjMxMS4yLjEuMjkKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDQpOyAgIC8vT2N0ZXQgU3RyaW5nIFRhZyBJZGVudGlmaWVyCisgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDAwKTsgICAvL1plcm8gbGVuZ3RoCisKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MzApOyAvL0NvbnN0cnVjdGVkIFR5cGUgKERpZ2VzdEluZm8pCisgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDIwKTsgLy9MZW5ndGggRGlnZXN0SW5mbworICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHgzMCk7IC8vQ29uc3RydWN0ZWQgVHlwZSAoQWxnb3JpdGhtKQorICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHgwQyk7IC8vbGVuZ3RoIEFsZ29yaXRobUlkZW50aWZpZXIKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDYpOyAvL09pZCBUYWcgSW5kZW50aWZpZXIgCisgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDA4KTsgLy9MZW5naHQgT0lkCisgICAgICAgICAgICBidy5Xcml0ZShuZXcgYnl0ZVtdIHsgMHgyQSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhGNywgMHgwRCwgMHgwMiwgMHgwNSB9KTsgLy9FbmNvZGVkIE9pZCBmb3IgMS4yLjg0MC4xMTM1NDkuMi41IChBbGdvcml0aG1JZGVudGlmaWVyIE1ENSkKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDUpOyAgIC8vTnVsbCB0eXBlIGlkZW50aWZpZXIKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDApOyAgIC8vTnVsbCBsZW5ndGgKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDQpOyAgIC8vT2N0ZXQgU3RyaW5nIElkZW50aWZpZXIKKyAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKWhhc2guTGVuZ3RoKTsgICAvL0hhc2ggbGVuZ3RoCisgICAgICAgICAgICBidy5Xcml0ZShoYXNoKTsgICAgICAgICAgICAgICAgLy9Db250ZW50IGhhc2gKKworICAgICAgICAgICAgQ29udGVudEluZm8gY29udGVudEluZm8gPSBuZXcgQ29udGVudEluZm8oKChNZW1vcnlTdHJlYW0pYncuQmFzZVN0cmVhbSkuVG9BcnJheSgpKTsKKyAgICAgICAgICAgIGNvbnRlbnRJbmZvLkNvbnRlbnRUeXBlLlZhbHVlID0gIjEuMy42LjEuNC4xLjMxMS4yLjEuNCI7CisgICAgICAgICAgICBWZXJpZmllciA9IG5ldyBTaWduZWRDbXMoY29udGVudEluZm8pOworICAgICAgICAgICAgdmFyIHNpZ25lciA9IG5ldyBDbXNTaWduZXIoQ2VydGlmaWNhdGUpOworICAgICAgICAgICAgVmVyaWZpZXIuQ29tcHV0ZVNpZ25hdHVyZShzaWduZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBWZXJpZmllci5FbmNvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldENvbnRlbnRIYXNoKEV4Y2VsVmJhUHJvamVjdCBwcm9qKQorICAgICAgICB7CisgICAgICAgICAgICAvL01TLU9WQkEgMi40LjIKKyAgICAgICAgICAgIHZhciBlbmMgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZyhwcm9qLkNvZGVQYWdlKTsKKyAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKGVuYy5HZXRCeXRlcyhwcm9qLk5hbWUpKTsKKyAgICAgICAgICAgIGJ3LldyaXRlKGVuYy5HZXRCeXRlcyhwcm9qLkNvbnN0YW50cykpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJlZmVyZW5jZSBpbiBwcm9qLlJlZmVyZW5jZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZS5SZWZlcmVuY2VSZWNvcmRJRCA9PSAweDBEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHg3Qik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UuUmVmZXJlbmNlUmVjb3JkSUQgPT0gMHgwRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdmFyIHIgPSAoRXhjZWxWYmFSZWZlcmVuY2VQcm9qZWN0KXJlZmVyZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgLy9CaW5hcnlXcml0ZXIgYndUZW1wID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICAvL2J3VGVtcC5Xcml0ZSgodWludClyLkxpYmlkLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vYndUZW1wLldyaXRlKGVuYy5HZXRCeXRlcyhyLkxpYmlkKSk7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy9id1RlbXAuV3JpdGUoKHVpbnQpci5MaWJJZFJlbGF0aXZlLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vYndUZW1wLldyaXRlKGVuYy5HZXRCeXRlcyhyLkxpYklkUmVsYXRpdmUpKTsKKyAgICAgICAgICAgICAgICAgICAgLy9id1RlbXAuV3JpdGUoci5NYWpvclZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAvL2J3VGVtcC5Xcml0ZShyLk1pbm9yVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGJ5dGUgYiBpbiBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoKHVpbnQpcmVmZXJlbmNlLkxpYmlkLkxlbmd0aCkpICAvL0xlbmd0aCB3aWxsIG5ldmVyIGJlIGFuIFVJbnQgd2l0aCA0IGJ5dGVzIHRoYXQgYXJlbid0IDAgKD4gMHgwMEZGRkZGRiksIHNvIG5vIG5lZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LldyaXRlKGIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIG1vZHVsZSBpbiBwcm9qLk1vZHVsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gbW9kdWxlLkNvZGUuU3BsaXQobmV3IGNoYXJbXSB7ICdccicsICdcbicgfSwgU3RyaW5nU3BsaXRPcHRpb25zLlJlbW92ZUVtcHR5RW50cmllcyk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGxpbmUgaW4gbGluZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuU3RhcnRzV2l0aCgiYXR0cmlidXRlIiwgdHJ1ZSwgbnVsbCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ3LldyaXRlKGVuYy5HZXRCeXRlcyhsaW5lKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gKGJ3LkJhc2VTdHJlYW0gYXMgTWVtb3J5U3RyZWFtKS5Ub0FycmF5KCk7CisgICAgICAgICAgICB2YXIgaHAgPSBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Lk1ENUNyeXB0b1NlcnZpY2VQcm92aWRlci5DcmVhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBocC5Db21wdXRlSGFzaChidWZmZXIpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjZXJ0aWZpY2F0ZSB0byBzaWduIHRoZSBWQkEgcHJvamVjdC4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gVGhpcyBjZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgYSBwcml2YXRlIGtleS4KKyAgICAgICAgLy8vIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gdGhhdCB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQgZm9yIGNvZGVzaWduaW5nLCBzbyBtYWtlIHN1cmUgaXQncyB2YWxpZCB0byBzaWduIEV4Y2VsIGZpbGVzIChFeGNlbCAyMDEwIGlzIG1vcmUgc3RyaWN0IHRoYXQgcHJpb3IgdmVyc2lvbnMpLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlMiBDZXJ0aWZpY2F0ZSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB2ZXJpZmllcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgU2lnbmVkQ21zIFZlcmlmaWVyIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyNpZiAhTU9OTworICAgICAgICBpbnRlcm5hbCBDb21wb3VuZERvY3VtZW50IFNpZ25hdHVyZSB7IGdldDsgc2V0OyB9CisjZW5kaWYKKyAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBVcmkgVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWYmFNb2R1bGUuY3MgYi9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTdkODMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlLmNzCkBAIC0wLDAgKzEsMTU2IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI2LU1BUi0yMDEyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVkJBCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUeXBlIG9mIFZCQSBtb2R1bGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBlbnVtIGVNb2R1bGVUeXBlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIFdvcmtib29rIG9yIFdvcmtzaGVldCBvYmplY3RzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIERvY3VtZW50PTAsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgTW9kdWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE1vZHVsZT0xLAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIENsYXNzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIENsYXNzPTIsCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERlc2lnbmVyLCB0eXBpY2FsbHkgYSB1c2VyIGZvcm0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgRGVzaWduZXI9MworICAgIH0KKyAgICBpbnRlcm5hbCBkZWxlZ2F0ZSB2b2lkIE1vZHVsZU5hbWVDaGFuZ2Uoc3RyaW5nIHZhbHVlKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBWQkEgY29kZSBtb2R1bGUuIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVkJBTW9kdWxlCisgICAgeworICAgICAgICBzdHJpbmcgX25hbWUgPSAiIjsKKyAgICAgICAgTW9kdWxlTmFtZUNoYW5nZSBfbmFtZUNoYW5nZUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWQkFNb2R1bGUoKQorICAgICAgICB7CisgICAgICAgICAgICBBdHRyaWJ1dGVzID0gbmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlc0NvbGxlY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBFeGNlbFZCQU1vZHVsZShNb2R1bGVOYW1lQ2hhbmdlIG5hbWVDaGFuZ2VDYWxsYmFjaykgOgorICAgICAgICAgICAgdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9uYW1lQ2hhbmdlQ2FsbGJhY2sgPSBuYW1lQ2hhbmdlQ2FsbGJhY2s7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5BbnkoYyA9PiBjID4gMjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmJhIG1vZHVsZSBuYW1lcyBjYW4ndCBjb250YWluIHVuaWNvZGUgY2hhcmFjdGVycyIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IF9uYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX25hbWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtTmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVDaGFuZ2VDYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfbmFtZUNoYW5nZUNhbGxiYWNrKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2R1bGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBEZXNjcmlwdGlvbiB7IGdldDsgc2V0OyB9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIF9jb2RlPSIiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgY29kZSB3aXRob3V0IGFueSBtb2R1bGUgbGV2ZWwgYXR0cmlidXRlcy4KKyAgICAgICAgLy8vIDxyZW1hcmtzPkNhbiBjb250YWluIGZ1bmN0aW9uIGxldmVsIGF0dHJpYnV0ZXMuPC9yZW1hcmtzPiAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBDb2RlIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHZhbHVlLlN0YXJ0c1dpdGgoIkF0dHJpYnV0ZSIsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkgfHwgdmFsdWUuU3RhcnRzV2l0aCgiVkVSU0lPTiIsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ29kZSBjYW4ndCBzdGFydCB3aXRoIGFuIEF0dHJpYnV0ZSBvciBWRVJTSU9OIGtleXdvcmQuIEF0dHJpYnV0ZXMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIEF0dHJpYnV0ZXMgY29sbGVjdGlvbi4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9jb2RlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGhlbHBmaWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgSGVscENvbnRleHQgeyBnZXQ7IHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBNb2R1bGUgbGV2ZWwgYXR0cmlidXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlc0NvbGxlY3Rpb24gQXR0cmlidXRlcyB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFR5cGUgb2YgbW9kdWxlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlTW9kdWxlVHlwZSBUeXBlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgdGhlIG1vZHVsZSBpcyByZWFkb25seQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBSZWFkT25seSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHRoZSBtb2R1bGUgaXMgcHJpdmF0ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBQcml2YXRlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHN0cmVhbU5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCB1c2hvcnQgQ29va2llIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgdWludCBNb2R1bGVPZmZzZXQgeyBnZXQ7IHNldDsgfQorICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQ2xhc3NJRCB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTmFtZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUuY3MgYi9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlQXR0cmlidXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjU3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlQXR0cmlidXRlLmNzCkBAIC0wLDAgKzEsNDUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVkJBCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUbyBkZXRlcm1pbmUgaWYgdGhlIGF0dHJpYnV0ZSB1c2VzIGRvdWJsZSBxdW90ZXMgYXJvdW5kIHRoZSB2YWx1ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGVudW0gZUF0dHJpYnV0ZURhdGFUeXBlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIHN0cmluZworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBTdHJpbmc9MCwKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90IGEgc3RyaW5nCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIE5vblN0cmluZz0xCisgICAgfQorICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBkYXRhdHlwZS4gRGV0ZXJtaW5lIGlmIHRoZSBhdHRyaWJ1dGUgdXNlcyBkb3VibGUgcXVvdGVzIGFyb3VuZCB0aGUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBlQXR0cmlidXRlRGF0YVR5cGUgRGF0YVR5cGUgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRob3V0IGFueSBkb3VibGUgcXVvdGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1ZCQS9FeGNlbFZiYVByb3RlY3Rpb24uY3MgYi9FUFBsdXMvVkJBL0V4Y2VsVmJhUHJvdGVjdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZmZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzL1ZCQS9FeGNlbFZiYVByb3RlY3Rpb24uY3MKQEAgLTAsMCArMSwxMTIgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMTItQVBSLTIwMTIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVkJBCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBWYmEgc2VjdXJpdHkgcHJvcGVydGllcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIEV4Y2VsVmJhUHJvdGVjdGlvbgorICAgIHsKKyAgICAgICAgRXhjZWxWYmFQcm9qZWN0IF9wcm9qZWN0OworICAgICAgICBpbnRlcm5hbCBFeGNlbFZiYVByb3RlY3Rpb24oRXhjZWxWYmFQcm9qZWN0IHByb2plY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wcm9qZWN0ID0gcHJvamVjdDsKKyAgICAgICAgICAgIFZpc2liaWxpdHlTdGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHdoZXRoZXIgYWNjZXNzIHRvIHRoZSBWQkEgcHJvamVjdCB3YXMgcmVzdHJpY3RlZCBieSB0aGUgdXNlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBVc2VyUHJvdGVjdGVkIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3BlY2lmaWVzIHdoZXRoZXIgYWNjZXNzIHRvIHRoZSBWQkEgcHJvamVjdCB3YXMgcmVzdHJpY3RlZCBieSB0aGUgVkJBIGhvc3QgYXBwbGljYXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgSG9zdFByb3RlY3RlZCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNwZWNpZmllcyB3aGV0aGVyIGFjY2VzcyB0byB0aGUgVkJBIHByb2plY3Qgd2FzIHJlc3RyaWN0ZWQgYnkgdGhlIFZCQSBwcm9qZWN0IGVkaXRvcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgYm9vbCBWYmVQcm90ZWN0ZWQgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgVkJBIHByb2plY3QgaXMgdmlzaWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgVmlzaWJpbGl0eVN0YXRlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIFBhc3N3b3JkSGFzaCB7IGdldDsgc2V0OyB9CisgICAgICAgIGludGVybmFsIGJ5dGVbXSBQYXNzd29yZEtleSB7IGdldDsgc2V0OyB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBhc3N3b3JkIHByb3RlY3QgdGhlIFZCQSBwcm9qZWN0LgorICAgICAgICAvLy8gQW4gZW1wdHkgc3RyaW5nIG9yIG51bGwgd2lsbCByZW1vdmUgdGhlIHBhc3N3b3JkIHByb3RlY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQYXNzd29yZCI+VGhlIHBhc3N3b3JkPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHZvaWQgU2V0UGFzc3dvcmQoc3RyaW5nIFBhc3N3b3JkKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShQYXNzd29yZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGFzc3dvcmRIYXNoID0gbnVsbDsKKyAgICAgICAgICAgICAgICBQYXNzd29yZEtleSA9IG51bGw7CisgICAgICAgICAgICAgICAgVmJlUHJvdGVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgSG9zdFByb3RlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFVzZXJQcm90ZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBWaXNpYmlsaXR5U3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIF9wcm9qZWN0LlByb2plY3RJRCA9ICJ7NUREOTBENzYtNDkwNC00N0EyLUFGMEQtRDY5QjQ2NzM2MDRFfSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9Kb2luIFBhc3N3b3JkIGFuZCBLZXkKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YTsKKyAgICAgICAgICAgICAgICAvL1NldCB0aGUga2V5CisgICAgICAgICAgICAgICAgUGFzc3dvcmRLZXkgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3IgciA9IFJhbmRvbU51bWJlckdlbmVyYXRvci5DcmVhdGUoKTsKKyAgICAgICAgICAgICAgICByLkdldEJ5dGVzKFBhc3N3b3JkS2V5KTsKKworICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtQYXNzd29yZC5MZW5ndGggKyA0XTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEVuY29kaW5nLkdldEVuY29kaW5nKF9wcm9qZWN0LkNvZGVQYWdlKS5HZXRCeXRlcyhQYXNzd29yZCksIGRhdGEsIFBhc3N3b3JkLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgVmJlUHJvdGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBWaXNpYmlsaXR5U3RhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KFBhc3N3b3JkS2V5LCAwLCBkYXRhLCBkYXRhLkxlbmd0aCAtIDQsIDQpOworCisgICAgICAgICAgICAgICAgLy9DYWxjdWxhdGUgSGFzaAorICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IFNIQTEuQ3JlYXRlKCk7CisgICAgICAgICAgICAgICAgUGFzc3dvcmRIYXNoID0gcHJvdmlkZXIuQ29tcHV0ZUhhc2goZGF0YSk7CisgICAgICAgICAgICAgICAgX3Byb2plY3QuUHJvamVjdElEID0gInswMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL3B1YmxpYyB2b2lkIFZhbGlkYXRlUGFzc3dvcmQoc3RyaW5nIFBhc3N3b3JkKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAvL3sKKworICAgICAgICAvL30gICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9YbWxIZWxwZXIuY3MgYi9FUFBsdXMvWG1sSGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTVhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXMvWG1sSGVscGVyLmNzCkBAIC0wLDAgKzEsODMwIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKgorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJICAgICAgICAgRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKKyAqIEV5YWwgU2VhZ3VsbCAgICAgICBBZGQgIkNyZWF0ZUNvbXBsZXhOb2RlIiAgICAyMDEyLTA0LTAzCisgKiBFeWFsIFNlYWd1bGwgICAgICAgQWRkICJEZWxldGVUb3BOb2RlIiAgICAgICAgMjAxMi0wNC0xMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKK3sKKwkvLy8gPHN1bW1hcnk+CisJLy8vIEhlbHAgY2xhc3MgY29udGFpbmluZyBYTUwgZnVuY3Rpb25zLiAKKwkvLy8gQ2FuIGJlIEluaGVyaXRlZCAKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxIZWxwZXIKKwl7CisJCWludGVybmFsIGRlbGVnYXRlIGludCBDaGFuZ2VkRXZlbnRIYW5kbGVyKFN0eWxlQmFzZSBzZW5kZXIsIFN0eWxlLlN0eWxlQ2hhbmdlRXZlbnRBcmdzIGUpOworCisJCWludGVybmFsIFhtbEhlbHBlcihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisJCXsKKwkJCVRvcE5vZGUgPSBudWxsOworCQkJTmFtZVNwYWNlTWFuYWdlciA9IG5hbWVTcGFjZU1hbmFnZXI7CisJCX0KKworCQlpbnRlcm5hbCBYbWxIZWxwZXIoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUpCisJCXsKKwkJCVRvcE5vZGUgPSB0b3BOb2RlOworCQkJTmFtZVNwYWNlTWFuYWdlciA9IG5hbWVTcGFjZU1hbmFnZXI7CisJCX0KKwkJLy9pbnRlcm5hbCBib29sIENoYW5nZWRGbGFnOworCQlpbnRlcm5hbCBYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIgeyBnZXQ7IHNldDsgfQorCQlpbnRlcm5hbCBYbWxOb2RlIFRvcE5vZGUgeyBnZXQ7IHNldDsgfQorCQlzdHJpbmdbXSBfc2NoZW1hTm9kZU9yZGVyID0gbnVsbDsKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gU2NoZW1hIG9yZGVyIGxpc3QKKwkJLy8vIDwvc3VtbWFyeT4KKwkJaW50ZXJuYWwgc3RyaW5nW10gU2NoZW1hTm9kZU9yZGVyCisJCXsKKwkJCWdldAorCQkJeworCQkJCXJldHVybiBfc2NoZW1hTm9kZU9yZGVyOworCQkJfQorCQkJc2V0CisJCQl7CisJCQkJX3NjaGVtYU5vZGVPcmRlciA9IHZhbHVlOworCQkJfQorCQl9CisJCWludGVybmFsIFhtbE5vZGUgQ3JlYXRlTm9kZShzdHJpbmcgcGF0aCkKKwkJeworCQkJaWYgKHBhdGggPT0gIiIpCisJCQkJcmV0dXJuIFRvcE5vZGU7CisJCQllbHNlCisJCQkJcmV0dXJuIENyZWF0ZU5vZGUocGF0aCwgZmFsc2UpOworCQl9CisJCWludGVybmFsIFhtbE5vZGUgQ3JlYXRlTm9kZShzdHJpbmcgcGF0aCwgYm9vbCBpbnNlcnRGaXJzdCkKKwkJeworCQkJWG1sTm9kZSBub2RlID0gVG9wTm9kZTsKKwkJCVhtbE5vZGUgcHJlcGVuZE5vZGUgPSBudWxsOworCQkJZm9yZWFjaCAoc3RyaW5nIHN1YlBhdGggaW4gcGF0aC5TcGxpdCgnLycpKQorCQkJeworCQkJCVhtbE5vZGUgc3ViTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdWJQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKwkJCQlpZiAoc3ViTm9kZSA9PSBudWxsKQorCQkJCXsKKwkJCQkJc3RyaW5nIG5vZGVOYW1lOworCQkJCQlzdHJpbmcgbm9kZVByZWZpeDsKKworCQkJCQlzdHJpbmcgbmFtZVNwYWNlVVJJID0gIiI7CisJCQkJCXN0cmluZ1tdIG5hbWVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJzonKTsKKworCQkJCQlpZiAoU2NoZW1hTm9kZU9yZGVyICE9IG51bGwgJiYgc3ViUGF0aFswXSAhPSAnQCcpCisJCQkJCXsKKwkJCQkJCWluc2VydEZpcnN0ID0gZmFsc2U7CisJCQkJCQlwcmVwZW5kTm9kZSA9IEdldFByZXBlbmROb2RlKHN1YlBhdGgsIG5vZGUpOworCQkJCQl9CisKKwkJCQkJaWYgKG5hbWVTcGxpdC5MZW5ndGggPiAxKQorCQkJCQl7CisJCQkJCQlub2RlUHJlZml4ID0gbmFtZVNwbGl0WzBdOworCQkJCQkJaWYgKG5vZGVQcmVmaXhbMF0gPT0gJ0AnKSBub2RlUHJlZml4ID0gbm9kZVByZWZpeC5TdWJzdHJpbmcoMSwgbm9kZVByZWZpeC5MZW5ndGggLSAxKTsKKwkJCQkJCW5hbWVTcGFjZVVSSSA9IE5hbWVTcGFjZU1hbmFnZXIuTG9va3VwTmFtZXNwYWNlKG5vZGVQcmVmaXgpOworCQkJCQkJbm9kZU5hbWUgPSBuYW1lU3BsaXRbMV07CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlub2RlUHJlZml4ID0gIiI7CisJCQkJCQluYW1lU3BhY2VVUkkgPSAiIjsKKwkJCQkJCW5vZGVOYW1lID0gbmFtZVNwbGl0WzBdOworCQkJCQl9CisJCQkJCWlmIChzdWJQYXRoLlN0YXJ0c1dpdGgoIkAiKSkKKwkJCQkJeworCQkJCQkJWG1sQXR0cmlidXRlIGFkZGVkQXR0ID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUF0dHJpYnV0ZShzdWJQYXRoLlN1YnN0cmluZygxLCBzdWJQYXRoLkxlbmd0aCAtIDEpLCBuYW1lU3BhY2VVUkkpOyAgLy9uYW1lU3BhY2VVUkkKKwkJCQkJCW5vZGUuQXR0cmlidXRlcy5BcHBlbmQoYWRkZWRBdHQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYgKG5vZGVQcmVmaXggPT0gIiIpCisJCQkJCQl7CisJCQkJCQkJc3ViTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KG5vZGVOYW1lLCBuYW1lU3BhY2VVUkkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWlmIChub2RlUHJlZml4ID09ICIiIHx8IChub2RlLk93bmVyRG9jdW1lbnQgIT0gbnVsbCAmJiBub2RlLk93bmVyRG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50ICE9IG51bGwgJiYgbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudC5OYW1lc3BhY2VVUkkgPT0gbmFtZVNwYWNlVVJJICYmCisJCQkJCQkJCQlub2RlLk93bmVyRG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50LlByZWZpeCA9PSAiIikpCisJCQkJCQkJeworCQkJCQkJCQlzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQobm9kZU5hbWUsIG5hbWVTcGFjZVVSSSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCXN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlUHJlZml4LCBub2RlTmFtZSwgbmFtZVNwYWNlVVJJKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAocHJlcGVuZE5vZGUgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlub2RlLkluc2VydEJlZm9yZShzdWJOb2RlLCBwcmVwZW5kTm9kZSk7CisJCQkJCQkJcHJlcGVuZE5vZGUgPSBudWxsOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoaW5zZXJ0Rmlyc3QpCisJCQkJCQl7CisJCQkJCQkJbm9kZS5QcmVwZW5kQ2hpbGQoc3ViTm9kZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbm9kZS5BcHBlbmRDaGlsZChzdWJOb2RlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlub2RlID0gc3ViTm9kZTsKKwkJCX0KKwkJCXJldHVybiBub2RlOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gT3B0aW9ucyB0byBpbnNlcnQgYSBub2RlIGluIHRoZSBYbWxEb2N1bWVudAorCQkvLy8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBlbnVtIGVOb2RlSW5zZXJ0T3JkZXIKKwkJeworCQkJLy8vIDxzdW1tYXJ5PgorCQkJLy8vIEluc2VydCBhcyBmaXJzdCBub2RlIG9mICJ0b3BOb2RlIgorCQkJLy8vIDwvc3VtbWFyeT4KKwkJCUZpcnN0LAorCisJCQkvLy8gPHN1bW1hcnk+CisJCQkvLy8gSW5zZXJ0IGFzIHRoZSBsYXN0IGNoaWxkIG9mICJ0b3BOb2RlIgorCQkJLy8vIDwvc3VtbWFyeT4KKwkJCUxhc3QsCisKKwkJCS8vLyA8c3VtbWFyeT4KKwkJCS8vLyBJbnNlcnQgYWZ0ZXIgdGhlICJyZWZlcmVuY2VOb2RlIgorCQkJLy8vIDwvc3VtbWFyeT4KKwkJCUFmdGVyLAorCisJCQkvLy8gPHN1bW1hcnk+CisJCQkvLy8gSW5zZXJ0IGJlZm9yZSB0aGUgInJlZmVyZW5jZU5vZGUiCisJCQkvLy8gPC9zdW1tYXJ5PgorCQkJQmVmb3JlLAorCisJCQkvLy8gPHN1bW1hcnk+CisJCQkvLy8gVXNlIHRoZSBTY2hlbWEgTGlzdCB0byBpbnNlcnQgaW4gdGhlIHJpZ2h0IG9yZGVyLiBJZiB0aGUgU2NoZW1hIGxpc3QKKwkJCS8vLyBpcyBudWxsIG9yIGVtcHR5LCBjb25zaWRlciAiTGFzdCIgYXMgdGhlIHNlbGVjdGVkIG9wdGlvbgorCQkJLy8vIDwvc3VtbWFyeT4KKwkJCVNjaGVtYU9yZGVyCisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBDcmVhdGUgYSBjb21wbGV4IG5vZGUuIEluc2VydCB0aGUgbm9kZSBhY2NvcmRpbmcgdG8gU2NoZW1hT3JkZXIKKwkJLy8vIHVzaW5nIHRoZSBUb3BOb2RlIGFzIHRoZSBwYXJlbnQKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJwYXRoIj48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZUNvbXBsZXhOb2RlKAorCQkJc3RyaW5nIHBhdGgpCisJCXsKKwkJCXJldHVybiBDcmVhdGVDb21wbGV4Tm9kZSgKKwkJCQlUb3BOb2RlLAorCQkJCXBhdGgsCisJCQkJZU5vZGVJbnNlcnRPcmRlci5TY2hlbWFPcmRlciwKKwkJCQludWxsKTsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIENyZWF0ZSBhIGNvbXBsZXggbm9kZS4gSW5zZXJ0IHRoZSBub2RlIGFjY29yZGluZyB0byB0aGUgPHBhcmFtcmVmIG5hbWU9InBhdGgiLz4KKwkJLy8vIHVzaW5nIHRoZSA8cGFyYW1yZWYgbmFtZT0idG9wTm9kZSIvPiBhcyB0aGUgcGFyZW50CisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJwYXRoIj48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorCQlpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZUNvbXBsZXhOb2RlKAorCQkJWG1sTm9kZSB0b3BOb2RlLAorCQkJc3RyaW5nIHBhdGgpCisJCXsKKwkJCXJldHVybiBDcmVhdGVDb21wbGV4Tm9kZSgKKwkJCQl0b3BOb2RlLAorCQkJCXBhdGgsCisJCQkJZU5vZGVJbnNlcnRPcmRlci5TY2hlbWFPcmRlciwKKwkJCQludWxsKTsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIENyZWF0ZXMgY29tcGxleCBYTUwgbm9kZXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKwkJLy8vIDEuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZyIKKwkJLy8vCQkxLjEuIENyZWF0ZXMvZmluZCB0aGUgZmlyc3QgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIgbm9kZQorCQkvLy8gCisJCS8vLyAyLiAiZDpjb25kaXRpb25hbEZvcm1hdHRpbmcvQHNxcmVmIgorCQkvLy8JCTIuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiBub2RlCisJCS8vLwkJMi4yLiBDcmVhdGVzIChpZiBub3QgZXhpc3RzKSB0aGUgQHNxcmVmIGF0dHJpYnV0ZQorCQkvLy8KKwkJLy8vIDMuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZy9AaWQ9JzcnL0BzcXJlZj0nQTk6Qjk5JyIKKwkJLy8vCQkzLjEuIENyZWF0ZXMvZmluZCB0aGUgZmlyc3QgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIgbm9kZQorCQkvLy8JCTMuMi4gQ3JlYXRlcy91cGRhdGUgaXRzIEBpZCBhdHRyaWJ1dGUgdG8gIjciCisJCS8vLwkJMy4zLiBDcmVhdGVzL3VwZGF0ZSBpdHMgQHNxcmVmIGF0dHJpYnV0ZSB0byAiQTk6Qjk5IgorCQkvLy8KKwkJLy8vIDQuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZ1tAaWQ9JzcnXS9Ac3FyZWY9J1gxOlg1JyIKKwkJLy8vCQk0LjEuIENyZWF0ZXMvZmluZCB0aGUgZmlyc3QgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIgbm9kZSB3aXRoIEBpZD03CisJCS8vLwkJNC4yLiBDcmVhdGVzL3VwZGF0ZSBpdHMgQHNxcmVmIGF0dHJpYnV0ZSB0byAiWDE6WDUiCisJCS8vLwkKKwkJLy8vIDUuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZ1tAaWQ9JzcnXS9AaWQ9JzgnL0BzcXJlZj0nWDE6WDUnL2Q6Y2ZSdWxlL0BpZD0nQUInIgorCQkvLy8JCTUuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiBub2RlIHdpdGggQGlkPTcKKwkJLy8vCQk1LjIuIFNldCBpdHMgQGlkIGF0dHJpYnV0ZSB0byAiOCIKKwkJLy8vCQk1LjIuIENyZWF0ZXMvdXBkYXRlIGl0cyBAc3FyZWYgYXR0cmlidXRlIGFuZCBzZXQgaXQgdG8gIlgxOlg1IgorCQkvLy8JCTUuMy4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY2ZSdWxlIiBub2RlIChpbnNpZGUgdGhlIG5vZGUpCisJCS8vLwkJNS40LiBDcmVhdGVzL3VwZGF0ZSBpdHMgQGlkIGF0dHJpYnV0ZSB0byAiQUIiCisJCS8vLwkKKwkJLy8vIDYuICJkOmNmUnVsZS9AaWQ9JyciCisJCS8vLwkJNi4xLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjZlJ1bGUiIG5vZGUKKwkJLy8vCQk2LjEuIFJlbW92ZSB0aGUgQGlkIGF0dHJpYnV0ZQorICAgIC8vLwk8L3JlbWFya3M+CisJCS8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJwYXRoIj48L3BhcmFtPgorCQkvLy8gPHBhcmFtIG5hbWU9Im5vZGVJbnNlcnRPcmRlciI+PC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJyZWZlcmVuY2VOb2RlIj48L3BhcmFtPgorCQkvLy8gPHJldHVybnM+VGhlIGxhc3Qgbm9kZSBjcmVhdGVzL2ZvdW5kPC9yZXR1cm5zPgorCQlpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZUNvbXBsZXhOb2RlKAorCQkJWG1sTm9kZSB0b3BOb2RlLAorCQkJc3RyaW5nIHBhdGgsCisJCQllTm9kZUluc2VydE9yZGVyIG5vZGVJbnNlcnRPcmRlciwKKwkJCVhtbE5vZGUgcmVmZXJlbmNlTm9kZSkKKwkJeworCQkJLy8gUGF0aCBpcyBvYnJpZ2F0b3J5CisJCQlpZiAoKHBhdGggPT0gbnVsbCkgfHwgKHBhdGggPT0gc3RyaW5nLkVtcHR5KSkKKwkJCXsKKwkJCQlyZXR1cm4gdG9wTm9kZTsKKwkJCX0KKworCQkJWG1sTm9kZSBub2RlID0gdG9wTm9kZTsKKwkJCXN0cmluZyBuYW1lU3BhY2VVUkkgPSBzdHJpbmcuRW1wdHk7CisKKyAgICAgIC8vVE9ETzogQlVHOiB3aGVuIHRoZSAicGF0aCIgY29udGFpbnMgIi8iIGluIGFuIGF0dHJyaWJ1ZSB2YWx1ZSwgaXQgZ2l2ZXMgYW4gZXJyb3IuCisKKwkJCS8vIFNlcGFyYXRlIHRoZSBYUGF0aCB0byBOb2RlcyBhbmQgQXR0cmlidXRlcworCQkJZm9yZWFjaCAoc3RyaW5nIHN1YlBhdGggaW4gcGF0aC5TcGxpdCgnLycpKQorCQkJeworCQkJCS8vIFRoZSBzdWJQYXRoIGNhbiBiZSBhbnkgb25lIG9mIHRob3NlOgorCQkJCS8vIG5vZGVOYW1lCisJCQkJLy8geDpub2RlTmFtZQorCQkJCS8vIG5vZGVOYW1lW2ZpbmQgY3JpdGVyaWFdCisJCQkJLy8geDpub2RlTmFtZVtmaW5kIGNyaXRlcmlhXQorCQkJCS8vIEBhdHRyaWJ1dGUKKwkJCQkvLyBAYXR0cmlidXRlPSdhdHRyaWJ1dGUgdmFsdWUnCisKKwkJCQkvLyBDaGVjayBpZiB0aGUgc3ViUGF0aCBoYXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlcgorCQkJCWlmIChzdWJQYXRoLkxlbmd0aCA+IDApCisJCQkJeworCQkJCQkvLyBDaGVjayBpZiB0aGUgc3ViUGF0aCBpcyBhbiBhdHRyaWJ1dGUgKHdpdGggb3Igd2l0aG91dCB2YWx1ZSkKKwkJCQkJaWYgKHN1YlBhdGguU3RhcnRzV2l0aCgiQCIpKQorCQkJCQl7CisJCQkJCQkvLyBAYXR0cmlidXRlCQkJCQkJCQkJCS0tPiBDcmVhdGUgYXR0cmlidXRlCisJCQkJCQkvLyBAYXR0cmlidXRlPScnCQkJCQkJCQktLT4gUmVtb3ZlIGF0dHJpYnV0ZQorCQkJCQkJLy8gQGF0dHJpYnV0ZT0nYXR0cmlidXRlIHZhbHVlJyAtLT4gQ3JlYXRlIGF0dHJpYnV0ZSArIHVwZGF0ZSB2YWx1ZQorCQkJCQkJc3RyaW5nW10gYXR0cmlidXRlU3BsaXQgPSBzdWJQYXRoLlNwbGl0KCc9Jyk7CisJCQkJCQlzdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZVNwbGl0WzBdLlN1YnN0cmluZygxLCBhdHRyaWJ1dGVTcGxpdFswXS5MZW5ndGggLSAxKTsKKwkJCQkJCXN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IG51bGw7CS8vIE51bGwgbWVhbnMgbm8gYXR0cmlidXRlIHZhbHVlCisKKwkJCQkJCS8vIENoZWNrIGlmIHdlIGhhdmUgYW4gYXR0cmlidXRlIHZhbHVlIHRvIHNldAorCQkJCQkJaWYgKGF0dHJpYnV0ZVNwbGl0Lkxlbmd0aCA+IDEpCisJCQkJCQl7CisJCQkJCQkJLy8gUmVtb3ZlIHRoZSAnIG9yICIgZnJvbSB0aGUgYXR0cmlidXRlIHZhbHVlCisJCQkJCQkJYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVTcGxpdFsxXS5SZXBsYWNlKCInIiwgIiIpLlJlcGxhY2UoIlwiIiwgIiIpOworCQkJCQkJfQorCisJCQkJCQkvLyBHZXQgdGhlIGF0dHJpYnV0ZSAoaWYgZXhpc3RzKQorCQkJCQkJWG1sQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChYbWxBdHRyaWJ1dGUpKG5vZGUuQXR0cmlidXRlcy5HZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkpOworCisJCQkJCQkvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBpZiB2YWx1ZSBpcyBlbXB0eSAobm90IG51bGwpCisJCQkJCQlpZiAoYXR0cmlidXRlVmFsdWUgPT0gc3RyaW5nLkVtcHR5KQorCQkJCQkJeworCQkJCQkJCS8vIE9ubHkgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMKKwkJCQkJCQlpZiAoYXR0cmlidXRlICE9IG51bGwpCisJCQkJCQkJeworCQkJCQkJCQlub2RlLkF0dHJpYnV0ZXMuUmVtb3ZlKGF0dHJpYnV0ZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIENyZWF0ZSB0aGUgYXR0cmlidWUgaWYgZG9lcyBub3QgZXhpc3RzCisJCQkJCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUKKwkJCQkJCQkJYXR0cmlidXRlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUF0dHJpYnV0ZSgKKwkJCQkJCQkJCWF0dHJpYnV0ZU5hbWUpOworCisJCQkJCQkJCS8vIEFkZCBpdCB0byB0aGUgY3VycmVudCBub2RlCisJCQkJCQkJCW5vZGUuQXR0cmlidXRlcy5BcHBlbmQoYXR0cmlidXRlKTsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorCQkJCQkJCWlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKQorCQkJCQkJCXsKKwkJCQkJCQkJbm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLlZhbHVlID0gYXR0cmlidXRlVmFsdWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gbm9kZU5hbWUKKwkJCQkJCS8vIHg6bm9kZU5hbWUKKwkJCQkJCS8vIG5vZGVOYW1lW2ZpbmQgY3JpdGVyaWFdCisJCQkJCQkvLyB4Om5vZGVOYW1lW2ZpbmQgY3JpdGVyaWFdCisKKwkJCQkJCS8vIExvb2sgZm9yIHRoZSBub2RlICh3aXRoIG9yIHdpdGhvdXQgZmlsdGVyIGNyaXRlcmlhKQorCQkJCQkJWG1sTm9kZSBzdWJOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN1YlBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworCisJCQkJCQkvLyBDaGVjayBpZiB0aGUgbm9kZSBkb2VzIG5vdCBleGlzdHMKKwkJCQkJCWlmIChzdWJOb2RlID09IG51bGwpCisJCQkJCQl7CisJCQkJCQkJc3RyaW5nIG5vZGVOYW1lOworCQkJCQkJCXN0cmluZyBub2RlUHJlZml4OworCQkJCQkJCXN0cmluZ1tdIG5hbWVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJzonKTsKKwkJCQkJCQluYW1lU3BhY2VVUkkgPSBzdHJpbmcuRW1wdHk7CisKKwkJCQkJCQkvLyBDaGVjayBpZiB0aGUgbmFtZSBoYXMgYSBwcmVmaXggbGlrZSAiZDpub2RlTmFtZSIKKwkJCQkJCQlpZiAobmFtZVNwbGl0Lkxlbmd0aCA+IDEpCisJCQkJCQkJeworCQkJCQkJCQlub2RlUHJlZml4ID0gbmFtZVNwbGl0WzBdOworCQkJCQkJCQluYW1lU3BhY2VVUkkgPSBOYW1lU3BhY2VNYW5hZ2VyLkxvb2t1cE5hbWVzcGFjZShub2RlUHJlZml4KTsKKwkJCQkJCQkJbm9kZU5hbWUgPSBuYW1lU3BsaXRbMV07CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW5vZGVQcmVmaXggPSBzdHJpbmcuRW1wdHk7CisJCQkJCQkJCW5hbWVTcGFjZVVSSSA9IHN0cmluZy5FbXB0eTsKKwkJCQkJCQkJbm9kZU5hbWUgPSBuYW1lU3BsaXRbMF07CisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNyaXRlcmlhIHBhcnQgaW4gdGhlIG5vZGUgbmFtZQorCQkJCQkJCWlmIChub2RlTmFtZS5JbmRleE9mKCJbIikgPiAwKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gcmVtb3ZlIHRoZSBjcml0ZXJpYSBmcm9tIHRoZSBub2RlIG5hbWUKKwkJCQkJCQkJbm9kZU5hbWUgPSBub2RlTmFtZS5TdWJzdHJpbmcoMCwgbm9kZU5hbWUuSW5kZXhPZigiWyIpKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAobm9kZVByZWZpeCA9PSBzdHJpbmcuRW1wdHkpCisJCQkJCQkJeworCQkJCQkJCQlzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQobm9kZU5hbWUsIG5hbWVTcGFjZVVSSSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWlmIChub2RlLk93bmVyRG9jdW1lbnQgIT0gbnVsbAorCQkJCQkJCQkJJiYgbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudCAhPSBudWxsCisJCQkJCQkJCQkmJiBub2RlLk93bmVyRG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50Lk5hbWVzcGFjZVVSSSA9PSBuYW1lU3BhY2VVUkkKKwkJCQkJCQkJCSYmIG5vZGUuT3duZXJEb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQuUHJlZml4ID09IHN0cmluZy5FbXB0eSkKKwkJCQkJCQkJeworCQkJCQkJCQkJc3ViTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KAorCQkJCQkJCQkJCW5vZGVOYW1lLAorCQkJCQkJCQkJCW5hbWVTcGFjZVVSSSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoCisJCQkJCQkJCQkJbm9kZVByZWZpeCwKKwkJCQkJCQkJCQlub2RlTmFtZSwKKwkJCQkJCQkJCQluYW1lU3BhY2VVUkkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB1c2UgdGhlICJTY2hlbWFPcmRlciIKKwkJCQkJCQlpZiAobm9kZUluc2VydE9yZGVyID09IGVOb2RlSW5zZXJ0T3JkZXIuU2NoZW1hT3JkZXIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBDaGVjayBpZiB0aGUgU2NoZW1hIE9yZGVyIExpc3QgaXMgZW1wdHkKKwkJCQkJCQkJaWYgKChTY2hlbWFOb2RlT3JkZXIgPT0gbnVsbCkgfHwgKFNjaGVtYU5vZGVPcmRlci5MZW5ndGggPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIFVzZSB0aGUgIkluc2VydCBMYXN0IiBvcHRpb24gd2hlbiBTY2hlbWEgT3JkZXIgTGlzdCBpcyBlbXB0eQorCQkJCQkJCQkJbm9kZUluc2VydE9yZGVyID0gZU5vZGVJbnNlcnRPcmRlci5MYXN0OworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gRmluZCB0aGUgcHJlcGVuZCBub2RlIGluIG9yZGVyIHRvIGluc2VydAorCQkJCQkJCQkJcmVmZXJlbmNlTm9kZSA9IEdldFByZXBlbmROb2RlKG5vZGVOYW1lLCBub2RlKTsKKworCQkJCQkJCQkJaWYgKHJlZmVyZW5jZU5vZGUgIT0gbnVsbCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLkJlZm9yZTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLkxhc3Q7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlzd2l0Y2ggKG5vZGVJbnNlcnRPcmRlcikKKwkJCQkJCQl7CisJCQkJCQkJCWNhc2UgZU5vZGVJbnNlcnRPcmRlci5BZnRlcjoKKwkJCQkJCQkJCW5vZGUuSW5zZXJ0QWZ0ZXIoc3ViTm9kZSwgcmVmZXJlbmNlTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VOb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkJCQkJCWNhc2UgZU5vZGVJbnNlcnRPcmRlci5CZWZvcmU6CisJCQkJCQkJCQlub2RlLkluc2VydEJlZm9yZShzdWJOb2RlLCByZWZlcmVuY2VOb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUgPSBudWxsOworCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJY2FzZSBlTm9kZUluc2VydE9yZGVyLkZpcnN0OgorCQkJCQkJCQkJbm9kZS5QcmVwZW5kQ2hpbGQoc3ViTm9kZSk7CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQljYXNlIGVOb2RlSW5zZXJ0T3JkZXIuTGFzdDoKKwkJCQkJCQkJCW5vZGUuQXBwZW5kQ2hpbGQoc3ViTm9kZSk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIE1ha2UgdGhlIG5ld2x5IGNyZWF0ZWQgbm9kZSB0aGUgdG9wIG5vZGUgd2hlbiB0aGUgcmVzdCBvZiB0aGUgcGF0aAorCQkJCQkJLy8gaXMgYmVpbmcgZXZhbHVhdGVkLiBTbyBuZXdseSBjcmVhdGVkIG5vZGVzIHdpbGwgYmUgdGhlIGNoaWxkcmVuIG9mIHRoZQorCQkJCQkJLy8gb25lIHdlIGp1c3QgY3JlYXRlZC4KKwkJCQkJCW5vZGUgPSBzdWJOb2RlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBSZXR1cm4gdGhlIGxhc3QgY3JlYXRlZC9mb3VuZCBub2RlCisJCQlyZXR1cm4gbm9kZTsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIHJldHVybiBQcmVwZW5kIG5vZGUKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJub2RlTmFtZSI+bmFtZSBvZiB0aGUgbm9kZSB0byBjaGVjazwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+VG9wbm9kZSB0byBjaGVjayBjaGlsZHJlbjwvcGFyYW0+CisJCS8vLyA8cmV0dXJucz48L3JldHVybnM+CisJCXByaXZhdGUgWG1sTm9kZSBHZXRQcmVwZW5kTm9kZShzdHJpbmcgbm9kZU5hbWUsIFhtbE5vZGUgbm9kZSkKKwkJeworCQkJaW50IHBvcyA9IEdldE5vZGVQb3Mobm9kZU5hbWUpOworCQkJaWYgKHBvcyA8IDApCisJCQl7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlYbWxOb2RlIHByZXBlbmROb2RlID0gbnVsbDsKKwkJCWZvcmVhY2ggKFhtbE5vZGUgY2hpbGROb2RlIGluIG5vZGUuQ2hpbGROb2RlcykKKwkJCXsKKwkJCQlpbnQgY2hpbGRQb3MgPSBHZXROb2RlUG9zKGNoaWxkTm9kZS5OYW1lKTsKKwkJCQlpZiAoY2hpbGRQb3MgPiAtMSkgIC8vRm91bmQ/CisJCQkJeworCQkJCQlpZiAoY2hpbGRQb3MgPiBwb3MpIC8vUG9zaXRpb24gaXMgYmVmb3JlCisJCQkJCXsKKwkJCQkJCXByZXBlbmROb2RlID0gY2hpbGROb2RlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcHJlcGVuZE5vZGU7CisJCX0KKwkJcHJpdmF0ZSBpbnQgR2V0Tm9kZVBvcyhzdHJpbmcgbm9kZU5hbWUpCisJCXsKKwkJCWludCBpeCA9IG5vZGVOYW1lLkluZGV4T2YoIjoiKTsKKwkJCWlmIChpeCA+IDApCisJCQl7CisJCQkJbm9kZU5hbWUgPSBub2RlTmFtZS5TdWJzdHJpbmcoaXggKyAxLCBub2RlTmFtZS5MZW5ndGggLSAoaXggKyAxKSk7CisJCQl9CisJCQlmb3IgKGludCBpID0gMDsgaSA8IF9zY2hlbWFOb2RlT3JkZXIuTGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKG5vZGVOYW1lID09IF9zY2hlbWFOb2RlT3JkZXJbaV0pCisJCQkJeworCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaW50ZXJuYWwgdm9pZCBEZWxldGVBbGxOb2RlKHN0cmluZyBwYXRoKQorCQl7CisJCQlzdHJpbmdbXSBzcGxpdCA9IHBhdGguU3BsaXQoJy8nKTsKKwkJCVhtbE5vZGUgbm9kZSA9IFRvcE5vZGU7CisJCQlmb3JlYWNoIChzdHJpbmcgcyBpbiBzcGxpdCkKKwkJCXsKKwkJCQlub2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKHMsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJCWlmIChub2RlICE9IG51bGwpCisJCQkJeworCQkJCQlpZiAobm9kZSBpcyBYbWxBdHRyaWJ1dGUpCisJCQkJCXsKKwkJCQkJCShub2RlIGFzIFhtbEF0dHJpYnV0ZSkuT3duZXJFbGVtZW50LkF0dHJpYnV0ZXMuUmVtb3ZlKG5vZGUgYXMgWG1sQXR0cmlidXRlKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW50ZXJuYWwgdm9pZCBEZWxldGVOb2RlKHN0cmluZyBwYXRoKQorCQl7CisJCQl2YXIgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKwkJCWlmIChub2RlICE9IG51bGwpCisJCQl7CisJCQkJaWYgKG5vZGUgaXMgWG1sQXR0cmlidXRlKQorCQkJCXsKKwkJCQkJdmFyIGF0dCA9IChYbWxBdHRyaWJ1dGUpbm9kZTsKKwkJCQkJYXR0Lk93bmVyRWxlbWVudC5BdHRyaWJ1dGVzLlJlbW92ZShhdHQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlub2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7CisJCQkJfQorCQkJfQorCQl9CisgICAgaW50ZXJuYWwgdm9pZCBEZWxldGVUb3BOb2RlKCkKKyAgICB7CisgICAgICBUb3BOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoVG9wTm9kZSk7CisgICAgfQorCQlpbnRlcm5hbCB2b2lkIFNldFhtbE5vZGVTdHJpbmcoc3RyaW5nIHBhdGgsIHN0cmluZyB2YWx1ZSkKKwkJeworCQkJU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBwYXRoLCB2YWx1ZSwgZmFsc2UsIGZhbHNlKTsKKwkJfQorCQlpbnRlcm5hbCB2b2lkIFNldFhtbE5vZGVTdHJpbmcoc3RyaW5nIHBhdGgsIHN0cmluZyB2YWx1ZSwgYm9vbCByZW1vdmVJZkJsYW5rKQorCQl7CisJCQlTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIHBhdGgsIHZhbHVlLCByZW1vdmVJZkJsYW5rLCBmYWxzZSk7CisJCX0KKwkJaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKFhtbE5vZGUgbm9kZSwgc3RyaW5nIHBhdGgsIHN0cmluZyB2YWx1ZSkKKwkJeworCQkJU2V0WG1sTm9kZVN0cmluZyhub2RlLCBwYXRoLCB2YWx1ZSwgZmFsc2UsIGZhbHNlKTsKKwkJfQorCQlpbnRlcm5hbCB2b2lkIFNldFhtbE5vZGVTdHJpbmcoWG1sTm9kZSBub2RlLCBzdHJpbmcgcGF0aCwgc3RyaW5nIHZhbHVlLCBib29sIHJlbW92ZUlmQmxhbmspCisJCXsKKwkJCVNldFhtbE5vZGVTdHJpbmcobm9kZSwgcGF0aCwgdmFsdWUsIHJlbW92ZUlmQmxhbmssIGZhbHNlKTsKKwkJfQorCQlpbnRlcm5hbCB2b2lkIFNldFhtbE5vZGVTdHJpbmcoWG1sTm9kZSBub2RlLCBzdHJpbmcgcGF0aCwgc3RyaW5nIHZhbHVlLCBib29sIHJlbW92ZUlmQmxhbmssIGJvb2wgaW5zZXJ0Rmlyc3QpCisJCXsKKwkJCWlmIChub2RlID09IG51bGwpCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKHZhbHVlID09ICIiICYmIHJlbW92ZUlmQmxhbmspCisJCQl7CisJCQkJRGVsZXRlQWxsTm9kZShwYXRoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlYbWxOb2RlIG5hbWVOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJCWlmIChuYW1lTm9kZSA9PSBudWxsKQorCQkJCXsKKwkJCQkJQ3JlYXRlTm9kZShwYXRoLCBpbnNlcnRGaXJzdCk7CisJCQkJCW5hbWVOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworCQkJCX0KKwkJCQkvL2lmIChuYW1lTm9kZS5Jbm5lclRleHQgIT0gdmFsdWUpIEhhc0NoYW5nZWQoKTsKKwkJCQluYW1lTm9kZS5Jbm5lclRleHQgPSB2YWx1ZTsKKwkJCX0KKwkJfQorCQlpbnRlcm5hbCB2b2lkIFNldFhtbE5vZGVCb29sKHN0cmluZyBwYXRoLCBib29sIHZhbHVlKQorCQl7CisJCQlTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIHBhdGgsIHZhbHVlID8gIjEiIDogIjAiLCBmYWxzZSwgZmFsc2UpOworCQl9CisJCWludGVybmFsIHZvaWQgU2V0WG1sTm9kZUJvb2woc3RyaW5nIHBhdGgsIGJvb2wgdmFsdWUsIGJvb2wgcmVtb3ZlSWYpCisJCXsKKwkJCWlmICh2YWx1ZSA9PSByZW1vdmVJZikKKwkJCXsKKwkJCQl2YXIgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKwkJCQlpZiAobm9kZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJaWYgKG5vZGUgaXMgWG1sQXR0cmlidXRlKQorCQkJCQl7CisJCQkJCQl2YXIgZWxlbSA9IChub2RlIGFzIFhtbEF0dHJpYnV0ZSkuT3duZXJFbGVtZW50OworCQkJCQkJZWxlbS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGVsZW0pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJVG9wTm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIHBhdGgsIHZhbHVlID8gIjEiIDogIjAiLCBmYWxzZSwgZmFsc2UpOworCQkJfQorCQl9CisJCWludGVybmFsIGJvb2wgRXhpc3ROb2RlKHN0cmluZyBwYXRoKQorCQl7CisJCQlpZiAoVG9wTm9kZSA9PSBudWxsIHx8IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSA9PSBudWxsKQorCQkJeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpbnRlcm5hbCBib29sPyBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKHN0cmluZyBwYXRoKQorCQl7CisJCQl2YXIgdmFsdWUgPSBHZXRYbWxOb2RlU3RyaW5nKHBhdGgpOworCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKKwkJCXsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBHZXRYbWxOb2RlQm9vbChwYXRoKTsKKwkJfQorCQlpbnRlcm5hbCBib29sIEdldFhtbE5vZGVCb29sKHN0cmluZyBwYXRoKQorCQl7CisJCQlyZXR1cm4gR2V0WG1sTm9kZUJvb2wocGF0aCwgZmFsc2UpOworCQl9CisJCWludGVybmFsIGJvb2wgR2V0WG1sTm9kZUJvb2woc3RyaW5nIHBhdGgsIGJvb2wgYmxhbmtWYWx1ZSkKKwkJeworCQkJc3RyaW5nIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhwYXRoKTsKKwkJCWlmICh2YWx1ZSA9PSAiMSIgfHwgdmFsdWUgPT0gIi0xIiB8fCB2YWx1ZS5FcXVhbHMoInRydWUiLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJZWxzZSBpZiAodmFsdWUgPT0gIiIpCisJCQl7CisJCQkJcmV0dXJuIGJsYW5rVmFsdWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWludGVybmFsIGludCBHZXRYbWxOb2RlSW50KHN0cmluZyBwYXRoKQorCQl7CisJCQlpbnQgaTsKKwkJCWlmIChpbnQuVHJ5UGFyc2UoR2V0WG1sTm9kZVN0cmluZyhwYXRoKSwgb3V0IGkpKQorCQkJeworCQkJCXJldHVybiBpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBpbnQuTWluVmFsdWU7CisJCQl9CisJCX0KKyAgICAgICAgaW50ZXJuYWwgaW50PyBHZXRYbWxOb2RlSW50TnVsbChzdHJpbmcgcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBzdHJpbmcgcyA9IEdldFhtbE5vZGVTdHJpbmcocGF0aCk7CisgICAgICAgICAgICBpZiAocyE9IiIgJiYgaW50LlRyeVBhcnNlKHMsIG91dCBpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJCWludGVybmFsIGRlY2ltYWwgR2V0WG1sTm9kZURlY2ltYWwoc3RyaW5nIHBhdGgpCisJCXsKKwkJCWRlY2ltYWwgZDsKKwkJCWlmIChkZWNpbWFsLlRyeVBhcnNlKEdldFhtbE5vZGVTdHJpbmcocGF0aCksIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkKSkKKwkJCXsKKwkJCQlyZXR1cm4gZDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorICAgICAgICBpbnRlcm5hbCBkZWNpbWFsPyBHZXRYbWxOb2RlRGVjaW1hbE51bGwoc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY2ltYWwgZDsKKyAgICAgICAgICAgIGlmIChkZWNpbWFsLlRyeVBhcnNlKEdldFhtbE5vZGVTdHJpbmcocGF0aCksIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBkb3VibGU/IEdldFhtbE5vZGVEb3VibGVOdWxsKHN0cmluZyBwYXRoKQorCQl7CisJCQlzdHJpbmcgcyA9IEdldFhtbE5vZGVTdHJpbmcocGF0aCk7CisJCQlpZiAocyA9PSAiIikKKwkJCXsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkb3VibGUgdjsKKwkJCQlpZiAoZG91YmxlLlRyeVBhcnNlKHMsIE51bWJlclN0eWxlcy5OdW1iZXIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCB2KSkKKwkJCQl7CisJCQkJCXJldHVybiB2OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaW50ZXJuYWwgZG91YmxlIEdldFhtbE5vZGVEb3VibGUoc3RyaW5nIHBhdGgpCisJCXsKKwkJCXN0cmluZyBzID0gR2V0WG1sTm9kZVN0cmluZyhwYXRoKTsKKwkJCWlmIChzID09ICIiKQorCQkJeworCQkJCXJldHVybiBkb3VibGUuTmFOOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRvdWJsZSB2OworCQkJCWlmIChkb3VibGUuVHJ5UGFyc2UocywgTnVtYmVyU3R5bGVzLk51bWJlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHYpKQorCQkJCXsKKwkJCQkJcmV0dXJuIHY7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiBkb3VibGUuTmFOOworCQkJCX0KKwkJCX0KKwkJfQorICAgIGludGVybmFsIHN0cmluZyBHZXRYbWxOb2RlU3RyaW5nKFhtbE5vZGUgbm9kZSwgc3RyaW5nIHBhdGgpCisgICAgeworICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgICAgfQorCisgICAgICBYbWxOb2RlIG5hbWVOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgICBpZiAobmFtZU5vZGUgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgaWYgKG5hbWVOb2RlLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLkF0dHJpYnV0ZSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBuYW1lTm9kZS5WYWx1ZSAhPSBudWxsID8gbmFtZU5vZGUuVmFsdWUgOiAiIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gbmFtZU5vZGUuSW5uZXJUZXh0OworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0KKyAgICB9CisJCWludGVybmFsIHN0cmluZyBHZXRYbWxOb2RlU3RyaW5nKHN0cmluZyBwYXRoKQorCQl7CisgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBwYXRoKTsKKwkJfQorCQlpbnRlcm5hbCBzdGF0aWMgVXJpIEdldE5ld1VyaShQYWNrYWdpbmcuWmlwUGFja2FnZSBwYWNrYWdlLCBzdHJpbmcgc1VyaSkKKwkJeworCQkJcmV0dXJuIEdldE5ld1VyaShwYWNrYWdlLCBzVXJpLCAxKTsKKwkJfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVXJpIEdldE5ld1VyaShQYWNrYWdpbmcuWmlwUGFja2FnZSBwYWNrYWdlLCBzdHJpbmcgc1VyaSwgaW50IGlkKQorCQl7CisJCQlVcmkgdXJpOworCQkJZG8KKwkJCXsKKwkJCQl1cmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoc1VyaSwgaWQrKyksIFVyaUtpbmQuUmVsYXRpdmUpOworCQkJfQorCQkJd2hpbGUgKHBhY2thZ2UuUGFydEV4aXN0cyh1cmkpKTsKKwkJCXJldHVybiB1cmk7CisJCX0KKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gSW5zZXJ0IHRoZSBuZXcgbm9kZSBiZWZvcmUgYW55IG9mIHRoZSBub2RlcyBpbiB0aGUgY29tbWEgc2VwYXJldGVkIGxpc3QKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJwYXJlbnROb2RlIj5QYXJlbnQgbm9kZTwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0iYmVmb3JlTm9kZXMiPmNvbW1hIHNlcGFyYXRlZCBsaXN0IGNvbnRhaW5pbmcgbm9kZXMgdG8gaW5zZXJ0IGFmdGVyLiBMZWZ0IHRvIHJpZ2h0IG9yZGVyPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJuZXdOb2RlIj5UaGUgbmV3IG5vZGUgdG8gYmUgaW5zZXJ0ZXJkPC9wYXJhbT4KKwkJaW50ZXJuYWwgdm9pZCBJbnNlckFmdGVyKFhtbE5vZGUgcGFyZW50Tm9kZSwgc3RyaW5nIGJlZm9yZU5vZGVzLCBYbWxOb2RlIG5ld05vZGUpCisJCXsKKwkJCXN0cmluZ1tdIG5vZGVQYXRocyA9IGJlZm9yZU5vZGVzLlNwbGl0KCcsJyk7CisKKwkJCWZvcmVhY2ggKHN0cmluZyBub2RlUGF0aCBpbiBub2RlUGF0aHMpCisJCQl7CisJCQkJWG1sTm9kZSBub2RlID0gcGFyZW50Tm9kZS5TZWxlY3RTaW5nbGVOb2RlKG5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKwkJCQlpZiAobm9kZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJcGFyZW50Tm9kZS5JbnNlcnRBZnRlcihuZXdOb2RlLCBub2RlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXBhcmVudE5vZGUuSW5zZXJ0QWZ0ZXIobmV3Tm9kZSwgbnVsbCk7CisJCX0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgTG9hZFhtbFNhZmUoWG1sRG9jdW1lbnQgeG1sRG9jLCBTdHJlYW0gc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxSZWFkZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBYbWxSZWFkZXJTZXR0aW5ncygpOworICAgICAgICAgICAgLy9EaXNhYmxlIGVudGl0eSBwYXJzaW5nICh0byBhdmlvZCB4bWxib21icywgRXh0ZXJuYWwgRW50aXR5IEF0dGFja3MgZXRjKS4KKyAgICAgICAgICAgIHNldHRpbmdzLlByb2hpYml0RHRkID0gdHJ1ZTsKKyAgICAgICAgICAgIFhtbFJlYWRlciByZWFkZXIgPSBYbWxSZWFkZXIuQ3JlYXRlKHN0cmVhbSwgc2V0dGluZ3MpOworICAgICAgICAgICAgeG1sRG9jLkxvYWQocmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBMb2FkWG1sU2FmZShYbWxEb2N1bWVudCB4bWxEb2MsIHN0cmluZyB4bWwsIEVuY29kaW5nIGVuY29kaW5nKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShlbmNvZGluZy5HZXRCeXRlcyh4bWwpKTsKKyAgICAgICAgICAgIExvYWRYbWxTYWZlKHhtbERvYywgc3RyZWFtKTsKKyAgICAgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9YbWxIZWxwZXJGYWN0b3J5LmNzIGIvRVBQbHVzL1htbEhlbHBlckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxMDZhMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1cy9YbWxIZWxwZXJGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNjQgQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICoKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hdHMgQWxtIAkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDExLTA1LTAxCisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAoreworICAgIGludGVybmFsIGNsYXNzIFhtbEhlbHBlckluc3RhbmNlIDogWG1sSGVscGVyCisgICAgeworICAgICAgICBpbnRlcm5hbCBYbWxIZWxwZXJJbnN0YW5jZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAge30KKworICAgICAgICBpbnRlcm5hbCBYbWxIZWxwZXJJbnN0YW5jZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCB0b3BOb2RlKQorICAgICAgICB7fQorCisgICAgfQorCisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFhtbEhlbHBlckZhY3RvcnkKKyAgICB7CisgICAgICAgIGludGVybmFsIHN0YXRpYyBYbWxIZWxwZXIgQ3JlYXRlKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxIZWxwZXJJbnN0YW5jZShuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyBYbWxIZWxwZXIgQ3JlYXRlKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEhlbHBlckluc3RhbmNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9BcHAuY29uZmlnIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9BcHAuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTU2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0FwcC5jb25maWcKQEAgLTAsMCArMSw2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzxjb25maWd1cmF0aW9uPgorICAgIDxzdGFydHVwPiAKKyAgICAgICAgPHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMCIgc2t1PSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuNSIgLz4KKyAgICA8L3N0YXJ0dXA+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Db252ZXJ0VXRpbC5jcyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvQ29udmVydFV0aWwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxM2RjNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvQ29udmVydFV0aWwuY3MKQEAgLTAsMCArMSw3MSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtbworeworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBDb252ZXJ0VXRpbAorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgSXNOdW1lcmljKG9iamVjdCBjYW5kaWRhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIChjYW5kaWRhdGUuR2V0VHlwZSgpLklzUHJpbWl0aXZlIHx8IGNhbmRpZGF0ZSBpcyBkb3VibGUgfHwgY2FuZGlkYXRlIGlzIGRlY2ltYWwgfHwgY2FuZGlkYXRlIGlzIERhdGVUaW1lIHx8IGNhbmRpZGF0ZSBpcyBUaW1lU3BhbiB8fCBjYW5kaWRhdGUgaXMgbG9uZyk7CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc051bWVyaWNTdHJpbmcob2JqZWN0IGNhbmRpZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBSZWdleC5Jc01hdGNoKGNhbmRpZGF0ZS5Ub1N0cmluZygpLCBAIl5bXGRdKyhcLFtcZF0pPyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBhbiBvYmplY3QgdmFsdWUgdG8gYSBkb3VibGUgCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idiI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVCb29sIj48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZG91YmxlIEdldFZhbHVlRG91YmxlKG9iamVjdCB2LCBib29sIGlnbm9yZUJvb2wgPSBmYWxzZSkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGQ7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaWdub3JlQm9vbCAmJiB2IGlzIGJvb2wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYyh2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2IGlzIERhdGVUaW1lKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gKChEYXRlVGltZSl2KS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaXMgVGltZVNwYW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKDApLkFkZCgoVGltZVNwYW4pdikuVG9PQURhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBDb252ZXJ0LlRvRG91YmxlKHYsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uRGVtby5jc3Byb2ogYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25EZW1vLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDI3YTVlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uRGVtby5jc3Byb2oKQEAgLTAsMCArMSwxMDcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPns5NENCQ0VGQy1EREJGLTRGNTQtOEFFQS00QzQwQkJEMjg4MUJ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5XaW5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkVQUGx1c0V4Y2VsRm9ybURlbW88L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5FUFBsdXNFeGNlbEZvcm1EZW1vPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlIDQuMHxBbnlDUFUnIj4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZSA0LjBcPC9PdXRwdXRQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRlcGxveW1lbnQiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29udmVydFV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRXhjZWxGb3JtLmNzIj4KKyAgICAgIDxTdWJUeXBlPkZvcm08L1N1YlR5cGU+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsRm9ybS5EZXNpZ25lci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5FeGNlbEZvcm0uY3M8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZ1bmN0aW9ucy5jcyI+CisgICAgICA8U3ViVHlwZT5Gb3JtPC9TdWJUeXBlPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGdW5jdGlvbnMuRGVzaWduZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+RnVuY3Rpb25zLmNzPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkV4Y2VsRm9ybS5yZXN4Ij4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkV4Y2VsRm9ybS5jczwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0VtYmVkZGVkUmVzb3VyY2U+CisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iRnVuY3Rpb25zLnJlc3giPgorICAgICAgPERlcGVuZGVudFVwb24+RnVuY3Rpb25zLmNzPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvRW1iZWRkZWRSZXNvdXJjZT4KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXFJlc291cmNlcy5yZXN4Ij4KKyAgICAgIDxHZW5lcmF0b3I+UmVzWEZpbGVDb2RlR2VuZXJhdG9yPC9HZW5lcmF0b3I+CisgICAgICA8TGFzdEdlbk91dHB1dD5SZXNvdXJjZXMuRGVzaWduZXIuY3M8L0xhc3RHZW5PdXRwdXQ+CisgICAgICA8U3ViVHlwZT5EZXNpZ25lcjwvU3ViVHlwZT4KKyAgICA8L0VtYmVkZGVkUmVzb3VyY2U+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xSZXNvdXJjZXMuRGVzaWduZXIuY3MiPgorICAgICAgPEF1dG9HZW4+VHJ1ZTwvQXV0b0dlbj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPlJlc291cmNlcy5yZXN4PC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Tm9uZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXFNldHRpbmdzLnNldHRpbmdzIj4KKyAgICAgIDxHZW5lcmF0b3I+U2V0dGluZ3NTaW5nbGVGaWxlR2VuZXJhdG9yPC9HZW5lcmF0b3I+CisgICAgICA8TGFzdEdlbk91dHB1dD5TZXR0aW5ncy5EZXNpZ25lci5jczwvTGFzdEdlbk91dHB1dD4KKyAgICA8L05vbmU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xTZXR0aW5ncy5EZXNpZ25lci5jcyI+CisgICAgICA8QXV0b0dlbj5UcnVlPC9BdXRvR2VuPgorICAgICAgPERlcGVuZGVudFVwb24+U2V0dGluZ3Muc2V0dGluZ3M8L0RlcGVuZGVudFVwb24+CisgICAgICA8RGVzaWduVGltZVNoYXJlZElucHV0PlRydWU8L0Rlc2lnblRpbWVTaGFyZWRJbnB1dD4KKyAgICA8L0NvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9IkFwcC5jb25maWciIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEVQUGx1c1xFUFBsdXMuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns3YjI4ODAyNi01NTAyLTRhMzktYmY0MS03N2UwODZmM2U0YTN9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RVBQbHVzPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FeGNlbEZvcm0uRGVzaWduZXIuY3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0V4Y2VsRm9ybS5EZXNpZ25lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjJhOWEzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FeGNlbEZvcm0uRGVzaWduZXIuY3MKQEAgLTAsMCArMSwyMjUgQEAKK++7v25hbWVzcGFjZSBFUFBsdXNFeGNlbEZvcm1EZW1vCit7CisgICAgcGFydGlhbCBjbGFzcyBFeGNlbEZvcm0KKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlcXVpcmVkIGRlc2lnbmVyIHZhcmlhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFN5c3RlbS5Db21wb25lbnRNb2RlbC5JQ29udGFpbmVyIGNvbXBvbmVudHMgPSBudWxsOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENsZWFuIHVwIGFueSByZXNvdXJjZXMgYmVpbmcgdXNlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaXNwb3NpbmciPnRydWUgaWYgbWFuYWdlZCByZXNvdXJjZXMgc2hvdWxkIGJlIGRpc3Bvc2VkOyBvdGhlcndpc2UsIGZhbHNlLjwvcGFyYW0+CisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaXNwb3NpbmcgJiYgKGNvbXBvbmVudHMgIT0gbnVsbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYXNlLkRpc3Bvc2UoZGlzcG9zaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gV2luZG93cyBGb3JtIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVxdWlyZWQgbWV0aG9kIGZvciBEZXNpZ25lciBzdXBwb3J0IC0gZG8gbm90IG1vZGlmeQorICAgICAgICAvLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhlIGNvZGUgZWRpdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZUNvbXBvbmVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NlbGxTdHlsZSBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NlbGxTdHlsZSgpOworICAgICAgICAgICAgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3Q2VsbFN0eWxlIGRhdGFHcmlkVmlld0NlbGxTdHlsZTQgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3Q2VsbFN0eWxlKCk7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9TYXZlID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbigpOworICAgICAgICAgICAgdGhpcy5zYXZlRmlsZURpYWxvZ19TYXZlRXhjZWwgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuU2F2ZUZpbGVEaWFsb2coKTsKKyAgICAgICAgICAgIHRoaXMudGFiUGFnZTEgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuVGFiUGFnZSgpOworICAgICAgICAgICAgdGhpcy50ZXh0Qm94X2Z4ID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRCb3goKTsKKyAgICAgICAgICAgIHRoaXMubGFiZWwxID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxhYmVsKCk7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3KCk7CisgICAgICAgICAgICB0aGlzLkUgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbigpOworICAgICAgICAgICAgdGhpcy5EID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RleHRCb3hDb2x1bW4oKTsKKyAgICAgICAgICAgIHRoaXMuQyA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uKCk7CisgICAgICAgICAgICB0aGlzLkIgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbigpOworICAgICAgICAgICAgdGhpcy5BID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RleHRCb3hDb2x1bW4oKTsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYSA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24oKTsKKyAgICAgICAgICAgIHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRhYkNvbnRyb2woKTsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uMSA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24oKTsKKyAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuU3VzcGVuZExheW91dCgpOworICAgICAgICAgICAgKChTeXN0ZW0uQ29tcG9uZW50TW9kZWwuSVN1cHBvcnRJbml0aWFsaXplKSh0aGlzLmRhdGFHcmlkVmlld19XczEpKS5CZWdpbkluaXQoKTsKKyAgICAgICAgICAgIHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzLlN1c3BlbmRMYXlvdXQoKTsKKyAgICAgICAgICAgIHRoaXMuU3VzcGVuZExheW91dCgpOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBidXR0b25fU2F2ZQorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9TYXZlLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDE3LCAxMik7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9TYXZlLk5hbWUgPSAiYnV0dG9uX1NhdmUiOworICAgICAgICAgICAgdGhpcy5idXR0b25fU2F2ZS5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoOTUsIDIzKTsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uX1NhdmUuVGFiSW5kZXggPSAxOworICAgICAgICAgICAgdGhpcy5idXR0b25fU2F2ZS5UZXh0ID0gIlNhdmUgRXhjZWxmaWxlIjsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uX1NhdmUuVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5idXR0b25fU2F2ZS5DbGljayArPSBuZXcgU3lzdGVtLkV2ZW50SGFuZGxlcih0aGlzLmJ1dHRvbl9TYXZlX0NsaWNrKTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gdGFiUGFnZTEKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5Db250cm9scy5BZGQodGhpcy5idXR0b25fQXBwbHlGb3JtdWxhKTsKKyAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuQ29udHJvbHMuQWRkKHRoaXMuZGF0YUdyaWRWaWV3X1dzMSk7CisgICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLkNvbnRyb2xzLkFkZCh0aGlzLmxhYmVsMSk7CisgICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLkNvbnRyb2xzLkFkZCh0aGlzLnRleHRCb3hfZngpOworICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCg0LCAyMik7CisgICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLk5hbWUgPSAidGFiUGFnZTEiOworICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5QYWRkaW5nID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhZGRpbmcoMyk7CisgICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg1NzUsIDM2MCk7CisgICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLlRhYkluZGV4ID0gMDsKKyAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuVGV4dCA9ICJTaGVldDEiOworICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIHRleHRCb3hfZngKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy50ZXh0Qm94X2Z4LkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDk0LCAxNik7CisgICAgICAgICAgICB0aGlzLnRleHRCb3hfZnguTmFtZSA9ICJ0ZXh0Qm94X2Z4IjsKKyAgICAgICAgICAgIHRoaXMudGV4dEJveF9meC5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoMzU2LCAyMCk7CisgICAgICAgICAgICB0aGlzLnRleHRCb3hfZnguVGFiSW5kZXggPSAwOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBsYWJlbDEKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5sYWJlbDEuQXV0b1NpemUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5sYWJlbDEuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoNzMsIDE2KTsKKyAgICAgICAgICAgIHRoaXMubGFiZWwxLk5hbWUgPSAibGFiZWwxIjsKKyAgICAgICAgICAgIHRoaXMubGFiZWwxLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxNSwgMTMpOworICAgICAgICAgICAgdGhpcy5sYWJlbDEuVGFiSW5kZXggPSAxOworICAgICAgICAgICAgdGhpcy5sYWJlbDEuVGV4dCA9ICJmeCI7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIGRhdGFHcmlkVmlld19XczEKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkFsbG93VXNlclRvQWRkUm93cyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkFsbG93VXNlclRvRGVsZXRlUm93cyA9IGZhbHNlOworICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlMy5BbGlnbm1lbnQgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdDb250ZW50QWxpZ25tZW50Lk1pZGRsZUNlbnRlcjsKKyAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTMuQmFja0NvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLkNvbnRyb2w7CisgICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzLkZvbnQgPSBuZXcgU3lzdGVtLkRyYXdpbmcuRm9udCgiVGltZXMgTmV3IFJvbWFuIiwgOS43NUYsIFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZS5SZWd1bGFyLCBTeXN0ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQuUG9pbnQsICgoYnl0ZSkoMCkpKTsKKyAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTMuRm9yZUNvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLldpbmRvd1RleHQ7CisgICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzLlNlbGVjdGlvbkJhY2tDb2xvciA9IFN5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9ycy5IaWdobGlnaHQ7CisgICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzLlNlbGVjdGlvbkZvcmVDb2xvciA9IFN5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9ycy5IaWdobGlnaHRUZXh0OworICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlMy5XcmFwTW9kZSA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RyaVN0YXRlLlRydWU7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuQ29sdW1uSGVhZGVyc0RlZmF1bHRDZWxsU3R5bGUgPSBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzOworICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkNvbHVtbkhlYWRlcnNIZWlnaHRTaXplTW9kZSA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NvbHVtbkhlYWRlcnNIZWlnaHRTaXplTW9kZS5BdXRvU2l6ZTsKKyAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5Db2x1bW5zLkFkZFJhbmdlKG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdDb2x1bW5bXSB7CisgICAgICAgICAgICB0aGlzLkEsCisgICAgICAgICAgICB0aGlzLkIsCisgICAgICAgICAgICB0aGlzLkMsCisgICAgICAgICAgICB0aGlzLkQsCisgICAgICAgICAgICB0aGlzLkV9KTsKKyAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCg2LCA0Myk7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuTXVsdGlTZWxlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5OYW1lID0gImRhdGFHcmlkVmlld19XczEiOworICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlNC5BbGlnbm1lbnQgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdDb250ZW50QWxpZ25tZW50Lk1pZGRsZUxlZnQ7CisgICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGU0LkJhY2tDb2xvciA9IFN5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9ycy5Db250cm9sOworICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlNC5Gb250ID0gbmV3IFN5c3RlbS5EcmF3aW5nLkZvbnQoIlRpbWVzIE5ldyBSb21hbiIsIDEyRiwgU3lzdGVtLkRyYXdpbmcuRm9udFN0eWxlLlJlZ3VsYXIsIFN5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdC5Qb2ludCwgKChieXRlKSgwKSkpOworICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlNC5Gb3JlQ29sb3IgPSBTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnMuV2luZG93VGV4dDsKKyAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTQuU2VsZWN0aW9uQmFja0NvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLkhpZ2hsaWdodDsKKyAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTQuU2VsZWN0aW9uRm9yZUNvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLkhpZ2hsaWdodFRleHQ7CisgICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGU0LldyYXBNb2RlID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VHJpU3RhdGUuRmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuUm93SGVhZGVyc0RlZmF1bHRDZWxsU3R5bGUgPSBkYXRhR3JpZFZpZXdDZWxsU3R5bGU0OworICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLlNjcm9sbEJhcnMgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5TY3JvbGxCYXJzLk5vbmU7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuU2hvd0NlbGxFcnJvcnMgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5TaG93Q2VsbFRvb2xUaXBzID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuU2hvd0VkaXRpbmdJY29uID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuU2hvd1Jvd0Vycm9ycyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg1NjMsIDMxMSk7CisgICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuVGFiSW5kZXggPSAyOworICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkNlbGxCZWdpbkVkaXQgKz0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NlbGxDYW5jZWxFdmVudEhhbmRsZXIodGhpcy5kYXRhR3JpZFZpZXdfV3MxX0NlbGxCZWdpbkVkaXQpOworICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkNlbGxWYWxpZGF0aW5nICs9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdDZWxsVmFsaWRhdGluZ0V2ZW50SGFuZGxlcih0aGlzLmRhdGFHcmlkVmlld19XczFfQ2VsbFZhbGlkYXRpbmcpOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBFCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIHRoaXMuRS5IZWFkZXJUZXh0ID0gIkUiOworICAgICAgICAgICAgdGhpcy5FLk5hbWUgPSAiRSI7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIEQKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5ELkhlYWRlclRleHQgPSAiRCI7CisgICAgICAgICAgICB0aGlzLkQuTmFtZSA9ICJEIjsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gQworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLkMuSGVhZGVyVGV4dCA9ICJDIjsKKyAgICAgICAgICAgIHRoaXMuQy5OYW1lID0gIkMiOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBCCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIHRoaXMuQi5IZWFkZXJUZXh0ID0gIkIiOworICAgICAgICAgICAgdGhpcy5CLk5hbWUgPSAiQiI7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIEEKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy5BLkhlYWRlclRleHQgPSAiQSI7CisgICAgICAgICAgICB0aGlzLkEuTmFtZSA9ICJBIjsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gYnV0dG9uX0FwcGx5Rm9ybXVsYQorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9BcHBseUZvcm11bGEuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoNDU2LCAxNCk7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9BcHBseUZvcm11bGEuTmFtZSA9ICJidXR0b25fQXBwbHlGb3JtdWxhIjsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYS5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoNjQsIDIzKTsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYS5UYWJJbmRleCA9IDM7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9BcHBseUZvcm11bGEuVGV4dCA9ICJBcHBseSI7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbl9BcHBseUZvcm11bGEuVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5idXR0b25fQXBwbHlGb3JtdWxhLkNsaWNrICs9IG5ldyBTeXN0ZW0uRXZlbnRIYW5kbGVyKHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYV9DbGljayk7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIHRhYkNvbnRyb2xfV29ya3NoZWV0cworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5Db250cm9scy5BZGQodGhpcy50YWJQYWdlMSk7CisgICAgICAgICAgICB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMywgNjMpOworICAgICAgICAgICAgdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuTmFtZSA9ICJ0YWJDb250cm9sX1dvcmtzaGVldHMiOworICAgICAgICAgICAgdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuU2VsZWN0ZWRJbmRleCA9IDA7CisgICAgICAgICAgICB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5TaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoNTgzLCAzODYpOworICAgICAgICAgICAgdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuVGFiSW5kZXggPSAwOworICAgICAgICAgICAgLy8gCisgICAgICAgICAgICAvLyBidXR0b24xCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uMS5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCg0MTUsIDEyKTsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uMS5OYW1lID0gImJ1dHRvbjEiOworICAgICAgICAgICAgdGhpcy5idXR0b24xLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxNzEsIDIzKTsKKyAgICAgICAgICAgIHRoaXMuYnV0dG9uMS5UYWJJbmRleCA9IDI7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbjEuVGV4dCA9ICJWaWV3IEltcGxlbWVudGVkIEZ1bmN0aW9ucyI7CisgICAgICAgICAgICB0aGlzLmJ1dHRvbjEuVXNlVmlzdWFsU3R5bGVCYWNrQ29sb3IgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5idXR0b24xLkNsaWNrICs9IG5ldyBTeXN0ZW0uRXZlbnRIYW5kbGVyKHRoaXMuYnV0dG9uMV9DbGljayk7CisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIC8vIEV4Y2VsRm9ybQorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICB0aGlzLkF1dG9TY2FsZURpbWVuc2lvbnMgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZUYoNkYsIDEzRik7CisgICAgICAgICAgICB0aGlzLkF1dG9TY2FsZU1vZGUgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5BdXRvU2NhbGVNb2RlLkZvbnQ7CisgICAgICAgICAgICB0aGlzLkNsaWVudFNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg2MTAsIDQ1Nik7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmJ1dHRvbjEpOworICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy5idXR0b25fU2F2ZSk7CisgICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cyk7CisgICAgICAgICAgICB0aGlzLkZvcm1Cb3JkZXJTdHlsZSA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkZvcm1Cb3JkZXJTdHlsZS5GaXhlZDNEOworICAgICAgICAgICAgdGhpcy5NYXhpbWl6ZUJveCA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5NaW5pbWl6ZUJveCA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5OYW1lID0gIkV4Y2VsRm9ybSI7CisgICAgICAgICAgICB0aGlzLlRleHQgPSAiRVBQbHVzIEV4Y2VsIGRlbW8iOworICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5SZXN1bWVMYXlvdXQoZmFsc2UpOworICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5QZXJmb3JtTGF5b3V0KCk7CisgICAgICAgICAgICAoKFN5c3RlbS5Db21wb25lbnRNb2RlbC5JU3VwcG9ydEluaXRpYWxpemUpKHRoaXMuZGF0YUdyaWRWaWV3X1dzMSkpLkVuZEluaXQoKTsKKyAgICAgICAgICAgIHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzLlJlc3VtZUxheW91dChmYWxzZSk7CisgICAgICAgICAgICB0aGlzLlJlc3VtZUxheW91dChmYWxzZSk7CisKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbiBidXR0b25fU2F2ZTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5TYXZlRmlsZURpYWxvZyBzYXZlRmlsZURpYWxvZ19TYXZlRXhjZWw7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuVGFiUGFnZSB0YWJQYWdlMTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24gYnV0dG9uX0FwcGx5Rm9ybXVsYTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXcgZGF0YUdyaWRWaWV3X1dzMTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uIEE7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbiBCOworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RleHRCb3hDb2x1bW4gQzsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uIEQ7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbiBFOworICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxhYmVsIGxhYmVsMTsKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0Qm94IHRleHRCb3hfZng7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuVGFiQ29udHJvbCB0YWJDb250cm9sX1dvcmtzaGVldHM7CisgICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uIGJ1dHRvbjE7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0V4Y2VsRm9ybS5jcyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRXhjZWxGb3JtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMGNkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0V4Y2VsRm9ybS5jcwpAQCAtMCwwICsxLDI0NSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uQ29tcG9uZW50TW9kZWw7Cit1c2luZyBTeXN0ZW0uRGF0YTsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c0V4Y2VsRm9ybURlbW8KK3sKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBFeGNlbEZvcm0gOiBGb3JtCisgICAgeworICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKKyAgICAgICAgcHJpdmF0ZSBEYXRhR3JpZFZpZXdDZWxsIF9jdXJyZW50Q2VsbDsKKyAgICAgICAgcHJpdmF0ZSBGb250IF9pbmFjdGl2ZUNlbGxGb250OworICAgICAgICBwcml2YXRlIEZvbnQgX2FjdGl2ZUNlbGxGb250OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBOdW1iZXJPZkNvbHVtbnMgPSA1OworCisgICAgICAgIHB1YmxpYyBFeGNlbEZvcm0oKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0aWFsaXplQ29tcG9uZW50KCk7CisgICAgICAgICAgICBJbml0aWFsaXplUGFja2FnZSgpOworICAgICAgICAgICAgSW5pdFBhY2thZ2VUb1VJKCk7CisgICAgICAgICAgICB0aGlzLkNsb3NpbmcgKz0gKHNlbmRlciwgYXJncykgPT4gX3BhY2thZ2UuRGlzcG9zZSgpOworICAgICAgICAgICAgZGF0YUdyaWRWaWV3X1dzMS5Sb3dIZWFkZXJzV2lkdGggPSA1MDsKKyAgICAgICAgICAgIGRhdGFHcmlkVmlld19XczEuU2VsZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZVBhY2thZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKTsKKyAgICAgICAgICAgIHZhciB3czEgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiV29ya3NoZWV0MSIpOworICAgICAgICAgICAgZm9yICh2YXIgY29sID0gMjsgY29sIDwgTnVtYmVyT2ZDb2x1bW5zOyBjb2wrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciByb3cgPSAxOyByb3cgPCA5OyByb3crKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdzMS5DZWxsc1tyb3csIGNvbF0uVmFsdWUgPSByb3cqY29sOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdzMS5DZWxsc1s3LCAxXS5WYWx1ZSA9ICJTVU0iOworICAgICAgICAgICAgd3MxLkNlbGxzWzcsIDJdLkZvcm11bGEgPSAiU1VNKEIxOkI2KSI7CisgICAgICAgICAgICB3czEuQ2VsbHNbNywgM10uRm9ybXVsYSA9ICJTVU0oQzE6QzYpIjsKKyAgICAgICAgICAgIHdzMS5DZWxsc1s3LCA0XS5Gb3JtdWxhID0gIlNVTShEMTpENikiOworCisgICAgICAgICAgICB3czEuQ2VsbHNbOCwgMV0uVmFsdWUgPSAiU1RERVYiOworICAgICAgICAgICAgd3MxLkNlbGxzWzgsIDJdLkZvcm11bGEgPSAiU1RERVYoQjE6QjYpIjsKKyAgICAgICAgICAgIHdzMS5DZWxsc1s4LCAzXS5Gb3JtdWxhID0gIlNUREVWKEMxOkM2KSI7CisgICAgICAgICAgICB3czEuQ2VsbHNbOCwgNF0uRm9ybXVsYSA9ICJTVERFVihEMTpENikiOworICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdEZvbnRzKERhdGFHcmlkVmlldyBncmlkVmlldykKKyAgICAgICAgeworICAgICAgICAgICAgX2FjdGl2ZUNlbGxGb250ID0gbmV3IEZvbnQoZ3JpZFZpZXcuRm9udCwgRm9udFN0eWxlLkJvbGQpOworICAgICAgICAgICAgX2luYWN0aXZlQ2VsbEZvbnQgPSBncmlkVmlldy5Gb250OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRFdmVudHMoRGF0YUdyaWRWaWV3IGdyaWRWaWV3KQorICAgICAgICB7CisgICAgICAgICAgICBncmlkVmlldy5DZWxsRW50ZXIgKz0gRGF0YUdyaWQxT25DZWxsRW50ZXI7CisgICAgICAgICAgICBncmlkVmlldy5DZWxsTGVhdmUgKz0gRGF0YUdyaWQxT25DZWxsTGVhdmU7IAorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQmluZHMgdGhlIEVQUGx1cyBwYWNrYWdlIChvciBhY3R1YWxseSBvbmx5IGl0cyBmaXJzdCB3b3Jrc2hlZXQpCisgICAgICAgIC8vLyB0byB0aGUgRGF0YUdyaWRWaWV3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFBhY2thZ2VUb1VJKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgICAgICAgICAgdmFyIHBhZ2UxID0gdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuQ29udHJvbHNbMF0gYXMgVGFiUGFnZTsKKyAgICAgICAgICAgIHBhZ2UxLlRleHQgPSB3cy5OYW1lOworICAgICAgICAgICAgdmFyIGdyaWRWaWV3ID0gR2V0R3JpZCgpOworICAgICAgICAgICAgSW5pdEZvbnRzKGdyaWRWaWV3KTsKKyAgICAgICAgICAgIEluaXRFdmVudHMoZ3JpZFZpZXcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCB3cy5EaW1lbnNpb24uUm93czsgcm93KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGdyaWRSb3cgPSBuZXcgRGF0YUdyaWRWaWV3Um93IHtIZWFkZXJDZWxsID0ge1ZhbHVlID0gKHJvdyArIDEpLlRvU3RyaW5nKCl9fTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBOdW1iZXJPZkNvbHVtbnM7IGNvbCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwgPSB3cy5DZWxsc1tyb3cgKyAxLCBjb2wgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuVmFsdWUhPW51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgdWlDZWxsID0gbmV3IERhdGFHcmlkVmlld1RleHRCb3hDZWxsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDZWxsLlZhbHVlID0gY2VsbC5WYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkUm93LkNlbGxzLkFkZCh1aUNlbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdyaWRWaWV3LlJvd3MuQWRkKGdyaWRSb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3JpZFZpZXcuUmVmcmVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEJpbmRQYWNrYWdlVG9VSSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRhR3JpZDEgPSBHZXRHcmlkKCk7CisgICAgICAgICAgICBmb3IgKHZhciByb3cgPSAxOyByb3cgPCBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuRGltZW5zaW9uLlJvd3MgKyAxOyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAxOyBjb2wgPD0gTnVtYmVyT2ZDb2x1bW5zOyBjb2wrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBleGNlbENlbGwgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbcm93LCBjb2xdOworICAgICAgICAgICAgICAgICAgICB2YXIgZ3JpZFZpZXdDZWxsID0gZGF0YUdyaWQxLlJvd3Nbcm93IC0gMV0uQ2VsbHNbY29sIC0gMV07CisgICAgICAgICAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5WYWx1ZSA9IGV4Y2VsQ2VsbC5WYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhR3JpZDEuUmVmcmVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgQ2VsbFZhbHVlVG9PYmplY3Qoc3RyaW5nIGNlbGxWYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcoY2VsbFZhbCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShjZWxsVmFsLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjZWxsVmFsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERhdGFHcmlkMU9uQ2VsbExlYXZlKG9iamVjdCBzZW5kZXIsIERhdGFHcmlkVmlld0NlbGxFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGFHcmlkMSA9IEdldEdyaWQoKTsKKyAgICAgICAgICAgIHZhciBncmlkVmlld0NlbGwgPSBkYXRhR3JpZDEuUm93c1tlLlJvd0luZGV4XS5DZWxsc1tlLkNvbHVtbkluZGV4XTsKKyAgICAgICAgICAgIHZhciBleGNlbENlbGwgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbZS5Sb3dJbmRleCArIDEsIGUuQ29sdW1uSW5kZXggKyAxXTsKKyAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5TdHlsZS5Gb3JlQ29sb3IgPSBDb2xvci5CbGFjazsKKyAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5TdHlsZS5CYWNrQ29sb3IgPSBDb2xvci5XaGl0ZTsKKyAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5TdHlsZS5Gb250ID0gX2luYWN0aXZlQ2VsbEZvbnQ7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgRGF0YUdyaWRWaWV3IEdldEdyaWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFnZTEgPSB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5Db250cm9sc1swXSBhcyBUYWJQYWdlOworICAgICAgICAgICAgdmFyIGRhdGFHcmlkMSA9IHBhZ2UxLkNvbnRyb2xzWyJkYXRhR3JpZFZpZXdfV3MxIl0gYXMgRGF0YUdyaWRWaWV3OworICAgICAgICAgICAgcmV0dXJuIGRhdGFHcmlkMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEYXRhR3JpZDFPbkNlbGxFbnRlcihvYmplY3Qgc2VuZGVyLCBEYXRhR3JpZFZpZXdDZWxsRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRhR3JpZDEgPSBHZXRHcmlkKCk7CisgICAgICAgICAgICBkYXRhR3JpZDEuUmVmcmVzaCgpOworICAgICAgICAgICAgQmluZFBhY2thZ2VUb1VJKCk7CisgICAgICAgICAgICB2YXIgY2VsbCA9IGRhdGFHcmlkMS5Sb3dzW2UuUm93SW5kZXhdLkNlbGxzW2UuQ29sdW1uSW5kZXhdOworICAgICAgICAgICAgdmFyIGV4Y2VsQ2VsbCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tlLlJvd0luZGV4ICsgMSwgZS5Db2x1bW5JbmRleCArIDFdOworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleGNlbENlbGwuRm9ybXVsYSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dEJveF9meC5UZXh0ID0gIj0iICsgZXhjZWxDZWxsLkZvcm11bGE7CisgICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9ICI9IiArIGV4Y2VsQ2VsbC5Gb3JtdWxhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihleGNlbENlbGwuVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXh0Qm94X2Z4LlRleHQgPSBleGNlbENlbGwuVmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNlbGwuU3R5bGUuRm9yZUNvbG9yID0gQ29sb3IuQmx1ZTsKKyAgICAgICAgICAgIGNlbGwuU3R5bGUuQmFja0NvbG9yID0gQ29sb3IuR2FpbnNib3JvOworICAgICAgICAgICAgY2VsbC5TdHlsZS5Gb250ID0gX2FjdGl2ZUNlbGxGb250OworICAgICAgICAgICAgX2N1cnJlbnRDZWxsID0gY2VsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBidXR0b25fU2F2ZV9DbGljayhvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZUZpbGVEaWFsb2dfU2F2ZUV4Y2VsLkZpbHRlciA9ICJFeGNlbCBmaWxlcyAoKi54bHN4KXwqLnhsc3giOworICAgICAgICAgICAgdmFyIGRpYWxvZ1Jlc3VsdCA9IHNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbC5TaG93RGlhbG9nKCk7CisgICAgICAgICAgICBpZiAoZGlhbG9nUmVzdWx0ID09IERpYWxvZ1Jlc3VsdC5PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKHNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbC5GaWxlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGJ1dHRvbl9BcHBseUZvcm11bGFfQ2xpY2sob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByb3cgPSBfY3VycmVudENlbGwuUm93SW5kZXg7CisgICAgICAgICAgICB2YXIgY29sID0gX2N1cnJlbnRDZWxsLkNvbHVtbkluZGV4OworICAgICAgICAgICAgdmFyIHR4dCA9IHRleHRCb3hfZnguVGV4dDsKKyAgICAgICAgICAgIGlmICh0eHQuU3RhcnRzV2l0aCgiPSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tyb3cgKyAxLCBjb2wgKyAxXS5Gb3JtdWxhID0gdHh0LlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbcm93ICsgMSwgY29sICsgMV0uRm9ybXVsYSA9IG51bGw7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpLkNlbGxzW3JvdyArIDEsIGNvbCArIDFdLlZhbHVlID0gQ2VsbFZhbHVlVG9PYmplY3QodHh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlQm94LlNob3coZXguTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCaW5kUGFja2FnZVRvVUkoKTsKKyAgICAgICAgICAgIHRoaXMuUmVmcmVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRhdGFHcmlkVmlld19XczFfQ2VsbEJlZ2luRWRpdChvYmplY3Qgc2VuZGVyLCBEYXRhR3JpZFZpZXdDZWxsQ2FuY2VsRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRhR3JpZDEgPSBHZXRHcmlkKCk7CisgICAgICAgICAgICB2YXIgY2VsbCA9IGRhdGFHcmlkMS5Sb3dzW2UuUm93SW5kZXhdLkNlbGxzW2UuQ29sdW1uSW5kZXhdOworICAgICAgICAgICAgdmFyIGV4Y2VsQ2VsbCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tlLlJvd0luZGV4ICsgMSwgZS5Db2x1bW5JbmRleCArIDFdOworICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleGNlbENlbGwuRm9ybXVsYSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9ICI9IiArIGV4Y2VsQ2VsbC5Gb3JtdWxhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YUdyaWQxLlJlZnJlc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkYXRhR3JpZFZpZXdfV3MxX0NlbGxWYWxpZGF0aW5nKG9iamVjdCBzZW5kZXIsIERhdGFHcmlkVmlld0NlbGxWYWxpZGF0aW5nRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmID0gZS5Gb3JtYXR0ZWRWYWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgaWYgKGYuU3RhcnRzV2l0aCgiPSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tlLlJvd0luZGV4ICsgMSwgZS5Db2x1bW5JbmRleCArIDFdLkZvcm11bGEgPSBmLlN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbZS5Sb3dJbmRleCArIDEsIGUuQ29sdW1uSW5kZXggKyAxXS5Gb3JtdWxhID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbZS5Sb3dJbmRleCArIDEsIGUuQ29sdW1uSW5kZXggKyAxXS5WYWx1ZSA9IENlbGxWYWx1ZVRvT2JqZWN0KGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3guU2hvdyhleC5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJpbmRQYWNrYWdlVG9VSSgpOworICAgICAgICAgICAgdGhpcy5SZWZyZXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYnV0dG9uMV9DbGljayhvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZybSA9IG5ldyBmcm1GdW5jdGlvbnMoX3BhY2thZ2UuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuR2V0SW1wbGVtZW50ZWRGdW5jdGlvbk5hbWVzKCkuVG9MaXN0KCkpOworICAgICAgICAgICAgZnJtLlNob3dEaWFsb2codGhpcyk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRXhjZWxGb3JtLnJlc3ggYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0V4Y2VsRm9ybS5yZXN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjRhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0V4Y2VsRm9ybS5yZXN4CkBAIC0wLDAgKzEsMTM4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJvb3Q+CisgIDwhLS0gCisgICAgTWljcm9zb2Z0IFJlc1ggU2NoZW1hIAorICAgIAorICAgIFZlcnNpb24gMi4wCisgICAgCisgICAgVGhlIHByaW1hcnkgZ29hbHMgb2YgdGhpcyBmb3JtYXQgaXMgdG8gYWxsb3cgYSBzaW1wbGUgWE1MIGZvcm1hdCAKKyAgICB0aGF0IGlzIG1vc3RseSBodW1hbiByZWFkYWJsZS4gVGhlIGdlbmVyYXRpb24gYW5kIHBhcnNpbmcgb2YgdGhlIAorICAgIHZhcmlvdXMgZGF0YSB0eXBlcyBhcmUgZG9uZSB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGNsYXNzZXMgCisgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHR5cGVzLgorICAgIAorICAgIEV4YW1wbGU6CisgICAgCisgICAgLi4uIGFkby5uZXQvWE1MIGhlYWRlcnMgJiBzY2hlbWEgLi4uCisgICAgPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+dGV4dC9taWNyb3NvZnQtcmVzeDwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+Mi4wPC9yZXNoZWFkZXI+CisgICAgPHJlc2hlYWRlciBuYW1lPSJyZWFkZXIiPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgLi4uPC9yZXNoZWFkZXI+CisgICAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgLi4uPC9yZXNoZWFkZXI+CisgICAgPGRhdGEgbmFtZT0iTmFtZTEiPjx2YWx1ZT50aGlzIGlzIG15IGxvbmcgc3RyaW5nPC92YWx1ZT48Y29tbWVudD50aGlzIGlzIGEgY29tbWVudDwvY29tbWVudD48L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iQ29sb3IxIiB0eXBlPSJTeXN0ZW0uRHJhd2luZy5Db2xvciwgU3lzdGVtLkRyYXdpbmciPkJsdWU8L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iQml0bWFwMSIgbWltZXR5cGU9ImFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCI+CisgICAgICAgIDx2YWx1ZT5bYmFzZTY0IG1pbWUgZW5jb2RlZCBzZXJpYWxpemVkIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgorICAgIDwvZGF0YT4KKyAgICA8ZGF0YSBuYW1lPSJJY29uMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuSWNvbiwgU3lzdGVtLkRyYXdpbmciIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQiPgorICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGluZyBhIGJ5dGUgYXJyYXkgZm9ybSBvZiB0aGUgLk5FVCBGcmFtZXdvcmsgb2JqZWN0XTwvdmFsdWU+CisgICAgICAgIDxjb21tZW50PlRoaXMgaXMgYSBjb21tZW50PC9jb21tZW50PgorICAgIDwvZGF0YT4KKyAgICAgICAgICAgICAgICAKKyAgICBUaGVyZSBhcmUgYW55IG51bWJlciBvZiAicmVzaGVhZGVyIiByb3dzIHRoYXQgY29udGFpbiBzaW1wbGUgCisgICAgbmFtZS92YWx1ZSBwYWlycy4KKyAgICAKKyAgICBFYWNoIGRhdGEgcm93IGNvbnRhaW5zIGEgbmFtZSwgYW5kIHZhbHVlLiBUaGUgcm93IGFsc28gY29udGFpbnMgYSAKKyAgICB0eXBlIG9yIG1pbWV0eXBlLiBUeXBlIGNvcnJlc3BvbmRzIHRvIGEgLk5FVCBjbGFzcyB0aGF0IHN1cHBvcnQgCisgICAgdGV4dC92YWx1ZSBjb252ZXJzaW9uIHRocm91Z2ggdGhlIFR5cGVDb252ZXJ0ZXIgYXJjaGl0ZWN0dXJlLiAKKyAgICBDbGFzc2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGlzIGFyZSBzZXJpYWxpemVkIGFuZCBzdG9yZWQgd2l0aCB0aGUgCisgICAgbWltZXR5cGUgc2V0LgorICAgIAorICAgIFRoZSBtaW1ldHlwZSBpcyB1c2VkIGZvciBzZXJpYWxpemVkIG9iamVjdHMsIGFuZCB0ZWxscyB0aGUgCisgICAgUmVzWFJlc291cmNlUmVhZGVyIGhvdyB0byBkZXBlcnNpc3QgdGhlIG9iamVjdC4gVGhpcyBpcyBjdXJyZW50bHkgbm90IAorICAgIGV4dGVuc2libGUuIEZvciBhIGdpdmVuIG1pbWV0eXBlIHRoZSB2YWx1ZSBtdXN0IGJlIHNldCBhY2NvcmRpbmdseToKKyAgICAKKyAgICBOb3RlIC0gYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0IGlzIHRoZSBmb3JtYXQgCisgICAgdGhhdCB0aGUgUmVzWFJlc291cmNlV3JpdGVyIHdpbGwgZ2VuZXJhdGUsIGhvd2V2ZXIgdGhlIHJlYWRlciBjYW4gCisgICAgcmVhZCBhbnkgb2YgdGhlIGZvcm1hdHMgbGlzdGVkIGJlbG93LgorICAgIAorICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQKKyAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKKyAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLkJpbmFyeS5CaW5hcnlGb3JtYXR0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKyAgICAKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5zb2FwLmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIAorICAgICAgICAgICAgOiBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuU29hcC5Tb2FwRm9ybWF0dGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIGludG8gYSBieXRlIGFycmF5IAorICAgICAgICAgICAgOiB1c2luZyBhIFN5c3RlbS5Db21wb25lbnRNb2RlbC5UeXBlQ29udmVydGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisgICAgLS0+CisgIDx4c2Q6c2NoZW1hIGlkPSJyb290IiB4bWxucz0iIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSI+CisgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC8+CisgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiPgorICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRhZGF0YSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZW1ibHkiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIyIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgbXNkYXRhOk9yZGluYWw9IjEiIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSIzIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbXNkYXRhOk9yZGluYWw9IjQiIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzaGVhZGVyIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDwveHNkOmVsZW1lbnQ+CisgIDwveHNkOnNjaGVtYT4KKyAgPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+CisgICAgPHZhbHVlPnRleHQvbWljcm9zb2Z0LXJlc3g8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4KKyAgICA8dmFsdWU+Mi4wPC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj4KKyAgICA8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9IndyaXRlciI+CisgICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPG1ldGFkYXRhIG5hbWU9InNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbC5UcmF5TG9jYXRpb24iIHR5cGU9IlN5c3RlbS5EcmF3aW5nLlBvaW50LCBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiPgorICAgIDx2YWx1ZT4xNywgMTc8L3ZhbHVlPgorICA8L21ldGFkYXRhPgorICA8bWV0YWRhdGEgbmFtZT0iQS5Vc2VyQWRkZWRDb2x1bW4iIHR5cGU9IlN5c3RlbS5Cb29sZWFuLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkiPgorICAgIDx2YWx1ZT5UcnVlPC92YWx1ZT4KKyAgPC9tZXRhZGF0YT4KKyAgPG1ldGFkYXRhIG5hbWU9IkIuVXNlckFkZGVkQ29sdW1uIiB0eXBlPSJTeXN0ZW0uQm9vbGVhbiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Ij4KKyAgICA8dmFsdWU+VHJ1ZTwvdmFsdWU+CisgIDwvbWV0YWRhdGE+CisgIDxtZXRhZGF0YSBuYW1lPSJDLlVzZXJBZGRlZENvbHVtbiIgdHlwZT0iU3lzdGVtLkJvb2xlYW4sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSI+CisgICAgPHZhbHVlPlRydWU8L3ZhbHVlPgorICA8L21ldGFkYXRhPgorICA8bWV0YWRhdGEgbmFtZT0iRC5Vc2VyQWRkZWRDb2x1bW4iIHR5cGU9IlN5c3RlbS5Cb29sZWFuLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkiPgorICAgIDx2YWx1ZT5UcnVlPC92YWx1ZT4KKyAgPC9tZXRhZGF0YT4KKyAgPG1ldGFkYXRhIG5hbWU9IkUuVXNlckFkZGVkQ29sdW1uIiB0eXBlPSJTeXN0ZW0uQm9vbGVhbiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Ij4KKyAgICA8dmFsdWU+VHJ1ZTwvdmFsdWU+CisgIDwvbWV0YWRhdGE+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9GdW5jdGlvbnMuRGVzaWduZXIuY3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0Z1bmN0aW9ucy5EZXNpZ25lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ0OGNlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9GdW5jdGlvbnMuRGVzaWduZXIuY3MKQEAgLTAsMCArMSw2MiBAQAor77u/bmFtZXNwYWNlIEVQUGx1c0V4Y2VsRm9ybURlbW8KK3sKKyAgICBwYXJ0aWFsIGNsYXNzIGZybUZ1bmN0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVxdWlyZWQgZGVzaWduZXIgdmFyaWFibGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgU3lzdGVtLkNvbXBvbmVudE1vZGVsLklDb250YWluZXIgY29tcG9uZW50cyA9IG51bGw7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2xlYW4gdXAgYW55IHJlc291cmNlcyBiZWluZyB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpc3Bvc2luZyI+dHJ1ZSBpZiBtYW5hZ2VkIHJlc291cmNlcyBzaG91bGQgYmUgZGlzcG9zZWQ7IG90aGVyd2lzZSwgZmFsc2UuPC9wYXJhbT4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpc3Bvc2luZyAmJiAoY29tcG9uZW50cyAhPSBudWxsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBXaW5kb3dzIEZvcm0gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXF1aXJlZCBtZXRob2QgZm9yIERlc2lnbmVyIHN1cHBvcnQgLSBkbyBub3QgbW9kaWZ5CisgICAgICAgIC8vLyB0aGUgY29udGVudHMgb2YgdGhpcyBtZXRob2Qgd2l0aCB0aGUgY29kZSBlZGl0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0aWFsaXplQ29tcG9uZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50ZXh0Qm94MSA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0Qm94KCk7CisgICAgICAgICAgICB0aGlzLlN1c3BlbmRMYXlvdXQoKTsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gdGV4dEJveDEKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgdGhpcy50ZXh0Qm94MS5Eb2NrID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRG9ja1N0eWxlLkZpbGw7CisgICAgICAgICAgICB0aGlzLnRleHRCb3gxLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDAsIDApOworICAgICAgICAgICAgdGhpcy50ZXh0Qm94MS5NdWx0aWxpbmUgPSB0cnVlOworICAgICAgICAgICAgdGhpcy50ZXh0Qm94MS5OYW1lID0gInRleHRCb3gxIjsKKyAgICAgICAgICAgIHRoaXMudGV4dEJveDEuU2Nyb2xsQmFycyA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlNjcm9sbEJhcnMuVmVydGljYWw7CisgICAgICAgICAgICB0aGlzLnRleHRCb3gxLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg2MDYsIDY3OSk7CisgICAgICAgICAgICB0aGlzLnRleHRCb3gxLlRhYkluZGV4ID0gMDsKKyAgICAgICAgICAgIC8vIAorICAgICAgICAgICAgLy8gZnJtRnVuY3Rpb25zCisgICAgICAgICAgICAvLyAKKyAgICAgICAgICAgIHRoaXMuQXV0b1NjYWxlRGltZW5zaW9ucyA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplRig2RiwgMTNGKTsKKyAgICAgICAgICAgIHRoaXMuQXV0b1NjYWxlTW9kZSA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkF1dG9TY2FsZU1vZGUuRm9udDsKKyAgICAgICAgICAgIHRoaXMuQ2xpZW50U2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDYwNiwgNjc5KTsKKyAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMudGV4dEJveDEpOworICAgICAgICAgICAgdGhpcy5OYW1lID0gImZybUZ1bmN0aW9ucyI7CisgICAgICAgICAgICB0aGlzLlRleHQgPSAiRnVuY3Rpb25zIjsKKyAgICAgICAgICAgIHRoaXMuUmVzdW1lTGF5b3V0KGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMuUGVyZm9ybUxheW91dCgpOworCisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UZXh0Qm94IHRleHRCb3gxOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRnVuY3Rpb25zLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9GdW5jdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNGU1NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRnVuY3Rpb25zLmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOwordXNpbmcgU3lzdGVtLkRhdGE7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7CisKK25hbWVzcGFjZSBFUFBsdXNFeGNlbEZvcm1EZW1vCit7CisgICAgcHVibGljIHBhcnRpYWwgY2xhc3MgZnJtRnVuY3Rpb25zIDogRm9ybQorICAgIHsKKyAgICAgICAgcHVibGljIGZybUZ1bmN0aW9ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgZnJtRnVuY3Rpb25zKExpc3Q8c3RyaW5nPiBmdW5jdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsKKworICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmIGluIGZ1bmN0aW9ucykKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2IuQXBwZW5kTGluZShmLlRvVXBwZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZXh0Qm94MS5UZXh0ID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRnVuY3Rpb25zLnJlc3ggYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0Z1bmN0aW9ucy5yZXN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjdkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0Z1bmN0aW9ucy5yZXN4CkBAIC0wLDAgKzEsMTIwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJvb3Q+CisgIDwhLS0gCisgICAgTWljcm9zb2Z0IFJlc1ggU2NoZW1hIAorICAgIAorICAgIFZlcnNpb24gMi4wCisgICAgCisgICAgVGhlIHByaW1hcnkgZ29hbHMgb2YgdGhpcyBmb3JtYXQgaXMgdG8gYWxsb3cgYSBzaW1wbGUgWE1MIGZvcm1hdCAKKyAgICB0aGF0IGlzIG1vc3RseSBodW1hbiByZWFkYWJsZS4gVGhlIGdlbmVyYXRpb24gYW5kIHBhcnNpbmcgb2YgdGhlIAorICAgIHZhcmlvdXMgZGF0YSB0eXBlcyBhcmUgZG9uZSB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGNsYXNzZXMgCisgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHR5cGVzLgorICAgIAorICAgIEV4YW1wbGU6CisgICAgCisgICAgLi4uIGFkby5uZXQvWE1MIGhlYWRlcnMgJiBzY2hlbWEgLi4uCisgICAgPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+dGV4dC9taWNyb3NvZnQtcmVzeDwvcmVzaGVhZGVyPgorICAgIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+Mi4wPC9yZXNoZWFkZXI+CisgICAgPHJlc2hlYWRlciBuYW1lPSJyZWFkZXIiPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgLi4uPC9yZXNoZWFkZXI+CisgICAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgLi4uPC9yZXNoZWFkZXI+CisgICAgPGRhdGEgbmFtZT0iTmFtZTEiPjx2YWx1ZT50aGlzIGlzIG15IGxvbmcgc3RyaW5nPC92YWx1ZT48Y29tbWVudD50aGlzIGlzIGEgY29tbWVudDwvY29tbWVudD48L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iQ29sb3IxIiB0eXBlPSJTeXN0ZW0uRHJhd2luZy5Db2xvciwgU3lzdGVtLkRyYXdpbmciPkJsdWU8L2RhdGE+CisgICAgPGRhdGEgbmFtZT0iQml0bWFwMSIgbWltZXR5cGU9ImFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCI+CisgICAgICAgIDx2YWx1ZT5bYmFzZTY0IG1pbWUgZW5jb2RlZCBzZXJpYWxpemVkIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgorICAgIDwvZGF0YT4KKyAgICA8ZGF0YSBuYW1lPSJJY29uMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuSWNvbiwgU3lzdGVtLkRyYXdpbmciIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQiPgorICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGluZyBhIGJ5dGUgYXJyYXkgZm9ybSBvZiB0aGUgLk5FVCBGcmFtZXdvcmsgb2JqZWN0XTwvdmFsdWU+CisgICAgICAgIDxjb21tZW50PlRoaXMgaXMgYSBjb21tZW50PC9jb21tZW50PgorICAgIDwvZGF0YT4KKyAgICAgICAgICAgICAgICAKKyAgICBUaGVyZSBhcmUgYW55IG51bWJlciBvZiAicmVzaGVhZGVyIiByb3dzIHRoYXQgY29udGFpbiBzaW1wbGUgCisgICAgbmFtZS92YWx1ZSBwYWlycy4KKyAgICAKKyAgICBFYWNoIGRhdGEgcm93IGNvbnRhaW5zIGEgbmFtZSwgYW5kIHZhbHVlLiBUaGUgcm93IGFsc28gY29udGFpbnMgYSAKKyAgICB0eXBlIG9yIG1pbWV0eXBlLiBUeXBlIGNvcnJlc3BvbmRzIHRvIGEgLk5FVCBjbGFzcyB0aGF0IHN1cHBvcnQgCisgICAgdGV4dC92YWx1ZSBjb252ZXJzaW9uIHRocm91Z2ggdGhlIFR5cGVDb252ZXJ0ZXIgYXJjaGl0ZWN0dXJlLiAKKyAgICBDbGFzc2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGlzIGFyZSBzZXJpYWxpemVkIGFuZCBzdG9yZWQgd2l0aCB0aGUgCisgICAgbWltZXR5cGUgc2V0LgorICAgIAorICAgIFRoZSBtaW1ldHlwZSBpcyB1c2VkIGZvciBzZXJpYWxpemVkIG9iamVjdHMsIGFuZCB0ZWxscyB0aGUgCisgICAgUmVzWFJlc291cmNlUmVhZGVyIGhvdyB0byBkZXBlcnNpc3QgdGhlIG9iamVjdC4gVGhpcyBpcyBjdXJyZW50bHkgbm90IAorICAgIGV4dGVuc2libGUuIEZvciBhIGdpdmVuIG1pbWV0eXBlIHRoZSB2YWx1ZSBtdXN0IGJlIHNldCBhY2NvcmRpbmdseToKKyAgICAKKyAgICBOb3RlIC0gYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0IGlzIHRoZSBmb3JtYXQgCisgICAgdGhhdCB0aGUgUmVzWFJlc291cmNlV3JpdGVyIHdpbGwgZ2VuZXJhdGUsIGhvd2V2ZXIgdGhlIHJlYWRlciBjYW4gCisgICAgcmVhZCBhbnkgb2YgdGhlIGZvcm1hdHMgbGlzdGVkIGJlbG93LgorICAgIAorICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQKKyAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKKyAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLkJpbmFyeS5CaW5hcnlGb3JtYXR0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKyAgICAKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5zb2FwLmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIAorICAgICAgICAgICAgOiBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuU29hcC5Tb2FwRm9ybWF0dGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIGludG8gYSBieXRlIGFycmF5IAorICAgICAgICAgICAgOiB1c2luZyBhIFN5c3RlbS5Db21wb25lbnRNb2RlbC5UeXBlQ29udmVydGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisgICAgLS0+CisgIDx4c2Q6c2NoZW1hIGlkPSJyb290IiB4bWxucz0iIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSI+CisgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC8+CisgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiPgorICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRhZGF0YSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZW1ibHkiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIyIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgbXNkYXRhOk9yZGluYWw9IjEiIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSIzIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbXNkYXRhOk9yZGluYWw9IjQiIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzaGVhZGVyIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDwveHNkOmVsZW1lbnQ+CisgIDwveHNkOnNjaGVtYT4KKyAgPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+CisgICAgPHZhbHVlPnRleHQvbWljcm9zb2Z0LXJlc3g8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4KKyAgICA8dmFsdWU+Mi4wPC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj4KKyAgICA8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9IndyaXRlciI+CisgICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKzwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb2dyYW0uY3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDIyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOworCituYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtbworeworICAgIHN0YXRpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbU1RBVGhyZWFkXQorICAgICAgICBzdGF0aWMgdm9pZCBNYWluKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXBwbGljYXRpb24uRW5hYmxlVmlzdWFsU3R5bGVzKCk7CisgICAgICAgICAgICBBcHBsaWNhdGlvbi5TZXRDb21wYXRpYmxlVGV4dFJlbmRlcmluZ0RlZmF1bHQoZmFsc2UpOworICAgICAgICAgICAgQXBwbGljYXRpb24uUnVuKG5ldyBFeGNlbEZvcm0oKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDU5NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDM2IEBACivvu791c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFUFBsdXNFeGNlbEZvcm1EZW1vIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkVQUGx1c0V4Y2VsRm9ybURlbW8iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAxNCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMWRlMjU0NDgtZmVjYi00OTNkLWFkOGQtZDAzZTY4NTNjZWU1IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIAorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9SZXNvdXJjZXMuRGVzaWduZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlM2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9SZXNvdXJjZXMuRGVzaWduZXIuY3MKQEAgLTAsMCArMSw3MSBAQAor77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDxhdXRvLWdlbmVyYXRlZD4KKy8vICAgICBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBhIHRvb2wuCisvLyAgICAgUnVudGltZSBWZXJzaW9uOjQuMC4zMDMxOS4xODQwOAorLy8KKy8vICAgICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYKKy8vICAgICB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC4KKy8vIDwvYXV0by1nZW5lcmF0ZWQ+CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtby5Qcm9wZXJ0aWVzCit7CisKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICBBIHN0cm9uZ2x5LXR5cGVkIHJlc291cmNlIGNsYXNzLCBmb3IgbG9va2luZyB1cCBsb2NhbGl6ZWQgc3RyaW5ncywgZXRjLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gVGhpcyBjbGFzcyB3YXMgYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFN0cm9uZ2x5VHlwZWRSZXNvdXJjZUJ1aWxkZXIKKyAgICAvLyBjbGFzcyB2aWEgYSB0b29sIGxpa2UgUmVzR2VuIG9yIFZpc3VhbCBTdHVkaW8uCisgICAgLy8gVG8gYWRkIG9yIHJlbW92ZSBhIG1lbWJlciwgZWRpdCB5b3VyIC5SZXNYIGZpbGUgdGhlbiByZXJ1biBSZXNHZW4KKyAgICAvLyB3aXRoIHRoZSAvc3RyIG9wdGlvbiwgb3IgcmVidWlsZCB5b3VyIFZTIHByb2plY3QuCisgICAgW2dsb2JhbDo6U3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuR2VuZXJhdGVkQ29kZUF0dHJpYnV0ZSgiU3lzdGVtLlJlc291cmNlcy5Ub29scy5TdHJvbmdseVR5cGVkUmVzb3VyY2VCdWlsZGVyIiwgIjQuMC4wLjAiKV0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQorICAgIFtnbG9iYWw6OlN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMuQ29tcGlsZXJHZW5lcmF0ZWRBdHRyaWJ1dGUoKV0KKyAgICBpbnRlcm5hbCBjbGFzcyBSZXNvdXJjZXMKKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvIHJlc291cmNlQ3VsdHVyZTsKKworICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuQ29kZUFuYWx5c2lzLlN1cHByZXNzTWVzc2FnZUF0dHJpYnV0ZSgiTWljcm9zb2Z0LlBlcmZvcm1hbmNlIiwgIkNBMTgxMTpBdm9pZFVuY2FsbGVkUHJpdmF0ZUNvZGUiKV0KKyAgICAgICAgaW50ZXJuYWwgUmVzb3VyY2VzKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZXR1cm5zIHRoZSBjYWNoZWQgUmVzb3VyY2VNYW5hZ2VyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5BZHZhbmNlZCldCisgICAgICAgIGludGVybmFsIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIFJlc291cmNlTWFuYWdlcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlc291cmNlTWFuID09IG51bGwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciB0ZW1wID0gbmV3IGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIoIkVQUGx1c0V4Y2VsRm9ybURlbW8uUHJvcGVydGllcy5SZXNvdXJjZXMiLCB0eXBlb2YoUmVzb3VyY2VzKS5Bc3NlbWJseSk7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFuID0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlTWFuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBPdmVycmlkZXMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgQ3VycmVudFVJQ3VsdHVyZSBwcm9wZXJ0eSBmb3IgYWxsCisgICAgICAgIC8vLyAgIHJlc291cmNlIGxvb2t1cHMgdXNpbmcgdGhpcyBzdHJvbmdseSB0eXBlZCByZXNvdXJjZSBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5BZHZhbmNlZCldCisgICAgICAgIGludGVybmFsIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvIEN1bHR1cmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ3VsdHVyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc291cmNlQ3VsdHVyZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5yZXN4IGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5yZXN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmN2RiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvUmVzb3VyY2VzLnJlc3gKQEAgLTAsMCArMSwxMTcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cm9vdD4KKyAgPCEtLSAKKyAgICBNaWNyb3NvZnQgUmVzWCBTY2hlbWEgCisgICAgCisgICAgVmVyc2lvbiAyLjAKKyAgICAKKyAgICBUaGUgcHJpbWFyeSBnb2FscyBvZiB0aGlzIGZvcm1hdCBpcyB0byBhbGxvdyBhIHNpbXBsZSBYTUwgZm9ybWF0IAorICAgIHRoYXQgaXMgbW9zdGx5IGh1bWFuIHJlYWRhYmxlLiBUaGUgZ2VuZXJhdGlvbiBhbmQgcGFyc2luZyBvZiB0aGUgCisgICAgdmFyaW91cyBkYXRhIHR5cGVzIGFyZSBkb25lIHRocm91Z2ggdGhlIFR5cGVDb252ZXJ0ZXIgY2xhc3NlcyAKKyAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdHlwZXMuCisgICAgCisgICAgRXhhbXBsZToKKyAgICAKKyAgICAuLi4gYWRvLm5ldC9YTUwgaGVhZGVycyAmIHNjaGVtYSAuLi4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InJlc21pbWV0eXBlIj50ZXh0L21pY3Jvc29mdC1yZXN4PC9yZXNoZWFkZXI+CisgICAgPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4yLjA8L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCAuLi48L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9IndyaXRlciI+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VXcml0ZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCAuLi48L3Jlc2hlYWRlcj4KKyAgICA8ZGF0YSBuYW1lPSJOYW1lMSI+PHZhbHVlPnRoaXMgaXMgbXkgbG9uZyBzdHJpbmc8L3ZhbHVlPjxjb21tZW50PnRoaXMgaXMgYSBjb21tZW50PC9jb21tZW50PjwvZGF0YT4KKyAgICA8ZGF0YSBuYW1lPSJDb2xvcjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkNvbG9yLCBTeXN0ZW0uRHJhd2luZyI+Qmx1ZTwvZGF0YT4KKyAgICA8ZGF0YSBuYW1lPSJCaXRtYXAxIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0Ij4KKyAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHNlcmlhbGl6ZWQgLk5FVCBGcmFtZXdvcmsgb2JqZWN0XTwvdmFsdWU+CisgICAgPC9kYXRhPgorICAgIDxkYXRhIG5hbWU9Ikljb24xIiB0eXBlPSJTeXN0ZW0uRHJhd2luZy5JY29uLCBTeXN0ZW0uRHJhd2luZyIgbWltZXR5cGU9ImFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NCI+CisgICAgICAgIDx2YWx1ZT5bYmFzZTY0IG1pbWUgZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50aW5nIGEgYnl0ZSBhcnJheSBmb3JtIG9mIHRoZSAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KKyAgICAgICAgPGNvbW1lbnQ+VGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+CisgICAgPC9kYXRhPgorICAgICAgICAgICAgICAgIAorICAgIFRoZXJlIGFyZSBhbnkgbnVtYmVyIG9mICJyZXNoZWFkZXIiIHJvd3MgdGhhdCBjb250YWluIHNpbXBsZSAKKyAgICBuYW1lL3ZhbHVlIHBhaXJzLgorICAgIAorICAgIEVhY2ggZGF0YSByb3cgY29udGFpbnMgYSBuYW1lLCBhbmQgdmFsdWUuIFRoZSByb3cgYWxzbyBjb250YWlucyBhIAorICAgIHR5cGUgb3IgbWltZXR5cGUuIFR5cGUgY29ycmVzcG9uZHMgdG8gYSAuTkVUIGNsYXNzIHRoYXQgc3VwcG9ydCAKKyAgICB0ZXh0L3ZhbHVlIGNvbnZlcnNpb24gdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBhcmNoaXRlY3R1cmUuIAorICAgIENsYXNzZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoaXMgYXJlIHNlcmlhbGl6ZWQgYW5kIHN0b3JlZCB3aXRoIHRoZSAKKyAgICBtaW1ldHlwZSBzZXQuCisgICAgCisgICAgVGhlIG1pbWV0eXBlIGlzIHVzZWQgZm9yIHNlcmlhbGl6ZWQgb2JqZWN0cywgYW5kIHRlbGxzIHRoZSAKKyAgICBSZXNYUmVzb3VyY2VSZWFkZXIgaG93IHRvIGRlcGVyc2lzdCB0aGUgb2JqZWN0LiBUaGlzIGlzIGN1cnJlbnRseSBub3QgCisgICAgZXh0ZW5zaWJsZS4gRm9yIGEgZ2l2ZW4gbWltZXR5cGUgdGhlIHZhbHVlIG11c3QgYmUgc2V0IGFjY29yZGluZ2x5OgorICAgIAorICAgIE5vdGUgLSBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQgaXMgdGhlIGZvcm1hdCAKKyAgICB0aGF0IHRoZSBSZXNYUmVzb3VyY2VXcml0ZXIgd2lsbCBnZW5lcmF0ZSwgaG93ZXZlciB0aGUgcmVhZGVyIGNhbiAKKyAgICByZWFkIGFueSBvZiB0aGUgZm9ybWF0cyBsaXN0ZWQgYmVsb3cuCisgICAgCisgICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIAorICAgICAgICAgICAgOiBTeXN0ZW0uU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLkJpbmFyeS5CaW5hcnlGb3JtYXR0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKyAgICAKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5zb2FwLmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIAorICAgICAgICAgICAgOiBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuU29hcC5Tb2FwRm9ybWF0dGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisKKyAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIGludG8gYSBieXRlIGFycmF5IAorICAgICAgICAgICAgOiB1c2luZyBhIFN5c3RlbS5Db21wb25lbnRNb2RlbC5UeXBlQ29udmVydGVyCisgICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisgICAgLS0+CisgIDx4c2Q6c2NoZW1hIGlkPSJyb290IiB4bWxucz0iIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczptc2RhdGE9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206eG1sLW1zZGF0YSI+CisgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiPgorICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRhZGF0YSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgorICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NlbWJseSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbXNkYXRhOk9yZGluYWw9IjEiIC8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbXNkYXRhOk9yZGluYWw9IjIiIC8+CisgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbXNkYXRhOk9yZGluYWw9IjMiIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iNCIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8L3hzZDplbGVtZW50PgorICA8L3hzZDpzY2hlbWE+CisgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgorICAgIDx2YWx1ZT50ZXh0L21pY3Jvc29mdC1yZXN4PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+CisgICAgPHZhbHVlPjIuMDwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+CisgICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgorICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1NldHRpbmdzLkRlc2lnbmVyLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1NldHRpbmdzLkRlc2lnbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDhmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3MuRGVzaWduZXIuY3MKQEAgLTAsMCArMSwzMCBAQAor77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDxhdXRvLWdlbmVyYXRlZD4KKy8vICAgICBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBhIHRvb2wuCisvLyAgICAgUnVudGltZSBWZXJzaW9uOjQuMC4zMDMxOS4xODQwOAorLy8KKy8vICAgICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYKKy8vICAgICB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC4KKy8vIDwvYXV0by1nZW5lcmF0ZWQ+CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtby5Qcm9wZXJ0aWVzCit7CisKKworICAgIFtnbG9iYWw6OlN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMuQ29tcGlsZXJHZW5lcmF0ZWRBdHRyaWJ1dGUoKV0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlQXR0cmlidXRlKCJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLkVkaXRvcnMuU2V0dGluZ3NEZXNpZ25lci5TZXR0aW5nc1NpbmdsZUZpbGVHZW5lcmF0b3IiLCAiMTEuMC4wLjAiKV0KKyAgICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZXR0aW5ncyA6IGdsb2JhbDo6U3lzdGVtLkNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25TZXR0aW5nc0Jhc2UKKyAgICB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2V0dGluZ3MgZGVmYXVsdEluc3RhbmNlID0gKChTZXR0aW5ncykoZ2xvYmFsOjpTeXN0ZW0uQ29uZmlndXJhdGlvbi5BcHBsaWNhdGlvblNldHRpbmdzQmFzZS5TeW5jaHJvbml6ZWQobmV3IFNldHRpbmdzKCkpKSk7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTZXR0aW5ncyBEZWZhdWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3Muc2V0dGluZ3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3Muc2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2NDU2NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9TZXR0aW5ncy5zZXR0aW5ncwpAQCAtMCwwICsxLDcgQEAKK++7vzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+Cis8U2V0dGluZ3NGaWxlIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby8yMDA0LzAxL3NldHRpbmdzIiBDdXJyZW50UHJvZmlsZT0iKERlZmF1bHQpIj4KKyAgPFByb2ZpbGVzPgorICAgIDxQcm9maWxlIE5hbWU9IihEZWZhdWx0KSIgLz4KKyAgPC9Qcm9maWxlcz4KKyAgPFNldHRpbmdzIC8+Cis8L1NldHRpbmdzRmlsZT4KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QucnVuc2V0dGluZ3MgYi9FUFBsdXNUZXN0LnJ1bnNldHRpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTViYTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0LnJ1bnNldHRpbmdzCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxSdW5TZXR0aW5ncz4KKyAgPCEtLSBDb25maWd1cmF0aW9ucyB0aGF0IGFmZmVjdCB0aGUgVGVzdCBGcmFtZXdvcmsgLS0+CisgIDxNU1Rlc3Q+CisgICAgPERlbGV0ZURlcGxveW1lbnREaXJlY3RvcnlBZnRlclRlc3RSdW5Jc0NvbXBsZXRlPmZhbHNlPC9EZWxldGVEZXBsb3ltZW50RGlyZWN0b3J5QWZ0ZXJUZXN0UnVuSXNDb21wbGV0ZT4KKyAgPC9NU1Rlc3Q+CisKKworPC9SdW5TZXR0aW5ncz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0FkZHJlc3MuY3MgYi9FUFBsdXNUZXN0L0FkZHJlc3MuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwOGQxYQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvQWRkcmVzcy5jcwpAQCAtMCwwICsxLDEzOCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOworCituYW1lc3BhY2UgRVBQbHVzVGVzdAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3VtbWFyeSBkZXNjcmlwdGlvbiBmb3IgQWRkcmVzcworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQWRkcmVzcworICAgIHsKKyAgICAgICAgcHVibGljIEFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNvbnN0cnVjdG9yIGxvZ2ljIGhlcmUKKyAgICAgICAgICAgIC8vCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRlc3RDb250ZXh0IHRlc3RDb250ZXh0SW5zdGFuY2U7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy9HZXRzIG9yIHNldHMgdGhlIHRlc3QgY29udGV4dCB3aGljaCBwcm92aWRlcworICAgICAgICAvLy9pbmZvcm1hdGlvbiBhYm91dCBhbmQgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIGN1cnJlbnQgdGVzdCBydW4uCisgICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRlc3RDb250ZXh0IFRlc3RDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0Q29udGV4dEluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdENvbnRleHRJbnN0YW5jZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBBZGRpdGlvbmFsIHRlc3QgYXR0cmlidXRlcworICAgICAgICAvLworICAgICAgICAvLyBZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcyB5b3Ugd3JpdGUgeW91ciB0ZXN0czoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIENsYXNzSW5pdGlhbGl6ZSB0byBydW4gY29kZSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY2xhc3MKKyAgICAgICAgLy8gW0NsYXNzSW5pdGlhbGl6ZSgpXQorICAgICAgICAvLyBwdWJsaWMgc3RhdGljIHZvaWQgTXlDbGFzc0luaXRpYWxpemUoVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsgfQorICAgICAgICAvLworICAgICAgICAvLyBVc2UgQ2xhc3NDbGVhbnVwIHRvIHJ1biBjb2RlIGFmdGVyIGFsbCB0ZXN0cyBpbiBhIGNsYXNzIGhhdmUgcnVuCisgICAgICAgIC8vIFtDbGFzc0NsZWFudXAoKV0KKyAgICAgICAgLy8gcHVibGljIHN0YXRpYyB2b2lkIE15Q2xhc3NDbGVhbnVwKCkgeyB9CisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBUZXN0SW5pdGlhbGl6ZSB0byBydW4gY29kZSBiZWZvcmUgcnVubmluZyBlYWNoIHRlc3QgCisgICAgICAgIC8vIFtUZXN0SW5pdGlhbGl6ZSgpXQorICAgICAgICAvLyBwdWJsaWMgdm9pZCBNeVRlc3RJbml0aWFsaXplKCkgeyB9CisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBUZXN0Q2xlYW51cCB0byBydW4gY29kZSBhZnRlciBlYWNoIHRlc3QgaGFzIHJ1bgorICAgICAgICAvLyBbVGVzdENsZWFudXAoKV0KKyAgICAgICAgLy8gcHVibGljIHZvaWQgTXlUZXN0Q2xlYW51cCgpIHsgfQorICAgICAgICAvLworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEluc2VydERlbGV0ZVRlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJBMTpCMyIpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5BZGRSb3coMiwgNCkuQWRkcmVzcywgIkExOkI3Iik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5BZGRDb2x1bW4oMiwgNCkuQWRkcmVzcywgIkExOkYzIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5EZWxldGVDb2x1bW4oMiwgMSkuQWRkcmVzcywgIkExOkEzIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5EZWxldGVSb3coMiwgMikuQWRkcmVzcywgIkExOkIxIik7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChhZGRyLkRlbGV0ZVJvdygxLCAzKSwgbnVsbCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5EZWxldGVDb2x1bW4oMSwgMiksIG51bGwpOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTcGxpdEFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJDMzpGOCIpOworCisgICAgICAgICAgICBhZGRyLkluc2VydChuZXcgRXhjZWxBZGRyZXNzQmFzZSgiRzkiKSwgRXhjZWxBZGRyZXNzQmFzZS5lU2hpZnRUeXBlLlJpZ2h0KTsKKyAgICAgICAgICAgIGFkZHIuSW5zZXJ0KG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJHMyIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuUmlnaHQpOworICAgICAgICAgICAgYWRkci5JbnNlcnQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoIkM5IiksIEV4Y2VsQWRkcmVzc0Jhc2UuZVNoaWZ0VHlwZS5SaWdodCk7CisgICAgICAgICAgICBhZGRyLkluc2VydChuZXcgRXhjZWxBZGRyZXNzQmFzZSgiQjIiKSwgRXhjZWxBZGRyZXNzQmFzZS5lU2hpZnRUeXBlLlJpZ2h0KTsKKyAgICAgICAgICAgIGFkZHIuSW5zZXJ0KG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJCMyIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuUmlnaHQpOworICAgICAgICAgICAgYWRkci5JbnNlcnQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoIkQ6RCIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuUmlnaHQpOworICAgICAgICAgICAgYWRkci5JbnNlcnQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoIjU6NSIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuRG93bik7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhMSA9IG5ldyBFeGNlbEFkZHJlc3MoIlNhbGVzRGF0YSEkSyQ0NDUiKTsKKyAgICAgICAgICAgIHZhciBhMiA9IG5ldyBFeGNlbEFkZHJlc3MoIlNhbGVzRGF0YSEkSyQ0NDU6JE0kNDQ5LFNhbGVzRGF0YSEkTiQ0NDg6JFEkNDU0LFNhbGVzRGF0YSEkTCQ0NTg6JE8kNDY0Iik7CisgICAgICAgICAgICB2YXIgYTMgPSBuZXcgRXhjZWxBZGRyZXNzKCJTYWxlc0RhdGEhJEskNDQ1OiRMJDQ0OCIpOworICAgICAgICAgICAgLy92YXIgYTQgPSBuZXcgRXhjZWxBZGRyZXNzKCInWzFdUmlza11UYXRUV1JGb3JtX1RXUldFRUtMWTIwMTMwOTI2MDkwJyEkTiQ1MjciKTsKKyAgICAgICAgICAgIHZhciBhNSA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVtbI0FsbF0sW1RpdGxlXV0iKTsKKyAgICAgICAgICAgIHZhciBhNiA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVsjQWxsXSIpOworICAgICAgICAgICAgdmFyIGE3ID0gbmV3IEV4Y2VsQWRkcmVzcygiVGFibGUxW1sjSGVhZGVyc10sW0ZpcnN0TmFtZV06W0xhc3ROYW1lXV0iKTsKKyAgICAgICAgICAgIHZhciBhOCA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVsjSGVhZGVyc10iKTsKKyAgICAgICAgICAgIHZhciBhOSA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMltbI0FsbF0sW1N1YlRvdGFsXV0iKTsKKyAgICAgICAgICAgIHZhciBhMTAgPSBuZXcgRXhjZWxBZGRyZXNzKCJUYWJsZTJbI0FsbF0iKTsKKyAgICAgICAgICAgIHZhciBhMTEgPSBuZXcgRXhjZWxBZGRyZXNzKCJUYWJsZTFbWyNBbGxdLFtGcmVpZ2h0XV0iKTsKKyAgICAgICAgICAgIHZhciBhMTIgPSBuZXcgRXhjZWxBZGRyZXNzKCJbMV0hVGFibGUxW1tMYXN0TmFtZV06W05hbWVdXSIpOworICAgICAgICAgICAgdmFyIGExMyA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVtbI0FsbF0sW0ZyZWlnaHRdXSIpOworICAgICAgICAgICAgdmFyIGExNCA9IG5ldyBFeGNlbEFkZHJlc3MoIlNhbGVzRGF0YSEkTiQ1Kyd0ZXN0JycxJyEkSiQzMyIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzVmFsaWRDZWxsQWRyZXNzKCkKKyAgICAgICAgeworICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExIikpOworICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExMDQ4NTc2IikpOworICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlhGRDEiKSk7CisgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiWEZEMTA0ODU3NiIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNUcnVlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJUYWJsZTEhQTEiKSk7CisgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiVGFibGUxIUExMDQ4NTc2IikpOworICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlRhYmxlMSFYRkQxIikpOworICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlRhYmxlMSFYRkQxMDQ4NTc2IikpOworICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJBIikpOworICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJBIikpOworICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJYRkQiKSk7CisgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlhGRCIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMSIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMTA0ODU3NiIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMSIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMTA0ODU3NiIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiQTE6QTEwNDg1NzYiKSk7CisgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExOlhGRDEiKSk7CisgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExMDQ4NTc2OlhGRDEwNDg1NzYiKSk7CisgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlhGRDE6WEZEMTA0ODU3NiIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiVGFibGUxIUExOkExMDQ4NTc2IikpOworICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJUYWJsZTEhQTE6WEZEMSIpKTsKKyAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiVGFibGUxIUExMDQ4NTc2OlhGRDEwNDg1NzYiKSk7CisgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlRhYmxlMSFYRkQxOlhGRDEwNDg1NzYiKSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvQ2FsY3VsYXRpb24uY3MgYi9FUFBsdXNUZXN0L0NhbGN1bGF0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDllMDcKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0NhbGN1bGF0aW9uLmNzCkBAIC0wLDAgKzEsMzE3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW0RlcGxveW1lbnRJdGVtKCJXb3JrYm9va3MiLCAidGFyZ2V0Rm9sZGVyIildCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRpb24KKyAgICB7CisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vcHVibGljIHZvaWQgQ2FsdWxhdGlvbigpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxjaGFpbi54bHN4IikpOworICAgICAgICAvLyAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCg1MEQsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJDMSJdLlZhbHVlKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vcHVibGljIHZvaWQgQ2FsdWxhdGlvbjIoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcY2hhaW5UZXN0Lnhsc3giKSk7CisgICAgICAgIC8vICAgIHBjay5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDExMjQ5OTk5NjAzODJELCBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQzEiXS5WYWx1ZSk7CisgICAgICAgIC8vfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIENhbHVsYXRpb24zKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXG5hbWVzLnhsc3giKSk7CisgICAgICAgIC8vICAgIHBjay5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKyAgICAgICAgLy8gICAgLy9Bc3NlcnQuQXJlRXF1YWwoMTEyNDk5OTk2MDM4MkQsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJDMSJdLlZhbHVlKTsKKyAgICAgICAgLy99CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYWx1bGF0aW9uVGVzdERhdGF0eXBlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3M9cGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjMSIpOworICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkExIiwgKHNob3J0KTEpOworICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkEyIiwgKGxvbmcpMik7CisgICAgICAgICAgICB3cy5TZXRWYWx1ZSgiQTMiLCAoU2luZ2xlKTMpOworICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkE0IiwgKGRvdWJsZSk0KTsKKyAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBNSIsIChEZWNpbWFsKTUpOworICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkE2IiwgKGJ5dGUpNik7CisgICAgICAgICAgICB3cy5TZXRWYWx1ZSgiQTciLCBudWxsKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTAiXS5Gb3JtdWxhID0gIlN1bShBMTpBOCkiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExMSJdLkZvcm11bGEgPSAiU3ViVG90YWwoOSxBMTpBOCkiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExMiJdLkZvcm11bGEgPSAiQXZlcmFnZShBMTpBOCkiOworCisgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMUQsIHdzLkNlbGxzWyJhMTAiXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjFELCB3cy5DZWxsc1siYTExIl0uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxRC82LCB3cy5DZWxsc1siYTEyIl0uVmFsdWUpOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYWxjdWxhdGVUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKKworICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkExIiwoIHNob3J0KTEpOworICAgICAgICAgICAgdmFyIHY9d3MuQ2FsY3VsYXRlKCIyLjUtQTErQUJTKC0zLjApLVNJTigzKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQuMzU4OSwgTWF0aC5Sb3VuZCgoZG91YmxlKXYsIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgd3MuUm93KDEpLkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICB2ID0gd3MuQ2FsY3VsYXRlKCJzdWJ0b3RhbCgxMDksYTE6YTEwKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBELCB2KTsKKworICAgICAgICAgICAgdiA9IHdzLkNhbGN1bGF0ZSgiLXN1YnRvdGFsKDksYTE6YTMpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTFELCB2KTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FsY3VsYXRlVGVzdElzRnVuY3Rpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKKworICAgICAgICAgICAgd3MuU2V0VmFsdWUoMSwgMSwgMS4wRCk7CisgICAgICAgICAgICB3cy5TZXRGb3JtdWxhKDEsIDIsICJpc2JsYW5rKEExOkE1KSIpOworICAgICAgICAgICAgd3MuU2V0Rm9ybXVsYSgxLCAzLCAiY29uY2F0ZW5hdGUoYTEsYTIsYTMpIik7CisgICAgICAgICAgICB3cy5TZXRGb3JtdWxhKDEsIDQsICJSb3coKSIpOworICAgICAgICAgICAgd3MuU2V0Rm9ybXVsYSgxLCA1LCAiUm93KGEzKSIpOworICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENhbHVsYXRpb240KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9DOlxEZXZlbG9wbWVudFxlcHBsdXMgZm9ybXVsYXNcRVBQbHVzVGVzdFxXb3JrYm9va3NcRm9ybXVsYVRlc3QueGxzeAorICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcRGV2ZWxvcG1lbnRcZXBwbHVzIGZvcm11bGFzXEVQUGx1c1Rlc3RcV29ya2Jvb2tzXEZvcm11bGFUZXN0Lnhsc3giKSk7CisgICAgICAgICAgICAvL3ZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5ICsgIi4uXFwuLlxcLi5cXC4uXFxFUFBsdXNUZXN0XFx3b3JrYm9va3NcXEZvcm11bGFUZXN0Lnhsc3giKSk7CisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDkwRCwgcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbIkQ1Il0uVmFsdWUpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYWx1bGF0aW9uVmFsaWRhdGlvbkV4Y2VsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRpciA9IEFwcERvbWFpbi5DdXJyZW50RG9tYWluLkJhc2VEaXJlY3Rvcnk7CisgICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRpciwgIldvcmtib29rcyIsICJGb3JtdWxhVGVzdC54bHN4IikpKTsKKworICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIlZhbGlkYXRlRm9ybXVsYXMiXTsKKyAgICAgICAgICAgIHZhciBmciA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gd3MuQ2VsbHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShjZWxsLkZvcm11bGEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnIuQWRkKGNlbGwuQWRkcmVzcywgY2VsbC5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGNrLldvcmtib29rLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIG5FcnJvcnMgPSAwOworICAgICAgICAgICAgdmFyIGVycm9ycyA9IG5ldyBMaXN0PFR1cGxlPHN0cmluZywgb2JqZWN0LCBvYmplY3Q+PigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFkciBpbiBmci5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyW2Fkcl0gaXMgZG91YmxlICYmIHdzLkNlbGxzW2Fkcl0uVmFsdWUgaXMgZG91YmxlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZDEgPSBDb252ZXJ0LlRvRG91YmxlKGZyW2Fkcl0pOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQyID0gQ29udmVydC5Ub0RvdWJsZSh3cy5DZWxsc1thZHJdLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLkFicyhkMSAtIGQyKSA8IDAuMDAwMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZnJbYWRyXSwgd3MuQ2VsbHNbYWRyXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZnJbYWRyXSwgd3MuQ2VsbHNbYWRyXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5BZGQobmV3IFR1cGxlPHN0cmluZywgb2JqZWN0LCBvYmplY3Q+KGFkciwgZnJbYWRyXSwgd3MuQ2VsbHNbYWRyXS5WYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBuRXJyb3JzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0T25lQ2VsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcRVBQbHVzVGVzdGFya1xUZXN0NC54bHNtIikpOworICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsgCisgICAgICAgICAgICBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUsOkbnRlYsOkcmFuZGUgZm9ybWF0ZXJhdCB1dGxhbmQiXS5DZWxsc1siTTEzIl0uQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJSw6RudGViw6RyYW5kZSBmb3JtYXRlcmF0IHV0bGFuZCJdLkNlbGxzWyJNMTMiXS5WYWx1ZSk7ICAKKyAgICAgICAgfQorCisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0UHJlY2VkZW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcRVBQbHVzVGVzdGFya1xQcmVjZWRlbmNlLnhsc3giKSk7CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5MYXN0KCk7CisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTUwZCwgd3MuQ2VsbHNbIkExIl0uVmFsdWUpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGF0YVR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEVQUGx1c1Rlc3RhcmtcY2FsY19hbW91bnQueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgLy93cy5OYW1lcy5BZGQoIk5hbWUxIix3cy5DZWxsc1siQTEiXSk7CisgICAgICAgICAgICAvL3dzLk5hbWVzLkFkZCgiTmFtZTIiLCB3cy5DZWxsc1siQTIiXSk7CisgICAgICAgICAgICB3cy5OYW1lc1siUFJJQ0UiXS5WYWx1ZSA9IDMwOworICAgICAgICAgICAgd3MuTmFtZXNbIlFVQU5USVRZIl0uVmFsdWUgPSAxMDsKKworICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgIHdzLk5hbWVzWyJQUklDRSJdLlZhbHVlID0gNDA7CisgICAgICAgICAgICB3cy5OYW1lc1siUVVBTlRJVFkiXS5WYWx1ZSA9IDIwOworCisgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FsY1R3aWNlRXJyb3IoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjVGVzdCIpOworICAgICAgICAgICAgd3MuTmFtZXMuQWRkVmFsdWUoIlBSSUNFIiwgMTApOworICAgICAgICAgICAgd3MuTmFtZXMuQWRkVmFsdWUoIlFVQU5USVRZIiwgMTEpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uRm9ybXVsYT0iUFJJQ0UqUVVBTlRJVFkiOworICAgICAgICAgICAgd3MuTmFtZXMuQWRkRm9ybXVsYSgiQU1PVU5UIiwgIlBSSUNFKlFVQU5USVRZIik7CisKKyAgICAgICAgICAgIHdzLk5hbWVzWyJQUklDRSJdLlZhbHVlID0gMzA7CisgICAgICAgICAgICB3cy5OYW1lc1siUVVBTlRJVFkiXS5WYWx1ZSA9IDEwOworCisgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMDBELCB3cy5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAwRCwgd3MuTmFtZXNbIkFNT1VOVCJdLlZhbHVlKTsKKyAgICAgICAgICAgIHdzLk5hbWVzWyJQUklDRSJdLlZhbHVlID0gNDA7CisgICAgICAgICAgICB3cy5OYW1lc1siUVVBTlRJVFkiXS5WYWx1ZSA9IDIwOworCisgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4MDBELCB3cy5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoODAwRCwgd3MuTmFtZXNbIkFNT1VOVCJdLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSWZFcnJvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGNUZXN0Iik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJ0ZXN0MSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTUiXS5WYWx1ZSA9ICJ0ZXN0MiI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9ICJTYW50IjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMyJdLlZhbHVlID0gIkZhbHNrdCI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTQiXS5Gb3JtdWxhID0gImlmKEExPj1BNSx0cnVlLEEzKSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5Gb3JtdWxhID0gImlzVGV4dChhMSkiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uRm9ybXVsYSA9ICJpc1RleHQoXCJUZXN0XCIpIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMyJdLkZvcm11bGEgPSAiaXNUZXh0KDEpIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCNCJdLkZvcm11bGEgPSAiaXNUZXh0KHRydWUpIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJjMSJdLkZvcm11bGEgPSAibWlkKGExLDQsMTUpIjsKKworICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEFsbFdvcmtib29rcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2I9bmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIC8vQWRkIHNoZWV0cyB0byB0ZXN0IGluIHRoaXMgZGlyZWN0b3J5IG9yIGNoYW5nZSBpdCB0byB5b3VyIHRlc3RwYXRoLgorICAgICAgICAgICAgc3RyaW5nIHBhdGggPSBAIkM6XHRlbXBcRVBQbHVzVGVzdGFya1x3b3JrYm9va3MiOworICAgICAgICAgICAgaWYoIURpcmVjdG9yeS5FeGlzdHMocGF0aCkpIHJldHVybjsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKHBhdGgsICIqLnhscyoiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoR2V0T3V0cHV0KGZpbGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNiLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc3RyaW5nLkZvcm1hdCgiVGVzdEFsbFdvcmtvb2tzezB9LnR4dCIsIERhdGVUaW1lLk5vdy5Ub1Nob3J0RGF0ZVN0cmluZygpICsgIiAiICsgRGF0ZVRpbWUuTm93LlRvU2hvcnREYXRlU3RyaW5nKCkpLCBzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyhuZXcgRXhjZXB0aW9uKCJUZXN0IGZhaWxlZCB3aXRoXHJcblxyXG4iICsgc2IuVG9TdHJpbmcoKSkpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRPdXRwdXQoc3RyaW5nIGZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmciA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBwY2suV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHdzLkNlbGxzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoY2VsbC5Gb3JtdWxhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyLkFkZCh3cy5Qb3NpdGlvbklELlRvU3RyaW5nKCkgKyAiLCIgKyBjZWxsLkFkZHJlc3MsIGNlbGwuVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5fdmFsdWVzLlNldFZhbHVlKGNlbGwuU3RhcnQuUm93LCBjZWxsLlN0YXJ0LkNvbHVtbiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGNrLldvcmtib29rLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIHZhciBuRXJyb3JzID0gMDsKKyAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gbmV3IExpc3Q8VHVwbGU8c3RyaW5nLCBvYmplY3QsIG9iamVjdD4+KCk7CisgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgc2hlZXQ9bnVsbDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgYWRyPSIiOworICAgICAgICAgICAgICAgIHZhciBmaWxlRXJyID0gbmV3IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoImM6XFx0ZW1wXFxlcnIudHh0Iik7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gZnIuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BsID0gY2VsbC5TcGxpdCgnLCcpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl4ID0gaW50LlBhcnNlKHNwbFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzW2l4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkciA9IHNwbFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcltjZWxsXSBpcyBkb3VibGUgJiYgKHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWUgaXMgZG91YmxlIHx8IHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWUgaXMgZGVjaW1hbCAgfHwgc2hlZXQuQ2VsbHNbYWRyXS5WYWx1ZS5HZXRUeXBlKCkuSXNQcmltaXRpdmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkMSA9IENvbnZlcnQuVG9Eb3VibGUoZnJbY2VsbF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkMiA9IENvbnZlcnQuVG9Eb3VibGUoc2hlZXQuQ2VsbHNbYWRyXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoTWF0aC5BYnMoZDEgLSBkMikgPCBkb3VibGUuRXBzaWxvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb3VibGUuRXF1YWxzKGQxLGQyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vycm9ycy5BZGQobmV3IFR1cGxlPHN0cmluZywgb2JqZWN0LCBvYmplY3Q+KGFkciwgZnJbY2VsbF0sIHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVyci5Xcml0ZUxpbmUoIkRpZmYgY2VsbCAiICsgc2hlZXQuTmFtZSArICIhIiArIGFkciArIlx0IiArIGQxLlRvU3RyaW5nKCJSMTUiKSArICJcdCIgKyBkMi5Ub1N0cmluZygiUjE1IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZyW2NlbGxdPz8iIikuVG9TdHJpbmcoKSAhPSAoc2hlZXQuQ2VsbHNbYWRyXS5WYWx1ZT8/IiIpLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlRXJyLldyaXRlTGluZSgiU3RyaW5nPyAgY2VsbCAiICsgc2hlZXQuTmFtZSArICIhIiArIGFkciArICJcdCIgKyAoZnJbY2VsbF0gPz8gIiIpLlRvU3RyaW5nKCkgKyAiXHQiICsgKHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWU/PyIiKS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJvcnMuQWRkKG5ldyBUdXBsZTxzdHJpbmcsIG9iamVjdCwgb2JqZWN0PihhZHIsIGZyW2NlbGxdLCBzaGVldC5DZWxsc1thZHJdLlZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlRXJyLldyaXRlTGluZSgiRXhjZXB0aW9uIGNlbGwgIiArIHNoZWV0Lk5hbWUgKyAiISIgKyBhZHIgKyAiXHQiICsgZnJbY2VsbF0uVG9TdHJpbmcoKSArICJcdCIgKyBzaGVldC5DZWxsc1thZHJdLlZhbHVlICsgICJcdCIgKyBlLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVyci5Xcml0ZUxpbmUoIioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVyci5Xcml0ZUxpbmUoZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5FcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWxlRXJyLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5FcnJvcnMuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvQ2VsbFN0b3JlVGVzdC5jcyBiL0VQUGx1c1Rlc3QvQ2VsbFN0b3JlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgzOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9DZWxsU3RvcmVUZXN0LmNzCkBAIC0wLDAgKzEsMTY5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQ2VsbFN0b3JlVGVzdCA6IFRlc3RCYXNlCisgICAgeworICAgICAgICAKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEluc2VydDEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3M9X3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0MSIpOworICAgICAgICAgICAgTG9hZERhdGEod3MpOworCisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMiwgMTAwMCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoMTAwMiwxKSwiMSwwIik7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMTAwMywgMTAwMCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoMjAwMywgMSksICIyLDAiKTsKKyAgICAgICAgICAgIHdzLkluc2VydFJvdygyMDA0LCAxMDAwKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSgzMDA0LCAxKSwgIjMsMCIpOworICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDIwMDYsIDEwMDApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDQwMDUsIDEpLCAiNCwwIik7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coNDUwMCwgNTAwKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSg1MDAwLCAxKSwgIjQ5OSwwIik7CisKKyAgICAgICAgICAgIHdzLkluc2VydFJvdygxLCAxKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSgxMDAzLCAxKSwgIjEsMCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDUwMDEsIDEpLCAiNDk5LDAiKTsKKworICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDEsIDE1KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSg0MDIwLCAxKSwgIjMsMCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDUwMTYsIDEpLCAiNDk5LDAiKTsKKyAgIAorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0Mi0xIik7CisgICAgICAgICAgICBMb2FkRGF0YSh3cyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cy5JbnNlcnRSb3coMSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoMzMsMSksIjAsMCIpOworCisgICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkluc2VydDItMiIpOworICAgICAgICAgICAgTG9hZERhdGEod3MpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDE1LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSgxLCAxKSwgIjAsMCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDQ3LCAxKSwgIjE0LDAiKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5zZXJ0MygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkluc2VydDMiKTsKKyAgICAgICAgICAgIExvYWREYXRhKHdzKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7IGkrPTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3MuSW5zZXJ0Um93KGkrMSwgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5zZXJ0UmFuZG9tVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkluc2VydDQtMSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBMb2FkRGF0YSh3cywgNTAwMCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSA1MDAwOyBpID4gMDsgaS09MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cy5JbnNlcnRSb3coaSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEVudW1DZWxsc3RvcmUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJlbnVtIik7CisKKyAgICAgICAgICAgIExvYWREYXRhKHdzLCA1MDAwKTsKKworICAgICAgICAgICAgdmFyIG8gPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pih3cy5fdmFsdWVzLCAyLCAxLCA1LCAzKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpIGluIG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUNlbGxzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGVsZXRlIik7CisgICAgICAgICAgICBMb2FkRGF0YSh3cywgNTAwMCk7CisKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygyLCAyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMywwIix3cy5HZXRWYWx1ZSgyLDEpKTsKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxMCwgMTApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMSwwIiwgd3MuR2V0VmFsdWUoMTAsIDEpKTsKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdyg1MCwgNDApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMDEsMCIsIHdzLkdldFZhbHVlKDUwLCAxKSk7CisgICAgICAgICAgICB3cy5EZWxldGVSb3coMTAwLCAxMDApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyNTEsMCIsIHdzLkdldFZhbHVlKDEwMCwgMSkpOworICAgICAgICAgICAgd3MuRGVsZXRlUm93KDEsIDMxKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNDMsMCIsIHdzLkdldFZhbHVlKDEsIDEpKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlQ2VsbHNGaXJzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRlbGV0ZUZpcnN0Iik7CisgICAgICAgICAgICBMb2FkRGF0YSh3cywgNTAwMCk7CisKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygzMiwgMzApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1MDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxLDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVJbnNlcnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEZWxldGVJbnNlcnQiKTsKKyAgICAgICAgICAgIExvYWREYXRhKHdzLCA1MDAwKTsKKworICAgICAgICAgICAgd3MuRGVsZXRlUm93KDIsIDMzKTsKKyAgICAgICAgICAgIHdzLkluc2VydFJvdygyLCAzOCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cy5TZXRWYWx1ZShpICsgMiwxLCBpICsgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWREYXRhKEV4Y2VsV29ya3NoZWV0IHdzKQorICAgICAgICB7CisgICAgICAgICAgICBMb2FkRGF0YSh3cywgMTAwMCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWREYXRhKEV4Y2VsV29ya3NoZWV0IHdzLCBpbnQgcm93cywgaW50IGNvbHM9MSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb3dzOyByKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBjb2xzOyBjKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cy5TZXRWYWx1ZShyKzEsIGMrMSwgci5Ub1N0cmluZygpKyIsIitjLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRmlsbEluc2VydFRlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaWxsSW5zZXJ0Iik7CisKKyAgICAgICAgICAgIExvYWREYXRhKHdzLCA1MDApOworCisgICAgICAgICAgICB2YXIgcj0xOworICAgICAgICAgICAgZm9yKGludCBpPTE7aTw9NTAwO2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cy5JbnNlcnRSb3cocixpKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKGktMSkuVG9TdHJpbmcoKSsiLDAiLCB3cy5HZXRWYWx1ZShyK2ksMSkuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcis9aSsxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Db21tZW50c1Rlc3QuY3MgYi9FUFBsdXNUZXN0L0NvbW1lbnRzVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzJhODE1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Db21tZW50c1Rlc3QuY3MKQEAgLTAsMCArMSwzNiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQ29tbWVudHNUZXN0CisgICAgeworICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEV4Y2VsQ29tbWVudHMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGdvb2dsZUNvbW1lbnRzXENvbW1lbnRzLmV4Y2VsLnhsc3giKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0MSA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHNoZWV0MS5Db21tZW50cy5Db3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRHb29nbGVDb21tZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcZ29vZ2xlQ29tbWVudHNcQ29tbWVudHMuZ29vZ2xlLnhsc3giKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0MSA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHNoZWV0MS5Db21tZW50cy5Db3VudCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOb3RlIGZvciBjb2x1bW4gJ0FkZHJlc3MnLiIsIHNoZWV0MS5Db21tZW50c1swXS5UZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbmRpdGlvbmFsRm9ybWF0dGluZy5jcyBiL0VQUGx1c1Rlc3QvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbmRpdGlvbmFsRm9ybWF0dGluZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ5MzgzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzCkBAIC0wLDAgKzEsMTkwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOworCituYW1lc3BhY2UgRVBQbHVzVGVzdAoreworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUZXN0IHRoZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nIGZlYXR1cmUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgW1Rlc3RDbGFzc10KKyAgcHVibGljIGNsYXNzIENvbmRpdGlvbmFsRm9ybWF0dGluZworICB7CisgICAgcHJpdmF0ZSBUZXN0Q29udGV4dCB0ZXN0Q29udGV4dEluc3RhbmNlOworICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsUGFja2FnZSBfcGNrOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vL0dldHMgb3Igc2V0cyB0aGUgdGVzdCBjb250ZXh0IHdoaWNoIHByb3ZpZGVzCisgICAgLy8vaW5mb3JtYXRpb24gYWJvdXQgYW5kIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBjdXJyZW50IHRlc3QgcnVuLgorICAgIC8vLzwvc3VtbWFyeT4KKyAgICBwdWJsaWMgVGVzdENvbnRleHQgVGVzdENvbnRleHQKKyAgICB7CisgICAgICBnZXQKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRlc3RDb250ZXh0SW5zdGFuY2U7CisgICAgICB9CisgICAgICBzZXQKKyAgICAgIHsKKyAgICAgICAgdGVzdENvbnRleHRJbnN0YW5jZSA9IHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgICNyZWdpb24gQWRkaXRpb25hbCB0ZXN0IGF0dHJpYnV0ZXMKKyAgICAvLyBZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcyB5b3Ugd3JpdGUgeW91ciB0ZXN0czoKKyAgICAvLyBVc2UgQ2xhc3NJbml0aWFsaXplIHRvIHJ1biBjb2RlIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjbGFzcworICAgIFtDbGFzc0luaXRpYWxpemUoKV0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgTXlDbGFzc0luaXRpYWxpemUoVGVzdENvbnRleHQgdGVzdENvbnRleHQpCisgICAgeworICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKCJUZXN0IikpCisgICAgICB7CisgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShzdHJpbmcuRm9ybWF0KCJUZXN0IikpOworICAgICAgfQorCisgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJUZXN0XENvbmRpdGlvbmFsRm9ybWF0dGluZy54bHN4IikpOworICAgIH0KKworICAgIC8vIFVzZSBDbGFzc0NsZWFudXAgdG8gcnVuIGNvZGUgYWZ0ZXIgYWxsIHRlc3RzIGluIGEgY2xhc3MgaGF2ZSBydW4KKyAgICBbQ2xhc3NDbGVhbnVwKCldCisgICAgcHVibGljIHN0YXRpYyB2b2lkIE15Q2xhc3NDbGVhbnVwKCkKKyAgICB7CisgICAgICAgIF9wY2sgPSBudWxsOworICAgIH0KKworICAgIC8vIC8vVXNlIFRlc3RJbml0aWFsaXplIHRvIHJ1biBjb2RlIGJlZm9yZSBydW5uaW5nIGVhY2ggdGVzdCAKKyAgICAvLyBbVGVzdEluaXRpYWxpemUoKV0KKyAgICAvLyBwdWJsaWMgdm9pZCBNeVRlc3RJbml0aWFsaXplKCkgCisgICAgLy8geworICAgIC8vIH0KKworICAgIC8vLy8gVXNlIFRlc3RDbGVhbnVwIHRvIHJ1biBjb2RlIGFmdGVyIGVhY2ggdGVzdCBoYXMgcnVuCisgICAgLy8gW1Rlc3RDbGVhbnVwKCldCisgICAgLy8gcHVibGljIHZvaWQgTXlUZXN0Q2xlYW51cCgpIAorICAgIC8vIHsKKyAgICAvLyB9CisgICAgI2VuZHJlZ2lvbgorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFtUZXN0TWV0aG9kXQorICAgIHB1YmxpYyB2b2lkIFR3b0NvbG9yU2NhbGUoKQorICAgIHsKKyAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbG9yU2NhbGUiKTsKKyAgICAgIHdzLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUd29Db2xvclNjYWxlKHdzLkNlbGxzWyJBMTpBNSJdKTsKKyAgICAgIHdzLlNldFZhbHVlKDEsIDEsIDEpOworICAgICAgd3MuU2V0VmFsdWUoMiwgMSwgMik7CisgICAgICB3cy5TZXRWYWx1ZSgzLCAxLCAzKTsKKyAgICAgIHdzLlNldFZhbHVlKDQsIDEsIDQpOworICAgICAgd3MuU2V0VmFsdWUoNSwgMSwgNSk7ICAgICAgCisgICAgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFtUZXN0TWV0aG9kXQorICAgIFtJZ25vcmVdCisgICAgcHVibGljIHZvaWQgUmVhZENvbmRpdGlvbmFsRm9ybWF0dGluZygpCisgICAgeworICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjZi54bHN4IikpOworCisgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgIEFzc2VydC5Jc1RydWUod3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvdW50ID09IDYpOworICAgICAgQXNzZXJ0LklzVHJ1ZSh3cy5Db25kaXRpb25hbEZvcm1hdHRpbmdbMF0uVHlwZT09ZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcik7CisKKyAgICAgIHZhciBjZjEgPSB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwod3MuQ2VsbHNbIkMzIl0pOworICAgICAgLy9jZjEuRm9ybXVsYSA9ICJUUlVFIjsKKyAgICAgIHZhciBjZjIgPSB3cy5DZWxsc1siQzg6QzEyIl0uQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEV4cHJlc3Npb24oKTsKKyAgICAgIHZhciBjZjMgPSB3cy5DZWxsc1siZDEyOkQyMixIMTI6SDIyIl0uQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEZvdXJJY29uU2V0KGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGUuUmVkVG9CbGFjayk7CisgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2YyLnhsc3giKSk7CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBbVGVzdE1ldGhvZF0KKyAgICBbSWdub3JlXQorICAgIHB1YmxpYyB2b2lkIFJlYWRDb25kaXRpb25hbEZvcm1hdHRpbmdFcnJvcigpCisgICAgeworICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxDb2ZDVGVtcGxhdGUueGxzeCIpKTsKKworICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07CisgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2YyLnhsc3giKSk7CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBbVGVzdE1ldGhvZF0KKyAgICBwdWJsaWMgdm9pZCBUd29CYWNrQ29sb3IoKQorICAgIHsKKyAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVHdvQmFja0NvbG9yIik7CisgICAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsIGNvbmRpdGlvbjEgPSB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwod3MuQ2VsbHNbIkExIl0pOworICAgICAgICBjb25kaXRpb24xLlN0b3BJZlRydWUgPSB0cnVlOworICAgICAgICBjb25kaXRpb24xLlByaW9yaXR5ID0gMTsKKyAgICAgICAgY29uZGl0aW9uMS5Gb3JtdWxhID0gIlRSVUUiOworICAgICAgICBjb25kaXRpb24xLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLkNvbG9yID0gQ29sb3IuR3JlZW47CisgICAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsIGNvbmRpdGlvbjIgPSB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwod3MuQ2VsbHNbIkEyIl0pOworICAgICAgICBjb25kaXRpb24yLlN0b3BJZlRydWUgPSB0cnVlOworICAgICAgICBjb25kaXRpb24yLlByaW9yaXR5ID0gMjsKKyAgICAgICAgY29uZGl0aW9uMi5Gb3JtdWxhID0gIkZBTFNFIjsKKyAgICAgICAgY29uZGl0aW9uMi5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5Db2xvciA9IENvbG9yLlJlZDsKKyAgICB9CisgICAgW1Rlc3RNZXRob2RdCisgICAgcHVibGljIHZvaWQgRGF0YWJhcigpCisgICAgeworICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEYXRhYmFyIik7CisgICAgICAgIHZhciBjZiA9IHdzLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGREYXRhYmFyKHdzLkNlbGxzWyJBMTpBNSJdLCBDb2xvci5CbHVlVmlvbGV0KTsKKyAgICAgICAgd3MuU2V0VmFsdWUoMSwgMSwgMSk7CisgICAgICAgIHdzLlNldFZhbHVlKDIsIDEsIDIpOworICAgICAgICB3cy5TZXRWYWx1ZSgzLCAxLCAzKTsKKyAgICAgICAgd3MuU2V0VmFsdWUoNCwgMSwgNCk7CisgICAgICAgIHdzLlNldFZhbHVlKDUsIDEsIDUpOworICAgIH0KKyAgICBbVGVzdE1ldGhvZF0KKyAgICBwdWJsaWMgdm9pZCBJY29uU2V0KCkKKyAgICB7CisgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkljb25TZXQiKTsKKyAgICAgICAgdmFyIGNmID0gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRocmVlSWNvblNldCh3cy5DZWxsc1siQTE6QTMiXSwgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZS5TeW1ib2xzKTsKKyAgICAgICAgd3MuU2V0VmFsdWUoMSwgMSwgMSk7CisgICAgICAgIHdzLlNldFZhbHVlKDIsIDEsIDIpOworICAgICAgICB3cy5TZXRWYWx1ZSgzLCAxLCAzKTsKKworICAgICAgICB2YXIgY2Y0ID0gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEZvdXJJY29uU2V0KHdzLkNlbGxzWyJCMTpCNCJdLCBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlLlJhdGluZyk7CisgICAgICAgIGNmNC5JY29uMS5UeXBlID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGE7CisgICAgICAgIGNmNC5JY29uMS5Gb3JtdWxhID0gIjAiOworICAgICAgICBjZjQuSWNvbjIuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOworICAgICAgICBjZjQuSWNvbjIuRm9ybXVsYSA9ICIxLzMiOworICAgICAgICBjZjQuSWNvbjMuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOworICAgICAgICBjZjQuSWNvbjMuRm9ybXVsYSA9ICIyLzMiOworICAgICAgICB3cy5TZXRWYWx1ZSgxLCAyLCAxKTsKKyAgICAgICAgd3MuU2V0VmFsdWUoMiwgMiwgMik7CisgICAgICAgIHdzLlNldFZhbHVlKDMsIDIsIDMpOworICAgICAgICB3cy5TZXRWYWx1ZSg0LCAyLCA0KTsKKworICAgICAgICB2YXIgY2Y1ID0gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEZpdmVJY29uU2V0KHdzLkNlbGxzWyJDMTpDNSJdLGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzVJY29uc1NldFR5cGUuUXVhcnRlcnMpOworICAgICAgICBjZjUuSWNvbjEuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07CisgICAgICAgIGNmNS5JY29uMS5WYWx1ZSA9IDE7CisgICAgICAgIGNmNS5JY29uMi5UeXBlID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bTsKKyAgICAgICAgY2Y1Lkljb24yLlZhbHVlID0gMjsKKyAgICAgICAgY2Y1Lkljb24zLlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtOworICAgICAgICBjZjUuSWNvbjMuVmFsdWUgPSAzOworICAgICAgICBjZjUuSWNvbjQuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07CisgICAgICAgIGNmNS5JY29uNC5WYWx1ZSA9IDQ7CisgICAgICAgIGNmNS5JY29uNS5UeXBlID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bTsKKyAgICAgICAgY2Y1Lkljb241LlZhbHVlID0gNTsKKyAgICAgICAgY2Y1LlNob3dWYWx1ZSA9IGZhbHNlOworICAgICAgICBjZjUuUmV2ZXJzZSA9IHRydWU7CisKKyAgICAgICAgd3MuU2V0VmFsdWUoMSwgMywgMSk7CisgICAgICAgIHdzLlNldFZhbHVlKDIsIDMsIDIpOworICAgICAgICB3cy5TZXRWYWx1ZSgzLCAzLCAzKTsKKyAgICAgICAgd3MuU2V0VmFsdWUoNCwgMywgNCk7CisgICAgICAgIHdzLlNldFZhbHVlKDUsIDMsIDUpOyAgICAKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RUU19GYWlsaW5nVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RUU19GYWlsaW5nVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5YjI3YgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRFRTX0ZhaWxpbmdUZXN0cy5jcwpAQCAtMCwwICsxLDQ5IEBACivvu791c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRFRTX0ZhaWxpbmdUZXN0cworICAgIHsKKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlV29ya3NoZWV0V2l0aFJlZmVyZW5jZWRJbWFnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgib3JpZ2luYWwiKTsKKyAgICAgICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMxIiwgUHJvcGVydGllcy5SZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvcHkoIm9yaWdpbmFsIiwgImNvcHkiKTsKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zLlBvc2l0aW9uID0gMDsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG1zKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sib3JpZ2luYWwiXTsKKyAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5EZWxldGUod3MpOworICAgICAgICAgICAgICAgIHBjay5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29weUFuZERlbGV0ZVdvcmtzaGVldFdpdGhJbWFnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgib3JpZ2luYWwiKTsKKyAgICAgICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMxIiwgUHJvcGVydGllcy5SZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvcHkoIm9yaWdpbmFsIiwgImNvcHkiKTsKKyAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5EZWxldGUod3MpOworICAgICAgICAgICAgICAgIHBjay5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0N1c3RvbVZhbGlkYXRpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vQ3VzdG9tVmFsaWRhdGlvblRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTIxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0N1c3RvbVZhbGlkYXRpb25UZXN0cy5jcwpAQCAtMCwwICsxLDQ2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24KK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBDdXN0b21WYWxpZGF0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDdXN0b21WYWxpZGF0aW9uX0Zvcm11bGFJc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEN1c3RvbVZhbGlkYXRpb24oIkExIik7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCh2YWxpZGF0aW9uLkZvcm11bGEpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEN1c3RvbVZhbGlkYXRpb25fU2hvdWxkVGhyb3dFeGNlcHRpb25JZkZvcm11bGFJc1Rvb0xvbmcoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCAyNTc7IHgrKykgc2IuQXBwZW5kKCJ4Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEN1c3RvbVZhbGlkYXRpb24oIkExIik7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRGF0YVZhbGlkYXRpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRGF0YVZhbGlkYXRpb25UZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQxYzlhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9EYXRhVmFsaWRhdGlvblRlc3RzLmNzCkBAIC0wLDAgKzEsMTUwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwordXNpbmcgU3lzdGVtLklPOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIERhdGFWYWxpZGF0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRhVmFsaWRhdGlvbnNfU2hvdWxkU2V0T3BlcmF0b3JGcm9tRXhpc3RpbmdYbWwoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgIndob2xlIiwgImdyZWF0ZXJUaGFuT3JFcXVhbCIsICIxIik7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmdyZWF0ZXJUaGFuT3JFcXVhbCwgdmFsaWRhdGlvbi5PcGVyYXRvcik7CisgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRhVmFsaWRhdGlvbnNfU2hvdWxkVGhyb3dJZk9wZXJhdG9ySXNFcXVhbEFuZEZvcm11bGExSXNFbXB0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9ucyA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkExIik7CisgICAgICAgICAgICB2YWxpZGF0aW9ucy5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5lcXVhbDsKKyAgICAgICAgICAgIHZhbGlkYXRpb25zLlZhbGlkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldFNob3dFcnJvck1lc3NhZ2VGcm9tRXhpc3RpbmdYbWwoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgIndob2xlIiwgIjEiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA/PyBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldFNob3dJbnB1dE1lc3NhZ2VGcm9tRXhpc3RpbmdYbWwoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgIndob2xlIiwgIjEiLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHZhbGlkYXRpb24uU2hvd0lucHV0TWVzc2FnZSA/PyBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldFByb21wdEZyb21FeGlzdGluZ1htbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAid2hvbGUiLCAiMSIsICJQcm9tcHQiLCAiUHJvbXB0VGl0bGUiLCAiRXJyb3IiLCAiRXJyb3JUaXRsZSIpOworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJQcm9tcHQiLCB2YWxpZGF0aW9uLlByb21wdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldFByb21wdFRpdGxlRnJvbUV4aXN0aW5nWG1sKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ3aG9sZSIsICIxIiwgIlByb21wdCIsICJQcm9tcHRUaXRsZSIsICJFcnJvciIsICJFcnJvclRpdGxlIik7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlByb21wdFRpdGxlIiwgdmFsaWRhdGlvbi5Qcm9tcHRUaXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldEVycm9yRnJvbUV4aXN0aW5nWG1sKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ3aG9sZSIsICIxIiwgIlByb21wdCIsICJQcm9tcHRUaXRsZSIsICJFcnJvciIsICJFcnJvclRpdGxlIik7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkVycm9yIiwgdmFsaWRhdGlvbi5FcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldEVycm9yVGl0bGVGcm9tRXhpc3RpbmdYbWwoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgIndob2xlIiwgIjEiLCAiUHJvbXB0IiwgIlByb21wdFRpdGxlIiwgIkVycm9yIiwgIkVycm9yVGl0bGUiKTsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkludChfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLldob2xlLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRXJyb3JUaXRsZSIsIHZhbGlkYXRpb24uRXJyb3JUaXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFRocm93SWZPcGVyYXRvcklzQmV0d2VlbkFuZEZvcm11bGEySXNFbXB0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZSA9IDE7CisgICAgICAgICAgICB2YWxpZGF0aW9uLk9wZXJhdG9yID0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmJldHdlZW47CisgICAgICAgICAgICB2YWxpZGF0aW9uLlZhbGlkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZEFjY2VwdE9uZUl0ZW1Pbmx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZExpc3RWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcy5BZGQoIjEiKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uVmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uX1Nob3VsZFJlcGxhY2VMYXN0UGFydEluV2hvbGVDb2x1bW5SYW5nZVdpdGhNYXhOdW1iZXJPZlJvd3NPbmVDb2x1bW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbigiQTpBIik7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBIiArIEV4Y2VsUGFja2FnZS5NYXhSb3dzLlRvU3RyaW5nKCksIHZhbGlkYXRpb24uQWRkcmVzcy5BZGRyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uX1Nob3VsZFJlcGxhY2VMYXN0UGFydEluV2hvbGVDb2x1bW5SYW5nZVdpdGhNYXhOdW1iZXJPZlJvd3NEaWZmZXJlbnRDb2x1bW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkE6QiIpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChzdHJpbmcuRm9ybWF0KCJBMTpCezB9IiwgRXhjZWxQYWNrYWdlLk1heFJvd3MpLCB2YWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzcyk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRGVjaW1hRGF0YVZhbGlkYXRpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRGVjaW1hRGF0YVZhbGlkYXRpb25UZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzJiYzZmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9EZWNpbWFEYXRhVmFsaWRhdGlvblRlc3RzLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIERlY2ltYURhdGFWYWxpZGF0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIF92YWxpZGF0aW9uOworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgICAgICBfdmFsaWRhdGlvbiA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uRGF0YVZhbGlkYXRpb25zLkFkZERlY2ltYWxWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7CisgICAgICAgICAgICBfdmFsaWRhdGlvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGVjaW1hbERhdGFWYWxpZGF0aW9uX0Zvcm11bGExSXNTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKF92YWxpZGF0aW9uLkZvcm11bGEpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlY2ltYWxEYXRhVmFsaWRhdGlvbl9Gb3JtdWxhMklzU2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChfdmFsaWRhdGlvbi5Gb3JtdWxhMik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0V4Y2VsVGltZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9FeGNlbFRpbWVUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVjNjVjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9FeGNlbFRpbWVUZXN0cy5jcwpAQCAtMCwwICsxLDE1MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEV4Y2VsVGltZVRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIEV4Y2VsVGltZSBfdGltZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJIb3VyID0gMzYwMDsKKyAgICAgICAvLyBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWwgSG91cnNQZXJEYXkgPSAyNDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJEYXkgPSAzNjAwICogMjQ7CisKKyAgICAgICAgcHJpdmF0ZSBkZWNpbWFsIFJvdW5kKGRlY2ltYWwgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXRoLlJvdW5kKHZhbHVlLCBFeGNlbFRpbWUuTnVtYmVyT2ZEZWNpbWFscyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3RpbWUgPSBuZXcgRXhjZWxUaW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfdGltZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX0NvbnN0cnVjdG9yV2l0aFZhbHVlX1Nob3VsZFRocm93SWZWYWx1ZUlzTGVzc1RoYW4wKCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEV4Y2VsVGltZSgtMSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX0NvbnN0cnVjdG9yV2l0aFZhbHVlX1Nob3VsZFRocm93SWZWYWx1ZUlzRXF1YWxUb09yR3JlYXRlclRoYW4xKCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEV4Y2VsVGltZSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Ib3VyX1Nob3VsZFRocm93SWZOZWdhdGl2ZVZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3RpbWUuSG91ciA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX01pbnV0ZV9TaG91bGRUaHJvd0lmTmVnYXRpdmVWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90aW1lLk1pbnV0ZSA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX01pbnV0ZV9TaG91bGRUaHJvd0lWYWx1ZUlzR3JlYXRlclRoYW41OSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90aW1lLk1pbnV0ZSA9IDYwOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX1NlY29uZF9TaG91bGRUaHJvd0lmTmVnYXRpdmVWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90aW1lLlNlY29uZCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX1NlY29uZF9TaG91bGRUaHJvd0lWYWx1ZUlzR3JlYXRlclRoYW41OSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90aW1lLlNlY29uZCA9IDYwOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX1RvRXhjZWxUaW1lX0hvdXJJc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3RpbWUuSG91ciA9IDE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFJvdW5kKFNlY29uZHNQZXJIb3VyL1NlY29uZHNQZXJEYXkpLCBfdGltZS5Ub0V4Y2VsVGltZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Ub0V4Y2VsVGltZV9NaW51dGVJc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIGRlY2ltYWwgZXhwZWN0ZWQgPSBTZWNvbmRzUGVySG91ciArICgyME0gKiA2ME0pOworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfdGltZS5Ib3VyID0gMTsKKyAgICAgICAgICAgIF90aW1lLk1pbnV0ZSA9IDIwOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChSb3VuZChleHBlY3RlZC9TZWNvbmRzUGVyRGF5KSwgX3RpbWUuVG9FeGNlbFRpbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhjZWxUaW1lVGVzdHNfVG9FeGNlbFRpbWVfU2Vjb25kSXNTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBkZWNpbWFsIGV4cGVjdGVkID0gU2Vjb25kc1BlckhvdXIgKyAoMjBNICogNjBNKSArIDEwTTsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3RpbWUuSG91ciA9IDE7CisgICAgICAgICAgICBfdGltZS5NaW51dGUgPSAyMDsKKyAgICAgICAgICAgIF90aW1lLlNlY29uZCA9IDEwOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChSb3VuZChleHBlY3RlZCAvIFNlY29uZHNQZXJEYXkpLCBfdGltZS5Ub0V4Y2VsVGltZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Db25zdHJ1Y3RvcldpdGhWYWx1ZV9TaG91bGRTZXRIb3VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgZGVjaW1hbCB2YWx1ZSA9IDM2NjBNLyhkZWNpbWFsKVNlY29uZHNQZXJEYXk7CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRXhjZWxUaW1lKHZhbHVlKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdGltZS5Ib3VyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Db25zdHJ1Y3RvcldpdGhWYWx1ZV9TaG91bGRTZXRNaW51dGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBkZWNpbWFsIHZhbHVlID0gMzY2ME0gLyAoZGVjaW1hbClTZWNvbmRzUGVyRGF5OworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IEV4Y2VsVGltZSh2YWx1ZSk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHRpbWUuTWludXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Db25zdHJ1Y3RvcldpdGhWYWx1ZV9TaG91bGRTZXRTZWNvbmQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBkZWNpbWFsIHZhbHVlID0gMzY2Mk0gLyAoZGVjaW1hbClTZWNvbmRzUGVyRGF5OworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IEV4Y2VsVGltZSh2YWx1ZSk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRpbWUuU2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ3VzdG9tRm9ybXVsYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9DdXN0b21Gb3JtdWxhVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiNDc0MgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ3VzdG9tRm9ybXVsYVRlc3RzLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBDdXN0b21Gb3JtdWxhVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEN1c3RvbUZvcm11bGFfRm9ybXVsYXNGb3JtdWxhSXNTZXRGcm9tWG1sTm9kZUluQ29uc3RydWN0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgImRlY2ltYWwiLCAiQTEiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tKF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9EYXRlVGltZUZvcm11bGFUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRGF0ZVRpbWVGb3JtdWxhVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3ZDg5NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRGF0ZVRpbWVGb3JtdWxhVGVzdHMuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBEYXRlVGltZUZvcm11bGFUZXN0cyA6IFZhbGlkYXRpb25UZXN0QmFzZQorICAgIHsKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldHVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Q2xlYW51cF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsZWFudXBUZXN0RGF0YSgpOworICAgICAgICAgICAgX2RhdGFWYWxpZGF0aW9uTm9kZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0ZVRpbWVGb3JtdWxhX0Zvcm11bGFWYWx1ZUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgdmFyIGRhdGUgPSBEYXRlVGltZS5QYXJzZSgiMjAxMS0wMS0wOCIpOworICAgICAgICAgICAgdmFyIGRhdGVBc1N0cmluZyA9IGRhdGUuVG9PQURhdGUoKS5Ub1N0cmluZyhfY3VsdHVyZUluZm8pOworICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgZGF0ZUFzU3RyaW5nKTsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lKF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuRGVjaW1hbCwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0ZSwgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRlVGltZUZvcm11bGFfRm9ybXVsYXNGb3JtdWxhSXNTZXRGcm9tWG1sTm9kZUluQ29uc3RydWN0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICB2YXIgZGF0ZSA9IERhdGVUaW1lLlBhcnNlKCIyMDExLTAxLTA4Iik7CisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgImRlY2ltYWwiLCAiQTEiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9EZWNpbWFsRm9ybXVsYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9EZWNpbWFsRm9ybXVsYVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzI5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0RlY2ltYWxGb3JtdWxhVGVzdHMuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRGVjaW1hbEZvcm11bGFUZXN0cyA6IFZhbGlkYXRpb25UZXN0QmFzZQorICAgIHsKKworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlY2ltYWxGb3JtdWxhX0Zvcm11bGFWYWx1ZUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgIjEuMyIpOworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWwsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjNELCB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlY2ltYWxGb3JtdWxhX0Zvcm11bGFzRm9ybXVsYUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgIkExIik7CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9JbnRlZ2VyRm9ybXVsYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9JbnRlZ2VyRm9ybXVsYVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OWZmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0ludGVnZXJGb3JtdWxhVGVzdHMuY3MKQEAgLTAsMCArMSw0OSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEludGVnZXJGb3JtdWxhVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEludGVnZXJGb3JtdWxhX0Zvcm11bGFWYWx1ZUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgIjEiKTsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkludChfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLldob2xlLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJbnRlZ2VyRm9ybXVsYV9Gb3JtdWxhc0Zvcm11bGFJc1NldEZyb21YbWxOb2RlSW5Db25zdHJ1Y3RvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAiZGVjaW1hbCIsICJBMSIpOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvTGlzdEZvcm11bGFUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvTGlzdEZvcm11bGFUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZmNmFmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9MaXN0Rm9ybXVsYVRlc3RzLmNzCkBAIC0wLDAgKzEsNjAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBMaXN0Rm9ybXVsYVRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCisgICAgeworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7CisgICAgICAgICAgICBfZGF0YVZhbGlkYXRpb25Ob2RlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMaXN0Rm9ybXVsYV9Gb3JtdWxhVmFsdWVJc1NldEZyb21YbWxOb2RlSW5Db25zdHJ1Y3RvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAibGlzdCIsICJcIjEsMlwiIik7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuTGlzdCwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcy5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTGlzdEZvcm11bGFfRm9ybXVsYVZhbHVlSXNTZXRGcm9tWG1sTm9kZUluQ29uc3RydWN0b3JPcmRlcklzQ29ycmVjdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAibGlzdCIsICJcIjEsMlwiIik7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuTGlzdCwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWl2YWxlbnQobmV3IExpc3Q8c3RyaW5nPnsgIjEiLCAiMiJ9LCAoSUNvbGxlY3Rpb24pdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTGlzdEZvcm11bGFfRm9ybXVsYXNFeGNlbEZvcm11bGFJc1NldEZyb21YbWxOb2RlSW5Db25zdHJ1Y3RvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAibGlzdCIsICJBMSIpOworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uTGlzdChfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkxpc3QsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9UaW1lRm9ybXVsYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9UaW1lRm9ybXVsYVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTMyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL1RpbWVGb3JtdWxhVGVzdHMuY3MKQEAgLTAsMCArMSw2NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRpbWVGb3JtdWxhVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUaW1lRm9ybXVsYV9WYWx1ZUlzU2V0RnJvbUNvbnN0cnVjdG9yVmFsaWRhdGVIb3VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRXhjZWxUaW1lKDAuNjc1TSk7CisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgInRpbWUiLCAiMC42NzUiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgZm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVGltZShfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGltZS5Ib3VyLCBmb3JtdWxhLkZvcm11bGEuVmFsdWUuSG91cik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGltZUZvcm11bGFfVmFsdWVJc1NldEZyb21Db25zdHJ1Y3RvclZhbGlkYXRlTWludXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRXhjZWxUaW1lKDAuMzk1TSk7CisgICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgInRpbWUiLCAiMC4zOTUiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgZm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVGltZShfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGltZS5NaW51dGUsIGZvcm11bGEuRm9ybXVsYS5WYWx1ZS5NaW51dGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRpbWVGb3JtdWxhX1ZhbHVlSXNTZXRGcm9tQ29uc3RydWN0b3JWYWxpZGF0ZVNlY29uZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IEV4Y2VsVGltZSgwLjgxMk0pOworICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ0aW1lIiwgIjAuODEyIik7CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIGZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5UaW1lLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRpbWUuU2Vjb25kLlZhbHVlLCBmb3JtdWxhLkZvcm11bGEuVmFsdWUuU2Vjb25kLlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vSW50ZWdyYXRpb25UZXN0cy9JbnRlZ3JhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9JbnRlZ3JhdGlvblRlc3RzL0ludGVncmF0aW9uVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwYWNiNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vSW50ZWdyYXRpb25UZXN0cy9JbnRlZ3JhdGlvblRlc3RzLmNzCkBAIC0wLDAgKzEsMTM3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPZmZpY2VPcGVuWG1sOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbi5JbnRlZ3JhdGlvblRlc3RzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZW1vdmUgdGhlIElnbm9yZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHRlc3RtZXRob2RzIGlmIHlvdSB3YW50IHRvIHJ1biBhbnkgb2YgdGhlc2UgdGVzdHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEludGVncmF0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19BZGRPbmVWYWxpZGF0aW9uT2ZUeXBlV2hvbGUoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JTdHlsZSA9IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuc3RvcDsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JUaXRsZSA9ICJJbnZhbGlkIHZhbHVlIHdhcyBlbnRlcmVkIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uUHJvbXB0VGl0bGUgPSAiRW50ZXIgdmFsdWUgaGVyZSI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLk9wZXJhdG9yID0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmdyZWF0ZXJUaGFuOworICAgICAgICAgICAgLy92YWxpZGF0aW9uLlZhbHVlLlZhbHVlID0gMzsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEgPSAiQjEiOworCisgICAgICAgICAgICBfcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEdldFRlc3RPdXRwdXRQYXRoKCJBZGRPbmVWYWxpZGF0aW9uT2ZUeXBlV2hvbGUueGxzeCIpKSk7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX0FkZE9uZVZhbGlkYXRpb25PZlR5cGVEZWNpbWFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERlY2ltYWxWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JTdHlsZSA9IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuc3RvcDsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JUaXRsZSA9ICJJbnZhbGlkIHZhbHVlIHdhcyBlbnRlcmVkIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3IgPSAiVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMS40IjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uUHJvbXB0VGl0bGUgPSAiRW50ZXIgdmFsdWUgaGVyZSI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdCA9ICJFbnRlciBhIHZhbHVlIHRoYXQgaXMgZ3JlYXRlciB0aGFuIDEuNCI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dJbnB1dE1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5ncmVhdGVyVGhhbjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZSA9IDEuNDsKKworICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhHZXRUZXN0T3V0cHV0UGF0aCgiQWRkT25lVmFsaWRhdGlvbk9mVHlwZURlY2ltYWwueGxzeCIpKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX0FkZE9uZVZhbGlkYXRpb25PZlR5cGVMaXN0T2ZUeXBlTGlzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbigiQTpBIik7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dFcnJvck1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93SW5wdXRNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZXMuQWRkKCIxIik7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzLkFkZCgiMiIpOworICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcy5BZGQoIjMiKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uVmFsaWRhdGUoKTsKKworICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhHZXRUZXN0T3V0cHV0UGF0aCgiQWRkT25lVmFsaWRhdGlvbk9mVHlwZUxpc3QueGxzeCIpKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX0FkZE9uZVZhbGlkYXRpb25PZlR5cGVMaXN0T2ZUeXBlVGltZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRUaW1lVmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dJbnB1dE1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlLkhvdXIgPSAxNDsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZS5NaW51dGUgPSAzMDsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uT3BlcmF0b3IgPSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuZ3JlYXRlclRoYW47CisgICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdCA9ICJFbnRlciBhIHRpbWUgZ3JlYXRlciB0aGFuIDE0OjMwIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3IgPSAiSW52YWxpZCB0aW1lIHdhcyBlbnRlcmVkIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uVmFsaWRhdGUoKTsKKworICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhHZXRUZXN0T3V0cHV0UGF0aCgiQWRkT25lVmFsaWRhdGlvbk9mVHlwZVRpbWUueGxzeCIpKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRhVmFsaWRhdGlvbnNfUmVhZEV4aXN0aW5nV29ya2Jvb2tXaXRoRGF0YVZhbGlkYXRpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oR2V0VGVzdE91dHB1dFBhdGgoIkRWVGVzdC54bHN4IikpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIEJ1Z19PcGVuT2ZmaWNlKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciB4bHNQYXRoID0gR2V0VGVzdE91dHB1dFBhdGgoIk9wZW5PZmZpY2UueGxzeCIpOworICAgICAgICAvLyAgICB2YXIgbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyh4bHNQYXRoKTsKKyAgICAgICAgLy8gICAgaWYoIG5ld0ZpbGUuRXhpc3RzKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOworICAgICAgICAvLyAgICAgICAgLy9lbnN1cmVzIHdlIGNyZWF0ZSBhIG5ldyB3b3JrYm9vaworICAgICAgICAvLyAgICAgICAgbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyh4bHNQYXRoKTsKKworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHVzaW5nKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgLy8gYWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgZW1wdHkgd29ya2Jvb2sKKyAgICAgICAgLy8gICAgICAgIHZhciB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJbnZlbnRvcnkiKTsKKyAgICAgICAgLy8gICAgICAgIC8vIEFkZCB0aGUgaGVhZGVycworICAgICAgICAvLyAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDFdLlZhbHVlID0gIklEIjsKKyAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAyXS5WYWx1ZSA9ICJQcm9kdWN0IjsKKyAgICAgICAgLy8vLyAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDNdLlZhbHVlID0gIlF1YW50aXR5IjsKKyAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA0XS5WYWx1ZSA9ICJQcmljZSI7CisKKyAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJWYWx1ZSI7CisKKyAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMSkuV2lkdGggPSAxNTsKKyAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMikuV2lkdGggPSAxMjsKKyAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMykuV2lkdGggPSAxMjsKKworICAgICAgICAvLyAgICAgICAgd29ya3NoZWV0LlZpZXcuUGFnZUxheW91dFZpZXcgPSB0cnVlOworCisgICAgICAgIC8vICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiSW52ZXJ0b3J5IjsKKyAgICAgICAgLy8gICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5BdXRob3IgPSAiSmFuIEvDpGxsbWFuIjsKKyAgICAgICAgLy8gICAgICAgIHBhY2thZ2UuU2F2ZSgpOworICAgICAgICAvLyAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0xpc3REYXRhVmFsaWRhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9MaXN0RGF0YVZhbGlkYXRpb25UZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg3MjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9MaXN0RGF0YVZhbGlkYXRpb25UZXN0cy5jcwpAQCAtMCwwICsxLDUyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIExpc3REYXRhVmFsaWRhdGlvblRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCisgICAgeworICAgICAgICBwcml2YXRlIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCBfdmFsaWRhdGlvbjsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOworICAgICAgICAgICAgX3ZhbGlkYXRpb24gPSBfc2hlZXQuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EYXRhVmFsaWRhdGlvbnMuQWRkTGlzdFZhbGlkYXRpb24oIkExIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMaXN0RGF0YVZhbGlkYXRpb25fRm9ybXVsYUlzU2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChfdmFsaWRhdGlvbi5Gb3JtdWxhKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMaXN0RGF0YVZhbGlkYXRpb25fV2hlbk9uZUl0ZW1Jc0FkZGVkQ291bnRJczEoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF92YWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzLkFkZCgidGVzdCIpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBfdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcy5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgTGlzdERhdGFWYWxpZGF0aW9uX1Nob3VsZFRocm93V2hlbk5vRm9ybXVsYU9yVmFsdWVJc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF92YWxpZGF0aW9uLlZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1JhbmdlQmFzZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9SYW5nZUJhc2VUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzM2YzIzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9SYW5nZUJhc2VUZXN0cy5jcwpAQCAtMCwwICsxLDE0NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgUmFuZ2VCYXNlVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkSW50ZWdlclZhbGlkYXRpb25fVmFsaWRhdGlvbklzQWRkZWQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VCYXNlX0FkZEludGVnZXJWYWxpZGF0aW9uX0FkZHJlc3NJc0NvcnJlY3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExOkEyIiwgX3NoZWV0LkRhdGFWYWxpZGF0aW9uc1swXS5BZGRyZXNzLkFkZHJlc3MpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZGREZWNpbWFsVmFsaWRhdGlvbl9WYWxpZGF0aW9uSXNBZGRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJBMTpBMiJdLkRhdGFWYWxpZGF0aW9uLkFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkRGVjaW1hbFZhbGlkYXRpb25fQWRkcmVzc0lzQ29ycmVjdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJBMTpBMiJdLkRhdGFWYWxpZGF0aW9uLkFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QTIiLCBfc2hlZXQuRGF0YVZhbGlkYXRpb25zWzBdLkFkZHJlc3MuQWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VCYXNlX0FkZFRleHRMZW5ndGhWYWxpZGF0aW9uX1ZhbGlkYXRpb25Jc0FkZGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGV4dExlbmd0aERhdGFWYWxpZGF0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZGRUZXh0TGVuZ3RoVmFsaWRhdGlvbl9BZGRyZXNzSXNDb3JyZWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGV4dExlbmd0aERhdGFWYWxpZGF0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMF0uQWRkcmVzcy5BZGRyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkRGF0ZVRpbWVWYWxpZGF0aW9uX1ZhbGlkYXRpb25Jc0FkZGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkRGF0ZVRpbWVEYXRhVmFsaWRhdGlvbigpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkRGF0ZVRpbWVWYWxpZGF0aW9uX0FkZHJlc3NJc0NvcnJlY3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGREYXRlVGltZURhdGFWYWxpZGF0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMF0uQWRkcmVzcy5BZGRyZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkTGlzdFZhbGlkYXRpb25fVmFsaWRhdGlvbklzQWRkZWQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VCYXNlX0FkZExpc3RWYWxpZGF0aW9uX0FkZHJlc3NJc0NvcnJlY3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExOkEyIiwgX3NoZWV0LkRhdGFWYWxpZGF0aW9uc1swXS5BZGRyZXNzLkFkZHJlc3MpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZFRpbWVWYWxpZGF0aW9uX1ZhbGlkYXRpb25Jc0FkZGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGltZURhdGFWYWxpZGF0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZGRUaW1lVmFsaWRhdGlvbl9BZGRyZXNzSXNDb3JyZWN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGltZURhdGFWYWxpZGF0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMF0uQWRkcmVzcy5BZGRyZXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vVmFsaWRhdGlvbkNvbGxlY3Rpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vVmFsaWRhdGlvbkNvbGxlY3Rpb25UZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY1ODVhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9WYWxpZGF0aW9uQ29sbGVjdGlvblRlc3RzLmNzCkBAIC0wLDAgKzEsMTM5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbGxlY3Rpb25UZXN0cyA6IFZhbGlkYXRpb25UZXN0QmFzZQorICAgIHsKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldHVwVGVzdERhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Q2xlYW51cF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsZWFudXBUZXN0RGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fQWRkRGVjaW1hbF9TaG91bGRUaHJvd1doZW5BZGRyZXNzSXNOdWxsT3JFbXB0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbihzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0FkZERlY2ltYWxfU2hvdWxkVGhyb3dXaGVuTmV3VmFsaWRhdGlvbkNvbGxpZGVzV2l0aEV4aXN0aW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERlY2ltYWxWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbl9BZGRJbnRlZ2VyX1Nob3VsZFRocm93V2hlbk5ld1ZhbGlkYXRpb25Db2xsaWRlc1dpdGhFeGlzdGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkExIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fQWRkVGV4dExlbmd0aF9TaG91bGRUaHJvd1doZW5OZXdWYWxpZGF0aW9uQ29sbGlkZXNXaXRoRXhpc3RpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkVGV4dExlbmd0aFZhbGlkYXRpb24oIkExIik7CisgICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZFRleHRMZW5ndGhWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0FkZERhdGVUaW1lX1Nob3VsZFRocm93V2hlbk5ld1ZhbGlkYXRpb25Db2xsaWRlc1dpdGhFeGlzdGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkExIik7CisgICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbl9JbmRleF9TaG91bGRSZXR1cm5JdGVtQXRJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkEyIik7CisgICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQjEiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9uc1sxXTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEyIiwgcmVzdWx0LkFkZHJlc3MuQWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fRmluZEFsbF9TaG91bGRSZXR1cm5WYWxpZGF0aW9uSW5Db2x1bW5Bb25seSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkEyIik7CisgICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQjEiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5GaW5kQWxsKHggPT4geC5BZGRyZXNzLkFkZHJlc3MuU3RhcnRzV2l0aCgiQSIpKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LkNvdW50KCkpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fRmluZF9TaG91bGRSZXR1cm5GaXJzdE1hdGNoT25seSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOworICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkEyIik7CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuRmluZCh4ID0+IHguQWRkcmVzcy5BZGRyZXNzLlN0YXJ0c1dpdGgoIkEiKSk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHJlc3VsdC5BZGRyZXNzLkFkZHJlc3MpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fQ2xlYXJfU2hvdWxkQmVFbXB0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ2xlYXIoKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbl9SZW1vdmVBbGxfU2hvdWxkUmVtb3ZlTWF0Y2hpbmdFbnRyaWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkEyIik7CisgICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJCMSIpOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuUmVtb3ZlQWxsKHggPT4geC5BZGRyZXNzLkFkZHJlc3MuU3RhcnRzV2l0aCgiQiIpKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0QmFzZS5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzVmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0QmFzZS5jcwpAQCAtMCwwICsxLDEwNyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24KK3sKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGlvblRlc3RCYXNlCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcm90ZWN0ZWQgRXhjZWxXb3Jrc2hlZXQgX3NoZWV0OworICAgICAgICBwcm90ZWN0ZWQgWG1sTm9kZSBfZGF0YVZhbGlkYXRpb25Ob2RlOworICAgICAgICBwcm90ZWN0ZWQgWG1sTmFtZXNwYWNlTWFuYWdlciBfbmFtZXNwYWNlTWFuYWdlcjsKKyAgICAgICAgcHJvdGVjdGVkIEN1bHR1cmVJbmZvIF9jdWx0dXJlSW5mbzsKKworICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cFRlc3REYXRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICBfc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgX2N1bHR1cmVJbmZvID0gbmV3IEN1bHR1cmVJbmZvKCJlbi1VUyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cFRlc3REYXRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBudWxsOworICAgICAgICAgICAgX3NoZWV0ID0gbnVsbDsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgR2V0VGVzdE91dHB1dFBhdGgoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUGF0aC5Db21iaW5lKEVudmlyb25tZW50LkdldEZvbGRlclBhdGgoRW52aXJvbm1lbnQuU3BlY2lhbEZvbGRlci5EZXNrdG9wKSwgZmlsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgU2F2ZVRlc3RPdXRwdXQoc3RyaW5nIGZpbGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGF0aCA9IEdldFRlc3RPdXRwdXRQYXRoKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9wYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8ocGF0aCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgTG9hZFhtbFRlc3REYXRhKHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgdmFsaWRhdGlvblR5cGUsIHN0cmluZyBmb3JtdWxhMVZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlciA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKHhtbERvYy5OYW1lVGFibGUpOworICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIuQWRkTmFtZXNwYWNlKCJkIiwgInVybjphIik7CisgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZGF0YVZhbGlkYXRpb24geG1sbnM6ZD1cInVybjphXCIgdHlwZT1cInswfVwiIHNxcmVmPVwiezF9XCI+IiwgdmFsaWRhdGlvblR5cGUsIGFkZHJlc3MpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZDpmb3JtdWxhMT57MH08L2Q6Zm9ybXVsYTE+IiwgZm9ybXVsYTFWYWx1ZSk7CisgICAgICAgICAgICBzYi5BcHBlbmQoIjwvZGF0YVZhbGlkYXRpb24+Iik7CisgICAgICAgICAgICB4bWxEb2MuTG9hZFhtbChzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSB4bWxEb2MuRG9jdW1lbnRFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgTG9hZFhtbFRlc3REYXRhKHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgdmFsaWRhdGlvblR5cGUsIHN0cmluZyBvcGVyYXRvck5hbWUsIHN0cmluZyBmb3JtdWxhMVZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlciA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKHhtbERvYy5OYW1lVGFibGUpOworICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIuQWRkTmFtZXNwYWNlKCJkIiwgInVybjphIik7CisgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZGF0YVZhbGlkYXRpb24geG1sbnM6ZD1cInVybjphXCIgdHlwZT1cInswfVwiIHNxcmVmPVwiezF9XCIgb3BlcmF0b3I9XCJ7Mn1cIj4iLCB2YWxpZGF0aW9uVHlwZSwgYWRkcmVzcywgb3BlcmF0b3JOYW1lKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiPGQ6Zm9ybXVsYTE+ezB9PC9kOmZvcm11bGExPiIsIGZvcm11bGExVmFsdWUpOworICAgICAgICAgICAgc2IuQXBwZW5kKCI8L2RhdGFWYWxpZGF0aW9uPiIpOworICAgICAgICAgICAgeG1sRG9jLkxvYWRYbWwoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBfZGF0YVZhbGlkYXRpb25Ob2RlID0geG1sRG9jLkRvY3VtZW50RWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIExvYWRYbWxUZXN0RGF0YShzdHJpbmcgYWRkcmVzcywgc3RyaW5nIHZhbGlkYXRpb25UeXBlLCBzdHJpbmcgZm9ybXVsYTFWYWx1ZSwgYm9vbCBzaG93RXJyb3JNc2csIGJvb2wgc2hvd0lucHV0TXNnKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlciA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKHhtbERvYy5OYW1lVGFibGUpOworICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIuQWRkTmFtZXNwYWNlKCJkIiwgInVybjphIik7CisgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZGF0YVZhbGlkYXRpb24geG1sbnM6ZD1cInVybjphXCIgdHlwZT1cInswfVwiIHNxcmVmPVwiezF9XCIgIiwgdmFsaWRhdGlvblR5cGUsIGFkZHJlc3MpOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCIgc2hvd0Vycm9yTWVzc2FnZT1cInswfVwiIHNob3dJbnB1dE1lc3NhZ2U9XCJ7MX1cIj4iLCBzaG93RXJyb3JNc2cgPyAxIDogMCwgc2hvd0lucHV0TXNnID8gMSA6IDApOworICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZDpmb3JtdWxhMT57MH08L2Q6Zm9ybXVsYTE+IiwgZm9ybXVsYTFWYWx1ZSk7CisgICAgICAgICAgICBzYi5BcHBlbmQoIjwvZGF0YVZhbGlkYXRpb24+Iik7CisgICAgICAgICAgICB4bWxEb2MuTG9hZFhtbChzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSB4bWxEb2MuRG9jdW1lbnRFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgTG9hZFhtbFRlc3REYXRhKHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgdmFsaWRhdGlvblR5cGUsIHN0cmluZyBmb3JtdWxhMVZhbHVlLCBzdHJpbmcgcHJvbXB0LCBzdHJpbmcgcHJvbXB0VGl0bGUsIHN0cmluZyBlcnJvciwgc3RyaW5nIGVycm9yVGl0bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIoeG1sRG9jLk5hbWVUYWJsZSk7CisgICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoImQiLCAidXJuOmEiKTsKKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjxkYXRhVmFsaWRhdGlvbiB4bWxuczpkPVwidXJuOmFcIiB0eXBlPVwiezB9XCIgc3FyZWY9XCJ7MX1cIiIsIHZhbGlkYXRpb25UeXBlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiIHByb21wdD1cInswfVwiIHByb21wdFRpdGxlPVwiezF9XCIiLCBwcm9tcHQsIHByb21wdFRpdGxlKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiIGVycm9yPVwiezB9XCIgZXJyb3JUaXRsZT1cInsxfVwiPiIsIGVycm9yLCBlcnJvclRpdGxlKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiPGQ6Zm9ybXVsYTE+ezB9PC9kOmZvcm11bGExPiIsIGZvcm11bGExVmFsdWUpOworICAgICAgICAgICAgc2IuQXBwZW5kKCI8L2RhdGFWYWxpZGF0aW9uPiIpOworICAgICAgICAgICAgeG1sRG9jLkxvYWRYbWwoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBfZGF0YVZhbGlkYXRpb25Ob2RlID0geG1sRG9jLkRvY3VtZW50RWxlbWVudDsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRBeGlzVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0QXhpc1Rlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhZGUwMgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0QXhpc1Rlc3QuY3MKQEAgLTAsMCArMSw2OSBAQAor77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkRyYXdpbmcuQ2hhcnQKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0QXhpc1Rlc3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxDaGFydEF4aXMgYXhpczsKKyAgICAgICAgCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIHZhciB4bWxOc20gPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihuZXcgTmFtZVRhYmxlKCkpOworICAgICAgICAgICAgeG1sTnNtLkFkZE5hbWVzcGFjZSgiYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7CisgICAgICAgICAgICBheGlzID0gbmV3IEV4Y2VsQ2hhcnRBeGlzKHhtbE5zbSwgeG1sRG9jLkNyZWF0ZUVsZW1lbnQoImF4aXMiKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3Jvc3Nlc0F0X1NldFRvMl9JczIoKQorICAgICAgICB7CisgICAgICAgICAgICBheGlzLkNyb3NzZXNBdCA9IDI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYXhpcy5Dcm9zc2VzQXQsIDIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyb3NzZXNBdF9TZXRUbzFFTWludXM2X0lzMUVNaW51czYoKQorICAgICAgICB7CisgICAgICAgICAgICBheGlzLkNyb3NzZXNBdCA9IDEuMmUtNjsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChheGlzLkNyb3NzZXNBdCwgMS4yZS02KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNaW5WYWx1ZV9TZXRUbzJfSXMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXhpcy5NaW5WYWx1ZSA9IDI7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYXhpcy5NaW5WYWx1ZSwgMik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWluVmFsdWVfU2V0VG8xRU1pbnVzNl9JczFFTWludXM2KCkKKyAgICAgICAgeworICAgICAgICAgICAgYXhpcy5NaW5WYWx1ZSA9IDEuMmUtNjsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChheGlzLk1pblZhbHVlLCAxLjJlLTYpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heFZhbHVlX1NldFRvMl9JczIoKQorICAgICAgICB7CisgICAgICAgICAgICBheGlzLk1heFZhbHVlID0gMjsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChheGlzLk1heFZhbHVlLCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNYXhWYWx1ZV9TZXRUbzFFTWludXM2X0lzMUVNaW51czYoKQorICAgICAgICB7CisgICAgICAgICAgICBheGlzLk1heFZhbHVlID0gMS4yZS02OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGF4aXMuTWF4VmFsdWUsIDEuMmUtNik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RyYXdpbmdUZXN0LmNzIGIvRVBQbHVzVGVzdC9EcmF3aW5nVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDgyZTVkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9EcmF3aW5nVGVzdC5jcwpAQCAtMCwwICsxLDkwNSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgRVBQbHVzVGVzdC5Qcm9wZXJ0aWVzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFN1bW1hcnkgZGVzY3JpcHRpb24gZm9yIFVuaXRUZXN0MQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRHJhd2luZ1Rlc3QgOiBUZXN0QmFzZQorICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJ1bkRyYXdpbmdUZXN0cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJhckNoYXJ0KCk7CisgICAgICAgICAgICBDb2x1bW4oKTsKKyAgICAgICAgICAgIENvbmUoKTsKKyAgICAgICAgICAgIERvdWdudXQoKTsKKyAgICAgICAgICAgIERyYXdpbmdzKCk7CisgICAgICAgICAgICBMaW5lKCk7CisgICAgICAgICAgICBMaW5lTWFya2VyKCk7CisgICAgICAgICAgICBQaWVDaGFydCgpOworICAgICAgICAgICAgUGllQ2hhcnQzRCgpOworICAgICAgICAgICAgUHlyYW1pZCgpOworICAgICAgICAgICAgU2NhdHRlcigpOworICAgICAgICAgICAgQnViYmxlKCk7CisgICAgICAgICAgICBSYWRhcigpOworICAgICAgICAgICAgU3VyZmFjZSgpOworICAgICAgICAgICAgTGluZTJUZXN0KCk7CisgICAgICAgICAgICBNdWx0aUNoYXJ0U2VyaWVzKCk7CisgICAgICAgICAgICBEcmF3aW5nU2l6aW5nQW5kUG9zaXRpb25pbmcoKTsKKyAgICAgICAgICAgIERlbGV0ZURyYXdpbmcoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU2F2ZVdvcmtzaGVldCgiRHJhd2luZy54bHN4Iik7CisKKyAgICAgICAgICAgIFJlYWREb2N1bWVudCgpOworICAgICAgICAgICAgUmVhZERyYXdpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWREcmF3aW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIEAiRHJhd2luZy54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJQeXJhbWlkIl07CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkNlbGxzWyJWMjQiXS5WYWx1ZSwgMTA0RCk7CisgICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siU2NhdHRlciJdOworICAgICAgICAgICAgICAgIHZhciBjaHQgPSB3cy5EcmF3aW5nc1siU2NhdHRlckNoYXJ0MSJdIGFzIEV4Y2VsU2NhdHRlckNoYXJ0OworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChjaHQuVGl0bGUuVGV4dCwgIkhlYWRlciAgVGV4dCIpOworICAgICAgICAgICAgICAgIGNodC5UaXRsZS5UZXh0ID0gIlRlc3QiOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChjaHQuVGl0bGUuVGV4dCwgIlRlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBpY3R1cmUoKQorICAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGljdHVyZSIpOworICAgICAgICAgICAgdmFyIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBSZXNvdXJjZXMuVGVzdDEpOworCisgICAgICAgICAgICBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMyIiwgUmVzb3VyY2VzLlRlc3QxKTsKKyAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbigxNTAsIDIwMCk7CisgICAgICAgICAgICBwaWMuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuU29saWQ7CisgICAgICAgICAgICBwaWMuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5EYXJrQ3lhbjsKKyAgICAgICAgICAgIHBpYy5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7CisgICAgICAgICAgICBwaWMuRmlsbC5Db2xvciA9IENvbG9yLldoaXRlOworICAgICAgICAgICAgcGljLkZpbGwuVHJhbnNwYXJhbmN5ID0gNTA7CisKKyAgICAgICAgICAgIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzMiLCBSZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgcGljLlNldFBvc2l0aW9uKDQwMCwgMjAwKTsKKyAgICAgICAgICAgIHBpYy5TZXRTaXplKDE1MCk7CisKKyAgICAgICAgICAgIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzQiLCBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKF9jbGlwYXJ0UGF0aCwgIlZlY3RvciBEcmF3aW5nLndtZiIpKSk7CisgICAgICAgICAgICBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWM1IiwgbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsIkJpdG1hcEltYWdlLmdpZiIpKSk7CisgICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oNDAwLCAyMDApOworICAgICAgICAgICAgcGljLlNldFNpemUoMTUwKTsKKworICAgICAgICAgICAgd3MuQ29sdW1uKDEpLldpZHRoID0gNTM7CisgICAgICAgICAgICB3cy5Db2x1bW4oNCkuV2lkdGggPSA1ODsKKworICAgICAgICAgICAgcGljID0gd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljNsO2w6TDpSIsIG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoX2NsaXBhcnRQYXRoLCAiQml0bWFwSW1hZ2UuZ2lmIikpKTsKKyAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbig0MDAsIDQwMCk7CisgICAgICAgICAgICBwaWMuU2V0U2l6ZSgxMDApOworCisgICAgICAgICAgICAgdmFyIHdzMiA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpY3R1cmUyIik7CisgICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oQCJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBPZmZpY2VcQ0xJUEFSVFxQVUI2MENPUlxBRzAwMDIxXy5HSUYiKTsKKyAgICAgICAgICAgIGlmIChmaS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljID0gd3MyLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzciLCBmaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdENvbnRleHQuV3JpdGVMaW5lKCJBRzAwMDIxXy5HSUYgZG9lcyBub3QgZXhpc3RzLiBTa2lwaW5nIFBpYzcuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciB3c0NvcHkgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaWN0dXJlMyIsIHdzMik7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLldvcmtzaGVldHMuRGVsZXRlKHdzMik7CisgICAgICAgICB9CisgICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAgcHVibGljIHZvaWQgRHJhd2luZ1NpemluZ0FuZFBvc2l0aW9uaW5nKCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEcmF3aW5nUG9zU2l6ZSIpOworCisgICAgICAgICAgICAgdmFyIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBSZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbigxLCAwLCAxLCAwKTsKKworICAgICAgICAgICAgIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzIiLCBSZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgIHBpYy5FZGl0QXMgPSBlRWRpdEFzLkFic29sdXRlOworICAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbigxMCwgNSwgMSwgNCk7CisKKyAgICAgICAgICAgICBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMzIiwgUmVzb3VyY2VzLlRlc3QxKTsKKyAgICAgICAgICAgICBwaWMuRWRpdEFzID0gZUVkaXRBcy5Ud29DZWxsOworICAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbigyMCwgNSwgMiwgNCk7CisKKworICAgICAgICAgICAgIHdzLkNvbHVtbigxKS5XaWR0aCA9IDEwMDsKKyAgICAgICAgICAgICB3cy5Db2x1bW4oMykuV2lkdGggPSAxMDA7CisgICAgICAgICB9CisKKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy8gW0lnbm9yZV0KKyAgICAgICAgIHB1YmxpYyB2b2lkIEJhckNoYXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQmFyQ2hhcnQiKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoImJhckNoYXJ0IiwgZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQpIGFzIEV4Y2VsQmFyQ2hhcnQ7CisgICAgICAgICAgICBjaHJ0LlNldFBvc2l0aW9uKDUwLCA1MCk7CisgICAgICAgICAgICBjaHJ0LlNldFNpemUoODAwLCAzMDApOworICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKKyAgICAgICAgICAgIGNocnQuVmFyeUNvbG9ycyA9IHRydWU7CisgICAgICAgICAgICBjaHJ0LlhBeGlzLk9yaWVudGF0aW9uID0gZUF4aXNPcmllbnRhdGlvbi5NYXhNaW47CisgICAgICAgICAgICBjaHJ0LlhBeGlzLk1ham9yVGlja01hcmsgPSBlQXhpc1RpY2tNYXJrLkluOworICAgICAgICAgICAgY2hydC5ZQXhpcy5PcmllbnRhdGlvbiA9IGVBeGlzT3JpZW50YXRpb24uTWF4TWluOworICAgICAgICAgICAgY2hydC5ZQXhpcy5NaW5vclRpY2tNYXJrID0gZUF4aXNUaWNrTWFyay5PdXQ7CisgICAgICAgICAgICBjaHJ0LlNob3dIaWRkZW5EYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuRGlzcGxheUJsYW5rc0FzID0gZURpc3BsYXlCbGFua3NBcy5aZXJvOworICAgICAgICAgICAgY2hydC5UaXRsZS5SaWNoVGV4dC5UZXh0ID0gIkJhcmNoYXJ0IFRlc3QiOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaHJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZCwgIkludmFsaWQgQ2hhcnR0eXBlIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuRGlyZWN0aW9uID09IGVEaXJlY3Rpb24uQmFyLCAiSW52YWxpZCBCYXJkaXJlY3Rpb24iKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2hydC5Hcm91cGluZyA9PSBlR3JvdXBpbmcuQ2x1c3RlcmVkLCAiSW52YWxpZCBHcm91cGluZyIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaHJ0LlNoYXBlID09IGVTaGFwZS5Cb3gsICJJbnZhbGlkIFNoYXBlIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZFRlc3RTZXJpZShFeGNlbFdvcmtzaGVldCB3cywgRXhjZWxDaGFydCBjaHJ0KQorICAgICAgICB7CisgICAgICAgICAgICBBZGRUZXN0RGF0YSh3cyk7CisgICAgICAgICAgICBjaHJ0LlNlcmllcy5BZGQoIiciICsgd3MuTmFtZSArICInIVYxOTpWMjQiLCAiJyIgKyB3cy5OYW1lICsgIichVTE5OlUyNCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRUZXN0RGF0YShFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgICAgeworICAgICAgICAgICAgd3MuQ2VsbHNbIlUxOSJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMDksIDEyLCAzMSk7CisgICAgICAgICAgICB3cy5DZWxsc1siVTIwIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgMSk7CisgICAgICAgICAgICB3cy5DZWxsc1siVTIxIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgMik7CisgICAgICAgICAgICB3cy5DZWxsc1siVTIyIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgMyk7CisgICAgICAgICAgICB3cy5DZWxsc1siVTIzIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgNCk7CisgICAgICAgICAgICB3cy5DZWxsc1siVTI0Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgNSk7CisgICAgICAgICAgICB3cy5DZWxsc1siVTE5OlUyNCJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAieXl5eS1tbS1kZCI7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJWMTkiXS5WYWx1ZSA9IDEwMDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJWMjAiXS5WYWx1ZSA9IDEwMjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJWMjEiXS5WYWx1ZSA9IDEwMTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJWMjIiXS5WYWx1ZSA9IDEwMzsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJWMjMiXS5WYWx1ZSA9IDEwNTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJWMjQiXS5WYWx1ZSA9IDEwNDsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIlgxOSJdLlZhbHVlID0gIsO2w6TDpSI7CisgICAgICAgICAgICB3cy5DZWxsc1siWDIwIl0uVmFsdWUgPSAiw5bDhMOFIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJYMjEiXS5WYWx1ZSA9ICLDvMObIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJYMjIiXS5WYWx1ZSA9ICImJSPCpCI7CisgICAgICAgICAgICB3cy5DZWxsc1siWDIzIl0uVmFsdWUgPSAiw78iOworICAgICAgICAgICAgd3MuQ2VsbHNbIlgyNCJdLlZhbHVlID0gIsO7IjsKKyAgICAgICAgfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIFBpZUNoYXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGllQ2hhcnQiKTsKKyAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoInBpZUNoYXJ0IiwgZUNoYXJ0VHlwZS5QaWUpIGFzIEV4Y2VsUGllQ2hhcnQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgY2hydCk7CisKKyAgICAgICAgICAgIGNocnQuVG8uUm93ID0gMjU7CisgICAgICAgICAgICBjaHJ0LlRvLkNvbHVtbiA9IDEyOworCisgICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5TaG93UGVyY2VudCA9IHRydWU7CisgICAgICAgICAgICBjaHJ0LkxlZ2VuZC5Gb250LkNvbG9yID0gQ29sb3IuU3RlZWxCbHVlOworICAgICAgICAgICAgY2hydC5UaXRsZS5Cb3JkZXIuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgY2hydC5MZWdlbmQuUG9zaXRpb24gPSBlTGVnZW5kUG9zaXRpb24uVG9wUmlnaHQ7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllLCAiSW52YWxpZCBDaGFydHR5cGUiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2hydC5WYXJ5Q29sb3JzKTsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJQaWVjaGFydCI7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBQaWVDaGFydDNEKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGllQ2hhcnQzZCIpOworICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgicGllQ2hhcnQzZCIsIGVDaGFydFR5cGUuUGllM0QpIGFzIEV4Y2VsUGllQ2hhcnQ7CisgICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQpOworCisgICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDI1OworICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAxMjsKKworICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuU2hvd1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuTGVnZW5kLlBvc2l0aW9uID0gZUxlZ2VuZFBvc2l0aW9uLkxlZnQ7CisgICAgICAgICAgICBjaHJ0LlNob3dIaWRkZW5EYXRhID0gZmFsc2U7CisgICAgICAgICAgICBjaHJ0LkRpc3BsYXlCbGFua3NBcyA9IGVEaXNwbGF5QmxhbmtzQXMuR2FwOworICAgICAgICAgICAgY2hydC5UaXRsZS5SaWNoVGV4dC5BZGQoIlBpZSBSVCBUaXRsZSBhZGQiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2hydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWUzRCwgIkludmFsaWQgQ2hhcnR0eXBlIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuVmFyeUNvbG9ycyk7CisKKyAgICAgICAgfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNjYXR0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTY2F0dGVyIik7CisgICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJTY2F0dGVyQ2hhcnQxIiwgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMpIGFzIEV4Y2VsU2NhdHRlckNoYXJ0OworICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKKyAgICAgICAgICAgLy8gY2hydC5TZXJpZXNbMF0uTWFya2VyID0gZU1hcmtlclN0eWxlLkRpYW1vbmQ7CisgICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDIzOworICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAxMjsKKyAgICAgICAgICAgIC8vY2hydC5UaXRsZS5UZXh0ID0gIkhlYWRlciBUZXh0IjsKKyAgICAgICAgICAgIHZhciByMT1jaHJ0LlRpdGxlLlJpY2hUZXh0LkFkZCgiSGVhZGVyIik7CisgICAgICAgICAgICByMS5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhciByMj1jaHJ0LlRpdGxlLlJpY2hUZXh0LkFkZCgiICBUZXh0Iik7CisgICAgICAgICAgICByMi5VbmRlckxpbmUgPSBlVW5kZXJMaW5lVHlwZS5XYXZ5SGVhdnk7CisKKyAgICAgICAgICAgIGNocnQuVGl0bGUuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgY2hydC5UaXRsZS5GaWxsLkNvbG9yID0gQ29sb3IuTGlnaHRCbHVlOworICAgICAgICAgICAgY2hydC5UaXRsZS5GaWxsLlRyYW5zcGFyYW5jeSA9IDUwOworICAgICAgICAgICAgY2hydC5WYXJ5Q29sb3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIEV4Y2VsU2NhdHRlckNoYXJ0U2VyaWUgc2VyID0gY2hydC5TZXJpZXNbMF0gYXMgRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZTsKKyAgICAgICAgICAgIHNlci5EYXRhTGFiZWwuUG9zaXRpb24gPSBlTGFiZWxQb3NpdGlvbi5DZW50ZXI7CisgICAgICAgICAgICBzZXIuRGF0YUxhYmVsLlNob3dWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICBzZXIuRGF0YUxhYmVsLlNob3dDYXRlZ29yeSA9IHRydWU7CisgICAgICAgICAgICBzZXIuRGF0YUxhYmVsLkZpbGwuQ29sb3IgPSBDb2xvci5CbHVlVmlvbGV0OworICAgICAgICAgICAgc2VyLkRhdGFMYWJlbC5Gb250LkNvbG9yID0gQ29sb3IuV2hpdGU7CisgICAgICAgICAgICBzZXIuRGF0YUxhYmVsLkZvbnQuSXRhbGljID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlci5EYXRhTGFiZWwuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiYm9va21hbiBvbGQgc3R5bGUiLCA4KSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzLCAiSW52YWxpZCBDaGFydHR5cGUiKTsKKyAgICAgICAgICAgIGNocnQuU2VyaWVzWzBdLkhlYWRlciA9ICJUZXN0IHNlcmllIjsKKyAgICAgICAgICAgIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiU2NhdHRlckNoYXJ0MiIsIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoKSBhcyBFeGNlbFNjYXR0ZXJDaGFydDsKKyAgICAgICAgICAgIGNocnQuU2VyaWVzLkFkZCgiVTE5OlUyNCIsICJWMTk6VjI0Iik7CisKKyAgICAgICAgICAgIGNocnQuRnJvbS5Db2x1bW4gPSAwOworICAgICAgICAgICAgY2hydC5Gcm9tLlJvdz0yNTsKKyAgICAgICAgICAgIGNocnQuVG8uUm93ID0gNTM7CisgICAgICAgICAgICBjaHJ0LlRvLkNvbHVtbiA9IDEyOworICAgICAgICAgICAgY2hydC5MZWdlbmQuUG9zaXRpb24gPSBlTGVnZW5kUG9zaXRpb24uQm90dG9tOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLy8vY2hydC5TZXJpZXNbMF0uRGF0YUxhYmVsLlBvc2l0aW9uID0gZUxhYmVsUG9zaXRpb24uQ2VudGVyOworICAgICAgICAgICAgLy9Bc3NlcnQuSXNUcnVlKGNocnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyLCAiSW52YWxpZCBDaGFydHR5cGUiKTsKKworICAgICAgICB9CisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgQnViYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQnViYmxlIik7CisgICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJCdWJibGUiLCBlQ2hhcnRUeXBlLkJ1YmJsZSkgYXMgRXhjZWxCdWJibGVDaGFydDsKKyAgICAgICAgICAgIEFkZFRlc3REYXRhKHdzKTsKKworICAgICAgICAgICAgY2hydC5TZXJpZXMuQWRkKCJWMTk6VjI0IiwgIlUxOTpVMjQiKTsKKworICAgICAgICAgICAgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJCdWJibGUzZCIsIGVDaGFydFR5cGUuQnViYmxlM0RFZmZlY3QpIGFzIEV4Y2VsQnViYmxlQ2hhcnQ7CisgICAgICAgICAgICB3cy5DZWxsc1siVzE5Il0uVmFsdWUgPSAxOworICAgICAgICAgICAgd3MuQ2VsbHNbIlcyMCJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJXMjEiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICB3cy5DZWxsc1siVzIyIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgd3MuQ2VsbHNbIlcyMyJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJXMjQiXS5WYWx1ZSA9IDQ7CisKKyAgICAgICAgICAgIGNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0IiwgIlcxOTpXMjQiKTsKKyAgICAgICAgICAgIGNocnQuU3R5bGUgPSBlQ2hhcnRTdHlsZS5TdHlsZTI1OworCisgICAgICAgICAgICAvLyBjaHJ0LlNlcmllc1swXS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuRGlhbW9uZDsKKyAgICAgICAgICAgIGNocnQuRnJvbS5Sb3cgPSAyMzsKKyAgICAgICAgICAgIGNocnQuRnJvbS5Db2x1bW4gPSAxMjsKKyAgICAgICAgICAgIGNocnQuVG8uUm93ID0gMzM7CisgICAgICAgICAgICBjaHJ0LlRvLkNvbHVtbiA9IDIyOworICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIkhlYWRlciBUZXh0IjsKKyAgICAgICAgICAgIAorCisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBSYWRhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlJhZGFyIik7CisgICAgICAgICAgICBBZGRUZXN0RGF0YSh3cyk7CisKKyAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIlJhZGFyMSIsIGVDaGFydFR5cGUuUmFkYXIpIGFzIEV4Y2VsUmFkYXJDaGFydDsKKyAgICAgICAgICAgIHZhciBzPWNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7CisgICAgICAgICAgICBzLkhlYWRlciA9ICJzZXJpZTEiOworICAgICAgICAgICAgLy8gY2hydC5TZXJpZXNbMF0uTWFya2VyID0gZU1hcmtlclN0eWxlLkRpYW1vbmQ7CisgICAgICAgICAgICBjaHJ0LkZyb20uUm93ID0gMjM7CisgICAgICAgICAgICBjaHJ0LkZyb20uQ29sdW1uID0gMTI7CisgICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDM4OworICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAyMjsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJSYWRhciBDaGFydCAxIjsKKworICAgICAgICAgICAgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJSYWRhcjIiLCBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkKSBhcyBFeGNlbFJhZGFyQ2hhcnQ7CisgICAgICAgICAgICBzID0gY2hydC5TZXJpZXMuQWRkKCJWMTk6VjI0IiwgIlUxOTpVMjQiKTsKKyAgICAgICAgICAgIHMuSGVhZGVyID0gInNlcmllMSI7CisgICAgICAgICAgICAvLyBjaHJ0LlNlcmllc1swXS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuRGlhbW9uZDsKKyAgICAgICAgICAgIGNocnQuRnJvbS5Sb3cgPSA0MzsKKyAgICAgICAgICAgIGNocnQuRnJvbS5Db2x1bW4gPSAxMjsKKyAgICAgICAgICAgIGNocnQuVG8uUm93ID0gNTg7CisgICAgICAgICAgICBjaHJ0LlRvLkNvbHVtbiA9IDIyOworICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIlJhZGFyIENoYXJ0IDIiOworCisgICAgICAgICAgICBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIlJhZGFyMyIsIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzKSBhcyBFeGNlbFJhZGFyQ2hhcnQ7CisgICAgICAgICAgICB2YXIgcnMgPSAoRXhjZWxSYWRhckNoYXJ0U2VyaWUpY2hydC5TZXJpZXMuQWRkKCJWMTk6VjI0IiwgIlUxOTpVMjQiKTsKKyAgICAgICAgICAgIHJzLkhlYWRlciA9ICJzZXJpZTEiOworICAgICAgICAgICAgcnMuTWFya2VyID0gZU1hcmtlclN0eWxlLlN0YXI7CisgICAgICAgICAgICBycy5NYXJrZXJTaXplID0gMTQ7CisKKyAgICAgICAgICAgIC8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOworICAgICAgICAgICAgY2hydC5Gcm9tLlJvdyA9IDYzOworICAgICAgICAgICAgY2hydC5Gcm9tLkNvbHVtbiA9IDEyOworICAgICAgICAgICAgY2hydC5Uby5Sb3cgPSA3ODsKKyAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gMjI7CisgICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiUmFkYXIgQ2hhcnQgMyI7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBTdXJmYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU3VyZmFjZSIpOworICAgICAgICAgICAgQWRkVGVzdERhdGEod3MpOworCisgICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJTdXJmYWNlMSIsIGVDaGFydFR5cGUuU3VyZmFjZSkgYXMgRXhjZWxTdXJmYWNlQ2hhcnQ7CisgICAgICAgICAgICB2YXIgcyA9IGNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7CisgICAgICAgICAgICBzLkhlYWRlciA9ICJzZXJpZTEiOworICAgICAgICAgICAgLy8gY2hydC5TZXJpZXNbMF0uTWFya2VyID0gZU1hcmtlclN0eWxlLkRpYW1vbmQ7CisgICAgICAgICAgICBjaHJ0LkZyb20uUm93ID0gMjM7CisgICAgICAgICAgICBjaHJ0LkZyb20uQ29sdW1uID0gMTI7CisgICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDM4OworICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAyMjsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJTdXJmYWNlIENoYXJ0IDEiOworCisgICAgICAgICAgICAvL2NocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiU3VyZmFjZSIsIGVDaGFydFR5cGUuUmFkYXJGaWxsZWQpIGFzIEV4Y2VsUmFkYXJDaGFydDsKKyAgICAgICAgICAgIC8vcyA9IGNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7CisgICAgICAgICAgICAvL3MuSGVhZGVyID0gInNlcmllMSI7CisgICAgICAgICAgICAvLy8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOworICAgICAgICAgICAgLy9jaHJ0LkZyb20uUm93ID0gNDM7CisgICAgICAgICAgICAvL2NocnQuRnJvbS5Db2x1bW4gPSAxMjsKKyAgICAgICAgICAgIC8vY2hydC5Uby5Sb3cgPSA1ODsKKyAgICAgICAgICAgIC8vY2hydC5Uby5Db2x1bW4gPSAyMjsKKyAgICAgICAgICAgIC8vY2hydC5UaXRsZS5UZXh0ID0gIlJhZGFyIENoYXJ0IDIiOworCisgICAgICAgICAgICAvL2NocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiUmFkYXIzIiwgZUNoYXJ0VHlwZS5SYWRhck1hcmtlcnMpIGFzIEV4Y2VsUmFkYXJDaGFydDsKKyAgICAgICAgICAgIC8vdmFyIHJzID0gKEV4Y2VsUmFkYXJDaGFydFNlcmllKWNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7CisgICAgICAgICAgICAvL3JzLkhlYWRlciA9ICJzZXJpZTEiOworICAgICAgICAgICAgLy9ycy5NYXJrZXIgPSBlTWFya2VyU3R5bGUuU3RhcjsKKyAgICAgICAgICAgIC8vcnMuTWFya2VyU2l6ZSA9IDE0OworCisgICAgICAgICAgICAvLy8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOworICAgICAgICAgICAgLy9jaHJ0LkZyb20uUm93ID0gNjM7CisgICAgICAgICAgICAvL2NocnQuRnJvbS5Db2x1bW4gPSAxMjsKKyAgICAgICAgICAgIC8vY2hydC5Uby5Sb3cgPSA3ODsKKyAgICAgICAgICAgIC8vY2hydC5Uby5Db2x1bW4gPSAyMjsKKyAgICAgICAgICAgIC8vY2hydC5UaXRsZS5UZXh0ID0gIlJhZGFyIENoYXJ0IDMiOworICAgICAgICB9CisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgUHlyYW1pZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlB5cmFtaWQiKTsKKyAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIlB5cmFtaWQxIiwgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sKSBhcyBFeGNlbEJhckNoYXJ0OworICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKKyAgICAgICAgICAgIC8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOworICAgICAgICAgICAgY2hydC5WYXJ5Q29sb3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuVG8uUm93ID0gMjM7CisgICAgICAgICAgICBjaHJ0LlRvLkNvbHVtbiA9IDEyOworICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIkhlYWRlciBUZXh0IjsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuRmlsbC5TdHlsZT0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7CisgICAgICAgICAgICBjaHJ0LlRpdGxlLkZpbGwuQ29sb3IgPSBDb2xvci5EYXJrQmx1ZTsKKyAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLlNob3dWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAvL2NocnQuRGF0YUxhYmVsLlNob3dTZXJpZXNOYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vY2hydC5EYXRhTGFiZWwuU2VwYXJhdG9yID0gIiwiOworICAgICAgICAgICAgY2hydC5Cb3JkZXIuTGluZUNhcCA9IGVMaW5lQ2FwLlJvdW5kOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2hydC5Cb3JkZXIuTGluZVN0eWxlID0gZUxpbmVTdHlsZS5Mb25nRGFzaERvdERvdDsKKyAgICAgICAgICAgIGNocnQuQm9yZGVyLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgIGNocnQuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5CbHVlOworCisgICAgICAgICAgICBjaHJ0LkZpbGwuQ29sb3IgPSBDb2xvci5MaWdodEN5YW47CisgICAgICAgICAgICBjaHJ0LlBsb3RBcmVhLkZpbGwuQ29sb3IgPSBDb2xvci5XaGl0ZTsKKyAgICAgICAgICAgIGNocnQuUGxvdEFyZWEuQm9yZGVyLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgIGNocnQuUGxvdEFyZWEuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5CZWlnZTsKKyAgICAgICAgICAgIGNocnQuUGxvdEFyZWEuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuTG9uZ0Rhc2g7CisKKyAgICAgICAgICAgIGNocnQuTGVnZW5kLkZpbGwuQ29sb3IgPSBDb2xvci5BcXVhbWFyaW5lOworICAgICAgICAgICAgY2hydC5MZWdlbmQuUG9zaXRpb24gPSBlTGVnZW5kUG9zaXRpb24uVG9wOworICAgICAgICAgICAgY2hydC5BeGlzWzBdLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgIGNocnQuQXhpc1swXS5GaWxsLkNvbG9yID0gQ29sb3IuQmxhY2s7CisgICAgICAgICAgICBjaHJ0LkF4aXNbMF0uRm9udC5Db2xvciA9IENvbG9yLldoaXRlOworCisgICAgICAgICAgICBjaHJ0LkF4aXNbMV0uRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgY2hydC5BeGlzWzFdLkZpbGwuQ29sb3IgPSBDb2xvci5MaWdodFNsYXRlR3JheTsKKyAgICAgICAgICAgIGNocnQuQXhpc1sxXS5Gb250LkNvbG9yID0gQ29sb3IuRGFya1JlZDsKKworICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLkZpbGwuQ29sb3IgPSBDb2xvci5MaWdodEJsdWU7CisgICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5Cb3JkZXIuRmlsbC5TdHlsZT1lRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLkJvcmRlci5GaWxsLkNvbG9yPUNvbG9yLkJsYWNrOworICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuU29saWQ7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBDb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29uZSIpOworICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ29uZTEiLCBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQpIGFzIEV4Y2VsQmFyQ2hhcnQ7CisgICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQpOworICAgICAgICAgICAgY2hydC5WYXJ5Q29sb3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuU2V0U2l6ZSgyMDApOworICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIkNvbmUgYmFyIjsKKyAgICAgICAgICAgIGNocnQuU2VyaWVzWzBdLkhlYWRlciA9ICJTZXJpZSAxIjsKKyAgICAgICAgICAgIGNocnQuTGVnZW5kLlBvc2l0aW9uID0gZUxlZ2VuZFBvc2l0aW9uLlJpZ2h0OworICAgICAgICAgICAgY2hydC5BeGlzWzFdLkRpc3BsYXlVbml0ID0gMTAwMDAwOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNocnQuQXhpc1sxXS5EaXNwbGF5VW5pdCwgMTAwMDAwKTsKKyAgICAgICAgfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbHVtbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbHVtbiIpOworICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ29sdW1uMSIsIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0QpIGFzIEV4Y2VsQmFyQ2hhcnQ7CisgICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQpOworICAgICAgICAgICAgY2hydC5WYXJ5Q29sb3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuVmlldzNELlJpZ2h0QW5nbGVBeGVzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuVmlldzNELkRlcHRoUGVyY2VudCA9IDk5OworICAgICAgICAgICAgLy9jaHJ0LlZpZXczRC5IZWlnaHRQZXJjZW50ID0gOTk7CisgICAgICAgICAgICBjaHJ0LlZpZXczRC5SaWdodEFuZ2xlQXhlcyA9IHRydWU7CisgICAgICAgICAgICBjaHJ0LlNldFNpemUoMjAwKTsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJDb2x1bW4iOworICAgICAgICAgICAgY2hydC5TZXJpZXNbMF0uSGVhZGVyID0gIlNlcmllIDEiOworICAgICAgICAgICAgY2hydC5Mb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNocnQuUHJpbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNocnQuRWRpdEFzID0gZUVkaXRBcy5Ud29DZWxsOworICAgICAgICAgICAgY2hydC5BeGlzWzFdLkRpc3BsYXlVbml0ID0gMTAwMjA7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY2hydC5BeGlzWzFdLkRpc3BsYXlVbml0LCAxMDAyMCk7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBEb3VnbnV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRG91Z251dCIpOworICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiRG91Z251dDEiLCBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQpIGFzIEV4Y2VsRG91Z2hudXRDaGFydDsKKyAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgY2hydCk7CisgICAgICAgICAgICBjaHJ0LlNldFNpemUoMjAwKTsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJEb3VnaG51dCBFeHBsb2RlZCI7CisgICAgICAgICAgICBjaHJ0LlNlcmllc1swXS5IZWFkZXIgPSAiU2VyaWUgMSI7CisgICAgICAgICAgICBjaHJ0LkVkaXRBcyA9IGVFZGl0QXMuQWJzb2x1dGU7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBMaW5lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTGluZSIpOworICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiTGluZTEiLCBlQ2hhcnRUeXBlLkxpbmUpIGFzIEV4Y2VsTGluZUNoYXJ0OworICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKKyAgICAgICAgICAgIGNocnQuU2V0U2l6ZSgxNTApOworICAgICAgICAgICAgY2hydC5WYXJ5Q29sb3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuU21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiTGluZSAzRCI7CisgICAgICAgICAgICBjaHJ0LlNlcmllc1swXS5IZWFkZXIgPSAiTGluZSBzZXJpZSAxIjsKKyAgICAgICAgICAgIHZhciB0bCA9IGNocnQuU2VyaWVzWzBdLlRyZW5kTGluZXMuQWRkKGVUcmVuZExpbmUuUG9seW5vbWlhbCk7CisgICAgICAgICAgICB0bC5OYW1lID0gIlRlc3QiOworICAgICAgICAgICAgdGwuRGlzcGxheVJTcXVhcmVkVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgdGwuRGlzcGxheUVxdWF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIHRsLkZvcndhcmQgPSAxNTsKKyAgICAgICAgICAgIHRsLkJhY2t3YXJkID0gMTsKKyAgICAgICAgICAgIHRsLkludGVyY2VwdCA9IDY7CisgICAgICAgICAgICAvL3RsLlBlcmlvZCA9IDEyOworICAgICAgICAgICAgdGwuT3JkZXIgPSA1OworCisgICAgICAgICAgICB0bCA9IGNocnQuU2VyaWVzWzBdLlRyZW5kTGluZXMuQWRkKGVUcmVuZExpbmUuTW92aW5nQXZnZXJhZ2UpOworICAgICAgICAgICAgY2hydC5GaWxsLkNvbG9yID0gQ29sb3IuTGlnaHRTdGVlbEJsdWU7CisgICAgICAgICAgICBjaHJ0LkJvcmRlci5MaW5lU3R5bGUgPSBlTGluZVN0eWxlLkRvdDsKKyAgICAgICAgICAgIGNocnQuQm9yZGVyLkZpbGwuQ29sb3I9Q29sb3IuQmxhY2s7CisKKyAgICAgICAgICAgIGNocnQuTGVnZW5kLkZvbnQuQ29sb3IgPSBDb2xvci5SZWQ7CisgICAgICAgICAgICBjaHJ0LkxlZ2VuZC5Gb250LlN0cmlrZSA9IGVTdHJpa2VUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuRm9udC5Db2xvciA9IENvbG9yLkRhcmtHb2xkZW5yb2Q7CisgICAgICAgICAgICBjaHJ0LlRpdGxlLkZvbnQuTGF0aW5Gb250ID0gIkFyaWFsIjsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuRmlsbC5Db2xvciA9IENvbG9yLldoaXRlOworICAgICAgICAgICAgY2hydC5UaXRsZS5Cb3JkZXIuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgY2hydC5UaXRsZS5Cb3JkZXIuTGluZVN0eWxlID0gZUxpbmVTdHlsZS5Mb25nRGFzaERvdERvdDsKKyAgICAgICAgICAgIGNocnQuVGl0bGUuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5Ub21hdG87CisgICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5TaG93U2VyaWVzTmFtZSA9IHRydWU7CisgICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5TaG93TGVhZGVyTGluZXM9dHJ1ZTsKKyAgICAgICAgICAgIGNocnQuRWRpdEFzID0gZUVkaXRBcy5PbmVDZWxsOworICAgICAgICAgICAgY2hydC5EaXNwbGF5QmxhbmtzQXMgPSBlRGlzcGxheUJsYW5rc0FzLlNwYW47CisgICAgICAgICAgICBjaHJ0LkF4aXNbMF0uVGl0bGUuVGV4dCA9ICJBeGlzIDAiOworICAgICAgICAgICAgY2hydC5BeGlzWzBdLlRpdGxlLlJvdGF0aW9uID0gOTA7CisgICAgICAgICAgICBjaHJ0LkF4aXNbMF0uVGl0bGUuT3ZlcmxheSA9IHRydWU7CisgICAgICAgICAgICBjaHJ0LkF4aXNbMV0uVGl0bGUuVGV4dCA9ICJBeGlzIDEiOworICAgICAgICAgICAgY2hydC5BeGlzWzFdLlRpdGxlLkFuY2hvckN0ciA9IHRydWU7CisgICAgICAgICAgICBjaHJ0LkF4aXNbMV0uVGl0bGUuVGV4dFZlcnRpY2FsID0gZVRleHRWZXJ0aWNhbFR5cGUuVmVydGljYWwyNzA7CisgICAgICAgICAgICBjaHJ0LkF4aXNbMV0uVGl0bGUuQm9yZGVyLkxpbmVTdHlsZT1lTGluZVN0eWxlLkxvbmdEYXNoRG90RG90OworCisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBMaW5lTWFya2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTGluZU1hcmtlcjEiKTsKKyAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkxpbmUxIiwgZUNoYXJ0VHlwZS5MaW5lTWFya2VycykgYXMgRXhjZWxMaW5lQ2hhcnQ7CisgICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQpOworICAgICAgICAgICAgY2hydC5TZXRTaXplKDE1MCk7CisgICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiTGluZSBNYXJrZXJzIjsKKyAgICAgICAgICAgIGNocnQuU2VyaWVzWzBdLkhlYWRlciA9ICJMaW5lIHNlcmllIDEiOworICAgICAgICAgICAgKChFeGNlbExpbmVDaGFydFNlcmllKWNocnQuU2VyaWVzWzBdKS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuUGx1czsKKworICAgICAgICAgICAgdmFyIGNocnQyID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkxpbmUyIiwgZUNoYXJ0VHlwZS5MaW5lTWFya2VycykgYXMgRXhjZWxMaW5lQ2hhcnQ7CisgICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQyKTsKKyAgICAgICAgICAgIGNocnQyLlNldFBvc2l0aW9uKDUwMCwwKTsKKyAgICAgICAgICAgIGNocnQyLlNldFNpemUoMTUwKTsKKyAgICAgICAgICAgIGNocnQyLlRpdGxlLlRleHQgPSAiTGluZSBNYXJrZXJzIjsKKyAgICAgICAgICAgIHZhciBzZXJpZSA9IChFeGNlbExpbmVDaGFydFNlcmllKWNocnQyLlNlcmllc1swXTsKKyAgICAgICAgICAgIHNlcmllLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5YOworCisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBEcmF3aW5ncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoYXBlcyIpOworICAgICAgICAgICAgaW50IHk9MTAwLCBpPTE7CisgICAgICAgICAgICBmb3JlYWNoKGVTaGFwZVN0eWxlIHN0eWxlIGluIEVudW0uR2V0VmFsdWVzKHR5cGVvZihlU2hhcGVTdHlsZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGFwZSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJzaGFwZSIraS5Ub1N0cmluZygpLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgc2hhcGUuU2V0UG9zaXRpb24oeSwgMTAwKTsKKyAgICAgICAgICAgICAgICBzaGFwZS5TZXRTaXplKDMwMCwgMzAwKTsKKyAgICAgICAgICAgICAgICB5ICs9IDQwMDsKKyAgICAgICAgICAgICAgICBzaGFwZS5UZXh0ID0gc3R5bGUuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGUxIl0gYXMgRXhjZWxTaGFwZSkuVGV4dEFuY2hvcmluZyA9IGVUZXh0QW5jaG9yaW5nVHlwZS5Ub3A7ICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgcnQgPSAod3MuRHJhd2luZ3NbInNoYXBlMSJdIGFzIEV4Y2VsU2hhcGUpLlJpY2hUZXh0LkFkZCgiQWRkZWQgZm9ybWF0ZWQgcmljaHRleHQiKTsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGUxIl0gYXMgRXhjZWxTaGFwZSkuTG9ja1RleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJ0LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgcnQuQ29sb3IgPSBDb2xvci5BcXVhbWFyaW5lOworICAgICAgICAgICAgcnQuSXRhbGljID0gdHJ1ZTsKKyAgICAgICAgICAgIHJ0LlNpemUgPSAxNzsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGUyIl0gYXMgRXhjZWxTaGFwZSkuVGV4dFZlcnRpY2FsID0gZVRleHRWZXJ0aWNhbFR5cGUuVmVydGljYWw7CisgICAgICAgICAgICBydCA9ICh3cy5EcmF3aW5nc1sic2hhcGUyIl0gYXMgRXhjZWxTaGFwZSkuUmljaFRleHQuQWRkKCJcclxuQWRkZWQgZm9ybWF0ZWQgcmljaHRleHQiKTsKKyAgICAgICAgICAgIHJ0LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgcnQuQ29sb3IgPSBDb2xvci5EYXJrR29sZGVucm9kIDsKKyAgICAgICAgICAgIHJ0LlNldEZyb21Gb250KG5ldyBGb250KCJUaW1lcyBuZXcgcm9tYW4iLCAxOCwgRm9udFN0eWxlLlVuZGVybGluZSkpOworICAgICAgICAgICAgcnQuVW5kZXJMaW5lQ29sb3IgPSBDb2xvci5HcmVlbjsKKworCisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlMyJdIGFzIEV4Y2VsU2hhcGUpLlRleHRBbmNob3Jpbmc9ZVRleHRBbmNob3JpbmdUeXBlLkJvdHRvbTsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGUzIl0gYXMgRXhjZWxTaGFwZSkuVGV4dEFuY2hvcmluZ0NvbnRyb2w9dHJ1ZSA7CisKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU0Il0gYXMgRXhjZWxTaGFwZSkuVGV4dFZlcnRpY2FsID0gZVRleHRWZXJ0aWNhbFR5cGUuVmVydGljYWwyNzA7CisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNCJdIGFzIEV4Y2VsU2hhcGUpLlRleHRBbmNob3JpbmcgPSBlVGV4dEFuY2hvcmluZ1R5cGUuVG9wOworCisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNSJdIGFzIEV4Y2VsU2hhcGUpLkZpbGwuU3R5bGU9ZUZpbGxTdHlsZS5Tb2xpZEZpbGw7CisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNSJdIGFzIEV4Y2VsU2hhcGUpLkZpbGwuQ29sb3I9Q29sb3IuUmVkOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTUiXSBhcyBFeGNlbFNoYXBlKS5GaWxsLlRyYW5zcGFyYW5jeSA9IDUwOworCisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNiJdIGFzIEV4Y2VsU2hhcGUpLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLk5vRmlsbDsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU2Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5Db2xvciA9IENvbG9yLkJsYWNrOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTYiXSBhcyBFeGNlbFNoYXBlKS5Cb3JkZXIuRmlsbC5Db2xvciA9IENvbG9yLkJsYWNrOworCisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuRmlsbC5Db2xvcj1Db2xvci5HcmF5OworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Cb3JkZXIuRmlsbC5TdHlsZT1lRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5CbGFjazsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuQm9yZGVyLkZpbGwuVHJhbnNwYXJhbmN5PTQzOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Cb3JkZXIuTGluZUNhcD1lTGluZUNhcC5Sb3VuZDsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuTG9uZ0Rhc2g7CisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuVW5kZXJMaW5lQ29sb3IgPSBDb2xvci5CbHVlOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Gb250LkNvbG9yID0gQ29sb3IuQmxhY2s7CisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuQm9sZCA9IHRydWU7CisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuTGF0aW5Gb250ID0gIkFyaWFsIjsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5Db21wbGV4Rm9udCA9ICJBcmlhbCI7CisgICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuSXRhbGljID0gdHJ1ZTsKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5VbmRlckxpbmUgPSBlVW5kZXJMaW5lVHlwZS5Eb3R0ZWQ7CisKKyAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU4Il0gYXMgRXhjZWxTaGFwZSkuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTgiXSBhcyBFeGNlbFNoYXBlKS5Gb250LkxhdGluRm9udCA9ICJNaXJpYW0iOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTgiXSBhcyBFeGNlbFNoYXBlKS5Gb250LlVuZGVyTGluZUNvbG9yID0gQ29sb3IuQ2FkZXRCbHVlOworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTgiXSBhcyBFeGNlbFNoYXBlKS5Gb250LlVuZGVyTGluZSA9IGVVbmRlckxpbmVUeXBlLlNpbmdsZTsKKworICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTkiXSBhcyBFeGNlbFNoYXBlKS5UZXh0QWxpZ25tZW50ID0gZVRleHRBbGlnbm1lbnQuUmlnaHQ7CisKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgRHJhd2luZ1dvcmtzaGVldENvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3NTaGFwZXMgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3B5IFNoYXBlcyIsIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siU2hhcGVzIl0pOworICAgICAgICAgICAgdmFyIHdzU2NhdHRlckNoYXJ0ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29weSBTY2F0dGVyIiwgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJTY2F0dGVyIl0pOworICAgICAgICAgICAgdmFyIHdzUGljdHVyZSA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcHkgUGljdHVyZSIsIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siUGljdHVyZSJdKTsKKyAgICAgICAgfSAgICAKKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBMaW5lMlRlc3QoKQorICAgICAgICB7CisgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxpbmVJc3N1ZSIpOworCisgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSB3b3Jrc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQoIkxpbmVDaGFydCIsIGVDaGFydFR5cGUuTGluZSk7CisgICAgICAgICAgIAorICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU9MTsKKyAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlPTI7CisgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZT0zOworICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU9NDsKKyAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlPTU7CisgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZT02OworCisgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZT0xMDAwMDsKKyAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlPTEwMTAwOworICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWU9MTAyMDA7CisgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZT0xMDE1MDsKKyAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCNSJdLlZhbHVlPTEwMjUwOworICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkI2Il0uVmFsdWU9MTAyMDA7CisKKyAgICAgICAgICAgY2hhcnQuU2VyaWVzLkFkZChFeGNlbFJhbmdlLkdldEFkZHJlc3MoMSwgMiwgd29ya3NoZWV0LkRpbWVuc2lvbi5FbmQuUm93LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFJhbmdlLkdldEFkZHJlc3MoMSwgMSwgd29ya3NoZWV0LkRpbWVuc2lvbi5FbmQuUm93LCAxKSk7CisKKyAgICAgICAgICAgdmFyIFNlcmllcyA9IGNoYXJ0LlNlcmllc1swXTsKKyAgICAgICAgICAgCisgICAgICAgICAgIGNoYXJ0LlNlcmllc1swXS5IZWFkZXIgPSAiQmxhaCI7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBNdWx0aUNoYXJ0U2VyaWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTXVsdGlDaGFydFR5cGVzIik7CisKKyAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSB3b3Jrc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQoImNodFBpZSIsIGVDaGFydFR5cGUuTGluZU1hcmtlcnMpOworICAgICAgICAgICAgY2hhcnQuU2V0UG9zaXRpb24oMTAwLCAxMDApOworICAgICAgICAgICAgY2hhcnQuU2V0U2l6ZSg4MDAsNjAwKTsKKyAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3b3Jrc2hlZXQsIGNoYXJ0KTsKKyAgICAgICAgICAgIGNoYXJ0LlNlcmllc1swXS5IZWFkZXIgPSAiU2VyaWU1IjsKKyAgICAgICAgICAgIGNoYXJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUyNzsKKyAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siVzE5Il0uVmFsdWUgPSAxMjA7CisgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIlcyMCJdLlZhbHVlID0gMTIyOworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJXMjEiXS5WYWx1ZSA9IDEyMTsKKyAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siVzIyIl0uVmFsdWUgPSAxMjM7CisgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIlcyMyJdLlZhbHVlID0gMTI1OworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJXMjQiXS5WYWx1ZSA9IDEyNDsKKworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJYMTkiXS5WYWx1ZSA9IDkwOworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJYMjAiXS5WYWx1ZSA9IDUyOworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJYMjEiXS5WYWx1ZSA9IDg4OworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJYMjIiXS5WYWx1ZSA9IDc1OworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJYMjMiXS5WYWx1ZSA9IDc3OworICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJYMjQiXS5WYWx1ZSA9IDk5OworICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgY3MyID0gY2hhcnQuUGxvdEFyZWEuQ2hhcnRUeXBlcy5BZGQoZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQpOworICAgICAgICAgICAgdmFyIHMgPSBjczIuU2VyaWVzLkFkZCh3b3Jrc2hlZXQuQ2VsbHNbIlcxOTpXMjQiXSwgd29ya3NoZWV0LkNlbGxzWyJVMTk6VTI0Il0pOworICAgICAgICAgICAgcy5IZWFkZXIgPSAiU2VyaWU0IjsKKyAgICAgICAgICAgIGNzMi5ZQXhpcy5NYXhWYWx1ZSA9IDMwMDsKKyAgICAgICAgICAgIGNzMi5ZQXhpcy5NaW5WYWx1ZSA9IC01LjU7CisgICAgICAgICAgICB2YXIgY3MzID0gY2hhcnQuUGxvdEFyZWEuQ2hhcnRUeXBlcy5BZGQoZUNoYXJ0VHlwZS5MaW5lKTsKKyAgICAgICAgICAgIHM9Y3MzLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJYMTk6WDI0Il0sIHdvcmtzaGVldC5DZWxsc1siVTE5OlUyNCJdKTsKKyAgICAgICAgICAgIHMuSGVhZGVyID0gIlNlcmllMSI7CisgICAgICAgICAgICBjczMuVXNlU2Vjb25kYXJ5QXhpcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNzMy5YQXhpcy5EZWxldGVkID0gZmFsc2U7CisgICAgICAgICAgICBjczMuWEF4aXMuTWFqb3JVbml0ID0gMjA7CisgICAgICAgICAgICBjczMuWEF4aXMuTWlub3JVbml0ID0gMzsKKworICAgICAgICAgICAgY3MzLlhBeGlzLlRpY2tMYWJlbFBvc2l0aW9uID0gZVRpY2tMYWJlbFBvc2l0aW9uLkhpZ2g7CisgICAgICAgICAgICBjczMuWUF4aXMuTG9nQmFzZSA9IDEwLjI7CisKKyAgICAgICAgICAgIHZhciBjaGFydDIgPSB3b3Jrc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQoInNjYXR0ZXIxIiwgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGgpOworICAgICAgICAgICAgcz1jaGFydDIuU2VyaWVzLkFkZCh3b3Jrc2hlZXQuQ2VsbHNbIlcxOTpXMjQiXSwgd29ya3NoZWV0LkNlbGxzWyJVMTk6VTI0Il0pOworICAgICAgICAgICAgcy5IZWFkZXIgPSAiU2VyaWUyIjsKKworICAgICAgICAgICAgdmFyIGMyY3QyID0gY2hhcnQyLlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoKTsKKyAgICAgICAgICAgIHM9YzJjdDIuU2VyaWVzLkFkZCh3b3Jrc2hlZXQuQ2VsbHNbIlgxOTpYMjQiXSwgd29ya3NoZWV0LkNlbGxzWyJWMTk6VjI0Il0pOworICAgICAgICAgICAgcy5IZWFkZXI9IlNlcmllMyI7CisgICAgICAgICAgICBzPWMyY3QyLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJXMTk6VzI0Il0sIHdvcmtzaGVldC5DZWxsc1siVjE5OlYyNCJdKTsKKyAgICAgICAgICAgIHMuSGVhZGVyID0gIlNlcmllNCI7CisKKyAgICAgICAgICAgIGMyY3QyLlVzZVNlY29uZGFyeUF4aXMgPSB0cnVlOworICAgICAgICAgICAgYzJjdDIuWEF4aXMuRGVsZXRlZCA9IGZhbHNlOworICAgICAgICAgICAgYzJjdDIuWEF4aXMuVGlja0xhYmVsUG9zaXRpb24gPSBlVGlja0xhYmVsUG9zaXRpb24uSGlnaDsKKworICAgICAgICAgICAgRXhjZWxDaGFydCBjaGFydDMgPSB3b3Jrc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQoImNoYXJ0IiwgZUNoYXJ0VHlwZS5MaW5lTWFya2Vycyk7CisgICAgICAgICAgICBjaGFydDMuU2V0UG9zaXRpb24oMzAwLCAxMDAwKTsKKyAgICAgICAgICAgIHZhciBzMzE9Y2hhcnQzLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJXMTk6VzI0Il0sIHdvcmtzaGVldC5DZWxsc1siVTE5OlUyNCJdKTsKKyAgICAgICAgICAgIHMzMS5IZWFkZXIgPSAiU2VyaWUxIjsKKworICAgICAgICAgICAgdmFyIGMzY3QyID0gY2hhcnQzLlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuTGluZU1hcmtlcnMpOworICAgICAgICAgICAgdmFyIGMzMiA9IGMzY3QyLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJYMTk6WDI0Il0sIHdvcmtzaGVldC5DZWxsc1siVjE5OlYyNCJdKTsKKyAgICAgICAgICAgIGMzY3QyLlVzZVNlY29uZGFyeUF4aXMgPSB0cnVlOworICAgICAgICAgICAgYzMyLkhlYWRlciA9ICJTZXJpZTIiOworICAgICAgICAgICAgCisgICAgICAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zPW5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKG5ldyBOYW1lVGFibGUoKSk7CisgICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoImMiLCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvY2hhcnQiKTsKKyAgICAgICAgICAgIHZhciBlbGVtZW50ID0gY2hhcnQuQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9jOnBsb3RWaXNPbmx5IiwgbnMpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQhPW51bGwpIGVsZW1lbnQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZURyYXdpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3M9X3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGVsZXRlRHJhd2luZzEiKTsKKyAgICAgICAgICAgIHZhciBjaGFydDEgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ2hhcnQxIiwgZUNoYXJ0VHlwZS5MaW5lKTsKKyAgICAgICAgICAgIHZhciBjaGFydDIgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ2hhcnQyIiwgZUNoYXJ0VHlwZS5MaW5lKTsKKyAgICAgICAgICAgIHZhciBzaGFwZTEgPSB3cy5EcmF3aW5ncy5BZGRTaGFwZSgiU2hhcGUxIiwgZVNoYXBlU3R5bGUuQWN0aW9uQnV0dG9uQmFja1ByZXZpb3VzKTsKKyAgICAgICAgICAgIHZhciBwaWMxID0gd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljMSIsIFJlc291cmNlcy5UZXN0MSk7CisgICAgICAgICAgICB3cy5EcmF3aW5ncy5SZW1vdmUoMik7CisgICAgICAgICAgICB3cy5EcmF3aW5ncy5SZW1vdmUoY2hhcnQyKTsKKyAgICAgICAgICAgIHdzLkRyYXdpbmdzLlJlbW92ZSgiUGljMSIpOworCisgICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRlbGV0ZURyYXdpbmcyIik7CisgICAgICAgICAgICBjaGFydDEgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ2hhcnQxIiwgZUNoYXJ0VHlwZS5MaW5lKTsKKyAgICAgICAgICAgIGNoYXJ0MiA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJDaGFydDIiLCBlQ2hhcnRUeXBlLkxpbmUpOworICAgICAgICAgICAgc2hhcGUxID0gd3MuRHJhd2luZ3MuQWRkU2hhcGUoIlNoYXBlMSIsIGVTaGFwZVN0eWxlLkFjdGlvbkJ1dHRvbkJhY2tQcmV2aW91cyk7CisgICAgICAgICAgICBwaWMxID0gd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljMSIsIFJlc291cmNlcy5UZXN0MSk7CisKKyAgICAgICAgICAgIHdzLkRyYXdpbmdzLlJlbW92ZSgiY2hhcnQxIik7CisKKyAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2xlYXJEcmF3aW5nMiIpOworICAgICAgICAgICAgY2hhcnQxID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNoYXJ0MSIsIGVDaGFydFR5cGUuTGluZSk7CisgICAgICAgICAgICBjaGFydDIgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ2hhcnQyIiwgZUNoYXJ0VHlwZS5MaW5lKTsKKyAgICAgICAgICAgIHNoYXBlMSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJTaGFwZTEiLCBlU2hhcGVTdHlsZS5BY3Rpb25CdXR0b25CYWNrUHJldmlvdXMpOworICAgICAgICAgICAgcGljMSA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBSZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgd3MuRHJhd2luZ3MuQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWREb2N1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmaT1uZXcgRmlsZUluZm8oX3dvcmtzaGVldFBhdGggKyAiZHJhd2luZy54bHN4Iik7CisgICAgICAgICAgICBpZiAoIWZpLkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSW5jb25jbHVzaXZlKCJEcmF3aW5nLnhsc3ggaXMgbm90IGNyZWF0ZWQuIFNraXBwbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpLCB0cnVlKTsKKworICAgICAgICAgICAgZm9yZWFjaCh2YXIgd3MgaW4gcGNrLldvcmtib29rLldvcmtzaGVldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaChFeGNlbERyYXdpbmcgZCBpbiBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EcmF3aW5ncykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkIGlzIEV4Y2VsQ2hhcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb250ZXh0LldyaXRlTGluZSgoKEV4Y2VsQ2hhcnQpZCkuQ2hhcnRUeXBlLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGNrLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZE11bHRpQ2hhcnRTZXJpZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxjaGFydHNlcmllcy54bHN4IiksIHRydWUpOworCisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIEV4Y2VsQ2hhcnQgYyA9IHdzLkRyYXdpbmdzWzBdIGFzIEV4Y2VsQ2hhcnQ7CisKKworICAgICAgICAgICAgdmFyIHAgPSBjLlBsb3RBcmVhOworICAgICAgICAgICAgcC5DaGFydFR5cGVzWzFdLlNlcmllc1swXS5TZXJpZXMgPSAiUzc6UzE1IjsKKworICAgICAgICAgICAgdmFyIGMyPXdzLkRyYXdpbmdzLkFkZENoYXJ0KCJOZXdDaGFydCIsIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkKTsKKyAgICAgICAgICAgIHZhciBzZXJpZTEgPSBjMi5TZXJpZXMuQWRkKCJSNzpSMTUiLCAiUTc6UTE1Iik7CisgICAgICAgICAgICBjMi5TZXRTaXplKDgwMCwgODAwKTsKKyAgICAgICAgICAgIHNlcmllMS5IZWFkZXIgPSAiQ29sdW1uIENsdXN0ZXJlZCI7CisKKyAgICAgICAgICAgIHZhciBzdWJDaGFydCA9IGMyLlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuTGluZU1hcmtlcnMpOworICAgICAgICAgICAgdmFyIHNlcmllMiA9IHN1YkNoYXJ0LlNlcmllcy5BZGQoIlM3OlMxNSIsICJRNzpRMTUiKTsKKyAgICAgICAgICAgIHNlcmllMi5IZWFkZXIgPSAiTGluZSI7CisKKyAgICAgICAgICAgIC8vdmFyIHN1YkNoYXJ0MiA9IGMyLlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZCk7CisgICAgICAgICAgICAvL3ZhciBzZXJpZTMgPSBzdWJDaGFydDIuU2VyaWVzLkFkZCgiUzc6UzE1IiwgIlE3OlExNSIpOworICAgICAgICAgICAgLy9zZXJpZTMuSGVhZGVyID0gIkRvdWdobnV0IjsKKworICAgICAgICAgICAgdmFyIHN1YkNoYXJ0MyA9IGMyLlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuQXJlYSk7CisgICAgICAgICAgICB2YXIgc2VyaWU0ID0gc3ViQ2hhcnQzLlNlcmllcy5BZGQoIlI3OlIxNSIsICJRNzpRMTUiKTsKKyAgICAgICAgICAgIHNlcmllNC5IZWFkZXIgPSAiQXJlYSI7CisgICAgICAgICAgICBzdWJDaGFydDMuVXNlU2Vjb25kYXJ5QXhpcyA9IHRydWU7CisKKyAgICAgICAgICAgIHZhciBzZXJpZTUgPSBzdWJDaGFydC5TZXJpZXMuQWRkKCJSNzpSMTUiLCJRNzpRMTUiKTsKKyAgICAgICAgICAgIHNlcmllNS5IZWFkZXIgPSAiTGluZSAyIjsKKworICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxjaGFydHNlcmllc25ldy54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDaGFydFdvcmtzaGVldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3NDaGFydCA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGRDaGFydCgiY2hhcnQiLCBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0KTsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImRhdGEiKTsKKyAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgd3NDaGFydC5DaGFydCk7CisgICAgICAgICAgICB3c0NoYXJ0LkNoYXJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUyMzsKKyAgICAgICAgICAgIHdzQ2hhcnQuQ2hhcnQuVGl0bGUuVGV4dCA9ICJDaGFydCB3b3Jrc2hlZXQiOworICAgICAgICAgICAgd3NDaGFydC5DaGFydC5TZXJpZXNbMF0uSGVhZGVyID0gIlNlcmllIjsKKyAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2hhcnQueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZENoYXJ0V29ya3NoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjaGFydC54bHN4IikpOworICAgICAgICAgICAgdmFyIGNoYXJ0ID0gKChFeGNlbENoYXJ0c2hlZXQpX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdKS5DaGFydDsKKworICAgICAgICAgICAgX3Bjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjaGFydC54bHN4IikpOworCisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRXcml0ZVNtb290aENoYXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcWGRzXzIwMTRfVEVTVC54bHN4IikpOworICAgICAgICAgICAgdmFyIGNoYXJ0ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkRyYXdpbmdzWzBdIGFzIEV4Y2VsQ2hhcnQ7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbIkIyIl0uVmFsdWUgPSAzMzsKKyAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2hhcnQueGxzeCIpKTsKKworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0SGVhZGVyYWRkcmVzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEcmF3Iik7CisgICAgICAgICAgICB2YXIgY2hhcnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiTmV3Q2hhcnQxIixlQ2hhcnRUeXBlLkFyZWEpIGFzIEV4Y2VsQ2hhcnQ7CisgICAgICAgICAgICB2YXIgc2VyMSA9IGNoYXJ0LlNlcmllcy5BZGQoIkExOkEyIiwgIkIxOkIyIik7CisgICAgICAgICAgICBzZXIxLkhlYWRlckFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKCJBMTpBMiIpOworICAgICAgICAgICAgc2VyMS5IZWFkZXJBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygiQTE6QjEiKTsKKyAgICAgICAgICAgIHNlcjEuSGVhZGVyQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoIkExIik7CisgICAgICAgICAgICBfcGNrLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIF9wY2sgPSBudWxsOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBbGxEcmF3aW5nc0luc2lkZU1hcmt1cENvbXBhdGliaWxpdHkoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd29ya2Jvb2tzRGlyID0gUGF0aC5Db21iaW5lKEFwcERvbWFpbi5DdXJyZW50RG9tYWluLkJhc2VEaXJlY3RvcnksIEAiLi5cLi5cd29ya2Jvb2tzIik7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGNvZGVwbGV4IGlzc3VlIDE1MDI4OiBNYWtpbmcgYW4gdW5yZWxhdGVkIGNoYW5nZSB0byBhbiBFeGNlbCBmaWxlIHRoYXQgY29udGFpbnMgZHJhd2luZ3MgdGhhdCBBTEwgZXhpc3QKKyAgICAgICAgICAgIC8vIGluc2lkZSBNYXJrdXBDb21wYXRpYmlsaXR5L0Nob2ljZSBub2RlcyBjYXVzZXMgdGhlIGRyYXdpbmdzLnhtbCBmaWxlIHRvIGJlIGluY29ycmVjdGx5IGdhcmJhZ2UgY29sbGVjdGVkCisgICAgICAgICAgICAvLyB3aGVuIGFuIHVucmVsYXRlZCBjaGFuZ2UgaXMgbWFkZS4KKyAgICAgICAgICAgIHN0cmluZyBwYXRoID0gUGF0aC5Db21iaW5lKHdvcmtib29rc0RpciwgIkFsbERyYXdpbmdzSW5zaWRlTWFya3VwQ29tcGF0aWJpbGl0eS54bHNtIik7CisKKyAgICAgICAgICAgIC8vIExvYWQgZXhhbXBsZSBkb2N1bWVudC4KKyAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhwYXRoKSk7CisgICAgICAgICAgICAvLyBWZXJpZnkgdGhlIGRyYXdpbmcgcGFydCBleGlzdHM6CisgICAgICAgICAgICBVcmkgcGFydFVyaSA9IG5ldyBVcmkoIi94bC9kcmF3aW5ncy9kcmF3aW5nMS54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoX3Bjay5QYWNrYWdlLlBhcnRFeGlzdHMocGFydFVyaSkpOworCisgICAgICAgICAgICAvLyBUaGUgRXhjZWwgRHJhd2luZ3MgTmFtZXNwYWNlTWFuYWdlciBmcm9tIEV4Y2VsRHJhd2luZy5DcmVhdGVOU006CisgICAgICAgICAgICBOYW1lVGFibGUgbnQgPSBuZXcgTmFtZVRhYmxlKCk7CisgICAgICAgICAgICB2YXIgeG1sTnNtID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIobnQpOworICAgICAgICAgICAgeG1sTnNtLkFkZE5hbWVzcGFjZSgiYSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFEcmF3aW5ncyk7CisgICAgICAgICAgICB4bWxOc20uQWRkTmFtZXNwYWNlKCJ4ZHIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7CisgICAgICAgICAgICB4bWxOc20uQWRkTmFtZXNwYWNlKCJjIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKKyAgICAgICAgICAgIHhtbE5zbS5BZGROYW1lc3BhY2UoInIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyk7CisgICAgICAgICAgICB4bWxOc20uQWRkTmFtZXNwYWNlKCJtYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYXJrdXBDb21wYXRpYmlsaXR5KTsKKworICAgICAgICAgICAgWG1sRG9jdW1lbnQgZHJhd2luZ3NYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIGRyYXdpbmdzWG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKGRyYXdpbmdzWG1sLCBfcGNrLlBhY2thZ2UuR2V0UGFydChwYXJ0VXJpKS5HZXRTdHJlYW0oKSk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGFyZSB0aGUgY29ycmVjdCAjIG9mIGRyYXdpbmdzOgorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRyYXdpbmdzWG1sLlNlbGVjdE5vZGVzKCIvLypbc2VsZjo6eGRyOnR3b0NlbGxBbmNob3Igb3Igc2VsZjo6eGRyOm9uZUNlbGxBbmNob3Igb3Igc2VsZjo6eGRyOmFic29sdXRlQW5jaG9yXSIsIHhtbE5zbSkuQ291bnQsIDUpOworCisgICAgICAgICAgICAvLyBNYWtlIHVucmVsYXRlZCBjaGFuZ2UuIChpbiB0aGlzIGNhc2UgYSB1c2VsZXNzIGFkZGl0aW9uYWwgd29ya3NoZWV0KQorICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTmV3V29ya3NoZWV0Iik7CisKKyAgICAgICAgICAgIC8vIFNhdmUgaXQgb3V0LgorICAgICAgICAgICAgc3RyaW5nIHNhdmVkUGF0aCA9IFBhdGguQ29tYmluZSh3b3JrYm9va3NEaXIsICJBbGxEcmF3aW5nc0luc2lkZU1hcmt1cENvbXBhdGliaWxpdHkyLnhsc20iKTsKKyAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhzYXZlZFBhdGgpKTsKKyAgICAgICAgICAgIF9wY2suRGlzcG9zZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBSZWxvYWQgdGhlIG5ldyBzYXZlZCBmaWxlLgorICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKHNhdmVkUGF0aCkpOworCisgICAgICAgICAgICAvLyBWZXJpZnkgdGhlIGRyYXdpbmcgcGFydCBzdGlsbCBleGlzdHMuCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKF9wY2suUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoIi94bC9kcmF3aW5ncy9kcmF3aW5nMS54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKSkpOworCisgICAgICAgICAgICBkcmF3aW5nc1htbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgICAgICAgICAgZHJhd2luZ3NYbWwuUHJlc2VydmVXaGl0ZXNwYWNlID0gZmFsc2U7CisgICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoZHJhd2luZ3NYbWwsIF9wY2suUGFja2FnZS5HZXRQYXJ0KHBhcnRVcmkpLkdldFN0cmVhbSgpKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIHRoZSBjb3JyZWN0ICMgb2YgZHJhd2luZ3M6CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZHJhd2luZ3NYbWwuU2VsZWN0Tm9kZXMoIi8vKltzZWxmOjp4ZHI6dHdvQ2VsbEFuY2hvciBvciBzZWxmOjp4ZHI6b25lQ2VsbEFuY2hvciBvciBzZWxmOjp4ZHI6YWJzb2x1dGVBbmNob3JdIiwgeG1sTnNtKS5Db3VudCwgNSk7CisgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgbmV3IHdvcmtzaGVldCBleGlzdHM6CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siTmV3V29ya3NoZWV0Il0pOworICAgICAgICAgICAgLy8gQ2xlYW51cDoKKyAgICAgICAgICAgIEZpbGUuRGVsZXRlKHNhdmVkUGF0aCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0VQUGx1c1Rlc3QuY3Nwcm9qIGIvRVBQbHVzVGVzdC9FUFBsdXNUZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNkMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9FUFBsdXNUZXN0LmNzcHJvagpAQCAtMCwwICsxLDI2OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+e0U3QkNFREUwLUVBREQtNDM3Qi04NkQ1LTQ5RDE5MjIxNjk0OH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkVQUGx1c1Rlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5FUFBsdXNUZXN0PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNS4xPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57M0FDMDk2RDAtQTFDMi1FMTJDLTEzOTAtQTgzMzU4MDFGREFCfTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgICA8U29sdXRpb25EaXIgQ29uZGl0aW9uPSIkKFNvbHV0aW9uRGlyKSA9PSAnJyBPciAkKFNvbHV0aW9uRGlyKSA9PSAnKlVuZGVmaW5lZConIj4uLlw8L1NvbHV0aW9uRGlyPgorICAgIDxSZXN0b3JlUGFja2FnZXM+dHJ1ZTwvUmVzdG9yZVBhY2thZ2VzPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+RVBQbHVzVGVzdC5zbms8L0Fzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2UgNC4wfEFueUNQVSciPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlIDQuMFw8L091dHB1dFBhdGg+CisgICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVW5pdFRlc3RGcmFtZXdvcmssIFZlcnNpb249MTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSaGluby5Nb2NrcywgVmVyc2lvbj0zLjYuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTBiMzMwNTkwMmRiNzE4M2YsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xSaGlub01vY2tzLjMuNi4xXGxpYlxuZXRcUmhpbm8uTW9ja3MuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5jb25maWd1cmF0aW9uIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EZXNpZ24iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZWN1cml0eSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJXaW5kb3dzQmFzZSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My4wPC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQWRkcmVzcy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDYWxjdWxhdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb25kaXRpb25hbEZvcm1hdHRpbmdcQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEN1c3RvbVZhbGlkYXRpb25UZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxEYXRhVmFsaWRhdGlvblRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXERlY2ltYURhdGFWYWxpZGF0aW9uVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRXhjZWxUaW1lVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcQ3VzdG9tRm9ybXVsYVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXERhdGVUaW1lRm9ybXVsYVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXERlY2ltYWxGb3JtdWxhVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcSW50ZWdlckZvcm11bGFUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xMaXN0Rm9ybXVsYVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXFRpbWVGb3JtdWxhVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cSW50ZWdyYXRpb25UZXN0c1xJbnRlZ3JhdGlvblRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXExpc3REYXRhVmFsaWRhdGlvblRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXFJhbmdlQmFzZVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXFZhbGlkYXRpb25Db2xsZWN0aW9uVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cVmFsaWRhdGlvblRlc3RCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRUU19GYWlsaW5nVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRW5jcnlwdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xBZGRyZXNzVHJhbnNsYXRvclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXENlbGxSZWZlcmVuY2VQcm92aWRlclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEV4Y2VsQWRkcmVzc0luZm9UZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFJhbmdlQWRkcmVzc0ZhY3RvcnlUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xSYW5nZUFkZHJlc3NUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFV0aWxpdGllc1xSYW5nZXNUZXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFZhbHVlTWF0Y2hlclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFdpbGRDYXJkVmFsdWVNYXRjaGVyVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEFyZ3VtZW50UGFyc2VyRmFjdG9yeVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xBcmd1bWVudFBhcnNlcnNJbXBsZW1lbnRhdGlvbnNUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQXJndW1lbnRQYXJzZXJzVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXENvdW50SWZzVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGFiYXNlXEV4Y2VsRGF0YWJhc2VUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcQ3JpdGVyaWFUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcUm93TWF0Y2hlclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRlVGltZUZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xFeGNlbEZ1bmN0aW9uVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEZ1bmN0aW9uQXJndW1lbnRUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTG9naWNhbEZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xNYXRoRnVuY3Rpb25zVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE51bWJlckZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcTG9va3VwTmF2aWdhdG9yVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxSZWZBbmRMb29rdXBUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXEluZGV4VGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxMb29rdXBOYXZpZ2F0b3JGYWN0b3J5VGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFN1YnRvdGFsVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFN1bUlmc1Rlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xUZXh0RnVuY3Rpb25zVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRpbWVTdHJpbmdQYXJzZXJUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxPcGVyYXRvcnNUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRW51bWVyYWJsZUV4cHJlc3Npb25UZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRXhjZWxBZGRyZXNzRXhwcmVzc2lvblRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uQ29tcGlsZXJUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRXhwcmVzc2lvbkNvbnZlcnRlclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uRmFjdG9yeVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uR3JhcGhCdWlsZGVyVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEludGVnZXJFeHByZXNzaW9uVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXERlY2ltYWxFeHByZXNzaW9uVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEJvb2xlYW5FeHByZXNzaW9uVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRm9ybXVsYVBhcnNlclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcQmFzaWNDYWxjVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXERhdGVBbmRUaW1lRnVuY3Rpb25zVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXEV4Y2VsUmFuZ2VzXE1hdGhFeGNlbFJhbmdlVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXEV4Y2VsUmFuZ2VzXFRleHRFeGNlbFJhbmdlVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXEluZm9ybWF0aW9uRnVuY3Rpb25zVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXExvZ2ljYWxGdW5jdGlvbnNUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcTWF0aEZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcQnVpbHRJbkZ1bmN0aW9uc1xSZWZBbmRMb29rdXBUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcU3RyaW5nRnVuY3Rpb25zVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXFN1YnRvdGFsVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXFRleHRGdW5jdGlvbnNUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcRGF0YWJhc2VUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEVycm9ySGFuZGxpbmdcU3VtVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xFeGNlbERhdGFQcm92aWRlclRlc3RzXEV4Y2VsRGF0YVByb3ZpZGVySW50ZWdyYXRpb25UZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEZvcm11bGFQYXJzZXJUZXN0QmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXFByZWNlZGVuY2VUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXENhbGNFeHRlbnNpb25zVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xFcnJvckhhbmRsaW5nXEZvcm11bGFFcnJvckhhbmRsaW5nVGVzdEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xPcGVyYXRvcnNUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcTmVnYXRpb25UZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xMZXhpY2FsQW5hbHlzaXNcU291cmNlQ29kZVRva2VuaXplclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xTeW50YWN0aWNBbmFseXplclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xUb2tlbkZhY3RvcnlUZXN0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xOYW1lVmFsdWVQcm92aWRlclRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXFBhcnNpbmdDb250ZXh0VGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcUGFyc2luZ1Njb3Blc1Rlc3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcUGFyc2luZ1Njb3BlVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcVGVzdEhlbHBlcnNcRnVuY3Rpb25zSGVscGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRyYXdpbmdUZXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcUmVzb3VyY2VzLkRlc2lnbmVyLmNzIj4KKyAgICAgIDxBdXRvR2VuPlRydWU8L0F1dG9HZW4+CisgICAgICA8RGVzaWduVGltZT5UcnVlPC9EZXNpZ25UaW1lPgorICAgICAgPERlcGVuZGVudFVwb24+UmVzb3VyY2VzLnJlc3g8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlJlYWRUZW1wbGF0ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0QmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0RFRPLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNlbGxTdG9yZVRlc3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSXNzdWVzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkxvYWRGcm9tQ29sbGVjdGlvblRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbW1lbnRzVGVzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xBZGRyZXNzVXRpbGl0eVRlc3RzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlV0aWxzXEd1YXJkaW5nVGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcU3FSZWZVdGlsaXR5VGVzdHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVkJBLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IldvcmtTaGVldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJXb3Jrc2hlZXRzVGVzdHMuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9IkVQUGx1c1Rlc3Quc25rIiAvPgorICAgIDxOb25lIEluY2x1ZGU9InBhY2thZ2VzLmNvbmZpZyIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJUZXN0U3RhcnQub3JkZXJlZHRlc3QiPgorICAgICAgPENvcHlUb091dHB1dERpcmVjdG9yeT5BbHdheXM8L0NvcHlUb091dHB1dERpcmVjdG9yeT4KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPgorICAgIDwvTm9uZT4KKyAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJSZXNvdXJjZXNcVmVjdG9yIERyYXdpbmcud21mIiAvPgorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IlJlc291cmNlc1xWZWN0b3IgRHJhd2luZzIud21mIiAvPgorICAgIDxOb25lIEluY2x1ZGU9Ildvcmtib29rc1xGb3JtdWxhVGVzdC54bHN4Ij4KKyAgICAgIDxDb3B5VG9PdXRwdXREaXJlY3Rvcnk+UHJlc2VydmVOZXdlc3Q8L0NvcHlUb091dHB1dERpcmVjdG9yeT4KKyAgICA8L05vbmU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IlByb3BlcnRpZXNcUmVzb3VyY2VzLnJlc3giPgorICAgICAgPEdlbmVyYXRvcj5SZXNYRmlsZUNvZGVHZW5lcmF0b3I8L0dlbmVyYXRvcj4KKyAgICAgIDxMYXN0R2VuT3V0cHV0PlJlc291cmNlcy5EZXNpZ25lci5jczwvTGFzdEdlbk91dHB1dD4KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPgorICAgIDwvRW1iZWRkZWRSZXNvdXJjZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iLk5FVEZyYW1ld29yayxWZXJzaW9uPXY0LjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+TWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDQgJTI4eDg2IGFuZCB4NjQlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEVQUGx1c1xFUFBsdXMuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns3YjI4ODAyNi01NTAyLTRhMzktYmY0MS03N2UwODZmM2U0YTN9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RVBQbHVzPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iUmVzb3VyY2VzXEJpdG1hcEltYWdlLmdpZiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iUmVzb3VyY2VzXFRlc3QxLmpwZyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8SW1wb3J0IFByb2plY3Q9IiQoU29sdXRpb25EaXIpXC5udWdldFxudWdldC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRVBQbHVzVGVzdC5zbmsgYi9FUFBsdXNUZXN0L0VQUGx1c1Rlc3Quc25rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWYxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0VQUGx1c1Rlc3Quc25rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRW5jcnlwdC5jcyBiL0VQUGx1c1Rlc3QvRW5jcnlwdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjUyMjBjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9FbmNyeXB0LmNzCkBAIC0wLDAgKzEsMTIwIEBACivvu791c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRW5jcnlwdCA6IFRlc3RCYXNlCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFdyaXRlRW5jcnlwdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJUZXN0XERyYXdpbmcueGxzeCIpLCB0cnVlKSkgICAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2suRW5jcnlwdGlvbi5QYXNzd29yZCA9ICJFUFBsdXMiOworICAgICAgICAgICAgICAgIHBjay5FbmNyeXB0aW9uLkFsZ29yaXRobSA9IEVuY3J5cHRpb25BbGdvcml0aG0uQUVTMTkyOworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgcGNrLldvcmtib29rLlByb3RlY3Rpb24uTG9ja1N0cnVjdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcGNrLldvcmtib29rLlByb3RlY3Rpb24uTG9ja1dpbmRvd3MgPSB0cnVlOworCisgICAgICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJUZXN0XERyYXdpbmdFbmNyLnhsc3giKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgQCJcRHJhd2luZ0VuY3IueGxzeCIpLCB0cnVlLCAiRVBQbHVzIikpICAgICAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGNrLkVuY3J5cHRpb24uSXNFbmNyeXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIEAiXERyYXdpbmdOb3RFbmNyLnhsc3giKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGVTdHJlYW0gZnMgPSBuZXcgRmlsZVN0cmVhbShfd29ya3NoZWV0UGF0aCArIEAiXERyYXdpbmdFbmNyLnhsc3giLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSk7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoZnMsICJFUFBsdXMiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2suRW5jcnlwdGlvbi5Jc0VuY3J5cHRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgQCJEcmF3aW5nTm90RW5jci54bHN4IikpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRW5jcnlwdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgLy9Mb2FkIHRoZSBzaGVldCB3aXRoIG9uZSBzdHJpbmcgY29sdW1uLCBvbmUgZGF0ZSBjb2x1bW4gYW5kIGEgZmV3IHJhbmRvbSBudW1iZXJzLgorICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRmlyc3QgbGluZSB0ZXN0Iik7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWzEsIDFdLlZhbHVlID0gIjE7IDEiOworICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSAiMjsgMSI7CisgICAgICAgICAgICB3cy5DZWxsc1sxLCAyXS5WYWx1ZSA9ICIxOyAyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzIsIDJdLlZhbHVlID0gIjI7IDIiOworCisgICAgICAgICAgICB3cy5Sb3coMSkuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNvbHVtbigxKS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworCisgICAgICAgICAgICAvL3BhY2thZ2UuRW5jcnlwdGlvbi5BbGdvcml0aG0gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLkFFUzI1NjsKKyAgICAgICAgICAgIC8vcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxlbmNyVGVzdC54bHN4IiksICJBQnhzdzIzZWRjIik7CisgICAgICAgICAgICBwYWNrYWdlLkVuY3J5cHRpb24uUGFzc3dvcmQgPSAidGVzdCI7CisgICAgICAgICAgICBwYWNrYWdlLkVuY3J5cHRpb24uSXNFbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxlbmNyVGVzdC54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVByb3RlY3QoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx3b3JrYm9va3Byb3QyLnhsc3giKSwgIiIpOworICAgICAgICAgICAgLy9Mb2FkIHRoZSBzaGVldCB3aXRoIG9uZSBzdHJpbmcgY29sdW1uLCBvbmUgZGF0ZSBjb2x1bW4gYW5kIGEgZmV3IHJhbmRvbSBudW1iZXJzLgorICAgICAgICAgICAgLy9wYWNrYWdlLldvcmtib29rLlByb3RlY3Rpb24uTG9ja1dpbmRvd3MgPSB0cnVlOworICAgICAgICAgICAgLy9wYWNrYWdlLkVuY3J5cHRpb24uSXNFbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJ0Iik7CisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3RlY3Rpb24uTG9ja1N0cnVjdHVyZSA9IHRydWU7CisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlZpZXcuTGVmdCA9IDU4NTsKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suVmlldy5Ub3AgPSAxNTA7CisKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suVmlldy5XaWR0aCA9IDE3MzEwOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WaWV3LkhlaWdodCA9IDM4MDU1OworICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRmlyc3QgbGluZSB0ZXN0Iik7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWzEsIDFdLlZhbHVlID0gIjE7IDEiOworICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSAiMjsgMSI7CisgICAgICAgICAgICB3cy5DZWxsc1sxLCAyXS5WYWx1ZSA9ICIxOyAyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzIsIDJdLlZhbHVlID0gIjI7IDIiOworCisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHdvcmtib29rcHJvdDIueGxzeCIpKTsKKworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWNyeXBUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcZW5jci54bHN4IiksICJ0ZXN0Iik7CisKKyAgICAgICAgICAgIHZhciBuID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLk5hbWU7CisgICAgICAgICAgICBwLkVuY3J5cHRpb24uUGFzc3dvcmQgPSBudWxsOworICAgICAgICAgICAgcC5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxlbmNyTmV3Lnhsc3giKSk7CisgICAgICAgIAorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBFbmNyeXBUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGYgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGVuY3J3cml0ZS54bHN4Iik7CisgICAgICAgICAgICBpZiAoZi5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZi5EZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcC5Xb3JrYm9vay5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCIiKTsKKyAgICAgICAgICAgIHAuV29ya2Jvb2suUHJvdGVjdGlvbi5Mb2NrU3RydWN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIHAuRW5jcnlwdGlvbi5WZXJzaW9uID0gRW5jcnlwdGlvblZlcnNpb24uQWdpbGU7CisKKyAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MSIpOworICAgICAgICAgICAgZm9yIChpbnQgciA9IDE7IHIgPCAxMDAwOyByKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbciwgMV0uVmFsdWUgPSByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC5TYXZlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0V4Y2VsQ2VsbEJhc2VUZXN0LmNzIGIvRVBQbHVzVGVzdC9FeGNlbENlbGxCYXNlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBlMjQyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9FeGNlbENlbGxCYXNlVGVzdC5jcwpAQCAtMCwwICsxLDkxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxDZWxsQmFzZVRlc3QKKyAgICB7CisgICAgICAgICNyZWdpb24gVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMgVGVzdHMKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzT25UaGVTYW1lU2hlZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygiQzMiLCAzLCAzLCAyLCAyLCAic2hlZXQiLCAic2hlZXQiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRjYiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzSWdub3Jlc0luY29ycmVjdFNoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoIkMzIiwgMywgMywgMiwgMiwgInNoZWV0IiwgIm90aGVyIHNoZWV0Iik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkMzIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlc0Z1bGx5UXVhbGlmaWVkUmVmZXJlbmNlT25UaGVTYW1lU2hlZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygiJ3NoZWV0IG5hbWUgaGVyZSchQzMiLCAzLCAzLCAyLCAyLCAic2hlZXQgbmFtZSBoZXJlIiwgInNoZWV0IG5hbWUgaGVyZSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCInc2hlZXQgbmFtZSBoZXJlJyFGNiIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXNGdWxseVF1YWxpZmllZENyb3NzU2hlZXRSZWZlcmVuY2VBcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCJTVU0oJ3NoZWV0IG5hbWUgaGVyZSchQjI6RDQpIiwgMywgMywgMywgMywgImNyb3NzIHNoZWV0IiwgInNoZWV0IG5hbWUgaGVyZSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJTVU0oJ3NoZWV0IG5hbWUgaGVyZSchQjI6RzcpIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlc0Z1bGx5UXVhbGlmaWVkUmVmZXJlbmNlT25BRGlmZmVyZW50U2hlZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygiJ3VwZGF0ZWQgc2hlZXQnIUMzIiwgMywgMywgMiwgMiwgImJvcmluZyBzaGVldCIsICJ1cGRhdGVkIHNoZWV0Iik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIid1cGRhdGVkIHNoZWV0JyFGNiIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXNSZWZlcmVuY2luZ0FEaWZmZXJlbnRTaGVldElzTm90VXBkYXRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCInYm9yaW5nIHNoZWV0JyFDMyIsIDMsIDMsIDIsIDIsICJib3Jpbmcgc2hlZXQiLCAidXBkYXRlZCBzaGVldCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCInYm9yaW5nIHNoZWV0JyFDMyIsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVXBkYXRlQ3Jvc3NTaGVldFJlZmVyZW5jZU5hbWVzIFRlc3RzCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVGb3JtdWxhU2hlZXRSZWZlcmVuY2VzKCkKKyAgICAgICAgeworICAgICAgICAgIHZhciByZXN1bHQgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXMoIjUrJ09sZFNoZWV0JyEkRzMrJ1NvbWUgT3RoZXIgU2hlZXQnIUMzK1NVTSgxLDIsMykiLCAiT2xkU2hlZXQiLCAiTmV3U2hlZXQiKTsKKyAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjUrJ05ld1NoZWV0JyEkRzMrJ1NvbWUgT3RoZXIgU2hlZXQnIUMzK1NVTSgxLDIsMykiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXNOdWxsT2xkU2hlZXRUaHJvd3NFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhU2hlZXRSZWZlcmVuY2VzKCJmb3JtdWxhIiwgbnVsbCwgInNoZWV0MiIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXNFbXB0eU9sZFNoZWV0VGhyb3dzRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlcygiZm9ybXVsYSIsIHN0cmluZy5FbXB0eSwgInNoZWV0MiIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXNOdWxsTmV3U2hlZXRUaHJvd3NFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhU2hlZXRSZWZlcmVuY2VzKCJmb3JtdWxhIiwgInNoZWV0MSIsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXNFbXB0eU5ld1NoZWV0VGhyb3dzRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlcygiZm9ybXVsYSIsICJzaGVldDEiLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9FeGNlbFJhbmdlQmFzZVRlc3QuY3MgYi9FUFBsdXNUZXN0L0V4Y2VsUmFuZ2VCYXNlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzUyYTZmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9FeGNlbFJhbmdlQmFzZVRlc3QuY3MKQEAgLTAsMCArMSw5MyBAQAor77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOworCituYW1lc3BhY2UgRVBQbHVzVGVzdAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEV4Y2VsUmFuZ2VCYXNlVGVzdCA6IFRlc3RCYXNlCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29weUNvcGllc0NvbW1lbnRzRnJvbVNpbmdsZUNlbGxSYW5nZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0QmFzZSgpOworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3czEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbW1lbnRDb3B5aW5nIik7CisgICAgICAgICAgICB2YXIgc291cmNlRXhjZWxSYW5nZSA9IHdzMS5DZWxsc1szLCAzXTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoc291cmNlRXhjZWxSYW5nZS5Db21tZW50KTsKKyAgICAgICAgICAgIHNvdXJjZUV4Y2VsUmFuZ2UuQWRkQ29tbWVudCgiVGVzdGluZyBjb21tZW50IDEiLCAidGVzdDEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVzdDEiLCBzb3VyY2VFeGNlbFJhbmdlLkNvbW1lbnQuQXV0aG9yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDEiLCBzb3VyY2VFeGNlbFJhbmdlLkNvbW1lbnQuVGV4dCk7CisgICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlID0gd3MxLkNlbGxzWzUsIDVdOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkZXN0aW5hdGlvbkV4Y2VsUmFuZ2UuQ29tbWVudCk7CisgICAgICAgICAgICBzb3VyY2VFeGNlbFJhbmdlLkNvcHkoZGVzdGluYXRpb25FeGNlbFJhbmdlKTsKKyAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgb3JpZ2luYWwgY29tbWVudCBpcyBpbnRhY3QuCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgc291cmNlRXhjZWxSYW5nZS5Db21tZW50LkF1dGhvcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RpbmcgY29tbWVudCAxIiwgc291cmNlRXhjZWxSYW5nZS5Db21tZW50LlRleHQpOworICAgICAgICAgICAgLy8gQXNzZXJ0IHRoZSBjb21tZW50IHdhcyBjb3BpZWQuCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlLkNvbW1lbnQuQXV0aG9yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDEiLCBkZXN0aW5hdGlvbkV4Y2VsUmFuZ2UuQ29tbWVudC5UZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5Q29waWVzQ29tbWVudHNGcm9tTXVsdGlDZWxsUmFuZ2VzKCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5pdEJhc2UoKTsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MxID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb21tZW50Q29weWluZyIpOworICAgICAgICAgICAgdmFyIHNvdXJjZUV4Y2VsUmFuZ2VDMyA9IHdzMS5DZWxsc1szLCAzXTsKKyAgICAgICAgICAgIHZhciBzb3VyY2VFeGNlbFJhbmdlRDMgPSB3czEuQ2VsbHNbMywgNF07CisgICAgICAgICAgICB2YXIgc291cmNlRXhjZWxSYW5nZUUzID0gd3MxLkNlbGxzWzMsIDVdOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChzb3VyY2VFeGNlbFJhbmdlQzMuQ29tbWVudCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHNvdXJjZUV4Y2VsUmFuZ2VEMy5Db21tZW50KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoc291cmNlRXhjZWxSYW5nZUUzLkNvbW1lbnQpOworICAgICAgICAgICAgc291cmNlRXhjZWxSYW5nZUMzLkFkZENvbW1lbnQoIlRlc3RpbmcgY29tbWVudCAxIiwgInRlc3QxIik7CisgICAgICAgICAgICBzb3VyY2VFeGNlbFJhbmdlRDMuQWRkQ29tbWVudCgiVGVzdGluZyBjb21tZW50IDIiLCAidGVzdDEiKTsKKyAgICAgICAgICAgIHNvdXJjZUV4Y2VsUmFuZ2VFMy5BZGRDb21tZW50KCJUZXN0aW5nIGNvbW1lbnQgMyIsICJ0ZXN0MSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZXN0MSIsIHNvdXJjZUV4Y2VsUmFuZ2VDMy5Db21tZW50LkF1dGhvcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RpbmcgY29tbWVudCAxIiwgc291cmNlRXhjZWxSYW5nZUMzLkNvbW1lbnQuVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgc291cmNlRXhjZWxSYW5nZUQzLkNvbW1lbnQuQXV0aG9yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDIiLCBzb3VyY2VFeGNlbFJhbmdlRDMuQ29tbWVudC5UZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVzdDEiLCBzb3VyY2VFeGNlbFJhbmdlRTMuQ29tbWVudC5BdXRob3IpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMyIsIHNvdXJjZUV4Y2VsUmFuZ2VFMy5Db21tZW50LlRleHQpOworICAgICAgICAgICAgLy8gQ29weSB0aGUgZnVsbCByb3cgdG8gY2FwdHVyZSBlYWNoIGNlbGwgYXQgb25jZS4KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwod3MxLkNlbGxzWzUsIDNdLkNvbW1lbnQpOworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCh3czEuQ2VsbHNbNSwgNF0uQ29tbWVudCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHdzMS5DZWxsc1s1LCA1XS5Db21tZW50KTsKKyAgICAgICAgICAgIHdzMS5DZWxsc1siMzozIl0uQ29weSh3czEuQ2VsbHNbIjU6NSJdKTsKKyAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgb3JpZ2luYWwgY29tbWVudHMgYXJlIGludGFjdC4KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVzdDEiLCBzb3VyY2VFeGNlbFJhbmdlQzMuQ29tbWVudC5BdXRob3IpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMSIsIHNvdXJjZUV4Y2VsUmFuZ2VDMy5Db21tZW50LlRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZXN0MSIsIHNvdXJjZUV4Y2VsUmFuZ2VEMy5Db21tZW50LkF1dGhvcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RpbmcgY29tbWVudCAyIiwgc291cmNlRXhjZWxSYW5nZUQzLkNvbW1lbnQuVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgc291cmNlRXhjZWxSYW5nZUUzLkNvbW1lbnQuQXV0aG9yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDMiLCBzb3VyY2VFeGNlbFJhbmdlRTMuQ29tbWVudC5UZXh0KTsKKyAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgY29tbWVudHMgd2VyZSBjb3BpZWQuCisgICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlQzUgPSB3czEuQ2VsbHNbNSwgM107CisgICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlRDUgPSB3czEuQ2VsbHNbNSwgNF07CisgICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlRTUgPSB3czEuQ2VsbHNbNSwgNV07CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlQzUuQ29tbWVudC5BdXRob3IpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMSIsIGRlc3RpbmF0aW9uRXhjZWxSYW5nZUM1LkNvbW1lbnQuVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlRDUuQ29tbWVudC5BdXRob3IpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMiIsIGRlc3RpbmF0aW9uRXhjZWxSYW5nZUQ1LkNvbW1lbnQuVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlRTUuQ29tbWVudC5BdXRob3IpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMyIsIGRlc3RpbmF0aW9uRXhjZWxSYW5nZUU1LkNvbW1lbnQuVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dGluZ0FkZHJlc3NIYW5kbGVzTXVsdGlBZGRyZXNzZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MSIpOworICAgICAgICAgICAgICAgIHZhciBuYW1lID0gcGFja2FnZS5Xb3JrYm9vay5OYW1lcy5BZGQoIlRlc3QiLCB3b3Jrc2hlZXQuQ2VsbHNbMywgM10pOworICAgICAgICAgICAgICAgIG5hbWUuQWRkcmVzcyA9ICJTaGVldDEhQzMiOworICAgICAgICAgICAgICAgIG5hbWUuQWRkcmVzcyA9ICJTaGVldDEhRDMiOworICAgICAgICAgICAgICAgIEFzc2VydC5Jc051bGwobmFtZS5BZGRyZXNzZXMpOworICAgICAgICAgICAgICAgIG5hbWUuQWRkcmVzcyA9ICJDMzpEMyxFMzpGMyI7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChuYW1lLkFkZHJlc3Nlcyk7CisgICAgICAgICAgICAgICAgbmFtZS5BZGRyZXNzID0gIlNoZWV0MSFDMyI7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChuYW1lLkFkZHJlc3Nlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0V4Y2VsU3R5bGVUZXN0LmNzIGIvRVBQbHVzVGVzdC9FeGNlbFN0eWxlVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBlMTVmCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9FeGNlbFN0eWxlVGVzdC5jcwpAQCAtMCwwICsxLDI5IEBACivvu791c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxTdHlsZVRlc3QKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBRdW90ZVByZWZpeFN0eWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlF1b3RlUHJlZml4VGVzdCIpOworICAgICAgICAgICAgICAgIHZhciBjZWxsID0gd3MuQ2VsbHNbIkIyIl07CisgICAgICAgICAgICAgICAgY2VsbC5TdHlsZS5RdW90ZVByZWZpeCA9IHRydWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjZWxsLlN0eWxlLlF1b3RlUHJlZml4KTsKKworICAgICAgICAgICAgICAgIHAuV29ya2Jvb2suU3R5bGVzLlVwZGF0ZVhtbCgpOworICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IHAuV29ya2Jvb2suU3R5bGVzWG1sLlNlbGVjdE5vZGVzKCIvL2Q6Y2VsbFhmcy9kOnhmIiwgcC5Xb3JrYm9vay5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgcXVvdGVQcmVmaXggYXR0cmlidXRlIGlzIG5vdCBwYXJ0IG9mIHRoZSBkZWZhdWx0IHN0eWxlLAorICAgICAgICAgICAgICAgIC8vIGEgbmV3IG9uZSBzaG91bGQgYmUgY3JlYXRlZCBhbmQgcmVmZXJlbmNlZC4KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwoMCwgY2VsbC5TdHlsZUlEKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG5vZGVzWzBdLkF0dHJpYnV0ZXNbInF1b3RlUHJlZml4Il0pOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMSIsIG5vZGVzW2NlbGwuU3R5bGVJRF0uQXR0cmlidXRlc1sicXVvdGVQcmVmaXgiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlckZhY3RvcnlUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyRmFjdG9yeVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlckZhY3RvcnlUZXN0cy5jcwpAQCAtMCwwICsxLDQzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2VyRmFjdG9yeVRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIEFyZ3VtZW50UGFyc2VyRmFjdG9yeSBfcGFyc2VyRmFjdG9yeTsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNlckZhY3RvcnkgPSBuZXcgQXJndW1lbnRQYXJzZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuSW50QXJndW1lbnRQYXJzZXJXaGVuRGF0YVR5cGVJc0ludGVnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gX3BhcnNlckZhY3RvcnkuQ3JlYXRlQXJndW1lbnRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShwYXJzZXIsIHR5cGVvZihJbnRBcmd1bWVudFBhcnNlcikpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybkJvb2xBcmd1bWVudFBhcnNlcldoZW5EYXRhVHlwZUlzQm9vbGVhbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXIgPSBfcGFyc2VyRmFjdG9yeS5DcmVhdGVBcmd1bWVudFBhcnNlcihEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHBhcnNlciwgdHlwZW9mKEJvb2xBcmd1bWVudFBhcnNlcikpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybkRvdWJsZUFyZ3VtZW50UGFyc2VyV2hlbkRhdGFUeXBlSXNEZWNpYWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gX3BhcnNlckZhY3RvcnkuQ3JlYXRlQXJndW1lbnRQYXJzZXIoRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShwYXJzZXIsIHR5cGVvZihEb3VibGVBcmd1bWVudFBhcnNlcikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzSW1wbGVtZW50YXRpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlcnNJbXBsZW1lbnRhdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E0MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzSW1wbGVtZW50YXRpb25zVGVzdHMuY3MKQEAgLTAsMCArMSwxMDggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2Vyc0ltcGxlbWVudGF0aW9uc1Rlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBJbnRQYXJzZXJTaG91bGRUaHJvd0lmQXJndW1lbnRJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEludEFyZ3VtZW50UGFyc2VyKCk7CisgICAgICAgICAgICBwYXJzZXIuUGFyc2UobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW50UGFyc2VyU2hvdWxkQ29udmVydFRvQW5JbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBJbnRBcmd1bWVudFBhcnNlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZSgzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEludFBhcnNlclNob3VsZENvbnZlcnRBRG91YmxlVG9BbkludGVnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEludEFyZ3VtZW50UGFyc2VyKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKDNkKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEludFBhcnNlclNob3VsZENvbnZlcnRBU3RyaW5nVmFsdWVUb0FuSW50ZWdlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgSW50QXJndW1lbnRQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjMiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEJvb2xQYXJzZXJTaG91bGRDb252ZXJ0TnVsbFRvRmFsc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEJvb2xBcmd1bWVudFBhcnNlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChib29sKXBhcnNlci5QYXJzZShudWxsKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQm9vbFBhcnNlclNob3VsZENvbnZlcnRTdHJpbmdWYWx1ZVRydWVUb0Jvb2xWYWx1ZVRydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEJvb2xBcmd1bWVudFBhcnNlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChib29sKXBhcnNlci5QYXJzZSgidHJ1ZSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEJvb2xQYXJzZXJTaG91bGRDb252ZXJ0MFRvRmFsc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEJvb2xBcmd1bWVudFBhcnNlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChib29sKXBhcnNlci5QYXJzZSgwKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQm9vbFBhcnNlclNob3VsZENvbnZlcnQxVG9UcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBCb29sQXJndW1lbnRQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoYm9vbClwYXJzZXIuUGFyc2UoMCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERvdWJsZVBhcnNlclNob3VsZENvbnZlcnREb3VibGVUb0RvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoM2QpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERvdWJsZVBhcnNlclNob3VsZENvbnZlcnRJbnRUb0RvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoMyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBEb3VibGVQYXJzZXJTaG91bGRUaHJvd0lmQXJndW1lbnRJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IERvdWJsZUFyZ3VtZW50UGFyc2VyKCk7CisgICAgICAgICAgICBwYXJzZXIuUGFyc2UobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRG91YmxlUGFyc2VyQ29udmVydFN0cmluZ1RvRG91YmxlV2l0aERvdFNlcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjMuMyIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuM2QsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vyc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3Y2IyOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vyc1Rlc3RzLmNzCkBAIC0wLDAgKzEsMjMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQXJndW1lbnRQYXJzZXJzVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5TYW1lSW5zdGFuY2VPZkludFBhcnNlcldoZW5DYWxsZWRUd2ljZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXJzID0gbmV3IEFyZ3VtZW50UGFyc2VycygpOworICAgICAgICAgICAgdmFyIHBhcnNlcjEgPSBwYXJzZXJzLkdldFBhcnNlcihEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIHZhciBwYXJzZXIyID0gcGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGFyc2VyMSwgcGFyc2VyMik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db3VudElmc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ291bnRJZnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2E2ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ291bnRJZnNUZXN0cy5jcwpAQCAtMCwwICsxLDEzNCBAQAor77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQ291bnRJZnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdHNoZWV0Iik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlU2luZ2xlTnVtZXJpY0NyaXRlcmlhKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIkNPVU5USUZTKEExOkEzLCAxKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVTaW5nbGVSYW5nZUNyaXRlcmlhKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRJRlMoQTE6QTMsIEIxKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVTaW5nbGVOdW1lcmljV2lsZGNhcmRDcml0ZXJpYSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVElGUyhBMTpBMywgXCI8M1wiKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVTaW5nbGVTdHJpbmdDcml0ZXJpYSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiYWJjIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVElGUyhBMTpBMywgXCJkZWZcIikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlU2luZ2xlU3RyaW5nV2lsZGNhcmRDcml0ZXJpYSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiYWJjIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVElGUyhBMTpBMywgXCJkKmZcIikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlTnVsbFJhbmdlQ3JpdGVyaWEoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRJRlMoQTE6QTMsIEIxKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVNdWx0aXBsZVJhbmdlc0FuZENyaXRlcmlhcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiYWJjIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQzEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJDMiJdLlZhbHVlID0gMjAwOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQzMiXS5WYWx1ZSA9IDM7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJDNCJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJDT1VOVElGUyhBMTpBNCwgXCJkKmZcIiwgQjE6QjQ7IDI7IEMxOkM0OyAyMDApIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFNldEVycm9yVmFsdWVJZk51bWJlck9mQ2VsbHNJblJhbmdlc0RpZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiYWJjIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIkNPVU5USUZTKEExOkE0LCBcImQqZlwiLCBCMTpCMzsgMikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Dcml0ZXJpYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvQ3JpdGVyaWFUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzBjNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvQ3JpdGVyaWFUZXN0cy5jcwpAQCAtMCwwICsxLDc2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQ3JpdGVyaWFUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyaXRlcmlhU2hvdWxkUmVhZEZpZWxkc0FuZFZhbHVlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiQ3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gIkNyaXQyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOworCisgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKHBhY2thZ2UpOworCisgICAgICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYShwcm92aWRlciwgIkExOkIyIik7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgY3JpdGVyaWEuSXRlbXMuQ291bnQpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiY3JpdDEiLCBjcml0ZXJpYS5JdGVtcy5LZXlzLkZpcnN0KCkuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJjcml0MiIsIGNyaXRlcmlhLkl0ZW1zLktleXMuTGFzdCgpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjcml0ZXJpYS5JdGVtcy5WYWx1ZXMuRmlyc3QoKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGNyaXRlcmlhLkl0ZW1zLlZhbHVlcy5MYXN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyaXRlcmlhU2hvdWxkSWdub3JlRW1wdHlGaWVsZHMxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJDcml0MSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiQ3JpdDIiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKKworICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihwYWNrYWdlKTsKKworICAgICAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEocHJvdmlkZXIsICJBMTpCMiIpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNyaXRlcmlhLkl0ZW1zLkNvdW50KTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNyaXQxIiwgY3JpdGVyaWEuSXRlbXMuS2V5cy5GaXJzdCgpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjcml0ZXJpYS5JdGVtcy5WYWx1ZXMuTGFzdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDcml0ZXJpYVNob3VsZElnbm9yZUVtcHR5RmllbGRzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiQ3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKKworICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihwYWNrYWdlKTsKKworICAgICAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEocHJvdmlkZXIsICJBMTpCMiIpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNyaXRlcmlhLkl0ZW1zLkNvdW50KTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNyaXQxIiwgY3JpdGVyaWEuSXRlbXMuS2V5cy5GaXJzdCgpLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjcml0ZXJpYS5JdGVtcy5WYWx1ZXMuTGFzdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzA5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlVGVzdHMuY3MKQEAgLTAsMCArMSw3NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERhdGFiYXNlU2hvdWxkUmVhZEZpZWxkcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2UgPSBHZXREYXRhYmFzZShwYWNrYWdlKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBkYXRhYmFzZS5GaWVsZHMuQ291bnQoKSwgImNvdW50IHdhcyBub3QgMiIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiY29sMSIsIGRhdGFiYXNlLkZpZWxkcy5GaXJzdCgpLkZpZWxkTmFtZSwgImZpcnN0IGZpZWxkbmFtZSB3YXMgbm90ICdjb2wxJyIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiY29sMiIsIGRhdGFiYXNlLkZpZWxkcy5MYXN0KCkuRmllbGROYW1lLCAibGFzdCBmaWVsZG5hbWUgd2FzIG5vdCAnY29sMTInIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSGFzTW9yZVJvd3NTaG91bGRCZVRydWVXaGVuSW5pdGlhbGl6ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGFiYXNlID0gR2V0RGF0YWJhc2UocGFja2FnZSk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGRhdGFiYXNlLkhhc01vcmVSb3dzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhhc01vcmVSb3dzU2hvdWxkQmVGYWxzZVdoZW5MYXN0Um93SXNSZWFkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZSA9IEdldERhdGFiYXNlKHBhY2thZ2UpOworICAgICAgICAgICAgICAgIGRhdGFiYXNlLlJlYWQoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGRhdGFiYXNlLkhhc01vcmVSb3dzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERhdGFiYXNlU2hvdWxkUmVhZEZpZWxkc0luUm93KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZSA9IEdldERhdGFiYXNlKHBhY2thZ2UpOworICAgICAgICAgICAgICAgIHZhciByb3cgPSBkYXRhYmFzZS5SZWFkKCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcm93WyJjb2wxIl0pOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByb3dbImNvbDIiXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YWJhc2UgR2V0RGF0YWJhc2UoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihwYWNrYWdlKTsKKyAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNvbDEiOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY29sMiI7CisgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICB2YXIgZGF0YWJhc2UgPSBuZXcgRXhjZWxEYXRhYmFzZShwcm92aWRlciwgIkExOkIyIik7CisgICAgICAgICAgICByZXR1cm4gZGF0YWJhc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Sb3dNYXRjaGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Sb3dNYXRjaGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL1Jvd01hdGNoZXJUZXN0cy5jcwpAQCAtMCwwICsxLDE1NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKK3VzaW5nIFJoaW5vLk1vY2tzOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBSb3dNYXRjaGVyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxEYXRhYmFzZUNyaXRlcmlhIEdldENyaXRlcmlhKERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4gaXRlbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFiYXNlQ3JpdGVyaWE+KHByb3ZpZGVyLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjcml0ZXJpYS5TdHViKHggPT4geC5JdGVtcykuUmV0dXJuKGl0ZW1zKTsKKyAgICAgICAgICAgIHJldHVybiBjcml0ZXJpYTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNNYXRjaFNob3VsZFJldHVyblRydWVJZkNyaXRlcmlhc01hdGNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOworICAgICAgICAgICAgZGF0YVsiQ3JpdDEiXSA9IDE7CisgICAgICAgICAgICBkYXRhWyJDcml0MiJdID0gMjsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQzIl0gPSAzOworCisgICAgICAgICAgICB2YXIgY3JpdCA9IG5ldyBEaWN0aW9uYXJ5PEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLCBvYmplY3Q+KCk7CisgICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDEiKV0gPSAxOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gMzsKKworICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOworCisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtYXRjaGVyLklzTWF0Y2goZGF0YSwgY3JpdGVyaWEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc01hdGNoU2hvdWxkUmV0dXJuRmFsc2VJZkNyaXRlcmlhc0RvZXNOb3RNYXRjaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IEV4Y2VsRGF0YWJhc2VSb3coKTsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQxIl0gPSAxOworICAgICAgICAgICAgZGF0YVsiQ3JpdDIiXSA9IDI7CisgICAgICAgICAgICBkYXRhWyJDcml0MyJdID0gMzsKKworICAgICAgICAgICAgdmFyIGNyaXQgPSBuZXcgRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PigpOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQxIildID0gMTsKKyAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKCJDcml0MyIpXSA9IDQ7CisKKyAgICAgICAgICAgIHZhciBtYXRjaGVyID0gbmV3IFJvd01hdGNoZXIoKTsKKworICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gR2V0Q3JpdGVyaWEoY3JpdCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKG1hdGNoZXIuSXNNYXRjaChkYXRhLCBjcml0ZXJpYSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzTWF0Y2hTaG91bGRNYXRjaFN0cmluZ3MxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOworICAgICAgICAgICAgZGF0YVsiQ3JpdDEiXSA9ICIxIjsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQyIl0gPSAyOworICAgICAgICAgICAgZGF0YVsiQ3JpdDMiXSA9IDM7CisKKyAgICAgICAgICAgIHZhciBjcml0ID0gbmV3IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4oKTsKKyAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKCJDcml0MSIpXSA9ICIxIjsKKyAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKCJDcml0MyIpXSA9IDM7CisKKyAgICAgICAgICAgIHZhciBtYXRjaGVyID0gbmV3IFJvd01hdGNoZXIoKTsKKworICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gR2V0Q3JpdGVyaWEoY3JpdCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWF0Y2hlci5Jc01hdGNoKGRhdGEsIGNyaXRlcmlhKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNNYXRjaFNob3VsZE1hdGNoU3RyaW5nczIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBFeGNlbERhdGFiYXNlUm93KCk7CisgICAgICAgICAgICBkYXRhWyJDcml0MSJdID0gIjIiOworICAgICAgICAgICAgZGF0YVsiQ3JpdDIiXSA9IDI7CisgICAgICAgICAgICBkYXRhWyJDcml0MyJdID0gMzsKKworICAgICAgICAgICAgdmFyIGNyaXQgPSBuZXcgRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PigpOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQxIildID0gIjEiOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gMzsKKworICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOworCisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWF0Y2hlci5Jc01hdGNoKGRhdGEsIGNyaXRlcmlhKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNNYXRjaFNob3VsZE1hdGNoV2lsZGNhcmRTdHJpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOworICAgICAgICAgICAgZGF0YVsiQ3JpdDEiXSA9ICJ0ZXN0IjsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQyIl0gPSAyOworICAgICAgICAgICAgZGF0YVsiQ3JpdDMiXSA9IDM7CisKKyAgICAgICAgICAgIHZhciBjcml0ID0gbmV3IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4oKTsKKyAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKCJDcml0MSIpXSA9ICJ0KnQiOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gMzsKKworICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOworCisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtYXRjaGVyLklzTWF0Y2goZGF0YSwgY3JpdGVyaWEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc01hdGNoU2hvdWxkTWF0Y2hOdW1lcmljRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IEV4Y2VsRGF0YWJhc2VSb3coKTsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQxIl0gPSAidGVzdCI7CisgICAgICAgICAgICBkYXRhWyJDcml0MiJdID0gMjsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQzIl0gPSAzOworCisgICAgICAgICAgICB2YXIgY3JpdCA9IG5ldyBEaWN0aW9uYXJ5PEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLCBvYmplY3Q+KCk7CisgICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDIiKV0gPSAiPDMiOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gMzsKKworICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOworCisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtYXRjaGVyLklzTWF0Y2goZGF0YSwgY3JpdGVyaWEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc01hdGNoU2hvdWxkSGFuZGxlRmllbGRJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IEV4Y2VsRGF0YWJhc2VSb3coKTsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQxIl0gPSAidGVzdCI7CisgICAgICAgICAgICBkYXRhWyJDcml0MiJdID0gMjsKKyAgICAgICAgICAgIGRhdGFbIkNyaXQzIl0gPSAzOworCisgICAgICAgICAgICB2YXIgY3JpdCA9IG5ldyBEaWN0aW9uYXJ5PEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLCBvYmplY3Q+KCk7CisgICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgyKV0gPSAiPDMiOworICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gMzsKKworICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOworCisgICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtYXRjaGVyLklzTWF0Y2goZGF0YSwgY3JpdGVyaWEpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZUZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMGY5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZUZ1bmN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNDcyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7Cit1c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRGF0ZVRpbWVGdW5jdGlvbnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKworICAgICAgICBwcml2YXRlIGRvdWJsZSBHZXRUaW1lKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VjSW5BRGF5ID0gRGF0ZVRpbWUuVG9kYXkuQWRkRGF5cygxKS5TdWJ0cmFjdChEYXRlVGltZS5Ub2RheSkuVG90YWxTZWNvbmRzOworICAgICAgICAgICAgdmFyIHNlY29uZHNPZkV4YW1wbGUgPSAoZG91YmxlKShob3VyICogNjAgKiA2MCArIG1pbnV0ZSAqIDYwICsgc2Vjb25kKTsKKyAgICAgICAgICAgIHJldHVybiBzZWNvbmRzT2ZFeGFtcGxlIC8gc2VjSW5BRGF5OworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRlRnVuY3Rpb25TaG91bGRSZXR1cm5BRGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERhdGUoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMjAxMiwgNCwgMyk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGF0YVR5cGUuRGF0ZSwgcmVzdWx0LkRhdGFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRlRnVuY3Rpb25TaG91bGRSZXR1cm5BQ29ycmVjdERhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWREYXRlID0gbmV3IERhdGVUaW1lKDIwMTIsIDQsIDMpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMDEyLCA0LCAzKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUuVG9PQURhdGUoKSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0ZUZ1bmN0aW9uU2hvdWxkTW9udGhGcm9tUHJldlllYXJJZk1vbnRoSXNOZWdhdGl2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMSwgMTEsIDMpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMDEyLCAtMSwgMyk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWREYXRlLlRvT0FEYXRlKCksIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE5vd0Z1bmN0aW9uU2hvdWxkUmV0dXJuTm93KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcCgxKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE5vdygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgRnVuY3Rpb25Bcmd1bWVudFswXTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIFRocmVhZC5TbGVlcCgxKTsKKyAgICAgICAgICAgIHZhciBlbmRUaW1lID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgdmFyIHJlc3VsdERhdGUgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKChkb3VibGUpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdERhdGUgPiBzdGFydFRpbWUgJiYgcmVzdWx0RGF0ZSA8IGVuZFRpbWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRvZGF5RnVuY3Rpb25TaG91bGRSZXR1cm5Ub2RheXNEYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVG9kYXkoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IEZ1bmN0aW9uQXJndW1lbnRbMF07CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0RGF0ZSA9IERhdGVUaW1lLkZyb21PQURhdGUoKGRvdWJsZSlyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChEYXRlVGltZS5Ob3cuRGF0ZSwgcmVzdWx0RGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF5U2hvdWxkUmV0dXJuRGF5SW5Nb250aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGVUaW1lKDIwMTIsIDMsIDEyKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkYXRlLlRvT0FEYXRlKCkpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXlTaG91bGRSZXR1cm5Nb250aE9mWWVhcldpdGhTdHJpbmdQYXJhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGVUaW1lKDIwMTIsIDMsIDEyKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMjAxMi0wMy0xMiIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNb250aFNob3VsZFJldHVybk1vbnRoT2ZZZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMywgMTIpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTW9udGgoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZGF0ZS5Ub09BRGF0ZSgpKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNb250aFNob3VsZFJldHVybk1vbnRoT2ZZZWFyV2l0aFN0cmluZ1BhcmFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMywgMTIpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTW9udGgoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjIwMTItMDMtMTIiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBZZWFyU2hvdWxkUmV0dXJuQ29ycmVjdFllYXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEyLCAzLCAxMik7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBZZWFyKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGRhdGUuVG9PQURhdGUoKSksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAxMiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgWWVhclNob3VsZFJldHVybkNvcnJlY3RZZWFyV2l0aFN0cmluZ1BhcmFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMywgMTIpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgWWVhcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMjAxMi0wMy0xMiIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMTIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRpbWVTaG91bGRSZXR1cm5BQ29ycmVjdFNlcmlhbE51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9IEdldFRpbWUoMTAsIDExLCAxMik7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwLCAxMSwgMTIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsgIAorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRpbWVTaG91bGRQYXJzZVN0cmluZ0NvcnJlY3RseSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9IEdldFRpbWUoMTAsIDExLCAxMik7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxMDoxMToxMiIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGltZVNob3VsZFRocm93RXhjZXB0aW9uSWZTZWNvbmRzSXNPdXRPZlJhbmdlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVGltZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMCwgMTEsIDYwKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVGltZVNob3VsZFRocm93RXhjZXB0aW9uSWZNaW51dGVJc091dE9mUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwLCA2MCwgMTIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBUaW1lU2hvdWxkVGhyb3dFeGNlcHRpb25JZkhvdXJJc091dE9mUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDI0LCAxMiwgMTIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhvdXJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSG91cigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhHZXRUaW1lKDksIDEzLCAxNCkpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDksIHJlc3VsdC5SZXN1bHQpOworCisgICAgICAgICAgICByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoR2V0VGltZSgyMywgMTMsIDE0KSksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjMsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1pbnV0ZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNaW51dGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoR2V0VGltZSg5LCAxNCwgMTQpKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNCwgcmVzdWx0LlJlc3VsdCk7CisKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhHZXRUaW1lKDksIDU1LCAxNCkpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDU1LCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTZWNvbmRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU2Vjb25kKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEdldFRpbWUoOSwgMTQsIDE3KSksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTcsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNlY29uZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoU3RyaW5nQXJndW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTZWNvbmQoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjIwMTItMDMtMjcgMTA6MTE6MTIiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWludXRlU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhTdHJpbmdBcmd1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1pbnV0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMjAxMi0wMy0yNyAxMDoxMToxMiIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIb3VyU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhTdHJpbmdBcmd1bWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEhvdXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjIwMTItMDMtMjcgMTA6MTE6MTIiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgV2Vla2RheVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRGb3JBU3VuZGF5V2hlblJldHVyblR5cGVJczEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBXZWVrZGF5KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKG5ldyBEYXRlVGltZSgyMDEyLCA0LCAxKS5Ub09BRGF0ZSgpLCAxKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBXZWVrZGF5U2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdEZvckFTdW5kYXlXaGVuUmV0dXJuVHlwZUlzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFdlZWtkYXkoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MobmV3IERhdGVUaW1lKDIwMTIsIDQsIDEpLlRvT0FEYXRlKCksIDIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFdlZWtkYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0Rm9yQVN1bmRheVdoZW5SZXR1cm5UeXBlSXMzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgV2Vla2RheSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhuZXcgRGF0ZVRpbWUoMjAxMiwgNCwgMSkuVG9PQURhdGUoKSwgMyksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgV2Vla051bVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBXZWVrbnVtKCk7CisgICAgICAgICAgICB2YXIgZHQxID0gbmV3IERhdGVUaW1lKDIwMTIsIDEyLCAzMSkuVG9PQURhdGUoKTsKKyAgICAgICAgICAgIHZhciBkdDIgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMSwgMSkuVG9PQURhdGUoKTsKKyAgICAgICAgICAgIHZhciBkdDMgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMjApLlRvT0FEYXRlKCk7CisKKyAgICAgICAgICAgIHZhciByMSA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDEpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHIyID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB2YXIgcjMgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZHQzLCAyKSwgX3BhcnNpbmdDb250ZXh0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUzLCByMS5SZXN1bHQsICJyMS5SZXN1bHQgd2FzIG5vdCA1MywgYnV0ICIgKyByMS5SZXN1bHQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcjIuUmVzdWx0LCAicjIuUmVzdWx0IHdhcyBub3QgMSwgYnV0ICIgKyByMi5SZXN1bHQuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcjMuUmVzdWx0LCAicjMuUmVzdWx0IHdhcyBub3QgMywgYnV0ICIgKyByMy5SZXN1bHQuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRWRhdGVTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRWRhdGUoKTsKKworICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEyLCAxLCAzMSkuVG9PQURhdGUoKTsKKyAgICAgICAgICAgIHZhciBkdDJhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMSkuVG9PQURhdGUoKTsKKyAgICAgICAgICAgIHZhciBkdDNhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMiwgMjgpLlRvT0FEYXRlKCk7CisKKyAgICAgICAgICAgIHZhciByMSA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIDEpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHIyID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MmFyZywgLTEpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHIzID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0M2FyZywgMiksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIHZhciBkdDEgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKChkb3VibGUpIHIxLlJlc3VsdCk7CisgICAgICAgICAgICB2YXIgZHQyID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKXIyLlJlc3VsdCk7CisgICAgICAgICAgICB2YXIgZHQzID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKXIzLlJlc3VsdCk7CisKKyAgICAgICAgICAgIHZhciBleHAxID0gbmV3IERhdGVUaW1lKDIwMTIsIDIsIDI5KTsKKyAgICAgICAgICAgIHZhciBleHAyID0gbmV3IERhdGVUaW1lKDIwMTIsIDEyLCAxKTsKKyAgICAgICAgICAgIHZhciBleHAzID0gbmV3IERhdGVUaW1lKDIwMTMsIDQsIDI4KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cDEsIGR0MSwgImR0MSB3YXMgbm90ICIgKyBleHAxLlRvU3RyaW5nKCJ5eXl5LU1NLWRkIikgKyAiLCBidXQgIiArIGR0MS5Ub1N0cmluZygieXl5eS1NTS1kZCIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHAyLCBkdDIsICJkdDEgd2FzIG5vdCAiICsgZXhwMi5Ub1N0cmluZygieXl5eS1NTS1kZCIpICsgIiwgYnV0ICIgKyBkdDIuVG9TdHJpbmcoInl5eXktTU0tZGQiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwMywgZHQzLCAiZHQxIHdhcyBub3QgIiArIGV4cDMuVG9TdHJpbmcoInl5eXktTU0tZGQiKSArICIsIGJ1dCAiICsgZHQzLlRvU3RyaW5nKCJ5eXl5LU1NLWRkIikpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERheXMzNjBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aE5vTWV0aG9kU3BlY2lmaWVkMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheXMzNjAoKTsKKworICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZyksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5MCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF5czM2MFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoRXVyb01ldGhvZFNwZWNpZmllZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheXMzNjAoKTsKKworICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgdHJ1ZSksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4OSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF5czM2MFNob3VsZEhhbmRsZUZlYldpdGhFdXJvTWV0aG9kU3BlY2lmaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF5czM2MCgpOworCisgICAgICAgICAgICB2YXIgZHQxYXJnID0gbmV3IERhdGVUaW1lKDIwMTIsIDIsIDI5KS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAyLCAyOCkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgdHJ1ZSksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzNTksIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERheXMzNjBTaG91bGRIYW5kbGVGZWJXaXRoVXNNZXRob2RTcGVjaWZpZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBEYXlzMzYwKCk7CisKKyAgICAgICAgICAgIHZhciBkdDFhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMiwgMjkpLlRvT0FEYXRlKCk7CisgICAgICAgICAgICB2YXIgZHQyYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDI4KS5Ub09BRGF0ZSgpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MWFyZywgZHQyYXJnLCBmYWxzZSksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzNTgsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERheXMzNjBTaG91bGRIYW5kbGVGZWJXaXRoVXNNZXRob2RTcGVjaWZpZWQyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF5czM2MCgpOworCisgICAgICAgICAgICB2YXIgZHQxYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDI4KS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgZmFsc2UpLCBfcGFyc2luZ0NvbnRleHQpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFllYXJGcmFjU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhVc0Jhc2lzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgWWVhcmZyYWMoKTsKKyAgICAgICAgICAgIHZhciBkdDFhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMiwgMjgpLlRvT0FEYXRlKCk7CisgICAgICAgICAgICB2YXIgZHQyYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDMsIDMxKS5Ub09BRGF0ZSgpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MWFyZywgZHQyYXJnKSwgX3BhcnNpbmdDb250ZXh0KTsKKworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpIHJlc3VsdC5SZXN1bHQsIDQpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKE1hdGguQWJzKDAuMDg2MSAtIHJvdW5kZWRSZXN1bHQpIDwgZG91YmxlLkVwc2lsb24pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFllYXJGcmFjU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhFdXJvQmFzaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBZZWFyZnJhYygpOworICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAyLCAyOCkuVG9PQURhdGUoKTsKKyAgICAgICAgICAgIHZhciBkdDJhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMywgMzEpLlRvT0FEYXRlKCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZHQxYXJnLCBkdDJhcmcsIDQpLCBfcGFyc2luZ0NvbnRleHQpOworCisgICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA0KTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShNYXRoLkFicygwLjA4ODkgLSByb3VuZGVkUmVzdWx0KSA8IGRvdWJsZS5FcHNpbG9uKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBZZWFyRnJhY0FjdHVhbEFjdHVhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFllYXJmcmFjKCk7CisgICAgICAgICAgICB2YXIgZHQxYXJnID0gbmV3IERhdGVUaW1lKDIwMTIsIDIsIDI4KS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgMSksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDQpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKE1hdGguQWJzKDEuMDg2MiAtIHJvdW5kZWRSZXN1bHQpIDwgZG91YmxlLkVwc2lsb24pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzb1dlZWtTaG91bGRSZXR1cm4xV2hlbjFTdEphbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzb1dlZWtOdW0oKTsKKyAgICAgICAgICAgIHZhciBhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMSkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhhcmcpLCBfcGFyc2luZ0NvbnRleHQpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRW9tb250aFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoUG9zaXRpdmVBcmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBFb21vbnRoKCk7CisgICAgICAgICAgICB2YXIgYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDIpLlRvT0FEYXRlKCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoYXJnLCAzKSwgX3BhcnNpbmdDb250ZXh0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxNDI1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRW9tb250aFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoTmVnYXRpdmVBcmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBFb21vbnRoKCk7CisgICAgICAgICAgICB2YXIgYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDIpLlRvT0FEYXRlKCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoYXJnLCAtMyksIF9wYXJzaW5nQ29udGV4dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTI0M2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0SWZOb0hvbGlkYXlJc1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0RGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAxKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGV4cGVjdGVkRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAyOSkuVG9PQURhdGUoKTsKKworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgV29ya2RheSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhpbnB1dERhdGUsIDIwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aEZvdXJEYXlzU3VwcGxpZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXREYXRlID0gbmV3IERhdGVUaW1lKDIwMTQsIDEsIDEpLlRvT0FEYXRlKCk7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWREYXRlID0gbmV3IERhdGVUaW1lKDIwMTQsIDEsIDcpLlRvT0FEYXRlKCk7CisKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFdvcmtkYXkoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoaW5wdXREYXRlLCA0KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5Db3JyZWN0V2hlbkFycmF5T2ZIb2xpZGF5RGF0ZXNJc1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0RGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAxKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlMSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAyKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlMiA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAzKS5Ub09BRGF0ZSgpOworICAgICAgICAgICAgdmFyIGV4cGVjdGVkRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCA5KS5Ub09BRGF0ZSgpOworCisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBXb3JrZGF5KCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGlucHV0RGF0ZSwgNCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoaG9saWRheURhdGUxLCBob2xpZGF5RGF0ZTIpKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvblRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTYyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9FeGNlbEZ1bmN0aW9uVGVzdHMuY3MKQEAgLTAsMCArMSwzOSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEV4Y2VsRnVuY3Rpb25UZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGNlbEZ1bmN0aW9uVGVzdGVyIDogRXhjZWxGdW5jdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8ZG91YmxlPiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlSW1wbChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGFyZ3MsIFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNyZWdpb24gT3RoZXIgbWVtYmVycworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXJnc1RvRG91YmxlRW51bWVyYWJsZVNob3VsZEhhbmRsZUlubmVyRW51bWVyYWJsZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMsIDQpKTsKKyAgICAgICAgICAgIHZhciB0ZXN0ZXIgPSBuZXcgRXhjZWxGdW5jdGlvblRlc3RlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRlc3Rlci5BcmdzVG9Eb3VibGVFbnVtZXJhYmxlSW1wbChhcmdzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCByZXN1bHQuQ291bnQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbkFyZ3VtZW50VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbkFyZ3VtZW50VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYjg4OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uQXJndW1lbnRUZXN0cy5jcwpAQCAtMCwwICsxLDI5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Bcmd1bWVudFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0RXhjZWxTdGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmcgPSBuZXcgRnVuY3Rpb25Bcmd1bWVudCgyKTsKKyAgICAgICAgICAgIGFyZy5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYXJnLkV4Y2VsU3RhdGVGbGFnSXNTZXQoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsU3RhdGVGbGFnSXNTZXRTaG91bGRSZXR1cm5GYWxzZVdoZW5Ob3RTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJnID0gbmV3IEZ1bmN0aW9uQXJndW1lbnQoMik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhcmcuRXhjZWxTdGF0ZUZsYWdJc1NldChFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvblJlcG9zaXRvcnlUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uUmVwb3NpdG9yeVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjMxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvblJlcG9zaXRvcnlUZXN0cy5jcwpAQCAtMCwwICsxLDYwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25SZXBvc2l0b3J5VGVzdHMKKyAgICB7CisgICAgICAgICNyZWdpb24gTG9hZE1vZHVsZSBUZXN0cworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9hZE1vZHVsZVBvcHVsYXRlc0Z1bmN0aW9uc0FuZEN1c3RvbUNvbXBpbGVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShmdW5jdGlvblJlcG9zaXRvcnkuSXNGdW5jdGlvbk5hbWUoTXlGdW5jdGlvbi5OYW1lKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShmdW5jdGlvblJlcG9zaXRvcnkuQ3VzdG9tQ29tcGlsZXJzLkNvbnRhaW5zS2V5KHR5cGVvZihNeUZ1bmN0aW9uKSkpOworICAgICAgICAgICAgZnVuY3Rpb25SZXBvc2l0b3J5LkxvYWRNb2R1bGUobmV3IFRlc3RGdW5jdGlvbk1vZHVsZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZnVuY3Rpb25SZXBvc2l0b3J5LklzRnVuY3Rpb25OYW1lKE15RnVuY3Rpb24uTmFtZSkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShmdW5jdGlvblJlcG9zaXRvcnkuQ3VzdG9tQ29tcGlsZXJzLkNvbnRhaW5zS2V5KHR5cGVvZihNeUZ1bmN0aW9uKSkpOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJlbG9hZGluZyB0aGUgbW9kdWxlIG92ZXJ3cml0ZXMgcHJldmlvdXMgZnVuY3Rpb25zIGFuZCBjb21waWxlcnMKKyAgICAgICAgICAgIGZ1bmN0aW9uUmVwb3NpdG9yeS5Mb2FkTW9kdWxlKG5ldyBUZXN0RnVuY3Rpb25Nb2R1bGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gTmVzdGVkIENsYXNzZXMKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RGdW5jdGlvbk1vZHVsZSA6IEZ1bmN0aW9uc01vZHVsZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVGVzdEZ1bmN0aW9uTW9kdWxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbXlGdW5jdGlvbiA9IG5ldyBNeUZ1bmN0aW9uKCk7CisgICAgICAgICAgICAgICAgdmFyIGN1c3RvbUNvbXBpbGVyID0gbmV3IE15RnVuY3Rpb25Db21waWxlcihteUZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICBiYXNlLkZ1bmN0aW9ucy5BZGQoTXlGdW5jdGlvbi5OYW1lLCBteUZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICBiYXNlLkN1c3RvbUNvbXBpbGVycy5BZGQodHlwZW9mKE15RnVuY3Rpb24pLCBjdXN0b21Db21waWxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOYW1lID0gIk15RnVuY3Rpb24iOworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlGdW5jdGlvbkNvbXBpbGVyIDogRnVuY3Rpb25Db21waWxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTXlGdW5jdGlvbkNvbXBpbGVyKE15RnVuY3Rpb24gZnVuY3Rpb24pIDogYmFzZShmdW5jdGlvbikgeyB9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbkZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM3ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDE3NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb247Cit1c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfY29udGV4dDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0JsYW5rU2hvdWxkUmV0dXJuVHJ1ZUlmRmlyc3RBcmdJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc0JsYW5rKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKG5ldyBvYmplY3RbXXtudWxsfSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNCbGFua1Nob3VsZFJldHVyblRydWVJZkZpcnN0QXJnSXNFbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzQmxhbmsoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3Moc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc051bWJlclNob3VsZFJldHVyblRydWVXaGVuQXJnSXNOdW1lcmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSXNOdW1iZXIoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMWQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzTnVtYmVyU2hvdWxkUmV0dXJuZmFsc2VXaGVuQXJnSXNOb25OdW1lcmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSXNOdW1iZXIoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjEiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNFcnJvclNob3VsZFJldHVyblRydWVJZkFyZ0lzQW5FcnJvckNvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZSgiI0RJVi8wISIpKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzRXJyb3IoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0Vycm9yU2hvdWxkUmV0dXJuRmFsc2VJZkFyZ0lzTm90QW5FcnJvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkEiLCAxKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzRXJyb3IoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNUZXh0U2hvdWxkUmV0dXJuVHJ1ZVdoZW5GaXJzdEFyZ0lzQVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjEiKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzVGV4dCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzVGV4dFNob3VsZFJldHVybkZhbHNlV2hlbkZpcnN0QXJnSXNOb3RBU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzVGV4dCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc05vblRleHRTaG91bGRSZXR1cm5GYWxzZVdoZW5GaXJzdEFyZ0lzQVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjEiKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzTm9uVGV4dCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc05vblRleHRTaG91bGRSZXR1cm5UcnVlV2hlbkZpcnN0QXJnSXNOb3RBU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxKTsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzTm9uVGV4dCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzT2RkU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMy4xMjMpOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSXNPZGQoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0V2ZW5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LjEyMyk7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc0V2ZW4oKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0xvZ2ljYWxTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSXNMb2dpY2FsKCk7CisKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOworCisgICAgICAgICAgICBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoInRydWUiKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKworICAgICAgICAgICAgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGZhbHNlKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE5zaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTigpOworCisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEuMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjIsIHJlc3VsdC5SZXN1bHQpOworCisgICAgICAgICAgICBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiYyIpOworICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwZCwgcmVzdWx0LlJlc3VsdCk7CisKKyAgICAgICAgICAgIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworCisgICAgICAgICAgICB2YXIgZXJyb3JDb2RlID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhlcnJvckNvZGUpOworICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChlcnJvckNvZGUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbEZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbEZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MKQEAgLTAsMCArMSwxNzYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgTG9naWNhbEZ1bmN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJZlNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJZigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlLCAiQSIsICJCIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBOb3RTaG91bGRSZXR1cm5GYWxzZUlmQXJndW1lbnRJc1RydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBOb3QoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3ModHJ1ZSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBOb3RTaG91bGRSZXR1cm5UcnVlSWZBcmd1bWVudElzMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE5vdCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTm90U2hvdWxkUmV0dXJuRmFsc2VJZkFyZ3VtZW50SXMxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTm90KCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTm90U2hvdWxkSGFuZGxlRXhjZWxSZWZlcmVuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldDEiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiTk9UKEExKSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQW5kU2hvdWxkUmV0dXJuVHJ1ZUlmQWxsQXJndW1lbnRzQXJlVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFuZCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQW5kU2hvdWxkUmV0dXJuVHJ1ZUlmQWxsQXJndW1lbnRzQXJlVHJ1ZU9yMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFuZCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlLCB0cnVlLCAxLCB0cnVlLCAxKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQW5kU2hvdWxkUmV0dXJuRmFsc2VJZk9uZUFyZ3VtZW50SXNGYWxzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFuZCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBbmRTaG91bGRSZXR1cm5GYWxzZUlmT25lQXJndW1lbnRJczAoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBbmQoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3ModHJ1ZSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPclNob3VsZFJldHVyblRydWVJZk9uZUFyZ3VtZW50SXNUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgT3IoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3ModHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSWZFcnJvclNob3VsZFJldHVyblNlY29uZEFyZ0lmQ3JpdGVyaWFFdmFsdWF0ZXNBc0FuRXJyb3IoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiSUZFUlJPUigwLzAsIFwiaGVsbG9cIikiOworICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGVsbG8iLCBzMS5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSWZFcnJvclNob3VsZFJldHVyblNlY29uZEFyZ0lmQ3JpdGVyaWFFdmFsdWF0ZXNBc0FuRXJyb3IyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIklGRVJST1IoQTIsIFwiaGVsbG9cIikiOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiMjMvMCI7CisgICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJoZWxsbyIsIHMxLkNlbGxzWyJBMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJZkVycm9yU2hvdWxkUmV0dXJuUmVzdWx0T2ZGb3JtdWxhSWZOb0Vycm9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIklGRVJST1IoQTIsIFwiaGVsbG9cIikiOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMiJdLlZhbHVlID0gImhpIHRoZXJlIjsKKyAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhpIHRoZXJlIiwgczEuQ2VsbHNbIkExIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElmTmFTaG91bGRSZXR1cm5TZWNvbmRBcmdJZkNyaXRlcmlhRXZhbHVhdGVzQXNBbkVycm9yMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgczEgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJJRkVSUk9SKEEyLCBcImhlbGxvXCIpIjsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTIiXS5WYWx1ZSA9IEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSk7CisgICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJoZWxsbyIsIHMxLkNlbGxzWyJBMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJZk5hU2hvdWxkUmV0dXJuUmVzdWx0T2ZGb3JtdWxhSWZOb0Vycm9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIklGTkEoQTIsIFwiaGVsbG9cIikiOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMiJdLlZhbHVlID0gImhpIHRoZXJlIjsKKyAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhpIHRoZXJlIiwgczEuQ2VsbHNbIkExIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlQVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlQVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWFhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VBVGVzdHMuY3MKQEAgLTAsMCArMSwxMzAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKwlbVGVzdENsYXNzXQorCXB1YmxpYyBjbGFzcyBBdmVyYWdlQVRlc3RzCisJeworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgQXZlcmFnZUFMaXRlcmFscygpCisJCXsKKwkJCS8vIEZvciBsaXRlcmFscywgQXZlcmFnZUEgYWx3YXlzIHBhcnNlcyBhbmQgaW5jbHVkZSBudW1lcmljIHN0cmluZ3MsIGRhdGUgc3RyaW5ncywgYm9vbHMsIGV0Yy4KKwkJCS8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB1bnBhcnNhYmxlIHN0cmluZyBsaXRlcmFscywgd2hpY2ggY2F1c2UgYSAjVkFMVUUuCisJCQlBdmVyYWdlQSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2VBKCk7CisJCQl2YXIgZGF0ZTEgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7CisJCQl2YXIgZGF0ZTIgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUpOworCQkJZG91YmxlIHZhbHVlMSA9IDEwMDA7CisJCQlkb3VibGUgdmFsdWUyID0gMjAwMDsKKwkJCWRvdWJsZSB2YWx1ZTMgPSA2MDAwOworCQkJZG91YmxlIHZhbHVlNCA9IDE7CisJCQlkb3VibGUgdmFsdWU1ID0gZGF0ZTEuVG9PQURhdGUoKTsKKwkJCWRvdWJsZSB2YWx1ZTYgPSBkYXRlMi5Ub09BRGF0ZSgpOworCQkJdmFyIHJlc3VsdCA9IGF2ZXJhZ2UuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFtdCisJCQl7CisJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUxLlRvU3RyaW5nKCJuIikpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHZhbHVlMiksCisJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUzLlRvU3RyaW5nKCJuIikpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHRydWUpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KGRhdGUxKSwKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChkYXRlMi5Ub1N0cmluZygiZCIpKQorCQkJfSwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKCh2YWx1ZTEgKyB2YWx1ZTIgKyB2YWx1ZTMgKyB2YWx1ZTQgKyB2YWx1ZTUgKyB2YWx1ZTYpIC8gNiwgcmVzdWx0LlJlc3VsdCk7CisJCX0KKworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgQXZlcmFnZUFDZWxsUmVmZXJlbmNlcygpCisJCXsKKwkJCS8vIEZvciBjZWxsIHJlZmVyZW5jZXMsIEF2ZXJhZ2VBIGRpdmlkZXMgYnkgYWxsIGNlbGxzLCBidXQgb25seSBhZGRzIGFjdHVhbCBudW1iZXJzLCBkYXRlcywgYW5kIGJvb2xlYW5zLgorCQkJRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisJCQl2YXIgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworCQkJZG91YmxlW10gdmFsdWVzID0KKwkJCXsKKwkJCQkwLAorCQkJCTIwMDAsCisJCQkJMCwKKwkJCQkxLAorCQkJCW5ldyBEYXRlVGltZSgyMDEzLCAxLCA1KS5Ub09BRGF0ZSgpLAorCQkJCTAKKwkJCX07CisJCQlFeGNlbFJhbmdlIHJhbmdlMSA9IHdvcmtzaGVldC5DZWxsc1sxLCAxXTsKKwkJCXJhbmdlMS5Gb3JtdWxhID0gIlwiMTAwMFwiIjsKKwkJCXJhbmdlMS5DYWxjdWxhdGUoKTsKKwkJCXZhciByYW5nZTIgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl07CisJCQlyYW5nZTIuVmFsdWUgPSAyMDAwOworCQkJdmFyIHJhbmdlMyA9IHdvcmtzaGVldC5DZWxsc1sxLCAzXTsKKwkJCXJhbmdlMy5Gb3JtdWxhID0gJCJcIntuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSkuVG9TdHJpbmcoImQiKX1cIiI7CisJCQlyYW5nZTMuQ2FsY3VsYXRlKCk7CisJCQl2YXIgcmFuZ2U0ID0gd29ya3NoZWV0LkNlbGxzWzEsIDRdOworCQkJcmFuZ2U0LlZhbHVlID0gdHJ1ZTsKKwkJCXZhciByYW5nZTUgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgNV07CisJCQlyYW5nZTUuVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7CisJCQl2YXIgcmFuZ2U2ID0gd29ya3NoZWV0LkNlbGxzWzEsIDZdOworCQkJcmFuZ2U2LlZhbHVlID0gIlRlc3QiOworCQkJQXZlcmFnZUEgYXZlcmFnZSA9IG5ldyBBdmVyYWdlQSgpOworCQkJdmFyIHJhbmdlSW5mbzEgPSBuZXcgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuUmFuZ2VJbmZvKHdvcmtzaGVldCwgMSwgMSwgMSwgMyk7CisJCQl2YXIgcmFuZ2VJbmZvMiA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5SYW5nZUluZm8od29ya3NoZWV0LCAxLCA0LCAxLCA0KTsKKwkJCXZhciByYW5nZUluZm8zID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLlJhbmdlSW5mbyh3b3Jrc2hlZXQsIDEsIDUsIDEsIDYpOworCQkJdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKwkJCXZhciBhZGRyZXNzID0gbmV3IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMuUmFuZ2VBZGRyZXNzKCk7CisJCQlhZGRyZXNzLkZyb21Sb3cgPSBhZGRyZXNzLlRvUm93ID0gYWRkcmVzcy5Gcm9tQ29sID0gYWRkcmVzcy5Ub0NvbCA9IDI7CisJCQljb250ZXh0LlNjb3Blcy5OZXdTY29wZShhZGRyZXNzKTsKKwkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQorCQkJeworCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzEpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzIpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzMpCisJCQl9LCBjb250ZXh0KTsKKwkJCUFzc2VydC5BcmVFcXVhbCh2YWx1ZXMuQXZlcmFnZSgpLCByZXN1bHQuUmVzdWx0KTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlwdWJsaWMgdm9pZCBBdmVyYWdlQUFycmF5KCkKKwkJeworCQkJLy8gRm9yIGFycmF5cywgQXZlcmFnZUEgY29tcGxldGVseSBpZ25vcmVzIGJvb2xlYW5zLiAgSXQgZGl2aWRlcyBieSBzdHJpbmdzIGFuZCBudW1iZXJzLCBidXQgb25seQorCQkJLy8gbnVtYmVycyBhcmUgYWRkZWQgdG8gdGhlIHRvdGFsLiAgUmVhbCBkYXRlcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGFuZCBzdHJpbmcgZGF0ZXMgYXJlIG5vdCBwYXJzZWQuCisJCQlBdmVyYWdlQSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2VBKCk7CisJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxNSk7CisJCQlkb3VibGVbXSB2YWx1ZXMgPQorCQkJeworCQkJCTAsCisJCQkJMjAwMCwKKwkJCQkwLAorCQkJCTAsCisJCQkJMAorCQkJfTsKKwkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQorCQkJeworCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KG5ldyBGdW5jdGlvbkFyZ3VtZW50W10KKwkJCQl7CisJCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KDEwMDAuVG9TdHJpbmcoIm4iKSksCisJCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KDIwMDApLAorCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCg2MDAwLlRvU3RyaW5nKCJuIikpLAorCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCh0cnVlKSwKKwkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoZGF0ZS5Ub1N0cmluZygiZCIpKSwKKwkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoInRlc3QiKQorCQkJCX0pCisJCQl9LCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwodmFsdWVzLkF2ZXJhZ2UoKSwgcmVzdWx0LlJlc3VsdCk7CisJCX0KKworCQlbVGVzdE1ldGhvZF0KKwkJW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KKwkJcHVibGljIHZvaWQgQXZlcmFnZUFVbnBhcnNhYmxlTGl0ZXJhbCgpCisJCXsKKwkJCS8vIEluIHRoZSBjYXNlIG9mIGxpdGVyYWxzLCBhbnkgdW5wYXJzYWJsZSBzdHJpbmcgbGl0ZXJhbCByZXN1bHRzIGluIGEgI1ZBTFVFLgorCQkJQXZlcmFnZUEgYXZlcmFnZSA9IG5ldyBBdmVyYWdlQSgpOworCQkJdmFyIHJlc3VsdCA9IGF2ZXJhZ2UuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFtdCisJCQl7CisJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoMTAwMCksCisJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoIlRlc3QiKQorCQkJfSwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUlmVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1OTQ5OAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUlmVGVzdHMuY3MKQEAgLTAsMCArMSwyODYgQEAKK++7v3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Cit1c2luZyBzdGF0aWMgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbERhdGFQcm92aWRlcjsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBBdmVyYWdlSWZUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIgX3Byb3ZpZGVyOworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgX3Byb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9wYWNrYWdlKTsKKyAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0c2hlZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Q2xlYW51cF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZOdW1lcmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPjEiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDRkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZOb25OdW1lcmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJNb25kYXkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJUdWVzZGF5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiVGh1cnNkYXkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiVCpkYXkiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDRkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZOdW1lcmljRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlLCAxZCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkVxdWFsVG9FbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIiIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZk5vdEVxdWFsVG9OdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPD4iLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDRkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZFcXVhbFRvWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjAiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZOb3RFcXVhbFRvWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw+MCIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkdyZWF0ZXJUaGFuWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj4wIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmR3JlYXRlclRoYW5PckVxdWFsVG9aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPj0wIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTGVzc1RoYW5aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjwwIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTGVzc1RoYW5PckVxdWFsVG9aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw9MCIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkxlc3NUaGFuQ2hhcmFjdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPGEiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZMZXNzVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw9YSIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkdyZWF0ZXJUaGFuQ2hhcmFjdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPmEiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZHcmVhdGVyVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj49YSIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWEwOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlVGVzdHMuY3MKQEAgLTAsMCArMSwxMTMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCit7CisJW1Rlc3RDbGFzc10KKwlwdWJsaWMgY2xhc3MgQXZlcmFnZVRlc3RzCisJeworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgQXZlcmFnZUxpdGVyYWxzKCkKKwkJeworCQkJLy8gSW4gdGhlIGNhc2Ugb2YgbGl0ZXJhbHMsIEF2ZXJhZ2UgRE9FUyBwYXJzZSBhbmQgaW5jbHVkZSBudW1lcmljIHN0cmluZ3MsIGRhdGUgc3RyaW5ncywgYm9vbHMsIGV0Yy4KKwkJCUF2ZXJhZ2UgYXZlcmFnZSA9IG5ldyBBdmVyYWdlKCk7CisJCQl2YXIgZGF0ZTEgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7CisJCQl2YXIgZGF0ZTIgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUpOworCQkJZG91YmxlIHZhbHVlMSA9IDEwMDA7CisJCQlkb3VibGUgdmFsdWUyID0gMjAwMDsKKwkJCWRvdWJsZSB2YWx1ZTMgPSA2MDAwOworCQkJZG91YmxlIHZhbHVlNCA9IDE7CisJCQlkb3VibGUgdmFsdWU1ID0gZGF0ZTEuVG9PQURhdGUoKTsKKwkJCWRvdWJsZSB2YWx1ZTYgPSBkYXRlMi5Ub09BRGF0ZSgpOworCQkJdmFyIHJlc3VsdCA9IGF2ZXJhZ2UuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFtdCisJCQl7CisJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUxLlRvU3RyaW5nKCJuIikpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHZhbHVlMiksCisJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUzLlRvU3RyaW5nKCJuIikpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHRydWUpLAorCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KGRhdGUxKSwKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChkYXRlMi5Ub1N0cmluZygiZCIpKQorCQkJfSwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKCh2YWx1ZTEgKyB2YWx1ZTIgKyB2YWx1ZTMgKyB2YWx1ZTQgKyB2YWx1ZTUgKyB2YWx1ZTYpIC8gNiwgcmVzdWx0LlJlc3VsdCk7CisJCX0KKworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgQXZlcmFnZUNlbGxSZWZlcmVuY2VzKCkKKwkJeworCQkJLy8gSW4gdGhlIGNhc2Ugb2YgY2VsbCByZWZlcmVuY2VzLCBBdmVyYWdlIERPRVMgTk9UIHBhcnNlIGFuZCBpbmNsdWRlIG51bWVyaWMgc3RyaW5ncywgZGF0ZSBzdHJpbmdzLCBib29scywgdW5wYXJzYWJsZSBzdHJpbmdzLCBldGMuCisJCQlFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKwkJCXZhciB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisJCQlFeGNlbFJhbmdlIHJhbmdlMSA9IHdvcmtzaGVldC5DZWxsc1sxLCAxXTsKKwkJCXJhbmdlMS5Gb3JtdWxhID0gIlwiMTAwMFwiIjsKKwkJCXJhbmdlMS5DYWxjdWxhdGUoKTsKKwkJCXZhciByYW5nZTIgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl07CisJCQlyYW5nZTIuVmFsdWUgPSAyMDAwOworCQkJdmFyIHJhbmdlMyA9IHdvcmtzaGVldC5DZWxsc1sxLCAzXTsKKwkJCXJhbmdlMy5Gb3JtdWxhID0gJCJcIntuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSkuVG9TdHJpbmcoImQiKX1cIiI7CisJCQlyYW5nZTMuQ2FsY3VsYXRlKCk7CisJCQl2YXIgcmFuZ2U0ID0gd29ya3NoZWV0LkNlbGxzWzEsIDRdOworCQkJcmFuZ2U0LlZhbHVlID0gdHJ1ZTsKKwkJCXZhciByYW5nZTUgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgNV07CisJCQlyYW5nZTUuVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7CisJCQl2YXIgcmFuZ2U2ID0gd29ya3NoZWV0LkNlbGxzWzEsIDZdOworCQkJcmFuZ2U2LlZhbHVlID0gIlRlc3QiOworCQkJQXZlcmFnZSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2UoKTsKKwkJCXZhciByYW5nZUluZm8xID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLlJhbmdlSW5mbyh3b3Jrc2hlZXQsIDEsIDEsIDEsIDMpOworCQkJdmFyIHJhbmdlSW5mbzIgPSBuZXcgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuUmFuZ2VJbmZvKHdvcmtzaGVldCwgMSwgNCwgMSwgNCk7CisJCQl2YXIgcmFuZ2VJbmZvMyA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5SYW5nZUluZm8od29ya3NoZWV0LCAxLCA1LCAxLCA2KTsKKwkJCXZhciBjb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisJCQl2YXIgYWRkcmVzcyA9IG5ldyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzLlJhbmdlQWRkcmVzcygpOworCQkJYWRkcmVzcy5Gcm9tUm93ID0gYWRkcmVzcy5Ub1JvdyA9IGFkZHJlc3MuRnJvbUNvbCA9IGFkZHJlc3MuVG9Db2wgPSAyOworCQkJY29udGV4dC5TY29wZXMuTmV3U2NvcGUoYWRkcmVzcyk7CisJCQl2YXIgcmVzdWx0ID0gYXZlcmFnZS5FeGVjdXRlKG5ldyBGdW5jdGlvbkFyZ3VtZW50W10KKwkJCXsKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChyYW5nZUluZm8xKSwKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChyYW5nZUluZm8yKSwKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChyYW5nZUluZm8zKQorCQkJfSwgY29udGV4dCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoKDIwMDAgKyBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSkuVG9PQURhdGUoKSkgLyAyLCByZXN1bHQuUmVzdWx0KTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlwdWJsaWMgdm9pZCBBdmVyYWdlQXJyYXkoKQorCQl7CisJCQkvLyBJbiB0aGUgY2FzZSBvZiBhcnJheXMsIEF2ZXJhZ2UgRE9FUyBOT1QgcGFyc2UgYW5kIGluY2x1ZGUgbnVtZXJpYyBzdHJpbmdzLCBkYXRlIHN0cmluZ3MsIGJvb2xzLCB1bnBhcnNhYmxlIHN0cmluZ3MsIGV0Yy4KKwkJCUF2ZXJhZ2UgYXZlcmFnZSA9IG5ldyBBdmVyYWdlKCk7CisJCQl2YXIgZGF0ZTEgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7CisJCQl2YXIgZGF0ZTIgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUpOworCQkJZG91YmxlIHZhbHVlID0gMjAwMDsKKwkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQorCQkJeworCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KG5ldyBGdW5jdGlvbkFyZ3VtZW50W10KKwkJCQl7CisJCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KDEwMDAuVG9TdHJpbmcoIm4iKSksCisJCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHZhbHVlKSwKKwkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoNjAwMC5Ub1N0cmluZygibiIpKSwKKwkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodHJ1ZSksCisJCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KGRhdGUxKSwKKwkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoZGF0ZTIuVG9TdHJpbmcoImQiKSksCisJCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KCJ0ZXN0IikKKwkJCQl9KQorCQkJfSwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKCgyMDAwICsgZGF0ZTEuVG9PQURhdGUoKSkgLyAyLCByZXN1bHQuUmVzdWx0KTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikpXQorCQlwdWJsaWMgdm9pZCBBdmVyYWdlVW5wYXJzYWJsZUxpdGVyYWwoKQorCQl7CisJCQkvLyBJbiB0aGUgY2FzZSBvZiBsaXRlcmFscywgYW55IHVucGFyc2FibGUgc3RyaW5nIGxpdGVyYWwgcmVzdWx0cyBpbiBhICNWQUxVRS4KKwkJCUF2ZXJhZ2UgYXZlcmFnZSA9IG5ldyBBdmVyYWdlKCk7CisJCQl2YXIgcmVzdWx0ID0gYXZlcmFnZS5FeGVjdXRlKG5ldyBGdW5jdGlvbkFyZ3VtZW50W10KKwkJCXsKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCgxMDAwKSwKKwkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCgiVGVzdCIpCisJCQl9LCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50SWZUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZlRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Yjk2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50SWZUZXN0cy5jcwpAQCAtMCwwICsxLDI0NCBAQAor77u/dXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIHN0YXRpYyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsRGF0YVByb3ZpZGVyOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIENvdW50SWZUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIgX3Byb3ZpZGVyOworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgX3Byb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9wYWNrYWdlKTsKKyAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0c2hlZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Q2xlYW51cF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTnVtZXJpYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI+MSIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTm9uTnVtZXJpYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiTW9uZGF5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiVHVlc2RheSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIlRodXJzZGF5IjsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICJUKmRheSIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZOdWxsRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDIsIDIsIDIsIDIpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZOdW1lcmljRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgMWQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCitbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkVxdWFsVG9FbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICIiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZk5vdEVxdWFsVG9OdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIjw+Iik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZFcXVhbFRvWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICIwIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZOb3RFcXVhbFRvWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8PjAiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkdyZWF0ZXJUaGFuWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI+MCIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmR3JlYXRlclRoYW5PckVxdWFsVG9aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIj49MCIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTGVzc1RoYW5aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8MCIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTGVzc1RoYW5PckVxdWFsVG9aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8PTAiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkxlc3NUaGFuQ2hhcmFjdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIjxhIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZMZXNzVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8PWEiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkdyZWF0ZXJUaGFuQ2hhcmFjdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIj5hIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZHcmVhdGVyVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI+PWEiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmMTFlZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtSWZUZXN0cy5jcwpAQCAtMCwwICsxLDMxOSBAQAor77u/dXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIHN0YXRpYyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsRGF0YVByb3ZpZGVyOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFN1bUlmVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcml2YXRlIEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyIF9wcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIF9wcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihfcGFja2FnZSk7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdHNoZWV0Iik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZOdW1lcmljKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+MSIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTm9uTnVtZXJpYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiTW9uZGF5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiVHVlc2RheSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIlRodXJzZGF5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiVCpkYXkiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDhkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZk51bWVyaWNFeHByZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgMWQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkVxdWFsVG9FbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZOb3RFcXVhbFRvTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPD4iLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDhkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkVxdWFsVG9aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDBkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICIwIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZOb3RFcXVhbFRvWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPD4wIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZHcmVhdGVyVGhhblplcm8oKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj4wIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZHcmVhdGVyVGhhbk9yRXF1YWxUb1plcm8oKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj49MCIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTGVzc1RoYW5aZXJvKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPDAiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkxlc3NUaGFuT3JFcXVhbFRvWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAtMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw9MCIsIHJhbmdlMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTGVzc1RoYW5DaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjxhIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZMZXNzVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPD1hIiwgcmFuZ2UyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtSWZHcmVhdGVyVGhhbkNoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOworICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPmEiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkdyZWF0ZXJUaGFuT3JFcXVhbFRvQ2hhcmFjdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+PWEiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkhhbmRsZURhdGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKKyAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7CisgICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+PWEiLCByYW5nZTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZlNob3VsZEhhbmRsZUJvb2xlYW5BcmcoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLkZvcm11bGEgPSAiU1VNSUYoQTE6QTIsVFJVRSxCMTpCMikiOworICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aEZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aEZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjFlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoRnVuY3Rpb25zVGVzdHMuY3MKQEAgLTAsMCArMSwxMDU2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgTWF0aEZ1bmN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQaVNob3VsZFJldHVyblBJQ29uc3RhbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IChkb3VibGUpTWF0aC5Sb3VuZChNYXRoLlBJLCAxNCk7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBQaSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBYnNTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFicygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtM2QpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFzaW5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGV4cGVjdGVkVmFsdWUgPSAxLjU3MDg7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBc2luKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJvdW5kZWQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFzaW5oU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBleHBlY3RlZFZhbHVlID0gMC4wOTk4OworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXNpbmgoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMC4xZCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB2YXIgcm91bmRlZCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByb3VuZGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDZWlsaW5nU2hvdWxkUm91bmRVcEFjY29yZGluZ1RvUGFyYW1zU2lnbmlmaWNhbmNlTG93ZXJUaGFuMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gMjIuMzZkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ2VpbGluZygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMi4zNWQsIDAuMDEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENlaWxpbmdTaG91bGRSb3VuZFRvd2FyZHNaZXJvSWZTaWduaWZpY2FuY2VBbmROdW1iZXJJc01pbnVzMHBvaW50MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gLTIyLjRkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ2VpbGluZygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMjIuMzVkLCAtMC4xKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCBTeXN0ZW0uTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDZWlsaW5nU2hvdWxkUm91bmRVcEFjY29yZGluZ1RvUGFyYW1zU2lnbmlmaWNhbmNlSXMxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsdWUgPSAyM2Q7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDZWlsaW5nKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIyLjM1ZCwgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2VpbGluZ1Nob3VsZFJvdW5kVXBBY2NvcmRpbmdUb1BhcmFtc1NpZ25pZmljYW5jZUlzMTAoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IDMwZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENlaWxpbmcoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMjIuMzVkLCAxMCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2VpbGluZ1Nob3VsZFJvdW5kVG93YXJkc1plcm9JZlNpZ25pZmljYW5jZUFuZE51bWJlcklzTmVnYXRpdmUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IC0zMGQ7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDZWlsaW5nKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0yMi4zNWQsIC0xMCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgQ2VpbGluZ1Nob3VsZFRocm93RXhjZXB0aW9uSWZOdW1iZXJJc1Bvc2l0aXZlQW5kU2lnbmlmaWNhbmNlSXNOZWdhdGl2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gMzBkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ2VpbGluZygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMi4zNWQsIC0xKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1TaG91bGRDYWxjdWxhdGUyUGx1czNBbmRSZXR1cm41KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsIDMpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1TaG91bGRDYWxjdWxhdGVFbnVtZXJhYmxlT2YyUGx1czVQbHVzM0FuZFJldHVybjEwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsIDUpLCAzKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bVNob3VsZElnbm9yZUhpZGRlblZhbHVlc1doZW5JZ25vcmVIaWRkZW5WYWx1ZXNJc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bSgpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCA1KSwgMywgNCk7CisgICAgICAgICAgICBhcmdzLkxhc3QoKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmU2hvdWxkQ2FsY3VsYXRlTWF0Y2hpbmdWYWx1ZXNPbmx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMywgNCwgNSksICI0Iik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmU2hvdWxkQ2FsY3VsYXRlV2l0aEV4cHJlc3Npb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCA0LCA1KSwgIj4zIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZlNob3VsZFRocm93SWZDcml0ZXJpYUlzTGFyZ2VyVGhhbjI1NUNoYXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxvbmdTdHJpbmcgPSAiYSI7CisgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDI1NjsgeCsrKSB7IGxvbmdTdHJpbmcgPSBzdHJpbmcuQ29uY2F0KGxvbmdTdHJpbmcsICJhIik7IH0KKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMsIDQsIDUpLCBsb25nU3RyaW5nLCAoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMywgMiwgMSkpKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1TcVNob3VsZENhbGN1bGF0ZUFycmF5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3Vtc3EoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgNCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1TcVNob3VsZEluY2x1ZGVUcnVlQXNPbmUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1zcSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCA0LCB0cnVlKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bVNxU2hvdWxkTm9Db3VudFRydWVUcnVlSW5BcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bXNxKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsIDQsIHRydWUpKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0ZGV2U2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN0ZGV2KCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDMsIDUpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdGRldlNob3VsZElnbm9yZUhpZGRlblZhbHVlc1doZW5JZ25vcmVIaWRkZW5WYWx1ZXNJc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN0ZGV2KCk7CisgICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDMsIDUsIDYpOworICAgICAgICAgICAgYXJncy5MYXN0KCkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0ZGV2UFNob3VsZENhbGN1bGF0ZUNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdGRldlAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgMywgNCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC44MTY1ZCwgTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdGRldlBTaG91bGRJZ25vcmVIaWRkZW5WYWx1ZXNXaGVuSWdub3JlSGlkZGVuVmFsdWVzSXNTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdGRldlAoKTsKKyAgICAgICAgICAgIGZ1bmMuSWdub3JlSGlkZGVuVmFsdWVzID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgMywgNCwgMTY1KTsKKyAgICAgICAgICAgIGFyZ3MuTGFzdCgpLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuODE2NWQsIE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA1KSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhwU2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEV4cCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1NC41OTgxNTAwM2QsIFN5c3RlbS5NYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOCkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heFNob3VsZENhbGN1bGF0ZUNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXgoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgMiwgNSwgMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heFNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuVmFsdWVzSXNUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWF4KCk7CisgICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDIsIDUsIDIpOworICAgICAgICAgICAgYXJncy5FbGVtZW50QXQoMikuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heGFTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWF4YSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMSwgMCwgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heGFTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0VXNpbmdCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWF4YSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heGFTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0VXNpbmdTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXhhKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0xLCAidGVzdCIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNaW5TaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWluKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDIsIDUsIDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNaW5TaG91bGRJZ25vcmVIaWRkZW5WYWx1ZXNJZklnbm9yZUhpZGRlblZhbHVlc0lzVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1pbigpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAyLCA1LCAzKTsKKyAgICAgICAgICAgIGFyZ3MuRWxlbWVudEF0KDEpLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlU2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9ICg0ZCArIDJkICsgNWQgKyAyZCkgLyA0ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2UoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkLCA1ZCwgMmQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlU2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdFdpdGhFbnVtZXJhYmxlQW5kQm9vbE1lbWJlcnMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRSZXN1bHQgPSAoNGQgKyAyZCArIDVkICsgMmQgKyAxZCkgLyA1ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2UoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkKSwgNWQsIDJkLCB0cnVlKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFJlc3VsdCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZVNob3VsZElnbm9yZUhpZGRlbkZpZWxkc0lmSWdub3JlSGlkZGVuVmFsdWVzSXNUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkUmVzdWx0ID0gKDRkICsgMmQgKyAyZCArIDFkKSAvIDRkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZSgpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQpLCA1ZCwgMmQsIHRydWUpOworICAgICAgICAgICAgYXJncy5FbGVtZW50QXQoMSkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRSZXN1bHQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VTaG91bGRUaHJvd0RpdkJ5WmVyb0V4Y2VsRXJyb3JWYWx1ZUlmRW1wdHlBcmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgZUVycm9yVHlwZSBlcnJvclR5cGUgPSBlRXJyb3JUeXBlLlZhbHVlOworCisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBGdW5jdGlvbkFyZ3VtZW50WzBdOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JUeXBlID0gZS5FcnJvclZhbHVlLlR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZUVycm9yVHlwZS5EaXYwLCBlcnJvclR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VBU2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9ICg0ZCArIDJkICsgNWQgKyAyZCkgLyA0ZDsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VBKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDRkLCAyZCwgNWQsIDJkKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFJlc3VsdCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUFTaG91bGRJbmNsdWRlVHJ1ZUFzMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9ICg0ZCArIDJkICsgNWQgKyAyZCArIDFkKSAvIDVkOworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUEoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkLCA1ZCwgMmQsIHRydWUpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VBU2hvdWxkVGhyb3dWYWx1ZUV4Y2VwdGlvbklmTm9uTnVtZXJpY1RleHRJc1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUEoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkLCA1ZCwgMmQsICJBQkMiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlQVNob3VsZENvdW50VmFsdWVBczBJZk5vbk51bWVyaWNUZXh0SXNTdXBwbGllZEluQXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlQSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgMmQsIDNkLCAiQUJDIikpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuNWQscmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUFTaG91bGRDb3VudE51bWVyaWNTdHJpbmdXaXRoVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlQSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQsICI5Iik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIuMzQzMywgMyk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMi4zNDNkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuTmJyT2ZEZWNpbWFsc0lzTmVnYXRpdmUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3VuZCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5MzMzLCAtMyk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOTAwMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZsb29yU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdoZW5TaWduaWZpY2FuY2VJc0JldHdlZW4wQW5kMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZsb29yKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDI2Ljc1ZCwgMC4xKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyNi43ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRmxvb3JTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2hlblNpZ25pZmljYW5jZUlzMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZsb29yKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDI2Ljc1ZCwgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjZkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGbG9vclNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuU2lnbmlmaWNhbmNlSXNNaW51czEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBGbG9vcigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMjYuNzVkLCAtMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTI2ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZFNob3VsZFJldHVybkFWYWx1ZUJldHdlZW4wYW5kMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJhbmQoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IEZ1bmN0aW9uQXJndW1lbnRbMF07CisgICAgICAgICAgICB2YXIgcmVzdWx0MSA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoKGRvdWJsZSlyZXN1bHQxLlJlc3VsdCkgPiAwICYmICgoZG91YmxlKSByZXN1bHQxLlJlc3VsdCkgPCAxKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQyID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwocmVzdWx0MS5SZXN1bHQsIHJlc3VsdDIuUmVzdWx0LCAiVGhlIHR3byBudW1iZXJzIHdlcmUgdGhlIHNhbWUiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKChkb3VibGUpcmVzdWx0Mi5SZXN1bHQpID4gMCAmJiAoKGRvdWJsZSlyZXN1bHQyLlJlc3VsdCkgPCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSYW5kQmV0d2VlblNob3VsZFJldHVybkFuSW50ZWdlclZhbHVlQmV0d2VlblN1cHBsaWVkVmFsdWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUmFuZEJldHdlZW4oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgNSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkNvbnRhaW5zKG5ldyBMaXN0PGRvdWJsZT4geyAxZCwgMmQsIDNkLCA0ZCwgNWQgfSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZEJldHdlZW5TaG91bGRSZXR1cm5BbkludGVnZXJWYWx1ZUJldHdlZW5TdXBwbGllZFZhbHVlc1doZW5Mb3dJc05lZ2F0aXZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUmFuZEJldHdlZW4oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoLTUsIDApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5Db250YWlucyhuZXcgTGlzdDxkb3VibGU+IHsgMGQsIC0xZCwgLTJkLCAtM2QsIC00ZCwgLTVkIH0sIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50U2hvdWxkUmV0dXJuTnVtYmVyT2ZOdW1lcmljSXRlbXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3VudCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgMm0sIDMsIG5ldyBEYXRlVGltZSgyMDEyLCA0LCAxKSwgIjQiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRTaG91bGRJbmNsdWRlTnVtZXJpY1N0cmluZ3NBbmREYXRlc0luQXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3VudCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgMm0sIDMsIG5ldyBEYXRlVGltZSgyMDEyLCA0LCAxKSwgIjQiKSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRTaG91bGRJbmNsdWRlRW51bWVyYWJsZU1lbWJlcnMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3VudCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTIsIDEzKSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRTaG91bGRJZ25vcmVIaWRkZW5WYWx1ZXNJZklnbm9yZUhpZGRlblZhbHVlc0lzVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50KCk7CisgICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMiwgMTMpKTsKKyAgICAgICAgICAgIGFyZ3MuRWxlbWVudEF0KDApLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudEFTaG91bGRSZXR1cm5OdW1iZXJPZk5vbldoaXRlc3BhY2VJdGVtcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50QSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgMm0sIDMsIG5ldyBEYXRlVGltZSgyMDEyLCA0LCAxKSwgIjQiLCBudWxsLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudEFTaG91bGRJbmNsdWRlRW51bWVyYWJsZU1lbWJlcnMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3VudEEoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMWQsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEyLCAxMykpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudEFTaG91bGRJZ25vcmVIaWRkZW5WYWx1ZXNJZklnbm9yZUhpZGRlblZhbHVlc0lzVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50QSgpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTIsIDEzKSk7CisgICAgICAgICAgICBhcmdzLkVsZW1lbnRBdCgwKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZlNob3VsZFJldHVybk5ick9mTnVtZXJpY0l0ZW1zVGhhdE1hdGNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgMmQsIDNkKSwgIj4xIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZTaG91bGRSZXR1cm5OYnJPZkFscGhhTnVtSXRlbXNUaGF0TWF0Y2goKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3VudElmKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJNb25kYXkiLCAiVHVlc2RheSIsICJUaHVyc2RheSIpLCAiVCpkYXkiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUHJvZHVjdFNob3VsZE11bHRpcGx5QXJndW1lbnRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyZCwgMmQsIDRkKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNmQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFByb2R1Y3RTaG91bGRIYW5kbGVFbnVtZXJhYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyZCwgMmQsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDRkLCAyZCkpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMyZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUHJvZHVjdFNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuSXNUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyZCwgMmQsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDRkLCAyZCkpOworICAgICAgICAgICAgYXJncy5FbGVtZW50QXQoMSkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTZkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQcm9kdWN0U2hvdWxkSGFuZGxlRmlyc3RJdGVtSXNFbnVtZXJhYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUHJvZHVjdCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQpLCAyZCwgMmQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMyZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVmFyU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFZhcigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAzLCA0KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjY2NjdkLCBTeXN0ZW0uTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWYXJTaG91bGRJZ25vcmVIaWRkZW5WYWx1ZXNJZklnbm9yZUhpZGRlbklzVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFZhcigpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAzLCA0LCA5KTsKKyAgICAgICAgICAgIGFyZ3MuTGFzdCgpLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuNjY2N2QsIFN5c3RlbS5NYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNCkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFZhclBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVmFyUCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAzLCA0KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjI1ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVmFyUFNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuSXNUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVmFyUCgpOworICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAzLCA0LCA5KTsKKyAgICAgICAgICAgIGFyZ3MuTGFzdCgpLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuMjVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNb2RTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTW9kKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDUsIDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3NTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ29zKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTAuNDE2MTQ2ODM3ZCwgcm91bmRlZFJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29zSFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3NoKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMy43NjIxOTU2OTEsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFjb3NTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQWNvcygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygwLjEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS40NzA2LCByb3VuZGVkUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBQ29zSFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBY29zaCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuMzE3LCByb3VuZGVkUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaW5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU2luKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC45MDkyOTc0MjcsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNpbmhTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU2luaCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuNjI2ODYwNDA4ZCwgcm91bmRlZFJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGFuU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFRhbigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0yLjE4NTAzOTg2M2QsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRhbmhTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVGFuaCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuOTY0MDI3NThkLCByb3VuZGVkUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdGFuU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF0YW4oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpIHJlc3VsdC5SZXN1bHQsIDkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuNDcxMTI3Njc0ZCwgcm91bmRlZFJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXRhbjJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXRhbjIoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuMTA3MTQ4NzE4ZCwgcm91bmRlZFJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXRhbmhTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXRhbmgoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMC4xKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMTAwM2QsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvZ1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMb2coKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA5KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjMwMTAyOTk5NmQsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvZ1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoQmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExvZygpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCAyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9nMTBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTG9nMTAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA5KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjMwMTAyOTk5NmQsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExuU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExuKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDUpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS42MDk0NGQsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNxcnRQaVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTcXJ0UGkoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA5KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLjUwNjYyODI3NWQsIHJvdW5kZWRSZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNpZ25TaG91bGRSZXR1cm5NaW51czFJZkFyZ0lzTmVnYXRpdmUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTaWduKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0yKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KS5SZXN1bHQ7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTFkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNpZ25TaG91bGRSZXR1cm4xSWZBcmdJc1Bvc2l0aXZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU2lnbigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KS5SZXN1bHQ7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm91bmRkb3duU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhQb3NpdGl2ZU51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kZG93bigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5Ljk5OSwgMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOS45OSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm91bmRkb3duU2hvdWxkSGFuZGxlTmVnYXRpdmVOdW1iZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3VuZGRvd24oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoLTkuOTk5LCAyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtOS45OSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm91bmRkb3duU2hvdWxkSGFuZGxlTmVnYXRpdmVOdW1EaWdpdHMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3VuZGRvd24oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOTk5Ljk5OSwgLTIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDkwMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kZG93blNob3VsZFJldHVybjBJZk5lZ2F0aXZlTnVtRGlnaXRzSXNUb29MYXJnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kZG93bigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5OTkuOTk5LCAtNCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kZG93blNob3VsZEhhbmRsZVplcm9OdW1EaWdpdHMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3VuZGRvd24oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOTk5Ljk5OSwgMCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOTk5ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm91bmR1cFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoUG9zaXRpdmVOdW1iZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3VuZHVwKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDkuOTkxMSwgMyk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOS45OTIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kdXBTaG91bGRIYW5kbGVOZWdhdGl2ZU51bURpZ2l0cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kdXAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOTkxMjMsIC0yKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5OTIwMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kdXBTaG91bGRIYW5kbGVaZXJvTnVtRGlnaXRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm91bmR1cCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5OTkuOTk5LCAwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAwZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVHJ1bmNTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVHJ1bmMoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOTkuOTkpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDk5ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRmFjdFNob3VsZFJvdW5kRG93bkFuZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBGYWN0KCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDUuOTkpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZiAoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEZhY3RTaG91bGRUaHJvd1doZW5OZWdhdGl2ZU51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZhY3QoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoLTEpOworICAgICAgICAgICAgZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUXVvdGllbnRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUXVvdGllbnQoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNSwgMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBRdW90aWVudFNob3VsZFRocm93V2hlbkRlbm9tSXMwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUXVvdGllbnQoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMCk7CisgICAgICAgICAgICBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMYXJnZVNob3VsZFJldHVyblRoZUxhcmdlc3ROdW1iZXJJZjEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMYXJnZSgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAzKSwgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExhcmdlU2hvdWxkUmV0dXJuVGhlU2Vjb25kTGFyZ2VzdE51bWJlcklmMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExhcmdlKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDEsIDIsIDMpLCAyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBMYXJnZVNob3VsZFRocm93SWZJbmRleE91dE9mQm91bmRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTGFyZ2UoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgMSwgMiwgMyksIDYpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNtYWxsU2hvdWxkUmV0dXJuVGhlU21hbGxlc3ROdW1iZXJJZjEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTbWFsbCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAzKSwgMSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNtYWxsU2hvdWxkUmV0dXJuVGhlU2Vjb25kU21hbGxlc3ROdW1iZXJJZjIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTbWFsbCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAxLCAyLCAzKSwgMik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU21hbGxTaG91bGRUaHJvd0lmSW5kZXhPdXRPZkJvdW5kcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFNtYWxsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDEsIDIsIDMpLCA2KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIE1lZGlhblNob3VsZFRocm93SWZOb0FyZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNZWRpYW4oKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkVtcHR5KCk7CisgICAgICAgICAgICBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNZWRpYW5TaG91bGRDYWxjdWxhdGVDb3JyZWN0bHlXaXRoT25lTWVtYmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWVkaWFuKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNZWRpYW5TaG91bGRDYWxjdWxhdGVDb3JyZWN0bHlXaXRoT2RkTWVtYmVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1lZGlhbigpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCA1LCAxLCA0LCAyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWVkaWFuU2hvdWxkQ2FsY3VsYXRlQ29ycmVjdGx5V2l0aEV2ZW5NZW1iZXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWVkaWFuKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMsIDQpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIuNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtYmVyRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9OdW1iZXJGdW5jdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ2ODgyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtYmVyRnVuY3Rpb25zVGVzdHMuY3MKQEAgLTAsMCArMSw1MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTnVtZXJpYzsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIE51bWJlckZ1bmN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDSW50U2hvdWxkQ29udmVydFRleHRUb0ludGVnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDSW50KCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIyIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW50U2hvdWxkQ29udmVydERlY2ltYWxUb0ludGVnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDSW50KCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIuODhtKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJbnRTaG91bGRDb252ZXJ0TmVnYXRpdmVEZWNpbWFsVG9JbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ0ludCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMi44OG0pOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0zLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJbnRTaG91bGRDb252ZXJ0U3RyaW5nVG9JbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ0ludCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiLTIuODgiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMywgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ2hvb3NlVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ2hvb3NlVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiZDkyOAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9DaG9vc2VUZXN0cy5jcwpAQCAtMCwwICsxLDgzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIENob29zZVRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpOworICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2hvb3NlU2luZ2xlVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxsQ2hvb3NlT3B0aW9ucygpOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIkNIT09TRSg0LCBBMSwgQTIsIEEzLCBBNCwgQTUpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNSIsIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENob29zZVNpbmdsZUZvcm11bGEoKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxsQ2hvb3NlT3B0aW9ucygpOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIkNIT09TRSg2LCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEyIiwgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2hvb3NlTXVsdGlwbGVWYWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxsQ2hvb3NlT3B0aW9ucygpOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIlNVTShDSE9PU0UoezEsMyw0fSwgQTEsIEEyLCBBMywgQTQsIEE1KSkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDlELCBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDaG9vc2VWYWx1ZUFuZEZvcm11bGEoKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxsQ2hvb3NlT3B0aW9ucygpOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIlNVTShDSE9PU0UoezIsNn0sIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTRELCBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaWxsQ2hvb3NlT3B0aW9ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSA3ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uRm9ybXVsYSA9ICJBNCArIEE1IjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleFRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0luZGV4VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwM2VlZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleFRlc3RzLmNzCkBAIC0wLDAgKzEsNTkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgSW5kZXhUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5kZXhfU2hvdWxkX1JldHVybl9WYWx1ZV9CeV9JbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEluZGV4KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKAorICAgICAgICAgICAgICAgIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKAorICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgMworICAgICAgICAgICAgICAgICAgICApLF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5kZXhfU2hvdWxkX0hhbmRsZV9TaW5nbGVSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAzZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSA1ZDsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIklOREVYKEExOkEzOzMpIjsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JGYWN0b3J5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwTmF2aWdhdG9yRmFjdG9yeVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWRlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwTmF2aWdhdG9yRmFjdG9yeVRlc3RzLmNzCkBAIC0wLDAgKzEsNTAgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIExvb2t1cE5hdmlnYXRvckZhY3RvcnlUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX2V4Y2VsUGFja2FnZTsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfY29udGV4dDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBfZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpOworICAgICAgICAgICAgX2V4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgX2NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIF9jb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9leGNlbFBhY2thZ2UpOworICAgICAgICAgICAgX2NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfZXhjZWxQYWNrYWdlLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRfUmV0dXJuX0V4Y2VsTG9va3VwTmF2aWdhdG9yX1doZW5fUmFuZ2VfSXNfU2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDgsICJBOkIiLCAxKSk7CisgICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLkhvcml6b250YWwsIGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKG5hdmlnYXRvciwgdHlwZW9mKEV4Y2VsTG9va3VwTmF2aWdhdG9yKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkX1JldHVybl9BcnJheUxvb2t1cE5hdmlnYXRvcl9XaGVuX0FycmF5X0lzX1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDgsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsMiksIDEpKTsKKyAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uSG9yaXpvbnRhbCwgYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUobmF2aWdhdG9yLCB0eXBlb2YoQXJyYXlMb29rdXBOYXZpZ2F0b3IpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWVlMDViCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvclRlc3RzLmNzCkBAIC0wLDAgKzEsMTMyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIExvb2t1cE5hdmlnYXRvclRlc3RzCisgICAgeworICAgICAgICBjb25zdCBzdHJpbmcgV29ya3NoZWV0TmFtZSA9ICIiOworICAgICAgICBwcml2YXRlIExvb2t1cEFyZ3VtZW50cyBHZXRBcmdzKHBhcmFtcyBvYmplY3RbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbEFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTG9va3VwQXJndW1lbnRzKGxBcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgR2V0Q29udGV4dChFeGNlbERhdGFQcm92aWRlciBwcm92aWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGN0eCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgY3R4LlNjb3Blcy5OZXdTY29wZShuZXcgUmFuZ2VBZGRyZXNzKCl7V29ya3NoZWV0ID0gV29ya3NoZWV0TmFtZSwgRnJvbUNvbCA9IDEsIEZyb21Sb3cgPSAxfSk7CisgICAgICAgICAgICBjdHguRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIHJldHVybiBjdHg7CisgICAgICAgIH0KKworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIE5hdmlnYXRvclNob3VsZEV2YWx1YXRlRm9ybXVsYSgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgIC8vICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDAsIDApKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCgzKTsKKyAgICAgICAgLy8gICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMCkpLlJldHVybigiQjUiKTsKKyAgICAgICAgLy8gICAgdmFyIGFyZ3MgPSBHZXRBcmdzKDQsICJBMTpCMiIsIDEpOworICAgICAgICAvLyAgICB2YXIgY29udGV4dCA9IEdldENvbnRleHQocHJvdmlkZXIpOworICAgICAgICAvLyAgICB2YXIgcGFyc2VyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVNb2NrPEZvcm11bGFQYXJzZXI+KHByb3ZpZGVyKTsKKyAgICAgICAgLy8gICAgY29udGV4dC5QYXJzZXIgPSBwYXJzZXI7CisgICAgICAgIC8vICAgIHZhciBuYXZpZ2F0b3IgPSBuZXcgTG9va3VwTmF2aWdhdG9yKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgY29udGV4dCk7CisgICAgICAgIC8vICAgIG5hdmlnYXRvci5Nb3ZlTmV4dCgpOworICAgICAgICAvLyAgICBwYXJzZXIuQXNzZXJ0V2FzQ2FsbGVkKHggPT4geC5QYXJzZSgiQjUiKSk7CisgICAgICAgIC8vfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDdXJyZW50VmFsdWVTaG91bGRCZUZpcnN0Q2VsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDQpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBHZXRBcmdzKDMsICJBMTpCMiIsIDEpOworICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgR2V0Q29udGV4dChwcm92aWRlcikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIG5hdmlnYXRvci5DdXJyZW50VmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1vdmVOZXh0U2hvdWxkUmV0dXJuRmFsc2VJZkxhc3RDZWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDIsIDEpKS5SZXR1cm4oNCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEdldEFyZ3MoMywgIkExOkIxIiwgMSk7CisgICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsLCBhcmdzLCBHZXRDb250ZXh0KHByb3ZpZGVyKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShuYXZpZ2F0b3IuTW92ZU5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSGFzTmV4dFNob3VsZEJlVHJ1ZUlmTm90TGFzdENlbGwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXREaW1lbnNpb25FbmQoQXJnPHN0cmluZz4uSXMuQW55dGhpbmcpKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbEFkZHJlc3MoNSwgNSkpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDIsIDEpKS5SZXR1cm4oNCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEdldEFyZ3MoMywgIkExOkIyIiwgMSk7CisgICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsLCBhcmdzLCBHZXRDb250ZXh0KHByb3ZpZGVyKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG5hdmlnYXRvci5Nb3ZlTmV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNb3ZlTmV4dFNob3VsZE5hdmlnYXRlVmVydGljYWxseSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDQpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBHZXRBcmdzKDYsICJBMTpCMiIsIDEpOworICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgR2V0Q29udGV4dChwcm92aWRlcikpOworICAgICAgICAgICAgbmF2aWdhdG9yLk1vdmVOZXh0KCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgbmF2aWdhdG9yLkN1cnJlbnRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTW92ZU5leHRTaG91bGRJbmNyZWFzZUluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0RGltZW5zaW9uRW5kKEFyZzxzdHJpbmc+LklzLkFueXRoaW5nKSkuUmV0dXJuKG5ldyBFeGNlbENlbGxBZGRyZXNzKDUsIDUpKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAxKSkuUmV0dXJuKDMpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDIpKS5SZXR1cm4oNCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEdldEFyZ3MoNiwgIkExOkIyIiwgMSk7CisgICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsLCBhcmdzLCBHZXRDb250ZXh0KHByb3ZpZGVyKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbmF2aWdhdG9yLkluZGV4KTsKKyAgICAgICAgICAgIG5hdmlnYXRvci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG5hdmlnYXRvci5JbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0TG9va3VwVmFsdWVTaG91bGRSZXR1cm5Db3JyZXNwb25kaW5nVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXREaW1lbnNpb25FbmQoQXJnPHN0cmluZz4uSXMuQW55dGhpbmcpKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbEFkZHJlc3MoNSwgNSkpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDEpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMikpLlJldHVybig0KTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gR2V0QXJncyg2LCAiQTE6QjIiLCAyKTsKKyAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uVmVydGljYWwsIGFyZ3MsIEdldENvbnRleHQocHJvdmlkZXIpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBuYXZpZ2F0b3IuR2V0TG9va3VwVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0TG9va3VwVmFsdWVTaG91bGRSZXR1cm5Db3JyZXNwb25kaW5nVmFsdWVXaXRoT2Zmc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0RGltZW5zaW9uRW5kKEFyZzxzdHJpbmc+LklzLkFueXRoaW5nKSkuUmV0dXJuKG5ldyBFeGNlbENlbGxBZGRyZXNzKDUsIDUpKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAxKSkuUmV0dXJuKDMpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDMsIDMpKS5SZXR1cm4oNCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoMywgIkExOkE0IiwgMywgMiwgZmFsc2UpOworICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgR2V0Q29udGV4dChwcm92aWRlcikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIG5hdmlnYXRvci5HZXRMb29rdXBWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9SZWZBbmRMb29rdXBUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9SZWZBbmRMb29rdXBUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFlNjRjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1JlZkFuZExvb2t1cFRlc3RzLmNzCkBAIC0wLDAgKzEsNDgxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgQWRkcmVzc0Z1bmN0aW9uID0gT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwLkFkZHJlc3M7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFJlZkFuZExvb2t1cFRlc3RzCisgICAgeworICAgICAgICBjb25zdCBzdHJpbmcgV29ya3NoZWV0TmFtZSA9IG51bGw7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBBcmd1bWVudHNTaG91bGRTZXRTZWFyY2hlZFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiQTpCIiwgMik7CisgICAgICAgICAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoYXJncyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbG9va3VwQXJncy5TZWFyY2hlZFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBBcmd1bWVudHNTaG91bGRTZXRSYW5nZUFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsICJBOkIiLCAyKTsKKyAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhhcmdzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTpCIiwgbG9va3VwQXJncy5SYW5nZUFkZHJlc3MpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvb2t1cEFyZ3VtZW50c1Nob3VsZFNldENvbEluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiQTpCIiwgMik7CisgICAgICAgICAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoYXJncyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgbG9va3VwQXJncy5Mb29rdXBJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9va3VwQXJndW1lbnRzU2hvdWxkU2V0UmFuZ2VMb29rdXBUb1RydWVBc0RlZmF1bHRWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgIkE6QiIsIDIpOworICAgICAgICAgICAgdmFyIGxvb2t1cEFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKGFyZ3MpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShsb29rdXBBcmdzLlJhbmdlTG9va3VwKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBBcmd1bWVudHNTaG91bGRTZXRSYW5nZUxvb2t1cFRvVHJ1ZVdoZW5UcnVlSXNTdXBwbGllZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgIkE6QiIsIDIsIHRydWUpOworICAgICAgICAgICAgdmFyIGxvb2t1cEFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKGFyZ3MpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShsb29rdXBBcmdzLlJhbmdlTG9va3VwKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWTG9va3VwU2hvdWxkUmV0dXJuUmVzdWx0RnJvbU1hdGNoaW5nUm93KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVkxvb2t1cCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCAiQTE6QjIiLCAyKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMSk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKDEpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybigyKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDIsIDIpKS5SZXR1cm4oNSk7CisKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWTG9va3VwU2hvdWxkUmV0dXJuQ2xvc2VzdFZhbHVlQmVsb3dXaGVuUmFuZ2VMb29rdXBJc1RydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBWTG9va3VwKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsICJBMTpCMiIsIDIsIHRydWUpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oMSk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDUpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMikpLlJldHVybig0KTsKKworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFZMb29rdXBTaG91bGRSZXR1cm5DbG9zZXN0U3RyaW5nVmFsdWVCZWxvd1doZW5SYW5nZUxvb2t1cElzVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFZMb29rdXAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkIiLCAiQTE6QjIiLCAyLCB0cnVlKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIC8vcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMCwgMCkpLlJldHVybihuZXcgRXhjZWxDZWxsKCJBIiwgbnVsbCwgMCwgMCkpOworICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwwLCAxKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoMSwgbnVsbCwgMCwgMCkpOworICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAwKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoIkMiLCBudWxsLCAwLCAwKSk7CisgICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCg0LCBudWxsLCAwLCAwKSk7CisKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAxKSkuUmV0dXJuKCJBIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMikpLlJldHVybigxKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAyLCAxKSkuUmV0dXJuKCJDIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMiwgMikpLlJldHVybig0KTsKKworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhMb29rdXBTaG91bGRSZXR1cm5SZXN1bHRGcm9tTWF0Y2hpbmdSb3coKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBITG9va3VwKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsICJBMTpCMiIsIDIpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwwLCAwKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoMywgbnVsbCwgMCwgMCkpOworICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwwLCAxKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoMSwgbnVsbCwgMCwgMCkpOworICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAwKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoMiwgbnVsbCwgMCwgMCkpOworICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoNSwgbnVsbCwgMCwgMCkpOworCisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMSkpLlJldHVybigxKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAyKSkuUmV0dXJuKDEpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDIsIDEpKS5SZXR1cm4oMik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMiwgMikpLlJldHVybig1KTsKKworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhMb29rdXBTaG91bGRSZXR1cm5OYUVycm9ySWZOb01hdGNoaW5nUmVjb3JkSXNGb3VuZFdoZW5SYW5nZUxvb2t1cElzRmFsc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBITG9va3VwKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsICJBMTpCMiIsIDIsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDEpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMikpLlJldHVybigxKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAyLCAxKSkuUmV0dXJuKDIpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDIsIDIpKS5SZXR1cm4oNSk7CisKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9IEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRSZXN1bHQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgSExvb2t1cFNob3VsZFRocm93SWZOb01hdGNoaW5nUmVjb3JkSXNGb3VuZFdoZW5SYW5nZUxvb2t1cElzVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEhMb29rdXAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgIkExOkIyIiwgMiwgdHJ1ZSk7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworCisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAxKSkuUmV0dXJuKDIpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDIpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMiwgMSkpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAyLCAyKSkuUmV0dXJuKDUpOworCisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9va3VwU2hvdWxkUmV0dXJuUmVzdWx0RnJvbU1hdGNoaW5nUm93QXJyYXlWZXJ0aWNhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExvb2t1cCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAiQTE6QjMiLCAyKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMSk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKCJBIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDMpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMikpLlJldHVybigiQiIpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMywgMSkpLlJldHVybig1KTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDIpKS5SZXR1cm4oIkMiKTsKKworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9va3VwU2hvdWxkUmV0dXJuUmVzdWx0RnJvbU1hdGNoaW5nUm93QXJyYXlIb3Jpem9udGFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTG9va3VwKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsICJBMTpDMiIsIDIpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAzKSkuUmV0dXJuKDUpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybigiQSIpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMikpLlJldHVybigiQiIpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMykpLlJldHVybigiQyIpOworCisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkIiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBTaG91bGRSZXR1cm5SZXN1bHRGcm9tTWF0Y2hpbmdTZWNvbmRBcnJheUhvcml6b250YWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMb29rdXAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgIkExOkMxIiwgIkEzOkMzIik7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworCisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDEpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDMpKS5SZXR1cm4oNSk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAxKSkuUmV0dXJuKCJBIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAyKSkuUmV0dXJuKCJCIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAzKSkuUmV0dXJuKCJDIik7CisKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQiIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvb2t1cFNob3VsZFJldHVyblJlc3VsdEZyb21NYXRjaGluZ1NlY29uZEFycmF5SG9yaXpvbnRhbFdpdGhPZmZzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMb29rdXAoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgIkExOkMxIiwgIkIzOkQzIik7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworCisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDEpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDMpKS5SZXR1cm4oNSk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAyKSkuUmV0dXJuKCJBIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAzKSkuUmV0dXJuKCJCIik7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCA0KSkuUmV0dXJuKCJDIik7CisKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQiIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1hdGNoU2hvdWxkUmV0dXJuSW5kZXhPZk1hdGNoaW5nVmFsSG9yaXpvbnRhbF9NYXRjaFR5cGVFeGFjdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1hdGNoKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMsICJBMTpDMSIsIDApOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAzKSkuUmV0dXJuKDUpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1hdGNoU2hvdWxkUmV0dXJuSW5kZXhPZk1hdGNoaW5nVmFsVmVydGljYWxfTWF0Y2hUeXBlRXhhY3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXRjaCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCAiQTE6QTMiLCAwKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMSk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDMpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMywgMSkpLlJldHVybig1KTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaFNob3VsZFJldHVybkluZGV4T2ZNYXRjaGluZ1ZhbEhvcml6b250YWxfTWF0Y2hUeXBlQ2xvc2VzdEJlbG93KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWF0Y2goKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgIkExOkMxIiwgMSk7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworCisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDEpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybigzKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDMpKS5SZXR1cm4oNSk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWF0Y2hTaG91bGRSZXR1cm5JbmRleE9mTWF0Y2hpbmdWYWxIb3Jpem9udGFsX01hdGNoVHlwZUNsb3Nlc3RBYm92ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1hdGNoKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDYsICJBMTpDMSIsIC0xKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMTApOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybig4KTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDMpKS5SZXR1cm4oNSk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWF0Y2hTaG91bGRSZXR1cm5GaXJzdEl0ZW1XaGVuRXhhY3RNYXRjaF9NYXRjaFR5cGVDbG9zZXN0QWJvdmUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXRjaCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMCwgIkExOkMxIiwgLTEpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxMCk7CisgICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKDgpOworICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMykpLlJldHVybig1KTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSb3dTaG91bGRSZXR1cm5Sb3dGcm9tQ3VycmVudFNjb3BlSWZOb0FkZHJlc3NJc1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm93KCk7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShyYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSgiQTIiKSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEVudW1lcmFibGUuRW1wdHk8RnVuY3Rpb25Bcmd1bWVudD4oKSwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvd1Nob3VsZFJldHVyblJvd1N1cHBsaWVkQWRkcmVzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdygpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkEzIiksIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb2x1bW5TaG91bGRSZXR1cm5Sb3dGcm9tQ3VycmVudFNjb3BlSWZOb0FkZHJlc3NJc1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ29sdW1uKCk7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShyYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSgiQjIiKSk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEVudW1lcmFibGUuRW1wdHk8RnVuY3Rpb25Bcmd1bWVudD4oKSwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbHVtblNob3VsZFJldHVyblJvd1N1cHBsaWVkQWRkcmVzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvbHVtbigpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkUzIiksIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSb3dzU2hvdWxkUmV0dXJuTmJyT2ZSb3dzU3VwcGxpZWRSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvd3MoKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJBMTpCMyIpLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm93c1Nob3VsZFJldHVybk5ick9mUm93c0ZvckVudGlyZUNvbHVtbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvd3MoKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJBOkIiKSwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwNDg1NzYsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbHVtbnNzU2hvdWxkUmV0dXJuTmJyT2ZSb3dzU3VwcGxpZWRSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvbHVtbnMoKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJBMTpFMyIpLCBwYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2hvb3NlU2hvdWxkUmV0dXJuSXRlbUJ5SW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDaG9vc2UoKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiQSIsICJCIiksIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQSIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NTaG91bGRSZXR1cm5BZGRyZXNzQnlJbmRleFdpdGhEZWZhdWx0UmVmVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFkZHJlc3NGdW5jdGlvbigpOworICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMiksIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiJEIkMSIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NTaG91bGRSZXR1cm5BZGRyZXNzQnlJbmRleFdpdGhSZWxhdGl2ZVR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBZGRyZXNzRnVuY3Rpb24oKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5FeGNlbE1heFJvd3MpLlJldHVybigxMCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIChpbnQpRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QW5kQ29sdW1uKSwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCMSIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NTaG91bGRSZXR1cm5BZGRyZXNzQnlXaXRoU3BlY2lmaWVkV29ya3NoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQWRkcmVzc0Z1bmN0aW9uKCk7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguRXhjZWxNYXhSb3dzKS5SZXR1cm4oMTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCAoaW50KUV4Y2VsUmVmZXJlbmNlVHlwZS5SZWxhdGl2ZVJvd0FuZENvbHVtbiwgdHJ1ZSwgIldvcmtzaGVldDEiKSwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJXb3Jrc2hlZXQxIUIxIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkcmVzc1Nob3VsZFRocm93SWZSMUMxRm9ybWF0SXNTcGVjaWZpZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBZGRyZXNzRnVuY3Rpb24oKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5FeGNlbE1heFJvd3MpLlJldHVybigxMCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIChpbnQpRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QW5kQ29sdW1uLCBmYWxzZSksIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1N1YnRvdGFsVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9TdWJ0b3RhbFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTQxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9TdWJ0b3RhbFRlc3RzLmNzCkBAIC0wLDAgKzEsMjM5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgU3VidG90YWxUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfY29udGV4dDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIF9jb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dJZkludmFsaWRGdW5jTnVtYmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTM5LCAxKTsKKyAgICAgICAgICAgIGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlQXZlcmFnZVdoZW5DYWxjVHlwZUlzMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZUNvdW50V2hlbkNhbGNUeXBlSXMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVDb3VudEFXaGVuQ2FsY1R5cGVJczMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdWJ0b3RhbCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZU1heFdoZW5DYWxjVHlwZUlzNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZU1pbldoZW5DYWxjVHlwZUlzNSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDUsIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVByb2R1Y3RXaGVuQ2FsY1R5cGVJczYoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdWJ0b3RhbCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg2LCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwMDAwMDBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVTdGRldldoZW5DYWxjVHlwZUlzNygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDcsIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIHZhciByZXN1bHRSb3VuZGVkID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE1LjgxMTM5ZCwgcmVzdWx0Um91bmRlZCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlU3RkZXZQV2hlbkNhbGNUeXBlSXM4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOCwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgdmFyIHJlc3VsdFJvdW5kZWQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTQuMTQyMTM1NjIsIHJlc3VsdFJvdW5kZWQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVN1bVdoZW5DYWxjVHlwZUlzOSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDksIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNTBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVWYXJXaGVuQ2FsY1R5cGVJczEwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAsIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyNTBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVWYXJQV2hlbkNhbGNUeXBlSXMxMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDExLCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAwZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlQXZlcmFnZVdoZW5DYWxjVHlwZUlzMTAxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAxLCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVDb3VudFdoZW5DYWxjVHlwZUlzMTAyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAyLCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZUNvdW50QVdoZW5DYWxjVHlwZUlzMTAzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAzLCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZU1heFdoZW5DYWxjVHlwZUlzMTA0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA0LCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVNaW5XaGVuQ2FsY1R5cGVJczEwNSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwNSwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlUHJvZHVjdFdoZW5DYWxjVHlwZUlzMTA2KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA2LCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwMDAwMDBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVTdGRldldoZW5DYWxjVHlwZUlzMTA3KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA3LCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0Um91bmRlZCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA1KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNS44MTEzOWQsIHJlc3VsdFJvdW5kZWQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVN0ZGV2UFdoZW5DYWxjVHlwZUlzMTA4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKKyAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA4LCAxMCwgMjAsIDMwLCA0MCwgNTApOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0Um91bmRlZCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA4KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNC4xNDIxMzU2MiwgcmVzdWx0Um91bmRlZCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlU3VtV2hlbkNhbGNUeXBlSXMxMDkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdWJ0b3RhbCgpOworICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMDksIDEwLCAyMCwgMzAsIDQwLCA1MCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNTBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVWYXJXaGVuQ2FsY1R5cGVJczExMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDExMCwgMTAsIDIwLCAzMCwgNDAsIDUwLCA1MSk7CisgICAgICAgICAgICBhcmdzLkxhc3QoKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDI1MGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVZhclBXaGVuQ2FsY1R5cGVJczExMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7CisgICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDExMSwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMGQsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvU3VtSWZzVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9TdW1JZnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJmOGMwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvU3VtSWZzVGVzdHMuY3MKQEAgLTAsMCArMSw4NSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgU3VtSWZzVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF9zaGVldDsKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgczEgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgczEuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgczEuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgczEuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzOworICAgICAgICAgICAgczEuQ2VsbHNbIkE0Il0uVmFsdWUgPSA0OworCisgICAgICAgICAgICBzMS5DZWxsc1siQjEiXS5WYWx1ZSA9IDU7CisgICAgICAgICAgICBzMS5DZWxsc1siQjIiXS5WYWx1ZSA9IDY7CisgICAgICAgICAgICBzMS5DZWxsc1siQjMiXS5WYWx1ZSA9IDc7CisgICAgICAgICAgICBzMS5DZWxsc1siQjQiXS5WYWx1ZSA9IDg7CisKKyAgICAgICAgICAgIHMxLkNlbGxzWyJDMSJdLlZhbHVlID0gNTsKKyAgICAgICAgICAgIHMxLkNlbGxzWyJDMiJdLlZhbHVlID0gNjsKKyAgICAgICAgICAgIHMxLkNlbGxzWyJDMyJdLlZhbHVlID0gNzsKKyAgICAgICAgICAgIHMxLkNlbGxzWyJDNCJdLlZhbHVlID0gODsKKworICAgICAgICAgICAgX3NoZWV0ID0gczE7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlVHdvQ3JpdGVyaWFSYW5nZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJTVU1JRlMoQTE6QTQ7QjE6QjU7XCI+NVwiO0MxOkM1O1wiPjRcIikiOworICAgICAgICAgICAgX3NoZWV0LkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOWQsIF9zaGVldC5DZWxsc1siQTUiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSWdub3JlRXJyb3JJbkNyaXRlcmlhUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuRGl2MCk7CisKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIlNVTUlGUyhBMTpBNDtCMTpCNTtcIj41XCI7QzE6QzU7XCI+NFwiKSI7CisgICAgICAgICAgICBfc2hlZXQuQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2ZCwgX3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVEYXRlSW5TdW1SYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIkRBVEUoMjAxNTsxOzEpIjsKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIlNVTUlGUyhBMTpBNDtCMTpCNTtcIj41XCI7QzE6QzU7XCI+NFwiKSI7CisgICAgICAgICAgICBfc2hlZXQuQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MjAxMmQsIF9zaGVldC5DZWxsc1siQTUiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlRXhjZWxSYW5nZXNJbkNyaXRlcmlhKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gNjsKKyAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIlNVTUlGUyhBMTpBNDtCMTpCNTtcIj41XCI7QzE6QzU7RDEpIjsKKyAgICAgICAgICAgIF9zaGVldC5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBfc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dEZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dEZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNWJkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0RnVuY3Rpb25zVGVzdHMuY3MKQEAgLTAsMCArMSwxODcgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7Cit1c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVGV4dEZ1bmN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDU3RyU2hvdWxkQ29udmVydE51bWJlclRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ1N0cigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChEYXRhVHlwZS5TdHJpbmcsIHJlc3VsdC5EYXRhVHlwZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMZW5TaG91bGRSZXR1cm5TdHJpbmdzTGVuZ3RoKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTGVuKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmMiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG93ZXJTaG91bGRSZXR1cm5Mb3dlckNhc2VTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMb3dlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiQUJDIiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiYyIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFVwcGVyU2hvdWxkUmV0dXJuVXBwZXJDYXNlU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVXBwZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiYyIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBQkMiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMZWZ0U2hvdWxkUmV0dXJuU3Vic3RyaW5nRnJvbUxlZnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMZWZ0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmNkIiwgMiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmlnaHRTaG91bGRSZXR1cm5TdWJzdHJpbmdGcm9tUmlnaHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSaWdodCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiYWJjZCIsIDIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJjZCIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1pZFNob3VsZFJldHVyblN1YnN0cmluZ0FjY29yZGluZ1RvUGFyYW1zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWlkKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmNkIiwgMSwgMiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVwbGFjZVNob3VsZFJldHVybkFSZXBsYWNlZFN0cmluZ0FjY29yZGluZ1RvUGFyYW1zV2hlblN0YXJ0SXhJczEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSZXBsYWNlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJ0ZXN0YXIiLCAxLCAyLCAiaGVqIiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhlanN0YXIiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZXBsYWNlU2hvdWxkUmV0dXJuQVJlcGxhY2VkU3RyaW5nQWNjb3JkaW5nVG9QYXJhbXNXaGVuU3RhcnRJeElzMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJlcGxhY2UoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoInRlc3RhciIsIDMsIDMsICJoZWoiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVoZWpyIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3Vic3RpdHV0ZVNob3VsZFJldHVybkFSZXBsYWNlZFN0cmluZ0FjY29yZGluZ1RvUGFyYW1zV2hlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnN0aXR1dGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoInRlc3RhciB0ZXN0YXIiLCAiZXMiLCAieHgiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidHh4dGFyIHR4eHRhciIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbmNhdGVuYXRlU2hvdWxkQ29uY2F0ZW5hdGVUaHJlZVN0cmluZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb25jYXRlbmF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiT25lIiwgIlR3byIsICJUaHJlZSIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJPbmVUd29UaHJlZSIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbmNhdGVuYXRlU2hvdWxkQ29uY2F0ZW5hdGVTdHJpbmdXaXRoSW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ29uY2F0ZW5hdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgIlR3byIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxVHdvIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhhY3RTaG91bGRSZXR1cm5UcnVlV2hlblR3b0VxdWFsU3RyaW5ncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEV4YWN0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmMiLCAiYWJjIiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YWN0U2hvdWxkUmV0dXJuVHJ1ZVdoZW5FcXVhbFN0cmluZ0FuZERvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEV4YWN0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxIiwgMWQpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFeGFjdFNob3VsZFJldHVybkZhbHNlV2hlblN0cmluZ0FuZE51bGwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBFeGFjdCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMSIsIG51bGwpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhhY3RTaG91bGRSZXR1cm5GYWxzZVdoZW5Ud29FcXVhbFN0cmluZ3NXaXRoRGlmZmVyZW50Q2FzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEV4YWN0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmMiLCAiQWJjIiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGaW5kU2hvdWxkUmV0dXJuSW5kZXhPZkZvdW5kUGhyYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRmluZCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiaG9wcCIsICJoZWogaG9wcCIpLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpbmRTaG91bGRSZXR1cm5JbmRleE9mRm91bmRQaHJhc2VCYXNlZE9uU3RhcnRJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZpbmQoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImhvcHAiLCAiaG9wcCBob3BwIiwgMiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUHJvcGVyU2hvdWxkU2V0Rmlyc3RMZXR0ZXJUb1VwcGVyQ2FzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFByb3BlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygidGhpcyBJUyBBIHRFc3Qud2kzdGggU09NRSB3MHJkcyDDtnN0RXIiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGhpcyBJcyBBIFRlc3QuV2kzVGggU29tZSBXMFJkcyDDlnN0ZXIiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIeXBlckxpbmtTaG91bGRSZXR1cm5BcmdJZk9uZUFyZ0lzU3VwcGxpZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBIeXBlcmxpbmsoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIiksIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSHlwZXJMaW5rU2hvdWxkUmV0dXJuTGFzdEFyZ0lmVHdvQXJnc0FyZVN1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSHlwZXJsaW5rKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbSIsICJFUFBsdXMiKSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRVBQbHVzIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UaW1lU3RyaW5nUGFyc2VyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UaW1lU3RyaW5nUGFyc2VyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxM2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RpbWVTdHJpbmdQYXJzZXJUZXN0cy5jcwpAQCAtMCwwICsxLDc3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbC5GdW5jdGlvbnMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUaW1lU3RyaW5nUGFyc2VyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgZG91YmxlIEdldFNlcmlhbE51bWJlcihpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlY29uZHNJbkFEYXkgPSAyNGQgKiA2MGQgKiA2MGQ7CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpaG91ciAqIDYwICogNjAgKyAoZG91YmxlKW1pbnV0ZSAqIDYwICsgKGRvdWJsZSlzZWNvbmQpIC8gc2Vjb25kc0luQURheTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYW5QYXJzZVNob3VsZEhhbmRsZVZhbGlkMjRIb3VyUGF0dGVybnMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFyc2VyLkNhblBhcnNlKCIxMDoxMjo1NSIpLCAiQ291bGQgbm90IHBhcnNlIDEwOjEyOjU1Iik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBhcnNlci5DYW5QYXJzZSgiMjI6MTI6NTUiKSwgIkNvdWxkIG5vdCBwYXJzZSAxMzoxMjo1NSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwYXJzZXIuQ2FuUGFyc2UoIjEzIiksICJDb3VsZCBub3QgcGFyc2UgMTMiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFyc2VyLkNhblBhcnNlKCIxMzoxMiIpLCAiQ291bGQgbm90IHBhcnNlIDEzOjEyIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2FuUGFyc2VTaG91bGRIYW5kbGVWYWxpZDEySG91clBhdHRlcm5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBUaW1lU3RyaW5nUGFyc2VyKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBhcnNlci5DYW5QYXJzZSgiMTA6MTI6NTUgQU0iKSwgIkNvdWxkIG5vdCBwYXJzZSAxMDoxMjo1NSBBTSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwYXJzZXIuQ2FuUGFyc2UoIjk6MTI6NTUgUE0iKSwgIkNvdWxkIG5vdCBwYXJzZSA5OjEyOjU1IFBNIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBhcnNlci5DYW5QYXJzZSgiNyBBTSIpLCAiQ291bGQgbm90IHBhcnNlIDcgQU0iKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFyc2VyLkNhblBhcnNlKCI0OjEyIFBNIiksICJDb3VsZCBub3QgcGFyc2UgNDoxMiBQTSIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkSWRlbnRpZnlQYXR0ZXJuQW5kUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgVGltZVN0cmluZ1BhcnNlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZSgiMTA6MTI6NTUiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChHZXRTZXJpYWxOdW1iZXIoMTAsIDEyLCA1NSksIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEZvcm1hdEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVNob3VsZFRocm93RXhjZXB0aW9uSWZTZWNvbmRJc091dE9mUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjEwOjEyOjYwIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEZvcm1hdEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVNob3VsZFRocm93RXhjZXB0aW9uSWZNaW51dGVJc091dE9mUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjEwOjYwOjU1Iik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VTaG91bGRJZGVudGlmeTEySG91ckFNUGF0dGVybkFuZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjEwOjEyOjU1IEFNIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoR2V0U2VyaWFsTnVtYmVyKDEwLCAxMiwgNTUpLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkSWRlbnRpZnkxMkhvdXJQTVBhdHRlcm5BbmRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBUaW1lU3RyaW5nUGFyc2VyKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKCIxMDoxMjo1NSBQTSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEdldFNlcmlhbE51bWJlcigyMiwgMTIsIDU1KSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9yc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmRmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9yc1Rlc3RzLmNzCkBAIC0wLDAgKzEsMTQ4IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIE9wZXJhdG9yc1Rlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JQbHVzU2hvdWxkVGhyb3dFeGNlcHRpb25JZk5vbk51bWVyaWNPcGVyYW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLlBsdXMuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KCJhIiwgRGF0YVR5cGUuU3RyaW5nKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JQbHVzU2hvdWxkQWRkTnVtZXJpY1N0cmluZ0FuZE51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5QbHVzLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiMiIsIERhdGFUeXBlLlN0cmluZykpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvck1pbnVzU2hvdWxkVGhyb3dFeGNlcHRpb25JZk5vbk51bWVyaWNPcGVyYW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLk1pbnVzLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiYSIsIERhdGFUeXBlLlN0cmluZykpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yTWludXNTaG91bGRTdWJ0cmFjdE51bWVyaWNTdHJpbmdBbmROdW1iZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuTWludXMuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoNSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KCIyIiwgRGF0YVR5cGUuU3RyaW5nKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRGl2aWRlU2hvdWxkUmV0dXJuRGl2aWRlQnlaZXJvSWZSaWdodE9wZXJhbmRJc1plcm8oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuRGl2aWRlLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDFkLCBEYXRhVHlwZS5EZWNpbWFsKSwgbmV3IENvbXBpbGVSZXN1bHQoMGQsIERhdGFUeXBlLkRlY2ltYWwpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuRGl2MCksIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRGl2aWRlU2hvdWxkRGl2aWRlQ29ycmVjdGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLkRpdmlkZS5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCg5ZCwgRGF0YVR5cGUuRGVjaW1hbCksIG5ldyBDb21waWxlUmVzdWx0KDNkLCBEYXRhVHlwZS5EZWNpbWFsKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRGl2aWRlU2hvdWxkUmV0dXJuVmFsdWVFcnJvcklmTm9uTnVtZXJpY09wZXJhbmQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuRGl2aWRlLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiYSIsIERhdGFUeXBlLlN0cmluZykpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRGl2aWRlU2hvdWxkRGl2aWRlTnVtZXJpY1N0cmluZ0FuZE51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5EaXZpZGUuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoOSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KCIzIiwgRGF0YVR5cGUuU3RyaW5nKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yTXVsdGlwbHlTaG91bGRUaHJvd0V4Y2VwdGlvbklmTm9uTnVtZXJpY09wZXJhbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRvci5NdWx0aXBseS5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoImEiLCBEYXRhVHlwZS5TdHJpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvTXVsdGlwbHlTaG91bGRNdWx0aXBseU51bWVyaWNTdHJpbmdBbmROdW1iZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuTXVsdGlwbHkuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KCIzIiwgRGF0YVR5cGUuU3RyaW5nKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yQ29uY2F0U2hvdWxkQ29uY2F0VHdvU3RyaW5ncygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5Db25jYXQuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoImEiLCBEYXRhVHlwZS5TdHJpbmcpLCBuZXcgQ29tcGlsZVJlc3VsdCgiYiIsIERhdGFUeXBlLlN0cmluZykpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhYiIsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yQ29uY2F0U2hvdWxkQ29uY2F0QU51bWJlckFuZEFTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuQ29uY2F0LkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDEyLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoImIiLCBEYXRhVHlwZS5TdHJpbmcpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMTJiIiwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JFcVNob3VsZFJldHVyblRydWVmU3VwcGxpZWRWYWx1ZXNBcmVFcXVhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5FcS5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMiwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KDEyLCBEYXRhVHlwZS5JbnRlZ2VyKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRXFTaG91bGRSZXR1cm5GYWxzZWZTdXBwbGllZFZhbHVlc0RpZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5FcS5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KDEyLCBEYXRhVHlwZS5JbnRlZ2VyKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvck5vdEVxdWFsVG9TaG91bGRSZXR1cm5UcnVlZlN1cHBsaWVkVmFsdWVzRGlmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLk5vdEVxdWFsc1RvLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDExLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoMTIsIERhdGFUeXBlLkludGVnZXIpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JOb3RFcXVhbFRvU2hvdWxkUmV0dXJuRmFsc2VmU3VwcGxpZWRWYWx1ZXNBcmVFcXVhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5Ob3RFcXVhbHNUby5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KDExLCBEYXRhVHlwZS5JbnRlZ2VyKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckdyZWF0ZXJUaGFuVG9TaG91bGRSZXR1cm5UcnVlSWZMZWZ0SXNTZXRBbmRSaWdodElzTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5HcmVhdGVyVGhhbi5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KG51bGwsIERhdGFUeXBlLkVtcHR5KSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yR3JlYXRlclRoYW5Ub1Nob3VsZFJldHVyblRydWVJZkxlZnRJczExQW5kUmlnaHRJczEwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLkdyZWF0ZXJUaGFuLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDExLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoMTAsIERhdGFUeXBlLkludGVnZXIpKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JFeHBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLkV4cC5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgyLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoMywgRGF0YVR5cGUuSW50ZWdlcikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDhkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBmMjNlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9BZGRyZXNzVHJhbnNsYXRvclRlc3RzLmNzCkBAIC0wLDAgKzEsNjkgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBBZGRyZXNzVHJhbnNsYXRvclRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIEFkZHJlc3NUcmFuc2xhdG9yIF9hZGRyZXNzVHJhbnNsYXRvcjsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEV4Y2VsTWF4Um93cyA9IDEzNTY7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5FeGNlbE1heFJvd3MpLlJldHVybihFeGNlbE1heFJvd3MpOworICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yID0gbmV3IEFkZHJlc3NUcmFuc2xhdG9yKF9leGNlbERhdGFQcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvclNob3VsZFRocm93SWZQcm92aWRlcklzTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBBZGRyZXNzVHJhbnNsYXRvcihudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVSb3dOdW1iZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29sLCByb3c7CisgICAgICAgICAgICBfYWRkcmVzc1RyYW5zbGF0b3IuVG9Db2xBbmRSb3coIkEyIiwgb3V0IGNvbCwgb3V0IHJvdyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcm93KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVMZXR0ZXJzVG9Db2x1bW5JbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2wsIHJvdzsKKyAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdygiQzEiLCBvdXQgY29sLCBvdXQgcm93KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBjb2wpOworICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KCJBQTIiLCBvdXQgY29sLCBvdXQgcm93KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyNywgY29sKTsKKyAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdygiQkMxIiwgb3V0IGNvbCwgb3V0IHJvdyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTUsIGNvbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlTGV0dGVyQWRkcmVzc1VzaW5nTWF4Um93c0Zyb21Qcm92aWRlckxvd2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbCwgcm93OworICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KCJBIiwgb3V0IGNvbCwgb3V0IHJvdyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcm93KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVMZXR0ZXJBZGRyZXNzVXNpbmdNYXhSb3dzRnJvbVByb3ZpZGVyVXBwZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29sLCByb3c7CisgICAgICAgICAgICBfYWRkcmVzc1RyYW5zbGF0b3IuVG9Db2xBbmRSb3coIkEiLCBvdXQgY29sLCBvdXQgcm93LCBBZGRyZXNzVHJhbnNsYXRvci5SYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyLkxhc3RQYXJ0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbE1heFJvd3MsIHJvdyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0NlbGxSZWZlcmVuY2VQcm92aWRlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9DZWxsUmVmZXJlbmNlUHJvdmlkZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZmYWJlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9DZWxsUmVmZXJlbmNlUHJvdmlkZXJUZXN0cy5jcwpAQCAtMCwwICsxLDUwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFJoaW5vLk1vY2tzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBDZWxsUmVmZXJlbmNlUHJvdmlkZXJUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfcHJvdmlkZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9wcm92aWRlci5TdHViKHggPT4geC5FeGNlbE1heFJvd3MpLlJldHVybig1MDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5SZWZlcmVuY2VkU2luZ2xlQWRkcmVzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLlNldExleGVyKG5ldyBMZXhlcihwYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgcGFyc2luZ0NvbnRleHQuTmFtZVZhbHVlUHJvdmlkZXIpKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShfcHJvdmlkZXIpOworICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gbmV3IENlbGxSZWZlcmVuY2VQcm92aWRlcigpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHByb3ZpZGVyLkdldFJlZmVyZW5jZWRBZGRyZXNzZXMoIkExIiwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHJlc3VsdC5GaXJzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5SZWZlcmVuY2VkTXVsdGlwbGVBZGRyZXNzZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5TZXRMZXhlcihuZXcgTGV4ZXIocGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnksIHBhcnNpbmdDb250ZXh0Lk5hbWVWYWx1ZVByb3ZpZGVyKSk7CisgICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoX3Byb3ZpZGVyKTsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBDZWxsUmVmZXJlbmNlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBwcm92aWRlci5HZXRSZWZlcmVuY2VkQWRkcmVzc2VzKCJBMTpBMiIsIHBhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCByZXN1bHQuRmlyc3QoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEyIiwgcmVzdWx0Lkxhc3QoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsQWRkcmVzc0luZm9UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mb1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzEwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsQWRkcmVzc0luZm9UZXN0cy5jcwpAQCAtMCwwICsxLDY4IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsVXRpbGl0aWVzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRXhjZWxBZGRyZXNzSW5mb1Rlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkVGhyb3dJZkFkZHJlc3NJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkU2V0V29ya3NoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGluZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKCJXb3Jrc2hlZXQhQTEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiV29ya3NoZWV0IiwgaW5mby5Xb3Jrc2hlZXQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFdvcmtzaGVldElzU3BlY2lmaWVkU2hvdWxkQmVUcnVlV2hlbldvcmtzaGVldElzU3VwcGxpZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5mbyA9IEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UoIldvcmtzaGVldCFBMSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbmZvLldvcmtzaGVldElzU3BlY2lmaWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRJbmRpY2F0ZU11bHRpcGxlQ2VsbHNXaGVuQWRkcmVzc0NvbnRhaW5zQUNvbG9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGluZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKCJBMTpBMiIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbmZvLklzTXVsdGlwbGVDZWxscyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0U3RhcnRDZWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGluZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKCJBMTpBMiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIGluZm8uU3RhcnRDZWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRTZXRFbmRDZWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGluZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKCJBMTpBMiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMiIsIGluZm8uRW5kQ2VsbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VTaG91bGRTZXRBZGRyZXNzT25TaGVldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZSgiV29ya3NoZWV0IUExOkEyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExOkEyIiwgaW5mby5BZGRyZXNzT25TaGVldCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkcmVzc09uU2hlZXRTaG91bGRCZVNhbWVBc0FkZHJlc3NJZk5vV29ya3NoZWV0SXNTcGVjaWZpZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5mbyA9IEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UoIkExOkEyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExOkEyIiwgaW5mby5BZGRyZXNzT25TaGVldCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhwcmVzc2lvbkV2YWx1YXRvclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MzBlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcwpAQCAtMCwwICsxLDI5MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljcy5EZXNpZ247Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uRXZhbHVhdG9yVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhwcmVzc2lvbkV2YWx1YXRvciBfZXZhbHVhdG9yOworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfZXZhbHVhdG9yID0gbmV3IEV4cHJlc3Npb25FdmFsdWF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gTnVtZXJpYyBFeHByZXNzaW9uIFRlc3RzCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZFJldHVyblRydWVJZk9wZXJhbmRzQXJlRXF1YWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiMSIsICIxIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRSZXR1cm5UcnVlSWZPcGVyYW5kc0FyZU1hdGNoaW5nQnV0RGlmZmVyZW50VHlwZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZEV2YWx1YXRlT3BlcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjwyIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRFdmFsdWF0ZU51bWVyaWNTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiMSIsICI+MCIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkSGFuZGxlQm9vbGVhbkFyZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKHRydWUsICJUUlVFIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkVGhyb3dJZk9wZXJhdG9ySXNOb3RCb29sZWFuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMWQsICIrMSIpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIERhdGUgdGVzdHMKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkSGFuZGxlRGF0ZUFyZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlID0gQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKG5ldyBEYXRlVGltZSgyMDE2LDYsMjgpLCAiMjAxNi0wNi0yOCIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkSGFuZGxlRGF0ZUFyZ1dpdGhPcGVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlID0gQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKG5ldyBEYXRlVGltZSgyMDE2LCA2LCAyOCksICI+MjAxNi0wNi0yNyIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIEJsYW5rIEV4cHJlc3Npb24gVGVzdHMKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQmxhbmtFeHByZXNzaW9uRXF1YWxzTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKG51bGwsICIiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUJsYW5rRXhwcmVzc2lvbkVxdWFsc0VtcHR5U3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoc3RyaW5nLkVtcHR5LCAiIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQmxhbmtFeHByZXNzaW9uRXF1YWxzWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDBkLCAiIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFF1b3RlcyBFeHByZXNzaW9uIFRlc3RzCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVF1b3Rlc0V4cHJlc3Npb25FcXVhbHNOdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobnVsbCwgIlwiXCIiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVRdW90ZXNFeHByZXNzaW9uRXF1YWxzWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDBkLCAiXCJcIiIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVF1b3Rlc0V4cHJlc3Npb25FcXVhbHNDaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYSIsICJcIlwiIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIE5vdEVxdWFsVG9aZXJvIEV4cHJlc3Npb24gVGVzdHMKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb1plcm9FeHByZXNzaW9uRXF1YWxzTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKG51bGwsICI8PjAiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZU5vdEVxdWFsVG9aZXJvRXhwcmVzc2lvbkVxdWFsc0VtcHR5U3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoc3RyaW5nLkVtcHR5LCAiPD4wIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVOb3RFcXVhbFRvWmVyb0V4cHJlc3Npb25FcXVhbHNDaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYSIsICI8PjAiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZU5vdEVxdWFsVG9aZXJvRXhwcmVzc2lvbkVxdWFsc05vblplcm8oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjw+MCIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb1plcm9FeHByZXNzaW9uRXF1YWxzWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDBkLCAiPD4wIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIE5vdEVxdWFsVG9CbGFuayBFeHByZXNzaW9uIFRlc3RzCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZU5vdEVxdWFsVG9CbGFua0V4cHJlc3Npb25FcXVhbHNOdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobnVsbCwgIjw+Iik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb0JsYW5rRXhwcmVzc2lvbkVxdWFsc0VtcHR5U3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoc3RyaW5nLkVtcHR5LCAiPD4iKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZU5vdEVxdWFsVG9CbGFua0V4cHJlc3Npb25FcXVhbHNDaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYSIsICI8PiIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb0JsYW5rRXhwcmVzc2lvbkVxdWFsc05vblplcm8oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjw+Iik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVOb3RFcXVhbFRvQmxhbmtFeHByZXNzaW9uRXF1YWxzWmVybygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDBkLCAiPD4iKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBDaGFyYWN0ZXIgRXhwcmVzc2lvbiBUZXN0cworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVDaGFyYWN0ZXJFeHByZXNzaW9uRXF1YWxOdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobnVsbCwgImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVDaGFyYWN0ZXJFeHByZXNzaW9uRXF1YWxzRW1wdHlTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShzdHJpbmcuRW1wdHksICJhIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyRXhwcmVzc2lvbkVxdWFsc051bWVyYWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVDaGFyYWN0ZXJFeHByZXNzaW9uRXF1YWxzU2FtZUNoYXJhY3RlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlckV4cHJlc3Npb25FcXVhbHNEaWZmZXJlbnRDaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYiIsICJhIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENoYXJhY3RlcldpdGhPcGVyYXRvciBFeHByZXNzaW9uIFRlc3RzCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlcldpdGhPcGVyYXRvckV4cHJlc3Npb25FcXVhbE51bGwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShudWxsLCAiPmEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgICAgICByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKG51bGwsICI8YSIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlcldpdGhPcGVyYXRvckV4cHJlc3Npb25FcXVhbHNFbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKHN0cmluZy5FbXB0eSwgIj5hIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShzdHJpbmcuRW1wdHksICI8YSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyV2l0aE9wZXJhdG9yRXhwcmVzc2lvbkVxdWFsc051bWVyYWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIj5hIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjxhIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyV2l0aE9wZXJhdG9yRXhwcmVzc2lvbkVxdWFsc1NhbWVDaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYSIsICI+YSIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoImEiLCAiPj1hIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgICAgICByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgIjxhIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYSIsICI+PWEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlcldpdGhPcGVyYXRvckV4cHJlc3Npb25FcXVhbHNEaWZmZXJlbnRDaGFyYWN0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYiIsICI+YSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYiIsICI8YSIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9JbmRleFRvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzMmE5NgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yVGVzdHMuY3MKQEAgLTAsMCArMSwxMTIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3I7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldHVwVHJhbnNsYXRvcigxMjM0NSwgRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QW5kQ29sdW1uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBTZXR1cFRyYW5zbGF0b3IoaW50IG1heFJvd3MsIEV4Y2VsUmVmZXJlbmNlVHlwZSByZWZUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguRXhjZWxNYXhSb3dzKS5SZXR1cm4obWF4Um93cyk7CisgICAgICAgICAgICBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yID0gbmV3IEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcihfZXhjZWxEYXRhUHJvdmlkZXIsIHJlZlR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dJZkV4Y2VsRGF0YVByb3ZpZGVySXNOdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcihudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGUxQW5kMVRvQTEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGUyN0FuZDFUb0FBMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcygyNywgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkFBMSIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlNTNBbmQxVG9CQTEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoNTMsIDEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCQTEiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZTcwMkFuZDFUb1paMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcyg3MDIsIDEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJaWjEiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZTcwM1RvQUFBNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcyg3MDMsIDQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBQUE0IiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVUb0VudGlyZUNvbHVtbldoZW5Sb3dJc0VxdWFsVG9NYXhSb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEyMzQ1Nik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMTIzNDU2KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQSIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlVG9BYnNvbHV0ZUFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRyYW5zbGF0b3IoMTIzNDU2LCBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dBbmRDb2x1bW4pOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IuVG9BZGRyZXNzKDEsIDEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIkQSQxIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVUb0Fic29sdXRlUm93QW5kUmVsYXRpdmVDb2woKQorICAgICAgICB7CisgICAgICAgICAgICBTZXR1cFRyYW5zbGF0b3IoMTIzNDU2LCBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dSZWxhdGl2ZUNvbHVtbik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEkMSIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlVG9SZWxhdGl2ZVJvd0FuZEFic29sdXRlQ29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0dXBUcmFuc2xhdG9yKDEyMzQ1NiwgRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QWJzb2x1dENvbHVtbik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiRBMSIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlVG9SZWxhdGl2ZVJvd0FuZENvbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldHVwVHJhbnNsYXRvcigxMjM0NTYsIEV4Y2VsUmVmZXJlbmNlVHlwZS5SZWxhdGl2ZVJvd0FuZENvbHVtbik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTMzNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9OdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvclRlc3RzLmNzCkBAIC0wLDAgKzEsNTUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvclRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIF9ldmFsdWF0b3I7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ldmFsdWF0b3IgPSBuZXcgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZFJldHVyblRydWVJZk9wZXJhbmRzQXJlRXF1YWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiMSIsICIxIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRSZXR1cm5UcnVlSWZPcGVyYW5kc0FyZU1hdGNoaW5nQnV0RGlmZmVyZW50VHlwZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjEiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZEV2YWx1YXRlT3BlcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIjwyIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRFdmFsdWF0ZU51bWVyaWNTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiMSIsICI+MCIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZFRocm93SWZPcGVyYXRvcklzTm90Qm9vbGVhbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiKzEiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzRmFjdG9yeVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NGYWN0b3J5VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2Yjc1ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzRmFjdG9yeVRlc3RzLmNzCkBAIC0wLDAgKzEsMTExIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFJoaW5vLk1vY2tzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsVXRpbGl0aWVzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgUmFuZ2VBZGRyZXNzRmFjdG9yeVRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFJhbmdlQWRkcmVzc0ZhY3RvcnkgX2ZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEV4Y2VsTWF4Um93cyA9IDEwNDg1NzY7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKEV4Y2VsTWF4Um93cyk7CisgICAgICAgICAgICBfZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkVGhyb3dJZlN1cHBsaWVkQWRkcmVzc0lzTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mYWN0b3J5LkNyZWF0ZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRSZXR1cm5BbmRJbnN0YW5jZVdpdGhDb2xQcm9wZXJ0aWVzU2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoIkEyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Gcm9tQ29sLCAiRnJvbUNvbCB3YXMgbm90IDEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBhZGRyZXNzLlRvQ29sLCAiVG9Db2wgd2FzIG5vdCAxIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkUmV0dXJuQW5kSW5zdGFuY2VXaXRoUm93UHJvcGVydGllc1NldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKCJBMiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGFkZHJlc3MuRnJvbVJvdywgIkZyb21Sb3cgd2FzIG5vdCAyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgYWRkcmVzcy5Ub1JvdywgIlRvUm93IHdhcyBub3QgMiIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJldHVybkFuSW5zdGFuY2VXaXRoRnJvbUFuZFRvQ29sU2V0V2hlbkFSYW5nZUFkZHJlc3NJc1N1cHBsaWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoIkExOkIyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Gcm9tQ29sKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBhZGRyZXNzLlRvQ29sKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRSZXR1cm5Bbkluc3RhbmNlV2l0aEZyb21BbmRUb1Jvd1NldFdoZW5BUmFuZ2VBZGRyZXNzSXNTdXBwbGllZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKCJBMTpCMyIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuRnJvbVJvdyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgYWRkcmVzcy5Ub1Jvdyk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkU2V0V29ya3NoZWV0TmFtZUlmU3VwcGxpZWRJbkFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IF9mYWN0b3J5LkNyZWF0ZSgiV3MhQTEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiV3MiLCBhZGRyZXNzLldvcmtzaGVldCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkUmV0dXJuQW5JbnN0YW5jZVdpdGhTdHJpbmdBZGRyZXNzU2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoMSwgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgYWRkcmVzcy5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRSZXR1cm5Bbkluc3RhbmNlV2l0aEZyb21BbmRUb0NvbFNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKDEsIDApOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuRnJvbUNvbCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Ub0NvbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkUmV0dXJuQW5JbnN0YW5jZVdpdGhGcm9tQW5kVG9Sb3dTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IF9mYWN0b3J5LkNyZWF0ZSgwLCAxKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBhZGRyZXNzLkZyb21Sb3cpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuVG9Sb3cpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJldHVybkFuSW5zdGFuY2VXaXRoV29ya3NoZWV0U2V0VG9FbXB0eVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKDAsIDEpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHN0cmluZy5FbXB0eSwgYWRkcmVzcy5Xb3Jrc2hlZXQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJldHVybkVudGlyZUNvbHVtblJhbmdlV2hlbk5vUm93c0FyZVNwZWNpZmllZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKCJBOkIiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBhZGRyZXNzLkZyb21Db2wpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGFkZHJlc3MuVG9Db2wpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuRnJvbVJvdyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxNYXhSb3dzLCBhZGRyZXNzLlRvUm93KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTI3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNDggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3NUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBSYW5nZUFkZHJlc3NGYWN0b3J5IF9mYWN0b3J5OworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBfZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb2xsaWRlU2hvdWxkUmV0dXJuVHJ1ZUlmUmFuZ2VzQ29sbGlkZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzczEgPSBfZmFjdG9yeS5DcmVhdGUoIkExOkE2Iik7CisgICAgICAgICAgICB2YXIgYWRkcmVzczIgPSBfZmFjdG9yeS5DcmVhdGUoIkE1Iik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFkZHJlc3MxLkNvbGxpZGVzV2l0aChhZGRyZXNzMikpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbGxpZGVTaG91bGRSZXR1cm5GYWxzZUlmUmFuZ2VzRG9lc05vdENvbGxpZGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzczEgPSBfZmFjdG9yeS5DcmVhdGUoIkExOkE2Iik7CisgICAgICAgICAgICB2YXIgYWRkcmVzczIgPSBfZmFjdG9yeS5DcmVhdGUoIkE4Iik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhZGRyZXNzMS5Db2xsaWRlc1dpdGgoYWRkcmVzczIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb2xsaWRlU2hvdWxkUmV0dXJuRmFsc2VJZlJhbmdlc0NvbGxpZGVzQnV0V29ya3NoZWV0TmFtZURpZmZlcnMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWRkcmVzczEgPSBfZmFjdG9yeS5DcmVhdGUoIldzIUExOkE2Iik7CisgICAgICAgICAgICB2YXIgYWRkcmVzczIgPSBfZmFjdG9yeS5DcmVhdGUoIkE1Iik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhZGRyZXNzMS5Db2xsaWRlc1dpdGgoYWRkcmVzczIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VzVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VzVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM3MjVkCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZXNUZXN0LmNzCkBAIC0wLDAgKzEsMTMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbFV0aWxpdGllcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFJhbmdlc1Rlc3QKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9WYWx1ZU1hdGNoZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvVmFsdWVNYXRjaGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzM2I5NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvVmFsdWVNYXRjaGVyVGVzdHMuY3MKQEAgLTAsMCArMSwxMDcgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBWYWx1ZU1hdGNoZXJUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZU1hdGNoZXIgX21hdGNoZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9tYXRjaGVyID0gbmV3IFZhbHVlTWF0Y2hlcigpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybjFXaGVuRmlyc3RQYXJhbUlzU29tZXRoaW5nQW5kU2Vjb25kUGFyYW1Jc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgbzEgPSAxOworICAgICAgICAgICAgb2JqZWN0IG8yID0gbnVsbDsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfbWF0Y2hlci5Jc01hdGNoKG8xLCBvMik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5NaW51czFXaGVuRmlyc3RQYXJhbUlzTnVsbEFuZFNlY29uZFBhcmFtSXNTb21ldGhpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgbzEgPSBudWxsOworICAgICAgICAgICAgb2JqZWN0IG8yID0gMTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfbWF0Y2hlci5Jc01hdGNoKG8xLCBvMik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTEsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuMFdoZW5Cb3RoUGFyYW1zQXJlTnVsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvMSA9IG51bGw7CisgICAgICAgICAgICBvYmplY3QgbzIgPSBudWxsOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybjBXaGVuQm90aFBhcmFtc0FyZUVxdWFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG8xID0gMWQ7CisgICAgICAgICAgICBvYmplY3QgbzIgPSAxZDsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfbWF0Y2hlci5Jc01hdGNoKG8xLCBvMik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5NaW51czFXaGVuRmlyc3RQYXJhbUlzTGVzc1RoYW5TZWNvbmRQYXJhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvMSA9IDFkOworICAgICAgICAgICAgb2JqZWN0IG8yID0gNWQ7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybjFXaGVuRmlyc3RQYXJhbUlzR3JlYXRlclRoYW5TZWNvbmRQYXJhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvMSA9IDNkOworICAgICAgICAgICAgb2JqZWN0IG8yID0gMWQ7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuMFdoZW5XaGVuUGFyYW1zQXJlRXF1YWxTdHJpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG8xID0gIlQiOworICAgICAgICAgICAgb2JqZWN0IG8yID0gIlQiOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybjBXaGVuUGFyYW1zQXJlRXF1YWxCdXREaWZmZXJlbnRUeXBlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvMSA9ICIyIjsKKyAgICAgICAgICAgIG9iamVjdCBvMiA9IDJkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQsICJJc01hdGNoIGRpZCBub3QgcmV0dXJuIDAgYXMgZXhwZWN0ZWQgd2hlbiBmaXJzdCBwYXJhbSBpcyBhIHN0cmluZyBhbmQgc2Vjb25kIGEgZG91YmxlIik7CisKKyAgICAgICAgICAgIG8xID0gMmQ7CisgICAgICAgICAgICBvMiA9ICIyIjsKKyAgICAgICAgICAgIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQsICJJc01hdGNoIGRpZCBub3QgcmV0dXJuIDAgYXMgZXhwZWN0ZWQgd2hlbiBmaXJzdCBwYXJhbSBpcyBhIGRvdWJsZSBhbmQgc2Vjb25kIGEgc3RyaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuTcOubnVzMldoZW5UeXBlc0RpZmZlckFuZFN0cmluZ0NvbnZlcnNpb25Ub0RvdWJsZUZhaWxzKCkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG8xID0gMmQ7CisgICAgICAgICAgICBvYmplY3QgbzIgPSAiVCI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0yLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTI2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1dpbGRDYXJkVmFsdWVNYXRjaGVyVGVzdHMuY3MKQEAgLTAsMCArMSwzOSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbFV0aWxpdGllcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFdpbGRDYXJkVmFsdWVNYXRjaGVyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX21hdGNoZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9tYXRjaGVyID0gbmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNNYXRjaFNob3VsZFJldHVybjBXaGVuU2luZ2xlQ2hhcldpbGRDYXJkTWF0Y2hlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHJpbmcxID0gImE/Yz8iOworICAgICAgICAgICAgdmFyIHN0cmluZzIgPSAiYWJjZCI7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChzdHJpbmcxLCBzdHJpbmcyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzTWF0Y2hTaG91bGRSZXR1cm4wV2hlbk11bHRpcGxlQ2hhcldpbGRDYXJkTWF0Y2hlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHJpbmcxID0gImEqYy4iOworICAgICAgICAgICAgdmFyIHN0cmluZzIgPSAiYWJjYy4iOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2goc3RyaW5nMSwgc3RyaW5nMik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Jvb2xlYW5FeHByZXNzaW9uVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Cb29sZWFuRXhwcmVzc2lvblRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NWUzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Cb29sZWFuRXhwcmVzc2lvblRlc3RzLmNzCkBAIC0wLDAgKzEsMjIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgQm9vbGVhbkV4cHJlc3Npb25UZXN0cworICAgIHsKKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBDb21waWxlU2hvdWxkSGFuZGxlUGVyY2VudCgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB2YXIgZXhwMSA9IG5ldyBCb29sZWFuRXhwcmVzc2lvbigiVFJVRSIpOworICAgICAgICAvLyAgICBleHAxLk9wZXJhdG9yID0gT3BlcmF0b3IuUGVyY2VudDsKKyAgICAgICAgLy8gICAgZXhwMS5OZXh0ID0gQ29uc3RhbnRFeHByZXNzaW9ucy5QZXJjZW50OworICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gZXhwMS5Db21waWxlKCk7CisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgwLjAxLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKERhdGFUeXBlLkRlY2ltYWwsIHJlc3VsdC5EYXRhVHlwZSk7CisgICAgICAgIC8vfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVSZXN1bHRGYWN0b3J5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzI0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeVRlc3RzLmNzCkBAIC0wLDAgKzEsMjcgQEAKK++7v3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIENvbXBpbGVSZXN1bHRGYWN0b3J5VGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYWxjdWxhdGVVc2luZ0V1cm9wZWFuRGF0ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdXMgPSBDdWx0dXJlSW5mby5DcmVhdGVTcGVjaWZpY0N1bHR1cmUoImVuLVVTIik7CisgICAgICAgICAgICBUaHJlYWQuQ3VycmVudFRocmVhZC5DdXJyZW50Q3VsdHVyZSA9IHVzOworICAgICAgICAgICAgdmFyIGNyZiA9IG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNyZi5DcmVhdGUoIjEvMTUvMjAxNCIpOworICAgICAgICAgICAgdmFyIG51bWVyaWMgPSByZXN1bHQuUmVzdWx0TnVtZXJpYzsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTY1NCwgbnVtZXJpYyk7CisgICAgICAgICAgICB2YXIgZ2IgPSBDdWx0dXJlSW5mby5DcmVhdGVTcGVjaWZpY0N1bHR1cmUoImVuLUdCIik7CisgICAgICAgICAgICBUaHJlYWQuQ3VycmVudFRocmVhZC5DdXJyZW50Q3VsdHVyZSA9IGdiOworICAgICAgICAgICAgdmFyIGV1cm9SZXN1bHQgPSBjcmYuQ3JlYXRlKCIxNS8xLzIwMTQiKTsKKyAgICAgICAgICAgIHZhciBlTnVtZXJpYyA9IGV1cm9SZXN1bHQuUmVzdWx0TnVtZXJpYzsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTY1NCwgZU51bWVyaWMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdFRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MWJhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0VGVzdHMuY3MKQEAgLTAsMCArMSwzMiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisJW1Rlc3RDbGFzc10KKwlwdWJsaWMgY2xhc3MgQ29tcGlsZVJlc3VsdFRlc3RzCisJeworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgTnVtZXJpY1N0cmluZ0NvbXBpbGVSZXN1bHQoKQorCQl7CisJCQl2YXIgZXhwZWN0ZWQgPSAxMjQuMjQ7CisJCQlzdHJpbmcgbnVtZXJpY1N0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJuIik7CisJCQlDb21waWxlUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KG51bWVyaWNTdHJpbmcsIERhdGFUeXBlLlN0cmluZyk7CisJCQlBc3NlcnQuSXNGYWxzZShyZXN1bHQuSXNOdW1lcmljKTsKKwkJCUFzc2VydC5Jc1RydWUocmVzdWx0LklzTnVtZXJpY1N0cmluZyk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdC5SZXN1bHROdW1lcmljKTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlwdWJsaWMgdm9pZCBEYXRlU3RyaW5nQ29tcGlsZVJlc3VsdCgpCisJCXsKKwkJCXZhciBleHBlY3RlZCA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxNSk7CisJCQlzdHJpbmcgZGF0ZVN0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJkIik7CisJCQlDb21waWxlUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KGRhdGVTdHJpbmcsIERhdGFUeXBlLlN0cmluZyk7CisJCQlBc3NlcnQuSXNGYWxzZShyZXN1bHQuSXNOdW1lcmljKTsKKwkJCUFzc2VydC5Jc1RydWUocmVzdWx0LklzRGF0ZVN0cmluZyk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQuVG9PQURhdGUoKSwgcmVzdWx0LlJlc3VsdE51bWVyaWMpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGVjaW1hbEV4cHJlc3Npb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RlY2ltYWxFeHByZXNzaW9uVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkNjQ2NAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RlY2ltYWxFeHByZXNzaW9uVGVzdHMuY3MKQEAgLTAsMCArMSwyMSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBEZWNpbWFsRXhwcmVzc2lvblRlc3RzCisgICAgeworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIENvbXBpbGVTaG91bGRIYW5kbGVQZXJjZW50KCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBleHAxID0gbmV3IERlY2ltYWxFeHByZXNzaW9uKCIxIik7CisgICAgICAgIC8vICAgIGV4cDEuT3BlcmF0b3IgPSBPcGVyYXRvci5QZXJjZW50OworICAgICAgICAvLyAgICBleHAxLk5leHQgPSBDb25zdGFudEV4cHJlc3Npb25zLlBlcmNlbnQ7CisgICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBleHAxLkNvbXBpbGUoKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDAuMDEsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICAvL30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FbnVtZXJhYmxlRXhwcmVzc2lvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRW51bWVyYWJsZUV4cHJlc3Npb25UZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM5MTYwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRW51bWVyYWJsZUV4cHJlc3Npb25UZXN0cy5jcwpAQCAtMCwwICsxLDI3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBFbnVtZXJhYmxlRXhwcmVzc2lvblRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29tcGlsZVNob3VsZFJldHVybkVudW1lcmFibGVPZkNvbXBpbGVkQ2hpbGRFeHByZXNzaW9ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gbmV3IEVudW1lcmFibGVFeHByZXNzaW9uKCk7CisgICAgICAgICAgICBleHByZXNzaW9uLkFkZENoaWxkKG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpKTsKKyAgICAgICAgICAgIGV4cHJlc3Npb24uQWRkQ2hpbGQobmV3IEludGVnZXJFeHByZXNzaW9uKCIzIikpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4cHJlc3Npb24uQ29tcGlsZSgpOworCisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQuUmVzdWx0LCB0eXBlb2YoSUVudW1lcmFibGU8b2JqZWN0PikpOworICAgICAgICAgICAgdmFyIHJlc3VsdExpc3QgPSAoSUVudW1lcmFibGU8b2JqZWN0PilyZXN1bHQuUmVzdWx0OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHRMaXN0LkVsZW1lbnRBdCgwKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdExpc3QuRWxlbWVudEF0KDEpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsQWRkcmVzc0V4cHJlc3Npb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsQWRkcmVzc0V4cHJlc3Npb25UZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVjNzQwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxBZGRyZXNzRXhwcmVzc2lvblRlc3RzLmNzCkBAIC0wLDAgKzEsODEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OworICAgICAgICBwcml2YXRlIFBhcnNpbmdTY29wZSBfc2NvcGU7CisKKyAgICAgICAgcHJpdmF0ZSBFeGNlbENlbGwgQ3JlYXRlSXRlbShvYmplY3QgdmFsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ2VsbCh2YWwsIG51bGwsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgX3Njb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3Njb3BlLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkVGhyb3dJZkV4Y2VsRGF0YVByb3ZpZGVySXNOdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oIkExIiwgbnVsbCwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkVGhyb3dJZlBhcnNpbmdDb250ZXh0SXNOdWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oIkExIiwgTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vVE9ETzpGaXggVGVzdCAvSmFubmUKKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBTaG91bGRDYWxsUmV0dXJuUmVzdWx0RnJvbVByb3ZpZGVyKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBleHBlY3RlZEFkZHJlc3MgPSAiQTEiOworICAgICAgICAvLyAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgIC8vICAgIHByb3ZpZGVyCisgICAgICAgIC8vICAgICAgICAuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoc3RyaW5nLkVtcHR5LCBleHBlY3RlZEFkZHJlc3MpKQorICAgICAgICAvLyAgICAgICAgLlJldHVybihuZXcgb2JqZWN0W117IDEgfSk7CisKKyAgICAgICAgLy8gICAgdmFyIGV4cHJlc3Npb24gPSBuZXcgRXhjZWxBZGRyZXNzRXhwcmVzc2lvbihleHBlY3RlZEFkZHJlc3MsIHByb3ZpZGVyLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gZXhwcmVzc2lvbi5Db21waWxlKCk7CisgICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgLy99CisKKyAgICAgICAgLy9UT0RPOkZpeCBUZXN0IC9KYW5uZQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIENvbXBpbGVTaG91bGRSZXR1cm5BZGRyZXNzKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBleHBlY3RlZEFkZHJlc3MgPSAiQTEiOworICAgICAgICAvLyAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgIC8vICAgIHByb3ZpZGVyCisgICAgICAgIC8vICAgICAgICAuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoZXhwZWN0ZWRBZGRyZXNzKSkKKyAgICAgICAgLy8gICAgICAgIC5SZXR1cm4obmV3IEV4Y2VsQ2VsbFtdIHsgQ3JlYXRlSXRlbSgxKSB9KTsKKworICAgICAgICAvLyAgICB2YXIgZXhwcmVzc2lvbiA9IG5ldyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKGV4cGVjdGVkQWRkcmVzcywgcHJvdmlkZXIsIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICAgIC8vICAgIGV4cHJlc3Npb24uUGFyZW50SXNMb29rdXBGdW5jdGlvbiA9IHRydWU7CisgICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBleHByZXNzaW9uLkNvbXBpbGUoKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkQWRkcmVzcywgcmVzdWx0LlJlc3VsdCk7CisKKyAgICAgICAgLy99CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbXBpbGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29tcGlsZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQ2MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbXBpbGVyVGVzdHMuY3MKQEAgLTAsMCArMSw3NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIEV4cEdyYXBoID0gT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEV4cHJlc3Npb25Db21waWxlclRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIElFeHByZXNzaW9uQ29tcGlsZXIgX2V4cHJlc3Npb25Db21waWxlcjsKKyAgICAgICAgcHJpdmF0ZSBFeHBHcmFwaCBfZ3JhcGg7CisgICAgICAgIAorICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4cHJlc3Npb25Db21waWxlciA9IG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKTsKKyAgICAgICAgICAgIF9ncmFwaCA9IG5ldyBFeHBHcmFwaCgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENvbXBpbGVUd29JbnRlckV4cHJlc3Npb25zVG9Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cDEgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKTsKKyAgICAgICAgICAgIGV4cDEuT3BlcmF0b3IgPSBPcGVyYXRvci5QbHVzOworICAgICAgICAgICAgX2dyYXBoLkFkZChleHAxKTsKKyAgICAgICAgICAgIHZhciBleHAyID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7CisgICAgICAgICAgICBfZ3JhcGguQWRkKGV4cDIpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V4cHJlc3Npb25Db21waWxlci5Db21waWxlKF9ncmFwaC5FeHByZXNzaW9ucyk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb21waWxlU2hvdWxkTXVsdGlwbHlHcm91cEV4cHJlc3Npb25XaXRoRm9sbG93aW5nSW50ZWdlckV4cHJlc3Npb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZ3JvdXBFeHByZXNzaW9uID0gbmV3IEdyb3VwRXhwcmVzc2lvbihmYWxzZSk7CisgICAgICAgICAgICBncm91cEV4cHJlc3Npb24uQWRkQ2hpbGQobmV3IEludGVnZXJFeHByZXNzaW9uKCIyIikpOworICAgICAgICAgICAgZ3JvdXBFeHByZXNzaW9uLkNoaWxkcmVuLkZpcnN0KCkuT3BlcmF0b3IgPSBPcGVyYXRvci5QbHVzOworICAgICAgICAgICAgZ3JvdXBFeHByZXNzaW9uLkFkZENoaWxkKG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMyIpKTsKKyAgICAgICAgICAgIGdyb3VwRXhwcmVzc2lvbi5PcGVyYXRvciA9IE9wZXJhdG9yLk11bHRpcGx5OworCisgICAgICAgICAgICBfZ3JhcGguQWRkKGdyb3VwRXhwcmVzc2lvbik7CisgICAgICAgICAgICBfZ3JhcGguQWRkKG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9leHByZXNzaW9uQ29tcGlsZXIuQ29tcGlsZShfZ3JhcGguRXhwcmVzc2lvbnMpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTBkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb21waWxlU2hvdWxkQ2FsY3VsYXRlTXVsdGlwbGVFeHByZXNzaW9uc0FjY29yZGluZ1RvUHJlY2VkZW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHAxID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7CisgICAgICAgICAgICBleHAxLk9wZXJhdG9yID0gT3BlcmF0b3IuTXVsdGlwbHk7CisgICAgICAgICAgICBfZ3JhcGguQWRkKGV4cDEpOworICAgICAgICAgICAgdmFyIGV4cDIgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKTsKKyAgICAgICAgICAgIGV4cDIuT3BlcmF0b3IgPSBPcGVyYXRvci5QbHVzOworICAgICAgICAgICAgX2dyYXBoLkFkZChleHAyKTsKKyAgICAgICAgICAgIHZhciBleHAzID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7CisgICAgICAgICAgICBleHAzLk9wZXJhdG9yID0gT3BlcmF0b3IuTXVsdGlwbHk7CisgICAgICAgICAgICBfZ3JhcGguQWRkKGV4cDMpOworICAgICAgICAgICAgdmFyIGV4cDQgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKTsKKyAgICAgICAgICAgIF9ncmFwaC5BZGQoZXhwNCk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXhwcmVzc2lvbkNvbXBpbGVyLkNvbXBpbGUoX2dyYXBoLkV4cHJlc3Npb25zKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDhkLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db252ZXJ0ZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db252ZXJ0ZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTMyODM0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbnZlcnRlclRlc3RzLmNzCkBAIC0wLDAgKzEsODUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkNvbnZlcnRlclRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIElFeHByZXNzaW9uQ29udmVydGVyIF9jb252ZXJ0ZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb252ZXJ0ZXIgPSBuZXcgRXhwcmVzc2lvbkNvbnZlcnRlcigpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nRXhwcmVzc2lvblNob3VsZENvbnZlcnRJbnRlZ2VyRXhwcmVzc2lvblRvU3RyaW5nRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnRlZ2VyRXhwcmVzc2lvbiA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb252ZXJ0ZXIuVG9TdHJpbmdFeHByZXNzaW9uKGludGVnZXJFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKFN0cmluZ0V4cHJlc3Npb24pKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMiIsIHJlc3VsdC5Db21waWxlKCkuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ0V4cHJlc3Npb25TaG91bGRDb3B5T3BlcmF0b3JUb1N0cmluZ0V4cHJlc3Npb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW50ZWdlckV4cHJlc3Npb24gPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKTsKKyAgICAgICAgICAgIGludGVnZXJFeHByZXNzaW9uLk9wZXJhdG9yID0gT3BlcmF0b3IuUGx1czsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29udmVydGVyLlRvU3RyaW5nRXhwcmVzc2lvbihpbnRlZ2VyRXhwcmVzc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaW50ZWdlckV4cHJlc3Npb24uT3BlcmF0b3IsIHJlc3VsdC5PcGVyYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdFeHByZXNzaW9uU2hvdWxkQ29udmVydERlY2ltYWxFeHByZXNzaW9uVG9TdHJpbmdFeHByZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRlY2ltYWxFeHByZXNzaW9uID0gbmV3IERlY2ltYWxFeHByZXNzaW9uKCIyLjUiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29udmVydGVyLlRvU3RyaW5nRXhwcmVzc2lvbihkZWNpbWFsRXhwcmVzc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihTdHJpbmdFeHByZXNzaW9uKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIsNSIsIHJlc3VsdC5Db21waWxlKCkuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGcm9tQ29tcGlsZVJlc3VsdFNob3VsZENyZWF0ZUludGVnZXJFeHByZXNzaW9uSWZDb21waWxlUmVzdWx0SXNJbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbXBpbGVSZXN1bHQgPSBuZXcgQ29tcGlsZVJlc3VsdCgxLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29udmVydGVyLkZyb21Db21waWxlUmVzdWx0KGNvbXBpbGVSZXN1bHQpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoSW50ZWdlckV4cHJlc3Npb24pKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LkNvbXBpbGUoKS5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZyb21Db21waWxlUmVzdWx0U2hvdWxkQ3JlYXRlU3RyaW5nRXhwcmVzc2lvbklmQ29tcGlsZVJlc3VsdElzU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbXBpbGVSZXN1bHQgPSBuZXcgQ29tcGlsZVJlc3VsdCgiYWJjIiwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29udmVydGVyLkZyb21Db21waWxlUmVzdWx0KGNvbXBpbGVSZXN1bHQpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoU3RyaW5nRXhwcmVzc2lvbikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhYmMiLCByZXN1bHQuQ29tcGlsZSgpLlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRnJvbUNvbXBpbGVSZXN1bHRTaG91bGRDcmVhdGVEZWNpbWFsRXhwcmVzc2lvbklmQ29tcGlsZVJlc3VsdElzRGVjaW1hbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb21waWxlUmVzdWx0ID0gbmV3IENvbXBpbGVSZXN1bHQoMi41ZCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbnZlcnRlci5Gcm9tQ29tcGlsZVJlc3VsdChjb21waWxlUmVzdWx0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKERlY2ltYWxFeHByZXNzaW9uKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMi41ZCwgcmVzdWx0LkNvbXBpbGUoKS5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZyb21Db21waWxlUmVzdWx0U2hvdWxkQ3JlYXRlQm9vbGVhbkV4cHJlc3Npb25JZkNvbXBpbGVSZXN1bHRJc0Jvb2xlYW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KCJ0cnVlIiwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbnZlcnRlci5Gcm9tQ29tcGlsZVJlc3VsdChjb21waWxlUmVzdWx0KTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKEJvb2xlYW5FeHByZXNzaW9uKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5Db21waWxlKCkuUmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25GYWN0b3J5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uRmFjdG9yeVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjNhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uRmFjdG9yeVRlc3RzLmNzCkBAIC0wLDAgKzEsNjcgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkZhY3RvcnlUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBJRXhwcmVzc2lvbkZhY3RvcnkgX2ZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9mYWN0b3J5ID0gbmV3IEV4cHJlc3Npb25GYWN0b3J5KHByb3ZpZGVyLCBfcGFyc2luZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybkludGVnZXJFeHByZXNzaW9uV2hlblRva2VuSXNJbnRlZ2VyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VuID0gbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpOworICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZmFjdG9yeS5DcmVhdGUodG9rZW4pOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZXhwcmVzc2lvbiwgdHlwZW9mKEludGVnZXJFeHByZXNzaW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuQm9vbGVhbkV4cHJlc3Npb25XaGVuVG9rZW5Jc0Jvb2xlYW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBuZXcgVG9rZW4oInRydWUiLCBUb2tlblR5cGUuQm9vbGVhbik7CisgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IF9mYWN0b3J5LkNyZWF0ZSh0b2tlbik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShleHByZXNzaW9uLCB0eXBlb2YoQm9vbGVhbkV4cHJlc3Npb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5EZWNpbWFsRXhwcmVzc2lvbldoZW5Ub2tlbklzRGVjaW1hbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbigiMi41IiwgVG9rZW5UeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZmFjdG9yeS5DcmVhdGUodG9rZW4pOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZXhwcmVzc2lvbiwgdHlwZW9mKERlY2ltYWxFeHByZXNzaW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuRXhjZWxSYW5nZUV4cHJlc3Npb25XaGVuVG9rZW5Jc0V4Y2VsQWRkcmVzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbigiQTEiLCBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKTsKKyAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gX2ZhY3RvcnkuQ3JlYXRlKHRva2VuKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGV4cHJlc3Npb24sIHR5cGVvZihFeGNlbEFkZHJlc3NFeHByZXNzaW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuTmFtZWRWYWx1ZUV4cHJlc3Npb25XaGVuVG9rZW5Jc05hbWVkVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBuZXcgVG9rZW4oIk5hbWVkVmFsdWUiLCBUb2tlblR5cGUuTmFtZVZhbHVlKTsKKyAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gX2ZhY3RvcnkuQ3JlYXRlKHRva2VuKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGV4cHJlc3Npb24sIHR5cGVvZihOYW1lZFZhbHVlRXhwcmVzc2lvbikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDBhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uR3JhcGhCdWlsZGVyVGVzdHMuY3MKQEAgLTAsMCArMSwyODYgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5OwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uR3JhcGhCdWlsZGVyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIgX2dyYXBoQnVpbGRlcjsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgX2dyYXBoQnVpbGRlciA9IG5ldyBFeHByZXNzaW9uR3JhcGhCdWlsZGVyKF9leGNlbERhdGFQcm92aWRlciwgcGFyc2luZ0NvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGROb3RVc2VTdHJpbmdJZGVudGlmeWVyc1doZW5CdWlsZGluZ1N0cmluZ0V4cHJlc3Npb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCInIiwgVG9rZW5UeXBlLlN0cmluZyksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJhYmMiLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCInIiwgVG9rZW5UeXBlLlN0cmluZykKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuRXhwcmVzc2lvbnMuQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGROb3RFdmFsdWF0ZUV4cHJlc3Npb25zV2l0aGluQVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiciLCBUb2tlblR5cGUuU3RyaW5nKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjEgKyAyIiwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5TdHJpbmcpCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEgKyAyIiwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ29tcGlsZSgpLlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRTZXRPcGVyYXRvck9uR3JvdXBFeHByZXNzaW9uQ29ycmVjdGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIisiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiNCIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIioiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChPcGVyYXRvci5NdWx0aXBseS5PcGVyYXRvciwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuT3BlcmF0b3IuT3BlcmF0b3IpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRTZXRDaGlsZHJlbk9uR3JvdXBFeHByZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIisiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiNCIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIioiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLCB0eXBlb2YoR3JvdXBFeHByZXNzaW9uKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRTZXROZXh0T25Hcm91cGVkRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjQiLCBUb2tlblR5cGUuSW50ZWdlciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcyksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIqIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlcikKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLk5leHQpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuTmV4dCwgdHlwZW9mKEludGVnZXJFeHByZXNzaW9uKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBCdWlsZFNob3VsZEJ1aWxkRnVuY3Rpb25FeHByZXNzaW9uSWZGaXJzdFRva2VuSXNGdW5jdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIkNTdHIiLCBUb2tlblR5cGUuRnVuY3Rpb24pLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LkV4cHJlc3Npb25zLkNvdW50KCkpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCksIHR5cGVvZihGdW5jdGlvbkV4cHJlc3Npb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBCdWlsZFNob3VsZFNldENoaWxkcmVuT25GdW5jdGlvbkV4cHJlc3Npb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJDU3RyIiwgVG9rZW5UeXBlLkZ1bmN0aW9uKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcykKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uQ291bnQoKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKS5DaGlsZHJlbi5GaXJzdCgpLCB0eXBlb2YoR3JvdXBFeHByZXNzaW9uKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKS5DaGlsZHJlbi5GaXJzdCgpLkNoaWxkcmVuLkZpcnN0KCksIHR5cGVvZihJbnRlZ2VyRXhwcmVzc2lvbikpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKS5DaGlsZHJlbi5GaXJzdCgpLkNvbXBpbGUoKS5SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkQWRkT3BlcmF0b3JUb0Z1bmN0aW9uRXhwcmVzc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIkNTdHIiLCBUb2tlblR5cGUuRnVuY3Rpb24pLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiYiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiQSIsIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKS5DaGlsZHJlbi5Db3VudCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuRXhwcmVzc2lvbnMuQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRBZGRDb21tYVNlcGFyYXRlZEZ1bmN0aW9uQXJndW1lbnRzQXNDaGlsZHJlblRvRnVuY3Rpb25FeHByZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiVGV4dCIsIFRva2VuVHlwZS5GdW5jdGlvbiksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiLCIsIFRva2VuVHlwZS5Db21tYSksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIzIiwgVG9rZW5UeXBlLkludGVnZXIpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKSIsIFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiJiIsIFRva2VuVHlwZS5PcGVyYXRvciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJBIiwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRDcmVhdGVBU2luZ2xlRXhwcmVzc2lvbk91dE9mQU5lZ2F0b3JBbmRBTnVtZXJpY1Rva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5OZWdhdG9yKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LkV4cHJlc3Npb25zLkNvdW50KCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0yZCwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ29tcGlsZSgpLlJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRIYW5kbGVFbnVtZXJhYmxlVG9rZW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiVGV4dCIsIFRva2VuVHlwZS5GdW5jdGlvbiksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJ7IiwgVG9rZW5UeXBlLk9wZW5pbmdFbnVtZXJhYmxlKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIsIiwgVG9rZW5UeXBlLkNvbW1hKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjMiLCBUb2tlblR5cGUuSW50ZWdlciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJ9IiwgVG9rZW5UeXBlLkNsb3NpbmdFbnVtZXJhYmxlKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKKyAgICAgICAgICAgIHZhciBmdW5jQXJnRXhwcmVzc2lvbiA9IHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLkNoaWxkcmVuLkZpcnN0KCk7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jQXJnRXhwcmVzc2lvbiwgdHlwZW9mKEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKSk7CisKKyAgICAgICAgICAgIHZhciBlbnVtZXJhYmxlRXhwcmVzc2lvbiA9IGZ1bmNBcmdFeHByZXNzaW9uLkNoaWxkcmVuLkZpcnN0KCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGVudW1lcmFibGVFeHByZXNzaW9uLCB0eXBlb2YoRW51bWVyYWJsZUV4cHJlc3Npb24pKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBlbnVtZXJhYmxlRXhwcmVzc2lvbi5DaGlsZHJlbi5Db3VudCgpLCAiRW51bWVyYWJsZS5Db3VudCB3YXMgbm90IDIiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVJbm5lckZ1bmN0aW9uQ2FsbDIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY3R4ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZm9ybXVsYSA9ICJJRigzPjI7XCJZZXNcIjtcIk5vXCIpIjsKKyAgICAgICAgICAgIHZhciB0b2tlbml6ZXIgPSBuZXcgU291cmNlQ29kZVRva2VuaXplcihjdHguQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnksIGN0eC5OYW1lVmFsdWVQcm92aWRlcik7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVyLlRva2VuaXplKGZvcm11bGEpOworICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZXhwcmVzc2lvbi5FeHByZXNzaW9ucy5Db3VudCgpKTsKKworICAgICAgICAgICAgdmFyIGNvbXBpbGVyID0gbmV3IEV4cHJlc3Npb25Db21waWxlcihuZXcgRXhwcmVzc2lvbkNvbnZlcnRlcigpLCBuZXcgQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSgpKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb21waWxlci5Db21waWxlKGV4cHJlc3Npb24uRXhwcmVzc2lvbnMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJZZXMiLCByZXN1bHQuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVJbm5lckZ1bmN0aW9uQ2FsbDMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY3R4ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgZm9ybXVsYSA9ICJJRihJMTA+PTA7SUYoTzEwPkkxMDsoKE8xMC1JMTApKiRCMTApLyRDJDI3O0lGKE8xMDwwOyhPMTAqJEIxMCkvJEMkMjc7XCJcIikpO0lGKE8xMDwwOygoTzEwLUkxMCkqJEIxMCkvJEMkMjc7SUYoTzEwPjA7KE8xMCokQjEwKS8kQyQyNzspKSkiOworICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IG5ldyBTb3VyY2VDb2RlVG9rZW5pemVyKGN0eC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgY3R4Lk5hbWVWYWx1ZVByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZXIuVG9rZW5pemUoZm9ybXVsYSk7CisgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBleHByZXNzaW9uLkV4cHJlc3Npb25zLkNvdW50KCkpOworICAgICAgICAgICAgdmFyIGV4cDEgPSBleHByZXNzaW9uLkV4cHJlc3Npb25zLkZpcnN0KCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgZXhwMS5DaGlsZHJlbi5Db3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlRHVwbGljYXRlT3BlcmF0b3JzMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjdHggPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBmb3JtdWxhID0gIisrMS0tMisrLTMrLTEtLS0tMy0rMiI7CisgICAgICAgICAgICB2YXIgdG9rZW5pemVyID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoY3R4LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBjdHguTmFtZVZhbHVlUHJvdmlkZXIpOworICAgICAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplci5Ub2tlbml6ZShmb3JtdWxhKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExLCB0b2tlbnMuQ291bnQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIisiLCB0b2tlbnNbMV0uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCItIiwgdG9rZW5zWzNdLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiLSIsIHRva2Vuc1s1XS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIisiLCB0b2tlbnNbN10uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCItIiwgdG9rZW5zWzldLlZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlRHVwbGljYXRlT3BlcmF0b3JzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjdHggPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBmb3JtdWxhID0gIisrLTEtLSgtLS0yKSsrLTMrLTEtLS0tMy0rMiI7CisgICAgICAgICAgICB2YXIgdG9rZW5pemVyID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoY3R4LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBjdHguTmFtZVZhbHVlUHJvdmlkZXIpOworICAgICAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplci5Ub2tlbml6ZShmb3JtdWxhKS5Ub0xpc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0Z1bmN0aW9uQ29tcGlsZXJGYWN0b3J5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2RlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeVRlc3RzLmNzCkBAIC0wLDAgKzEsMTI1IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Db21waWxlckZhY3RvcnlUZXN0cworICAgIHsKKyAgICAgICAgI3JlZ2lvbiBDcmVhdGUgVGVzdHMKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZUhhbmRsZXNTdGFuZGFyZEZ1bmN0aW9uQ29tcGlsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgU3VtKCk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlciA9IGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jdGlvbkNvbXBpbGVyLCB0eXBlb2YoRGVmYXVsdENvbXBpbGVyKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc1NwZWNpYWxJZkNvbXBpbGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uUmVwb3NpdG9yeSA9IEZ1bmN0aW9uUmVwb3NpdG9yeS5DcmVhdGUoKTsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkNvbXBpbGVyRmFjdG9yeSA9IG5ldyBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeShmdW5jdGlvblJlcG9zaXRvcnkpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uID0gbmV3IElmKCk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlciA9IGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jdGlvbkNvbXBpbGVyLCB0eXBlb2YoSWZGdW5jdGlvbkNvbXBpbGVyKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc1NwZWNpYWxJZkVycm9yQ29tcGlsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgSWZFcnJvcigpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXIgPSBmdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5DcmVhdGUoZnVuY3Rpb24pOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZnVuY3Rpb25Db21waWxlciwgdHlwZW9mKElmRXJyb3JGdW5jdGlvbkNvbXBpbGVyKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc1NwZWNpYWxJZk5hQ29tcGlsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgSWZOYSgpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXIgPSBmdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5DcmVhdGUoZnVuY3Rpb24pOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZnVuY3Rpb25Db21waWxlciwgdHlwZW9mKElmTmFGdW5jdGlvbkNvbXBpbGVyKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc0xvb2t1cEZ1bmN0aW9uQ29tcGlsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgQ29sdW1uKCk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlciA9IGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jdGlvbkNvbXBpbGVyLCB0eXBlb2YoTG9va3VwRnVuY3Rpb25Db21waWxlcikpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZUhhbmRsZXNFcnJvckZ1bmN0aW9uQ29tcGlsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgSXNFcnJvcigpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXIgPSBmdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5DcmVhdGUoZnVuY3Rpb24pOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZnVuY3Rpb25Db21waWxlciwgdHlwZW9mKEVycm9ySGFuZGxpbmdGdW5jdGlvbkNvbXBpbGVyKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc0N1c3RvbUZ1bmN0aW9uQ29tcGlsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICAgICAgICAgICAgZnVuY3Rpb25SZXBvc2l0b3J5LkxvYWRNb2R1bGUobmV3IFRlc3RGdW5jdGlvbk1vZHVsZSgpKTsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkNvbXBpbGVyRmFjdG9yeSA9IG5ldyBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeShmdW5jdGlvblJlcG9zaXRvcnkpOworICAgICAgICAgICAgdmFyIGZ1bmN0aW9uID0gbmV3IE15RnVuY3Rpb24oKTsKKyAgICAgICAgICAgIHZhciBmdW5jdGlvbkNvbXBpbGVyID0gZnVuY3Rpb25Db21waWxlckZhY3RvcnkuQ3JlYXRlKGZ1bmN0aW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGZ1bmN0aW9uQ29tcGlsZXIsIHR5cGVvZihNeUZ1bmN0aW9uQ29tcGlsZXIpKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBOZXN0ZWQgQ2xhc3NlcworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEZ1bmN0aW9uTW9kdWxlIDogRnVuY3Rpb25zTW9kdWxlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0RnVuY3Rpb25Nb2R1bGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBteUZ1bmN0aW9uID0gbmV3IE15RnVuY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB2YXIgY3VzdG9tQ29tcGlsZXIgPSBuZXcgTXlGdW5jdGlvbkNvbXBpbGVyKG15RnVuY3Rpb24pOworICAgICAgICAgICAgICAgIGJhc2UuRnVuY3Rpb25zLkFkZChNeUZ1bmN0aW9uLk5hbWUsIG15RnVuY3Rpb24pOworICAgICAgICAgICAgICAgIGJhc2UuQ3VzdG9tQ29tcGlsZXJzLkFkZCh0eXBlb2YoTXlGdW5jdGlvbiksIGN1c3RvbUNvbXBpbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeUZ1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5hbWUgPSAiTXlGdW5jdGlvbiI7CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBNeUZ1bmN0aW9uQ29tcGlsZXIgOiBGdW5jdGlvbkNvbXBpbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBNeUZ1bmN0aW9uQ29tcGlsZXIoTXlGdW5jdGlvbiBmdW5jdGlvbikgOiBiYXNlKGZ1bmN0aW9uKSB7IH0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0ludGVnZXJFeHByZXNzaW9uVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JbnRlZ2VyRXhwcmVzc2lvblRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2YzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JbnRlZ2VyRXhwcmVzc2lvblRlc3RzLmNzCkBAIC0wLDAgKzEsNTEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgSW50ZWdlckV4cHJlc3Npb25UZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlV2l0aE5leHRXaXRoUGx1c09wZXJhdG9yU2hvdWxkQ2FsdWxhdGVTdW1Db3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwMSA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMSIpOworICAgICAgICAgICAgZXhwMS5PcGVyYXRvciA9IE9wZXJhdG9yLlBsdXM7CisgICAgICAgICAgICB2YXIgZXhwMiA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOworICAgICAgICAgICAgZXhwMS5OZXh0ID0gZXhwMjsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4cDEuTWVyZ2VXaXRoTmV4dCgpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5Db21waWxlKCkuUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZVdpdGhOZXh0V2l0aFBsdXNPcGVyYXRvclNob3VsZFNldE5leHRQb2ludGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cDEgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjEiKTsKKyAgICAgICAgICAgIGV4cDEuT3BlcmF0b3IgPSBPcGVyYXRvci5QbHVzOworICAgICAgICAgICAgdmFyIGV4cDIgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKTsKKyAgICAgICAgICAgIGV4cDEuTmV4dCA9IGV4cDI7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBleHAxLk1lcmdlV2l0aE5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyZXN1bHQuTmV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIENvbXBpbGVTaG91bGRIYW5kbGVQZXJjZW50KCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBleHAxID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIxIik7CisgICAgICAgIC8vICAgIGV4cDEuT3BlcmF0b3IgPSBPcGVyYXRvci5QZXJjZW50OworICAgICAgICAvLyAgICBleHAxLk5leHQgPSBDb25zdGFudEV4cHJlc3Npb25zLlBlcmNlbnQ7CisgICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBleHAxLkNvbXBpbGUoKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDAuMDEsIHJlc3VsdC5SZXN1bHQpOworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoRGF0YVR5cGUuRGVjaW1hbCwgcmVzdWx0LkRhdGFUeXBlKTsKKyAgICAgICAgLy99CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyTWFuYWdlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyTWFuYWdlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDE5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJNYW5hZ2VyVGVzdHMuY3MKQEAgLTAsMCArMSw2MCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRm9ybXVsYVBhcnNlck1hbmFnZXJUZXN0cworICAgIHsKKyAgICAgICAgI3JlZ2lvbiB0ZXN0IGNsYXNzZXMKKworICAgICAgICBwcml2YXRlIGNsYXNzIE15RnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBNeU1vZHVsZSA6IElGdW5jdGlvbk1vZHVsZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTXlNb2R1bGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4oKTsKKyAgICAgICAgICAgICAgICBGdW5jdGlvbnMuQWRkKCJNeUZ1bmN0aW9uIiwgbmV3IE15RnVuY3Rpb24oKSk7CisKKyAgICAgICAgICAgICAgICBDdXN0b21Db21waWxlcnMgPSBuZXcgRGljdGlvbmFyeTxUeXBlLCBGdW5jdGlvbkNvbXBpbGVyPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIElEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4gRnVuY3Rpb25zIHsgZ2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8VHlwZSwgRnVuY3Rpb25Db21waWxlcj4gQ3VzdG9tQ29tcGlsZXJzIHsgZ2V0OyB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGdW5jdGlvbnNTaG91bGRCZUNvcGllZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZTEgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFja2FnZTEuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuTG9hZEZ1bmN0aW9uTW9kdWxlKG5ldyBNeU1vZHVsZSgpKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UyID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdOdW1iZXJPZkZ1bmNzID0gcGFja2FnZTIuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuR2V0SW1wbGVtZW50ZWRGdW5jdGlvbk5hbWVzKCkuQ291bnQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGZ1bmN0aW9ucyBpbmNsdWRpbmcgdGhlIGN1c3RvbSBmdW5jdGlvbnMgZnJvbSBwYWNrYWdlIDEKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZTIuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuQ29weUZ1bmN0aW9uc0Zyb20ocGFja2FnZTEuV29ya2Jvb2spOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydGlvbnM6IG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIGluY3JlYXNlZCB3aXRoIDEsIGFuZCB0aGUgbGlzdCBvZiBmdW5jdGlvbiBuYW1lcyBjb250YWlucyB0aGUgY3VzdG9tIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwob3JpZ051bWJlck9mRnVuY3MgKyAxLCBwYWNrYWdlMi5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5HZXRJbXBsZW1lbnRlZEZ1bmN0aW9uTmFtZXMoKS5Db3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwYWNrYWdlMi5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5HZXRJbXBsZW1lbnRlZEZ1bmN0aW9uTmFtZXMoKS5Db250YWlucygibXlmdW5jdGlvbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzY2RiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJUZXN0cy5jcwpAQCAtMCwwICsxLDExMCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBFeEdyYXBoID0gT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBGb3JtdWxhUGFyc2VyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgRm9ybXVsYVBhcnNlciBfcGFyc2VyOworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBfcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIocHJvdmlkZXIpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZXJTaG91bGRDYWxsTGV4ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGV4ZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8SUxleGVyPigpOworICAgICAgICAgICAgbGV4ZXIuU3R1Yih4ID0+IHguVG9rZW5pemUoIkFCQyIpKS5SZXR1cm4oRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSk7CisgICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZSh4ID0+IHguU2V0TGV4ZXIobGV4ZXIpKTsKKworICAgICAgICAgICAgX3BhcnNlci5QYXJzZSgiQUJDIik7CisKKyAgICAgICAgICAgIGxleGVyLkFzc2VydFdhc0NhbGxlZCh4ID0+IHguVG9rZW5pemUoIkFCQyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZXJTaG91bGRDYWxsR3JhcGhCdWlsZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxleGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElMZXhlcj4oKTsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4oKTsKKyAgICAgICAgICAgIGxleGVyLlN0dWIoeCA9PiB4LlRva2VuaXplKCJBQkMiKSkuUmV0dXJuKHRva2Vucyk7CisgICAgICAgICAgICB2YXIgZ3JhcGhCdWlsZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElFeHByZXNzaW9uR3JhcGhCdWlsZGVyPigpOworICAgICAgICAgICAgZ3JhcGhCdWlsZGVyLlN0dWIoeCA9PiB4LkJ1aWxkKHRva2VucykpLlJldHVybihuZXcgRXhHcmFwaCgpKTsKKworICAgICAgICAgICAgX3BhcnNlci5Db25maWd1cmUoY29uZmlnID0+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRMZXhlcihsZXhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRHcmFwaEJ1aWxkZXIoZ3JhcGhCdWlsZGVyKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgX3BhcnNlci5QYXJzZSgiQUJDIik7CisKKyAgICAgICAgICAgIGdyYXBoQnVpbGRlci5Bc3NlcnRXYXNDYWxsZWQoeCA9PiB4LkJ1aWxkKHRva2VucykpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlclNob3VsZENhbGxDb21waWxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsZXhlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJTGV4ZXI+KCk7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+KCk7CisgICAgICAgICAgICBsZXhlci5TdHViKHggPT4geC5Ub2tlbml6ZSgiQUJDIikpLlJldHVybih0b2tlbnMpOworICAgICAgICAgICAgdmFyIGV4cGVjdGVkR3JhcGggPSBuZXcgRXhHcmFwaCgpOworICAgICAgICAgICAgZXhwZWN0ZWRHcmFwaC5BZGQobmV3IFN0cmluZ0V4cHJlc3Npb24oImFzZGYiKSk7CisgICAgICAgICAgICB2YXIgZ3JhcGhCdWlsZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElFeHByZXNzaW9uR3JhcGhCdWlsZGVyPigpOworICAgICAgICAgICAgZ3JhcGhCdWlsZGVyLlN0dWIoeCA9PiB4LkJ1aWxkKHRva2VucykpLlJldHVybihleHBlY3RlZEdyYXBoKTsKKyAgICAgICAgICAgIHZhciBjb21waWxlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJRXhwcmVzc2lvbkNvbXBpbGVyPigpOworICAgICAgICAgICAgY29tcGlsZXIuU3R1Yih4ID0+IHguQ29tcGlsZShleHBlY3RlZEdyYXBoLkV4cHJlc3Npb25zKSkuUmV0dXJuKG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpKTsKKworICAgICAgICAgICAgX3BhcnNlci5Db25maWd1cmUoY29uZmlnID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnCisgICAgICAgICAgICAgICAgICAgIC5TZXRMZXhlcihsZXhlcikKKyAgICAgICAgICAgICAgICAgICAgLlNldEdyYXBoQnVpbGRlcihncmFwaEJ1aWxkZXIpCisgICAgICAgICAgICAgICAgICAgIC5TZXRFeHByZXNpb25Db21waWxlcihjb21waWxlcik7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgX3BhcnNlci5QYXJzZSgiQUJDIik7CisKKyAgICAgICAgICAgIGNvbXBpbGVyLkFzc2VydFdhc0NhbGxlZCh4ID0+IHguQ29tcGlsZShleHBlY3RlZEdyYXBoLkV4cHJlc3Npb25zKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VBdFNob3VsZENhbGxFeGNlbERhdGFQcm92aWRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIGV4Y2VsRGF0YVByb3ZpZGVyCisgICAgICAgICAgICAgICAgLlN0dWIoeCA9PiB4LkdldFJhbmdlRm9ybXVsYShzdHJpbmcuRW1wdHksIDEsIDEpKQorICAgICAgICAgICAgICAgIC5SZXR1cm4oIlN1bSgxLDIpIik7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIoZXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZUF0KCJBMSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUF0U2hvdWxkVGhyb3dJZkFkZHJlc3NJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFyc2VyLlBhcnNlQXQobnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQmFzaWNDYWxjVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQmFzaWNDYWxjVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4N2Y1ZQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CYXNpY0NhbGNUZXN0cy5jcwpAQCAtMCwwICsxLDE3NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgUmhpbm8uTW9ja3M7CisKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEJhc2ljQ2FsY1Rlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCisgICAgeworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKGV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRBZGRJbnRlZ2Vyc0NvcnJlY3RseSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIxICsgMiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFN1YnRyYWN0SW50ZWdlcnNDb3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMiAtIDEiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRNdWx0aXBseUludGVnZXJzQ29ycmVjdGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjIgKiAzIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGl2aWRlSW50ZWdlcnNDb3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiOCAvIDQiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREaXZpZGVEZWNpbWFsV2l0aEludGVnZXJDb3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMi41LzIiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjI1ZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVFeHBDb3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMiBeIDQiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlRXhwV2l0aERlY2ltYWxDb3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMi41IF4gMiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYuMjVkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZE11bHRpcGx5RGVjaW1hbFdpdGhEZWNpbWFsQ29ycmVjdGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjIuNSAqIDEuNSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuNzVkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlR3JlYXRlclRoYW5Ud29TaG91bGRCZVRydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMyA+IDIiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZUxlc3NUaGFuVHdvU2hvdWxkQmVGYWxzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIzIDwgMiIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZUxlc3NUaGFuT3JFcXVhbFRvVGhyZWVTaG91bGRCZVRydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMyA8PSAzIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGhyZWVMZXNzVGhhbk9yRXF1YWxUb1R3b0RvdFRocmVlU2hvdWxkQmVGYWxzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIzIDw9IDIuMyIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZUdyZWF0ZXJUaGFuT3JFcXVhbFRvVGhyZWVTaG91bGRCZVRydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMyA+PSAzIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVHdvRG90VHdvR3JlYXRlclRoYW5PckVxdWFsVG9UaHJlZVNob3VsZEJlRmFsc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMi4yID49IDMiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVHdlbHZlQW5kVHdlbHZlU2hvdWxkQmVFcXVhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIyPTIiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZW5QZXJjZW50U2hvdWxkQmUwUG9pbnQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjEwJSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVNdWx0aXBsZVBlcmNlbnRTaWducygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIxMCUlIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC4wMDEsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlUGVyY2VudGFnZU9uRnVuY3Rpb25SZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU1VNKDE7MjszKSUiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjA2LCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZVBlcmNlbnRhZ2VPblBhcmFudGV0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIigxKzIpJSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMDMsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSWdub3JlTGVhZGluZ1BsdXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiKygxLTIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTFkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZURlY2ltYWxOdW1iZXJXaGVuRGl2aWRpbmdJbnRlZ2VycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIyMjQ1Njc0NTUvNDAwMDAwMDAwKjUwMDAwMCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDI4MDcwOS4zMTg3NSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGROZWdhdGVFeHByZXNzaW9uSW5QYXJlbnRoZXNpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCItKDErMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtM2QsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRhYmFzZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRGF0YWJhc2VUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDZhNzcxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRGF0YWJhc2VUZXN0cy5jcwpAQCAtMCwwICsxLDI5NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBEYXRhYmFzZVRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGdldFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImNyaXQyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzEiXS5WYWx1ZSA9ICJjcml0MyI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAidGVzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMiJdLlZhbHVlID0gIm91dHB1dCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAidGVzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAzOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMyJdLlZhbHVlID0gImFhYSI7CisgICAgICAgICAgICAgICAgLy8gY3JpdGVyaWEKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDEiXS5WYWx1ZSA9ICJjcml0MSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAidCp0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRTEiXS5WYWx1ZSA9ICJjcml0MiI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkUyIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkYxIl0uRm9ybXVsYSA9ICJER0VUKEExOkMzLFwiQ3JpdDNcIixEMTpFMikiOworCisgICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIm91dHB1dCIsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEY291bnRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUgPSAiY3JpdDMiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzIiXS5WYWx1ZSA9ICJvdXRwdXQiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3N0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9ICIyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzMiXS5WYWx1ZSA9ICJhYWEiOworICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiY3JpdDIiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiRENPVU5UKEExOkMzLFwiQ3JpdDJcIixEMTpFMikiOworCisgICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgc2hlZXQuQ2VsbHNbIkYxIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERjb3VudGFTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUgPSAiY3JpdDMiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzIiXS5WYWx1ZSA9ICJvdXRwdXQiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3N0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9ICIyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzMiXS5WYWx1ZSA9ICJhYWEiOworICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiY3JpdDIiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiRENPVU5UQShBMTpDMyxcIkNyaXQyXCIsRDE6RTIpIjsKKworICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBETWF4U2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAidGVzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAidGVzc3QiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOworCisgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRNQVgoQTE6QjMsXCJDcml0MlwiLEQxOkUyKSI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgc2hlZXQuQ2VsbHNbIkYxIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERNaW5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7CisKKyAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiRE1JTihBMTpCMyxcIkNyaXQyXCIsRDE6RTIpIjsKKworICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRFN1bVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImNyaXQyIjsKKworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKKworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3N0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgLy8gY3JpdGVyaWEKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDEiXS5WYWx1ZSA9ICJjcml0MSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAidCp0IjsKKworICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkYxIl0uRm9ybXVsYSA9ICJEU1VNKEExOkIzLFwiQ3JpdDJcIixEMTpFMikiOworCisgICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEQXZlcmFnZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImNyaXQyIjsKKworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKKworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3N0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgLy8gY3JpdGVyaWEKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDEiXS5WYWx1ZSA9ICJjcml0MSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAidCp0IjsKKworICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkYxIl0uRm9ybXVsYSA9ICJEQVZFUkFHRShBMTpCMyxcIkNyaXQyXCIsRDE6RTIpIjsKKworICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuNWQsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEVmFyU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAidGVzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAidGVzc3QiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOworCisgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRWQVIoQTE6QjMsXCJDcml0MlwiLEQxOkUyKSI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjVkLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRFZhcnBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7CisKKyAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiRFZBUlAoQTE6QjMsXCJDcml0MlwiLEQxOkUyKSI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjI1ZCwgc2hlZXQuQ2VsbHNbIkYxIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERWYXJwU2hvdWxkUmV0dXJuQnlGaWVsZEluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7CisKKyAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiRFZBUlAoQTE6QjMsMixEMTpFMikiOworCisgICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC4yNWQsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0RhdGVBbmRUaW1lRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRlQW5kVGltZUZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTY0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRlQW5kVGltZUZ1bmN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsMjE4IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIFN5c3RlbS5JTzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgRGF0ZUFuZFRpbWVGdW5jdGlvbnNUZXN0cyA6IEZvcm11bGFQYXJzZXJUZXN0QmFzZQorICAgIHsKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9wYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihleGNlbERhdGFQcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF0ZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiRGF0ZSgyMDEyLCAyLCAyKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBEYXRlVGltZSgyMDEyLCAyLCAyKS5Ub09BRGF0ZSgpLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERhdGVTaG91bGRIYW5kbGVDZWxsUmVmZXJlbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAyMDEyZDsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIkRhdGUoQTEsIDIsIDIpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBEYXRlVGltZSgyMDEyLCAyLCAyKS5Ub09BRGF0ZSgpLCByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVG9kYXlTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlRvZGF5KCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKERhdGVUaW1lLkZyb21PQURhdGUoKGRvdWJsZSlyZXN1bHQpLCB0eXBlb2YoRGF0ZVRpbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBOb3dTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIm5vdygpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShEYXRlVGltZS5Gcm9tT0FEYXRlKChkb3VibGUpcmVzdWx0KSwgdHlwZW9mKERhdGVUaW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF5U2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJEYXkoRGF0ZSgyMDEyLCA0LCAyKSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1vbnRoU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNb250aChEYXRlKDIwMTIsIDQsIDIpKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgWWVhclNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiWWVhcihEYXRlKDIwMTIsIDIsIDIpKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMTIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGltZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRSZXN1bHQgPSAoKGRvdWJsZSkoMTIgKiA2MCAqIDYwICsgMTMgKiA2MCArIDE0KSkvKChkb3VibGUpKDI0ICogNjAgKiA2MCkpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlRpbWUoMTIsIDEzLCAxNCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIb3VyU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJIT1VSKFRpbWUoMTIsIDEzLCAxNCkpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWludXRlU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJtaW51dGUoVGltZSgxMiwgMTMsIDE0KSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMywgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTZWNvbmRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlNlY29uZChUaW1lKDEyLCAxMywgNTkpKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDU5LCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNlY29uZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuUGFyc2luZ1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJTZWNvbmQoXCIxMDoxMjoxNFwiKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE0LCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1pbnV0ZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuUGFyc2luZ1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNaW51dGUoXCIxMDoxMjoxNCBBTVwiKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhvdXJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2hlblBhcnNpbmdTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSG91cihcIjEwOjEyOjE0XCIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGF5MzYwU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJEYXlzMzYwKERhdGUoMjAxMiwgNCwgMiksIERhdGUoMjAxMiwgNSwgMikpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgWWVhcmZyYWNTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlllYXJmcmFjKERhdGUoMjAxMiwgNCwgMiksIERhdGUoMjAxMiwgNSwgMikpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc29XZWVrTnVtU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJJc29XZWVrTnVtKERhdGUoMjAxMiwgNCwgMikpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihpbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBFb21vbnRoU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJFb21vbnRoKERhdGUoMjAxMywgMiwgMiksIDMpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBXb3JrZGF5U2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJXb3JrZGF5KERhdGUoMjAxMywgMiwgMiksIDMpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEYXRlTm90RXF1YWxUb1N0cmluZ1Nob3VsZEJlVHJ1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJUT0RBWSgpIDw+IFwiXCIiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYWxjdWxhdGlvbjUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjMSIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiSm9obiI7CisgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5WYWx1ZSA9ICJEb2UiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkMxIl0uRm9ybXVsYSA9ICJCMSZcIiwgXCImQTEiOworICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkRvZSwgSm9obiIsIHdzLkNlbGxzWyJDMSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIb3VyV2l0aEV4Y2VsUmVmZXJlbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTQsIDEsIDEsIDEwLCAxMSwgMTIpLlRvT0FEYXRlKCk7CisgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIkhPVVIoQTEpIjsKKyAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwLCB3cy5DZWxsc1siQjEiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWludXRlV2l0aEV4Y2VsUmVmZXJlbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTQsIDEsIDEsIDEwLCAxMSwgMTIpLlRvT0FEYXRlKCk7CisgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIk1JTlVURShBMSkiOworICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTEsIHdzLkNlbGxzWyJCMSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTZWNvbmRXaXRoRXhjZWxSZWZlcmVuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjMSIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxNCwgMSwgMSwgMTAsIDExLCAxMikuVG9PQURhdGUoKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLkZvcm11bGEgPSAiU0VDT05EKEExKSI7CisgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMiwgd3MuQ2VsbHNbIkIxIl0uVmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRXhjZWxSYW5nZXMvTWF0aEV4Y2VsUmFuZ2VUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0V4Y2VsUmFuZ2VzL01hdGhFeGNlbFJhbmdlVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmMmM5YwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0V4Y2VsUmFuZ2VzL01hdGhFeGNlbFJhbmdlVGVzdHMuY3MKQEAgLTAsMCArMSwyMzIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zLkV4Y2VsUmFuZ2VzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgTWF0aEV4Y2VsUmFuZ2VUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworCisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAzOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDY7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQWJzU2hvdWxkUmV0dXJuMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJBQlMoQTIpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZFJldHVybjMoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlQoQTE6QTMpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZFJldHVybjJJZkFDZWxsVmFsdWVJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVChBMTpBMykiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50QVNob3VsZFJldHVybjMoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRBKEExOkEzKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZlNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRJRihBMTpBMywgXCI+MlwiKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWF4U2hvdWxkUmV0dXJuNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJNYXgoQTE6QTMpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2ZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNaW5TaG91bGRSZXR1cm4xKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIk1pbihBMTpBMykiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VTaG91bGRSZXR1cm4zUG9pbnQzMzMzMzMoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQXZlcmFnZShBMTpBMykiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkICsgKDFkLzNkKSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZTaG91bGRIYW5kbGVTaW5nbGVSYW5nZU51bWVyaWNFeHByZXNzaW9uTWF0Y2goKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gIkIiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDM7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQXZlcmFnZUlmKEExOkE1LFwiPjFcIikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmU2hvdWxkSGFuZGxlU2luZ2xlUmFuZ2VTdHJpbmdNYXRjaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiQUJDIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAiMyI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQXZlcmFnZUlmKEExOkE1LFwiPjFcIikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LjVkLCBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZTaG91bGRIYW5kbGVMb29rdXBSYW5nZVN0cmluZ01hdGNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJhYmMiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJhYmMiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJkZWYiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9ICJkZWYiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9ICJhYmQiOworCisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDU7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCNCJdLlZhbHVlID0gNjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkI1Il0uVmFsdWUgPSA3OworCisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQXZlcmFnZUlmKEExOkE1LFwiYWJjXCIsQjE6QjUpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZlNob3VsZEhhbmRsZUxvb2t1cFJhbmdlU3RyaW5nTnVtZXJpY01hdGNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDU7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMjsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDM7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCNSJdLlZhbHVlID0gODsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5Gb3JtdWxhID0gIkF2ZXJhZ2VJZihBMTpBNSxcIj4yXCIsQjE6QjUpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZlNob3VsZEhhbmRsZUxvb2t1cFJhbmdlU3RyaW5nV2lsZENhcmRNYXRjaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiYWJjIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiYWJjIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiZGVmIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAiYWJkIjsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDY7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCNSJdLlZhbHVlID0gODsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5Gb3JtdWxhID0gIkF2ZXJhZ2VJZihBMTpBNSwgXCJhYipcIixCMTpCNSkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VtUHJvZHVjdFdpdGhSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSA1OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDY7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJTVU1QUk9EVUNUKEExOkEzLEIxOkIzKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjlkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bVByb2R1Y3RXaXRoUmFuZ2VBbmRWYWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDM7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gNTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSA2OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU1VNUFJPRFVDVChBMTpBMyxCMTpCMyx7Miw0LDF9KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzBkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNpZ25TaG91bGRSZXR1cm4xV2hlblJlZklzUG9zaXRpdmUoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU0lHTihBMSkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1YlRvdGFsU2hvdWxkTm90SW5jbHVkZUhpZGRlblJvdygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuUm93KDIpLkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU1VCVE9UQUwoMTA5LEExOkEzKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoN2QsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9FeGNlbFJhbmdlcy9UZXh0RXhjZWxSYW5nZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRXhjZWxSYW5nZXMvVGV4dEV4Y2VsUmFuZ2VUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJlNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRXhjZWxSYW5nZXMvVGV4dEV4Y2VsUmFuZ2VUZXN0cy5jcwpAQCAtMCwwICsxLDU0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuQnVpbHRJbkZ1bmN0aW9ucy5FeGNlbFJhbmdlcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRleHRFeGNlbFJhbmdlVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSA2OworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEV4YWN0U2hvdWxkUmV0dXJuVHJ1ZVdoZW5FcXVhbFZhbHVlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJFWEFDVChBMSxBMikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpbmRTaG91bGRSZXR1cm5JbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiaG9wcCI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gImhlaiBob3BwIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJGaW5kKEExLEEyKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0V4Y2VsUmFuZ2VzL1dvcmtzaGVldFJlZnNUZXN0LmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRXhjZWxSYW5nZXMvV29ya3NoZWV0UmVmc1Rlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3YTA0OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0V4Y2VsUmFuZ2VzL1dvcmtzaGVldFJlZnNUZXN0LmNzCkBAIC0wLDAgKzEsNjEgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zLkV4Y2VsUmFuZ2VzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgV29ya3NoZWV0UmVmc1Rlc3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF9maXJzdFNoZWV0OworICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF9zZWNvbmRTaGVldDsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIF9maXJzdFNoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0MSIpOworICAgICAgICAgICAgX3NlY29uZFNoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0MiIpOworICAgICAgICAgICAgX2ZpcnN0U2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX2ZpcnN0U2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlUmVmZXJlbmNlVG9PdGhlclNoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NlY29uZFNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VNKCdzaGVldDEnIUExOkEyKSI7CisgICAgICAgICAgICBfc2Vjb25kU2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIF9zZWNvbmRTaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlUmVmZXJlbmNlVG9PdGhlclNoZWV0V2l0aENvbXBsZXhOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImFiI2suLjIiKTsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgIF9zZWNvbmRTaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlNVTSgnYWIjay4uMidBMTpBMikiOworICAgICAgICAgICAgX3NlY29uZFNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCBfc2Vjb25kU2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZUludmFsaWRSZWYoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiYWIjay4uMiIpOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgX3NlY29uZFNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VNKCdhYiNrLi4yQTE6QTInKSI7CisgICAgICAgICAgICBfc2Vjb25kU2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShfc2Vjb25kU2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUsIHR5cGVvZihFeGNlbEVycm9yVmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0luZm9ybWF0aW9uRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9JbmZvcm1hdGlvbkZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTI4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9JbmZvcm1hdGlvbkZ1bmN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsMTMwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuQnVpbHRJbkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEluZm9ybWF0aW9uRnVuY3Rpb25zVGVzdHMgOiBGb3JtdWxhUGFyc2VyVGVzdEJhc2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBfcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0JsYW5rU2hvdWxkUmV0dXJuQ29ycmVjdFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIklTQkxBTksoQTEpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNOdW1iZXJTaG91bGRSZXR1cm5Db3JyZWN0VmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSVNOVU1CRVIoMTAvMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0Vycm9yU2hvdWxkUmV0dXJuVHJ1ZVdoZW5EaXZCeTAoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSVNFUlJPUigxMC8wKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzVGV4dFNob3VsZFJldHVyblRydWVXaGVuUmVmZXJlbmNlZENlbGxDb250YWluc1RleHQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gIkFiYyI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJJU1RFWFQoQTEpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzRXJyU2hvdWxkUmV0dXJuRmFsc2VJZkVycm9yQ29kZUlzTmEoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZSgiI04vQSIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiSVNFUlIoQTEpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc05hU2hvdWxkUmV0dXJuVHJ1ZUNvZGVJc05hKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuUGFyc2UoIiNOL0EiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIklTTkEoQTEpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEVycm9yVHlwZVNob3VsZFJldHVybkNvcnJlY3RFcnJvckNvZGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVsbCk7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEExKSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuRGl2MCk7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEEyKSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLkZvcm11bGEgPSAiRVJST1IuVFlQRShBMykiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlJlZik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI0Il0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEE0KSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmFtZSk7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI1Il0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEE1KSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVtKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjYiXS5Gb3JtdWxhID0gIkVSUk9SLlRZUEUoQTYpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTciXS5WYWx1ZSA9IEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSk7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI3Il0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEE3KSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE4Il0uVmFsdWUgPSAxMDsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjgiXS5Gb3JtdWxhID0gIkVSUk9SLlRZUEUoQTgpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgbnVsbFJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciBkaXYwUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgdmFyIHJlZlJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCNCJdLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciBuYW1lUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkI1Il0uVmFsdWU7CisgICAgICAgICAgICAgICAgdmFyIG51bVJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCNiJdLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciBuYVJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCNyJdLlZhbHVlOworICAgICAgICAgICAgICAgIHZhciBub0Vycm9yUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkI4Il0uVmFsdWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG51bGxSZXN1bHQsICJOdWxsIGVycm9yIHdhcyBub3QgMSIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBkaXYwUmVzdWx0LCAiRGl2MCBlcnJvciB3YXMgbm90IDIiKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdmFsdWVSZXN1bHQsICJWYWx1ZSBlcnJvciB3YXMgbm90IDMiKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgcmVmUmVzdWx0LCAiUmVmIGVycm9yIHdhcyBub3QgNCIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCBuYW1lUmVzdWx0LCAiTmFtZSBlcnJvciB3YXMgbm90IDUiKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgbnVtUmVzdWx0LCAiTnVtIGVycm9yIHdhcyBub3QgNiIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3LCBuYVJlc3VsdCwgIk5BIGVycm9yIHdhcyBub3QgNyIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBub0Vycm9yUmVzdWx0LCAiTm8gZXJyb3IgZGlkIG5vdCByZXR1cm4gTi9BIGVycm9yIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9Mb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9Mb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2NDM2NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0xvZ2ljYWxGdW5jdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDc5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBSaGluby5Nb2NrczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgTG9naWNhbEZ1bmN0aW9uc1Rlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCisgICAgeworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKGV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJZlNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSWYoMiA8IDMsIDEsIDIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSUlmU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdoZW5Jbm5lckZ1bmN0aW9uRXhpc3RzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIklmKE5PVChPcih0cnVlLCBGQUxTRSkpLCAxLCAyKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE5vdFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgibm90KHRydWUpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQpOworCisgICAgICAgICAgICByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJOT1QoZmFsc2UpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQW5kU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJBbmQodHJ1ZSwgMSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKworICAgICAgICAgICAgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQU5EKHRydWUsIHRydWUsIDEsIGZhbHNlKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPclNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiT3IoRkFMU0UsIDApIik7CisgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQpOworCisgICAgICAgICAgICByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJPUih0cnVlLCB0cnVlLCAxLCBmYWxzZSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUcnVlU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJUcnVlKCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGYWxzZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiRmFsc2UoKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL01hdGhGdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL01hdGhGdW5jdGlvbnNUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJmYWFhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvTWF0aEZ1bmN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNDM5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuQnVpbHRJbkZ1bmN0aW9ucworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIE1hdGhGdW5jdGlvbnNUZXN0cyA6IEZvcm11bGFQYXJzZXJUZXN0QmFzZQorICAgIHsKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9wYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihleGNlbERhdGFQcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUG93ZXJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlBvd2VyKDMsIDMpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjdkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNxcnRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoInNxcnQoOSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQaVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IChkb3VibGUpTWF0aC5Sb3VuZChNYXRoLlBJLCAxNCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUGkoKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2VpbGluZ1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IDIyLjRkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoImNlaWxpbmcoMjIuMzUsIDAuMSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZsb29yU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gMjIuM2Q7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiRmxvb3IoMjIuMzUsIDAuMSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoSW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJzdW0oMSwgMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdW1TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aERlY2ltYWxzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoInN1bSgxLDIuNSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLjVkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoRW51bWVyYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJzdW0oezE7MjszOy0xfSwgMi41KSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcuNWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3Vtc3FTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aEVudW1lcmFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgic3Vtc3EoezI7M30pIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTNkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJzdW1JZih7MTsyOzM7Mn0sIDIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROZWdhdGVFeHByZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIi1zdWJ0b3RhbCgyO3sxOzJ9KSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0yZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdGRldlNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgic3RkZXYoMTsyOzM7NCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN0ZGV2UFNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgic3RkZXZwKDIsMyw0KSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRXhwU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJleHAoNCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIE1heFNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTWF4KDQsIDUpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNYXhhU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNYXhhKDQsIDUpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNaW5TaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIm1pbig0LCA1KSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWluYVNob3VsZENhbGN1bGF0ZVN0cmluZ0FzMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9ICJhIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIk1JTkEoQTE6QjQpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHNoZWV0LkNlbGxzWyJBNSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJBdmVyYWdlKDIsIDIsIDIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZVNob3VsZFJldHVybkRpdjBJZkVtcHR5Q2VsbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJBVkVSQUdFKEExKSI7CisgICAgICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIjRElWLzAhIiwgd3MuQ2VsbHNbIkEyIl0uVmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm91bmRTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlJvdW5kKDIuMiwgMCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZGRvd25TaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlJvdW5kZG93bigyLjk5LCAxKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIuOWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUm91bmR1cFNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUm91bmR1cCgyLjk5LCAxKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNxcnRQaVNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU3FydFBpKDIuMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEludFNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSW50KDIuOSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJhbmRTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlJhbmQoKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZEJldHdlZW5TaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlJhbmRCZXR3ZWVuKDEsMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvdW50U2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJDb3VudCgxLDIsMixcIjRcIikiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudEFTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNvdW50QSgxLDIsMixcIlwiLCBcImFcIikiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJDb3VudElmKHsxOzI7MjtcIlwifSwgXCIyXCIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVmFyU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJWYXIoMSwyLDMpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWYXJQU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJWYXJQKDEsMiwzKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTW9kU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNb2QoNSwyKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlN1YnRvdGFsKDEsIDEwLCAyMCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRydW5jU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJUcnVuYygxLjIzNDUpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQcm9kdWN0U2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJQcm9kdWN0KDEsMiwzKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29zU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJDb3MoMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvc2hTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNvc2goMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNpblNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU2luKDIpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaW5oU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJTaW5oKDIpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUYW5TaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlRhbigyKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXRhblNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQXRhbigyKSIpOworICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQXRhbjJTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkF0YW4yKDIsMSkiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRhbmhTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlRhbmgoMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvZ1Nob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTG9nKDIsIDIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9nMTBTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkxvZzEwKDIpIik7CisgICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMblNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTG4oMikiKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZhY3RTaG91bGRSZXR1cm5BUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkZhY3QoMCkiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBRdW90aWVudFNob3VsZFJldHVybkFSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUXVvdGllbnQoNTsyKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTWVkaWFuU2hvdWxkUmV0dXJuQVJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNZWRpYW4oMTsyOzMpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ291bnRCbGFua1Nob3VsZENhbGN1bGF0ZUVtcHR5Q2VsbHMoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJDT1VOVEJMQU5LKEExOkI0KSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcsIHNoZWV0LkNlbGxzWyJBNSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWdyZWVzU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJERUdSRUVTKDAuNSkiKTsKKyAgICAgICAgICAgIHZhciByb3VuZGVkID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdCwgMyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjguNjQ4LCByb3VuZGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYXRlSWZzU2hvdWxkQ2FsdWNsYXRlUmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkY0Il0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGNSJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjYiXS5Gb3JtdWxhID0gIjIgKyAyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjciXS5WYWx1ZSA9IDQ7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkY4Il0uVmFsdWUgPSA1OworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkg0Il0uVmFsdWUgPSAzOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJINSJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSDYiXS5Gb3JtdWxhID0gIjIgKyAyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSDciXS5WYWx1ZSA9IDQ7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkg4Il0uVmFsdWUgPSA1OworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkk0Il0uVmFsdWUgPSAyOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJJNSJdLlZhbHVlID0gMzsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSTYiXS5Gb3JtdWxhID0gIjIgKyAyIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSTciXS5WYWx1ZSA9IDU7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkk4Il0uVmFsdWUgPSAxOworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkg5Il0uRm9ybXVsYSA9ICJBVkVSQUdFSUZTKEY0OkY4O0g0Okg4O1wiPjNcIjtJNDpJODtcIjw1XCIpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNC41ZCwgc2hlZXQuQ2VsbHNbIkg5Il0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvUmVmQW5kTG9va3VwVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9SZWZBbmRMb29rdXBUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBiYWMxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvUmVmQW5kTG9va3VwVGVzdHMuY3MKQEAgLTAsMCArMSwzMTggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFJoaW5vLk1vY2tzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgUmVmQW5kTG9va3VwVGVzdHMgOiBGb3JtdWxhUGFyc2VyVGVzdEJhc2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworICAgICAgICBjb25zdCBzdHJpbmcgV29ya3NoZWV0TmFtZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldERpbWVuc2lvbkVuZChBcmc8c3RyaW5nPi5Jcy5Bbnl0aGluZykpLlJldHVybihuZXcgRXhjZWxDZWxsQWRkcmVzcygxMCwgMSkpOworICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKF9leGNlbERhdGFQcm92aWRlcik7CisgICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFZMb29rdXBTaG91bGRSZXR1cm5Db3JyZXNwb25kaW5nVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHZhciBsb29rdXBBZGRyZXNzID0gIkExOkIyIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIiXS5WYWx1ZSA9IDU7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkEzIl0uRm9ybXVsYSA9ICJWTE9PS1VQKDIsICIgKyBsb29rdXBBZGRyZXNzICsgIiwgMikiOworICAgICAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB3cy5DZWxsc1siQTMiXS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWTG9va3VwU2hvdWxkUmV0dXJuQ2xvc2VzdFZhbHVlQmVsb3dJZkxhc3RBcmdJc1RydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICB2YXIgbG9va3VwQWRkcmVzcyA9ICJBMTpCMiI7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAzOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9IDU7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uVmFsdWUgPSA1OworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMyJdLkZvcm11bGEgPSAiVkxPT0tVUCg0LCAiICsgbG9va3VwQWRkcmVzcyArICIsIDIsIHRydWUpIjsKKyAgICAgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gd3MuQ2VsbHNbIkEzIl0uVmFsdWU7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSExvb2t1cFNob3VsZFJldHVybkNvcnJlc3BvbmRpbmdWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb29rdXBBZGRyZXNzID0gIkExOkIyIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSA1OworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5Gb3JtdWxhID0gIkhMT09LVVAoMiwgIiArIGxvb2t1cEFkZHJlc3MgKyAiLCAyKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBITG9va3VwU2hvdWxkUmV0dXJuQ2xvc2VzdFZhbHVlQmVsb3dJZkxhc3RBcmdJc1RydWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG9va3VwQWRkcmVzcyA9ICJBMTpCMiI7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0RGltZW5zaW9uRW5kKEFyZzxzdHJpbmc+LklzLkFueXRoaW5nKSkuUmV0dXJuKG5ldyBFeGNlbENlbGxBZGRyZXNzKDUsIDUpKTsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oNSk7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybigxKTsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKDIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkhMT09LVVAoNCwgIiArIGxvb2t1cEFkZHJlc3MgKyAiLCAyLCB0cnVlKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9va3VwU2hvdWxkUmV0dXJuTWF0Y2hpbmdWYWx1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb29rdXBBZGRyZXNzID0gIkExOkIyIjsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oNSk7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybig0KTsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKDEpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkxPT0tVUCg0LCAiICsgbG9va3VwQWRkcmVzcyArICIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaFNob3VsZFJldHVybkluZGV4T2ZNYXRjaGluZ1ZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGxvb2t1cEFkZHJlc3MgPSAiQTE6QTIiOworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMyk7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybig1KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNQVRDSCgzLCAiICsgbG9va3VwQWRkcmVzcyArICIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSb3dTaG91bGRSZXR1cm5Sb3dOdW1iZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0UmFuZ2VGb3JtdWxhKCIiLCA0LCAxKSkuUmV0dXJuKCJSb3coKSIpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2VBdCgiQTQiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvd1Nob2xkSGFuZGxlUmVmZXJlbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlJPVyhBNCkiOworICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBzMS5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uU2hvdWxkUmV0dXJuUm93TnVtYmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9fZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoIkI0IikpLlJldHVybihuZXcgTGlzdDxFeGNlbENlbGw+IHsgbmV3IEV4Y2VsQ2VsbChudWxsLCAiQ29sdW1uKCkiLCAwLCAwKSB9KTsKKyAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRSYW5nZUZvcm11bGEoIiIsIDQsIDIpKS5SZXR1cm4oIkNvbHVtbigpIik7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZUF0KCJCNCIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uU2hvbGRIYW5kbGVSZWZlcmVuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiQ09MVU1OKEI0KSI7CisgICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHMxLkNlbGxzWyJBMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSb3dzU2hvdWxkUmV0dXJuTmJyT2ZSb3dzKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFJhbmdlRm9ybXVsYSgiIiwgNCwgMSkpLlJldHVybigiUm93cyhBNTpCNykiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlQXQoIkE0Iik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb2x1bW5zU2hvdWxkUmV0dXJuTmJyT2ZDb2xzKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFJhbmdlRm9ybXVsYSgiIiwgNCwgMSkpLlJldHVybigiQ29sdW1ucyhBNTpCNykiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlQXQoIkE0Iik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDaG9vc2VTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNob29zZSgxLCBcIkFcIiwgXCJCXCIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEyMzQ1KTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJBZGRyZXNzKDEsIDEpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiRBJDEiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEluZGlyZWN0U2hvdWxkUmV0dXJuQVJhbmdlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTE6QTIiXS5WYWx1ZSA9IDI7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkEzIl0uRm9ybXVsYSA9ICJTVU0oSW5kaXJlY3QoXCJBMTpBMlwiKSkiOworICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgczEuQ2VsbHNbIkEzIl0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJTVU0oSW5kaXJlY3QoXCJBMTpBXCIgJiBcIjJcIikpIjsKKyAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHMxLkNlbGxzWyJBNCJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRSZXR1cm5BU2luZ2xlVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMyJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJPRkZTRVQoQTEsIDIsIDEpIjsKKyAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHMxLkNlbGxzWyJBNSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRSZXR1cm5BUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjMiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiU1VNKE9GRlNFVChBMTpBMywgMCwgMSkpIjsKKyAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHMxLkNlbGxzWyJBNSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXREaXJlY3RSZWZlcmVuY2VUb011bHRpUmFuZ2VTaG91bGRTZXRWYWx1ZUVycm9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMiJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIk9GRlNFVChBMTpBMywgMCwgMSkiOworICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBzMS5DZWxsc1siQTUiXS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRSZXR1cm5BUmFuZ2VBY2NvcmRpbmdUb1dpZHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMiJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIlNVTShPRkZTRVQoQTE6QTMsIDAsIDEsIDIpKSI7CisgICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBzMS5DZWxsc1siQTUiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT2Zmc2V0U2hvdWxkUmV0dXJuQVJhbmdlQWNjb3JkaW5nVG9IZWlnaHQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjMiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJDMSJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkMyIl0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQzMiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiU1VNKE9GRlNFVChBMTpBMywgMCwgMSwgMiwgMikpIjsKKyAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNmQsIHMxLkNlbGxzWyJBNSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRDb3Zlck11bHRpcGxlQ29sdW1ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgczEgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkMxIl0uVmFsdWUgPSAxZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siQzIiXS5WYWx1ZSA9IDFkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJDMyJdLlZhbHVlID0gMWQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkQxIl0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgICAgICBzMS5DZWxsc1siRDIiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJEMyJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICAgICAgczEuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJTVU0oT0ZGU0VUKEExOkIzLCAwLCAyKSkiOworICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5ZCwgczEuQ2VsbHNbIkE1Il0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgVkxvb2t1cFNob3VsZEhhbmRsZU5hbWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEJvb2szLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisgICAgICAgICAgICAgICAgdmFyIHYgPSBzMS5DZWxsc1siWDEwIl0uRm9ybXVsYTsKKyAgICAgICAgICAgICAgICAvL3MxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIHYgPSBzMS5DZWxsc1siWDEwIl0uRm9ybXVsYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL1N0cmluZ0Z1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3RyaW5nRnVuY3Rpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViNTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL1N0cmluZ0Z1bmN0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsMTA3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBSaGluby5Nb2NrczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgU3RyaW5nRnVuY3Rpb25zVGVzdHMgOiBGb3JtdWxhUGFyc2VyVGVzdEJhc2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX3Byb3ZpZGVyOworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3Byb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKF9wcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGV4dFNob3VsZENvbmNhdGVuYXRlV2l0aE5leHRFeHByZXNzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldEZvcm1hdCgyMy41LCAiJDAuMDAiKSkuUmV0dXJuKCIkMjMuNTAiKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJURVhUKDIzLjUsXCIkMC4wMFwiKSAmIFwiIHBlciBob3VyXCIiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiJDIzLjUwIHBlciBob3VyIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMZW5TaG91bGRBZGRMZW5ndGhVc2luZ1N1cHBsaWVkT3BlcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTGVuKFwiYWJjXCIpICsgMiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvd2VyU2hvdWxkUmV0dXJuQUxvd2VyQ2FzZVN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJMb3dlcihcIkFCQ1wiKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhYmMiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFVwcGVyU2hvdWxkUmV0dXJuQW5VcHBlckNhc2VTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVXBwZXIoXCJhYmNcIikiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQUJDIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMZWZ0U2hvdWxkUmV0dXJuU3Vic3RyaW5nRnJvbUxlZnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTGVmdChcImFiYWNkXCIsIDIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSaWdodFNob3VsZFJldHVyblN1YnN0cmluZ0Zyb21SaWdodCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJSSUdIVChcImFiYWNkXCIsIDIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNkIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNaWRTaG91bGRSZXR1cm5TdWJzdHJpbmdBY2NvcmRpbmdUb1BhcmFtcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNaWQoXCJhYmFjZFwiLCAyLCAyKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJiYSIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVwbGFjZVNob3VsZFJldHVyblN1YnN0cmluZ0FjY29yZGluZ1RvUGFyYW1zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlJlcGxhY2UoXCJ0ZXN0YXJcIiwgMywgMywgXCJoZWpcIikiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVoZWpyIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdWJzdGl0dXRlU2hvdWxkUmV0dXJuU3Vic3RyaW5nQWNjb3JkaW5nVG9QYXJhbXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU3Vic3RpdHV0ZShcInRlc3RhciB0ZXN0YXJcIiwgXCJlc1wiLCBcInh4XCIpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInR4eHRhciB0eHh0YXIiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbmNhdGVuYXRlU2hvdWxkUmV0dXJuQWNjb3JkaW5nVG9QYXJhbXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQ09OQ0FURU5BVEUoXCJPbmVcIiwgXCJUd29cIiwgXCJUaHJlZVwiKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJPbmVUd29UaHJlZSIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVFNob3VsZFJldHVyblRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVChcIk9uZVwiKSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJPbmUiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlcHRTaG91bGRDb25jYXRlbmF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJSRVBUKFwiKlwiLDMpIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIioqKiIsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9TdWJ0b3RhbFRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3VidG90YWxUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI4YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3VidG90YWxUZXN0cy5jcwpAQCAtMCwwICsxLDE3MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgU3VidG90YWxUZXN0cyA6IEZvcm11bGFQYXJzZXJUZXN0QmFzZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSk7CisgICAgICAgICAgICBfd29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgIF9wYXJzZXIgPSBfd29ya3NoZWV0Lldvcmtib29rLkZvcm11bGFQYXJzZXI7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9BdmcoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoMSwgQTI6QTMpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg5LCBBNTpBNikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1YnRvdGFsU2hvdWxkTm90SW5jbHVkZVN1YnRvdGFsQ2hpbGRyZW5fQ291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoMiwgQTI6QTMpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg5LCBBNTpBNikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1YnRvdGFsU2hvdWxkTm90SW5jbHVkZVN1YnRvdGFsQ2hpbGRyZW5fQ291bnRBKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDMsIEEyOkEzKSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOSwgQTU6QTYpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX01heCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg0LCBBMjpBMykiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEE1OkE2KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9NaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoNSwgQTI6QTMpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg5LCBBNTpBNikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1YnRvdGFsU2hvdWxkTm90SW5jbHVkZVN1YnRvdGFsQ2hpbGRyZW5fUHJvZHVjdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg2LCBBMjpBMykiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEE1OkE2KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9TdGRldigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg3LCBBMjpBNCkiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDcsIEE1OkE2KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gNWQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gNGQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLlZhbHVlID0gNGQ7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7CisgICAgICAgICAgICByZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LCA5KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjcwNzEwNjc4MWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9TdGRldlAoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOCwgQTI6QTQpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg4LCBBNTpBNikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDVkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDRkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSA9IDRkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuNWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9TdW0oKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOSwgQTI6QTMpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg5LCBBNTpBNikiOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOworICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFN1YnRvdGFsU2hvdWxkTm90SW5jbHVkZVN1YnRvdGFsQ2hpbGRyZW5fVmFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEEyOkE0KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOCwgQTU6QTYpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSA0ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUgPSA0ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5ZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX1ZhclAoKQorICAgICAgICB7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoMTAsIEEyOkE0KSI7CisgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOCwgQTU6QTYpIjsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSA1ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSA0ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAyZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUgPSA0ZDsKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjVkLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvVGV4dEZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvVGV4dEZ1bmN0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTYwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9UZXh0RnVuY3Rpb25zVGVzdHMuY3MKQEAgLTAsMCArMSwxNDggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5Mb2dnaW5nOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUZXh0RnVuY3Rpb25zVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIeXBlcmxpbmtTaG91bGRIYW5kbGVSZWZlcmVuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIkhZUEVSTElOSyhCMSkiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIiwgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEh5cGVybGlua1Nob3VsZEhhbmRsZVJlZmVyZW5jZTIoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIkhZUEVSTElOSyhCMSwgQjIpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAiRXBwbHVzIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkVwcGx1cyIsIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIeXBlcmxpbmtTaG91bGRIYW5kbGVUZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJIWVBFUkxJTksoXCJ0ZXN0aW5nXCIpIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3RpbmciLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2hhclNob3VsZFJldHVybkNoYXJWYWxPZk51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiQ2hhcihBMikiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gNTU7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI3Iiwgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpeGVkU2hvdWxkSGF2ZUNvcnJlY3REZWZhdWx0VmFsdWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJGaXhlZChBMikiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTIzNC41Njc4OworICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0LjU2NzguVG9TdHJpbmcoIk4yIiksIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGaXhlZFNob3VsZFNldENvcnJlY3ROdW1iZXJPZkRlY2ltYWxzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJGaXhlZChBMiw0KSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxMjM0LjU2Nzg5OworICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0LjU2Nzg5LlRvU3RyaW5nKCJONCIpLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRml4ZWRTaG91bGRTZXROb0NvbW1hcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiRml4ZWQoQTIsNCx0cnVlKSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxMjM0LjU2Nzg5OworICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0LjU2Nzg5LlRvU3RyaW5nKCJGNCIpLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRml4ZWRTaG91bGRIYW5kbGVOZWdhdGl2ZURlY2ltYWxzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJGaXhlZChBMiwtMSx0cnVlKSI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxMjM0LjU2Nzg5OworICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMwLlRvU3RyaW5nKCJGMCIpLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uY2F0ZW5hdGVTaG91bGRIYW5kbGVSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiQ29uY2F0ZW5hdGUoMSxBMikiOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gImhlbGxvIjsKKyAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjFoZWxsbyIsIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIExvZ3Rlc3QxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGRlbmlzLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuQ3JlYXRlVGV4dEZpbGVMb2dnZXIobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxsb2cxLnR4dCIpKTsKKyAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suRm9ybXVsYVBhcnNlci5Db25maWd1cmUoeCA9PiB4LkF0dGFjaExvZ2dlcihsb2dnZXIpKTsKKyAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIHZhciBlbGFwc2VkID0gc3cuRWxhcHNlZDsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHN0cmluZy5Gb3JtYXQoInswfSBzZWNvbmRzIiwgZWxhcHNlZC5Ub3RhbFNlY29uZHMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9DYWxjRXh0ZW5zaW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0NhbGNFeHRlbnNpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3MzQ1MQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9DYWxjRXh0ZW5zaW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNDcgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIENhbGNFeHRlbnNpb25zVGVzdHMKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVDaGFpblRlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcY2hhaW50ZXN0Lnhsc3giKSk7CisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENhbGN1bGF0ZVRlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvL3ZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICAvL3ZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKKworICAgICAgICAgICAgLy93cy5TZXRWYWx1ZSgiQTEiLCAoc2hvcnQpMSk7CisgICAgICAgICAgICAvL3ZhciB2ID0gcGNrLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLlBhcnNlKCIyLjUtQ2FsYzEhQTErYWJzKDMuMCktU0lOKDMpIik7CisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbCg0LjM1ODg3OTk5MiwgTWF0aC5Sb3VuZCgoZG91YmxlKXYsIDkpKTsKKworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKKworICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkExIiwgKHNob3J0KTEpOworICAgICAgICAgICAgdmFyIHYgPSBwY2suV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuUGFyc2UoIjIuNS1DYWxjMSFBMStBQlMoLTMuMCktU0lOKDMpKmFicyg1KSIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuNzk0Mzk5OTYsIE1hdGguUm91bmQoKGRvdWJsZSl2LDkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDYWxjdWxhdGVUZXN0MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7CisKKyAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBMSIsIChzaG9ydCkxKTsKKyAgICAgICAgICAgIHZhciB2ID0gcGNrLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLlBhcnNlKCIzKigyKzUuNSoyKSsyKjAuNSszIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDMsIE1hdGguUm91bmQoKGRvdWJsZSl2LCA5KSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvRXJyb3JIYW5kbGluZy9Gb3JtdWxhRXJyb3JIYW5kbGluZ1Rlc3RCYXNlLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Vycm9ySGFuZGxpbmcvRm9ybXVsYUVycm9ySGFuZGxpbmdUZXN0QmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc5YzU4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Vycm9ySGFuZGxpbmcvRm9ybXVsYUVycm9ySGFuZGxpbmdUZXN0QmFzZS5jcwpAQCAtMCwwICsxLDI3IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBGb3JtdWxhRXJyb3JIYW5kbGluZ1Rlc3RCYXNlCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRXhjZWxQYWNrYWdlIFBhY2thZ2U7CisgICAgICAgIHByb3RlY3RlZCBFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgQmFzZUluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGlyID0gQXBwRG9tYWluLkN1cnJlbnREb21haW4uQmFzZURpcmVjdG9yeTsKKyAgICAgICAgICAgIHZhciBQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKGRpciwgIldvcmtib29rcyIsICJGb3JtdWxhVGVzdC54bHN4IikpKTsKKyAgICAgICAgICAgIFdvcmtzaGVldCA9IFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1siVmFsaWRhdGVGb3JtdWxhcyJdOworICAgICAgICAgICAgUGFja2FnZS5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEJhc2VDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgUGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvRXJyb3JIYW5kbGluZy9TdW1UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9FcnJvckhhbmRsaW5nL1N1bVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzkxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvRXJyb3JIYW5kbGluZy9TdW1UZXN0cy5jcwpAQCAtMCwwICsxLDkyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5FcnJvckhhbmRsaW5nCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTdW1tYXJ5IGRlc2NyaXB0aW9uIGZvciBTdW1UZXN0cworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgW1Rlc3RDbGFzcywgSWdub3JlXQorICAgIHB1YmxpYyBjbGFzcyBTdW1UZXN0cyA6IEZvcm11bGFFcnJvckhhbmRsaW5nVGVzdEJhc2UKKyAgICB7CisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xhc3NJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgQmFzZUluaXRpYWxpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Q2xlYW51cF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xhc3NDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQmFzZUNsZWFudXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVGVzdENvbnRleHQgdGVzdENvbnRleHRJbnN0YW5jZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vL0dldHMgb3Igc2V0cyB0aGUgdGVzdCBjb250ZXh0IHdoaWNoIHByb3ZpZGVzCisgICAgICAgIC8vL2luZm9ybWF0aW9uIGFib3V0IGFuZCBmdW5jdGlvbmFsaXR5IGZvciB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KKyAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVGVzdENvbnRleHQgVGVzdENvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RDb250ZXh0SW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0Q29udGV4dEluc3RhbmNlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNpbmdsZUNlbGwoKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIFdvcmtzaGVldC5DZWxsc1siQjkiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTXVsdGlDZWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwZCwgV29ya3NoZWV0LkNlbGxzWyJDOSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgV29ya3NoZWV0LkNlbGxzWyJFOSJdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWZlcmVuY2VFcnJvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiI1JFRiEiLCBXb3Jrc2hlZXQuQ2VsbHNbIkg5Il0uVmFsdWUuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTmFtZU9uT3RoZXJTaGVldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMzBkLCBXb3Jrc2hlZXQuQ2VsbHNbIkk5Il0uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFycmF5SW5jbFRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoN2QsIFdvcmtzaGVldC5DZWxsc1siSjkiXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIE5hbWVFcnJvcigpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIiNOQU1FPyIsIFdvcmtzaGVldC5DZWxsc1siTDkiXS5WYWx1ZSk7CisgICAgICAgIC8vfQorCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vcHVibGljIHZvaWQgRGl2QnlaZXJvRXJyb3IoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKCIjRElWLzAhIiwgV29ya3NoZWV0LkNlbGxzWyJNOSJdLlZhbHVlKTsKKyAgICAgICAgLy99CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0V4Y2VsRGF0YVByb3ZpZGVyVGVzdHMvRXhjZWxEYXRhUHJvdmlkZXJJbnRlZ3JhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0V4Y2VsRGF0YVByb3ZpZGVyVGVzdHMvRXhjZWxEYXRhUHJvdmlkZXJJbnRlZ3JhdGlvblRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOGExM2MKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvRXhjZWxEYXRhUHJvdmlkZXJUZXN0cy9FeGNlbERhdGFQcm92aWRlckludGVncmF0aW9uVGVzdHMuY3MKQEAgLTAsMCArMSw1OCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBSaGluby5Nb2NrczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuRXhjZWxEYXRhUHJvdmlkZXJUZXN0cworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVByb3ZpZGVySW50ZWdyYXRpb25UZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbENlbGwgQ3JlYXRlSXRlbShvYmplY3QgdmFsLCBpbnQgcm93KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ2VsbCh2YWwsIG51bGwsIDAsIHJvdyk7CisgICAgICAgIH0KKworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIFNob3VsZENhbGxQcm92aWRlckluU3VtRnVuY3Rpb25BbmRDYWxjdWxhdGVSZXN1bHQoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdmFyIGV4cGVjdGVkQWRkcmVzID0gIkExOkEyIjsKKyAgICAgICAgLy8gICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAvLyAgICBwcm92aWRlcgorICAgICAgICAvLyAgICAgICAgLlN0dWIoeCA9PiB4LkdldFJhbmdlVmFsdWVzKHN0cmluZy5FbXB0eSwgZXhwZWN0ZWRBZGRyZXMpKQorICAgICAgICAvLyAgICAgICAgLlJldHVybihuZXcgb2JqZWN0W10geyAxLCAyIH0pOworICAgICAgICAvLyAgICB2YXIgcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIocHJvdmlkZXIpOworICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKHN0cmluZy5Gb3JtYXQoInN1bSh7MH0pIiwgZXhwZWN0ZWRBZGRyZXMpKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOworICAgICAgICAvL30KKworICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICAvL3B1YmxpYyB2b2lkIFNob3VsZEV4ZWN1dGVGb3JtdWxhSW5SYW5nZSgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICB2YXIgZXhwZWN0ZWRBZGRyZXMgPSAiQTE6QTIiOworICAgICAgICAvLyAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7CisgICAgICAgIC8vICAgIHByb3ZpZGVyCisgICAgICAgIC8vICAgICAgICAuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoZXhwZWN0ZWRBZGRyZXMpKQorICAgICAgICAvLyAgICAgICAgLlJldHVybihuZXcgb2JqZWN0W10geyAxLCBuZXcgRXhjZWxDZWxsKG51bGwsICJTVU0oMSwyKSIsIDAsIDEpIH0pOworICAgICAgICAvLyAgICB2YXIgcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIocHJvdmlkZXIpOworICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKHN0cmluZy5Gb3JtYXQoInN1bSh7MH0pIiwgZXhwZWN0ZWRBZGRyZXMpKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDRkLCByZXN1bHQpOworICAgICAgICAvL30KKworICAgICAgICAvL1tUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24pKV0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVDaXJjdWxhclJlZmVyZW5jZTIoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdmFyIGV4cGVjdGVkQWRkcmVzID0gIkExOkEyIjsKKyAgICAgICAgLy8gICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOworICAgICAgICAvLyAgICBwcm92aWRlcgorICAgICAgICAvLyAgICAgICAgLlN0dWIoeCA9PiB4LkdldFJhbmdlVmFsdWVzKGV4cGVjdGVkQWRkcmVzKSkKKyAgICAgICAgLy8gICAgICAgIC5SZXR1cm4obmV3IEV4Y2VsQ2VsbFtdIHsgQ3JlYXRlSXRlbSgxLCAwKSwgbmV3IEV4Y2VsQ2VsbChudWxsLCAiU1VNKEExOkEyKSIsMCwgMSkgfSk7CisgICAgICAgIC8vICAgIHZhciBwYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihwcm92aWRlcik7CisgICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2Uoc3RyaW5nLkZvcm1hdCgic3VtKHswfSkiLCBleHBlY3RlZEFkZHJlcykpOworICAgICAgICAvL30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvRm9ybXVsYVBhcnNlclRlc3RCYXNlLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Zvcm11bGFQYXJzZXJUZXN0QmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGI5N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Zvcm11bGFQYXJzZXJUZXN0QmFzZS5jcwpAQCAtMCwwICsxLDEzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzCit7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm11bGFQYXJzZXJUZXN0QmFzZQorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEZvcm11bGFQYXJzZXIgX3BhcnNlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvT3BlcmF0b3JzVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvT3BlcmF0b3JzVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3ZTdhNQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9PcGVyYXRvcnNUZXN0cy5jcwpAQCAtMCwwICsxLDM1IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBPcGVyYXRvcnNUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7CisgICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRXJyb3JWYWx1ZSBEaXZCeVplcm8gPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuRGl2MCk7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICBfd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERpdkJ5WmVyb1Nob3VsZFJldHVybkVycm9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93cy5DYWxjdWxhdGUoIjEwLzAgKyAzIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGl2QnlaZXJvLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL1ByZWNlZGVuY2VUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9QcmVjZWRlbmNlVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwZmMxNwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9QcmVjZWRlbmNlVGVzdHMuY3MKQEAgLTAsMCArMSw2MyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgUmhpbm8uTW9ja3M7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQcmVjZWRlbmNlVGVzdHMgOiBGb3JtdWxhUGFyc2VyVGVzdEJhc2UKKyAgICB7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9wYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihleGNlbERhdGFQcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsdWNsYXRlVXNpbmdQcmVjZWRlbmNlTXVsdGlwbHlCZWZvcmVBZGQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiNCArIDYgKiAyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTZkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbHVjbGF0ZVVzaW5nUHJlY2VkZW5jZURpdmlkZUJlZm9yZUFkZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCI0ICsgNiAvIDIiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3ZCwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVUd29Hcm91cHNVc2luZ0RpdmlkZUFuZE11bHRpcGx5QmVmb3JlU3VidHJhY3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiNC8yICsgMyAqIDMiKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMWQsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlRXhwcmVzc2lvbldpdGhpblBhcmVudGhlc2lzQmVmb3JlTXVsdGlwbHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiKDIrNCkgKiAyIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTJkLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENvbmNhdEFmdGVyQWRkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjIgKyA0ICYgXCJhYmNcIiIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI2YWJjIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBCdWdmaXh0ZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIigxKzIpKzNeMiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvQ2hhckhhbmRsZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0NoYXJIYW5kbGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMzM3NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0NoYXJIYW5kbGVyVGVzdHMuY3MKQEAgLTAsMCArMSwxNSBAQAor77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBDaGFySGFuZGxlclRlc3RzCisgICAgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvTmVnYXRpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL05lZ2F0aW9uVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmOWIwZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL05lZ2F0aW9uVGVzdHMuY3MKQEAgLTAsMCArMSw4OSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CisKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgTmVnYXRpb25UZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBTb3VyY2VDb2RlVG9rZW5pemVyIF90b2tlbml6ZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBfdG9rZW5pemVyID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdENsZWFudXBdCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRTZXROZWdhdG9yT25GaXJzdFRva2VuSWZGaXJzdENoYXJJc01pbnVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIi0xIjsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRva2Vucy5Db3VudCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkZpcnN0KCkuVG9rZW5UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDaGFuZ2VQbHVzVG9NaW51c0lmTmVnYXRvcklzUHJlc2VudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9ICIxICsgLTEiOworICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdG9rZW5zLkNvdW50KCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVyYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgxKS5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCItIiwgdG9rZW5zLkVsZW1lbnRBdCgxKS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0TmVnYXRvck9uVG9rZW5JbnNpZGVQYXJlbnRoZXRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiMSArICgtMSAqIDIpIjsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDgsIHRva2Vucy5Db3VudCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgzKS5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFNldE5lZ2F0b3JPblRva2VuSW5zaWRlRnVuY3Rpb25DYWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIkNlaWxpbmcoLTEsIC0wLjEpIjsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDgsIHRva2Vucy5Db3VudCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgyKS5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5OZWdhdG9yLCB0b2tlbnMuRWxlbWVudEF0KDUpLlRva2VuVHlwZSwgIk5lZ2F0b3IgYWZ0ZXIgY29tbWEgd2FzIG5vdCBpZGVudGlmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0TmVnYXRvck9uVG9rZW5JbkVudW1lcmFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiey0xfSI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLk5lZ2F0b3IsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRTZXROZWdhdG9yT25FeGNlbEFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiLUExIjsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgwKS5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5FeGNlbEFkZHJlc3MsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1NvdXJjZUNvZGVUb2tlbml6ZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1NvdXJjZUNvZGVUb2tlbml6ZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkwNWJlCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU291cmNlQ29kZVRva2VuaXplclRlc3RzLmNzCkBAIC0wLDAgKzEsMTYyIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgU291cmNlQ29kZVRva2VuaXplclRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFNvdXJjZUNvZGVUb2tlbml6ZXIgX3Rva2VuaXplcjsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIF90b2tlbml6ZXIgPSBuZXcgU291cmNlQ29kZVRva2VuaXplcihjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0Q2xlYW51cF0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDcmVhdGVUb2tlbnNGb3JTdHJpbmdDb3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiXCJhYmMxMjNcIiI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCB0b2tlbnMuQ291bnQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLlN0cmluZywgdG9rZW5zLkZpcnN0KCkuVG9rZW5UeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuU3RyaW5nQ29udGVudCwgdG9rZW5zLkVsZW1lbnRBdCgxKS5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5TdHJpbmcsIHRva2Vucy5MYXN0KCkuVG9rZW5UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUb2tlbml6ZVN0cmluZ0NvcnJlY3RseSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9ICInYWIoYylkJyI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCB0b2tlbnMuQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlVG9rZW5zRm9yRnVuY3Rpb25Db3JyZWN0bHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiVGV4dCgyKSI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCB0b2tlbnMuQ291bnQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkZ1bmN0aW9uLCB0b2tlbnMuRmlyc3QoKS5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuSW50ZWdlciwgdG9rZW5zLkVsZW1lbnRBdCgyKS5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyIiwgdG9rZW5zLkVsZW1lbnRBdCgyKS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcywgdG9rZW5zLkxhc3QoKS5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZU11bHRpcGxlQ2hhck9wZXJhdG9yQ29ycmVjdGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIjEgPD0gMiI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCB0b2tlbnMuQ291bnQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjw9IiwgdG9rZW5zLkVsZW1lbnRBdCgxKS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLk9wZXJhdG9yLCB0b2tlbnMuRWxlbWVudEF0KDEpLlRva2VuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlVG9rZW5zRm9yRW51bWVyYWJsZUNvcnJlY3RseSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9ICJUZXh0KHsxOzJ9KSI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4LCB0b2tlbnMuQ291bnQoKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLk9wZW5pbmdFbnVtZXJhYmxlLCB0b2tlbnMuRWxlbWVudEF0KDIpLlRva2VuVHlwZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkNsb3NpbmdFbnVtZXJhYmxlLCB0b2tlbnMuRWxlbWVudEF0KDYpLlRva2VuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlVG9rZW5zRm9yRXhjZWxBZGRyZXNzQ29ycmVjdGx5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIlRleHQoQTEpIjsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5FeGNlbEFkZHJlc3MsIHRva2Vucy5FbGVtZW50QXQoMikuVG9rZW5UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDcmVhdGVUb2tlbkZvclBlcmNlbnRBZnRlckRlY2ltYWwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiMSwyMyUiOworICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5QZXJjZW50LCB0b2tlbnMuTGFzdCgpLlRva2VuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSWdub3JlVHdvU3Vic2VxdWVudFN0cmluZ0lkZW50aWZ5ZXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIlwiaGVsbG9cIlwid29ybGRcIiI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdG9rZW5zLkNvdW50KCkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJoZWxsb1wid29ybGQiLCB0b2tlbnMuRWxlbWVudEF0KDEpLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRJZ25vcmVUd29TdWJzZXF1ZW50U3RyaW5nSWRlbnRpZnllcnMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy91c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcUXVvdGVJc3N1ZTIueGxzeCIpKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgcGNrLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgdmFyIGlucHV0ID0gIlwiXCJcIlwiXCJcIiI7CisgICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb2tlbml6ZXJTaG91bGRJZ25vcmVPcGVyYXRvckluU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIlwiKlwiIjsKKyAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuU3RyaW5nQ29udGVudCwgdG9rZW5zLkVsZW1lbnRBdCgxKS5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRva2VuaXplclNob3VsZEhhbmRsZVdvcmtzaGVldE5hbWVXaXRoTWludXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiJ0EtQichQTEiOworICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHRva2Vucy5Db3VudCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QnVnOV8xMl8xNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vKCggVzYwIC0oLSBXNjMgKS0oIFcyOSArIFczMCArIFczMSApKS8oIFcyMyArIFcyOCArIFc0MiAtIFc1MSApKiBXNCApCisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MxID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDE7IHggPD0gMTA7IHgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdzMS5DZWxsc1t4LCAxXS5WYWx1ZSA9IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd3MxLkNlbGxzWyJBMTEiXS5Gb3JtdWxhID0gIigoIEExIC0oLSBBMiApLSggQTMgKyBBNCArIEE1ICkpLyggQTYgKyBBNyArIEE4IC0gQTkgKSogQTUgKSI7CisgICAgICAgICAgICAgICAgLy93czEuQ2VsbHNbIkExMSJdLkZvcm11bGEgPSAiKC1BMiArIDEgKSI7CisgICAgICAgICAgICAgICAgd3MxLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB3czEuQ2VsbHNbIkExMSJdLlZhbHVlOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMy43NSwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1N5bnRhY3RpY0FuYWx5emVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9TeW50YWN0aWNBbmFseXplclRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjYzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9TeW50YWN0aWNBbmFseXplclRlc3RzLmNzCkBAIC0wLDAgKzEsODMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFN5bnRhY3RpY0FuYWx5emVyVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgSVN5bnRhY3RpY0FuYWx5emVyIF9hbmFseXNlcjsKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2FuYWx5c2VyID0gbmV3IFN5bnRhY3RpY0FuYWx5emVyKCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUGFzc0lmUGFyZW50aGVzaXNBcmVXZWxsZm9ybWVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IExpc3Q8VG9rZW4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIxIiwgVG9rZW5UeXBlLkludGVnZXIpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKyIsIFRva2VuVHlwZS5PcGVyYXRvciksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKSIsIFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMpCisgICAgICAgICAgICB9OworICAgICAgICAgICAgX2FuYWx5c2VyLkFuYWx5emUoaW5wdXQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihGb3JtYXRFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dFeGNlcHRpb25JZlBhcmVudGhlc2VzQXJlTm90V2VsbGZvcm1lZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBMaXN0PFRva2VuPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMSIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIisiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAorICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIF9hbmFseXNlci5BbmFseXplKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRQYXNzSWZTdHJpbmdJc1dlbGxmb3JtZWQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgTGlzdDxUb2tlbj4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiciLCBUb2tlblR5cGUuU3RyaW5nKSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oImFiYzEyMyIsIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSwKKyAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiciLCBUb2tlblR5cGUuU3RyaW5nKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIF9hbmFseXNlci5BbmFseXplKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRm9ybWF0RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRocm93RXhjZXB0aW9uSWZTdHJpbmdIYXNOb3RDbG9zaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IExpc3Q8VG9rZW4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCInIiwgVG9rZW5UeXBlLlN0cmluZyksCisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJhYmMxMjMiLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBfYW5hbHlzZXIuQW5hbHl6ZShpbnB1dCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dFeGNlcHRpb25JZlRoZXJlSXNBblVucmVjb2duaXplZFRva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IExpc3Q8VG9rZW4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFRva2VuKCJhYmMxMjMiLCBUb2tlblR5cGUuVW5yZWNvZ25pemVkKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIF9hbmFseXNlci5BbmFseXplKGlucHV0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5GYWN0b3J5VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkODM4NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeVRlc3RzLmNzCkBAIC0wLDAgKzEsMTcwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIFJoaW5vLk1vY2tzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVG9rZW5GYWN0b3J5VGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgSVRva2VuRmFjdG9yeSBfdG9rZW5GYWN0b3J5OworICAgICAgICBwcml2YXRlIElOYW1lVmFsdWVQcm92aWRlciBfbmFtZVZhbHVlUHJvdmlkZXI7CisKKworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9uYW1lVmFsdWVQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJTmFtZVZhbHVlUHJvdmlkZXI+KCk7CisgICAgICAgICAgICBfdG9rZW5GYWN0b3J5ID0gbmV3IFRva2VuRmFjdG9yeShjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBfbmFtZVZhbHVlUHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RDbGVhbnVwXQorICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKKyAgICAgICAgeworICAgICAgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlQVN0cmluZ1Rva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIlwiIjsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcIiIsIHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuU3RyaW5nLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZVBsdXNBc09wZXJhdG9yVG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiKyI7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiKyIsIHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlcmF0b3IsIHRva2VuLlRva2VuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlTWludXNBc09wZXJhdG9yVG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiLSI7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiLSIsIHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlcmF0b3IsIHRva2VuLlRva2VuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlTXVsdGlwbHlBc09wZXJhdG9yVG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiKiI7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiKiIsIHRva2VuLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlcmF0b3IsIHRva2VuLlRva2VuVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlRGl2aWRlQXNPcGVyYXRvclRva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIi8iOworICAgICAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuRmFjdG9yeS5DcmVhdGUoRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSwgaW5wdXQpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIi8iLCB0b2tlbi5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLk9wZXJhdG9yLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZUVxdWFsc0FzT3BlcmF0b3JUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9ICI9IjsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI9IiwgdG9rZW4uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVyYXRvciwgdG9rZW4uVG9rZW5UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDcmVhdGVJbnRlZ2VyQXNJbnRlZ2VyVG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiMjMiOworICAgICAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuRmFjdG9yeS5DcmVhdGUoRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSwgaW5wdXQpOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIzIiwgdG9rZW4uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5JbnRlZ2VyLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZUJvb2xlYW5Bc0Jvb2xlYW5Ub2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9ICJ0cnVlIjsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0cnVlIiwgdG9rZW4uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5Cb29sZWFuLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZURlY2ltYWxBc0RlY2ltYWxUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpbnB1dCA9ICIyMy4zIjsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMy4zIiwgdG9rZW4uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5EZWNpbWFsLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJlYWRGdW5jdGlvbnNGcm9tRnVuY1JlcG9zaXRvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiVGV4dCI7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkZ1bmN0aW9uLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXh0IiwgdG9rZW4uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZUV4Y2VsQWRkcmVzc0FzRXhjZWxBZGRyZXNzVG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaW5wdXQgPSAiQTEiOworICAgICAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuRmFjdG9yeS5DcmVhdGUoRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSwgaW5wdXQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5FeGNlbEFkZHJlc3MsIHRva2VuLlRva2VuVHlwZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgdG9rZW4uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZUV4Y2VsUmFuZ2VBc0V4Y2VsQWRkcmVzc1Rva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIkExOkIxNSI7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcywgdG9rZW4uVG9rZW5UeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QjE1IiwgdG9rZW4uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZUV4Y2VsUmFuZ2VPbk90aGVyU2hlZXRBc0V4Y2VsQWRkcmVzc1Rva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIndzIUExOkIxNSI7CisgICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcywgdG9rZW4uVG9rZW5UeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiV1MhQTE6QjE1IiwgdG9rZW4uVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZU5hbWVkVmFsdWVBc0V4Y2VsQWRkcmVzc1Rva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGlucHV0ID0gIk5hbWVkVmFsdWUiOworICAgICAgICAgICAgX25hbWVWYWx1ZVByb3ZpZGVyLlN0dWIoeCA9PiB4LklzTmFtZWRWYWx1ZSgiTmFtZWRWYWx1ZSIsIiIpKS5SZXR1cm4odHJ1ZSk7CisgICAgICAgICAgICBfbmFtZVZhbHVlUHJvdmlkZXIuU3R1Yih4ID0+IHguSXNOYW1lZFZhbHVlKCJOYW1lZFZhbHVlIiwgbnVsbCkpLlJldHVybih0cnVlKTsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmFtZVZhbHVlLCB0b2tlbi5Ub2tlblR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOYW1lZFZhbHVlIiwgdG9rZW4uVmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkhhbmRsZXJUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE3OTEwCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyVGVzdHMuY3MKQEAgLTAsMCArMSw0NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRva2VuSGFuZGxlclRlc3RzCisgICAgeworICAgICAgICBwcml2YXRlIFRva2VuaXplckNvbnRleHQgX3Rva2VuaXplckNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgVG9rZW5IYW5kbGVyIF9oYW5kbGVyOworCisgICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KKyAgICAgICAgcHVibGljIHZvaWQgSW5pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b2tlbml6ZXJDb250ZXh0ID0gbmV3IFRva2VuaXplckNvbnRleHQoInRlc3QiKTsKKyAgICAgICAgICAgIEluaXRIYW5kbGVyKF90b2tlbml6ZXJDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0SGFuZGxlcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOworICAgICAgICAgICAgdmFyIHRva2VuRmFjdG9yeSA9IG5ldyBUb2tlbkZhY3RvcnkocGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnksIG51bGwpOworICAgICAgICAgICAgX2hhbmRsZXIgPSBuZXcgVG9rZW5IYW5kbGVyKF90b2tlbml6ZXJDb250ZXh0LCB0b2tlbkZhY3RvcnksIG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCkpOyAKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIYXNNb3JlVG9rZW5zU2hvdWxkQmVUcnVlV2hlblRva2Vuc0V4aXN0cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoX2hhbmRsZXIuSGFzTW9yZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBIYXNNb3JlVG9rZW5zU2hvdWxkQmVGYWxzZVdoZW5BbGxBcmVIYW5kbGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCAidGVzdCIuTGVuZ3RoOyB4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9oYW5kbGVyLk5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKF9oYW5kbGVyLkhhc01vcmUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL05hbWVWYWx1ZVByb3ZpZGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL05hbWVWYWx1ZVByb3ZpZGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZDIxZAotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTmFtZVZhbHVlUHJvdmlkZXJUZXN0cy5jcwpAQCAtMCwwICsxLDc4IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBSaGluby5Nb2NrczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBOYW1lVmFsdWVQcm92aWRlclRlc3RzCisgICAgeworICAgICAgICAvL3ByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworCisgICAgICAgIC8vW1Rlc3RJbml0aWFsaXplXQorICAgICAgICAvL3B1YmxpYyB2b2lkIFNldHVwKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIF9leGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlTW9jazxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBJc05hbWVkVmFsdWVTaG91bGRSZXR1cm5UcnVlSWZLZXlJc0FOYW1lZFZhbHVlKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBkaWN0ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7CisgICAgICAgIC8vICAgIGRpY3QuQWRkKCJBIiwgIkIiKTsKKyAgICAgICAgLy8gICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFdvcmtib29rTmFtZVZhbHVlcygpKQorICAgICAgICAvLyAgICAgICAgLlJldHVybihkaWN0KTsKKyAgICAgICAgLy8gICAgdmFyIG5hbWVWYWx1ZVByb3ZpZGVyID0gbmV3IEVwcGx1c05hbWVWYWx1ZVByb3ZpZGVyKF9leGNlbERhdGFQcm92aWRlcik7CisKKyAgICAgICAgLy8gICAgdmFyIHJlc3VsdCA9IG5hbWVWYWx1ZVByb3ZpZGVyLklzTmFtZWRWYWx1ZSgiQSIpOworICAgICAgICAvLyAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7CisgICAgICAgIC8vfQorCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vcHVibGljIHZvaWQgSXNOYW1lZFZhbHVlU2hvdWxkUmV0dXJuRmFsc2VJZktleUlzTm90QU5hbWVkVmFsdWUoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgdmFyIGRpY3QgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKKyAgICAgICAgLy8gICAgZGljdC5BZGQoIkEiLCAiQiIpOworICAgICAgICAvLyAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCkpCisgICAgICAgIC8vICAgICAgICAuUmV0dXJuKGRpY3QpOworICAgICAgICAvLyAgICB2YXIgbmFtZVZhbHVlUHJvdmlkZXIgPSBuZXcgRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKKworICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gbmFtZVZhbHVlUHJvdmlkZXIuSXNOYW1lZFZhbHVlKCJDIik7CisgICAgICAgIC8vICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIC8vfQorCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIC8vcHVibGljIHZvaWQgR2V0TmFtZWRWYWx1ZVNob3VsZFJldHVybkNvcnJlY3RWYWx1ZUlmS2V5RXhpc3RzKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBkaWN0ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7CisgICAgICAgIC8vICAgIGRpY3QuQWRkKCJBIiwgIkIiKTsKKyAgICAgICAgLy8gICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFdvcmtib29rTmFtZVZhbHVlcygpKQorICAgICAgICAvLyAgICAgICAgLlJldHVybihkaWN0KTsKKyAgICAgICAgLy8gICAgdmFyIG5hbWVWYWx1ZVByb3ZpZGVyID0gbmV3IEVwcGx1c05hbWVWYWx1ZVByb3ZpZGVyKF9leGNlbERhdGFQcm92aWRlcik7CisKKyAgICAgICAgLy8gICAgdmFyIHJlc3VsdCA9IG5hbWVWYWx1ZVByb3ZpZGVyLkdldE5hbWVkVmFsdWUoIkEiKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKCJCIiwgcmVzdWx0KTsKKyAgICAgICAgLy99CisKKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBSZWxvYWRTaG91bGRSZWxvYWREYXRhRnJvbUV4Y2VsRGF0YVByb3ZpZGVyKCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBkaWN0ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7CisgICAgICAgIC8vICAgIGRpY3QuQWRkKCJBIiwgIkIiKTsKKyAgICAgICAgLy8gICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFdvcmtib29rTmFtZVZhbHVlcygpKQorICAgICAgICAvLyAgICAgICAgLlJldHVybihkaWN0KTsKKyAgICAgICAgLy8gICAgdmFyIG5hbWVWYWx1ZVByb3ZpZGVyID0gbmV3IEVwcGx1c05hbWVWYWx1ZVByb3ZpZGVyKF9leGNlbERhdGFQcm92aWRlcik7CisKKyAgICAgICAgLy8gICAgdmFyIHJlc3VsdCA9IG5hbWVWYWx1ZVByb3ZpZGVyLkdldE5hbWVkVmFsdWUoIkEiKTsKKyAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKCJCIiwgcmVzdWx0KTsKKworICAgICAgICAvLyAgICBkaWN0LkNsZWFyKCk7CisgICAgICAgIC8vICAgIG5hbWVWYWx1ZVByb3ZpZGVyLlJlbG9hZCgpOworICAgICAgICAvLyAgICBBc3NlcnQuSXNGYWxzZShuYW1lVmFsdWVQcm92aWRlci5Jc05hbWVkVmFsdWUoIkEiKSk7CisgICAgICAgIC8vfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbnRleHRUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbnRleHRUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjNjYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29udGV4dFRlc3RzLmNzCkBAIC0wLDAgKzEsMjcgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nQ29udGV4dFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJhdGlvblNob3VsZEJlU2V0QnlGYWN0b3J5TWV0aG9kKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoY29udGV4dC5Db25maWd1cmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTY29wZXNTaG91bGRCZVNldEJ5RmFjdG9yeU1ldGhvZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGNvbnRleHQuU2NvcGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3BlVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDMyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZVRlc3RzLmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nU2NvcGVUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyIF9saWZlVGltZUV2ZW50SGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBQYXJzaW5nU2NvcGVzIF9wYXJzaW5nU2NvcGVzOworICAgICAgICBwcml2YXRlIFJhbmdlQWRkcmVzc0ZhY3RvcnkgX2ZhY3Rvcnk7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKKyAgICAgICAgICAgIF9mYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkocHJvdmlkZXIpOworICAgICAgICAgICAgX2xpZmVUaW1lRXZlbnRIYW5kbGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXI+KCk7CisgICAgICAgICAgICBfcGFyc2luZ1Njb3BlcyA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxQYXJzaW5nU2NvcGVzPihfbGlmZVRpbWVFdmVudEhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkU2V0QWRkcmVzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZEFkZHJlc3MgPSAgX2ZhY3RvcnkuQ3JlYXRlKCJBMSIpOworICAgICAgICAgICAgdmFyIHNjb3BlID0gbmV3IFBhcnNpbmdTY29wZShfcGFyc2luZ1Njb3BlcywgZXhwZWN0ZWRBZGRyZXNzKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZEFkZHJlc3MsIHNjb3BlLkFkZHJlc3MpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkU2V0UGFyZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhcmVudCA9IG5ldyBQYXJzaW5nU2NvcGUoX3BhcnNpbmdTY29wZXMsIF9mYWN0b3J5LkNyZWF0ZSgiQTEiKSk7CisgICAgICAgICAgICB2YXIgc2NvcGUgPSBuZXcgUGFyc2luZ1Njb3BlKF9wYXJzaW5nU2NvcGVzLCBwYXJlbnQsIF9mYWN0b3J5LkNyZWF0ZSgiQTIiKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGFyZW50LCBzY29wZS5QYXJlbnQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNjb3BlU2hvdWxkQ2FsbEtpbGxTY29wZU9uRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzY29wZSA9IG5ldyBQYXJzaW5nU2NvcGUoX3BhcnNpbmdTY29wZXMsIF9mYWN0b3J5LkNyZWF0ZSgiQTEiKSk7CisgICAgICAgICAgICAoKElEaXNwb3NhYmxlKXNjb3BlKS5EaXNwb3NlKCk7CisgICAgICAgICAgICBfcGFyc2luZ1Njb3Blcy5Bc3NlcnRXYXNDYWxsZWQoeCA9PiB4LktpbGxTY29wZShzY29wZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nU2NvcGVzVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3Blc1Rlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmNmNlNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3Blc1Rlc3QuY3MKQEAgLTAsMCArMSw3NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOworCituYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFBhcnNpbmdTY29wZXNUZXN0CisgICAgeworICAgICAgICBwcml2YXRlIFBhcnNpbmdTY29wZXMgX3BhcnNpbmdTY29wZXM7CisgICAgICAgIHByaXZhdGUgSVBhcnNpbmdMaWZldGltZUV2ZW50SGFuZGxlciBfbGlmZVRpbWVFdmVudEhhbmRsZXI7CisKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saWZlVGltZUV2ZW50SGFuZGxlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyPigpOworICAgICAgICAgICAgX3BhcnNpbmdTY29wZXMgPSBuZXcgUGFyc2luZ1Njb3BlcyhfbGlmZVRpbWVFdmVudEhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZWRTY29wZVNob3VsZEJlQ3VycmVudFNjb3BlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZSA9IF9wYXJzaW5nU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKF9wYXJzaW5nU2NvcGVzLkN1cnJlbnQsIHNjb3BlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDdXJyZW50U2NvcGVTaG91bGRIYW5kbGVOZXN0ZWRTY29wZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlMSA9IF9wYXJzaW5nU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKF9wYXJzaW5nU2NvcGVzLkN1cnJlbnQsIHNjb3BlMSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZTIgPSBfcGFyc2luZ1Njb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKF9wYXJzaW5nU2NvcGVzLkN1cnJlbnQsIHNjb3BlMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChfcGFyc2luZ1Njb3Blcy5DdXJyZW50LCBzY29wZTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChfcGFyc2luZ1Njb3Blcy5DdXJyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDdXJyZW50U2NvcGVTaG91bGRCZU51bGxXaGVuU2NvcGVIYXNUZXJtaW5hdGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZSA9IF9wYXJzaW5nU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSkpCisgICAgICAgICAgICB7IH0KKyAgICAgICAgICAgIEFzc2VydC5Jc051bGwoX3BhcnNpbmdTY29wZXMuQ3VycmVudCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTmV3U2NvcGVTaG91bGRTZXRQYXJlbnRPbkNyZWF0ZWRTY29wZUlmUGFyZW50U2NvcGVFeGlzdGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZTEgPSBfcGFyc2luZ1Njb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc2NvcGUyID0gX3BhcnNpbmdTY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChzY29wZTEsIHNjb3BlMi5QYXJlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMaWZldGltZUV2ZW50SGFuZGxlclNob3VsZEJlQ2FsbGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZSA9IF9wYXJzaW5nU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSkpCisgICAgICAgICAgICB7IH0KKyAgICAgICAgICAgIF9saWZlVGltZUV2ZW50SGFuZGxlci5Bc3NlcnRXYXNDYWxsZWQoeCA9PiB4LlBhcnNpbmdDb21wbGV0ZWQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9UZXN0SGVscGVycy9GdW5jdGlvbnNIZWxwZXIuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL1Rlc3RIZWxwZXJzL0Z1bmN0aW9uc0hlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDExY2ViCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9UZXN0SGVscGVycy9GdW5jdGlvbnNIZWxwZXIuY3MKQEAgLTAsMCArMSwyOSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBSaGluby5Nb2Nrcy5Db25zdHJhaW50czsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZ1bmN0aW9uc0hlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBDcmVhdGVBcmdzKHBhcmFtcyBvYmplY3RbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdC5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQoYXJnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gRW1wdHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKSB7bmV3IEZ1bmN0aW9uQXJndW1lbnQobnVsbCl9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Jc3N1ZXMuY3MgYi9FUFBsdXNUZXN0L0lzc3Vlcy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNjNTEzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Jc3N1ZXMuY3MKQEAgLTAsMCArMSw5OTUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5Mb2dnaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK3VzaW5nIFN5c3RlbS5EYXRhOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZTsKK3VzaW5nIFJoaW5vLk1vY2tzLkNvbnN0cmFpbnRzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgSXNzdWVzCisgICAgeworICAgICAgICBbVGVzdEluaXRpYWxpemVdCisgICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIURpcmVjdG9yeS5FeGlzdHMoQCJjOlxUZW1wIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShAImM6XFRlbXAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghRGlyZWN0b3J5LkV4aXN0cyhAImM6XFRlbXBcYnVnIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShAImM6XFRlbXBcYnVnIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MDUyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QTQiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICB3cy5DZWxsc1siQjE6QjQiXS5WYWx1ZSA9IDI7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWzEsIDEsIDQsIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMC4wMDtbUmVkXS0jLCMjMC4wMCI7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWzEsIDIsIDUsIDJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMDtbUmVkXS0jLCMjMCI7CisKKyAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcc3R5bGUueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTA0MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAyMDIxMDAwODM7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIwMFxcLjAwXFwuMDBcXC4wMDBcXC4wIjsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjAyLjAyLjEwLjAwOC4zIiwgd3MuQ2VsbHNbIkExIl0uVGV4dCk7CisgICAgICAgICAgICAgICAgd3MuRGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MDMxKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGQgPSBPZmZpY2VPcGVuWG1sLlV0aWxzLkNvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG5ldyBUaW1lU3BhbigzNSwgNTksIDEpKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSBkOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiW3RdOm1tOnNzIjsKKyAgICAgICAgICAgICAgICB3cy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUwMjIoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgICAgIHdzLkNlbGxzLkF1dG9GaXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIwIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxscy5BdXRvRml0Q29sdW1ucygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MDU2KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhdGggPSBAIkM6XHRlbXBcb3V0cHV0Lnhsc3giOworICAgICAgICAgICAgdmFyIGZpbGUgPSBuZXcgRmlsZUluZm8ocGF0aCk7CisgICAgICAgICAgICBmaWxlLkRlbGV0ZSgpOworICAgICAgICAgICAgdXNpbmcgKHZhciBlcCA9IG5ldyBFeGNlbFBhY2thZ2UoZmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHMgPSBlcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHMuQ2VsbHNbIkExOkEyIl0uRm9ybXVsYSA9ICIiOyAvLyBvciBudWxsLCBvciBub24tZW1wdHkgd2hpdGVzcGFjZSwgd2l0aCBzYW1lIHJlc3VsdAorICAgICAgICAgICAgICAgIGVwLlNhdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MDU4KCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLklPLkZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxvdXRwdXQueGxzeCIpOworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIGV4Y2VsUCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSk7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IGV4Y2VsUC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MDYzKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLklPLkZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdcVGFibGVGb3JtdWxhLnhsc3giKTsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBleGNlbFAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBleGNlbFAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdICAgICAgICAKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxMTIoKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uSU8uRmlsZUluZm8gY2FzZTEgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiYzpcdGVtcFxidWdcc3JjXHNyY1xEZWxldGVSb3dJc3N1ZVxUZW1wbGF0ZS54bHN4Iik7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoY2FzZTEpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgZmlyc3QuRGVsZXRlUm93KDUpOworICAgICAgICAgICAgcC5TYXZlQXMobmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAImM6XHRlbXBcYnVnXERlbGV0ZUNvbF9jYXNlMS54bHN4IikpOworICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgY2FzZTIgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiYzpcdGVtcFxidWdcc3JjMlxEZWxldGVSb3dJc3N1ZVxUZW1wbGF0ZS54bHN4Iik7CisgICAgICAgICAgICBwID0gbmV3IEV4Y2VsUGFja2FnZShjYXNlMik7CisgICAgICAgICAgICBmaXJzdCA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIGZpcnN0LkRlbGV0ZVJvdyg1KTsKKyAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBTeXN0ZW0uSU8uRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xEZWxldGVDb2xfY2FzZTIueGxzeCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTE4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IE9mZmljZU9wZW5YbWwuRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnT3V0cHV0Lnhsc3giKSwgbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcRGVsZXRlUm93SXNzdWVcVGVtcGxhdGUueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtib29rIHdvcmtCb29rID0gcGFja2FnZS5Xb3JrYm9vazsKKyAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0ID0gd29ya0Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbOSwgNiwgOSwgN10uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1s5LCA4XS5NZXJnZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkRlbGV0ZVJvdyg1KTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuRGVsZXRlQ29sdW1uKDUpOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5EZWxldGVDb2x1bW4oNSk7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkRlbGV0ZUNvbHVtbig1KTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuRGVsZXRlQ29sdW1uKDUpOworCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxMDkoKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uSU8uRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBTeXN0ZW0uSU8uRmlsZUluZm8oQCJDOlxUZW1wXGJ1Z1x0ZXN0MDEueGxzeCIpOworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIGV4Y2VsUCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSk7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IGV4Y2VsUC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpaNzUiLHdzLkRpbWVuc2lvbi5BZGRyZXNzKTsKKyAgICAgICAgICAgIGV4Y2VsUC5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdcdGVzdDAyLnhsc3giKTsKKyAgICAgICAgICAgIGV4Y2VsUCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSk7CisgICAgICAgICAgICB3cyA9IGV4Y2VsUC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBRjUwMSIsIHdzLkRpbWVuc2lvbi5BZGRyZXNzKTsKKyAgICAgICAgICAgIGV4Y2VsUC5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdcdGVzdDAzLnhsc3giKTsKKyAgICAgICAgICAgIGV4Y2VsUCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSk7CisgICAgICAgICAgICB3cyA9IGV4Y2VsUC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBRDQwNiIsIHdzLkRpbWVuc2lvbi5BZGRyZXNzKTsKKyAgICAgICAgICAgIGV4Y2VsUC5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxMjAoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcD1uZXcgRXhjZWxQYWNrYWdlKG5ldyBTeXN0ZW0uSU8uRmlsZUluZm8oQCJDOlxUZW1wXGJ1Z1xwcC54bHN4IikpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbInR1bV9saXN0ZSJdOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd1B2dCA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInB2dFNoZWV0Iik7CisgICAgICAgICAgICB2YXIgcHZTaCA9IHdQdnQuUGl2b3RUYWJsZXMuQWRkKHdQdnQuQ2VsbHNbIkI1Il0sIHdzLkNlbGxzW3dzLkRpbWVuc2lvbi5BZGRyZXNzLlRvU3RyaW5nKCldLCAicHZ0UyIpOworCisgICAgICAgICAgICAvL3AuU2F2ZSgpOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTEzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0Iik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICIgUGVyZm9ybWFuY2UgVXBkYXRlIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpIMSJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpIMSJdLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyQ29udGludW91czsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpIMSJdLlN0eWxlLkZvbnQuU2l6ZSA9IDE0OworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkgxIl0uU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5SZWQpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkgxIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcbWVyZ2UueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE0MSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFdvcmtzaGVldCBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxscy5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHMuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuV2hpdGUpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWzEsIDEsIDEsIDNdLlN0eWxlLkJvcmRlci5Cb3JkZXJBcm91bmQoRXhjZWxCb3JkZXJTdHlsZS5UaGluKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1sxLCA1LCAyLCA1XS5TdHlsZS5Cb3JkZXIuQm9yZGVyQXJvdW5kKEV4Y2VsQm9yZGVyU3R5bGUuVGhpbik7CisgICAgICAgICAgICAgICAgRXhjZWxDb2x1bW4gY29sdW1uID0gc2hlZXQuQ29sdW1uKDMpOyAvLyBmYWlscyB3aXRoIGV4Y2VwdGlvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNDUoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBTeXN0ZW0uSU8uRmlsZUluZm8oQCJDOlxUZW1wXGJ1Z1xDb2x1bW5JbnNlcnQueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgICAgICB3cy5JbnNlcnRDb2x1bW4oMTIsMyk7CisgICAgICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDMwLDMpOworICAgICAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygzMSwxKTsKKyAgICAgICAgICAgICAgICB3cy5EZWxldGVDb2x1bW4oNywxKTsKKyAgICAgICAgICAgICAgICBwLlNhdmVBcyhuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdcSW5zZXJ0Q29weUZhaWwueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTUwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQ2xlYXJJc3N1ZS54bHN4Iik7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgb3V0cHV0ID0gQCJjOlx0ZW1wXGJ1Z1xDbGVhcklzc3VlU2F2ZS54bHN4IjsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKHRlbXBsYXRlLCBmYWxzZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkEyOkMzIl0uVmFsdWUgPSAiVGVzdCI7CisgICAgICAgICAgICAgICAgdmFyIGMgPSB3cy5DZWxsc1siQjI6QjMiXTsKKyAgICAgICAgICAgICAgICBjLkNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhvdXRwdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNDYoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xDb3B5RmFpbC54bHN4Iik7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgb3V0cHV0ID0gQCJjOlx0ZW1wXGJ1Z1xDb3B5RmFpbC1TYXZlLnhsc3giOworCisgICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UodGVtcGxhdGUsIGZhbHNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1szXTsKKworICAgICAgICAgICAgICAgIC8vd3MuSW5zZXJ0Q29sdW1uKDMsIDEpOworICAgICAgICAgICAgICAgIEN1c3RvbUNvbHVtbkluc2VydCh3cywgMywgMSk7CisKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhvdXRwdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDdXN0b21Db2x1bW5JbnNlcnQoRXhjZWxXb3Jrc2hlZXQgd3MsIGludCBjb2x1bW4sIGludCBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgdmFyIHNvdXJjZSA9IHdzLkNlbGxzWzEsIGNvbHVtbiwgd3MuRGltZW5zaW9uLkVuZC5Sb3csIHdzLkRpbWVuc2lvbi5FbmQuQ29sdW1uXTsKKyAgICAgICAgdmFyIGRlc3QgPSB3cy5DZWxsc1sxLCBjb2x1bW4gKyBjb2x1bW5zLCB3cy5EaW1lbnNpb24uRW5kLlJvdywgd3MuRGltZW5zaW9uLkVuZC5Db2x1bW4gKyBjb2x1bW5zXTsKKyAgICAgICAgc291cmNlLkNvcHkoZGVzdCk7CisgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTEyMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidCIpOworICAgICAgICAgICAgdXNpbmcgKHZhciBkdCA9IG5ldyBEYXRhVGFibGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiU3RyaW5nIiwgdHlwZW9mKHN0cmluZykpOworICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJJbnQiLCB0eXBlb2YoaW50KSk7CisgICAgICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkJvb2wiLCB0eXBlb2YoYm9vbCkpOworICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJEb3VibGUiLCB0eXBlb2YoZG91YmxlKSk7CisgICAgICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkRhdGUiLCB0eXBlb2YoRGF0ZVRpbWUpKTsKKworICAgICAgICAgICAgICAgIHZhciBkciA9IGR0Lk5ld1JvdygpOworCSAgICAgICAgICAgICAgICAgZHJbMF0gPSAiUm93MSI7CisJICAgICAgICAgICAgICAgICBkclsxXSA9IDE7CisJICAgICAgICAgICAgICAgICBkclsyXSA9IHRydWU7CisJICAgICAgICAgICAgICAgICBkclszXSA9IDEuNTsKKyAgICAgICAgICAgICAgICAgICAgIGRyWzRdID0gbmV3IERhdGVUaW1lKDIwMTQsIDEyLCAzMCk7CisJICAgICAgICAgICAgICAgICBkdC5Sb3dzLkFkZChkcik7CisJICAKKwkgICAgICAgICAgICAgICAgIGRyID0gZHQuTmV3Um93KCk7CisJICAgICAgICAgICAgICAgICBkclswXSA9ICJSb3cyIjsKKwkgICAgICAgICAgICAgICAgIGRyWzFdID0gMjsKKwkgICAgICAgICAgICAgICAgIGRyWzJdID0gZmFsc2U7CisJICAgICAgICAgICAgICAgICBkclszXSA9IDIuMjU7CisgICAgICAgICAgICAgICAgICAgICBkcls0XSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxMiwgMzEpOworCSAgICAgICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tRGF0YVRhYmxlKGR0LHRydWUpOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJEMjpEMyJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiKCogIywjIzAuMDApO18oKiAoIywjIzAuMDApO18oKiBcIi1cIj8/Xyk7KEApIjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siRTI6RTMiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tL2RkL3l5eXkiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzLkF1dG9GaXRDb2x1bW5zKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKHdzLkNlbGxzWzIsIDVdLlRleHQsIiIpOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTEyOCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidCIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWU9MTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMiJdLkZvcm11bGEgPSAiQTErJEIkMSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5WYWx1ZSA9ICJUZXN0IjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpCMiJdLkNvcHkod3MuQ2VsbHNbIkMxIl0pOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uQ29weSh3cy5DZWxsc1siRDEiXSk7CisgICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xjb3B5Lnhsc3giKSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWVNZXJnZWRDZWxscygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidCIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkE1LEMxOkM4Il0uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkMxOkM4Il0uTWVyZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBOCJdLk1lcmdlID0gZmFsc2U7CisgICAgICAgICAgICBwLkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE1OCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXE91dHB1dC54bHN4IiksIG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXERlbGV0ZUNvbEZvcm11bGFcRm9ybXVsYXNJc3N1ZVxkZW1vLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxXb3JrYm9vayB3b3JrQm9vayA9IHBhY2thZ2UuV29ya2Jvb2s7CisgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gd29ya0Jvb2suV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgICAgIC8vc3RyaW5nIGNvbHVtbiA9IENvbHVtbkluZGV4VG9Db2x1bW5MZXR0ZXIoMjgpOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5EZWxldGVDb2x1bW4oMjgpOworCisgICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldC5DZWxsc1siQUExOSJdLkZvcm11bGEgIT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0aGlzIGNlbGwgc2hvdWxkIG5vdCBoYXZlIGZvcm11bGEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBjbHMxCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJvcDEgeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIGNsczIgOiBjbHMxCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvcDIgeyBnZXQ7IHNldDsgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMb2FkRnJvbUNvbElzc3VlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGwgPSBuZXcgTGlzdDxjbHMxPigpOworCisgICAgICAgICAgICB2YXIgYzIgPSBuZXcgY2xzMigpIHtwcm9wMT0xLCBwcm9wMj0idGVzdDEifTsKKyAgICAgICAgICAgIGwuQWRkKGMyKTsKKworICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsLCB0cnVlLCBUYWJsZVN0eWxlcy5MaWdodDE2LCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UgfCBCaW5kaW5nRmxhZ3MuUHVibGljLAorICAgICAgICAgICAgICAgIG5ldyBNZW1iZXJJbmZvW10ge3R5cGVvZihjbHMyKS5HZXRQcm9wZXJ0eSgicHJvcDIiKX0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNjgoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWzEsIDFdLlZhbHVlID0gIkExIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1syLCAxXS5WYWx1ZSA9ICJBMiI7CisKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1syLCAxXS5WYWx1ZSA9IHdzLkNlbGxzWzEsIDFdLlZhbHVlOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCB3cy5DZWxsc1sxLCAxXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNTkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZnMgPSBuZXcgRmlsZVN0cmVhbShAIkM6XHRlbXBcYnVnXERlbGV0ZUNvbEZvcm11bGFcRm9ybXVsYXNJc3N1ZVxkZW1vLnhsc3giLCBGaWxlTW9kZS5PcGVuT3JDcmVhdGUpOworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IE9mZmljZU9wZW5YbWwuRXhjZWxQYWNrYWdlKGZzKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgdmFyIGZzMiA9IGZzOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTc5KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IE9mZmljZU9wZW5YbWwuRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTWVyZ2VEZWxldGVCdWciKTsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siRTM6RjMiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkUzOkYzIl0uTWVyZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3cy5EZWxldGVSb3coMiwgNik7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAwOworICAgICAgICAgICAgICAgIHZhciBzID0gd3MuQ2VsbHNbIkExIl0uVmFsdWUuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTY5KCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gZmlsZUluZm8gPSBuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xpc3N1ZVxpbnB1dC54bHN4Iik7CisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBleGNlbFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGVJbmZvKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgc2hlZXROYW1lID0gIkxhYm91ciBDb3N0cyI7CisKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3NoZWV0TmFtZV07CisgICAgICAgICAgICAgICAgZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRGVsZXRlKHdzKTsKKworICAgICAgICAgICAgICAgIHdzID0gZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKHNoZWV0TmFtZSk7CisKKyAgICAgICAgICAgICAgICBleGNlbFBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXGlzc3VlXG91dHB1dDIueGxzeCIpKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE3MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcYm9vazIueGxzeCIpOworCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaWxlSW5mbyk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiSUYoJFIxMD49WCQyLDEsMCkiLCB3cy5DZWxsc1siWDEwIl0uRm9ybXVsYSk7CisgICAgICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBELHdzLkNlbGxzWyJYMTAiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNzQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXE15VGVtcGxhdGUueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uQ29sdW1uKDIpLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiZGQvbW0veXl5eSI7CisKKyAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xNeVRlbXBsYXRlMi54bHN4IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQaWN0dXJlSXNzdWUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInQiKTsKKyAgICAgICAgICAgIHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlRlc3QiLCBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1wyMTUyMjI4LmpwZyIpKTsKKyAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHBpYy54bHN4IikpOworICAgICAgICB9CisKKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTQ5ODgoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZ3VpZCA9IEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCJOIik7CisgICAgICAgICAgICB1c2luZyAodmFyIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKEAiQzpcdGVtcFwiICsgZ3VpZCArICIueGxzeCIsIEZpbGVNb2RlLkNyZWF0ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKEAiQzpcdGVtcFxidWcyLnhsc3giLCBGaWxlTW9kZS5PcGVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2Uob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSwgIlRlc3QiKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCBlbXB0eSIpOworICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiVGVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLkVuY3J5cHRpb24uUGFzc3dvcmQgPSAiVGVzdDIiOworICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdGVzdDIueGxzeCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNzNfMSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEVQUGx1c0lzc3Vlc1xFeGNlbDAxLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgICAgIC8vcGNrLldvcmtib29rLkZvcm11bGFQYXJzZXIuQ29uZmlndXJlKHggPT4geC5BdHRhY2hMb2dnZXIoTG9nZ2VyRmFjdG9yeS5DcmVhdGVUZXh0RmlsZUxvZ2dlcihuZXcgRmlsZUluZm8oQCJjOlxUZW1wXGxvZzEudHh0IikpKSk7CisgICAgICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIwTDIzMDAiLCB3cy5DZWxsc1siRjQiXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMEsyRTAxIiwgd3MuQ2VsbHNbIkY1Il0uVmFsdWUpOworICAgICAgICAgICAgICAgIHZhciBmN1ZhbCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJNT0RFTExPLVRJUE8gUEFOTkVMTE8iXS5DZWxsc1siRjciXS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTMuNDQ1NDE5LCBNYXRoLlJvdW5kKChkb3VibGUpIGY3VmFsLCA2KSk7CisgICAgICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHN3LkVsYXBzZWQuVG90YWxTZWNvbmRzKTsgLy8gYXBwcm94LiAxMCBzZWNvbmRzCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNzNfMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEVQUGx1c0lzc3Vlc1xFeGNlbDAyLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyLkNvbmZpZ3VyZSh4ID0+IHguQXR0YWNoTG9nZ2VyKExvZ2dlckZhY3RvcnkuQ3JlYXRlVGV4dEZpbGVMb2dnZXIobmV3IEZpbGVJbmZvKEAiYzpcVGVtcFxsb2cxLnR4dCIpKSkpOworICAgICAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAvL3dzLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIwTDIzMDAiLCB3cy5DZWxsc1siRjQiXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMEsyRTAxIiwgd3MuQ2VsbHNbIkY1Il0uVmFsdWUpOworICAgICAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShzdy5FbGFwc2VkLlRvdGFsU2Vjb25kcyk7IC8vIGFwcHJveC4gMTAgc2Vjb25kcworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNTQoKQorICAgICAgICB7ICAgICAgICAgICAKKyAgICAgICAgICAgIERpcmVjdG9yeS5FbnVtZXJhdGVGaWxlcyhAImM6XHRlbXBcYnVnXENvbnN0cnVjdG9ySW52b2thdGlvbk5vdFRocmVhZFNhZmVcIikuQXNQYXJhbGxlbCgpLkZvckFsbChmaWxlID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9sb2NrIChfbG9jaykKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlU3RyZWFtKGZpbGUsIEZpbGVNb2RlLk9wZW4pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1sxLCAxXS5WYWx1ZSA9IGZpbGU7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXENvbnN0cnVjdG9ySW52b2thdGlvbk5vdFRocmVhZFNhZmVcbmV3XCIrbmV3IEZpbGVJbmZvKGZpbGUpLk5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTg4KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbig2KS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tL2RkL3l5eXkiOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNykuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS9kZC95eXl5IjsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDgpLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAibW0vZGQveXl5eSI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbigxMCkuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS9kZC95eXl5IjsKKworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1syLCA2XS5WYWx1ZSA9IERhdGVUaW1lLlRvZGF5OworICAgICAgICAgICAgICAgIHN0cmluZyBhID0gd29ya3NoZWV0LkNlbGxzWzIsNl0uVGV4dDsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGF0ZVRpbWUuVG9kYXkuVG9TdHJpbmcoIk1NL2RkL3l5eXkiKSwgYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE5NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xpMTUxOTQtU2F2ZS54bHN4IiksIG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEkxNTE5NC54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOworICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXQgPSB3b3JrQm9vay5Xb3Jrc2hlZXRzWzFdOworCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJFMzpGMyJdLk1lcmdlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuRGVsZXRlUm93KDIsIDYpOworCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE5NSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xpMTUxOTVfU2F2ZS54bHN4IiksIG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXGkxNTE5NS54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOworICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXQgPSB3b3JrQm9vay5Xb3Jrc2hlZXRzWzFdOworCisgICAgICAgICAgICAgICAgd29ya3NoZWV0Lkluc2VydENvbHVtbig4LCAyKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNDc4OCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xpMTUxOTVfU2F2ZS54bHN4IiksIG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEdldFdvcmtTaGVldFhtbEJhZC54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOworICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXQgPSB3b3JrQm9vay5Xb3Jrc2hlZXRzWzFdOworCisgICAgICAgICAgICAgICAgd29ya3NoZWV0Lkluc2VydENvbHVtbig4LCAyKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNjcoKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBmaWxlSW5mbyA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXERyYXdcaW5wdXQueGxzeCIpOworCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaWxlSW5mbyk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHNoZWV0TmFtZSA9ICJCb2FyZCBwYWNrIjsKKworICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbc2hlZXROYW1lXTsKKyAgICAgICAgICAgICAgICBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5EZWxldGUod3MpOworCisgICAgICAgICAgICAgICAgd3MgPSBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoc2hlZXROYW1lKTsKKworICAgICAgICAgICAgICAgIGV4Y2VsUGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcb3V0cHV0Lnhsc3giKSk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE5OCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xPdXRwdXQueGxzeCIpLCBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xkZW1vLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxXb3JrYm9vayB3b3JrQm9vayA9IHBhY2thZ2UuV29ya2Jvb2s7CisgICAgICAgICAgICAgICAgdmFyIHdvcmtzaGVldCA9IHdvcmtCb29rLldvcmtzaGVldHNbMV07CisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuRGVsZXRlUm93KDEyKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxMzQ5MigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xCdWcxMzQ5Mi54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOworICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXQgPSB3b3JrQm9vay5Xb3Jrc2hlZXRzWzFdOworCisgICAgICAgICAgICAgICAgdmFyIHJ0ID0gd29ya3NoZWV0LkNlbGxzWyJLMzEiXS5SaWNoVGV4dC5UZXh0OworCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE0OTY2KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xzc2lzXEZpbGVGcm9tUmVwb3J0aW5nU2VydmVyMjAxMi54bHN4IikpKQorICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHNzaXNcQ29ycnVwdGVkLnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTIwMCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGUuQ29weShAIkM6XHRlbXBcYnVnXEVQUGx1c1JhbmdlQ29weVRlc3RcRVBQbHVzUmFuZ2VDb3B5VGVzdFxpbnB1dC54bHN4IiwgQCJDOlx0ZW1wXGJ1Z1xFUFBsdXNSYW5nZUNvcHlUZXN0XEVQUGx1c1JhbmdlQ29weVRlc3Rcb3V0cHV0Lnhsc3giLCB0cnVlKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xFUFBsdXNSYW5nZUNvcHlUZXN0XEVQUGx1c1JhbmdlQ29weVRlc3Rcb3V0cHV0Lnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgc291cmNlUmFuZ2UgPSBzaGVldC5DZWxsc1sxLCAxLCAxLCAyXTsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0UmFuZ2UgPSBzaGVldC5DZWxsc1szLCAxLCAzLCAyXTsKKyAgICAgICAgICAgICAgICBzb3VyY2VSYW5nZS5Db3B5KHJlc3VsdFJhbmdlKTsKKworICAgICAgICAgICAgICAgIHNvdXJjZVJhbmdlID0gc2hlZXQuQ2VsbHNbMSwgMSwgMSwgN107CisgICAgICAgICAgICAgICAgcmVzdWx0UmFuZ2UgPSBzaGVldC5DZWxsc1s1LCAxLCA1LCA3XTsKKyAgICAgICAgICAgICAgICBzb3VyY2VSYW5nZS5Db3B5KHJlc3VsdFJhbmdlKTsgIC8vIFRoaXMgdGhyb3dzIFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbjogQ2FuJ3QgbWVyZ2UgYW5kIGFscmVhZHkgbWVyZ2VkIHJhbmdlCisKKyAgICAgICAgICAgICAgICBzb3VyY2VSYW5nZSA9IHNoZWV0LkNlbGxzWzEsIDEsIDEsIDddOworICAgICAgICAgICAgICAgIHJlc3VsdFJhbmdlID0gc2hlZXQuQ2VsbHNbNywgMywgNywgN107CisgICAgICAgICAgICAgICAgc291cmNlUmFuZ2UuQ29weShyZXN1bHRSYW5nZSk7ICAvLyBUaGlzIHRocm93cyBTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb246IENhbid0IG1lcmdlIGFuZCBhbHJlYWR5IG1lcmdlZCByYW5nZQorCisgICAgICAgICAgICAgICAgcC5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTIxMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzPSJfKFwiUiQgXCIqICMsIyMwLjAwXyk7XyhcIlIkIFwiKiAoIywjIzAuMDApO18oXCJSJCBcIiogXCItXCI/P18pO18oQF8pICkiOworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlN0eWxlQnVnIik7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSA1Njk4NjMzLjY0OworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSBzOworICAgICAgICAgICAgICAgIHZhciB0ID0gd3MuQ2VsbHNbIkExIl0uVGV4dDsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MjEzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xFeGNlbENsZWFyRGVtb1xleGNlbHRlc3RmaWxlLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdzIGluIHAuV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzWzEwMjMsIDEsIHdzLkRpbWVuc2lvbi5FbmQuUm93LTIsd3MuRGltZW5zaW9uLkVuZC5Db2x1bW5dLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbCh3cy5EaW1lbnNpb24sIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiBwLldvcmtib29rLldvcmtzaGVldHNbMl0uQ2VsbHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShjZWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcC5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcRXhjZWxDbGVhckRlbW9cZXhjZWx0ZXN0ZmlsZS1zYXZlLnhsc3giKSk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZXIxNTIxNygpCisgICAgICAgIHsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xGb3JtYXRSb3dDb2wueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJmbXQiKTsKKyAgICAgICAgICAgICAgICB3cy5Sb3coMSkuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgICAgIHdzLlJvdygxKS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdyYXkpOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpCMiJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICB3cy5Db2x1bW4oMSkuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJ5eXl5LW1tLWRkIGhoOm1tIjsKKyAgICAgICAgICAgICAgICB3cy5Db2x1bW4oMikuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICAgICAgcC5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWVyMTUyMjgoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiY29sQnVnIik7CisKKyAgICAgICAgICAgICAgICB2YXIgY29sID0gd3MuQ29sdW1uKDcpOworICAgICAgICAgICAgICAgIGNvbC5Db2x1bW5NYXggPSA4OworICAgICAgICAgICAgICAgIGNvbC5IaWRkZW4gPSB0cnVlOworCisgICAgICAgICAgICAgICAgdmFyIGNvbDggPSB3cy5Db2x1bW4oOCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRydWUsIGNvbDguSGlkZGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUyMzQoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXG1lcmdlMlxpbnB1dC54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworCisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZVJhbmdlID0gc2hlZXQuQ2VsbHNbIjE6NCJdOworCisgICAgICAgICAgICAgICAgc2hlZXQuSW5zZXJ0Um93KDUsIDQpOworCisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdFJhbmdlID0gc2hlZXQuQ2VsbHNbIjU6OCJdOworICAgICAgICAgICAgICAgIHNvdXJjZVJhbmdlLkNvcHkocmVzdWx0UmFuZ2UpOworCisgICAgICAgICAgICAgICAgcC5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIC8qKioqIFBpdm90dGFibGUgaXNzdWUgKioqKi8KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIG91dHB1dERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKEAiYzpcRXhjZWxQaXZvdFRlc3QiKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIE15RmlsZSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHBpdm90dGFibGUueGxzeCIpOworICAgICAgICAgICAgTG9hZERhdGEoTXlGaWxlKTsKKyAgICAgICAgICAgIEJ1aWxkUGl2b3RUYWJsZTEoTXlGaWxlKTsKKyAgICAgICAgICAgIEJ1aWxkUGl2b3RUYWJsZTIoTXlGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBMb2FkRGF0YShGaWxlSW5mbyBNeUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChNeUZpbGUuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE15RmlsZS5EZWxldGUoKTsgIC8vIGVuc3VyZXMgd2UgY3JlYXRlIGEgbmV3IHdvcmtib29rCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgRVAgPSBuZXcgRXhjZWxQYWNrYWdlKE15RmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgZW1wdHkgd29ya2Jvb2sKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3c0RhdGEgPSBFUC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGF0YSIpOworICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBoZWFkZXJzCisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWzEsIDFdLlZhbHVlID0gIklOVk9JQ0VfREFURSI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWzEsIDJdLlZhbHVlID0gIlRPVEFMX0lOVk9JQ0VfUFJJQ0UiOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1sxLCAzXS5WYWx1ZSA9ICJFWFRFTkRFRF9QUklDRV9WQVJJQU5DRSI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWzEsIDRdLlZhbHVlID0gIkFVRElUX0xJTkVfU1RBVFVTIjsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbMSwgNV0uVmFsdWUgPSAiUkVTT0xVVElPTl9TVEFUVVMiOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1sxLCA2XS5WYWx1ZSA9ICJDT1VOVCI7CisKKyAgICAgICAgICAgICAgICAvL0FkZCBzb21lIGl0ZW1zLi4uCisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJBMiJdLlZhbHVlID0gQ29udmVydC5Ub0RhdGVUaW1lKCIwNC8yLzIwMTIiKTsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzMy42MzsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkMyIl0uVmFsdWUgPSAoLS44Nyk7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJEMiJdLlZhbHVlID0gIlVuZmF2b3JhYmxlIFByaWNlIFZhcmlhbmNlIjsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkUyIl0uVmFsdWUgPSAiUGVuZGluZyI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJGMiJdLlZhbHVlID0gMTsKKworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQTMiXS5WYWx1ZSA9IENvbnZlcnQuVG9EYXRlVGltZSgiMDQvMi8yMDEyIik7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJCMyJdLlZhbHVlID0gNDMuMTQ7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJDMyJdLlZhbHVlID0gKC0xLjI5KTsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkQzIl0uVmFsdWUgPSAiVW5mYXZvcmFibGUgUHJpY2UgVmFyaWFuY2UiOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRTMiXS5WYWx1ZSA9ICJQZW5kaW5nIjsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkYzIl0uVmFsdWUgPSAxOworCisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJBNCJdLlZhbHVlID0gQ29udmVydC5Ub0RhdGVUaW1lKCIxMS84LzIwMTEiKTsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkI0Il0uVmFsdWUgPSA1NTsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkM0Il0uVmFsdWUgPSAoLTIuODcpOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRDQiXS5WYWx1ZSA9ICJVbmZhdm9yYWJsZSBQcmljZSBWYXJpYW5jZSI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJFNCJdLlZhbHVlID0gIlBlbmRpbmciOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRjQiXS5WYWx1ZSA9IDE7CisKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkE1Il0uVmFsdWUgPSBDb252ZXJ0LlRvRGF0ZVRpbWUoIjExLzgvMjAxMSIpOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQjUiXS5WYWx1ZSA9IDM4LjcyOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQzUiXS5WYWx1ZSA9ICgtNS4wMCk7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJENSJdLlZhbHVlID0gIlVuZmF2b3JhYmxlIFByaWNlIFZhcmlhbmNlIjsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkU1Il0uVmFsdWUgPSAiUGVuZGluZyI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJGNSJdLlZhbHVlID0gMTsKKworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQTYiXS5WYWx1ZSA9IENvbnZlcnQuVG9EYXRlVGltZSgiMy80LzIwMTEiKTsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkI2Il0uVmFsdWUgPSA3Ny40NDsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkM2Il0uVmFsdWUgPSAoLTEuNTUpOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRDYiXS5WYWx1ZSA9ICJVbmZhdm9yYWJsZSBQcmljZSBWYXJpYW5jZSI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJFNiJdLlZhbHVlID0gIlBlbmRpbmciOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRjYiXS5WYWx1ZSA9IDE7CisKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkE3Il0uVmFsdWUgPSBDb252ZXJ0LlRvRGF0ZVRpbWUoIjMvNC8yMDExIik7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJCNyJdLlZhbHVlID0gMTI3LjU1OworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQzciXS5WYWx1ZSA9ICgtMTAuNTApOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRDciXS5WYWx1ZSA9ICJVbmZhdm9yYWJsZSBQcmljZSBWYXJpYW5jZSI7CisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJFNyJdLlZhbHVlID0gIlBlbmRpbmciOworICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRjciXS5WYWx1ZSA9IDE7CisKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHJhbmdlID0gd3NEYXRhLkNlbGxzWzIsIDEsIDcsIDFdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS1kZC15eSI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzLkF1dG9GaXRDb2x1bW5zKDApOworICAgICAgICAgICAgICAgIEVQLlNhdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgQnVpbGRQaXZvdFRhYmxlMShGaWxlSW5mbyBNeUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKE15RmlsZSkpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB2YXIgd3NEYXRhID0gZXAuV29ya2Jvb2suV29ya3NoZWV0c1siRGF0YSJdOworICAgICAgICAgICAgICAgIHZhciB0b3RhbFJvd3MgPSB3c0RhdGEuRGltZW5zaW9uLkFkZHJlc3M7CisgICAgICAgICAgICAgICAgRXhjZWxSYW5nZSBkYXRhID0gd3NEYXRhLkNlbGxzW3RvdGFsUm93c107CisKKyAgICAgICAgICAgICAgICB2YXIgd3NBdWRpdFBpdm90ID0gZXAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpdm90MSIpOworCisgICAgICAgICAgICAgICAgdmFyIHBpdm90VGFibGUxID0gd3NBdWRpdFBpdm90LlBpdm90VGFibGVzLkFkZCh3c0F1ZGl0UGl2b3QuQ2VsbHNbIkE3OkMzMCJdLCBkYXRhLCAiUGl2b3RBdWRpdDEiKTsKKyAgICAgICAgICAgICAgICBwaXZvdFRhYmxlMS5Db2x1bUdyYW5kVG90YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2YXIgcm93RmllbGQgPSBwaXZvdFRhYmxlMS5Sb3dGaWVsZHMuQWRkKHBpdm90VGFibGUxLkZpZWxkc1siSU5WT0lDRV9EQVRFIl0pOworCisKKyAgICAgICAgICAgICAgICByb3dGaWVsZC5BZGREYXRlR3JvdXBpbmcoZURhdGVHcm91cEJ5LlllYXJzKTsKKyAgICAgICAgICAgICAgICB2YXIgeWVhckZpZWxkID0gcGl2b3RUYWJsZTEuRmllbGRzLkdldERhdGVHcm91cEZpZWxkKGVEYXRlR3JvdXBCeS5ZZWFycyk7CisgICAgICAgICAgICAgICAgeWVhckZpZWxkLk5hbWUgPSAiWWVhciI7CisKKyAgICAgICAgICAgICAgICB2YXIgcm93RmllbGQyID0gcGl2b3RUYWJsZTEuUm93RmllbGRzLkFkZChwaXZvdFRhYmxlMS5GaWVsZHNbIkFVRElUX0xJTkVfU1RBVFVTIl0pOworCisgICAgICAgICAgICAgICAgdmFyIFRvdGFsU3BlbmQgPSBwaXZvdFRhYmxlMS5EYXRhRmllbGRzLkFkZChwaXZvdFRhYmxlMS5GaWVsZHNbIlRPVEFMX0lOVk9JQ0VfUFJJQ0UiXSk7CisgICAgICAgICAgICAgICAgVG90YWxTcGVuZC5OYW1lID0gIlRvdGFsIFNwZW5kIjsKKyAgICAgICAgICAgICAgICBUb3RhbFNwZW5kLkZvcm1hdCA9ICIkIyMsIyMwIjsKKworCisgICAgICAgICAgICAgICAgdmFyIENvdW50SW52b2ljZVByaWNlID0gcGl2b3RUYWJsZTEuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWyJDT1VOVCJdKTsKKyAgICAgICAgICAgICAgICBDb3VudEludm9pY2VQcmljZS5OYW1lID0gIlRvdGFsIExpbmVzIjsKKyAgICAgICAgICAgICAgICBDb3VudEludm9pY2VQcmljZS5Gb3JtYXQgPSAiIyMsIyMwIjsKKworICAgICAgICAgICAgICAgIHBpdm90VGFibGUxLkRhdGFPblJvd3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlcC5TYXZlKCk7CisgICAgICAgICAgICAgICAgZXAuRGlzcG9zZSgpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBCdWlsZFBpdm90VGFibGUyKEZpbGVJbmZvIE15RmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBlcCA9IG5ldyBFeGNlbFBhY2thZ2UoTXlGaWxlKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHZhciB3c0RhdGEgPSBlcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJEYXRhIl07CisgICAgICAgICAgICAgICAgdmFyIHRvdGFsUm93cyA9IHdzRGF0YS5EaW1lbnNpb24uQWRkcmVzczsKKyAgICAgICAgICAgICAgICBFeGNlbFJhbmdlIGRhdGEgPSB3c0RhdGEuQ2VsbHNbdG90YWxSb3dzXTsKKworICAgICAgICAgICAgICAgIHZhciB3c0F1ZGl0UGl2b3QgPSBlcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGl2b3QyIik7CisKKyAgICAgICAgICAgICAgICB2YXIgcGl2b3RUYWJsZTEgPSB3c0F1ZGl0UGl2b3QuUGl2b3RUYWJsZXMuQWRkKHdzQXVkaXRQaXZvdC5DZWxsc1siQTc6QzMwIl0sIGRhdGEsICJQaXZvdEF1ZGl0MiIpOworICAgICAgICAgICAgICAgIHBpdm90VGFibGUxLkNvbHVtR3JhbmRUb3RhbHMgPSB0cnVlOworICAgICAgICAgICAgICAgIHZhciByb3dGaWVsZCA9IHBpdm90VGFibGUxLlJvd0ZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWyJJTlZPSUNFX0RBVEUiXSk7CisKKworICAgICAgICAgICAgICAgIHJvd0ZpZWxkLkFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkuWWVhcnMpOworICAgICAgICAgICAgICAgIHZhciB5ZWFyRmllbGQgPSBwaXZvdFRhYmxlMS5GaWVsZHMuR2V0RGF0ZUdyb3VwRmllbGQoZURhdGVHcm91cEJ5LlllYXJzKTsKKyAgICAgICAgICAgICAgICB5ZWFyRmllbGQuTmFtZSA9ICJZZWFyIjsKKworICAgICAgICAgICAgICAgIHZhciByb3dGaWVsZDIgPSBwaXZvdFRhYmxlMS5Sb3dGaWVsZHMuQWRkKHBpdm90VGFibGUxLkZpZWxkc1siQVVESVRfTElORV9TVEFUVVMiXSk7CisKKyAgICAgICAgICAgICAgICB2YXIgVG90YWxTcGVuZCA9IHBpdm90VGFibGUxLkRhdGFGaWVsZHMuQWRkKHBpdm90VGFibGUxLkZpZWxkc1siVE9UQUxfSU5WT0lDRV9QUklDRSJdKTsKKyAgICAgICAgICAgICAgICBUb3RhbFNwZW5kLk5hbWUgPSAiVG90YWwgU3BlbmQiOworICAgICAgICAgICAgICAgIFRvdGFsU3BlbmQuRm9ybWF0ID0gIiQjIywjIzAiOworCisKKyAgICAgICAgICAgICAgICB2YXIgQ291bnRJbnZvaWNlUHJpY2UgPSBwaXZvdFRhYmxlMS5EYXRhRmllbGRzLkFkZChwaXZvdFRhYmxlMS5GaWVsZHNbIkNPVU5UIl0pOworICAgICAgICAgICAgICAgIENvdW50SW52b2ljZVByaWNlLk5hbWUgPSAiVG90YWwgTGluZXMiOworICAgICAgICAgICAgICAgIENvdW50SW52b2ljZVByaWNlLkZvcm1hdCA9ICIjIywjIzAiOworCisgICAgICAgICAgICAgICAgcGl2b3RUYWJsZTEuRGF0YU9uUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVwLlNhdmUoKTsKKyAgICAgICAgICAgICAgICBlcC5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyBzdHJpbmcgSXNzdWUxNTI0NyhEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gdGVtcGxhdGVGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXGRpYWdvbmFsLnhsc3giKTsKKyAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlRGlhZ29uYWwueGxzeCIpOworICAgICAgICAgICAgaWYgKG5ld0ZpbGUuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0ZpbGUuRGVsZXRlKCk7ICAvLyBlbnN1cmVzIHdlIGNyZWF0ZSBhIG5ldyB3b3JrYm9vaworICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlRGlhZ29uYWwueGxzeCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlLCB0ZW1wbGF0ZUZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vT3BlbiB3b3Jrc2hlZXQgMQorICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgICAgIERlYnVnLldyaXRlTGluZSh3b3Jrc2hlZXQuQ2VsbHNbIkExIl0uU3R5bGUuQm9yZGVyLkRpYWdvbmFsVXApOworICAgICAgICAgICAgICAgIERlYnVnLldyaXRlTGluZSh3b3Jrc2hlZXQuQ2VsbHNbIkExIl0uU3R5bGUuQm9yZGVyLkRpYWdvbmFsRG93bik7CisKKworICAgICAgICAgICAgICAgIC8vd29ya3NoZWV0LkNlbGxzWyJBMSJdLlN0eWxlLkJvcmRlci5EaWFnb25hbFVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvL3dvcmtzaGVldC5DZWxsc1siQTEiXS5TdHlsZS5Cb3JkZXIuRGlhZ29uYWxEb3duID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIC8vIHNhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIGlzc3VlMTUyNDkoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyh2YXIgZXhmaWxlPW5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQm9sZHRleHRjb3B5Lnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhmaWxlLldvcmtib29rLldvcmtzaGVldHMuQ29weSgic2hlZXQxIiwiY29waWVkU2hlZXQiKTsKKyAgICAgICAgICAgICAgICBleGZpbGUuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEJvbGR0ZXh0Y29weTIueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBpc3N1ZTE1MzAwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBleGZpbGUgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXGhlYWRmb290cGljLnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhmaWxlLldvcmtib29rLldvcmtzaGVldHMuQ29weSgic2hlZXQxIiwiY29waWVkU2hlZXQiKTsKKyAgICAgICAgICAgICAgICBleGZpbGUuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXGhlYWRmb290cGljX3NhdmUueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIGlzc3VlMTUyOTUoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIGV4ZmlsZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdccGl2b3QgaXNzdWVcaW5wdXQueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleGZpbGUuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXHBpdm90IGlzc3VlXHBpdm90Y29sZHVwLnhsc3giKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBpc3N1ZTE1MjgyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBleGZpbGUgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXHBpdm90dGFibGUtdGFibGUueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleGZpbGUuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXHBpdm90IGlzc3VlXHBpdm90dGFiLXRhYi1zYXZlLnhsc3giKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIElzc3VlczE0Njk5KCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhzdHJpbmcuRm9ybWF0KCJjOlxcdGVtcFxcYnVnXFxFUFBsdXNfSXNzdWUxNDY5OS54bHN4IiwgU3lzdGVtLklPLkRpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpKTsKKyAgICAgICAgICAgIE9mZmljZU9wZW5YbWwuRXhjZWxQYWNrYWdlIHBrZyA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSk7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3a3NoZWV0ID0gcGtnLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJc3N1ZTE0Njk5Iik7CisgICAgICAgICAgICAvLyBJbml0aWFsaXplIGEgc21hbGwgcmFuZ2UKKyAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IDExOyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAxOyBjb2wgPCAxMTsgY29sKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3a3NoZWV0LkNlbGxzW3JvdywgY29sXS5WYWx1ZSA9IHN0cmluZy5Gb3JtYXQoInswfXsxfSIsICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiJbY29sIC0gMV0sIHJvdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2tzaGVldC5WaWV3LkZyZWV6ZVBhbmVzKDMsIDMpOworICAgICAgICAgICAgcGtnLlNhdmUoKTsKKworICAgICAgICB9CisgICAgfQorfSAgICAKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvTG9hZEZyb21Db2xsZWN0aW9uVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0xvYWRGcm9tQ29sbGVjdGlvblRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMmYyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L0xvYWRGcm9tQ29sbGVjdGlvblRlc3RzLmNzCkBAIC0wLDAgKzEsMTAxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlOwordXNpbmcgUmhpbm8uTW9ja3M7Cit1c2luZyBSaGluby5Nb2Nrcy5Db25zdHJhaW50czsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBMb2FkRnJvbUNvbGxlY3Rpb25UZXN0cworICAgIHsKKyAgICAgICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgQmFzZUNsYXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgSWQgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGNsYXNzIEltcGxlbWVudGF0aW9uIDogQmFzZUNsYXNzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTnVtYmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIGNsYXNzIEFjbGFzcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIElkIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IE51bWJlciB7IGdldDsgc2V0OyB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVXNlQWNsYXNzUHJvcGVydGllcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IG5ldyBMaXN0PEFjbGFzcz4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBBY2xhc3MoKXsgSWQgPSAiMTIzIiwgTmFtZSA9ICJJdGVtIDEiLCBOdW1iZXIgPSAzfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgic2hlZXQiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oaXRlbXMsIHRydWUsIFRhYmxlU3R5bGVzLkRhcmsxKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiSWQiLCBzaGVldC5DZWxsc1siQzEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVXNlQmFzZUNsYXNzUHJvcGVydGllcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IG5ldyBMaXN0PEJhc2VDbGFzcz4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBJbXBsZW1lbnRhdGlvbigpeyBJZCA9ICIxMjMiLCBOYW1lID0gIkl0ZW0gMSIsIE51bWJlciA9IDN9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihpdGVtcywgdHJ1ZSwgVGFibGVTdHlsZXMuRGFyazEpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJJZCIsIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRVc2VBbm9ueW1vdXNQcm9wZXJ0aWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG9ianMgPSBuZXcgTGlzdDxCYXNlQ2xhc3M+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgSW1wbGVtZW50YXRpb24oKXsgSWQgPSAiMTIzIiwgTmFtZSA9ICJJdGVtIDEiLCBOdW1iZXIgPSAzfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IG9ianMuU2VsZWN0KHggPT4gbmV3IHtJZCA9IHguSWQsIE5hbWUgPSB4Lk5hbWV9KS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgic2hlZXQiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oaXRlbXMsIHRydWUsIFRhYmxlU3R5bGVzLkRhcmsxKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiSWQiLCBzaGVldC5DZWxsc1siQzEiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZENhc3RFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dJbnZhbGlkQ2FzdEV4Y2VwdGlvbklmKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIG9ianMgPSBuZXcgTGlzdDxCYXNlQ2xhc3M+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgSW1wbGVtZW50YXRpb24oKXsgSWQgPSAiMTIzIiwgTmFtZSA9ICJJdGVtIDEiLCBOdW1iZXIgPSAzfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZhciBpdGVtcyA9IG9ianMuU2VsZWN0KHggPT4gbmV3IHsgSWQgPSB4LklkLCBOYW1lID0geC5OYW1lIH0pLlRvTGlzdCgpOworICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldCIpOworICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihpdGVtcywgdHJ1ZSwgVGFibGVTdHlsZXMuRGFyazEsIEJpbmRpbmdGbGFncy5QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UsIHR5cGVvZihzdHJpbmcpLkdldE1lbWJlcnMoKSk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIklkIiwgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL0VQUGx1c1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxMjU4NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzNSBAQAor77u/dXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRXhjZWxQYWNrYWdlVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFUFBsdXMgVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIEphbiBLw6RsbG1hbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbmV0cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjkxNzk3N2QyLTViMjAtNDhlNy1iMDFjLWY1ZGJkOWU3NmI5OSIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvUmVzb3VyY2VzLkRlc2lnbmVyLmNzIGIvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmY5MzYxCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcwpAQCAtMCwwICsxLDczIEBACivvu78vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gPGF1dG8tZ2VuZXJhdGVkPgorLy8gICAgIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgdG9vbC4KKy8vICAgICBSdW50aW1lIFZlcnNpb246NC4wLjMwMzE5LjE4NDQ0CisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLgorLy8gPC9hdXRvLWdlbmVyYXRlZD4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LlByb3BlcnRpZXMgeworICAgIHVzaW5nIFN5c3RlbTsKKyAgICAKKyAgICAKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgQSBzdHJvbmdseS10eXBlZCByZXNvdXJjZSBjbGFzcywgZm9yIGxvb2tpbmcgdXAgbG9jYWxpemVkIHN0cmluZ3MsIGV0Yy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBTdHJvbmdseVR5cGVkUmVzb3VyY2VCdWlsZGVyCisgICAgLy8gY2xhc3MgdmlhIGEgdG9vbCBsaWtlIFJlc0dlbiBvciBWaXN1YWwgU3R1ZGlvLgorICAgIC8vIFRvIGFkZCBvciByZW1vdmUgYSBtZW1iZXIsIGVkaXQgeW91ciAuUmVzWCBmaWxlIHRoZW4gcmVydW4gUmVzR2VuCisgICAgLy8gd2l0aCB0aGUgL3N0ciBvcHRpb24sIG9yIHJlYnVpbGQgeW91ciBWUyBwcm9qZWN0LgorICAgIFtnbG9iYWw6OlN5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGVBdHRyaWJ1dGUoIlN5c3RlbS5SZXNvdXJjZXMuVG9vbHMuU3Ryb25nbHlUeXBlZFJlc291cmNlQnVpbGRlciIsICI0LjAuMC4wIildCisgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzLkNvbXBpbGVyR2VuZXJhdGVkQXR0cmlidXRlKCldCisgICAgaW50ZXJuYWwgY2xhc3MgUmVzb3VyY2VzIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW47CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvIHJlc291cmNlQ3VsdHVyZTsKKyAgICAgICAgCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5Db2RlQW5hbHlzaXMuU3VwcHJlc3NNZXNzYWdlQXR0cmlidXRlKCJNaWNyb3NvZnQuUGVyZm9ybWFuY2UiLCAiQ0ExODExOkF2b2lkVW5jYWxsZWRQcml2YXRlQ29kZSIpXQorICAgICAgICBpbnRlcm5hbCBSZXNvdXJjZXMoKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgUmV0dXJucyB0aGUgY2FjaGVkIFJlc291cmNlTWFuYWdlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUoZ2xvYmFsOjpTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuQWR2YW5jZWQpXQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciBSZXNvdXJjZU1hbmFnZXIgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0LlJlZmVyZW5jZUVxdWFscyhyZXNvdXJjZU1hbiwgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciB0ZW1wID0gbmV3IGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIoIkVQUGx1c1Rlc3QuUHJvcGVydGllcy5SZXNvdXJjZXMiLCB0eXBlb2YoUmVzb3VyY2VzKS5Bc3NlbWJseSk7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFuID0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlTWFuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIE92ZXJyaWRlcyB0aGUgY3VycmVudCB0aHJlYWQncyBDdXJyZW50VUlDdWx0dXJlIHByb3BlcnR5IGZvciBhbGwKKyAgICAgICAgLy8vICAgcmVzb3VyY2UgbG9va3VwcyB1c2luZyB0aGlzIHN0cm9uZ2x5IHR5cGVkIHJlc291cmNlIGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlQXR0cmlidXRlKGdsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZVN0YXRlLkFkdmFuY2VkKV0KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIGdsb2JhbDo6U3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8gQ3VsdHVyZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUN1bHR1cmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHJlc291cmNlQ3VsdHVyZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgIExvb2tzIHVwIGEgbG9jYWxpemVkIHJlc291cmNlIG9mIHR5cGUgU3lzdGVtLkRyYXdpbmcuQml0bWFwLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgU3lzdGVtLkRyYXdpbmcuQml0bWFwIFRlc3QxIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgb2JqZWN0IG9iaiA9IFJlc291cmNlTWFuYWdlci5HZXRPYmplY3QoIlRlc3QxIiwgcmVzb3VyY2VDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChTeXN0ZW0uRHJhd2luZy5CaXRtYXApKG9iaikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5yZXN4IGIvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5yZXN4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTMyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvUmVzb3VyY2VzLnJlc3gKQEAgLTAsMCArMSwxMjQgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cm9vdD4KKyAgPCEtLSAKKyAgICBNaWNyb3NvZnQgUmVzWCBTY2hlbWEgCisgICAgCisgICAgVmVyc2lvbiAyLjAKKyAgICAKKyAgICBUaGUgcHJpbWFyeSBnb2FscyBvZiB0aGlzIGZvcm1hdCBpcyB0byBhbGxvdyBhIHNpbXBsZSBYTUwgZm9ybWF0IAorICAgIHRoYXQgaXMgbW9zdGx5IGh1bWFuIHJlYWRhYmxlLiBUaGUgZ2VuZXJhdGlvbiBhbmQgcGFyc2luZyBvZiB0aGUgCisgICAgdmFyaW91cyBkYXRhIHR5cGVzIGFyZSBkb25lIHRocm91Z2ggdGhlIFR5cGVDb252ZXJ0ZXIgY2xhc3NlcyAKKyAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdHlwZXMuCisgICAgCisgICAgRXhhbXBsZToKKyAgICAKKyAgICAuLi4gYWRvLm5ldC9YTUwgaGVhZGVycyAmIHNjaGVtYSAuLi4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InJlc21pbWV0eXBlIj50ZXh0L21pY3Jvc29mdC1yZXN4PC9yZXNoZWFkZXI+CisgICAgPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4yLjA8L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCAuLi48L3Jlc2hlYWRlcj4KKyAgICA8cmVzaGVhZGVyIG5hbWU9IndyaXRlciI+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VXcml0ZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCAuLi48L3Jlc2hlYWRlcj4KKyAgICA8ZGF0YSBuYW1lPSJOYW1lMSI+PHZhbHVlPnRoaXMgaXMgbXkgbG9uZyBzdHJpbmc8L3ZhbHVlPjxjb21tZW50PnRoaXMgaXMgYSBjb21tZW50PC9jb21tZW50PjwvZGF0YT4KKyAgICA8ZGF0YSBuYW1lPSJDb2xvcjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkNvbG9yLCBTeXN0ZW0uRHJhd2luZyI+Qmx1ZTwvZGF0YT4KKyAgICA8ZGF0YSBuYW1lPSJCaXRtYXAxIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0Ij4KKyAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHNlcmlhbGl6ZWQgLk5FVCBGcmFtZXdvcmsgb2JqZWN0XTwvdmFsdWU+CisgICAgPC9kYXRhPgorICAgIDxkYXRhIG5hbWU9Ikljb24xIiB0eXBlPSJTeXN0ZW0uRHJhd2luZy5JY29uLCBTeXN0ZW0uRHJhd2luZyIgbWltZXR5cGU9ImFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NCI+CisgICAgICAgIDx2YWx1ZT5bYmFzZTY0IG1pbWUgZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50aW5nIGEgYnl0ZSBhcnJheSBmb3JtIG9mIHRoZSAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KKyAgICAgICAgPGNvbW1lbnQ+VGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+CisgICAgPC9kYXRhPgorICAgICAgICAgICAgICAgIAorICAgIFRoZXJlIGFyZSBhbnkgbnVtYmVyIG9mICJyZXNoZWFkZXIiIHJvd3MgdGhhdCBjb250YWluIHNpbXBsZSAKKyAgICBuYW1lL3ZhbHVlIHBhaXJzLgorICAgIAorICAgIEVhY2ggZGF0YSByb3cgY29udGFpbnMgYSBuYW1lLCBhbmQgdmFsdWUuIFRoZSByb3cgYWxzbyBjb250YWlucyBhIAorICAgIHR5cGUgb3IgbWltZXR5cGUuIFR5cGUgY29ycmVzcG9uZHMgdG8gYSAuTkVUIGNsYXNzIHRoYXQgc3VwcG9ydCAKKyAgICB0ZXh0L3ZhbHVlIGNvbnZlcnNpb24gdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBhcmNoaXRlY3R1cmUuIAorICAgIENsYXNzZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoaXMgYXJlIHNlcmlhbGl6ZWQgYW5kIHN0b3JlZCB3aXRoIHRoZSAKKyAgICBtaW1ldHlwZSBzZXQuCisgICAgCisgICAgVGhlIG1pbWV0eXBlIGlzIHVzZWQgZm9yIHNlcmlhbGl6ZWQgb2JqZWN0cywgYW5kIHRlbGxzIHRoZSAKKyAgICBSZXNYUmVzb3VyY2VSZWFkZXIgaG93IHRvIGRlcGVyc2lzdCB0aGUgb2JqZWN0LiBUaGlzIGlzIGN1cnJlbnRseSBub3QgCisgICAgZXh0ZW5zaWJsZS4gRm9yIGEgZ2l2ZW4gbWltZXR5cGUgdGhlIHZhbHVlIG11c3QgYmUgc2V0IGFjY29yZGluZ2x5OgorICAgIAorICAgIE5vdGUgLSBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQgaXMgdGhlIGZvcm1hdCAKKyAgICB0aGF0IHRoZSBSZXNYUmVzb3VyY2VXcml0ZXIgd2lsbCBnZW5lcmF0ZSwgaG93ZXZlciB0aGUgcmVhZGVyIGNhbiAKKyAgICByZWFkIGFueSBvZiB0aGUgZm9ybWF0cyBsaXN0ZWQgYmVsb3cuCisgICAgCisgICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NAorICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIAorICAgICAgICAgICAgOiBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuQmluYXJ5LkJpbmFyeUZvcm1hdHRlcgorICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorICAgIAorICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LnNvYXAuYmFzZTY0CisgICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCisgICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5Tb2FwLlNvYXBGb3JtYXR0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKworICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQKKyAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaW50byBhIGJ5dGUgYXJyYXkgCisgICAgICAgICAgICA6IHVzaW5nIGEgU3lzdGVtLkNvbXBvbmVudE1vZGVsLlR5cGVDb252ZXJ0ZXIKKyAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKyAgICAtLT4KKyAgPHhzZDpzY2hlbWEgaWQ9InJvb3QiIHhtbG5zPSIiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4KKyAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgLz4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSI+CisgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGFkYXRhIj4KKyAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+CisgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6c3BhY2UiIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NlbWJseSI+CisgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKyAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbXNkYXRhOk9yZGluYWw9IjEiIC8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbXNkYXRhOk9yZGluYWw9IjIiIC8+CisgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbXNkYXRhOk9yZGluYWw9IjMiIC8+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iNCIgLz4KKyAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6c3BhY2UiIC8+CisgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNoZWFkZXIiPgorICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbXNkYXRhOk9yZGluYWw9IjEiIC8+CisgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPC94c2Q6ZWxlbWVudD4KKyAgPC94c2Q6c2NoZW1hPgorICA8cmVzaGVhZGVyIG5hbWU9InJlc21pbWV0eXBlIj4KKyAgICA8dmFsdWU+dGV4dC9taWNyb3NvZnQtcmVzeDwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPgorICAgIDx2YWx1ZT4yLjA8L3ZhbHVlPgorICA8L3Jlc2hlYWRlcj4KKyAgPHJlc2hlYWRlciBuYW1lPSJyZWFkZXIiPgorICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KKyAgPC9yZXNoZWFkZXI+CisgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj4KKyAgICA8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VXcml0ZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+CisgIDwvcmVzaGVhZGVyPgorICA8YXNzZW1ibHkgYWxpYXM9IlN5c3RlbS5XaW5kb3dzLkZvcm1zIiBuYW1lPSJTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkiIC8+CisgIDxkYXRhIG5hbWU9IlRlc3QxIiB0eXBlPSJTeXN0ZW0uUmVzb3VyY2VzLlJlc1hGaWxlUmVmLCBTeXN0ZW0uV2luZG93cy5Gb3JtcyI+CisgICAgPHZhbHVlPi4uXFJlc291cmNlc1xUZXN0MS5qcGc7U3lzdGVtLkRyYXdpbmcuQml0bWFwLCBTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2E8L3ZhbHVlPgorICA8L2RhdGE+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9SZWFkVGVtcGxhdGUuY3MgYi9FUFBsdXNUZXN0L1JlYWRUZW1wbGF0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYwNjEyCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9SZWFkVGVtcGxhdGUuY3MKQEAgLTAsMCArMSw1NzggQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgUmVhZFRlbXBsYXRlIC8vOiBUZXN0QmFzZQorICAgIHsKKyAgICAgICAgLy9bQ2xhc3NJbml0aWFsaXplKCldCisgICAgICAgIC8vcHVibGljIHN0YXRpYyB2b2lkIENsYXNzSW5pdChUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIC8vSW5pdEJhc2UoKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vW0NsYXNzQ2xlYW51cCgpXQorICAgICAgICAvL3B1YmxpYyBzdGF0aWMgdm9pZCBDbGFzc0NsZWFudXAoKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgLy9TYXZlV29ya3NoZWV0KCJXb3Jrc2hlZXQueGxzeCIpOworICAgICAgICAvL30KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCbGFua1N0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2Uoc3RyZWFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBlcmYiKTsKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmaWxlID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxBZGVub3ZpcmlkYWUgUHJvdG9jb2wueGxzeCIpOworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJHNCJdLlZhbHVlPTEyOworICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxBZGVub3ZpcmlkYWUgUHJvdG9jb2wyLnhsc3giKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWczKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHhsc1BhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYmlsbGluZ190ZW1wbGF0ZS54bHN4IikpOworICAgICAgICAgICAgRXhjZWxXb3JrYm9vayB4bHNXYiA9IHhsc1BhY2suV29ya2Jvb2s7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB4bHNTaGVldCA9IHhsc1diLldvcmtzaGVldHNbIkJpbGxpbmciXTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzIoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmlsZSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYm9vazIueGxzeCIpOworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiR29vZCIsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJBMSJdLlN0eWxlTmFtZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJHb29kIDIiLCBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQzEiXS5TdHlsZU5hbWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiTm90ZSIsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJHMTEiXS5TdHlsZU5hbWUpOworICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxBZGVub3ZpcmlkYWUgUHJvdG9jb2wyLnhsc3giKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbmRGb3JtYXREYXRhVmFsQnVnKCkKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGZpbGUgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNvbmRpLnhsc3giKTsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShmaWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZHYgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQTEiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICBkdi5Gb3JtdWxhLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICBkdi5Gb3JtdWxhMi5WYWx1ZSA9IDQ7CisgICAgICAgICAgICAgICAgZHYuT3BlcmF0b3IgPSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5lcXVhbDsKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY29uZGkyLnhsc3giKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEludGVybmFsWmlwKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy92YXIgZmlsZSA9IEAiYzpcdGVtcFxjb25kaS54bHN4IjsKKyAgICAgICAgICAgIC8vdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGluZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx0ZXN0Lnhsc3giKSk7CisKKyAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOworICAgICAgICAgICAgaWYgKHdvcmtCb29rICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAod29ya0Jvb2suV29ya3NoZWV0cy5Db3VudCA+IDApIC8vZmFpbHMgb24gdGhpcyBsaW5lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IHdvcmtzaGVldAorICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgY3VycmVudFdvcmtzaGVldCA9IHdvcmtCb29rLldvcmtzaGVldHMuRmlyc3QoKTsKKworICAgICAgICAgICAgdmFyIHJvd0NvdW50ID0gMTsKKyAgICAgICAgICAgIHZhciBsYXN0Um93ID0gY3VycmVudFdvcmtzaGVldC5EaW1lbnNpb24uRW5kLlJvdzsKKyAgICAgICAgICAgIHZhciBsYXN0Q29sdW1uID0gY3VycmVudFdvcmtzaGVldC5EaW1lbnNpb24uRW5kLkNvbHVtbjsKKyAgICAgICAgICAgIHdoaWxlIChyb3dDb3VudCA8PSBsYXN0Um93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbHVtbkNvdW50ID0gMTsKKyAgICAgICAgICAgIHZhciBsaW5lID0gIiI7CisgICAgICAgICAgICB3aGlsZSAoY29sdW1uQ291bnQgPD0gbGFzdENvbHVtbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGxpbmUgKz0gY3VycmVudFdvcmtzaGVldC5DZWxsc1tyb3dDb3VudCwgY29sdW1uQ291bnRdLlZhbHVlICsgInwiOworICAgICAgICAgICAgY29sdW1uQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVzLkFkZChsaW5lKTsKKyAgICAgICAgICAgIHJvd0NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWc1KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NccHJvdGVjdC54bHN4IikpOworCisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uUHJvdGVjdGlvbi5BbGxvd0luc2VydENvbHVtbnMgPSB0cnVlOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLlByb3RlY3Rpb24uU2V0UGFzc3dvcmQoInRlc3QiKTsKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NccHJvdGVjdG5ldy54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXDIuOSBidWdzXG91dG9mcmFuZ2VcZXJyb3IueGxzeCIpKTsKKworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLlByb3RlY3Rpb24uQWxsb3dJbnNlcnRDb2x1bW5zID0gdHJ1ZTsKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJ0ZXN0Iik7CisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXDIuOSBidWdzXGVycm9yLnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWc3KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICB1c2luZyAodmFyIHJuZyA9IHdzLkNlbGxzWyJBMSJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBydDEgPSBybmcuUmljaFRleHQuQWRkKCJURVhUMVxyXG4iKTsKKyAgICAgICAgICAgICAgICBydDEuQm9sZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcm5nLlN0eWxlLldyYXBUZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2YXIgcnQyPXJuZy5SaWNoVGV4dC5BZGQoIlRFWFQyIik7CisgICAgICAgICAgICAgICAgcnQyLkJvbGQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFwyLjkgYnVnc1xlcnJvci54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnOCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXDIuOSBidWdzXGJ1Z1xHZW5iYW5kIFNPIENyb3NzUmVmIFBob2VuaXgueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcm5nID0gd3MuQ2VsbHNbIkExIl0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJ0MSA9IHJuZy5SaWNoVGV4dC5BZGQoIlRFWFQxXHJcbiIpOworICAgICAgICAgICAgICAgIHJ0MS5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBybmcuU3R5bGUuV3JhcFRleHQgPSB0cnVlOworICAgICAgICAgICAgICAgIHZhciBydDIgPSBybmcuUmljaFRleHQuQWRkKCJURVhUMiIpOworICAgICAgICAgICAgICAgIHJ0Mi5Cb2xkID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NcYmlsbGluZ190ZW1wbGF0ZS54bHN4LmVycm9yIikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnOSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXENvdmVuYW50c0NoZWNrUmVwb3J0VGVtcGxhdGUueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NcbmV3X3QueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzEwKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcTW9kZWxfZ3JhcGhlc19NQlcueGxzbSIpKTsKKworICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJIVFRQX2RhdGEiXTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwod3MuQ2VsbHNbIkI0Il0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuSW5kZXhlZCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHdzLkNlbGxzWyJCNSJdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLkluZGV4ZWQpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnMTEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxzYW1wbGUueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHZhciBwY2syID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgcGNrMi5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIsIHdzKTsKKyAgICAgICAgICAgIHBjazIuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcU2FtcGxlTmV3Lnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRDb25kaXRpb25hbEZvcm1hdHRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjZjIueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5Db25kaXRpb25hbEZvcm1hdHRpbmdbNl0uVHlwZSwgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWwpOworICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjb25kRm9ybVRlc3QueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFN0eWxlQnVnKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYWNxdWlzaXRpb25zLTE5OTMtMi54bHN4IikpOworICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjb25kRm9ybVRlc3QueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFVSTCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1x1cmwueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY29uZEZvcm1UZXN0Lnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWROYW1lRXJyb3IoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxuYW1lczIueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcVGVzdFRhYmxlU2F2ZS54bHN4IikpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzEyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHRlc3Q0Lnhsc3giKSk7CisgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICAvL3dzLkNvbHVtbigwKS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWcyLnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWcxMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXG9yaWdpbmFsLnhsc3giKSk7CisgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07CisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZShuZXcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbENhbGN1bGF0aW9uT3B0aW9uKCkgeyBBbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgPSB0cnVlIH0pOworICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWcyLnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWcxNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29tbWVudCIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uQWRkQ29tbWVudCgiVGVzdCBhdiBrb21tZW50YXIiLCAiSiIpOworICAgICAgICAgICAgd3MuQ29tbWVudHMuUmVtb3ZlQXQoMCk7CisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xDb21tZW50VGVzdC54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnMTUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQ29sdW1uTWF4RXJyb3IueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHZhciBjb2wgPSB3cy5Db2x1bW4oMSk7CisgICAgICAgICAgICBjb2wuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgY29sLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7CisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1ZzIueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICAjcmVnaW9uICJUaHJlYWRpbmcgQ2VsbHN0b3JlIFRlc3QiCisgICAgICAgIHB1YmxpYyBpbnQgX3RocmVhZENvdW50PTA7CisgICAgICAgIEV4Y2VsUGFja2FnZSBfcGNrVGhyZWFkOworICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBUaHJlYWRpbmdUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3Bja1RocmVhZCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2tUaHJlYWQuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRocmVhZGluZyIpOworCisgICAgICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IDIwOyB0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRzPW5ldyBUaHJlYWRTdGF0ZShGaW5uaXNoZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cz13cywKKyAgICAgICAgICAgICAgICAgICAgU3RhcnRSb3c9MSsodCoxMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgUm93cz0xMDAwLCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB2YXIgdHN0YXJ0PW5ldyBUaHJlYWRTdGFydCh0cy5TdGFydExvYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIHRocmVhZCA9IG5ldyBUaHJlYWQodHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBfdGhyZWFkQ291bnQrKzsKKyAgICAgICAgICAgICAgICB0aHJlYWQuU3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgxID09IDEpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChfdGhyZWFkQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9wY2tUaHJlYWQuU2F2ZUFzKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXHRocmVhZC54bHN4IikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGhyZWFkLlNsZWVwKDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIEZpbm5pc2hlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF90aHJlYWRDb3VudC0tOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgY2xhc3MgVGhyZWFkU3RhdGUKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRocmVhZFN0YXRlKGNiRmluaXNoZWQgY2IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NiID0gY2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgd3MgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGludCBTdGFydFJvdyB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IFJvd3MgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgY2JGaW5pc2hlZCgpOworICAgICAgICAgICAgcHVibGljIGNiRmluaXNoZWQgX2NiOworICAgICAgICAgICAgcHVibGljIHZvaWQgU3RhcnRMb2FkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50IHJvdz1TdGFydFJvdztyb3c8U3RhcnRSb3crUm93cztyb3crKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDE7IGNvbCA8IDEwMDsgY29sKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFZhbHVlKHJvdyxjb2wsc3RyaW5nLkZvcm1hdCgicm93IHswfSBjb2wgezF9Iiwgcm93LGNvbCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9jYigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJbnZhbGlkVkJBKCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGluZmlsZT1AIkM6XHRlbXBcYnVnXEluZmlsZS54bHNtIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBvdXRmaWxlPUAiQzpcdGVtcFxidWdcT3V0ZmlsZS54bHNtIjsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBlcDsKKworICAgICAgICAgICAgdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLk9wZW5SZWFkKGluZmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKGZzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLk9wZW5Xcml0ZShvdXRmaWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcC5TYXZlQXMoZnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2luZyAoRmlsZVN0cmVhbSBmcyA9IEZpbGUuT3BlblJlYWQob3V0ZmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKGZzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLk9wZW5Xcml0ZShvdXRmaWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcC5TYXZlQXMoZnMpOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdHJlYW1UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciB0ZW1wbGF0ZVN0cmVhbSA9IEZpbGUuT3BlblJlYWQoQCJjOlx0ZW1wXHRocmVhZC54bHN4IikpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIG91dFN0cmVhbSA9IEZpbGUuT3BlbihAImM6XHRlbXBcc3RyZWFtT3V0Lnhsc3giLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlLCBGaWxlU2hhcmUuTm9uZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG91dFN0cmVhbSwgdGVtcGxhdGVTdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG1vcmUgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgdGVzdCgpCisgICAgICAgIHsgCisgICAgICAgICAgICBDcmVhdGVYbHN4U2hlZXQoQCJDOlx0ZW1wXGJ1Z1x0ZXN0NC54bHN4IiwgNCwgNCk7CisgICAgICAgICAgICBDcmVhdGVYbHN4U2hlZXQoQCJDOlx0ZW1wXGJ1Z1x0ZXN0MjUueGxzeCIsIDI1LCAyNSk7IAorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJMTUwMzgoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcMTUwMzgueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3M9cC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEkxNTAzOSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcMTUwMzkueGxzbSIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07CisKKyAgICAgICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1wxNTAzOS1zYXZlZC54bHNtIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJMTUwMzAoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIG5ld1BhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEkxNTAzMC54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3a0JrID0gbmV3UGFjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgICAgIHZhciBjZWxsID0gd2tCay5DZWxsc1siQTEiXTsKKyAgICAgICAgICAgICAgICBpZiAoY2VsbC5Db21tZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZWxsLkNvbW1lbnQuVGV4dCA9ICJIZWxsbyBlZGl0ZWQgY29tbWVudHMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdQYWNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1wxNTAzMC1zYXZlLnhsc3giKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEkxNTAxNCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQ2xhc3NpY1dpbmVDb21wYW55Lnhsc3giKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiU0ZGU2VjdGlvbkhlYWRpbmcwMCIsIHdzLkNlbGxzWzUsIDJdLlN0eWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEkxNTA0MygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcRVBQbHVzVGVzdFxFUFBsdXNUZXN0XEVQUGx1c1Rlc3RcZXhhbXBsZS54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgICAgICBwLldvcmtib29rLldvcmtzaGVldHMuQ29weSh3cy5OYW1lLCAiQ29weSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2UoKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXEdyaWRUb0V4Y2VsXzA1LTEyLTIwMTQueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gd3MuQ2VsbHNbMSw4NCwzLDg2XSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNlbGwuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIFNhdmVDb3JydXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1x0YWJsZXMueGxzeCIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07CisgICAgICAgICAgICAgICAgcC5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcY29yci54bHN4IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWQkFlcnJvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzOworICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworICAgICAgICAgICAgICAgIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgi0JPRgNCw0LTRg9C40YDQvtCy0LrQsCIpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHAyID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcDIuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgd3MyID0gcDIuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoItCT0YDQsNC00YPQuNGA0L7QstC60LAyIiwgd3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlJc3N1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGtnID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZpbGUgPSBSZWFkVGVtcGxhdGVGaWxlKEAiQzpcdGVtcFxidWdcU3RhY2tPdmVyZmxvd1xFUFBsdXNUZXN0XDIwMTQxMTIwXzAxXzMu5ZCE6IKh57Sv6KiI5pS257WQ6KGoICjlhbbku5bmoYjku7YpLnhsc3giKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIG1zID0gbmV3IFN5c3RlbS5JTy5NZW1vcnlTdHJlYW0odGVtcGxhdGVGaWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgdGVtcFBrZyA9IG5ldyBFeGNlbFBhY2thZ2UobXMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa2cuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIjIwMTQxMTIwXzAxXzMu5ZCE6IKh57Sv6KiI5pS257WQ6KGoICjlhbbku5bmoYjku7YpIiwgdGVtcFBrZy5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIEZpbGVTdHJlYW1TYXZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZzID0gRmlsZS5DcmVhdGUoQCJjOlx0ZW1wXGZzLnhsc3giKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGtnID0gbmV3IEV4Y2VsUGFja2FnZShmcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzPXBrZy5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICB2YXIgY29sPXdzLkNvbHVtbigxKTsKKyAgICAgICAgICAgICAgICBjb2wuT3V0bGluZUxldmVsID0gMTsKKyAgICAgICAgICAgICAgICBjb2wuQ29sdW1uTWF4ID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7CisgICAgICAgICAgICAgICAgY29sLkNvbHVtbk1heCA9IDE7CisgICAgICAgICAgICAgICAgcGtnLlNhdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBSZWFkVGVtcGxhdGVGaWxlKHN0cmluZyB0ZW1wbGF0ZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSB0ZW1wbGF0ZUZJbGU7CisgICAgICAgICAgICB1c2luZyAoU3lzdGVtLklPLk1lbW9yeVN0cmVhbSBtcyA9IG5ldyBTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdyA9IG5ldyBTeXN0ZW0uSU8uRmlsZVN0cmVhbSh0ZW1wbGF0ZU5hbWUsIFN5c3RlbS5JTy5GaWxlTW9kZS5PcGVuLCBTeXN0ZW0uSU8uRmlsZUFjY2Vzcy5SZWFkLCBTeXN0ZW0uSU8uRmlsZVNoYXJlLlJlYWRXcml0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gc3cuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgdGVtcGxhdGVGSWxlID0gbXMuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlRklsZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlWGxzeFNoZWV0KHN0cmluZyBwRmlsZU5hbWUsIGludCBwUm93cywgaW50IHBDb2x1bW5zKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBGaWxlTmFtZSkpIEZpbGUuRGVsZXRlKHBGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8ocEZpbGVOYW1lKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgZXhjZWxXb3Jrc2hlZXQgPSBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3RzaGVldCIpOworCisgICAgICAgICAgICAgICAgLy8gRmlsbCB3aXRoIGRhdGEKKyAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPD0gcFJvd3M7IHJvdysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMTsgY29sdW1uIDw9IHBDb2x1bW5zOyBjb2x1bW4rKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA+IDEgJiYgcm93ID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByYW5nZSA9IGV4Y2VsV29ya3NoZWV0LkNlbGxzW3JvdywgY29sdW1uXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiMCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLlZlcnRpY2FsQWxpZ25tZW50ID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5DZW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsV29ya3NoZWV0LkNlbGxzW3JvdywgY29sdW1uXS5WYWx1ZSA9IHJvdyAqIGNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRyeSB0byBzdHlsZSB0aGUgZmlyc3QgY29sdW1uLCBiZWdpbmluZyB3aXRoIHJvdyAzIHdoaWNoIGhhcyBubyBjb250ZW50IHlldC4uLgorICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHJhbmdlID0gZXhjZWxXb3Jrc2hlZXQuQ2VsbHNbRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKDMsIDEsIHBSb3dzLCAxKV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlbFN0eWxlIHN0eWxlID0gcmFuZ2UuU3R5bGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbm93IEkgd291bGQgYWRkIGRhdGEgdG8gdGhlIGZpcnN0IGNvbHVtbiAobGVmdCBvdXQgaGVyZSkuLi4KKyAgICAgICAgICAgICAgICBleGNlbFBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfSAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9CaXRtYXBJbWFnZS5naWYgYi9FUFBsdXNUZXN0L1Jlc291cmNlcy9CaXRtYXBJbWFnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMzQxZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvUmVzb3VyY2VzL0JpdG1hcEltYWdlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9UZXN0MS5qcGcgYi9FUFBsdXNUZXN0L1Jlc291cmNlcy9UZXN0MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1ZmVmZgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvUmVzb3VyY2VzL1Rlc3QxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9WZWN0b3IgRHJhd2luZy53bWYgYi9FUFBsdXNUZXN0L1Jlc291cmNlcy9WZWN0b3IgRHJhd2luZy53bWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyNWFlYgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvUmVzb3VyY2VzL1ZlY3RvciBEcmF3aW5nLndtZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9WZWN0b3IgRHJhd2luZzIud21mIGIvRVBQbHVzVGVzdC9SZXNvdXJjZXMvVmVjdG9yIERyYXdpbmcyLndtZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmRlZWZhCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9SZXNvdXJjZXMvVmVjdG9yIERyYXdpbmcyLndtZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1N0eWxlVGVzdC5jcyBiL0VQUGx1c1Rlc3QvU3R5bGVUZXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzMxODAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L1N0eWxlVGVzdC5jcwpAQCAtMCwwICsxLDQ0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKKworbmFtZXNwYWNlIEV4Y2VsUGFja2FnZVRlc3QKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBTdHlsZVRlc3QKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRTdHlsZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxmb3JtYXRzLnhsc3giKSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJBOlgiXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWJ1Zy5Xcml0ZUxpbmUoY2VsbC5UZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdEZyYWN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9zdHJpbmcgZiA9IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkZvcm1hdEZyYWN0aW9uKDAuMjUsIDIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL2YgPSBFeGNlbE51bWJlckZvcm1hdFhtbC5Gb3JtYXRGcmFjdGlvbigwLjMzMywgMik7CisgICAgICAgICAgICAvL2YgPSBFeGNlbE51bWJlckZvcm1hdFhtbC5Gb3JtYXRGcmFjdGlvbigtMC44ODgsIDIpOworICAgICAgICAgICAgLy9mID0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuRm9ybWF0RnJhY3Rpb24oLTAuMjcyNDcxLCAzKTsKKyAgICAgICAgICAgIC8vZiA9IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkZvcm1hdEZyYWN0aW9uKDAuNjY2NjY2LCA0KTsKKyAgICAgICAgICAgIC8vZiA9IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkZvcm1hdEZyYWN0aW9uKDAuMjEsIDQpOworICAgICAgICAgICAgLy9mID0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuRm9ybWF0RnJhY3Rpb24oMC4wOTk5OSwgMyk7CisgICAgICAgICAgICAvL2YgPSBFeGNlbE51bWJlckZvcm1hdFhtbC5Gb3JtYXRGcmFjdGlvbigwLCAzKTsKKworICAgICAgICB9CisgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVGVzdEJhc2UuY3MgYi9FUFBsdXNUZXN0L1Rlc3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWUyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L1Rlc3RCYXNlLmNzCkBAIC0wLDAgKzEsNzUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOworCituYW1lc3BhY2UgRVBQbHVzVGVzdAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RCYXNlCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRXhjZWxQYWNrYWdlIF9wY2s7CisgICAgICAgIHByb3RlY3RlZCBzdHJpbmcgX2NsaXBhcnRQYXRoPSIiOworICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIF93b3Jrc2hlZXRQYXRoPSIiOworICAgICAgICBwdWJsaWMgVGVzdENvbnRleHQgVGVzdENvbnRleHQgeyBnZXQ7IHNldDsgfQorICAgICAgICAKKyAgICAgICAgW1Rlc3RJbml0aWFsaXplXQorICAgICAgICBwdWJsaWMgdm9pZCBJbml0QmFzZSgpCisgICAgICAgIHsKKworICAgICAgICAgICAgX2NsaXBhcnRQYXRoID0gUGF0aC5Db21iaW5lKFBhdGguR2V0VGVtcFBhdGgoKSwgQCJFUFBsdXMgY2xpcGFydCIpOworICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKF9jbGlwYXJ0UGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShfY2xpcGFydFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGFzbSA9IEFzc2VtYmx5LkdldEV4ZWN1dGluZ0Fzc2VtYmx5KCk7CisgICAgICAgICAgICB2YXIgdmFsaWRFeHRlbnNpb25zID0gbmV3W10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICIuZ2lmIiwgIi53bWYiCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBuYW1lIGluIGFzbS5HZXRNYW5pZmVzdFJlc291cmNlTmFtZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXh0IGluIHZhbGlkRXh0ZW5zaW9ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLkVuZHNXaXRoKGV4dCwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWxlTmFtZSA9IG5hbWUuUmVwbGFjZSgiRVBQbHVzVGVzdC5SZXNvdXJjZXMuIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBhc20uR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbShuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgZmlsZSA9IEZpbGUuQ3JlYXRlKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsIGZpbGVOYW1lKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNvcHlUbyhmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX3dvcmtzaGVldFBhdGggPSBQYXRoLkNvbWJpbmUoUGF0aC5HZXRUZW1wUGF0aCgpLCBAIkVQUGx1cyB3b3Jrc2hlZXRzIik7CisgICAgICAgICAgICBpZiAoIURpcmVjdG9yeS5FeGlzdHMoX3dvcmtzaGVldFBhdGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoX3dvcmtzaGVldFBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGRpPW5ldyBEaXJlY3RvcnlJbmZvKF93b3Jrc2hlZXRQYXRoKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIF93b3Jrc2hlZXRQYXRoID0gZGkuRnVsbE5hbWUgKyAiXFwiOworCisgICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgT3BlblBhY2thZ2Uoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIG5hbWUpOworICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UoZmkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBTYXZlV29ya3NoZWV0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvdW50ID09IDApIHJldHVybjsKKyAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIG5hbWUpOworICAgICAgICAgICAgaWYgKGZpLkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaS5EZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9wY2suU2F2ZUFzKGZpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVGVzdERUTy5jcyBiL0VQUGx1c1Rlc3QvVGVzdERUTy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjhjNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9UZXN0RFRPLmNzCkBAIC0wLDAgKzEsMjUgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdERUTworICAgIHsKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lVmFyOworCisgICAgICAgIHB1YmxpYyBpbnQgSWQgeyBnZXQ7IHNldDsgfQorICAgICAgICBbRGlzcGxheU5hbWUoIk5hbWUgZnJvbSBEaXNwbGF5TmFtZUF0dHJpYnV0ZSIpXQorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgVGVzdERUTyBkdG8geyBnZXQ7IHNldDsgfQorICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgRGF0ZSB7IGdldDsgc2V0OyB9CisgICAgICAgIHB1YmxpYyBib29sIEJvb2xlYW4geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0TmFtZUlEKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIElkICsgIiwiICsgTmFtZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVGVzdFN0YXJ0Lm9yZGVyZWR0ZXN0IGIvRVBQbHVzVGVzdC9UZXN0U3RhcnQub3JkZXJlZHRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkMmZmMwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvVGVzdFN0YXJ0Lm9yZGVyZWR0ZXN0CkBAIC0wLDAgKzEsNzkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8T3JkZXJlZFRlc3QgbmFtZT0iVGVzdFN0YXJ0IiBzdG9yYWdlPSJjOlxkZXZleHRlcm5hbFxlcHBsdXNcZXBwbHVzdGVzdFx0ZXN0c3RhcnQub3JkZXJlZHRlc3QiIGlkPSJlNzU5OWUyZS00MzZhLTQ2YjItYWYyMi05NmZmZjI2MzQ2ZDMiIHhtbG5zPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zY2hlbWFzL1Zpc3VhbFN0dWRpby9UZWFtVGVzdC8yMDEwIj4KKyAgPEV4ZWN1dGlvbiB0aW1lT3V0PSIyMTQ3NDgzNjQ3IiBpZD0iZDMwOTE5YTEtM2MxMi00M2ZkLWJjNWMtOTBkOTM0ZWYwYzE1IiAvPgorICA8VGVzdExpbmtzPgorICAgIDxUZXN0TGluayBpZD0iZWM4YzdjYjYtYmI2OC0wYjJkLTMzNmUtZTdhZDY0OThkZmJjIiBuYW1lPSJCYXJDaGFydCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImEzMzU2N2IwLTBmNzQtM2MyMi02MDU3LTNhYzk0MDRiNGFmZSIgbmFtZT0iQ29sdW1uIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iNjRmOGRlZWQtOGE1ZC0zYzI2LTBkNmMtYzhhODUyNzU1ZjUyIiBuYW1lPSJDb25lIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iYTMyMzAzODYtNGUxYi0wZGMwLThmMjgtNDkyODY1NjI3YTlkIiBuYW1lPSJEb3VnbnV0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iZTYwNGE0NDctNWQzMS1jNmQxLTk0NGQtNjhmOGQzZTM2YjdkIiBuYW1lPSJEcmF3aW5ncyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImU5YzhkMTlhLWYwZjItNmVhYS1mYmNlLTgwM2E4ZTMyMjg1YiIgbmFtZT0iTGluZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjViMmY4MzJiLTJlNmQtZDhmZS1mZThiLTYzMDAyNDRlOWM1MyIgbmFtZT0iTGluZU1hcmtlciIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImMzYzRkYWE3LWY1YzUtMGFhNy0wODUyLTEzOTY1NTJlZjQ3OCIgbmFtZT0iUGljdHVyZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjJkNTkxYTkyLWI0YmMtYTVmOC1hZWMxLTgzNTI4Y2E5OTE1ZSIgbmFtZT0iUGllQ2hhcnQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI4ODRjYzQ4Yi1iN2IxLTZiMWEtNTczNS1lYjk5Y2FlZGJmYjgiIG5hbWU9IlBpZUNoYXJ0M0QiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI2ZWRkNmEyNi1lZDgwLWQwYWUtNjI2ZS0zNmVlZmU2ZWVmNzYiIG5hbWU9IlB5cmFtaWQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJjZjIzNmNlMC02MzdkLWVhZWMtMjg1Yi01N2E0YzQ3YzE1MDciIG5hbWU9IlNjYXR0ZXIiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI4NDg5MTk5Ni1kNGRkLWQ1MzEtNjUyYy1mNDM2MjQ3OTAzOGUiIG5hbWU9IkJ1YmJsZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImI0MDRlYzZlLTkyZDMtMDIzNS1jNmMxLTdkNzk5Mjk0NWRmZiIgbmFtZT0iUmFkYXIiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJmYjc4MTQ1NC1hMmYwLTJhYTktYWViZi0wNTYyMmU3NTg3NGYiIG5hbWU9IlN1cmZhY2UiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI1YzhhZTNkNS1mZjBlLTZjOWEtYmUzMS0yYjhhOGE2ODQ4NWMiIG5hbWU9IkxpbmUyVGVzdCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjkwMTVlMzY5LTY2NTYtNGQ3Ny03ZjVjLTgwM2ZlMjViNjkyNyIgbmFtZT0iTXVsdGlDaGFydFNlcmllcyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjBjMGEzMjRjLTExMmMtNjlkNi04ZWFjLTIzNDdhYzgyNWIyZiIgbmFtZT0iRHJhd2luZ1NpemluZ0FuZFBvc2l0aW9uaW5nIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iMmFmYzE0N2UtZDkzOC04ODkzLTgxMjYtODYyNjdiZjhmMjU4IiBuYW1lPSJEcmF3aW5nV29ya3NoZWV0Q29weSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjJmMTQ3NzRjLTQ5ZWUtYmVkNy0xMmE4LTg2ZGQzMDkyZDc0ZiIgbmFtZT0iRGVsZXRlRHJhd2luZyIgc3RvcmFnZT0iYmluXHJlbGVhc2VcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iZDI2Nzk3OWEtMjJhYy1mNzM3LWQ5YTItZWYyMDhhNDllY2U0IiBuYW1lPSJSZWFkRG9jdW1lbnQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJkYzA0YTY5My01NzZjLWZiNDItNzBmMC05MTQ1YzU1MDliODgiIG5hbWU9Ikluc2VydERlbGV0ZVRlc3QiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJiODllMTNhMC1iMTkzLTkwYjUtZTI3ZS1jMDM4M2VhNDgwOTAiIG5hbWU9IkxvYWREYXRhIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iMDBiMTBhNWYtOGE2Yi1mYzVhLTkzNjktYTEzNGQ0MGM2OWEwIiBuYW1lPSJTdHlsZUZpbGwiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSIzMzg4MzkyZi1jYjE4LTYzOGUtZWMzZC0wZTRlNGJjYjBmMDAiIG5hbWU9IlBlcmZvcm1hbmNlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iMWZjMGM5NzItZGQ4Mi1iM2NhLTc0ZGEtZjRiNzJiOTBhNDJkIiBuYW1lPSJSaWNoVGV4dENlbGxzIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iYTdlODY0ZjYtYzZkMi1kNjM2LTIxNjAtNGNmZDU0YWNkMjRiIiBuYW1lPSJUZXN0Q29tbWVudHMiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJkNWJmZTU1My1lNzRlLWY5YjMtNzM3Zi00YTZjMDNmZDFhMDEiIG5hbWU9Ikh5cGVybGluayIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjQ5ZTJjNGNjLWNlMTYtNTI3Ny03ZjNkLWI4N2ZiMDUzOTAwOSIgbmFtZT0iUGljdHVyZVVSTCIgc3RvcmFnZT0iYmluXHJlbGVhc2VcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iN2ZiZjUwYmEtY2MwMC02MTZmLTQ2ZWYtM2I4NTQ3N2EwYTY0IiBuYW1lPSJDb3B5T3ZlcndyaXRlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iNmRjZTlkMjgtOWMwNS1iNTI1LTIwZjYtOTIwYWY1YTE5ZjIwIiBuYW1lPSJIaWRlVGVzdCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImZiYjNiYjZkLWY3MmMtMGQwMi05MzgyLTljNTgxZDdjZDRkMCIgbmFtZT0iVmVyeUhpZGVUZXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iMjg3YjM1ZDUtMmJhYi00OWJhLTM1MzMtY2E0MjZjNmFkMzRmIiBuYW1lPSJQcmludGVyU2V0dGluZ3MiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJjMmQwZmI0Ny1lMTEyLTc5ZjktOTBlZi1kZDQ4MjAwOWNhOWMiIG5hbWU9IkFkZHJlc3MiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJiODg4ZWRjNi01ODU4LTdlNzEtYzZjYy02OGViNTI2YmVjZGEiIG5hbWU9Ik1lcmdlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iNTVjYzE1YzgtY2ZmOC05ZDkxLTIyYjItZWQ4ZjRkYjY3YTExIiBuYW1lPSJFbmNvZGluZyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImZhNjMzOTA4LTg5ODUtNDFkOC1lM2NiLTE4MDZkMDM1YjE3ZiIgbmFtZT0iTG9hZFRleHQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI3MjgxYTBmNy00ZDRhLTg3ZjktZjc2ZS05YzIwYzA5YTEwMmYiIG5hbWU9IkxvYWREYXRhVGFibGUiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJhOTdlODIwZi1lNjA0LThiYzgtMzAzMC0yNDQyMmU2ZjE5OWYiIG5hbWU9IldvcmtzaGVldENvcHkiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI3YzBkOGYwZS1iYjZmLWFjZWYtM2I5My03ODBjNDUzMzcxMTciIG5hbWU9IkRlZmF1bHRDb2xXaWR0aCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjVkZWFjMWM5LTQ5ZWYtMTI5Mi1iMmM1LTUzNTkyMjcwYzI0ZCIgbmFtZT0iQ29weVRhYmxlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iYmM4MjM2MDItNjA1ZC0yNzAxLWM0NTUtN2Y0MTBiOGUyZDE3IiBuYW1lPSJBdXRvRml0Q29sdW1ucyIgc3RvcmFnZT0iYmluXHJlbGVhc2VcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iOGQ3ZWIzZTEtYmQyMS1jNDY2LWMwNTgtMDRlOWRiNGI5OTJkIiBuYW1lPSJDb3B5UmFuZ2UiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSIzMDAwNWI1Zi04NGZkLTc4NzUtNGJjNy0xODRkYmFjNGJiZmEiIG5hbWU9IkNvcHlNZXJnZWRSYW5nZSIgc3RvcmFnZT0iYmluXHJlbGVhc2VcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iNmIwNDMwNjktNDc4NS05M2VjLTIxMGYtMjA5MDI3Yjc5NWNlIiBuYW1lPSJWYWx1ZUVycm9yIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iN2NjZmYyNzMtYTk4Zi1iYTVmLTIxNjUtNDQyY2I3OTgwNmYzIiBuYW1lPSJEZWZDb2xXaWR0aEJ1ZyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImRmOTIzMzQ5LTZiMzAtMTA3ZC02ZDM4LTA3MDllZmJjZWFjZSIgbmFtZT0iRm9ybXVsYU92ZXJ3cml0ZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjllNDQ5YTYwLTMwYmQtNjAwYi1kZjRiLTFlOGM0ZWI0Y2YwNiIgbmFtZT0iRm9ybXVsYUVycm9yIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iZWQ3YzMzZjAtZWQ5NS1iMTg5LWY3YmUtNTg4OTRkYWU2Y2Q1IiBuYW1lPSJTdHlsZU5hbWVUZXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iN2E1ZWJiZTktNTQ0Ni0yNGRhLTFkZTQtNWI0MDI2ODMzMWFkIiBuYW1lPSJOYW1lZFN0eWxlcyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImEwN2I0YjhiLWEyYTEtNzdhZS1lMDE3LWQxNzc4MzY3MTgxOSIgbmFtZT0iVGFibGVUZXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iM2U3Y2E1YzctNjA3NS0wOWU3LTc2NTktNmMzMmVjNDgyZTY3IiBuYW1lPSJMb2FkQXJyYXkiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI2ODRjMTQ3ZS01MGIwLWM5YzUtMmY4Ny1mNGJhMjY4OTRkODMiIG5hbWU9IkRlZmluZWROYW1lIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iZGQzZGQwOWUtNWE0NC00YTM0LTVhZGYtMzJhNjYwNmMwODQzIiBuYW1lPSJDcmVhdGVQaXZvdFRhYmxlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iMzE5ODMwMDgtNDM3Zi03MDZiLTZjMjQtN2Y2MTI1ZDQ1OTMyIiBuYW1lPSJTZXRCYWNrZ3JvdW5kIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iYjVlYmY1MWItODhiMC03MWQ1LTZhYWEtM2E4MTVlYTQxMDU1IiBuYW1lPSJDb3B5UGl2b3RUYWJsZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjE5MWE0MWVjLTIyNmEtZTI0MS0zNjFhLWM4YjllODdkNWU3MSIgbmFtZT0iTG9hZEZyb21Db2xsZWN0aW9uVGVzdCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImVlODcxM2ExLWVhYzItZjY2OS03NDAyLWFjZTA2MTY0ZmVmYSIgbmFtZT0iU2V0SGVhZGVyRm9vdGVySW1hZ2UiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSIwNjY5YjExMS0xNTIwLThlZGQtZDE5YS1hZDk0M2U0YTc3ODQiIG5hbWU9IlJlYWRTdHJlYW1TYXZlQXNTdHJlYW0iIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSIwZWM5ZWI5Ni1jM2Y5LTkyMzMtZTMwMi0xYTc3MGMxZjkzY2MiIG5hbWU9IlJlYWRXb3JrU2hlZXQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSI0MWFmYWFkMi03NWExLWEwYzItMDcxMS0yMDI3YmRjZTAxY2MiIG5hbWU9IlJlYWREcmF3aW5nIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iNDM2NWRlOGItYTBiYi0wNWFiLTFiOWMtZTI1ZThkOWY2OGRhIiBuYW1lPSJSZWFkV3JpdGVFbmNyeXB0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iYmM3MWJjNWEtOTM0Ni00YjdmLThjMDgtOTVkYWJiYTA4MzkwIiBuYW1lPSJSZWFkU3RyZWFtV2l0aFRlbXBsYXRlV29ya1NoZWV0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iMzA3NjljMmUtMzAyOC02MGNkLWM4YmYtMTE5MWNkYzRkNzQ0IiBuYW1lPSJTaG91bGRCZUFibGVUb0RlbGV0ZUFuZFRoZW5BZGQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJkMTZmMTc1MC1lOTU3LWM1YTEtMTQ2Yy01YTk5YmNhN2Q1OGMiIG5hbWU9IlR3b0JhY2tDb2xvciIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9Ijg0YThhZDc4LTkyMmUtM2Q3OC02YjRjLWVlNTc2NTQxZWU5OCIgbmFtZT0iVHdvQ29sb3JTY2FsZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjM0MWRiMWI3LWEyNzMtNzhkMy0wM2I5LWYxMDQwYTk2NTU2ZCIgbmFtZT0iSWNvblNldCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9IjAzNGM1YjEzLTA3NDItYzY2Zi0wNmQwLWUwMzFlYzYzYmQyNiIgbmFtZT0iRGF0YWJhciIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KKyAgICA8VGVzdExpbmsgaWQ9ImJkNDgzZTc1LTZhZGEtOWRhZS02NjJlLTA5MjA5NjUyMjZiMSIgbmFtZT0iRGVsZXRlQnlOYW1lV2hlcmVXb3JrU2hlZXRFeGlzdHMiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJkZGE5MmI0YS1kZTczLTA2MjktOTk0Ni0yNTFmMWU0ODgyNzgiIG5hbWU9IkRlbGV0ZUJ5TmFtZVdoZXJlV29ya1NoZWV0RG9lc05vdEV4aXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iNjAzMDVmOTYtYWNjNS1jYTU0LWZmZTAtODM2NDQ5YzdjYWJjIiBuYW1lPSJNb3ZlQmVmb3JlQnlOYW1lV2hlcmVXb3JrU2hlZXRFeGlzdHMiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+CisgICAgPFRlc3RMaW5rIGlkPSJjNzJiZTVmNi0zNGY4LWQ4MjUtODk4ZS01MmM1ZTBkMzY2MjAiIG5hbWU9Ik1vdmVBZnRlckJ5TmFtZVdoZXJlV29ya1NoZWV0RXhpc3RzIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICAgIDxUZXN0TGluayBpZD0iZGM0OGVjNDctMTVjMS0zMjNiLTM1MDktMDEwZDQzNTBhZTQ1IiBuYW1lPSJNb3ZlQmVmb3JlQnlQb3NpdGlvbldoZXJlV29ya1NoZWV0RXhpc3RzIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICA8L1Rlc3RMaW5rcz4KKzwvT3JkZXJlZFRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9VdGlscy9BZGRyZXNzVXRpbGl0eVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9VdGlscy9BZGRyZXNzVXRpbGl0eVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNjM5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L1V0aWxzL0FkZHJlc3NVdGlsaXR5VGVzdHMuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuVXRpbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBBZGRyZXNzVXRpbGl0eVRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUGFyc2VGb3JFbnRpcmVDb2x1bW5TZWxlY3Rpb25zX1Nob3VsZEFkZE1heFJvd3MoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICB2YXIgYWRkcmVzcyA9ICJBOkEiOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBIiArIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlRm9yRW50aXJlQ29sdW1uU2VsZWN0aW9uc19TaG91bGRBZGRNYXhSb3dzT25Db2x1bW5zV2l0aE11bHRpcGxlTGV0dGVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkFCOkFDIjsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gQWRkcmVzc1V0aWxpdHkuUGFyc2VFbnRpcmVDb2x1bW5TZWxlY3Rpb25zKGFkZHJlc3MpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQUIxOkFDIiArIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlRm9yRW50aXJlQ29sdW1uU2VsZWN0aW9uc19TaG91bGRIYW5kbGVNdWx0aXBsZVJhbmdlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkE6QSBCOkIiOworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gc3RyaW5nLkZvcm1hdCgiQTE6QXswfSBCMTpCezB9IiwgRXhjZWxQYWNrYWdlLk1heFJvd3MpOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9VdGlscy9Db252ZXJ0VXRpbFRlc3QuY3MgYi9FUFBsdXNUZXN0L1V0aWxzL0NvbnZlcnRVdGlsVGVzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNlOWMzCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9VdGlscy9Db252ZXJ0VXRpbFRlc3QuY3MKQEAgLTAsMCArMSw3NyBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LlV0aWxzCit7CisJW1Rlc3RDbGFzc10KKwlwdWJsaWMgY2xhc3MgQ29udmVydFV0aWxUZXN0CisJeworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgVHJ5UGFyc2VOdW1lcmljU3RyaW5nKCkKKwkJeworCQkJZG91YmxlIHJlc3VsdDsKKwkJCW9iamVjdCBudW1lcmljU3RyaW5nID0gbnVsbDsKKwkJCWRvdWJsZSBleHBlY3RlZCA9IDA7CisJCQlBc3NlcnQuSXNGYWxzZShDb252ZXJ0VXRpbC5UcnlQYXJzZU51bWVyaWNTdHJpbmcobnVtZXJpY1N0cmluZywgb3V0IHJlc3VsdCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworCQkJZXhwZWN0ZWQgPSAxNDQyLjA7CisJCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImUiLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIDEuNDQyRSswMDMKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKKwkJCW51bWVyaWNTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiZjAiLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIDE0NDIKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKKwkJCW51bWVyaWNTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiZjIiLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIDE0NDIuMDAKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKKwkJCW51bWVyaWNTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygibiIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gMSw0NDIuMAorCQkJQXNzZXJ0LklzVHJ1ZShDb252ZXJ0VXRpbC5UcnlQYXJzZU51bWVyaWNTdHJpbmcobnVtZXJpY1N0cmluZywgb3V0IHJlc3VsdCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworCQkJZXhwZWN0ZWQgPSAtMC4wMDUyNjsKKwkJCW51bWVyaWNTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiZSIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gLTUuMjZFLTAwMworCQkJQXNzZXJ0LklzVHJ1ZShDb252ZXJ0VXRpbC5UcnlQYXJzZU51bWVyaWNTdHJpbmcobnVtZXJpY1N0cmluZywgb3V0IHJlc3VsdCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworCQkJbnVtZXJpY1N0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJmMCIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gLTAKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLjAsIHJlc3VsdCk7CisJCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImYzIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAtMC4wMDUKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgtMC4wMDUsIHJlc3VsdCk7CisJCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoIm42IiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAtMC4wMDUyNjAKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKKwkJfQorCQkKKwkJW1Rlc3RNZXRob2RdCisJCXB1YmxpYyB2b2lkIFRyeVBhcnNlRGF0ZVN0cmluZygpCisJCXsKKwkJCURhdGVUaW1lIHJlc3VsdDsKKwkJCW9iamVjdCBkYXRlU3RyaW5nID0gbnVsbDsKKwkJCURhdGVUaW1lIGV4cGVjdGVkID0gRGF0ZVRpbWUuTWluVmFsdWU7CisJCQlBc3NlcnQuSXNGYWxzZShDb252ZXJ0VXRpbC5UcnlQYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworCQkJZXhwZWN0ZWQgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUpOworCQkJZGF0ZVN0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJkIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAxLzE1LzIwMTMKKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKKwkJCWRhdGVTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiRCIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gVHVlc2RheSwgSmFudWFyeSAxNSwgMjAxMworCQkJQXNzZXJ0LklzVHJ1ZShDb252ZXJ0VXRpbC5UcnlQYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworCQkJZGF0ZVN0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJGIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyBUdWVzZGF5LCBKYW51YXJ5IDE1LCAyMDEzIDEyOjAwOjAwIEFNCisJCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlRGF0ZVN0cmluZyhkYXRlU3RyaW5nLCBvdXQgcmVzdWx0KSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7CisJCQlkYXRlU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImciLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIDEvMTUvMjAxMyAxMjowMCBBTQorCQkJQXNzZXJ0LklzVHJ1ZShDb252ZXJ0VXRpbC5UcnlQYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOworCQkJZXhwZWN0ZWQgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUsIDE1LCAyNiwgMzIpOworCQkJZGF0ZVN0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJGIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyBUdWVzZGF5LCBKYW51YXJ5IDE1LCAyMDEzIDM6MjY6MzIgUE0KKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKKwkJCWRhdGVTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiZyIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gMS8xNS8yMDEzIDM6MjYgUE0KKwkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpKTsKKwkJCUFzc2VydC5BcmVFcXVhbChuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUsIDE1LCAyNiwgMCksIHJlc3VsdCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1V0aWxzL0d1YXJkaW5nVGVzdHMuY3MgYi9FUFBsdXNUZXN0L1V0aWxzL0d1YXJkaW5nVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2N2Y5OQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvVXRpbHMvR3VhcmRpbmdUZXN0cy5jcwpAQCAtMCwwICsxLDYwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0LlV0aWxzCit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgR3VhcmRpbmdUZXN0cworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q2xhc3MKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlX0lzTm90TnVsbF9TaG91bGRUaHJvd0lmQXJndW1lbnRJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0Q2xhc3Mgb2JqID0gbnVsbDsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQob2JqKS5Jc05vdE51bGwoInRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlX0lzTm90TnVsbF9TaG91bGROb3RUaHJvd0lmQXJndW1lbnRJc0FuSW5zdGFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgb2JqID0gbmV3IFRlc3RDbGFzcygpOworICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChvYmopLklzTm90TnVsbCgidGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgUmVxdWlyZV9Jc05vdE51bGxPckVtcHR5X1Nob3VsZFRocm93SWZTdHJpbmdJc051bGwoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgYXJnID0gbnVsbDsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYXJnKS5Jc05vdE51bGxPckVtcHR5KCJ0ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVxdWlyZV9Jc05vdE51bGxPckVtcHR5X1Nob3VsZE5vdFRocm93SWZTdHJpbmdJc05vdE51bGxPckVtcHR5KCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGFyZyA9ICJ0ZXN0IjsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYXJnKS5Jc05vdE51bGxPckVtcHR5KCJ0ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlX0lzSW5SYW5nZV9TaG91bGRUaHJvd0lmQXJndW1lbnRJc091dE9mUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYXJnID0gMzsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYXJnKS5Jc0luUmFuZ2UoNSwgNywgInRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlX0lzSW5SYW5nZV9TaG91bGROb3RUaHJvd0lmQXJndW1lbnRJc0luUmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYXJnID0gNjsKKyAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYXJnKS5Jc0luUmFuZ2UoNSwgNywgInRlc3QiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVXRpbHMvU3FSZWZVdGlsaXR5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L1V0aWxzL1NxUmVmVXRpbGl0eVRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L1V0aWxzL1NxUmVmVXRpbGl0eVRlc3RzLmNzCkBAIC0wLDAgKzEsNzIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIEVQUGx1c1Rlc3QuVXRpbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBTcVJlZlV0aWxpdHlUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgU3FSZWZVdGlsaXR5X1RvU3FSZWZBZGRyZXNzX1Nob3VsZFRocm93SWZBZGRyZXNzSXNOdWxsT3JFbXB0eSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNxUmVmVXRpbGl0eS5Ub1NxUmVmQWRkcmVzcyhudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTcVJlZlV0aWxpdHlfVG9TcVJlZkFkZHJlc3NfU2hvdWxkUmVtb3ZlQ29tbWFzKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiQTEsIEEyOkEzIjsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3FSZWZVdGlsaXR5LlRvU3FSZWZBZGRyZXNzKGFkZHJlc3MpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEgQTI6QTMiLCByZXN1bHQpOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3FSZWZVdGlsaXR5X1RvU3FSZWZBZGRyZXNzX1Nob3VsZFJlbW92ZUNvbW1hc0FuZEluc2VydFNwYWNlSWZOZWNlc2FyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkExLEEyOkEzIjsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3FSZWZVdGlsaXR5LlRvU3FSZWZBZGRyZXNzKGFkZHJlc3MpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEgQTI6QTMiLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNxUmVmVXRpbGl0eV9Ub1NxUmVmQWRkcmVzc19TaG91bGRSZW1vdmVNdWx0aXBsZVNwYWNlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkExLCAgICAgICAgQTI6QTMiOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBTcVJlZlV0aWxpdHkuVG9TcVJlZkFkZHJlc3MoYWRkcmVzcyk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSBBMjpBMyIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3FSZWZVdGlsaXR5X0Zyb21TcVJlZkFkZHJlc3NfU2hvdWxkUmVwbGFjZVNwYWNlV2l0aENvbW1hKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiQTEgQTIiOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBTcVJlZlV0aWxpdHkuRnJvbVNxUmVmQWRkcmVzcyhhZGRyZXNzKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExLEEyIiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVkJBLmNzIGIvRVBQbHVzVGVzdC9WQkEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3MTI2NQotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvVkJBLmNzCkBAIC0wLDAgKzEsMjIwIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVkJBOworCituYW1lc3BhY2UgRVBQbHVzVGVzdAoreworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFZCQQorICAgIHsKKyNpZiAhTU9OTworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ29tcHJlc3Npb24oKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NvbXByZXNzaW9uL0RlY29tcHJlc3Npb24KKyAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9ICIjYWFhYmNkZWZhYWFhZ2hpamFhYWFha2xhYWFtbm9wcWFhYWFhYWFhYWFhYXJzdHV2d3h5emFhYSI7CisKKyAgICAgICAgICAgIGJ5dGVbXSBjb21wVmFsdWUgPSBDb21wb3VuZERvY3VtZW50LkNvbXByZXNzUGFydChFbmNvZGluZy5HZXRFbmNvZGluZygxMjUyKS5HZXRCeXRlcyh2YWx1ZSkpOworICAgICAgICAgICAgc3RyaW5nIGRlY29tcFZhbHVlID0gRW5jb2RpbmcuR2V0RW5jb2RpbmcoMTI1MikuR2V0U3RyaW5nKENvbXBvdW5kRG9jdW1lbnQuRGVjb21wcmVzc1BhcnQoY29tcFZhbHVlKSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGRlY29tcFZhbHVlKTsKKworICAgICAgICAgICAgdmFsdWUgPSAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSI7CisKKyAgICAgICAgICAgIGNvbXBWYWx1ZSA9IENvbXBvdW5kRG9jdW1lbnQuQ29tcHJlc3NQYXJ0KEVuY29kaW5nLkdldEVuY29kaW5nKDEyNTIpLkdldEJ5dGVzKHZhbHVlKSk7CisgICAgICAgICAgICBkZWNvbXBWYWx1ZSA9IEVuY29kaW5nLkdldEVuY29kaW5nKDEyNTIpLkdldFN0cmluZyhDb21wb3VuZERvY3VtZW50LkRlY29tcHJlc3NQYXJ0KGNvbXBWYWx1ZSkpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlLCBkZWNvbXBWYWx1ZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFZCQSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHJlcG9ydC54bHNtIikpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoQCJjOlx0ZW1wXHZiYVxtb2R1bGVzXGRpci50eHQiLCBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuQ29kZVBhZ2UgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuQ29uc3RhbnRzICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkRlc2NyaXB0aW9uICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkhlbHBDb250ZXh0SUQuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5IZWxwRmlsZTEgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuSGVscEZpbGUyICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkxjaWQuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5MY2lkSW52b2tlLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTGliRmxhZ3MuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5NYWpvclZlcnNpb24uVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5NaW5vclZlcnNpb24uVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5OYW1lICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb2plY3RJRCArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5TeXN0ZW1LaW5kLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5Ib3N0UHJvdGVjdGVkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5Vc2VyUHJvdGVjdGVkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5WYmVQcm90ZWN0ZWQuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Qcm90ZWN0aW9uLlZpc2liaWxpdHlTdGF0ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtb2R1bGUgaW4gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc3RyaW5nLkZvcm1hdChAImM6XHRlbXBcdmJhXG1vZHVsZXNcezB9LnR4dCIsIG1vZHVsZS5OYW1lKSwgbW9kdWxlLkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHIgaW4gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlJlZmVyZW5jZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc3RyaW5nLkZvcm1hdChAImM6XHRlbXBcdmJhXG1vZHVsZXNcezB9LnR4dCIsIHIuTmFtZSksIHIuTGliaWQgKyAiICIgKyByLlJlZmVyZW5jZVJlY29yZElELlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PFg1MDlDZXJ0aWZpY2F0ZTI+IHJldCA9IG5ldyBMaXN0PFg1MDlDZXJ0aWZpY2F0ZTI+KCk7CisgICAgICAgICAgICBYNTA5U3RvcmUgc3RvcmUgPSBuZXcgWDUwOVN0b3JlKFN0b3JlTG9jYXRpb24uQ3VycmVudFVzZXIpOworICAgICAgICAgICAgc3RvcmUuT3BlbihPcGVuRmxhZ3MuUmVhZE9ubHkpOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlNpZ25hdHVyZS5DZXJ0aWZpY2F0ZSA9IHN0b3JlLkNlcnRpZmljYXRlc1sxOV07CisgICAgICAgICAgICAvL3BhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCIiKTsKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdmJhU2F2ZWQueGxzbSIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGVWQkEoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MSIpOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5DcmVhdGVWQkFQcm9qZWN0KCk7CisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlc1siU2hlZXQxIl0uQ29kZSArPSAiXHJcblByaXZhdGUgU3ViIFdvcmtzaGVldF9TZWxlY3Rpb25DaGFuZ2UoQnlWYWwgVGFyZ2V0IEFzIFJhbmdlKVxyXG5Nc2dCb3goXCJUZXN0IG9mIHRoZSBWQkEgRmVhdHVyZSFcIilcclxuRW5kIFN1YlxyXG4iOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXNbIlNoZWV0MSJdLk5hbWUgPSAiQmxhZDEiOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Db2RlTW9kdWxlLk5hbWUgPSAiRGVuSMOkckFyYmV0c2Jva2VuIjsKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5OYW1lID0gIkZpcnN0U2hlZXQiOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUgKz0gIlxyXG5Qcml2YXRlIFN1YiBXb3JrYm9va19PcGVuKClcclxuQmxhZDEuQ2VsbHMoMSwxKS5WYWx1ZSA9IFwiVkJBIHRlc3RcIlxyXG5Nc2dCb3ggXCJWQkEgaXMgcnVubmluZyFcIlxyXG5FbmQgU3ViIjsKKyAgICAgICAgICAgIC8vWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZUxvY2F0aW9uLkN1cnJlbnRVc2VyKTsKKyAgICAgICAgICAgIC8vc3RvcmUuT3BlbihPcGVuRmxhZ3MuUmVhZE9ubHkpOworICAgICAgICAgICAgLy9wYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuU2lnbmF0dXJlLkNlcnRpZmljYXRlID0gc3RvcmUuQ2VydGlmaWNhdGVzWzExXTsKKworICAgICAgICAgICAgdmFyIG0gPSBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5BZGRNb2R1bGUoIk1vZHVsZTEiKTsKKyAgICAgICAgICAgIG0uQ29kZSArPSAiUHVibGljIFN1YiBUZXN0KHBhcmFtMSBhcyBzdHJpbmcpXHJcblxyXG5FbmQgc3ViXHJcblB1YmxpYyBGdW5jdGlvbiBmdW5jdGVzdCgpIEFzIFN0cmluZ1xyXG5cclxuRW5kIEZ1bmN0aW9uXHJcbiI7CisgICAgICAgICAgICB2YXIgYyA9IHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzLkFkZENsYXNzKCJDbGFzczEiLCBmYWxzZSk7CisgICAgICAgICAgICBjLkNvZGUgKz0gIlByaXZhdGUgU3ViIENsYXNzX0luaXRpYWxpemUoKVxyXG5cclxuRW5kIFN1YlxyXG5Qcml2YXRlIFN1YiBDbGFzc19UZXJtaW5hdGUoKVxyXG5cclxuRW5kIFN1YiI7CisgICAgICAgICAgICB2YXIgYzIgPSBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5BZGRDbGFzcygiQ2xhc3MyIiwgdHJ1ZSk7CisgICAgICAgICAgICBjMi5Db2RlICs9ICJQcml2YXRlIFN1YiBDbGFzc19Jbml0aWFsaXplKClcclxuXHJcbkVuZCBTdWJcclxuUHJpdmF0ZSBTdWIgQ2xhc3NfVGVybWluYXRlKClcclxuXHJcbkVuZCBTdWIiOworCisgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiRVBQbHVzIik7CisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHZiYVdyaXRlLnhsc20iKSk7CisKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVzaWduKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdmJhV3JpdGUueGxzbSIpKTsKKyAgICAgICAgICAgIC8vcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlNpZ25hdHVyZS5DZXJ0aWZpY2F0ZSA9IHN0b3JlLkNlcnRpZmljYXRlc1sxMV07CisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHZiYVdyaXRlMi54bHNtIikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUxvbmdWQkFNb2R1bGUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlZCQVNldERhdGEiKTsKKyAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUgPSAiUHJpdmF0ZSBTdWIgV29ya2Jvb2tfT3BlbigpXHJcbkNyZWF0ZURhdGFcclxuRW5kIFN1YiI7CisgICAgICAgICAgICB2YXIgbW9kdWxlID0gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJDb2RlIik7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgY29kZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCJQdWJsaWMgU3ViIENyZWF0ZURhdGEoKVxyXG4iKTsKKyAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IDMwOyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAxOyBjb2wgPCAzMDsgY29sKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2RlLkFwcGVuZExpbmUoc3RyaW5nLkZvcm1hdCgiVkJBU2V0RGF0YS5DZWxscyh7MH0sezF9KS5WYWx1ZT1cIkNlbGwgezJ9XCIiLCByb3csIGNvbCwgbmV3IEV4Y2VsQWRkcmVzc0Jhc2Uocm93LCBjb2wsIHJvdywgY29sKS5BZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZS5BcHBlbmRMaW5lKCJFbmQgU3ViIik7CisgICAgICAgICAgICBtb2R1bGUuQ29kZSA9IGNvZGUuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgLy9YNTA5U3RvcmUgc3RvcmUgPSBuZXcgWDUwOVN0b3JlKFN0b3JlTG9jYXRpb24uQ3VycmVudFVzZXIpOworICAgICAgICAgICAgLy9zdG9yZS5PcGVuKE9wZW5GbGFncy5SZWFkT25seSk7CisgICAgICAgICAgICAvL3BhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5TaWduYXR1cmUuQ2VydGlmaWNhdGUgPSBzdG9yZS5DZXJ0aWZpY2F0ZXNbMTldOworCisgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHZiYUxvbmcueGxzbSIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXSAgICAgICAgCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWYmFFcnJvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpcmVjdG9yeUluZm8gd29ya2luZ0RpciA9IG5ldyBEaXJlY3RvcnlJbmZvKEAiQzpcZXBwbHVzRXhhbXBsZVxmb2xkZXIiKTsKKyAgICAgICAgICAgIGlmICghd29ya2luZ0Rpci5FeGlzdHMpIHdvcmtpbmdEaXIuQ3JlYXRlKCk7CisgICAgICAgICAgICBGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKHdvcmtpbmdEaXIuRnVsbE5hbWUgKyAiLy8iICsgInRlbXAueGxzeCIpOworICAgICAgICAgICAgaWYgKGYuRXhpc3RzKSBmLkRlbGV0ZSgpOworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIG15UGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoZik7CisgICAgICAgICAgICBteVBhY2thZ2UuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgZXhjZWxXb3Jrc2hlZXQgPSBteVBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MSIpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgZXhjZWxXb3Jrc2hlZXQyID0gbXlQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTaGVldDIiKTsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IGV4Y2VsV29ya3NoZWV0MyA9IG15UGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2hlZXQzIik7CisgICAgICAgICAgICBGaWxlSW5mbyBmMiA9IG5ldyBGaWxlSW5mbyh3b3JraW5nRGlyLkZ1bGxOYW1lICsgIi8vIiArICJuZXdmaWxlLnhsc20iKTsKKyAgICAgICAgICAgIEV4Y2VsVkJBTW9kdWxlIGV4Y2VsVmJhTW9kdWxlID0gbXlQYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5BZGRNb2R1bGUoIk1vZHVsZTEiKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbXlidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsgbXlidWlsZGVyLkFwcGVuZExpbmUoIlN1YiBKaW1pbnkoKSIpOworICAgICAgICAgICAgbXlidWlsZGVyLkFwcGVuZExpbmUoIlJhbmdlKFwiRDZcIikuU2VsZWN0Iik7CisgICAgICAgICAgICBteWJ1aWxkZXIuQXBwZW5kTGluZSgiQWN0aXZlQ2VsbC5Gb3JtdWxhUjFDMSA9IFwiSmltaW55XCIiKTsKKyAgICAgICAgICAgIG15YnVpbGRlci5BcHBlbmRMaW5lKCJFbmQgU3ViIik7CisgICAgICAgICAgICBleGNlbFZiYU1vZHVsZS5Db2RlID0gbXlidWlsZGVyLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBteVBhY2thZ2UuU2F2ZUFzKGYyKTsKKyAgICAgICAgICAgIG15UGFja2FnZS5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJlYWRWQkFVbmljb2RlV3NOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXFZiYVVuaWNvZGVXUy54bHNtIikpOworICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoQCJjOlx0ZW1wXHZiYVxtb2R1bGVzXGRpci50eHQiLCBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuQ29kZVBhZ2UgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuQ29uc3RhbnRzICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkRlc2NyaXB0aW9uICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkhlbHBDb250ZXh0SUQuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5IZWxwRmlsZTEgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuSGVscEZpbGUyICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkxjaWQuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5MY2lkSW52b2tlLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTGliRmxhZ3MuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5NYWpvclZlcnNpb24uVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5NaW5vclZlcnNpb24uVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5OYW1lICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb2plY3RJRCArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5TeXN0ZW1LaW5kLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5Ib3N0UHJvdGVjdGVkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5Vc2VyUHJvdGVjdGVkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5WYmVQcm90ZWN0ZWQuVG9TdHJpbmcoKSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Qcm90ZWN0aW9uLlZpc2liaWxpdHlTdGF0ZS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtb2R1bGUgaW4gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc3RyaW5nLkZvcm1hdChAImM6XHRlbXBcdmJhXG1vZHVsZXNcezB9LnR4dCIsIG1vZHVsZS5OYW1lKSwgbW9kdWxlLkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCAodmFyIHIgaW4gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlJlZmVyZW5jZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbFRleHQoc3RyaW5nLkZvcm1hdChAImM6XHRlbXBcdmJhXG1vZHVsZXNcezB9LnR4dCIsIHIuTmFtZSksIHIuTGliaWQgKyAiICIgKyByLlJlZmVyZW5jZVJlY29yZElELlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PFg1MDlDZXJ0aWZpY2F0ZTI+IHJldCA9IG5ldyBMaXN0PFg1MDlDZXJ0aWZpY2F0ZTI+KCk7CisgICAgICAgICAgICBYNTA5U3RvcmUgc3RvcmUgPSBuZXcgWDUwOVN0b3JlKFN0b3JlTG9jYXRpb24uQ3VycmVudFVzZXIpOworICAgICAgICAgICAgc3RvcmUuT3BlbihPcGVuRmxhZ3MuUmVhZE9ubHkpOworICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlNpZ25hdHVyZS5DZXJ0aWZpY2F0ZSA9IHN0b3JlLkNlcnRpZmljYXRlc1sxOV07CisgICAgICAgICAgICAvL3BhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCIiKTsKKyAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdmJhU2F2ZWQueGxzbSIpKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlVW5pY29kZVdzTmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0V4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCLmtYvor5UiKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiU3ViIEdldERhdGEoKSIpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIk1zZ0JveCAoXCJIZWxsbyxXb3JsZFwiKSIpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIkVuZCBTdWIiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQyID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2hlZXQxIik7CisgICAgICAgICAgICAgICAgdmFyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kTGluZSgiUHJpdmF0ZSBTdWIgV29ya3NoZWV0X0NoYW5nZShCeVZhbCBUYXJnZXQgQXMgUmFuZ2UpIik7CisgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmRMaW5lKCJHZXREYXRhIik7CisgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmRMaW5lKCJFbmQgU3ViIik7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvZGVNb2R1bGUuQ29kZSA9IHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcaW52dmJhLnhsc20iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9Jc3N1ZSB3aXRoIGNodW5rIG92ZXJ3cml0aW5nIDQwOTYgYnl0ZXMKKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFZiYUJ1ZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICggdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXG91dGZpbGUueGxzbSIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShwYWNrYWdlLldvcmtib29rLkNvZGVNb2R1bGUuQ29kZS5MZW5ndGgpOworICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5Db2RlTW9kdWxlLkNvZGUgPSAiUHJpdmF0ZSBTdWIgV29ya3NoZWV0X1NlbGVjdGlvbkNoYW5nZShCeVZhbCBUYXJnZXQgQXMgUmFuZ2UpXHJcblxyXG5FbmQgU3ViIjsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Q29weSIscGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xvdXRmaWxlMi54bHNtIikpOworICAgICAgICAgICAgfSAgIAorICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWNvbXByZXNzaW9uQ2h1bmtHcmVhdGVyVGhhbjRrKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHRlc3QgZm9yIElzc3VlIDE1MDI2OiBWQkEgZGVjb21wcmVzc2lvbiBlbmNvdW50ZXJzIGluZGV4IG91dCBvZiByYW5nZQorICAgICAgICAgICAgLy8gb24gdGhlIGRlY29tcHJlc3Npb24gYnVmZmVyLgorICAgICAgICAgICAgdmFyIHdvcmtib29rRGlyID0gUGF0aC5Db21iaW5lKEFwcERvbWFpbi5DdXJyZW50RG9tYWluLkJhc2VEaXJlY3RvcnksIEAiLi5cLi5cd29ya2Jvb2tzIik7CisgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguQ29tYmluZSh3b3JrYm9va0RpciwgIlZCQURlY29tcHJlc3NCdWcueGxzbSIpOworICAgICAgICAgICAgdmFyIGYgPSBuZXcgRmlsZUluZm8ocGF0aCk7CisgICAgICAgICAgICBpZiAoZi5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWRpbmcgdGhlIFdvcmtib29rLkNvZGVNb2R1bGUuQ29kZSB3aWxsIGNhdXNlIGFuIEluZGV4T3V0T2ZSYW5nZSBpZiB0aGUgcHJvYmxlbSBoYXNuJ3QgYmVlbiBmaXhlZC4KKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwYWNrYWdlLldvcmtib29rLkNvZGVNb2R1bGUuQ29kZS5MZW5ndGggPiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Xb3JrU2hlZXQuY3MgYi9FUFBsdXNUZXN0L1dvcmtTaGVldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU1Yzg0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Xb3JrU2hlZXQuY3MKQEAgLTAsMCArMSwyMjg0IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK3VzaW5nIFN5c3RlbS5EYXRhOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgV29ya1NoZWV0VGVzdCA6IFRlc3RCYXNlCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUnVuV29ya3NoZWV0VGVzdHMoKQorICAgICAgICB7CisgICAgICAgICAgICBJbnNlcnREZWxldGVUZXN0Um93cygpOworICAgICAgICAgICAgSW5zZXJ0RGVsZXRlVGVzdENvbHVtbnMoKTsKKyAgICAgICAgICAgIExvYWREYXRhKCk7CisgICAgICAgICAgICBTdHlsZUZpbGwoKTsKKyAgICAgICAgICAgIFBlcmZvcm1hbmNlKCk7CisgICAgICAgICAgICBSaWNoVGV4dENlbGxzKCk7CisgICAgICAgICAgICBUZXN0Q29tbWVudHMoKTsKKyAgICAgICAgICAgIEh5cGVybGluaygpOworICAgICAgICAgICAgUGljdHVyZVVSTCgpOworICAgICAgICAgICAgQ29weU92ZXJ3cml0ZSgpOworICAgICAgICAgICAgSGlkZVRlc3QoKTsKKyAgICAgICAgICAgIFZlcnlIaWRlVGVzdCgpOworICAgICAgICAgICAgUHJpbnRlclNldHRpbmdzKCk7CisgICAgICAgICAgICBBZGRyZXNzKCk7CisgICAgICAgICAgICBNZXJnZSgpOworICAgICAgICAgICAgRW5jb2RpbmcoKTsKKyAgICAgICAgICAgIExvYWRUZXh0KCk7CisgICAgICAgICAgICBMb2FkRGF0YVJlYWRlcigpOworICAgICAgICAgICAgTG9hZERhdGFUYWJsZSgpOworICAgICAgICAgICAgTG9hZEZyb21Db2xsZWN0aW9uVGVzdCgpOworICAgICAgICAgICAgTG9hZEZyb21FbXB0eUNvbGxlY3Rpb25UZXN0KCk7CisgICAgICAgICAgICBMb2FkQXJyYXkoKTsKKyAgICAgICAgICAgIFdvcmtzaGVldENvcHkoKTsKKyAgICAgICAgICAgIERlZmF1bHRDb2xXaWR0aCgpOworICAgICAgICAgICAgQ29weVRhYmxlKCk7CisgICAgICAgICAgICBBdXRvRml0Q29sdW1ucygpOworICAgICAgICAgICAgQ29weVJhbmdlKCk7CisgICAgICAgICAgICBDb3B5TWVyZ2VkUmFuZ2UoKTsKKyAgICAgICAgICAgIFZhbHVlRXJyb3IoKTsKKyAgICAgICAgICAgIEZvcm11bGFPdmVyd3JpdGUoKTsKKyAgICAgICAgICAgIEZvcm11bGFFcnJvcigpOworICAgICAgICAgICAgU3R5bGVOYW1lVGVzdCgpOworICAgICAgICAgICAgTmFtZWRTdHlsZXMoKTsKKyAgICAgICAgICAgIFRhYmxlVGVzdCgpOworICAgICAgICAgICAgRGVmaW5lZE5hbWUoKTsKKyAgICAgICAgICAgIENyZWF0ZVBpdm90VGFibGUoKTsKKyAgICAgICAgICAgIEFkZENoYXJ0U2hlZXQoKTsKKyAgICAgICAgICAgIFNldEhlYWRlckZvb3RlckltYWdlKCk7CisKKyAgICAgICAgICAgIFNhdmVXb3Jrc2hlZXQoIldvcmtzaGVldC54bHN4Iik7CisKKyAgICAgICAgICAgIFJlYWRXb3JrU2hlZXQoKTsKKyAgICAgICAgICAgIFJlYWRTdHJlYW1TYXZlQXNTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBBZGRDaGFydFNoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoYXJ0ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZENoYXJ0KCJDaGFydFNoZWV0IiwgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIF9uIGluIF9wY2suV29ya2Jvb2suTmFtZXMpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vSXRlcmF0ZSBhbGwgY29sbGVjdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgd29ya3NoZWV0IGluIF9wY2suV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoISh3b3Jrc2hlZXQgaXMgRXhjZWxDaGFydHNoZWV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHdvcmtzaGVldC5EcmF3aW5ncykKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gd29ya3NoZWV0LlRhYmxlcykKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gd29ya3NoZWV0LlBpdm90VGFibGVzKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiB3b3Jrc2hlZXQuTmFtZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHdvcmtzaGVldC5Db21tZW50cykKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZykKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkV29ya1NoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVN0cmVhbSBpbnN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKF93b3Jrc2hlZXRQYXRoICsgQCJXb3Jrc2hlZXQueGxzeCIsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKTsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShpbnN0cmVhbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIlBlcmYiXTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuQ2VsbHNbIkg2Il0uRm9ybXVsYSwgIkI1K0I2Iik7CisKKyAgICAgICAgICAgICAgICB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJDb21tZW50Il07CisgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB3cy5DZWxsc1siQjIiXS5Db21tZW50OworCisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKGNvbW1lbnQsIG51bGwpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChjb21tZW50LkF1dGhvciwgIkphbiBLw6RsbG1hbiIpOworICAgICAgICAgICAgICAgIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIkhpZGRlbiJdOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbDxlV29ya1NoZWV0SGlkZGVuPih3cy5IaWRkZW4sIGVXb3JrU2hlZXRIaWRkZW4uSGlkZGVuKTsKKworICAgICAgICAgICAgICAgIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIlZlcnlIaWRkZW4iXTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWw8ZVdvcmtTaGVldEhpZGRlbj4od3MuSGlkZGVuLCBlV29ya1NoZWV0SGlkZGVuLlZlcnlIaWRkZW4pOworCisgICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUmljaFRleHQiXTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlJvb20gMDIgJiAwMyIsIHdzLkNlbGxzWyJHMSJdLlJpY2hUZXh0LlRleHQpOworCisgICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siSGVhZGVySW1hZ2UiXTsKKyAgICAgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbCh3cy5IZWFkZXJGb290ZXIuUGljdHVyZXMuQ291bnQsIDMpOworCisgICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sibmV3c2hlZXQiXTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuQ2VsbHNbIkYyIl0uU3R5bGUuRm9udC5VbmRlckxpbmUsIHRydWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siRjIiXS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUsIEV4Y2VsVW5kZXJMaW5lVHlwZS5Eb3VibGUpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siRjMiXS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUsIEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGVBY2NvdW50aW5nKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuQ2VsbHNbIkY1Il0uU3R5bGUuRm9udC5VbmRlckxpbmVUeXBlLCBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkNlbGxzWyJGNSJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnN0cmVhbS5DbG9zZSgpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkU3RyZWFtV2l0aFRlbXBsYXRlV29ya1NoZWV0KCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVN0cmVhbSBpbnN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKF93b3Jrc2hlZXRQYXRoICsgQCJcV29ya3NoZWV0Lnhsc3giLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpOworICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShzdHJlYW0sIGluc3RyZWFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUGVyZiJdOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siSDYiXS5Gb3JtdWxhLCAiQjUrQjYiKTsKKworICAgICAgICAgICAgICAgIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIm5ld3NoZWV0Il07CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlPERhdGVUaW1lPigyMCwgMjEpLCBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgMSkpOworCisgICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siTG9hZGVkIERhdGFUYWJsZSJdOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZTxzdHJpbmc+KDIsIDEpLCAiUm93MSIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZTxpbnQ+KDIsIDIpLCAxKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWU8Ym9vbD4oMiwgMyksIHRydWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZTxkb3VibGU+KDIsIDQpLCAxLjUpOworCisgICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUmljaFRleHQiXTsKKworICAgICAgICAgICAgICAgIHZhciByMSA9IHdzLkNlbGxzWyJBMSJdLlJpY2hUZXh0WzBdOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyMS5UZXh0LCAiVGVzdCIpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyMS5Cb2xkLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIlBpYyBVUkwiXTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKChFeGNlbFBpY3R1cmUpd3MuRHJhd2luZ3NbIlBpYyBVUkkiXSkuSHlwZXJsaW5rLCAiaHR0cDovL2VwcGx1cy5jb2RlcGxleC5jb20iKTsKKworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwY2suV29ya2Jvb2suV29ya3NoZWV0c1siQWRkcmVzcyJdLkdldFZhbHVlPHN0cmluZz4oNDAsIDEpLCAiXGJcdCIpOworCisgICAgICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJUZXN0XFdvcmtzaGVldDIueGxzeCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc3RyZWFtLkNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBSZWFkU3RyZWFtU2F2ZUFzU3RyZWFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFGaWxlLkV4aXN0cyhfd29ya3NoZWV0UGF0aCArIEAiV29ya3NoZWV0Lnhsc3giKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuSW5jb25jbHVzaXZlKCJXb3Jrc2hlZXQueGxzeCBkb2VzIG5vdCBleGlzdHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVTdHJlYW0gaW5zdHJlYW0gPSBuZXcgRmlsZVN0cmVhbShfd29ya3NoZWV0UGF0aCArIEAiV29ya3NoZWV0Lnhsc3giLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSk7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGluc3RyZWFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siTmFtZXMiXTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuTmFtZXNbIkZ1bGxDb2wiXS5TdGFydC5Sb3csIDEpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5OYW1lc1siRnVsbENvbCJdLkVuZC5Sb3csIEV4Y2VsUGFja2FnZS5NYXhSb3dzKTsKKyAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnN0cmVhbS5DbG9zZSgpOworICAgICAgICB9CisgICAgICAgIC8vCisgICAgICAgIC8vIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFzIHlvdSB3cml0ZSB5b3VyIHRlc3RzOgorICAgICAgICAvLworICAgICAgICAvLyBVc2UgQ2xhc3NJbml0aWFsaXplIHRvIHJ1biBjb2RlIGJlZm9yZSBydW5uaW5nIHRoZSBmaXJzdCB0ZXN0IGluIHRoZSBjbGFzcworICAgICAgICAvLyBVc2UgQ2xhc3NDbGVhbnVwIHRvIHJ1biBjb2RlIGFmdGVyIGFsbCB0ZXN0cyBpbiBhIGNsYXNzIGhhdmUgcnVuCisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9hZERhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIm5ld3NoZWV0Iik7CisgICAgICAgICAgICB3cy5DZWxsc1siVTE5Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAwOSwgMTIsIDMxKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJVMjAiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxLCAxKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJVMjEiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxLCAyKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJVMjIiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxLCAzKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJVMjMiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxLCA0KTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJVMjQiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxLCA1KTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJVMTk6VTI0Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJ5eXl5LW1tLWRkIjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIlYxOSJdLlZhbHVlID0gMTAwOworICAgICAgICAgICAgd3MuQ2VsbHNbIlYyMCJdLlZhbHVlID0gMTAyOworICAgICAgICAgICAgd3MuQ2VsbHNbIlYyMSJdLlZhbHVlID0gMTAxOworICAgICAgICAgICAgd3MuQ2VsbHNbIlYyMiJdLlZhbHVlID0gMTAzOworICAgICAgICAgICAgd3MuQ2VsbHNbIlYyMyJdLlZhbHVlID0gMTA1OworICAgICAgICAgICAgd3MuQ2VsbHNbIlYyNCJdLlZhbHVlID0gMTA0OworICAgICAgICAgICAgd3MuQ2VsbHNbInYxOTp2MjQiXS5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQ7CisgICAgICAgICAgICB3cy5DZWxsc1sidjE5OnYyNCJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSBAIiQjLCMjMC4wMF8pOygkIywjIzAuMDApIjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIlgxOSJdLlZhbHVlID0gMjEwOworICAgICAgICAgICAgd3MuQ2VsbHNbIlgyMCJdLlZhbHVlID0gMjEyOworICAgICAgICAgICAgd3MuQ2VsbHNbIlgyMSJdLlZhbHVlID0gMjIxOworICAgICAgICAgICAgd3MuQ2VsbHNbIlgyMiJdLlZhbHVlID0gMTIzOworICAgICAgICAgICAgd3MuQ2VsbHNbIlgyMyJdLlZhbHVlID0gMTM1OworICAgICAgICAgICAgd3MuQ2VsbHNbIlgyNCJdLlZhbHVlID0gMTM0OworCisgICAgICAgICAgICAvLyBhZGQgYXV0b2ZpbHRlcgorICAgICAgICAgICAgd3MuQ2VsbHNbIlUxOTpYMjQiXS5BdXRvRmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIEV4Y2VsUGljdHVyZSBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMxIiwgUHJvcGVydGllcy5SZXNvdXJjZXMuVGVzdDEpOworICAgICAgICAgICAgcGljLlNldFBvc2l0aW9uKDE1MCwgMTQwKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkEzMCJdLlZhbHVlID0gIlRleHQgb3JpZW50YXRpb24gNDUiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkEzMCJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDQ1OworICAgICAgICAgICAgd3MuQ2VsbHNbIkIzMCJdLlZhbHVlID0gIlRleHQgb3JpZW50YXRpb24gOTAiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIzMCJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDkwOworICAgICAgICAgICAgd3MuQ2VsbHNbIkMzMCJdLlZhbHVlID0gIlRleHQgb3JpZW50YXRpb24gMTgwIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJDMzAiXS5TdHlsZS5UZXh0Um90YXRpb24gPSAxODA7CisgICAgICAgICAgICB3cy5DZWxsc1siRDMwIl0uVmFsdWUgPSAiVGV4dCBvcmllbnRhdGlvbiAzOCI7CisgICAgICAgICAgICB3cy5DZWxsc1siRDMwIl0uU3R5bGUuVGV4dFJvdGF0aW9uID0gMzg7CisgICAgICAgICAgICB3cy5DZWxsc1siRDMwIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJEMzAiXS5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQ7CisKKyAgICAgICAgICAgIHdzLldvcmtib29rLk5hbWVzLkFkZCgiVGVzdE5hbWUiLCB3cy5DZWxsc1siQjMwOkUzMCJdKTsKKyAgICAgICAgICAgIHdzLldvcmtib29rLk5hbWVzWyJUZXN0TmFtZSJdLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuUmVkKTsKKworCisgICAgICAgICAgICB3cy5Xb3JrYm9vay5OYW1lc1siVGVzdE5hbWUiXS5PZmZzZXQoMSwgMCkuVmFsdWUgPSAiT2Zmc2V0IHRlc3QgMSI7CisgICAgICAgICAgICB3cy5Xb3JrYm9vay5OYW1lc1siVGVzdE5hbWUiXS5PZmZzZXQoMiwgLTEsIDIsIDIpLlZhbHVlID0gIk9mZnNldCB0ZXN0IDIiOworCisgICAgICAgICAgICAvL1Rlc3QgdmVydGljYWwgYWxpZ24KKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMTkiXS5WYWx1ZSA9ICJTdWJzY3JpcHQiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkUxOSJdLlN0eWxlLkZvbnQuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250LlN1YnNjcmlwdDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMjAiXS5WYWx1ZSA9ICJTdWJzY3JpcHQiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMCJdLlN0eWxlLkZvbnQuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250LlN1cGVyc2NyaXB0OworICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMSJdLlZhbHVlID0gIlN1cGVyc2NyaXB0IjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMjEiXS5TdHlsZS5Gb250LlZlcnRpY2FsQWxpZ24gPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5TdXBlcnNjcmlwdDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMjEiXS5TdHlsZS5Gb250LlZlcnRpY2FsQWxpZ24gPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lOworCisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMjIiXS5WYWx1ZSA9ICJJbmRlbnQgMiI7CisgICAgICAgICAgICB3cy5DZWxsc1siRTIyIl0uU3R5bGUuSW5kZW50ID0gMjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMjMiXS5WYWx1ZSA9ICJTaHJpbmsgdG8gZml0IjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJFMjMiXS5TdHlsZS5TaHJpbmtUb0ZpdCA9IHRydWU7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJlMjQiXS5WYWx1ZSA9ICJSZWFkaW5nT3JkZXIgTGVmdFRvUmlnaHQiOworICAgICAgICAgICAgd3MuQ2VsbHNbImUyNCJdLlN0eWxlLlJlYWRpbmdPcmRlciA9IEV4Y2VsUmVhZGluZ09yZGVyLkxlZnRUb1JpZ2h0OworICAgICAgICAgICAgd3MuQ2VsbHNbImUyNSJdLlZhbHVlID0gIlJlYWRpbmdPcmRlciBSaWdodFRvTGVmdCI7CisgICAgICAgICAgICB3cy5DZWxsc1siZTI1Il0uU3R5bGUuUmVhZGluZ09yZGVyID0gRXhjZWxSZWFkaW5nT3JkZXIuUmlnaHRUb0xlZnQ7CisgICAgICAgICAgICB3cy5DZWxsc1siZTI2Il0uVmFsdWUgPSAiUmVhZGluZ09yZGVyIENvbnRleHQiOworICAgICAgICAgICAgd3MuQ2VsbHNbImUyNiJdLlN0eWxlLlJlYWRpbmdPcmRlciA9IEV4Y2VsUmVhZGluZ09yZGVyLkNvbnRleHREZXBlbmRlbnQ7CisgICAgICAgICAgICB3cy5DZWxsc1siZTI3Il0uVmFsdWUgPSAiRGVmYXVsdCBSZWFkaW5nb3JkZXIiOworCisgICAgICAgICAgICAvL1VuZGVybGluZQorCisgICAgICAgICAgICB3cy5DZWxsc1siRjE6RjciXS5WYWx1ZSA9ICJVbmRlcmxpbmVkIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJGMSJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGU7CisgICAgICAgICAgICB3cy5DZWxsc1siRjIiXS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuRG91YmxlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkYzIl0uU3R5bGUuRm9udC5VbmRlckxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZUFjY291bnRpbmc7CisgICAgICAgICAgICB3cy5DZWxsc1siRjQiXS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuRG91YmxlQWNjb3VudGluZzsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJGNSJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5Ob25lOworICAgICAgICAgICAgd3MuQ2VsbHNbIkY2OkY3Il0uU3R5bGUuRm9udC5VbmRlckxpbmUgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkY3Il0uU3R5bGUuRm9udC5VbmRlckxpbmUgPSBmYWxzZTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkUyNCJdLlZhbHVlID0gMDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siRTI0Il0uVGV4dCwgIjAiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJGNyJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lID0gZmFsc2U7CisgICAgICAgICAgICB3cy5OYW1lcy5BZGQoIlNoZWV0TmFtZSIsIHdzLkNlbGxzWyJBMTpBMiJdKTsKKyAgICAgICAgICAgIHdzLlZpZXcuRnJlZXplUGFuZXMoMywgNSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsUmFuZ2VCYXNlIGNlbGwgaW4gd3MuQ2VsbHNbIkExIl0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkExIGlzIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxSYW5nZUJhc2UgY2VsbCBpbiB3cy5DZWxsc1t3cy5EaW1lbnNpb24uQWRkcmVzc10pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnLldyaXRlTGluZShjZWxsLkFkZHJlc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8vTGlucSB0ZXN0CisgICAgICAgICAgICB2YXIgcmVzID0gZnJvbSBjIGluIHdzLkNlbGxzW3dzLkRpbWVuc2lvbi5BZGRyZXNzXSB3aGVyZSBjLlZhbHVlICE9IG51bGwgJiYgYy5WYWx1ZS5Ub1N0cmluZygpID09ICJPZmZzZXQgdGVzdCAxIiBzZWxlY3QgYzsKKworICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxSYW5nZUJhc2UgY2VsbCBpbiByZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnLldyaXRlTGluZShjZWxsLkFkZHJlc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBLw6RsbG1hbiI7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuQ2F0ZWdvcnkgPSAiQ2F0ZWdvcnkiOworICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbW1lbnRzID0gIkNvbW1lbnRzIjsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5Db21wYW55ID0gIkFkdmVudHVyZSB3b3JrcyI7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuS2V5d29yZHMgPSAiS2V5d29yZHMiOworICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIlRpdGxlIjsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TdWJqZWN0ID0gIlN1YmplY3QiOworICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlN0YXR1cyA9ICJTdGF0dXMiOworICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkh5cGVybGlua0Jhc2UgPSBuZXcgVXJpKCJodHRwOi8vc2VydmVyc2lkZWV4Y2VsLmNvbSIsIFVyaUtpbmQuQWJzb2x1dGUpOworICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLk1hbmFnZXIgPSAiTWFuYWdlciI7CisKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJEYXRlVGVzdCIsIG5ldyBEYXRlVGltZSgyMDA4LCAxMiwgMzEpKTsKKyAgICAgICAgICAgIFRlc3RDb250ZXh0LldyaXRlTGluZShfcGNrLldvcmtib29rLlByb3BlcnRpZXMuR2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiRGF0ZVRlc3QiKS5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJBdXRob3IiLCAiSmFuIEvDpGxsbWFuIik7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQ291bnQiLCAxKTsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJJc1Rlc3RlZCIsIGZhbHNlKTsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJMYXJnZU5vIiwgMTIzNDU2Nzg5MTIzKTsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJBdXRob3IiLCAzKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBpbnQgUEVSRl9ST1dTID0gNTAwMDsKKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQZXJmb3JtYW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGVyZiIpOworICAgICAgICAgICAgVGVzdENvbnRleHQuV3JpdGVMaW5lKCJTdGFydFRpbWUgezB9IiwgRGF0ZVRpbWUuTm93KTsKKworICAgICAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBQRVJGX1JPV1M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1tpLCAxXS5WYWx1ZSA9IHN0cmluZy5Gb3JtYXQoIlJvdyB7MH1cbi5UZXN0IG5ldyByb3dcIicgw7bDpMOlw7wiLCBpKTsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1tpLCAyXS5WYWx1ZSA9IGk7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbaSwgMl0uU3R5bGUuV3JhcFRleHQgPSB0cnVlOworICAgICAgICAgICAgICAgIHdzLkNlbGxzW2ksIDNdLlZhbHVlID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIHdzLkNlbGxzW2ksIDRdLlZhbHVlID0gci5OZXh0RG91YmxlKCkgKiAxMDAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cy5DZWxsc1sxLCAyLCBQRVJGX1JPV1MsIDJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMywgUEVSRl9ST1dTLCAzXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktTU0tZGQgSEg6bW06c3MiOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgNCwgUEVSRl9ST1dTLCA0XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwIjsKKyAgICAgICAgICAgIHdzLkNlbGxzW1BFUkZfUk9XUyArIDEsIDJdLkZvcm11bGEgPSAiU1VNKEIxOkIiICsgUEVSRl9ST1dTLlRvU3RyaW5nKCkgKyAiKSI7CisgICAgICAgICAgICB3cy5Db2x1bW4oMSkuV2lkdGggPSAxMjsKKyAgICAgICAgICAgIHdzLkNvbHVtbigyKS5XaWR0aCA9IDg7CisgICAgICAgICAgICB3cy5Db2x1bW4oMykuV2lkdGggPSAyMDsKKyAgICAgICAgICAgIHdzLkNvbHVtbig0KS5XaWR0aCA9IDE0OworCisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QzEiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siQTI6QTUiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5EZWxldGVSb3coMSwgMSk7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMSwgMSk7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMywgMSk7CisKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxMDAwLCAzLCB0cnVlKTsKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygyMDAwLCAxLCB0cnVlKTsKKworICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDIwMDEsIDQpOworCisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMjAxMCwgMSwgMjAxMCk7CisKKyAgICAgICAgICAgIHdzLkluc2VydFJvdygyMDAwMCwgMik7CisKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygyMDAwNSwgNCwgZmFsc2UpOworCisgICAgICAgICAgICAvL1NpbmdsZSBmb3JtdWxhCisgICAgICAgICAgICB3cy5DZWxsc1siSDMiXS5Gb3JtdWxhID0gIkIyK0IzIjsKKyAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygyLCAxLCB0cnVlKTsKKworICAgICAgICAgICAgLy9TaGFyZWQgZm9ybXVsYQorICAgICAgICAgICAgd3MuQ2VsbHNbIkg1OkgzMCJdLkZvcm11bGEgPSAiQjQrQjUiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkg1OkgzMCJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiXyhcIiRcIiogIyAjIzAuMDBfKTtfKFwiJFwiKiAoIyAjIzAuMDApO18oXCIkXCIqIFwiLVwiPz9fKTtfKEBfKSI7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coNywgMyk7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMiwgMSk7CisgICAgICAgICAgICB3cy5EZWxldGVSb3coMzAsIDMsIHRydWUpOworCisgICAgICAgICAgICB3cy5EZWxldGVSb3coMTUsIDIsIHRydWUpOworICAgICAgICAgICAgd3MuQ2VsbHNbImExOkIxMDAiXS5TdHlsZS5Mb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJhMTpCMTIiXS5TdHlsZS5IaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgVGVzdENvbnRleHQuV3JpdGVMaW5lKCJFbmRUaW1lIHswfSIsIERhdGVUaW1lLk5vdyk7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnREZWxldGVUZXN0Um93cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0RGVsZXRlIik7CisgICAgICAgICAgICAvL3dzLkNlbGxzLlZhbHVlID0gMDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpDNSJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoKG9iamVjdFssXSl3cy5DZWxsc1siQTE6QzUiXS5WYWx1ZSlbMSwgMV0sIDEpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkIzIl0uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkQzIl0uRm9ybXVsYSA9ICJBMitDNSI7CisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMiwgMSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTA6QzE1Il0uVmFsdWUgPSAxOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExMTpCMTMiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5EZWxldGVSb3coMTIsIDEsIHRydWUpOworCisgICAgICAgICAgICB3cy5DZWxsc1siYTE6QjEwMCJdLlN0eWxlLkxvY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgd3MuQ2VsbHNbImExOkIxMiJdLlN0eWxlLkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICB3cy5Qcm90ZWN0aW9uLklzUHJvdGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLlByb3RlY3Rpb24uU2V0UGFzc3dvcmQoIlBhc3N3b3JkIik7CisKKworICAgICAgICAgICAgdmFyIHJhbmdlID0gd3MuQ2VsbHNbIkIyOkQxMDAiXTsKKworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlByaW50QXJlYSA9IG51bGw7CisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gd3MuQ2VsbHNbIkIyOkQ5OSJdOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlByaW50QXJlYSA9IG51bGw7CisgICAgICAgICAgICB3cy5Sb3coMTUpLlBhZ2VCcmVhayA9IHRydWU7CisgICAgICAgICAgICB3cy5Db2x1bW4oMykuUGFnZUJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLlZpZXcuU2hvd0hlYWRlcnMgPSBmYWxzZTsKKyAgICAgICAgICAgIHdzLlZpZXcuUGFnZUJyZWFrVmlldyA9IHRydWU7CisKKyAgICAgICAgICAgIHdzLlJvdygyMDApLkhlaWdodCA9IDUwOworICAgICAgICAgICAgd3MuV29ya2Jvb2suQ2FsY01vZGUgPSBFeGNlbENhbGNNb2RlLkF1dG9tYXRpYzsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLlN0YXJ0LkNvbHVtbiwgMik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmFuZ2UuU3RhcnQuUm93LCAyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyYW5nZS5TdGFydC5BZGRyZXNzLCAiQjIiKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLkVuZC5Db2x1bW4sIDQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLkVuZC5Sb3csIDEwMCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmFuZ2UuRW5kLkFkZHJlc3MsICJEMTAwIik7CisKKyAgICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcygiQjE6RDMiKTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFkZHIuU3RhcnQuQ29sdW1uLCAyKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChhZGRyLlN0YXJ0LlJvdywgMSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5FbmQuQ29sdW1uLCA0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChhZGRyLkVuZC5Sb3csIDMpOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgSW5zZXJ0RGVsZXRlVGVzdENvbHVtbnMoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkluc2VydERlbGV0ZUNvbHVtbnMiKTsKKyAgICAgICAgICAgIC8vd3MuQ2VsbHMuVmFsdWUgPSAwOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkM1Il0uVmFsdWUgPSAxOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCgob2JqZWN0WyxdKXdzLkNlbGxzWyJBMTpDNSJdLlZhbHVlKVsxLCAxXSwgMSk7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QjMiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siRDMiXS5Gb3JtdWxhID0gIkEyK0M1IjsKKyAgICAgICAgICAgIHdzLkluc2VydENvbHVtbigxLCAxKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIksxMDpNMTUiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICB3cy5DZWxsc1siSzExOkwxMyJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkRlbGV0ZUNvbHVtbigxMiwgMSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJYMTpZMTAwIl0uU3R5bGUuTG9ja2VkID0gZmFsc2U7CisgICAgICAgICAgICB3cy5DZWxsc1siQzE6WTEyIl0uU3R5bGUuSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLlByb3RlY3Rpb24uSXNQcm90ZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiUGFzc3dvcmQiKTsKKworCisgICAgICAgICAgICB2YXIgcmFuZ2UgPSB3cy5DZWxsc1siWDI6WjEwMCJdOworCisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gbnVsbDsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QcmludEFyZWEgPSB3cy5DZWxsc1siWDI6Wjk5Il07CisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gbnVsbDsKKyAgICAgICAgICAgIHdzLlJvdygxNSkuUGFnZUJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNvbHVtbigzKS5QYWdlQnJlYWsgPSB0cnVlOworICAgICAgICAgICAgd3MuVmlldy5TaG93SGVhZGVycyA9IGZhbHNlOworICAgICAgICAgICAgd3MuVmlldy5QYWdlQnJlYWtWaWV3ID0gdHJ1ZTsKKworICAgICAgICAgICAgd3MuUm93KDIwMCkuSGVpZ2h0ID0gNTA7CisgICAgICAgICAgICB3cy5Xb3JrYm9vay5DYWxjTW9kZSA9IEV4Y2VsQ2FsY01vZGUuQXV0b21hdGljOworCisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbChyYW5nZS5TdGFydC5Db2x1bW4sIDIpOworICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwocmFuZ2UuU3RhcnQuUm93LCAyKTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLlN0YXJ0LkFkZHJlc3MsICJCMiIpOworCisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbChyYW5nZS5FbmQuQ29sdW1uLCA0KTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLkVuZC5Sb3csIDEwMCk7CisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbChyYW5nZS5FbmQuQWRkcmVzcywgIkQxMDAiKTsKKworICAgICAgICAgICAgLy9FeGNlbEFkZHJlc3MgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3MoIkIxOkQzIik7CisKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKGFkZHIuU3RhcnQuQ29sdW1uLCAyKTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKGFkZHIuU3RhcnQuUm93LCAxKTsKKyAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKGFkZHIuRW5kLkNvbHVtbiwgNCk7CisgICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbChhZGRyLkVuZC5Sb3csIDMpOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmljaFRleHRDZWxscygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUmljaFRleHQiKTsKKyAgICAgICAgICAgIHZhciBycyA9IHdzLkNlbGxzWyJBMSJdLlJpY2hUZXh0OworCisgICAgICAgICAgICB2YXIgcjEgPSBycy5BZGQoIlRlc3QiKTsKKyAgICAgICAgICAgIHIxLkJvbGQgPSB0cnVlOworICAgICAgICAgICAgcjEuQ29sb3IgPSBDb2xvci5QaW5rOworCisgICAgICAgICAgICB2YXIgcjIgPSBycy5BZGQoIiBvZiIpOworICAgICAgICAgICAgcjIuU2l6ZSA9IDE0OworICAgICAgICAgICAgcjIuSXRhbGljID0gdHJ1ZTsKKworICAgICAgICAgICAgdmFyIHIzID0gcnMuQWRkKCIgcmljaCIpOworICAgICAgICAgICAgcjMuRm9udE5hbWUgPSAiQXJpYWwiOworICAgICAgICAgICAgcjMuU2l6ZSA9IDE4OworICAgICAgICAgICAgcjMuSXRhbGljID0gdHJ1ZTsKKworICAgICAgICAgICAgdmFyIHI0ID0gcnMuQWRkKCJ0ZXh0LiIpOworICAgICAgICAgICAgcjQuU2l6ZSA9IDguMjVmOworICAgICAgICAgICAgcjQuSXRhbGljID0gdHJ1ZTsKKyAgICAgICAgICAgIHI0LlVuZGVyTGluZSA9IHRydWU7CisKKyAgICAgICAgICAgIHJzID0gd3MuQ2VsbHNbIkEzOkE0Il0uUmljaFRleHQ7CisKKyAgICAgICAgICAgIHZhciByNSA9IHJzLkFkZCgiRG91YmxlIik7CisgICAgICAgICAgICByNS5Db2xvciA9IENvbG9yLlBlYWNoUHVmZjsKKyAgICAgICAgICAgIHI1LkZvbnROYW1lID0gInRpbWVzIG5ldyByb21hbiI7CisgICAgICAgICAgICByNS5TaXplID0gMTY7CisKKyAgICAgICAgICAgIHZhciByNiA9IHJzLkFkZCgiIGNlbGxzIik7CisgICAgICAgICAgICByNi5Db2xvciA9IENvbG9yLlJlZDsKKyAgICAgICAgICAgIHI2LlVuZGVyTGluZSA9IHRydWU7CisKKworICAgICAgICAgICAgcnMgPSB3cy5DZWxsc1siQzgiXS5SaWNoVGV4dDsKKyAgICAgICAgICAgIHIxID0gcnMuQWRkKCJCbHVlICIpOworICAgICAgICAgICAgcjEuQ29sb3IgPSBDb2xvci5CbHVlOworCisgICAgICAgICAgICByMiA9IHJzLkFkZCgiUmVkIik7CisgICAgICAgICAgICByMi5Db2xvciA9IENvbG9yLlJlZDsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkcxIl0uUmljaFRleHQuQWRkKCJSb29tIDAyICYgMDMiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJHMiJdLlJpY2hUZXh0LlRleHQgPSAiUm9vbSAwMiAmIDAzIjsKKworICAgICAgICAgICAgd3MgPSB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlJpY2hUZXh0MiIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uUmljaFRleHQuVGV4dCA9ICJSb29tIDAyICYgMDMiOworICAgICAgICAgICAgd3MuVGFiQ29sb3IgPSBDb2xvci5Qb3dkZXJCbHVlOworCisgICAgICAgICAgICByMSA9IHdzLkNlbGxzWyJHMyJdLlJpY2hUZXh0LkFkZCgiVGVzdCIpOworICAgICAgICAgICAgcjEuQm9sZCA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siRzMiXS5SaWNoVGV4dC5BZGQoIiBhIG5ldyB0Iik7CisgICAgICAgICAgICB3cy5DZWxsc1siRzMiXS5SaWNoVGV4dFsxXS5Cb2xkID0gZmFsc2U7IDsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDb21tZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbW1lbnQiKTsKKyAgICAgICAgICAgIHZhciBjb21tZW50ID0gd3MuQ29tbWVudHMuQWRkKHdzLkNlbGxzWyJDMyJdLCAiSmFuIEvDpGxsbWFuXHJcbkF1dGhvclxyXG4iLCAiSksiKTsKKyAgICAgICAgICAgIGNvbW1lbnQuUmljaFRleHRbMF0uQm9sZCA9IHRydWU7CisgICAgICAgICAgICBjb21tZW50LlJpY2hUZXh0WzBdLlByZXNlcnZlU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgdmFyIHJ0ID0gY29tbWVudC5SaWNoVGV4dC5BZGQoIlRlc3QgY29tbWVudCIpOworICAgICAgICAgICAgY29tbWVudC5WZXJ0aWNhbEFsaWdubWVudCA9IGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5DZW50ZXI7CisgICAgICAgICAgICBjb21tZW50ID0gd3MuQ29tbWVudHMuQWRkKHdzLkNlbGxzWyJBMiJdLCAiSmFuIEvDpGxsbWFuXHJcbkF1dGhvclxyXG4xIiwgIkpLIik7CisKKyAgICAgICAgICAgIGNvbW1lbnQgPSB3cy5Db21tZW50cy5BZGQod3MuQ2VsbHNbIkExIl0sICJKYW4gS8OkbGxtYW5cclxuQXV0aG9yXHJcbjIiLCAiSksiKTsKKyAgICAgICAgICAgIGNvbW1lbnQuQWx0ZXJuYXRpdmVUZXh0ID0gIlRlc3Qgb2YgQWx0ZXJuZXRpdmVUZXh0MiI7CisgICAgICAgICAgICBjb21tZW50ID0gd3MuQ29tbWVudHMuQWRkKHdzLkNlbGxzWyJDMiJdLCAiSmFuIEvDpGxsbWFuXHJcbkF1dGhvclxyXG4zIiwgIkpLIik7CisgICAgICAgICAgICBjb21tZW50ID0gd3MuQ29tbWVudHMuQWRkKHdzLkNlbGxzWyJDMSJdLCAiSmFuIEvDpGxsbWFuXHJcbkF1dGhvclxyXG41IiwgIkpLIik7CisgICAgICAgICAgICBjb21tZW50ID0gd3MuQ29tbWVudHMuQWRkKHdzLkNlbGxzWyJCMSJdLCAiSmFuIEvDpGxsbWFuXHJcbkF1dGhvclxyXG43IiwgIkpLIik7CisKKyAgICAgICAgICAgIHdzLkNvbW1lbnRzLlJlbW92ZSh3cy5DZWxsc1siQTIiXS5Db21tZW50KTsKKyAgICAgICAgICAgIC8vY29tbWVudC5Ib3Jpem9udGFsQWxpZ25tZW50ID0gZVRleHRBbGlnbkhvcml6b250YWxWbWwuQ2VudGVyOworICAgICAgICAgICAgLy9jb21tZW50LlZpc2libGUgPSB0cnVlOworICAgICAgICAgICAgLy9jb21tZW50LkJhY2tncm91bmRDb2xvciA9IENvbG9yLkdyZWVuOworICAgICAgICAgICAgLy9jb21tZW50LlRvLlJvdyArPSA0OworICAgICAgICAgICAgLy9jb21tZW50LlRvLkNvbHVtbiArPSAyOworICAgICAgICAgICAgLy9jb21tZW50LkxpbmVTdHlsZSA9IGVMaW5lU3R5bGVWbWwuTG9uZ0Rhc2g7CisgICAgICAgICAgICAvL2NvbW1lbnQuTGluZUNvbG9yID0gQ29sb3IuUmVkOworICAgICAgICAgICAgLy9jb21tZW50LkxpbmVXaWR0aCA9IChTaW5nbGUpMi41OworICAgICAgICAgICAgLy9ydC5Db2xvciA9IENvbG9yLlJlZDsKKworICAgICAgICAgICAgdmFyIHJ0MiA9IHdzLkNlbGxzWyJCMiJdLkFkZENvbW1lbnQoIlJhbmdlIEFkZGVkIENvbW1lbnQgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0dGVzdHRlc3R0ZXN0dGVzdHRlc3R0ZXN0dGVzdHRlc3R0ZXN0dGVzdCIsICJKYW4gS8OkbGxtYW4iKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJjMyJdLkNvbW1lbnQuQXV0b0ZpdCA9IHRydWU7CisKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3MoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJBZGRyZXNzIik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QTQsQjU6QjciXS5WYWx1ZSA9ICJBZGRyZXNzVGVzdCI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QTQsQjU6QjciXS5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7CisgICAgICAgICAgICB3cy5DZWxsc1siQTI6QTMsQjQ6QjgiXS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEZpbGxTdHlsZS5MaWdodFVwOworICAgICAgICAgICAgd3MuQ2VsbHNbIkEyOkEzLEI0OkI4Il0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmVlbik7CisgICAgICAgICAgICB3cy5DZWxsc1siMjoyIl0uU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICB3cy5DZWxsc1siMjoyIl0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmVlbik7CisgICAgICAgICAgICB3cy5DZWxsc1siQjpCIl0uU3R5bGUuRm9udC5OYW1lID0gIlRpbWVzIE5ldyBSb21hbiI7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJDNDpHNCxIODpIMzAsQjE1Il0uRm9ybXVsYVIxQzEgPSAiUkNbLTFdK1IxQ1stMV0iOworICAgICAgICAgICAgd3MuQ2VsbHNbIkM0Okc0LEg4OkgzMCxCMTUiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwMCI7CisgICAgICAgICAgICB3cy5DZWxsc1siRzEsRzMiXS5IeXBlcmxpbmsgPSBuZXcgRXhjZWxIeXBlckxpbmsoIkNvbW1lbnQhJEEkMSIsICJDb21tZW50Iik7CisgICAgICAgICAgICB3cy5DZWxsc1siRzEsRzMiXS5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLkJsdWUpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkcxLEczIl0uU3R5bGUuRm9udC5VbmRlckxpbmUgPSB0cnVlOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTE6RzUiXS5Db3B5KHdzLkNlbGxzWyJBNTAiXSk7CisKKyAgICAgICAgICAgIHZhciB3czIgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3B5IENlbGxzIik7CisgICAgICAgICAgICB3cy5DZWxsc1siMTo0Il0uQ29weSh3czIuQ2VsbHNbIjE6MSJdKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkgxOko1Il0uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIjI6MyJdLkNvcHkod3MuQ2VsbHNbIjUwOjUxIl0pOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTQwIl0uVmFsdWUgPSBuZXcgc3RyaW5nKG5ldyBjaGFyW10geyAoY2hhcik4LCAoY2hhcik5IH0pOworCisgICAgICAgICAgICBFeGNlbFJhbmdlIHN0eWxlUm5nID0gd3MuQ2VsbHNbIkExIl07CisgICAgICAgICAgICBFeGNlbFN0eWxlIHRlbXBTdHlsZSA9IHN0eWxlUm5nLlN0eWxlOworICAgICAgICAgICAgdmFyIG5hbWVkU3R5bGUgPSBfcGNrLldvcmtib29rLlN0eWxlcy5DcmVhdGVOYW1lZFN0eWxlKCJIeXBlckxpbmsiLCB0ZW1wU3R5bGUpOworICAgICAgICAgICAgbmFtZWRTdHlsZS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuU2luZ2xlOworICAgICAgICAgICAgbmFtZWRTdHlsZS5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLkJsdWUpOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRW5jb2RpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJFbmNvZGluZyIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiX3gwMDk5XyI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9ICIgVGVzdCBcYiIgKyAoY2hhcikxICsgIiBlbmRcIiI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTMiXS5WYWx1ZSA9ICJfeDAwOTdfIHRlc3RfeDAwMURfMTIzNCI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTQiXS5WYWx1ZSA9ICJ0ZXN0IiArIChjaGFyKTMxOyAgIC8vQnVnIGlzc3VlIDE0Njg5IC8vRml4ZWQKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFdvcmtzaGVldENvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3BpZWQgQWRkcmVzcyIsIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siQWRkcmVzcyJdKTsKKyAgICAgICAgICAgIHZhciB3c0NvcHkgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3BpZWQgQ29tbWVudCIsIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siQ29tbWVudCJdKTsKKworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjazIgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICBwY2syLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3B5IEZyb20gb3RoZXIgcGNrIiwgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJBZGRyZXNzIl0pOworICAgICAgICAgICAgcGNrMi5TYXZlQXMobmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgImNvcHkueGxzeCIpKTsKKyAgICAgICAgICAgIHBjazIgPSBudWxsOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIHdzQ29weS5Db21tZW50cy5Db3VudCk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3REZWxldGUoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgZmlsZSA9IF93b3Jrc2hlZXRQYXRoICsgInRlc3QueGxzeCI7CisKKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkKKyAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShmaWxlKTsKKworICAgICAgICAgICAgQ3JlYXRlKGZpbGUpOworCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGFjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKGZpbGUpKTsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHcgPSBwYWNrLldvcmtib29rLldvcmtzaGVldHNbImRlbGV0ZSJdOworICAgICAgICAgICAgdy5EZWxldGVSb3coMSwgMik7CisKKyAgICAgICAgICAgIHBhY2suU2F2ZSgpOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9hZEZyb21Db2xsZWN0aW9uVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxvYWRGcm9tQ29sbGVjdGlvbiIpOworICAgICAgICAgICAgTGlzdDxUZXN0RFRPPiBsaXN0ID0gbmV3IExpc3Q8VGVzdERUTz4oKTsKKyAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDEsIE5hbWUgPSAiSXRlbTEiLCBCb29sZWFuID0gZmFsc2UsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMSwgMSwgMSksIGR0byA9IG51bGwsIE5hbWVWYXIgPSAiRmllbGQgMSIgfSk7CisgICAgICAgICAgICBsaXN0LkFkZChuZXcgVGVzdERUTygpIHsgSWQgPSAyLCBOYW1lID0gIkl0ZW0yIiwgQm9vbGVhbiA9IHRydWUsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMSwgMSwgMTUpLCBkdG8gPSBuZXcgVGVzdERUTygpLCBOYW1lVmFyID0gIkZpZWxkIDIiIH0pOworICAgICAgICAgICAgbGlzdC5BZGQobmV3IFRlc3REVE8oKSB7IElkID0gMywgTmFtZSA9ICJJdGVtMyIsIEJvb2xlYW4gPSBmYWxzZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDExLCAyLCAxKSwgZHRvID0gbnVsbCwgTmFtZVZhciA9ICJGaWVsZCAzIiB9KTsKKyAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDQsIE5hbWUgPSAiSXRlbTQiLCBCb29sZWFuID0gdHJ1ZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDExLCA0LCAxOSksIGR0byA9IGxpc3RbMV0sIE5hbWVWYXIgPSAiRmllbGQgNCIgfSk7CisgICAgICAgICAgICBsaXN0LkFkZChuZXcgVGVzdERUTygpIHsgSWQgPSA1LCBOYW1lID0gIkl0ZW01IiwgQm9vbGVhbiA9IGZhbHNlLCBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTEsIDUsIDgpLCBkdG8gPSBudWxsLCBOYW1lVmFyID0gIkZpZWxkIDUiIH0pOworICAgICAgICAgICAgbGlzdC5BZGQobmV3IFRlc3REVE8oKSB7IElkID0gNiwgTmFtZSA9ICJJdGVtNiIsIEJvb2xlYW4gPSB0cnVlLCBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTAsIDMsIDI3KSwgZHRvID0gbnVsbCwgTmFtZVZhciA9ICJGaWVsZCA2IiB9KTsKKyAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDcsIE5hbWUgPSAiSXRlbTciLCBCb29sZWFuID0gZmFsc2UsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAwOSwgMSwgNSksIGR0byA9IGxpc3RbM10sIE5hbWVWYXIgPSAiRmllbGQgNyIgfSk7CisgICAgICAgICAgICBsaXN0LkFkZChuZXcgVGVzdERUTygpIHsgSWQgPSA4LCBOYW1lID0gIkl0ZW04IiwgQm9vbGVhbiA9IHRydWUsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxOCwgMTIsIDMxKSwgZHRvID0gbnVsbCwgTmFtZVZhciA9ICJGaWVsZCA4IiB9KTsKKyAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDksIE5hbWUgPSAiSXRlbTkiLCBCb29sZWFuID0gZmFsc2UsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMiwgMSksIGR0byA9IG51bGwsIE5hbWVWYXIgPSAiRmllbGQgOSIgfSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0LCB0cnVlKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMzAiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdCwgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW05LCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UgfCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UsIHR5cGVvZihUZXN0RFRPKS5HZXRGaWVsZHMoKSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBNDUiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdCwgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5MaWdodDEsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgbmV3IE1lbWJlckluZm9bXSB7IHR5cGVvZihUZXN0RFRPKS5HZXRNZXRob2QoIkdldE5hbWVJRCIpLCB0eXBlb2YoVGVzdERUTykuR2V0RmllbGQoIk5hbWVWYXIiKSB9KTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJKMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihmcm9tIGwgaW4gbGlzdCB3aGVyZSBsLkJvb2xlYW4gb3JkZXJieSBsLkRhdGUgc2VsZWN0IG5ldyB7IE5hbWUgPSBsLk5hbWUsIElkID0gbC5JZCwgRGF0ZSA9IGwuRGF0ZSwgTmFtZVZhcmlhYmxlID0gbC5OYW1lVmFyIH0sIHRydWUsIE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuRGFyazQpOworCisgICAgICAgICAgICB2YXIgaW50cyA9IG5ldyBpbnRbXSB7IDEsIDMsIDQsIDc2LCAyLCA1IH07CisgICAgICAgICAgICB3cy5DZWxsc1siQTE1Il0uVmFsdWUgPSBpbnRzOworICAgICAgICB9CisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRGcm9tRW1wdHlDb2xsZWN0aW9uVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcGNrID09IG51bGwpIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkRnJvbUVtcHlDb2xsZWN0aW9uIik7CisgICAgICAgICAgICBMaXN0PFRlc3REVE8+IGxpc3REVE8gPSBuZXcgTGlzdDxUZXN0RFRPPigwKTsKKyAgICAgICAgICAgIC8vTGlzdDxpbnQ+IGxpc3QgPSBuZXcgTGlzdDxpbnQ+KDApOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdERUTywgdHJ1ZSk7CisgICAgICAgICAgICB3cy5DZWxsc1siQTUiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdERUTywgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW05LCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UgfCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UsIHR5cGVvZihUZXN0RFRPKS5HZXRGaWVsZHMoKSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTAiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdERUTywgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5MaWdodDEsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgbmV3IE1lbWJlckluZm9bXSB7IHR5cGVvZihUZXN0RFRPKS5HZXRNZXRob2QoIkdldE5hbWVJRCIpLCB0eXBlb2YoVGVzdERUTykuR2V0RmllbGQoIk5hbWVWYXIiKSB9KTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTUiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oZnJvbSBsIGluIGxpc3REVE8gd2hlcmUgbC5Cb29sZWFuIG9yZGVyYnkgbC5EYXRlIHNlbGVjdCBuZXcgeyBOYW1lID0gbC5OYW1lLCBJZCA9IGwuSWQsIERhdGUgPSBsLkRhdGUsIE5hbWVWYXJpYWJsZSA9IGwuTmFtZVZhciB9LCB0cnVlLCBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLkRhcms0KTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkEyMCJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0RFRPLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRGcm9tT25lQ29sbGVjdGlvblRlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3BjayA9PSBudWxsKSBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZEZyb21FbXB5Q29sbGVjdGlvbiIpOworICAgICAgICAgICAgTGlzdDxUZXN0RFRPPiBsaXN0RFRPID0gbmV3IExpc3Q8VGVzdERUTz4oMCkgeyBuZXcgVGVzdERUTygpIHsgTmFtZSA9ICJTaW5nbGUiIH0gfTsKKyAgICAgICAgICAgIC8vTGlzdDxpbnQ+IGxpc3QgPSBuZXcgTGlzdDxpbnQ+KDApOworCisgICAgICAgICAgICB2YXIgciA9IHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0RFRPLCB0cnVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByLlJvd3MpOworICAgICAgICAgICAgdmFyIHIyID0gd3MuQ2VsbHNbIkE1Il0uTG9hZEZyb21Db2xsZWN0aW9uKGxpc3REVE8sIGZhbHNlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByMi5Sb3dzKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgdm9pZCBDcmVhdGUoc3RyaW5nIGZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdyA9IHBhY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImRlbGV0ZSIpOworICAgICAgICAgICAgdy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJ0ZXN0IjsKKyAgICAgICAgICAgIHcuQ2VsbHNbMSwgMl0uVmFsdWUgPSAidGVzdCI7CisgICAgICAgICAgICB3LkNlbGxzWzIsIDFdLlZhbHVlID0gInRvIGRlbGV0ZSI7CisgICAgICAgICAgICB3LkNlbGxzWzIsIDJdLlZhbHVlID0gInRvIGRlbGV0ZSI7CisgICAgICAgICAgICB3LkNlbGxzWzMsIDFdLlZhbHVlID0gIjNMZWZ0IjsKKyAgICAgICAgICAgIHcuQ2VsbHNbMywgMl0uVmFsdWUgPSAiM0xlZnQiOworICAgICAgICAgICAgdy5DZWxsc1s0LCAxXS5Gb3JtdWxhID0gIkIzK0MzIjsKKyAgICAgICAgICAgIHcuQ2VsbHNbNCwgMl0uVmFsdWUgPSAiQzMrRDMiOworICAgICAgICAgICAgcGFjay5TYXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJvd1N0eWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIEAic2FtcGxlOC54bHN4Iik7CisgICAgICAgICAgICBpZiAobmV3RmlsZS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3RmlsZS5EZWxldGUoKTsgIC8vIGVuc3VyZXMgd2UgY3JlYXRlIGEgbmV3IHdvcmtib29rCisgICAgICAgICAgICAgICAgLy9uZXdGaWxlID0gbmV3IEZpbGVJbmZvKGRpciArIEAic2FtcGxlOC54bHN4Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgLy9Mb2FkIHRoZSBzaGVldCB3aXRoIG9uZSBzdHJpbmcgY29sdW1uLCBvbmUgZGF0ZSBjb2x1bW4gYW5kIGEgZmV3IHJhbmRvbSBudW1iZXJzLgorICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRmlyc3QgbGluZSB0ZXN0Iik7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWzEsIDFdLlZhbHVlID0gIjE7IDEiOworICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSAiMjsgMSI7CisgICAgICAgICAgICB3cy5DZWxsc1sxLCAyXS5WYWx1ZSA9ICIxOyAyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzIsIDJdLlZhbHVlID0gIjI7IDIiOworCisgICAgICAgICAgICB3cy5Sb3coMSkuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNvbHVtbigxKS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3RmlsZSk7CisKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEhpZGVUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSGlkZGVuIik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJUaGlzIHdvcmtib29rIGlzIGhpZGRlbiI7CisgICAgICAgICAgICB3cy5IaWRkZW4gPSBlV29ya1NoZWV0SGlkZGVuLkhpZGRlbjsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEh5cGVybGluaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkh5cGVyTGlua3MiKTsKKyAgICAgICAgICAgIHZhciBobCA9IG5ldyBFeGNlbEh5cGVyTGluaygiRzEiLCAiVGlsbCBHMSIpOworICAgICAgICAgICAgaGwuVG9vbFRpcCA9ICJMaW5rIHRvIGNlbGwgRzEiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uSHlwZXJsaW5rID0gaGw7CisgICAgICAgICAgICAvL3dzLkNlbGxzWyJBMiJdLkh5cGVybGluayA9IG5ldyBFeGNlbEh5cGVyTGluaygibWFpbHRvOmVjc29tYW55QGdvb2dsZTpodXN6YXIiLCBVcmlLaW5kLkFic29sdXRlKTsgLy9JbnZhbGlkIFVSTCB3aWxsIHRocm93IGFuIEV4Y2VwdGlvbgorICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVmVyeUhpZGVUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVmVyeUhpZGRlbiIpOworICAgICAgICAgICAgd3MuQ2VsbHNbImExIl0uVmFsdWUgPSAiVGhpcyB3b3JrYm9vayBpcyBoaWRkZW4iOworICAgICAgICAgICAgd3MuSGlkZGVuID0gZVdvcmtTaGVldEhpZGRlbi5WZXJ5SGlkZGVuOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUHJpbnRlclNldHRpbmdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU29kL0h5ZHJvc2VlZCIpOworCisgICAgICAgICAgICB3cy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICIxOyAxIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzIsIDFdLlZhbHVlID0gIjI7IDEiOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiMTsgMiI7CisgICAgICAgICAgICB3cy5DZWxsc1syLCAyXS5WYWx1ZSA9ICIyOyAyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEsIDEsIDEsIDJdLkF1dG9GaWx0ZXIgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkJsYWNrQW5kV2hpdGUgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlNob3dHcmlkTGluZXMgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlNob3dIZWFkZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QYXBlclNpemUgPSBlUGFwZXJTaXplLkE0OworCisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUmVwZWF0Um93cyA9IG5ldyBFeGNlbEFkZHJlc3MoIjE6MSIpOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMgPSBuZXcgRXhjZWxBZGRyZXNzKCJBOkEiKTsKKworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkRyYWZ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhciByID0gd3MuQ2VsbHNbIkEyNiJdOworICAgICAgICAgICAgci5WYWx1ZSA9ICJYIjsKKyAgICAgICAgICAgIHIuV29ya3NoZWV0LlJvdygyNikuUGFnZUJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QcmludEFyZWEgPSB3cy5DZWxsc1siQTE6QjIiXTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5Ib3Jpem9udGFsQ2VudGVyZWQgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlZlcnRpY2FsQ2VudGVyZWQgPSB0cnVlOworCisgICAgICAgICAgICB3cy5TZWxlY3QobmV3IEV4Y2VsQWRkcmVzcygiMzo0LEU1OkY2IikpOworCisgICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siUmljaFRleHQiXTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5SZXBlYXRDb2x1bW5zID0gd3MuQ2VsbHNbIkE6QiJdOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlJlcGVhdFJvd3MgPSB3cy5DZWxsc1siMToxMSJdOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlRvcE1hcmdpbiA9IDFNOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkxlZnRNYXJnaW4gPSAxTTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5Cb3R0b21NYXJnaW4gPSAxTTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5SaWdodE1hcmdpbiA9IDFNOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLk9yaWVudGF0aW9uID0gZU9yaWVudGF0aW9uLkxhbmRzY2FwZTsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QYXBlclNpemUgPSBlUGFwZXJTaXplLkE0OworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3R5bGVOYW1lVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlN0eWxlTmFtZVRlc3QiKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMV0uVmFsdWUgPSAiUjEgQzEiOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUjEgQzIiOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgM10uVmFsdWUgPSAiUjEgQzMiOworICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSAiUjIgQzEiOworICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMl0uVmFsdWUgPSAiUjIgQzIiOworICAgICAgICAgICAgd3MuQ2VsbHNbMiwgM10uVmFsdWUgPSAiUjIgQzMiOworICAgICAgICAgICAgd3MuQ2VsbHNbMywgMV0uVmFsdWUgPSBkb3VibGUuUG9zaXRpdmVJbmZpbml0eTsKKyAgICAgICAgICAgIHdzLkNlbGxzWzMsIDJdLlZhbHVlID0gZG91YmxlLk5lZ2F0aXZlSW5maW5pdHk7CisgICAgICAgICAgICB3cy5DZWxsc1s0LCAxXS5DcmVhdGVBcnJheUZvcm11bGEoIkExK0IxIik7CisgICAgICAgICAgICB2YXIgbnMgPSBfcGNrLldvcmtib29rLlN0eWxlcy5DcmVhdGVOYW1lZFN0eWxlKCJUZXN0U3R5bGUiKTsKKyAgICAgICAgICAgIG5zLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisKKyAgICAgICAgICAgIHdzLkNlbGxzLlN0eWxlLkxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QzEiXS5TdHlsZU5hbWUgPSAiVGVzdFN0eWxlIjsKKyAgICAgICAgICAgIHdzLkRlZmF1bHRSb3dIZWlnaHQgPSAzNTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpDNCJdLlN0eWxlLkxvY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5Jc1Byb3RlY3RlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBWYWx1ZUVycm9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVmFsdWVFcnJvciIpOworCisgICAgICAgICAgICB3cy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJEb21lc3RpYyBWaW9sZW5jZSYjeEI7IGFuZCB0aGUgUHJvZmVzc2lvbmFsIjsKKyAgICAgICAgICAgIHZhciBydCA9IHdzLkNlbGxzWzEsIDJdLlJpY2hUZXh0LkFkZCgiRG9tZXN0aWMgVmlvbGVuY2UmI3hCOyBhbmQgdGhlIFByb2Zlc3Npb25hbCAyIik7CisgICAgICAgICAgICBUZXN0Q29udGV4dC5Xcml0ZUxpbmUocnQuQm9sZC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIHJ0LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgVGVzdENvbnRleHQuV3JpdGVMaW5lKHJ0LkJvbGQuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGb3JtdWxhRXJyb3IoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGb3JtdWxhRXJyb3IiKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkQ1Il0uRm9ybXVsYSA9ICJDT1VOVElGKEExOkExMDAsXCJNaXNzXCIpIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpLMyJdLkZvcm11bGEgPSAiQTMrQTQiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkE0Il0uRm9ybXVsYVIxQzEgPSAiK1JPVU5EVVAoUkNbMV0vMTAsMCkqMTAiOworCisgICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0LVJDMSIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkE0Il0uRm9ybXVsYVIxQzEgPSAiK1JPVU5EVVAoJ1NoZWV0LVJDMSchUkNbMV0vMTAsMCkqMTAiOworCisgICAgICAgICAgICAvL3dzLkNlbGxzWyJCMjpJMiJdLkZvcm11bGEgPSAiIjsgICAvL0Vycm9yCisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgRm9ybXVsYUFycmF5KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZvcm11bGFFcnJvciIpOworCisgICAgICAgICAgICB3cy5DZWxsc1siRTI6RTUiXS5DcmVhdGVBcnJheUZvcm11bGEoIkZSRVFVRU5DWShCMjpCMTgsQzI6QzUpIik7CisgICAgICAgICAgICBfcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxhcnJheWZvcm11bGEueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFBpY3R1cmVVUkwoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaWMgVVJMIik7CisKKyAgICAgICAgICAgIEV4Y2VsSHlwZXJMaW5rIGhsID0gbmV3IEV4Y2VsSHlwZXJMaW5rKCJodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbSIpOworICAgICAgICAgICAgaGwuVG9vbFRpcCA9ICJTY3JlZW4gVGlwIjsKKworICAgICAgICAgICAgd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljIFVSSSIsIFByb3BlcnRpZXMuUmVzb3VyY2VzLlRlc3QxLCBobCk7CisgICAgICAgIH0KKworCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBQaXZvdFRhYmxlVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdFRhYmxlIik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbUFycmF5cyhuZXcgb2JqZWN0W11bXSB7IG5ld1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH0gfSk7CisgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5Mb2FkRnJvbUFycmF5cyhuZXcgb2JqZWN0W11bXQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBvYmplY3QgW10geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5IH0sCisgICAgICAgICAgICAgICAgbmV3IG9iamVjdCBbXSB7IDksIDgsIDcgLDYsIDUsIDQsIDMsIDIsIDEsIDAgfSwKKyAgICAgICAgICAgICAgICBuZXcgb2JqZWN0IFtdIHsgMSwgMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTV9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHZhciB0YWJsZSA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbIkExOkQ0Il0sICJQaXZvdERhdGEiKTsKKyAgICAgICAgICAgIHdzLlBpdm90VGFibGVzLkFkZCh3cy5DZWxsc1siRzEiXSwgd3MuQ2VsbHNbIkExOkQ0Il0sICJQaXZvdFRhYmxlIik7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlBpdm90U3R5bGVNZWRpdW05Iiwgd3MuUGl2b3RUYWJsZXNbIlBpdm90VGFibGUiXS5TdHlsZU5hbWUpOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VGFibGVOYW1lQ2FuTm90U3RhcnRzV2l0aE51bWJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRhYmxlIik7CisgICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siQTEiXSwgIjVUZXN0VGFibGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RUYWJsZU5hbWVDYW5Ob3RDb250YWluV2hpdGVTcGFjZXMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUYWJsZSIpOworICAgICAgICAgICAgdmFyIHRibCA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbIkExIl0sICJUZXN0IFRhYmxlIik7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdFRhYmxlTmFtZUNhblN0YXJ0c1dpdGhCYWNrU2xhc2goKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUYWJsZSIpOworICAgICAgICAgICAgdmFyIHRibCA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbIkExIl0sICJcXFRlc3RUYWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RUYWJsZU5hbWVDYW5TdGFydHNXaXRoVW5kZXJzY29yZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRhYmxlIik7CisgICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siQTEiXSwgIl9UZXN0VGFibGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGFibGVUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGFibGUiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gMTIzOworICAgICAgICAgICAgdmFyIHRibCA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbIkIxOlAxMiJdLCAiVGVzdFRhYmxlIik7CisgICAgICAgICAgICB0YmwuVGFibGVTdHlsZSA9IE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuQ3VzdG9tOworCisgICAgICAgICAgICB0YmwuU2hvd0ZpcnN0Q29sdW1uID0gdHJ1ZTsKKyAgICAgICAgICAgIHRibC5TaG93VG90YWwgPSB0cnVlOworICAgICAgICAgICAgdGJsLlNob3dIZWFkZXIgPSB0cnVlOworICAgICAgICAgICAgdGJsLlNob3dMYXN0Q29sdW1uID0gdHJ1ZTsKKyAgICAgICAgICAgIHRibC5TaG93RmlsdGVyID0gZmFsc2U7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGJsLlNob3dGaWx0ZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJLMiJdLlZhbHVlID0gNTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJKMyJdLlZhbHVlID0gNDsKKworICAgICAgICAgICAgdGJsLkNvbHVtbnNbOF0uVG90YWxzUm93RnVuY3Rpb24gPSBPZmZpY2VPcGVuWG1sLlRhYmxlLlJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s5XS5Ub3RhbHNSb3dGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiU1VNKFt7MH1dKSIsIHRibC5Db2x1bW5zWzldLk5hbWUpOworICAgICAgICAgICAgdGJsLkNvbHVtbnNbMTRdLkNhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhID0gIlRlc3RUYWJsZVtbI1RoaXMgUm93XSxbMTIzXV0rVGVzdFRhYmxlW1sjVGhpcyBSb3ddLFtDb2x1bW4yXV0iOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIzIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgd3MuQ2VsbHNbIkI0Il0uVmFsdWUgPSAzOworICAgICAgICAgICAgd3MuQ2VsbHNbIkI1Il0uVmFsdWUgPSA0OworICAgICAgICAgICAgd3MuQ2VsbHNbIkI2Il0uVmFsdWUgPSA1OworICAgICAgICAgICAgd3MuQ2VsbHNbIkI3Il0uVmFsdWUgPSA2OworICAgICAgICAgICAgd3MuQ2VsbHNbIkI4Il0uVmFsdWUgPSA3OworICAgICAgICAgICAgd3MuQ2VsbHNbIkI5Il0uVmFsdWUgPSA4OworICAgICAgICAgICAgd3MuQ2VsbHNbIkIxMCJdLlZhbHVlID0gOTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMTEiXS5WYWx1ZSA9IDEwOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIxMiJdLlZhbHVlID0gMTE7CisgICAgICAgICAgICB3cy5DZWxsc1siQzciXS5WYWx1ZSA9ICJUYWJsZSB0ZXN0IjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJDOCJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJDOCJdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7CisKKyAgICAgICAgICAgIHRibCA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbImExMjphMTMiXSwgIiIpOworCisgICAgICAgICAgICB0YmwgPSB3cy5UYWJsZXMuQWRkKHdzLkNlbGxzWyJDMTY6WTM1Il0sICIiKTsKKyAgICAgICAgICAgIHRibC5UYWJsZVN0eWxlID0gT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW0xNDsKKyAgICAgICAgICAgIHRibC5TaG93Rmlyc3RDb2x1bW4gPSB0cnVlOworICAgICAgICAgICAgdGJsLlNob3dMYXN0Q29sdW1uID0gdHJ1ZTsKKyAgICAgICAgICAgIHRibC5TaG93Q29sdW1uU3RyaXBlcyA9IHRydWU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGJsLlNob3dGaWx0ZXIsIHRydWUpOworICAgICAgICAgICAgdGJsLkNvbHVtbnNbMl0uTmFtZSA9ICJUZXN0IENvbHVtbiBOYW1lIjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkc1MCJdLlZhbHVlID0gIlRpbWVzcGFuIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJHNTEiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZShuZXcgVGltZVNwYW4oMSwgMSwgMTApLlRpY2tzKTsgLy9uZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAxLCAxLCAxMCk7CisgICAgICAgICAgICB3cy5DZWxsc1siRzUyIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAyLCAzLCAxMCk7CisgICAgICAgICAgICB3cy5DZWxsc1siRzUzIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAzLCA0LCAxMCk7CisgICAgICAgICAgICB3cy5DZWxsc1siRzU0Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCA0LCA1LCAxMCk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJHNTE6RzU1Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJISDpNTTpTUyI7CisgICAgICAgICAgICB0YmwgPSB3cy5UYWJsZXMuQWRkKHdzLkNlbGxzWyJHNTA6RzU0Il0sICIiKTsKKyAgICAgICAgICAgIHRibC5TaG93VG90YWwgPSB0cnVlOworICAgICAgICAgICAgdGJsLlNob3dGaWx0ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLlRvdGFsc1Jvd0Z1bmN0aW9uID0gT2ZmaWNlT3BlblhtbC5UYWJsZS5Sb3dGdW5jdGlvbnMuU3VtOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRhYmxlRGVsZXRlVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGtnID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3YiA9IHBrZy5Xb3JrYm9vazsKKyAgICAgICAgICAgICAgICB2YXIgc2hlZXRzID0gbmV3W10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdiLldvcmtzaGVldHMuQWRkKCJXb3JrU2hlZXQgQSIpLAorICAgICAgICAgICAgICAgICAgICB3Yi5Xb3Jrc2hlZXRzLkFkZCgiV29ya1NoZWV0IEIiKQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBzaGVldHNbMF0uQ2VsbHNbMSwgaV07CisgICAgICAgICAgICAgICAgICAgIGNlbGwuVmFsdWUgPSBjZWxsLkFkZHJlc3MgKyAiXyI7CisgICAgICAgICAgICAgICAgICAgIGNlbGwgPSBzaGVldHNbMV0uQ2VsbHNbMSwgaV07CisgICAgICAgICAgICAgICAgICAgIGNlbGwuVmFsdWUgPSBjZWxsLkFkZHJlc3MgKyAiXyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDY7IGkgPD0gMTE7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjZWxsID0gc2hlZXRzWzBdLkNlbGxzWzMsIGldOworICAgICAgICAgICAgICAgICAgICBjZWxsLlZhbHVlID0gY2VsbC5BZGRyZXNzICsgIl8iOworICAgICAgICAgICAgICAgICAgICBjZWxsID0gc2hlZXRzWzFdLkNlbGxzWzMsIGldOworICAgICAgICAgICAgICAgICAgICBjZWxsLlZhbHVlID0gY2VsbC5BZGRyZXNzICsgIl8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgdGFibGVzID0gbmV3W10KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNoZWV0c1sxXS5UYWJsZXMuQWRkKHNoZWV0c1sxXS5DZWxsc1siQTE6RDczIl0sICJUYWJsZWEiKSwKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRzWzBdLlRhYmxlcy5BZGQoc2hlZXRzWzBdLkNlbGxzWyJBMTpENzMiXSwgIlRhYmxlMiIpLAorICAgICAgICAgICAgICAgICAgICBzaGVldHNbMV0uVGFibGVzLkFkZChzaGVldHNbMV0uQ2VsbHNbIkYzOksxMCJdLCAiVGFibGViIiksCisgICAgICAgICAgICAgICAgICAgIHNoZWV0c1swXS5UYWJsZXMuQWRkKHNoZWV0c1swXS5DZWxsc1siRjM6SzEwIl0sICJUYWJsZTMiKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCB3Yi5fbmV4dFRhYmxlSUQpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCB0YWJsZXNbMF0uSWQpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB0YWJsZXNbMV0uSWQpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRzWzBdLlRhYmxlcy5EZWxldGUoIlRhYmxlYSIpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgIHNoZWV0c1sxXS5UYWJsZXMuRGVsZXRlKCJUYWJsZWEiKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdGFibGVzWzFdLklkKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgdGFibGVzWzJdLklkKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRzWzFdLlRhYmxlcy5EZWxldGUoNCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikgeyB9CisgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gc2hlZXRzWzBdLkNlbGxzW3NoZWV0c1swXS5UYWJsZXNbMV0uQWRkcmVzcy5BZGRyZXNzXTsKKyAgICAgICAgICAgICAgICBzaGVldHNbMF0uVGFibGVzLkRlbGV0ZSgxLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByYW5nZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc051bGwoY2VsbC5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VGFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQ29weSgiRmlsZTQiLCAiQ29waWVkIHRhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5UmFuZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3B5VGVzdCIpOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJTaW5nbGUgQ2VsbCI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9ICJNZXJnZWQgQ2VsbHMiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkEyOkQzMCJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siRzQ6SDUiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siQjM6QzUiXS5Db3B5KHdzLkNlbGxzWyJHNCJdKTsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlNZXJnZWRSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcHlNZXJnZWRSYW5nZVRlc3QiKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkExMTpDMTEiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEyOkMxMiJdLk1lcmdlID0gdHJ1ZTsKKworICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHdzLkNlbGxzWyJBMTE6QzEyIl07CisgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gd3MuQ2VsbHNbIkEyMSJdOworCisgICAgICAgICAgICBzb3VyY2UuQ29weSh0YXJnZXQpOworCisgICAgICAgICAgICB2YXIgYTIxID0gd3MuQ2VsbHNbMjEsIDFdOworICAgICAgICAgICAgdmFyIGEyMiA9IHdzLkNlbGxzWzIyLCAxXTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhMjEuTWVyZ2UpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhMjIuTWVyZ2UpOworCisgICAgICAgICAgICAvL0Fzc2VydC5BcmVOb3RFcXVhbChhMjEuTWVyZ2VJZCwgYTIyLk1lcmdlSWQpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5UGl2b3RUYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5Db3B5KCJQaXZvdC1Hcm91cCBEYXRlIiwgIkNvcGllZCBQaXZvdHRhYmxlIDEiKTsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5Db3B5KCJQaXZvdC1Hcm91cCBOdW1iZXIiLCAiQ29waWVkIFBpdm90dGFibGUgMiIpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBTdHlsZWJ1ZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEZ1bGxQcm9qZWN0ZS54bHN4IikpOworCisgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEyLCAxXS5WYWx1ZSA9IDA7CisgICAgICAgICAgICB3cy5DZWxsc1sxMiwgMl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOSwgMTQpOworICAgICAgICAgICAgd3MuQ2VsbHNbMTIsIDNdLlZhbHVlID0gIkZlZGVyaWNvIExvaXMiOworICAgICAgICAgICAgd3MuQ2VsbHNbMTIsIDRdLlZhbHVlID0gIk5ha2FtaSI7CisgICAgICAgICAgICB3cy5DZWxsc1sxMiwgNV0uVmFsdWUgPSAiSG9yZXMiOworICAgICAgICAgICAgd3MuQ2VsbHNbMTIsIDddLlZhbHVlID0gMTIwOworICAgICAgICAgICAgd3MuQ2VsbHNbMTIsIDhdLlZhbHVlID0gIkEgZGVmaW5pciI7CisgICAgICAgICAgICB3cy5DZWxsc1sxMiwgOV0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOSwgMTQpOworICAgICAgICAgICAgd3MuQ2VsbHNbMTIsIDEwXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA5LCAxNCk7CisgICAgICAgICAgICB3cy5DZWxsc1sxMiwgMTFdLlZhbHVlID0gIlRyYW5zZmVyw6huY2lhIjsKKworICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDEzLCAxLCAxMik7CisgICAgICAgICAgICB3cy5DZWxsc1sxMywgMV0uVmFsdWUgPSAwOworICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDksIDE0KTsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEzLCAzXS5WYWx1ZSA9ICJGZWRlcmljbyBMb2lzIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEzLCA0XS5WYWx1ZSA9ICJOYWthbWkiOworICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDVdLlZhbHVlID0gIkhvcmVzIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEzLCA3XS5WYWx1ZSA9IDEyMDsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEzLCA4XS5WYWx1ZSA9ICJBIGRlZmluaXIiOworICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDldLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDksIDE0KTsKKyAgICAgICAgICAgIHdzLkNlbGxzWzEzLCAxMF0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOSwgMTQpOworICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDExXS5WYWx1ZSA9ICJUcmFuc2ZlcsOobmNpYSI7CisKKyAgICAgICAgICAgIHdzLkluc2VydFJvdygxNCwgMSwgMTMpOworCisgICAgICAgICAgICB3cy5JbnNlcnRSb3coMTksIDEsIDE5KTsKKyAgICAgICAgICAgIHdzLkluc2VydFJvdygyNiwgMSwgMjYpOworICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDMzLCAxLCAzMyk7CisgICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEZ1bGxQcm9qZWN0ZV9uZXcueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxlcnJvci54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBmdWxsYSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgICAgIHZhciByID0gZnVsbGEgPT0gbnVsbCA/IG51bGwgOiBmdWxsYS5DZWxsc1siYTphIl0KKyAgICAgICAgICAgICAgICAuV2hlcmUodCA9PiAhc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZSh0LlRleHQpKS5TZWxlY3QoY2VsbCA9PiBjZWxsLlZhbHVlLlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLlRvTGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRm9ybXVsYU92ZXJ3cml0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZvcm11bGFPdmVyd3JpdGUiKTsKKyAgICAgICAgICAgIC8vSW5zaWRlCisgICAgICAgICAgICB3cy5DZWxsc1siQTE6RzEyIl0uRm9ybXVsYSA9ICJCMStDMSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQjI6QzMiXS5Gb3JtdWxhID0gIkcyK0UxIjsKKworCisgICAgICAgICAgICAvL1RvcCBib3R0b20gb3ZlcndyaXRlCisgICAgICAgICAgICB3cy5DZWxsc1siQTE0OkcyNiJdLkZvcm11bGEgPSAiQjErQzErRDEiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIxMzpDMjgiXS5Gb3JtdWxhID0gIkcyK0UxIjsKKworICAgICAgICAgICAgLy9Ub3AgYm90dG9tIG92ZXJ3cml0ZQorICAgICAgICAgICAgd3MuQ2VsbHNbIkIzMDpFNDIiXS5Gb3JtdWxhID0gIkIxK0MxKyREJDEiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkEzMjpIMzMiXS5Gb3JtdWxhID0gIkcyK0UxIjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkE1MDpBNTkiXS5DcmVhdGVBcnJheUZvcm11bGEoIkM1MCtENTAiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gInRlc3QiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExNSJdLlZhbHVlID0gIlbDpHJkZSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQzEyIl0uQWRkQ29tbWVudCgiVGVzdCIsICJKSk9EIik7CisgICAgICAgICAgICB3cy5DZWxsc1siRDEyOkkxMiJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJEMTI6STEyIl0uU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQ7CisgICAgICAgICAgICB3cy5DZWxsc1siRDEyOkkxMiJdLlN0eWxlLlZlcnRpY2FsQWxpZ25tZW50ID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbFZlcnRpY2FsQWxpZ25tZW50LlRvcDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJEMTI6STEyIl0uU3R5bGUuV3JhcFRleHQgPSB0cnVlOworCisgICAgICAgICAgICB3cy5DZWxsc1siRjE6RjMiXS5Gb3JtdWxhID0gIkYyK0YzIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJKMTpKMyJdLkZvcm11bGEgPSAiRjIrRjMiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkYxOkYzIl0uRm9ybXVsYSA9ICJGNStGNiI7ICAgIC8vT3ZlcndyaXRlIHNhbWUgcmFuZ2UKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlZmluZWROYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTmFtZXMiKTsKKyAgICAgICAgICAgIHdzLk5hbWVzLkFkZCgiUmVmRXJyb3IiLCB3cy5DZWxsc1siI1JFRiEiXSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIlRlc3QiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuRm9udC5TaXplID0gOC41RjsKKworICAgICAgICAgICAgd3MuTmFtZXMuQWRkKCJBZGRyZXNzIiwgd3MuQ2VsbHNbIkEyOkEzIl0pOworICAgICAgICAgICAgd3MuQ2VsbHNbIkFkZHJlc3MiXS5WYWx1ZSA9IDE7CisgICAgICAgICAgICB3cy5OYW1lcy5BZGRWYWx1ZSgiVmFsdWUiLCA1KTsKKyAgICAgICAgICAgIHdzLk5hbWVzLkFkZCgiRnVsbFJvdyIsIHdzLkNlbGxzWyIyOjIiXSk7CisgICAgICAgICAgICB3cy5OYW1lcy5BZGQoIkZ1bGxDb2wiLCB3cy5DZWxsc1siQTpBIl0pOworICAgICAgICAgICAgLy93cy5OYW1lc1siVmFsdWUiXS5TdHlsZS5Cb3JkZXIuQm90dG9tLkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKKyAgICAgICAgICAgIHdzLk5hbWVzLkFkZEZvcm11bGEoIkZvcm11bGEiLCAiTmFtZXMhQTIrTmFtZXMhQTMrTmFtZXMhVmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVVJMKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdXJsLnhsc3giKSk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHVybHNhdmVkLnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgTG9hZERhdGFSZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3BjayA9PSBudWxsKSBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZGVkIERhdGFSZWFkZXIiKTsKKyAgICAgICAgICAgIEV4Y2VsUmFuZ2VCYXNlIHJhbmdlOworICAgICAgICAgICAgdXNpbmcgKHZhciBkdCA9IG5ldyBEYXRhVGFibGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiU3RyaW5nIiwgdHlwZW9mKHN0cmluZykpOworICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJJbnQiLCB0eXBlb2YoaW50KSk7CisgICAgICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkJvb2wiLCB0eXBlb2YoYm9vbCkpOworICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJEb3VibGUiLCB0eXBlb2YoZG91YmxlKSk7CisKKyAgICAgICAgICAgICAgICB2YXIgZHIgPSBkdC5OZXdSb3coKTsKKyAgICAgICAgICAgICAgICBkclswXSA9ICJSb3cxIjsKKyAgICAgICAgICAgICAgICBkclsxXSA9IDE7CisgICAgICAgICAgICAgICAgZHJbMl0gPSB0cnVlOworICAgICAgICAgICAgICAgIGRyWzNdID0gMS41OworICAgICAgICAgICAgICAgIGR0LlJvd3MuQWRkKGRyKTsKKworICAgICAgICAgICAgICAgIGRyID0gZHQuTmV3Um93KCk7CisgICAgICAgICAgICAgICAgZHJbMF0gPSAiUm93MiI7CisgICAgICAgICAgICAgICAgZHJbMV0gPSAyOworICAgICAgICAgICAgICAgIGRyWzJdID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZHJbM10gPSAyLjI1OworICAgICAgICAgICAgICAgIGR0LlJvd3MuQWRkKGRyKTsKKworICAgICAgICAgICAgICAgIC8vZHIgPSBkdC5OZXdSb3coKTsKKyAgICAgICAgICAgICAgICAvL2RyWzBdID0gIlJvdzMiOworICAgICAgICAgICAgICAgIC8vZHJbMV0gPSAzOworICAgICAgICAgICAgICAgIC8vZHJbMl0gPSB0cnVlOworICAgICAgICAgICAgICAgIC8vZHJbM10gPSAzLjEyNTsKKyAgICAgICAgICAgICAgICAvL2R0LlJvd3MuQWRkKGRyKTsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcmVhZGVyID0gZHQuQ3JlYXRlRGF0YVJlYWRlcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbURhdGFSZWFkZXIocmVhZGVyLCB0cnVlLCAiTXlfVGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLk1lZGl1bTUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmFuZ2UuU3RhcnQuQ29sdW1uKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgcmFuZ2UuRW5kLkNvbHVtbik7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJhbmdlLlN0YXJ0LlJvdyk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIHJhbmdlLkVuZC5Sb3cpOworCisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZWFkZXIgPSBkdC5DcmVhdGVEYXRhUmVhZGVyKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHdzLkNlbGxzWyJBNSJdLkxvYWRGcm9tRGF0YVJlYWRlcihyZWFkZXIsIGZhbHNlLCAiTXlfVGFibGUyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW01KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJhbmdlLlN0YXJ0LkNvbHVtbik7CisgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIHJhbmdlLkVuZC5Db2x1bW4pOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCByYW5nZS5TdGFydC5Sb3cpOworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2LCByYW5nZS5FbmQuUm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy9bVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBMb2FkRGF0YVRhYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wY2sgPT0gbnVsbCkgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxvYWRlZCBEYXRhVGFibGUiKTsKKworICAgICAgICAgICAgdmFyIGR0ID0gbmV3IERhdGFUYWJsZSgpOworICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIlN0cmluZyIsIHR5cGVvZihzdHJpbmcpKTsKKyAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJJbnQiLCB0eXBlb2YoaW50KSk7CisgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiQm9vbCIsIHR5cGVvZihib29sKSk7CisgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiRG91YmxlIiwgdHlwZW9mKGRvdWJsZSkpOworCisKKyAgICAgICAgICAgIHZhciBkciA9IGR0Lk5ld1JvdygpOworICAgICAgICAgICAgZHJbMF0gPSAiUm93MSI7CisgICAgICAgICAgICBkclsxXSA9IDE7CisgICAgICAgICAgICBkclsyXSA9IHRydWU7CisgICAgICAgICAgICBkclszXSA9IDEuNTsKKyAgICAgICAgICAgIGR0LlJvd3MuQWRkKGRyKTsKKworICAgICAgICAgICAgZHIgPSBkdC5OZXdSb3coKTsKKyAgICAgICAgICAgIGRyWzBdID0gIlJvdzIiOworICAgICAgICAgICAgZHJbMV0gPSAyOworICAgICAgICAgICAgZHJbMl0gPSBmYWxzZTsKKyAgICAgICAgICAgIGRyWzNdID0gMi4yNTsKKyAgICAgICAgICAgIGR0LlJvd3MuQWRkKGRyKTsKKworICAgICAgICAgICAgZHIgPSBkdC5OZXdSb3coKTsKKyAgICAgICAgICAgIGRyWzBdID0gIlJvdzMiOworICAgICAgICAgICAgZHJbMV0gPSAzOworICAgICAgICAgICAgZHJbMl0gPSB0cnVlOworICAgICAgICAgICAgZHJbM10gPSAzLjEyNTsKKyAgICAgICAgICAgIGR0LlJvd3MuQWRkKGRyKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21EYXRhVGFibGUoZHQsIHRydWUsIE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuTWVkaXVtNSk7CisKKyAgICAgICAgICAgIC8vd29ya3NoZWV0LkNlbGxzW3N0YXJ0Um93LCA3LCB3b3Jrc2hlZXQuRGltZW5zaW9uLkVuZC5Sb3csIDddLkZvcm11bGFSMUMxID0gIj1JRihSQ1stMl09MCwwLFJDWy0xXS9SQ1stMl0pIjsKKworICAgICAgICAgICAgd3MuVGFibGVzWzBdLkNvbHVtbnNbMV0uVG90YWxzUm93RnVuY3Rpb24gPSBPZmZpY2VPcGVuWG1sLlRhYmxlLlJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB3cy5UYWJsZXNbMF0uU2hvd1RvdGFsID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBMb2FkRW1wdHlEYXRhVGFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3BjayA9PSBudWxsKSBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZGVkIEVtcHR5IERhdGFUYWJsZSIpOworCisgICAgICAgICAgICB2YXIgZHQgPSBuZXcgRGF0YVRhYmxlKCk7CisgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZChuZXcgRGF0YUNvbHVtbigiY29sMSIpKTsKKyAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKG5ldyBEYXRhQ29sdW1uKCJjb2wyIikpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21EYXRhVGFibGUoZHQsIHRydWUpOworCisgICAgICAgICAgICB3cy5DZWxsc1siRDEiXS5Mb2FkRnJvbURhdGFUYWJsZShkdCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRUZXh0X0J1ZzE1MDE1KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkZWQgVGV4dCIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KCJcInRleHQgd2l0aCBlb2wsXHJcbiBpbiBhIGNlbGxcIixcIm90aGVyIHZhbHVlXCIiLCBuZXcgRXhjZWxUZXh0Rm9ybWF0IHsgVGV4dFF1YWxpZmllciA9ICciJywgRU9MID0gIixcclxuIiwgRGVsaW1pdGVyID0gJywnIH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRUZXh0X0J1ZzE1MDE1X05lZ2F0aXZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkZWQgVGV4dCIpOworICAgICAgICAgICAgYm9vbCBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dCgiXCJ0ZXh0IHdpdGggZW9sLFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZWxUZXh0Rm9ybWF0IHsgVGV4dFF1YWxpZmllciA9ICciJywgRU9MID0gIixcclxuIiwgRGVsaW1pdGVyID0gJywnIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGV4dCBkZWxpbWl0ZXIgaXMgbm90IGNsb3NlZCBpbiBsaW5lIDogXCJ0ZXh0IHdpdGggZW9sIiwgZS5NZXNzYWdlLCAiRXhjZXB0aW9uIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShleGNlcHRpb25UaHJvd24sICJFeGNlcHRpb24gdGhyb3duIik7CisgICAgICAgIH0KKworICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRUZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZGVkIFRleHQiKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KCIxLjIiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLkxvYWRGcm9tVGV4dCgiMSxcIlRlc3QgYXYgZGF0YVwiLFwiMTIsMlwiLFwiXCJUZXN0XCJcIiIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkEzIl0uTG9hZEZyb21UZXh0KCJcIjEsM1wiLFwiVGVzdCBhdiBcIlwiZGF0YVwiLFwiMTIsMlwiLFwiVGVzdFwiXCJcIiIsIG5ldyBFeGNlbFRleHRGb3JtYXQoKSB7IFRleHRRdWFsaWZpZXIgPSAnIicgfSk7CisKKyAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRmlsZTEiKTsKKyAgICAgICAgICAgIC8vIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dChuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNzdlxldDFjMTAwNC5jc3YiKSwgbmV3IEV4Y2VsVGV4dEZvcm1hdCgpIHtTa2lwTGluZXNCZWdpbm5pbmc9MyxTa2lwTGluZXNFbmQ9MSwgRU9MPSJcbiJ9KTsKKworICAgICAgICAgICAgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaWxlMiIpOworICAgICAgICAgICAgLy93cy5DZWxsc1siQTEiXS5Mb2FkRnJvbVRleHQobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjc3ZcZXRpdjI4MTIuY3N2IiksIG5ldyBFeGNlbFRleHRGb3JtYXQoKSB7IFNraXBMaW5lc0JlZ2lubmluZyA9IDMsIFNraXBMaW5lc0VuZCA9IDEsIEVPTCA9ICJcbiIgfSk7CisKKyAgICAgICAgICAgIC8vd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaWxlMyIpOworICAgICAgICAgICAgLy93cy5DZWxsc1siQTEiXS5Mb2FkRnJvbVRleHQobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjc3ZcbGFzdF9naWNzLnR4dCIpLCBuZXcgRXhjZWxUZXh0Rm9ybWF0KCkgeyBTa2lwTGluZXNCZWdpbm5pbmcgPSAxLCBEZWxpbWl0ZXI9J3wnfSk7CisKKyAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRmlsZTQiKTsKKyAgICAgICAgICAgIC8vd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY3N2XDIwMDYwOTI3LmN1c3RvbV9vcGVuX3Bvc2l0aW9ucy5jZGYuU1BQIiksIG5ldyBFeGNlbFRleHRGb3JtYXQoKSB7IFNraXBMaW5lc0JlZ2lubmluZyA9IDIsIFNraXBMaW5lc0VuZD0yLCBUZXh0UXVhbGlmaWVyPSciJywgRGF0YVR5cGVzPW5ldyBlRGF0YVR5cGVzW10ge2VEYXRhVHlwZXMuTnVtYmVyLGVEYXRhVHlwZXMuU3RyaW5nLCBlRGF0YVR5cGVzLk51bWJlciwgZURhdGFUeXBlcy5OdW1iZXIsIGVEYXRhVHlwZXMuTnVtYmVyLCBlRGF0YVR5cGVzLlN0cmluZywgZURhdGFUeXBlcy5OdW1iZXIsIGVEYXRhVHlwZXMuTnVtYmVyLCBlRGF0YVR5cGVzLlN0cmluZywgZURhdGFUeXBlcy5TdHJpbmcsIGVEYXRhVHlwZXMuTnVtYmVyLCBlRGF0YVR5cGVzLk51bWJlciwgZURhdGFUeXBlcy5OdW1iZXJ9fSwKKyAgICAgICAgICAgIC8vICAgIE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuTWVkaXVtMjcsIHRydWUpOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbVRleHQoIjEsXCJUZXN0XCIsXCJcIixcIlwiXCJcIiwzIiwgbmV3IEV4Y2VsVGV4dEZvcm1hdCgpIHsgVGV4dFF1YWxpZmllciA9ICdcIicgfSk7CisKKyAgICAgICAgICAgIHZhciBzdHlsZSA9IF9wY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoIlJlZFN0eWxlIik7CisgICAgICAgICAgICBzdHlsZS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICBzdHlsZS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5SZWQpOworCisgICAgICAgICAgICAvL3ZhciB0YmwgPSB3cy5UYWJsZXNbd3MuVGFibGVzLkNvdW50IC0gMV07CisgICAgICAgICAgICAvL3RibC5TaG93VG90YWwgPSB0cnVlOworICAgICAgICAgICAgLy90YmwuVG90YWxzUm93Q2VsbFN0eWxlID0gIlJlZFN0eWxlIjsKKyAgICAgICAgICAgIC8vdGJsLkhlYWRlclJvd0NlbGxTdHlsZSA9ICJSZWRTdHlsZSI7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFRlc3RSZXBlYXRSb3dzQW5kQ29sdW1uc1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKworICAgICAgICAgICAgdmFyIHcgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJSZXBlYXRSb3dzQW5kQ29sdW1uc1Rlc3QiKTsKKworICAgICAgICAgICAgdy5QcmludGVyU2V0dGluZ3MuUmVwZWF0Q29sdW1ucyA9IG5ldyBFeGNlbEFkZHJlc3MoIkE6QSIpOworICAgICAgICAgICAgdy5QcmludGVyU2V0dGluZ3MuUmVwZWF0Um93cyA9IG5ldyBFeGNlbEFkZHJlc3MoIjE6MSIpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHcuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMpOworICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCh3LlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzKTsgLy8gRmFpbHMhCisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk1lcmdlIik7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QTQiXS5NZXJnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5DZWxsc1siQzE6QzQsQzg6QzEyIl0uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkQxMzpFMTgsRzUsVTMyOlU0NSJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJEMTM6RTE4LEc1LFUzMjpVNDUiXS5TdHlsZS5XcmFwVGV4dCA9IHRydWU7CisgICAgICAgICAgICAvL3dzLkNlbGxzWyI1MDo1MiJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBQTpBQyJdLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLlNldFZhbHVlKDEzLCA0LCAiTWVyZ2VkXHJcbm5ldyByb3ciKTsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlZmF1bHRDb2xXaWR0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRlZkNvbFdpZHRoIik7CisgICAgICAgICAgICB3cy5EZWZhdWx0Q29sV2lkdGggPSA0NTsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIExvYWRBcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxvYWRlZCBBcnJheSIpOworICAgICAgICAgICAgTGlzdDxvYmplY3RbXT4gdGVzdEFycmF5ID0gbmV3IExpc3Q8b2JqZWN0W10+KCkgeyBuZXcgb2JqZWN0W10geyAzLCA0LCA1LCA2IH0sIG5ldyBzdHJpbmdbXSB7ICJUZXN0MSIsICJ0ZXN0IiwgIjUiLCAiNiIgfSB9OworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21BcnJheXModGVzdEFycmF5KTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGVmQ29sV2lkdGhCdWcoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtib29rIGJvb2sgPSBfcGNrLldvcmtib29rOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgc2hlZXQgPSBib29rLldvcmtzaGVldHMuQWRkKCJHZWJydWlrZXJzIik7CisKKyAgICAgICAgICAgIHNoZWV0LkRlZmF1bHRDb2xXaWR0aCA9IDI1ZDsKKyAgICAgICAgICAgIC8vc2hlZXQuZGVmYXVsdFJvd0hlaWdodCA9IDE1ZDsgLy8gbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGUgcmVzdWx0aW5nIGZpbGUgaXMgdmFsaWQhCisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaGVhZGVyIHJvdworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbMSwgMV0uVmFsdWUgPSAiQWZkZWxpbmcgY29kZSI7CisgICAgICAgICAgICBzaGVldC5DZWxsc1sxLCAyXS5WYWx1ZSA9ICJBZmRlbGluZyBuYWFtIjsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWzEsIDNdLlZhbHVlID0gIlZvb3JuYWFtIjsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWzEsIDRdLlZhbHVlID0gIlR1c3NlbnZvZWdzZWwiOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbMSwgNV0uVmFsdWUgPSAiQWNodGVybmFhbSI7CisgICAgICAgICAgICBzaGVldC5DZWxsc1sxLCA2XS5WYWx1ZSA9ICJHZWJydWlrZXJzbmFhbSI7CisgICAgICAgICAgICBzaGVldC5DZWxsc1sxLCA3XS5WYWx1ZSA9ICJFLW1haWwgYWRyZXMiOworICAgICAgICAgICAgRXhjZWxSYW5nZSBoZWFkZXJSb3cgPSBzaGVldC5DZWxsc1sxLCAxLCAxLCA3XTsKKyAgICAgICAgICAgIGhlYWRlclJvdy5TdHlsZS5Cb3JkZXIuQm90dG9tLlN0eWxlID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEJvcmRlclN0eWxlLlRoaW47CisgICAgICAgICAgICBoZWFkZXJSb3cuU3R5bGUuRm9udC5TaXplID0gMTI7CisgICAgICAgICAgICBoZWFkZXJSb3cuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8vLyBDcmVhdGUgYSBjb250ZXh0IGZvciByZXRyaWV2aW5nIHRoZSB1c2VycworICAgICAgICAgICAgLy91c2luZyAoUGFsYXVEYXRhQ29udGV4dCBjb250ZXh0ID0gbmV3IFBhbGF1RGF0YUNvbnRleHQoKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgaW50IGN1cnJlbnRSb3cgPSAyOworCisgICAgICAgICAgICAvLyAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIHVzZXJzIGluIHRoZSBleHBvcnQgYW5kIGFkZCB0aGVpciBpbmZvCisgICAgICAgICAgICAvLyAgICAvLyB0byB0aGUgd29ya3NoZWV0LgorICAgICAgICAgICAgLy8gICAgZm9yZWFjaCAodndfRXhwb3J0VXNlciB1c2VyIGluCisgICAgICAgICAgICAvLyAgICAgIGNvbnRleHQudndfRXhwb3J0VXNlcnMKKyAgICAgICAgICAgIC8vICAgICAgLk9yZGVyQnkodSA9PiB1LkRlcGFydG1lbnRDb2RlKQorICAgICAgICAgICAgLy8gICAgICAuVGhlbkJ5KHUgPT4gdS5Bc3BOZXRVc2VyTmFtZSkpCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgc2hlZXQuQ2VsbHNbY3VycmVudFJvdywgMV0uVmFsdWUgPSB1c2VyLkRlcGFydG1lbnRDb2RlOworICAgICAgICAgICAgLy8gICAgICAgIHNoZWV0LkNlbGxzW2N1cnJlbnRSb3csIDJdLlZhbHVlID0gdXNlci5EZXBhcnRtZW50TmFtZTsKKyAgICAgICAgICAgIC8vICAgICAgICBzaGVldC5DZWxsc1tjdXJyZW50Um93LCAzXS5WYWx1ZSA9IHVzZXIuVXNlckZpcnN0TmFtZTsKKyAgICAgICAgICAgIC8vICAgICAgICBzaGVldC5DZWxsc1tjdXJyZW50Um93LCA0XS5WYWx1ZSA9IHVzZXIuVXNlckluZml4OworICAgICAgICAgICAgLy8gICAgICAgIHNoZWV0LkNlbGxzW2N1cnJlbnRSb3csIDVdLlZhbHVlID0gdXNlci5Vc2VyU3VybmFtZTsKKyAgICAgICAgICAgIC8vICAgICAgICBzaGVldC5DZWxsc1tjdXJyZW50Um93LCA2XS5WYWx1ZSA9IHVzZXIuQXNwTmV0VXNlck5hbWU7CisgICAgICAgICAgICAvLyAgICAgICAgc2hlZXQuQ2VsbHNbY3VycmVudFJvdywgN10uVmFsdWUgPSB1c2VyLkFzcE5ldEVtYWlsOworCisgICAgICAgICAgICAvLyAgICAgICAgY3VycmVudFJvdysrOworICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy99CisKKyAgICAgICAgICAgIC8vIHJldHVybiB0aGUgZmlsbGVkIEV4Y2VsIHdvcmtib29rCisgICAgICAgICAgICAvLyAgcmV0dXJuIHBrZworCisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENsb3NlUHJvYmxlbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk1hbnVhbCBSZWNlaXB0cyIpOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICIgU3BhY2VOZWVkbGUgTWFudWFsIFJlY2VpcHQgRm9ybSI7CisKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHIgPSB3cy5DZWxsc1siQTE6RjEiXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoIkFyaWFsIiwgMTgsIEZvbnRTdHlsZS5JdGFsaWMpKTsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuRGFya1JlZCk7CisgICAgICAgICAgICAgICAgci5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyQ29udGludW91czsKKyAgICAgICAgICAgICAgICAvL3IuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgLy9yLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDIzLCA1NSwgOTMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vCQkJd3MuQ29sdW1uKDEpLkJlc3RGaXQgPSB0cnVlOworICAgICAgICAgICAgd3MuQ29sdW1uKDEpLldpZHRoID0gMTc7CisgICAgICAgICAgICB3cy5Db2x1bW4oNSkuV2lkdGggPSAyMDsKKworCisgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9ICJEYXRlIFByb2R1Y2VkIjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkEyIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMiJdLlZhbHVlID0gRGF0ZVRpbWUuTm93LlRvU2hvcnREYXRlU3RyaW5nKCk7CisgICAgICAgICAgICB3cy5DZWxsc1siRDIiXS5WYWx1ZSA9ICJRdWFudGl0eSI7CisgICAgICAgICAgICB3cy5DZWxsc1siRDIiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkUyIl0uVmFsdWUgPSAidHh0IjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIkM0Il0uVmFsdWUgPSAiUmVjZWlwdCBOdW1iZXIiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkM0Il0uU3R5bGUuV3JhcFRleHQgPSB0cnVlOworICAgICAgICAgICAgd3MuQ2VsbHNbIkM0Il0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKworICAgICAgICAgICAgaW50IHJvd05iciA9IDU7CisgICAgICAgICAgICBmb3IgKGludCBlbnRyeU5iciA9IDE7IGVudHJ5TmJyIDw9IDE7IGVudHJ5TmJyICs9IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkIiICsgcm93TmJyXS5WYWx1ZSA9IGVudHJ5TmJyOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJDIiArIHJvd05icl0uVmFsdWUgPSAxICsgZW50cnlOYnIgLSAxOworICAgICAgICAgICAgICAgIHJvd05iciArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oIi5cXHRlc3QueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgT3Blblhsc20oKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcY3MxLnhsc3giKSk7CisgICAgICAgICAgICBpbnQgYyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5Db3VudDsKKyAgICAgICAgICAgIHAuU2F2ZSgpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZWJ1ZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4bFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgeGxXb3JrU2hlZXQgPSB4bFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QgU2hlZXQiKTsKKyAgICAgICAgICAgIHZhciBDZWxscyA9IHhsV29ya1NoZWV0LkNlbGxzOworICAgICAgICAgICAgdmFyIFRpdGxlQ2VsbCA9IENlbGxzWzEsIDEsIDEsIDNdOworCisgICAgICAgICAgICBUaXRsZUNlbGwuTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgVGl0bGVDZWxsLlZhbHVlID0gIlRlc3QgU3ByZWFkc2hlZXQiOworICAgICAgICAgICAgQ2VsbHNbMiwgMV0uVmFsdWUgPSAiVGVzdCBTdWIgSGVhZGluZ1xyXG50ZXN0IiArIChjaGFyKTIyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDZWxsc1szLCBpICsgMV0uVmFsdWUgPSAoY2hhcilpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2VsbHNbMiwgMV0uU3R5bGUuV3JhcFRleHQgPSB0cnVlOworICAgICAgICAgICAgeGxXb3JrU2hlZXQuUm93KDEpLkhlaWdodCA9IDUwOworICAgICAgICAgICAgeGxQYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxNZXJnZWJ1Zy54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBPcGVuUHJvYmxlbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB4bFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSB4bFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlcxIik7CisgICAgICAgICAgICB4bFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlcyIik7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBMTAiXS5Gb3JtdWxhID0gIlcyIUExK0MxIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMTpCMTAiXS5Gb3JtdWxhUjFDMSA9ICJXMiFSMUMxK0MxIjsKKyAgICAgICAgICAgIHhsUGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcTWVyZ2VidWcueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUHJvdGVjdGlvblByb2JsZW0oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgeGxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxDb3ZlbmFudHNDaGVja1JlcG9ydFRlbXBsYXRlLnhsc3giKSk7CisgICAgICAgICAgICB2YXIgd3MgPSB4bFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiVGVzdCIpOworICAgICAgICAgICAgeGxQYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxNZXJnZWJ1Zy54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBOYW1ldGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXG5hbWVzLnhsc3giKSk7CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkgzNyJdLkZvcm11bGEgPSAiXCJUZXN0XCIiOworICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlxcdGVtcFxcbmFtZXRlc3RfbmV3Lnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVQaXZvdFRhYmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzUGl2b3QxID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUm93cy1EYXRhIG9uIGNvbHVtbnMiKTsKKyAgICAgICAgICAgIHZhciB3c1Bpdm90MiA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlJvd3MtRGF0YSBvbiByb3dzIik7CisgICAgICAgICAgICB2YXIgd3NQaXZvdDMgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb2x1bW5zLURhdGEgb24gY29sdW1ucyIpOworICAgICAgICAgICAgdmFyIHdzUGl2b3Q0ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29sdW1ucy1EYXRhIG9uIHJvd3MiKTsKKyAgICAgICAgICAgIHZhciB3c1Bpdm90NSA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbHVtbnMvUm93cy1EYXRhIG9uIGNvbHVtbnMiKTsKKyAgICAgICAgICAgIHZhciB3c1Bpdm90NiA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbHVtbnMvUm93cy1EYXRhIG9uIHJvd3MiKTsKKyAgICAgICAgICAgIHZhciB3c1Bpdm90NyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlJvd3MvUGFnZS1EYXRhIG9uIENvbHVtbnMiKTsKKyAgICAgICAgICAgIHZhciB3c1Bpdm90OCA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpdm90LUdyb3VwIERhdGUiKTsKKyAgICAgICAgICAgIHZhciB3c1Bpdm90OSA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpdm90LUdyb3VwIE51bWJlciIpOworCisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEYXRhIik7CisgICAgICAgICAgICB3cy5DZWxsc1siSzEiXS5WYWx1ZSA9ICJJdGVtIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJMMSJdLlZhbHVlID0gIkNhdGVnb3J5IjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJNMSJdLlZhbHVlID0gIlN0b2NrIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJOMSJdLlZhbHVlID0gIlByaWNlIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJPMSJdLlZhbHVlID0gIkRhdGUgZm9yIGdyb3VwaW5nIjsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIksyIl0uVmFsdWUgPSAiQ3Jvd2JhciI7CisgICAgICAgICAgICB3cy5DZWxsc1siTDIiXS5WYWx1ZSA9ICJIYXJkd2FyZSI7CisgICAgICAgICAgICB3cy5DZWxsc1siTTIiXS5WYWx1ZSA9IDEyOworICAgICAgICAgICAgd3MuQ2VsbHNbIk4yIl0uVmFsdWUgPSA4NS4yOworICAgICAgICAgICAgd3MuQ2VsbHNbIk8yIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMSwgMzEpOworCisgICAgICAgICAgICB3cy5DZWxsc1siSzMiXS5WYWx1ZSA9ICJDcm93YmFyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJMMyJdLlZhbHVlID0gIkhhcmR3YXJlIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJNMyJdLlZhbHVlID0gMTU7CisgICAgICAgICAgICB3cy5DZWxsc1siTjMiXS5WYWx1ZSA9IDEyLjI7CisgICAgICAgICAgICB3cy5DZWxsc1siTzMiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAyLCAyOCk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJLNCJdLlZhbHVlID0gIkhhbW1lciI7CisgICAgICAgICAgICB3cy5DZWxsc1siTDQiXS5WYWx1ZSA9ICJIYXJkd2FyZSI7CisgICAgICAgICAgICB3cy5DZWxsc1siTTQiXS5WYWx1ZSA9IDU1MDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJONCJdLlZhbHVlID0gNzIuNzsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJPNCJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDMsIDMxKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIks1Il0uVmFsdWUgPSAiSGFtbWVyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJMNSJdLlZhbHVlID0gIkhhcmR3YXJlIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJNNSJdLlZhbHVlID0gMTIwOworICAgICAgICAgICAgd3MuQ2VsbHNbIk41Il0uVmFsdWUgPSAxMS4zOworICAgICAgICAgICAgd3MuQ2VsbHNbIk81Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgNCwgMzApOworCisgICAgICAgICAgICB3cy5DZWxsc1siSzYiXS5WYWx1ZSA9ICJDcm93YmFyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJMNiJdLlZhbHVlID0gIkhhcmR3YXJlIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJNNiJdLlZhbHVlID0gMTIwOworICAgICAgICAgICAgd3MuQ2VsbHNbIk42Il0uVmFsdWUgPSAxNzMuMjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJPNiJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDUsIDMxKTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIks3Il0uVmFsdWUgPSAiSGFtbWVyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJMNyJdLlZhbHVlID0gIkhhcmR3YXJlIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJNNyJdLlZhbHVlID0gMTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJONyJdLlZhbHVlID0gNC4yOworICAgICAgICAgICAgd3MuQ2VsbHNbIk83Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgNiwgMzApOworCisgICAgICAgICAgICB3cy5DZWxsc1siSzgiXS5WYWx1ZSA9ICJTYXciOworICAgICAgICAgICAgd3MuQ2VsbHNbIkw4Il0uVmFsdWUgPSAiSGFyZHdhcmUiOworICAgICAgICAgICAgd3MuQ2VsbHNbIk04Il0uVmFsdWUgPSA0OworICAgICAgICAgICAgd3MuQ2VsbHNbIk44Il0uVmFsdWUgPSAzMy4xMjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJPOCJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDYsIDI4KTsKKworICAgICAgICAgICAgd3MuQ2VsbHNbIks5Il0uVmFsdWUgPSAiU2NyZXdkcml2ZXIiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkw5Il0uVmFsdWUgPSAiSGFyZHdhcmUiOworICAgICAgICAgICAgd3MuQ2VsbHNbIk05Il0uVmFsdWUgPSAxMjAwOworICAgICAgICAgICAgd3MuQ2VsbHNbIk45Il0uVmFsdWUgPSA0NS4yOworICAgICAgICAgICAgd3MuQ2VsbHNbIk85Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOCwgMzEpOworCisgICAgICAgICAgICB3cy5DZWxsc1siSzEwIl0uVmFsdWUgPSAiQXBwbGUiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkwxMCJdLlZhbHVlID0gIkdyb2NlcmllcyI7CisgICAgICAgICAgICB3cy5DZWxsc1siTTEwIl0uVmFsdWUgPSA4MDc7CisgICAgICAgICAgICB3cy5DZWxsc1siTjEwIl0uVmFsdWUgPSAxLjI7CisgICAgICAgICAgICB3cy5DZWxsc1siTzEwIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOSwgMzApOworCisgICAgICAgICAgICB3cy5DZWxsc1siSzExIl0uVmFsdWUgPSAiQnV0dGVyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJMMTEiXS5WYWx1ZSA9ICJHcm9jZXJpZXMiOworICAgICAgICAgICAgd3MuQ2VsbHNbIk0xMSJdLlZhbHVlID0gNTI7CisgICAgICAgICAgICB3cy5DZWxsc1siTjExIl0uVmFsdWUgPSA3LjI7CisgICAgICAgICAgICB3cy5DZWxsc1siTzExIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMTAsIDMxKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJPMjpPMTEiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktTU0tZGQiOworCisgICAgICAgICAgICB2YXIgcHQgPSB3c1Bpdm90MS5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDEuQ2VsbHNbIkExIl0sIHdzLkNlbGxzWyJLMTpOMTEiXSwgIlBpdm90dGFibGUxIik7CisgICAgICAgICAgICBwdC5HcmFuZFRvdGFsQ2FwdGlvbiA9ICJUb3RhbCBhbW91bnQiOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMF0pOworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzWzBdLkZ1bmN0aW9uID0gRGF0YUZpZWxkRnVuY3Rpb25zLlByb2R1Y3Q7CisgICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gZmFsc2U7CisKKyAgICAgICAgICAgIHB0ID0gd3NQaXZvdDIuUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3QyLkNlbGxzWyJBMSJdLCB3cy5DZWxsc1siSzE6TjExIl0sICJQaXZvdHRhYmxlMiIpOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMF0pOworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzWzBdLkZ1bmN0aW9uID0gRGF0YUZpZWxkRnVuY3Rpb25zLkF2ZXJhZ2U7CisgICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gdHJ1ZTsKKworICAgICAgICAgICAgcHQgPSB3c1Bpdm90My5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDMuQ2VsbHNbIkExIl0sIHdzLkNlbGxzWyJLMTpOMTEiXSwgIlBpdm90dGFibGUzIik7CisgICAgICAgICAgICBwdC5Db2x1bW5GaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7CisgICAgICAgICAgICBwdC5Db2x1bW5GaWVsZHMuQWRkKHB0LkZpZWxkc1swXSk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKKyAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSBmYWxzZTsKKworICAgICAgICAgICAgcHQgPSB3c1Bpdm90NC5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDQuQ2VsbHNbIkExIl0sIHdzLkNlbGxzWyJLMTpOMTEiXSwgIlBpdm90dGFibGU0Iik7CisgICAgICAgICAgICBwdC5Db2x1bW5GaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7CisgICAgICAgICAgICBwdC5Db2x1bW5GaWVsZHMuQWRkKHB0LkZpZWxkc1swXSk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKKyAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSB0cnVlOworCisgICAgICAgICAgICBwdCA9IHdzUGl2b3Q1LlBpdm90VGFibGVzLkFkZCh3c1Bpdm90NS5DZWxsc1siQTEiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTUiKTsKKyAgICAgICAgICAgIHB0LkNvbHVtbkZpZWxkcy5BZGQocHQuRmllbGRzWzFdKTsKKyAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWzBdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1szXSk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbMl0pOworICAgICAgICAgICAgcHQuRGF0YU9uUm93cyA9IGZhbHNlOworCisgICAgICAgICAgICBwdCA9IHdzUGl2b3Q2LlBpdm90VGFibGVzLkFkZCh3c1Bpdm90Ni5DZWxsc1siQTEiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTYiKTsKKyAgICAgICAgICAgIHB0LkNvbHVtbkZpZWxkcy5BZGQocHQuRmllbGRzWzFdKTsKKyAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWzBdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1szXSk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbMl0pOworICAgICAgICAgICAgcHQuRGF0YU9uUm93cyA9IHRydWU7CisgICAgICAgICAgICB3c1Bpdm90Ni5EcmF3aW5ncy5BZGRDaGFydCgiUGl2b3RjaGFydDYiLCBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQuZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0QsIHB0KTsKKworICAgICAgICAgICAgcHQgPSB3c1Bpdm90Ny5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDcuQ2VsbHNbIkEzIl0sIHdzLkNlbGxzWyJLMTpOMTEiXSwgIlBpdm90dGFibGU3Iik7CisgICAgICAgICAgICBwdC5QYWdlRmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMF0pOworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7CisgICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gZmFsc2U7CisKKyAgICAgICAgICAgIHB0LkZpZWxkc1swXS5TdWJUb3RhbEZ1bmN0aW9ucyA9IGVTdWJUb3RhbEZ1bmN0aW9ucy5TdW0gfCBlU3ViVG90YWxGdW5jdGlvbnMuTWF4OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHB0LkZpZWxkc1swXS5TdWJUb3RhbEZ1bmN0aW9ucywgZVN1YlRvdGFsRnVuY3Rpb25zLlN1bSB8IGVTdWJUb3RhbEZ1bmN0aW9ucy5NYXgpOworCisgICAgICAgICAgICBwdC5GaWVsZHNbMF0uU3ViVG90YWxGdW5jdGlvbnMgPSBlU3ViVG90YWxGdW5jdGlvbnMuU3VtIHwgZVN1YlRvdGFsRnVuY3Rpb25zLlByb2R1Y3QgfCBlU3ViVG90YWxGdW5jdGlvbnMuU3RkRGV2UDsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwdC5GaWVsZHNbMF0uU3ViVG90YWxGdW5jdGlvbnMsIGVTdWJUb3RhbEZ1bmN0aW9ucy5TdW0gfCBlU3ViVG90YWxGdW5jdGlvbnMuUHJvZHVjdCB8IGVTdWJUb3RhbEZ1bmN0aW9ucy5TdGREZXZQKTsKKworICAgICAgICAgICAgcHQuRmllbGRzWzBdLlN1YlRvdGFsRnVuY3Rpb25zID0gZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmU7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocHQuRmllbGRzWzBdLlN1YlRvdGFsRnVuY3Rpb25zLCBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZSk7CisKKyAgICAgICAgICAgIHB0LkZpZWxkc1swXS5TdWJUb3RhbEZ1bmN0aW9ucyA9IGVTdWJUb3RhbEZ1bmN0aW9ucy5EZWZhdWx0OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHB0LkZpZWxkc1swXS5TdWJUb3RhbEZ1bmN0aW9ucywgZVN1YlRvdGFsRnVuY3Rpb25zLkRlZmF1bHQpOworCisgICAgICAgICAgICBwdC5GaWVsZHNbMF0uU29ydCA9IGVTb3J0VHlwZS5EZXNjZW5kaW5nOworICAgICAgICAgICAgcHQuVGFibGVTdHlsZSA9IE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuTWVkaXVtMTQ7CisKKyAgICAgICAgICAgIHB0ID0gd3NQaXZvdDguUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3Q4LkNlbGxzWyJBMyJdLCB3cy5DZWxsc1siSzE6TzExIl0sICJQaXZvdHRhYmxlOCIpOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbNF0pOworICAgICAgICAgICAgcHQuRmllbGRzWzRdLkFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkuWWVhcnMgfCBlRGF0ZUdyb3VwQnkuTW9udGhzIHwgZURhdGVHcm91cEJ5LkRheXMgfCBlRGF0ZUdyb3VwQnkuUXVhcnRlcnMsIG5ldyBEYXRlVGltZSgyMDEwLCAwMSwgMzEpLCBuZXcgRGF0ZVRpbWUoMjAxMCwgMTEsIDMwKSk7CisgICAgICAgICAgICBwdC5Sb3dIZWFkZXJDYXB0aW9uID0gIsOFciI7CisgICAgICAgICAgICBwdC5GaWVsZHNbNF0uTmFtZSA9ICJEYWciOworICAgICAgICAgICAgcHQuRmllbGRzWzVdLk5hbWUgPSAiTcOlbmFkIjsKKyAgICAgICAgICAgIHB0LkZpZWxkc1s2XS5OYW1lID0gIkt2YXJ0YWwiOworICAgICAgICAgICAgcHQuR3JhbmRUb3RhbENhcHRpb24gPSAiVG90YWx0IjsKKworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7CisgICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gdHJ1ZTsKKworICAgICAgICAgICAgcHQgPSB3c1Bpdm90OS5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDkuQ2VsbHNbIkEzIl0sIHdzLkNlbGxzWyJLMTpOMTEiXSwgIlBpdm90dGFibGU5Iik7CisgICAgICAgICAgICBwdC5QYWdlRmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOworICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbM10pOworICAgICAgICAgICAgcHQuUm93RmllbGRzWzBdLkFkZE51bWVyaWNHcm91cGluZygtMy4zLCA1LjUsIDQuMCk7CisgICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbMl0pOworICAgICAgICAgICAgcHQuRGF0YU9uUm93cyA9IGZhbHNlOworICAgICAgICAgICAgcHQuVGFibGVTdHlsZSA9IE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuTWVkaXVtMTQ7CisKKyAgICAgICAgICAgIHB0ID0gd3NQaXZvdDguUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3Q4LkNlbGxzWyJIMyJdLCB3cy5DZWxsc1siSzE6TzExIl0sICJQaXZvdHRhYmxlMTAiKTsKKyAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWzFdKTsKKyAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWzRdKTsKKyAgICAgICAgICAgIHB0LkZpZWxkc1s0XS5BZGREYXRlR3JvdXBpbmcoNywgbmV3IERhdGVUaW1lKDIwMTAsIDAxLCAzMSksIG5ldyBEYXRlVGltZSgyMDEwLCAxMSwgMzApKTsKKyAgICAgICAgICAgIHB0LlJvd0hlYWRlckNhcHRpb24gPSAiVmVja29yIjsKKyAgICAgICAgICAgIHB0LkdyYW5kVG90YWxDYXB0aW9uID0gIlRvdGFsdCI7CisKKyAgICAgICAgICAgIHB0ID0gd3NQaXZvdDguUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3Q4LkNlbGxzWyJBNjAiXSwgd3MuQ2VsbHNbIksxOk8xMSJdLCAiUGl2b3R0YWJsZTExIik7CisgICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1siQ2F0ZWdvcnkiXSk7CisgICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1siSXRlbSJdKTsKKyAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWyJEYXRlIGZvciBncm91cGluZyJdKTsKKworICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKKyAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7CisgICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmVhZFBpdm90VGFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHBpdm90XHBpdm90Zm9ycmVhZC54bHN4IikpOworCisgICAgICAgICAgICB2YXIgcGl2b3QxID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMl0uUGl2b3RUYWJsZXNbMF07CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwaXZvdDEuRmllbGRzLkNvdW50LCAyNCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGl2b3QxLlJvd0ZpZWxkcy5Db3VudCwgMyk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGl2b3QxLkRhdGFGaWVsZHMuQ291bnQsIDcpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBpdm90MS5Db2x1bW5GaWVsZHMuQ291bnQsIDApOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGl2b3QxLkRhdGFGaWVsZHNbMV0uTmFtZSwgIlN1bSBvZiBuMyIpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBpdm90MS5GaWVsZHNbMl0uU29ydCwgZVNvcnRUeXBlLkFzY2VuZGluZyk7CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwaXZvdDEuRGF0YU9uUm93cywgZmFsc2UpOworCisgICAgICAgICAgICB2YXIgcGl2b3QyID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMl0uUGl2b3RUYWJsZXNbMF07CisgICAgICAgICAgICB2YXIgcGl2b3QzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbM10uUGl2b3RUYWJsZXNbMF07CisKKyAgICAgICAgICAgIHZhciBwaXZvdDQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1s0XS5QaXZvdFRhYmxlc1swXTsKKyAgICAgICAgICAgIHZhciBwaXZvdDUgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1s1XS5QaXZvdFRhYmxlc1swXTsKKyAgICAgICAgICAgIHBpdm90NS5DYWNoZURlZmluaXRpb24uU291cmNlUmFuZ2UgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siUTE6WDMwMCJdOworCisgICAgICAgICAgICB2YXIgcGl2b3Q2ID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbNl0uUGl2b3RUYWJsZXNbMF07CisKKyAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzZdLkRyYXdpbmdzLkFkZENoYXJ0KCJjaGFydDEiLCBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQuZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkM0QsIHBpdm90Nik7CisKKyAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxwaXZvdFxwaXZvdGZvcnJlYWRfbmV3Lnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVBpdm90TXVsdERhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBmaSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdGVzdC54bHN4Iik7CisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShmaSk7CisKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGF0YSIpOworICAgICAgICAgICAgdmFyIHB2ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdCIpOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJEYXRhMSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5WYWx1ZSA9ICJEYXRhMiI7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gIjEiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uVmFsdWUgPSAiMiI7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMyJdLlZhbHVlID0gIjMiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIzIl0uVmFsdWUgPSAiNCI7CisKKyAgICAgICAgICAgIHdzLlNlbGVjdCgiQTE6QjMiKTsKKworICAgICAgICAgICAgdmFyIHB0ID0gcHYuUGl2b3RUYWJsZXMuQWRkKHB2LlNlbGVjdGVkUmFuZ2UsIHdzLlNlbGVjdGVkUmFuZ2UsICJQaXZvdCIpOworCisgICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1siRGF0YTIiXSk7CisKKyAgICAgICAgICAgIHZhciBkZiA9IHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1siRGF0YTEiXSk7CisgICAgICAgICAgICBkZi5GdW5jdGlvbiA9IERhdGFGaWVsZEZ1bmN0aW9ucy5Db3VudDsKKworICAgICAgICAgICAgZGYgPSBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbIkRhdGExIl0pOworICAgICAgICAgICAgZGYuRnVuY3Rpb24gPSBEYXRhRmllbGRGdW5jdGlvbnMuU3VtOworCisgICAgICAgICAgICBkZiA9IHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1siRGF0YTEiXSk7CisgICAgICAgICAgICBkZi5GdW5jdGlvbiA9IERhdGFGaWVsZEZ1bmN0aW9ucy5TdGREZXY7CisgICAgICAgICAgICBkZi5OYW1lID0gIkRhdEExXzIiOworCisgICAgICAgICAgICBwY2suU2F2ZSgpOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEJhY2tncm91bmQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJiYWNraW1nIik7CisKKyAgICAgICAgICAgIHdzLkJhY2tncm91bmRJbWFnZS5JbWFnZSA9IFByb3BlcnRpZXMuUmVzb3VyY2VzLlRlc3QxOworICAgICAgICAgICAgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJiYWNraW1nMiIpOworICAgICAgICAgICAgd3MuQmFja2dyb3VuZEltYWdlLlNldEZyb21GaWxlKG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoX2NsaXBhcnRQYXRoLCJWZWN0b3IgRHJhd2luZy53bWYiKSkpOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFNldEhlYWRlckZvb3RlckltYWdlKCkKKyAgICAgICAgeworCisgICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJIZWFkZXJJbWFnZSIpOworICAgICAgICAgICAgd3MuSGVhZGVyRm9vdGVyLk9kZEhlYWRlci5DZW50ZXJlZFRleHQgPSAiQmVmb3JlICI7CisgICAgICAgICAgICB2YXIgaW1nID0gd3MuSGVhZGVyRm9vdGVyLk9kZEhlYWRlci5JbnNlcnRQaWN0dXJlKFByb3BlcnRpZXMuUmVzb3VyY2VzLlRlc3QxLCBQaWN0dXJlQWxpZ25tZW50LkNlbnRlcmVkKTsKKyAgICAgICAgICAgIGltZy5UaXRsZSA9ICJSZW5hbWVkIEltYWdlIjsKKyAgICAgICAgICAgIGltZy5HcmF5U2NhbGUgPSB0cnVlOworICAgICAgICAgICAgaW1nLkJpTGV2ZWwgPSB0cnVlOworICAgICAgICAgICAgaW1nLkdhaW4gPSAuNTsKKyAgICAgICAgICAgIGltZy5HYW1tYSA9IC4zNTsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltZy5XaWR0aCwgNDI2KTsKKyAgICAgICAgICAgIGltZy5XaWR0aCAvPSA0OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltZy5IZWlnaHQsIDQ5LjUpOworICAgICAgICAgICAgaW1nLkhlaWdodCAvPSA0OworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltZy5MZWZ0LCAwKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpbWcuVG9wLCAwKTsKKyAgICAgICAgICAgIHdzLkhlYWRlckZvb3Rlci5PZGRIZWFkZXIuQ2VudGVyZWRUZXh0ICs9ICIgQWZ0ZXIiOworCisKKyAgICAgICAgICAgIGltZyA9IHdzLkhlYWRlckZvb3Rlci5FdmVuRm9vdGVyLkluc2VydFBpY3R1cmUobmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsIlZlY3RvciBEcmF3aW5nLndtZiIpKSwgUGljdHVyZUFsaWdubWVudC5MZWZ0KTsKKyAgICAgICAgICAgIGltZy5UaXRsZSA9ICJEaXNrRmlsZSI7CisKKyAgICAgICAgICAgIGltZyA9IHdzLkhlYWRlckZvb3Rlci5GaXJzdEhlYWRlci5JbnNlcnRQaWN0dXJlKG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoX2NsaXBhcnRQYXRoLCAiVmVjdG9yIERyYXdpbmcyLldNRiIpKSwgUGljdHVyZUFsaWdubWVudC5SaWdodCk7CisgICAgICAgICAgICBpbWcuVGl0bGUgPSAiRGlza0ZpbGUyIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNDAwIl0uVmFsdWUgPSAxOworCisgICAgICAgICAgICBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQ29weSh3cy5OYW1lLCAiQ29waWVkIEhlYWRlckltYWdlIik7CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBOYW1lZFN0eWxlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3c1NoZWV0ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTmFtZWRTdHlsZXMiKTsKKworICAgICAgICAgICAgdmFyIGZpcnN0TmFtZWRTdHlsZSA9CisgICAgICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgidGVtcGxhdGVGaXJzdCIpOworCisgICAgICAgICAgICB2YXIgcyA9IGZpcnN0TmFtZWRTdHlsZS5TdHlsZTsKKworICAgICAgICAgICAgcy5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICBzLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkxpZ2h0R3JlZW4pOworICAgICAgICAgICAgcy5Ib3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlckNvbnRpbnVvdXM7CisgICAgICAgICAgICBzLlZlcnRpY2FsQWxpZ25tZW50ID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5DZW50ZXI7CisKKyAgICAgICAgICAgIHZhciBzZWNvbmROYW1lZFN0eWxlID0gX3Bjay5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiZmlyc3QiLCBmaXJzdE5hbWVkU3R5bGUuU3R5bGUpLlN0eWxlOworICAgICAgICAgICAgc2Vjb25kTmFtZWRTdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgc2Vjb25kTmFtZWRTdHlsZS5Gb250LlNldEZyb21Gb250KG5ldyBGb250KCJBcmlhbCBCbGFjayIsIDgpKTsKKyAgICAgICAgICAgIHNlY29uZE5hbWVkU3R5bGUuQm9yZGVyLkJvdHRvbS5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuTWVkaXVtOworICAgICAgICAgICAgc2Vjb25kTmFtZWRTdHlsZS5Cb3JkZXIuTGVmdC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuTWVkaXVtOworCisgICAgICAgICAgICB3c1NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gIlRleHQgQ2VudGVyIjsKKyAgICAgICAgICAgIHdzU2hlZXQuQ2VsbHNbIkIyIl0uU3R5bGVOYW1lID0gImZpcnN0IjsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzWzBdLlN0eWxlLkZvbnQuTmFtZSA9ICJBcmlhbCI7CisKKyAgICAgICAgICAgIHZhciByb3dTdHlsZSA9IF9wY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoIlJvd1N0eWxlIiwgZmlyc3ROYW1lZFN0eWxlLlN0eWxlKS5TdHlsZTsKKyAgICAgICAgICAgIHJvd1N0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLlBpbmspOworICAgICAgICAgICAgd3NTaGVldC5DZWxscy5TdHlsZU5hbWUgPSAidGVtcGxhdGVGaXJzdCI7CisgICAgICAgICAgICB3c1NoZWV0LkNlbGxzWyJDNTpIMTUiXS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICB3c1NoZWV0LkNlbGxzWyJDNTpIMTUiXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5PcmFuZ2VSZWQpOworCisgICAgICAgICAgICB3c1NoZWV0LkNlbGxzWyIzMDozNSJdLlN0eWxlTmFtZSA9ICJSb3dTdHlsZSI7CisgICAgICAgICAgICB2YXIgY29sU3R5bGUgPSBfcGNrLldvcmtib29rLlN0eWxlcy5DcmVhdGVOYW1lZFN0eWxlKCJjb2x1bW5TdHlsZSIsIGZpcnN0TmFtZWRTdHlsZS5TdHlsZSkuU3R5bGU7CisgICAgICAgICAgICBjb2xTdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5DYWRldEJsdWUpOworCisgICAgICAgICAgICB3c1NoZWV0LkNlbGxzWyJEOkUiXS5TdHlsZU5hbWUgPSAiQ29sdW1uU3R5bGUiOworICAgICAgICB9CisgICAgICAgIC8vW0lnbm9yZV0KKyAgICAgICAgLy9bVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgU3R5bGVGaWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRmlsbHMiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpDMyJdLlN0eWxlLkZpbGwuR3JhZGllbnQuVHlwZSA9IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5MaW5lYXI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6QzMiXS5TdHlsZS5GaWxsLkdyYWRpZW50LkNvbG9yMS5TZXRDb2xvcihDb2xvci5SZWQpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkMzIl0uU3R5bGUuRmlsbC5HcmFkaWVudC5Db2xvcjIuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5NZWRpdW1HcmF5OworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRm9yZXN0R3JlZW4pOworICAgICAgICAgICAgdmFyIHIgPSB3cy5DZWxsc1siQTI6QTMiXTsKKyAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5UeXBlID0gRXhjZWxGaWxsR3JhZGllbnRUeXBlLlBhdGg7CisgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuTGVmdCA9IDAuNzsKKyAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5SaWdodCA9IDAuNzsKKyAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5Ub3AgPSAwLjc7CisgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuQm90dG9tID0gMC43OworCisgICAgICAgICAgICB3cy5DZWxsc1s0LCAxLCA0LCAzNjBdLlN0eWxlLkZpbGwuR3JhZGllbnQuVHlwZSA9IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5QYXRoOworCisgICAgICAgICAgICBmb3IgKGRvdWJsZSBjb2wgPSAxOyBjb2wgPCAzNjA7IGNvbCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIgPSB3cy5DZWxsc1s0LCBDb252ZXJ0LlRvSW50MzIoY29sKV07CisgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkdyYWRpZW50LkRlZ3JlZSA9IGNvbDsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuTGVmdCA9IGNvbCAvIDM2MDsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuUmlnaHQgPSBjb2wgLyAzNjA7CisgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkdyYWRpZW50LlRvcCA9IGNvbCAvIDM2MDsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuQm90dG9tID0gY29sIC8gMzYwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgciA9IHdzLkNlbGxzWyJBNSJdOworICAgICAgICAgICAgci5TdHlsZS5GaWxsLkdyYWRpZW50LkxlZnQgPSAuNTA7CisKKyAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRnVsbEZpbGxzIik7CisgICAgICAgICAgICB3cy5DZWxscy5TdHlsZS5GaWxsLkdyYWRpZW50LkxlZnQgPSAwLjI1OworICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAidGVzdCI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5SaWNoVGV4dC5BZGQoIlRlc3QgcnQiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzLkF1dG9GaWx0ZXIgPSB0cnVlOworICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKHdzLkNlbGxzWyJBMTpENSJdLlZhbHVlLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBbSWdub3JlXQorICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgQnVpbGRJblN0eWxlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRlZmF1bHQiKTsKKyAgICAgICAgICAgIHdzLkNlbGxzLlN0eWxlLkZvbnQuTmFtZSA9ICJBcmlhbCI7CisgICAgICAgICAgICB3cy5DZWxscy5TdHlsZS5Gb250LlNpemUgPSAxNTsKKyAgICAgICAgICAgIHdzLkNlbGxzLlN0eWxlLkJvcmRlci5Cb3R0b20uU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLk1lZGl1bURhc2hlZDsKKyAgICAgICAgICAgIHZhciBuID0gcGNrLldvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlc1swXTsKKyAgICAgICAgICAgIG4uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJ5eXl5IjsKKyAgICAgICAgICAgIG4uU3R5bGUuRm9udC5OYW1lID0gIkFyaWFsIjsKKyAgICAgICAgICAgIG4uU3R5bGUuRm9udC5TaXplID0gMTU7CisgICAgICAgICAgICBuLlN0eWxlLkJvcmRlci5Cb3R0b20uU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLkRvdHRlZDsKKyAgICAgICAgICAgIG4uU3R5bGUuQm9yZGVyLkJvdHRvbS5Db2xvci5TZXRDb2xvcihDb2xvci5SZWQpOworICAgICAgICAgICAgbi5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICBuLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkJsdWUpOworICAgICAgICAgICAgbi5TdHlsZS5Cb3JkZXIuQm90dG9tLkNvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7CisgICAgICAgICAgICBuLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyOworICAgICAgICAgICAgbi5TdHlsZS5WZXJ0aWNhbEFsaWdubWVudCA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnQuQ2VudGVyOworICAgICAgICAgICAgbi5TdHlsZS5UZXh0Um90YXRpb24gPSA5MDsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJhMTpjMyJdLlN0eWxlTmFtZSA9ICJOb3JtYWwiOworICAgICAgICAgICAgLy8gIG4uQ3VzdG9tQnVpbGRpbiA9IHRydWU7CisgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcc3R5bGUueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICAvL1tJZ25vcmVdCisgICAgICAgIC8vW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEF1dG9GaXRDb2x1bW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQXV0b2ZpdCIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkgxIl0uVmFsdWUgPSAiQXV0byBmaXQgY29sdW1uIHRoYXQgaXMgdmVlZXJ5IGxvbmcuLi4iOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uU3R5bGUuVGV4dFJvdGF0aW9uID0gMzA7CisgICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5TdHlsZS5UZXh0Um90YXRpb24gPSA0NTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJEMSJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDc1OworICAgICAgICAgICAgd3MuQ2VsbHNbIkUxIl0uU3R5bGUuVGV4dFJvdGF0aW9uID0gOTA7CisgICAgICAgICAgICB3cy5DZWxsc1siRjEiXS5TdHlsZS5UZXh0Um90YXRpb24gPSAxMjA7CisgICAgICAgICAgICB3cy5DZWxsc1siRzEiXS5TdHlsZS5UZXh0Um90YXRpb24gPSAxMzU7CisgICAgICAgICAgICB3cy5DZWxsc1siSDEiXS5TdHlsZS5UZXh0Um90YXRpb24gPSAxODA7CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6SDEiXS5BdXRvRml0Q29sdW1ucygwKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIE1vdmVpc3N1ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXEZvcm11bGFJc3N1ZVxQcmVEZWxldGUueGxzeCIpKTsKKyAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EZWxldGVSb3coMiwgNCk7CisgICAgICAgICAgICBfcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXG1vdmUueGxzeCIpKTsKKyAgICAgICAgfQorICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWxDb2woKQorICAgICAgICB7CisgICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xGb3JtdWxhSXNzdWVcUHJlRGVsZXRlQ29sLnhsc3giKSk7CisgICAgICAgICAgICBfcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uRGVsZXRlQ29sdW1uKDUsIDEpOworICAgICAgICAgICAgX3Bjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxtb3ZlLnhsc3giKSk7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSW5zQ29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcRm9ybXVsYUlzc3VlXFByZURlbGV0ZUNvbC54bHN4IikpOworICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkluc2VydENvbHVtbig0LCA1KTsKKyAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcbW92ZS54bHN4IikpOworICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBGaWxlTG9ja2VkUHJvYmxlbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHVybC54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkRlbGV0ZVJvdygxLCAxKTsKKyAgICAgICAgICAgICAgICBwY2suU2F2ZSgpOworICAgICAgICAgICAgICAgIHBjay5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9bSWdub3JlXQorICAgICAgICAvL1tUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBDb3B5T3ZlcndyaXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29weU92ZXJ3cml0ZSIpOworCisgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAxOyBjb2wgPCAxNTsgY29sKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgMzA7IHJvdysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3MuU2V0VmFsdWUocm93LCBjb2wsICJjZWxsICIgKyBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3Mocm93LCBjb2wpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cy5DZWxsc1siQTE6UDMwIl0uQ29weSh3cy5DZWxsc1siQjEiXSk7CisgICAgICAgIH0KKyAgICAgICAgW0lnbm9yZV0KKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIFJ1blNhbXBsZTAoKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcc2FtcGxlMC54bHN4Iik7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSW5zZXJ0Q29sdW1uKDEsIDEpOworCisgICAgICAgICAgICAgICAgRXhjZWxDb2x1bW4gZW50aXJlQ29sdW1uID0gd29ya3NoZWV0LkNvbHVtbigxKTsKKworICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gd29ya3NoZWV0LkNvbHVtbig2KTsKKyAgICAgICAgICAgICAgICBsYXN0LlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICBsYXN0LlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkJsdWUpOworICAgICAgICAgICAgICAgIGxhc3QuQ29sdW1uTWF4ID0gNzsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSW5zZXJ0Q29sdW1uKDcsIDEpOworCisgICAgICAgICAgICAgICAgLy9zYXZlIG91ciBuZXcgd29ya2Jvb2sgYW5kIHdlIGFyZSBkb25lIQorICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFtJZ25vcmVdCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGV3cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1x3b3Jrc2hlZXQgZXJyb3IueGxzeCIpOworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgd3MxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgic2hlZXQxIik7CisgICAgICAgICAgICAgICAgdmFyIHdzMiA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0MiIpOworICAgICAgICAgICAgICAgIHZhciB3czMgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldDMiKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5Nb3ZlVG9TdGFydCh3czMuTmFtZSk7CisgICAgICAgICAgICAgICAgLy9zYXZlIG91ciBuZXcgd29ya2Jvb2sgYW5kIHdlIGFyZSBkb25lIQorICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRGVsZXRlKDEpOworICAgICAgICAgICAgICAgIHZhciB3czMgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldDMiKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1x3b3Jrc2hlZXQgZXJyb3Jfc2F2ZS54bHN4IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTIwNygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHdvcmtzaGVldCBlcnJvci54bHN4IikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd2IgPSBlcC5Xb3JrYm9vazsKKworICAgICAgICAgICAgICAgIGlmICh3YiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIHdzID0gd2IuV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAod3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9kbyBzb21ldGhpbmcgd2l0aCB0aGUgd29ya3NoZWV0CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3Yi5EaXNwb3NlKCk7CisKKyAgICAgICAgICAgICAgICB9IC8vaWYgd2IgIT0gbnVsbAorCisgICAgICAgICAgICAgICAgd2IgPSBudWxsOworCisgICAgICAgICAgICAgICAgLy9kbyBzb21lIG90aGVyIHRoaW5ncworCisgICAgICAgICAgICAgICAgLy9ydW5uaW5nIHRocm91Z2ggdGhpcyBuZXh0IGxpbmUgbm93IHRocm93cyB0aGUgbnVsbCByZWZlcmVuY2UgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgLy9zbyB0aGUgaW5idWlsdCBkaXNwb3NlIG1ldGhvZCBkb2Vzbid0IHdvcmsgcHJvcGVybHkuCisgICAgICAgICAgICB9IC8vdXNpbmcgKEV4Y2VsUGFja2FnZSBlcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKHNvbWVfZmlsZSkpCisgICAgICAgIH0KKyAgICAgICAgI3JlZ2lvbiBEYXRlMTkwNCBUZXN0IENhc2VzCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGF0ZTE5MDRXaXRob3V0U2V0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlID0gInRlc3QxOTA0Lnhsc3giOworICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QxID0gbmV3IERhdGVUaW1lKDIwMDgsIDIsIDI5KTsKKyAgICAgICAgICAgIERhdGVUaW1lIGRhdGVUZXN0MiA9IG5ldyBEYXRlVGltZSgxOTUwLCAxMSwgMzApOworCisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZmlsZSkpCisgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUoZmlsZSk7CisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdyA9IHBhY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgIHcuQ2VsbHNbMSwgMSwgMiwgMV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZEluRnJvbUlEKDE0KTsKKyAgICAgICAgICAgIHcuQ2VsbHNbMSwgMV0uVmFsdWUgPSBkYXRlVGVzdDE7CisgICAgICAgICAgICB3LkNlbGxzWzIsIDFdLlZhbHVlID0gZGF0ZVRlc3QyOworICAgICAgICAgICAgcGFjay5TYXZlKCk7CisKKworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2syID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdzIgPSBwYWNrMi5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJ0ZXN0Il07CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDEsIHcyLkNlbGxzWzEsIDFdLlZhbHVlKTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDIsIHcyLkNlbGxzWzIsIDFdLlZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGF0ZTE5MDRXaXRoU2V0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlID0gInRlc3QxOTA0Lnhsc3giOworICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QxID0gbmV3IERhdGVUaW1lKDIwMDgsIDIsIDI5KTsKKyAgICAgICAgICAgIERhdGVUaW1lIGRhdGVUZXN0MiA9IG5ldyBEYXRlVGltZSgxOTUwLCAxMSwgMzApOworCisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZmlsZSkpCisgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUoZmlsZSk7CisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgcGFjay5Xb3JrYm9vay5EYXRlMTkwNCA9IHRydWU7CisKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHcgPSBwYWNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICB3LkNlbGxzWzEsIDEsIDIsIDFdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSBFeGNlbE51bWJlckZvcm1hdC5HZXRGcm9tQnVpbGRJbkZyb21JRCgxNCk7CisgICAgICAgICAgICB3LkNlbGxzWzEsIDFdLlZhbHVlID0gZGF0ZVRlc3QxOworICAgICAgICAgICAgdy5DZWxsc1syLCAxXS5WYWx1ZSA9IGRhdGVUZXN0MjsKKyAgICAgICAgICAgIHBhY2suU2F2ZSgpOworCisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrMiA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKGZpbGUpKTsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHcyID0gcGFjazIuV29ya2Jvb2suV29ya3NoZWV0c1sidGVzdCJdOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0ZVRlc3QxLCB3Mi5DZWxsc1sxLCAxXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0ZVRlc3QyLCB3Mi5DZWxsc1syLCAxXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdERhdGUxOTA0U2V0QW5kUmVtb3ZlU2V0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlID0gInRlc3QxOTA0Lnhsc3giOworICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QxID0gbmV3IERhdGVUaW1lKDIwMDgsIDIsIDI5KTsKKyAgICAgICAgICAgIERhdGVUaW1lIGRhdGVUZXN0MiA9IG5ldyBEYXRlVGltZSgxOTUwLCAxMSwgMzApOworCisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZmlsZSkpCisgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUoZmlsZSk7CisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgcGFjay5Xb3JrYm9vay5EYXRlMTkwNCA9IHRydWU7CisKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHcgPSBwYWNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICB3LkNlbGxzWzEsIDEsIDIsIDFdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSBFeGNlbE51bWJlckZvcm1hdC5HZXRGcm9tQnVpbGRJbkZyb21JRCgxNCk7CisgICAgICAgICAgICB3LkNlbGxzWzEsIDFdLlZhbHVlID0gZGF0ZVRlc3QxOworICAgICAgICAgICAgdy5DZWxsc1syLCAxXS5WYWx1ZSA9IGRhdGVUZXN0MjsKKyAgICAgICAgICAgIHBhY2suU2F2ZSgpOworCisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrMiA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKGZpbGUpKTsKKyAgICAgICAgICAgIHBhY2syLldvcmtib29rLkRhdGUxOTA0ID0gZmFsc2U7CisgICAgICAgICAgICBwYWNrMi5TYXZlKCk7CisKKworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2szID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdzMgPSBwYWNrMy5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJ0ZXN0Il07CisKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDEuQWRkRGF5cygzNjUuNSAqIC00KSwgdzMuQ2VsbHNbMSwgMV0uVmFsdWUpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGVUZXN0Mi5BZGREYXlzKDM2NS41ICogLTQpLCB3My5DZWxsc1syLCAxXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdERhdGUxOTA0U2V0QW5kU2V0U2V0dGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBmaWxlID0gInRlc3QxOTA0Lnhsc3giOworICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QxID0gbmV3IERhdGVUaW1lKDIwMDgsIDIsIDI5KTsKKyAgICAgICAgICAgIERhdGVUaW1lIGRhdGVUZXN0MiA9IG5ldyBEYXRlVGltZSgxOTUwLCAxMSwgMzApOworCisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMoZmlsZSkpCisgICAgICAgICAgICAgICAgRmlsZS5EZWxldGUoZmlsZSk7CisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOworICAgICAgICAgICAgcGFjay5Xb3JrYm9vay5EYXRlMTkwNCA9IHRydWU7CisKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHcgPSBwYWNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICB3LkNlbGxzWzEsIDEsIDIsIDFdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSBFeGNlbE51bWJlckZvcm1hdC5HZXRGcm9tQnVpbGRJbkZyb21JRCgxNCk7CisgICAgICAgICAgICB3LkNlbGxzWzEsIDFdLlZhbHVlID0gZGF0ZVRlc3QxOworICAgICAgICAgICAgdy5DZWxsc1syLCAxXS5WYWx1ZSA9IGRhdGVUZXN0MjsKKyAgICAgICAgICAgIHBhY2suU2F2ZSgpOworCisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrMiA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKGZpbGUpKTsKKyAgICAgICAgICAgIHBhY2syLldvcmtib29rLkRhdGUxOTA0ID0gdHJ1ZTsgIC8vIE9ubHkgdGhlIGNlbGxzIG11c3QgYmUgdXBkYXRlZCB3aGVuIHRoaXMgY2hhbmdlLCBpZiBzZXQgdGhlIHNhbWUgbm90aGluZyBtdXN0IGNoYW5nZQorICAgICAgICAgICAgcGFjazIuU2F2ZSgpOworCisKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrMyA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKGZpbGUpKTsKKyAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHczID0gcGFjazMuV29ya2Jvb2suV29ya3NoZWV0c1sidGVzdCJdOworCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0ZVRlc3QxLCB3My5DZWxsc1sxLCAxXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0ZVRlc3QyLCB3My5DZWxsc1syLCAxXS5WYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KKyAgICAgICAgcHVibGljIHZvaWQgU2F2ZVRvU3RyZWFtKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oRmlsZS5SZWFkQWxsQnl0ZXMoQCJjOlx0ZW1wXGJvb2sxLnhsc3giKSk7CisgICAgICAgICAgICB2YXIgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShzdHJlYW0pOworICAgICAgICAgICAgZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7CisgICAgICAgICAgICBleGNlbFBhY2thZ2UuU2F2ZSgpOworICAgICAgICAgICAgdmFyIHMgPSBzdHJlYW0uVG9BcnJheSgpOworICAgICAgICB9CisgICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbHVtbnNUZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4Y2VsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29sdW1uVGVzdCIpOworCisKKyAgICAgICAgICAgIGZvciAodmFyIGMgPSA0OyBjIDw9IDIwOyBjICs9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvbCA9IHdzLkNvbHVtbihjKTsKKyAgICAgICAgICAgICAgICBjb2wuQ29sdW1uTWF4ID0gYyArIDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdzLkNvbHVtbigzKS5IaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgd3MuQ29sdW1uKDYpLkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICB3cy5Db2x1bW4oOSkuSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNvbHVtbigxNSkuSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJhMTpaMSJdLlZhbHVlID0gIlRlc3QiOworICAgICAgICAgICAgd3MuQ2VsbHNbImExOkZGMzMiXS5BdXRvRml0Q29sdW1ucygwKTsKKyAgICAgICAgICAgIHdzLkNvbHVtbigyNikuQ29sdW1uTWF4ID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7CisgICAgICAgICAgICBleGNlbFBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYXV0b2ZpdC54bHN4IikpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIENvbW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0QmFzZSgpOworICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3czEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbW1lbnQxIik7CisgICAgICAgICAgICB3czEuQ2VsbHNbMSwgMV0uQWRkQ29tbWVudCgiVGVzdGluZyIsICJ0ZXN0MSIpOworCisgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArICJjb21tZW50Lnhsc3giKSk7CisKKyAgICAgICAgICAgIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgImNvbW1lbnQueGxzeCIpKTsKKyAgICAgICAgICAgIHZhciB3czIgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgIHdzMi5DZWxsc1sxLCAyXS5BZGRDb21tZW50KCJUZXN0aW5nIiwgInRlc3QxIik7CisgICAgICAgICAgICBwY2suU2F2ZSgpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1dvcmtib29rcy9Gb3JtdWxhVGVzdC54bHN4IGIvRVBQbHVzVGVzdC9Xb3JrYm9va3MvRm9ybXVsYVRlc3QueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2FhMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9Xb3JrYm9va3MvRm9ybXVsYVRlc3QueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1dvcmtib29rcy9NdWx0aUNvbG9yQ29uZGl0aW9uYWxGb3JtYXR0aW5nLnhsc3ggYi9FUFBsdXNUZXN0L1dvcmtib29rcy9NdWx0aUNvbG9yQ29uZGl0aW9uYWxGb3JtYXR0aW5nLnhsc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiOTY3NwotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvV29ya2Jvb2tzL011bHRpQ29sb3JDb25kaXRpb25hbEZvcm1hdHRpbmcueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1dvcmtib29rcy9WQkFEZWNvbXByZXNzQnVnLnhsc20gYi9FUFBsdXNUZXN0L1dvcmtib29rcy9WQkFEZWNvbXByZXNzQnVnLnhsc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkZDMwNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1Rlc3QvV29ya2Jvb2tzL1ZCQURlY29tcHJlc3NCdWcueGxzbQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1dvcmtzaGVldHNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvV29ya3NoZWV0c1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Y2VlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNUZXN0L1dvcmtzaGVldHNUZXN0cy5jcwpAQCAtMCwwICsxLDI4MSBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247CisKK25hbWVzcGFjZSBFUFBsdXNUZXN0Cit7CisJW1Rlc3RDbGFzc10KKwlwdWJsaWMgY2xhc3MgV29ya3NoZWV0c1Rlc3RzCisJeworCQlwcml2YXRlIEV4Y2VsUGFja2FnZSBwYWNrYWdlOworCQlwcml2YXRlIEV4Y2VsV29ya2Jvb2sgd29ya2Jvb2s7CisKKwkJW1Rlc3RJbml0aWFsaXplXQorCQlwdWJsaWMgdm9pZCBUZXN0SW5pdGlhbGl6ZSgpCisJCXsKKwkJCXBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisJCQl3b3JrYm9vayA9IHBhY2thZ2UuV29ya2Jvb2s7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXMSIpOworCQl9CisKKwkJW1Rlc3RNZXRob2RdCisJCXB1YmxpYyB2b2lkIENvbmZpcm1GaWxlU3RydWN0dXJlKCkKKwkJeworCQkJQXNzZXJ0LklzTm90TnVsbChwYWNrYWdlLCAiUGFja2FnZSBub3QgY3JlYXRlZCIpOworCQkJQXNzZXJ0LklzTm90TnVsbCh3b3JrYm9vaywgIk5vIHdvcmtib29rIGZvdW5kIik7CisJCX0KKworCQlbVGVzdE1ldGhvZF0KKwkJcHVibGljIHZvaWQgU2hvdWxkQmVBYmxlVG9EZWxldGVBbmRUaGVuQWRkKCkKKwkJeworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzIiKTsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuRGVsZXRlKDEpOworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzMiKTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlwdWJsaWMgdm9pZCBEZWxldGVCeU5hbWVXaGVyZVdvcmtTaGVldEV4aXN0cygpCisJCXsKKwkJICAgIHdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVcyIik7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSgiTkVXMiIpOworICAgICAgICB9CisKKwkJW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorCQlwdWJsaWMgdm9pZCBEZWxldGVCeU5hbWVXaGVyZVdvcmtTaGVldERvZXNOb3RFeGlzdCgpCisJCXsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVcyIik7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSgiTkVXMyIpOworCQl9CisKKwkJW1Rlc3RNZXRob2RdCisJCXB1YmxpYyB2b2lkIE1vdmVCZWZvcmVCeU5hbWVXaGVyZVdvcmtTaGVldEV4aXN0cygpCisJCXsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVcyIik7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXMyIpOworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzQiKTsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVc1Iik7CisKKwkJCXdvcmtib29rLldvcmtzaGVldHMuTW92ZUJlZm9yZSgiTkVXNCIsICJORVcyIik7CisKKwkJCUNvbXBhcmVPcmRlck9mV29ya3NoZWV0c0FmdGVyU2F2aW5nKHBhY2thZ2UpOworCQl9CisKKwkJW1Rlc3RNZXRob2RdCisJCXB1YmxpYyB2b2lkIE1vdmVBZnRlckJ5TmFtZVdoZXJlV29ya1NoZWV0RXhpc3RzKCkKKwkJeworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzIiKTsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVczIik7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXNCIpOworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzUiKTsKKworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5Nb3ZlQWZ0ZXIoIk5FVzQiLCAiTkVXMiIpOworCisJCQlDb21wYXJlT3JkZXJPZldvcmtzaGVldHNBZnRlclNhdmluZyhwYWNrYWdlKTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlwdWJsaWMgdm9pZCBNb3ZlQmVmb3JlQnlQb3NpdGlvbldoZXJlV29ya1NoZWV0RXhpc3RzKCkKKwkJeworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzIiKTsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVczIik7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXNCIpOworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzUiKTsKKworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5Nb3ZlQmVmb3JlKDQsIDIpOworCisJCQlDb21wYXJlT3JkZXJPZldvcmtzaGVldHNBZnRlclNhdmluZyhwYWNrYWdlKTsKKwkJfQorCisJCVtUZXN0TWV0aG9kXQorCQlwdWJsaWMgdm9pZCBNb3ZlQWZ0ZXJCeVBvc2l0aW9uV2hlcmVXb3JrU2hlZXRFeGlzdHMoKQorCQl7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXMiIpOworCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzMiKTsKKwkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVc0Iik7CisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXNSIpOworCisJCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLk1vdmVBZnRlcig0LCAyKTsKKworCQkJQ29tcGFyZU9yZGVyT2ZXb3Jrc2hlZXRzQWZ0ZXJTYXZpbmcocGFja2FnZSk7CisJCX0KKyAgICAgICAgI3JlZ2lvbiBEZWxldGUgQ29sdW1uIHdpdGggU2F2ZSBUZXN0cworCisgICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIE91dHB1dERpcmVjdG9yeSA9IEAiZDpcdGVtcFwiOworCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVGaXJzdENvbHVtbkluUmFuZ2VDb2x1bW5TaG91bGRCZURlbGV0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdXNpbmcgKAorICAgICAgICAgICAgICAgIFN0cmVhbSBmaWxlID0KKyAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oIkVQUGx1c1Rlc3QuVGVzdFdvcmtib29rcy5QcmVEZWxldGVDb2x1bW4ueGxzIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGNrLkxvYWQoZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgd3NEYXRhID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgd3NEYXRhLkRlbGV0ZUNvbHVtbigxKTsKKyAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKE91dHB1dERpcmVjdG9yeSArICJBZnRlckRlbGV0ZUNvbHVtbi54bHN4IikpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGl0bGUiLCB3c0RhdGEuQ2VsbHNbIkExIl0uVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZpcnN0IE5hbWUiLCB3c0RhdGEuQ2VsbHNbIkIxIl0uVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZhbWlseSBOYW1lIiwgd3NEYXRhLkNlbGxzWyJDMSJdLlRleHQpOworICAgICAgICB9CisKKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlTGFzdENvbHVtbkluUmFuZ2VDb2x1bW5TaG91bGRCZURlbGV0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdXNpbmcgKAorICAgICAgICAgICAgICAgIFN0cmVhbSBmaWxlID0KKyAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oIkVQUGx1c1Rlc3QuVGVzdFdvcmtib29rcy5QcmVEZWxldGVDb2x1bW4ueGxzIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGNrLkxvYWQoZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgd3NEYXRhID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgd3NEYXRhLkRlbGV0ZUNvbHVtbig0KTsKKyAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKE91dHB1dERpcmVjdG9yeSArICJBZnRlckRlbGV0ZUNvbHVtbi54bHN4IikpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiSWQiLCB3c0RhdGEuQ2VsbHNbIkExIl0uVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRpdGxlIiwgd3NEYXRhLkNlbGxzWyJCMSJdLlRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGaXJzdCBOYW1lIiwgd3NEYXRhLkNlbGxzWyJDMSJdLlRleHQpOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUNvbHVtbkFmdGVyTm9ybWFsUmFuZ2VTaGVldFNob3VsZFJlbWFpblVuY2hhbmdlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB1c2luZyAoCisgICAgICAgICAgICAgICAgU3RyZWFtIGZpbGUgPQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiRVBQbHVzVGVzdC5UZXN0V29ya2Jvb2tzLlByZURlbGV0ZUNvbHVtbi54bHMiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2suTG9hZChmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB3c0RhdGEuRGVsZXRlQ29sdW1uKDUpOworICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oT3V0cHV0RGlyZWN0b3J5ICsgIkFmdGVyRGVsZXRlQ29sdW1uLnhsc3giKSk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJJZCIsIHdzRGF0YS5DZWxsc1siQTEiXS5UZXh0KTsKKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGl0bGUiLCB3c0RhdGEuQ2VsbHNbIkIxIl0uVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZpcnN0IE5hbWUiLCB3c0RhdGEuQ2VsbHNbIkMxIl0uVGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZhbWlseSBOYW1lIiwgd3NEYXRhLkNlbGxzWyJEMSJdLlRleHQpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW5CZWZvcmVSYW5nZU1pbWl0VGhyb3dzQXJndW1lbnRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOworICAgICAgICAgICAgdXNpbmcgKAorICAgICAgICAgICAgICAgIFN0cmVhbSBmaWxlID0KKyAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oIkVQUGx1c1Rlc3QuVGVzdFdvcmtib29rcy5QcmVEZWxldGVDb2x1bW4ueGxzIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGNrLkxvYWQoZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgd3NEYXRhID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgd3NEYXRhLkRlbGV0ZUNvbHVtbigwKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuRmFpbCgpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW5BZnRlclJhbmdlTGltaXRUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB1c2luZyAoCisgICAgICAgICAgICAgICAgU3RyZWFtIGZpbGUgPQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiRVBQbHVzVGVzdC5UZXN0V29ya2Jvb2tzLlByZURlbGV0ZUNvbHVtbi54bHMiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2suTG9hZChmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB3c0RhdGEuRGVsZXRlQ29sdW1uKDE2Mzg1KTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBBc3NlcnQuRmFpbCgpOworCisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlRmlyc3RUd29Db2x1bW5zRnJvbVJhbmdlQ29sdW1uc1Nob3VsZEJlRGVsZXRlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICB1c2luZyAoCisgICAgICAgICAgICAgICAgU3RyZWFtIGZpbGUgPQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiRVBQbHVzVGVzdC5UZXN0V29ya2Jvb2tzLlByZURlbGV0ZUNvbHVtbi54bHMiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwY2suTG9hZChmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICB3c0RhdGEuRGVsZXRlQ29sdW1uKDEsIDIpOworICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oT3V0cHV0RGlyZWN0b3J5ICsgIkFmdGVyRGVsZXRlQ29sdW1uLnhsc3giKSk7CisKKyAgICAgICAgICAgIC8vIEFzc2VydAorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGaXJzdCBOYW1lIiwgd3NEYXRhLkNlbGxzWyJBMSJdLlRleHQpOworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGYW1pbHkgTmFtZSIsIHdzRGF0YS5DZWxsc1siQjEiXS5UZXh0KTsKKworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VDbGVhck1ldGhvZFNob3VsZE5vdENsZWFyU3Vycm91bmRpbmdDZWxscygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3a3MgID0gd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKKyAgICAgICAgICAgIHdrcy5DZWxsc1syLCAyXS5WYWx1ZSA9ICJzb21ldGhpbmciOworICAgICAgICAgICAgd2tzLkNlbGxzWzIsIDNdLlZhbHVlID0gInNvbWV0aGluZyI7CisKKyAgICAgICAgICAgIHdrcy5DZWxsc1syLCAzXS5DbGVhcigpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHdrcy5DZWxsc1syLCAyXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInNvbWV0aGluZyIsIHdrcy5DZWxsc1syLCAyXS5WYWx1ZSk7CisgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHdrcy5DZWxsc1syLCAzXS5WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvbXBhcmVPcmRlck9mV29ya3NoZWV0c0FmdGVyU2F2aW5nKEV4Y2VsUGFja2FnZSBlZGl0ZWRQYWNrYWdlKQorCQl7CisJCQl2YXIgcGFja2FnZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKwkJCWVkaXRlZFBhY2thZ2UuU2F2ZUFzKHBhY2thZ2VTdHJlYW0pOworCisJCQl2YXIgbmV3UGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UocGFja2FnZVN0cmVhbSk7CisJCQl2YXIgcG9zaXRpb25JZCA9IDE7CisJCQlmb3JlYWNoICh2YXIgd29ya3NoZWV0IGluIGVkaXRlZFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cykKKwkJCXsKKwkJCQlBc3NlcnQuQXJlRXF1YWwod29ya3NoZWV0Lk5hbWUsIG5ld1BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1twb3NpdGlvbklkXS5OYW1lLCAiV29ya3NoZWV0cyBhcmUgbm90IGluIHRoZSBzYW1lIG9yZGVyIik7CisJCQkJcG9zaXRpb25JZCsrOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9wYWNrYWdlcy5jb25maWcgYi9FUFBsdXNUZXN0L3BhY2thZ2VzLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTliOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzVGVzdC9wYWNrYWdlcy5jb25maWcKQEAgLTAsMCArMSw0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHBhY2thZ2VzPgorICA8cGFja2FnZSBpZD0iUmhpbm9Nb2NrcyIgdmVyc2lvbj0iMy42LjEiIHRhcmdldEZyYW1ld29yaz0ibmV0NDAiIC8+Cis8L3BhY2thZ2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c1dlYlNhbXBsZS9EZWZhdWx0LmFzcHggYi9FUFBsdXNXZWJTYW1wbGUvRGVmYXVsdC5hc3B4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjExYmQKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNXZWJTYW1wbGUvRGVmYXVsdC5hc3B4CkBAIC0wLDAgKzEsNjggQEAKK++7vzwlQCBQYWdlIExhbmd1YWdlPSJDIyIgQXV0b0V2ZW50V2lyZXVwPSJ0cnVlIiBDb2RlQmVoaW5kPSJEZWZhdWx0LmFzcHguY3MiIEluaGVyaXRzPSJFUFBsdXNXZWJTYW1wbGUuX0RlZmF1bHQiICU+CisKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4KKzxoZWFkIHJ1bmF0PSJzZXJ2ZXIiPgorICAgIDx0aXRsZT5FUFBsdXMgV2Vic2FtcGxlPC90aXRsZT4KKyAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICBib2R5CisgICAgeworICAgICAgICBCQUNLR1JPVU5ELUNPTE9SOiNGRkZGRkY7CisgICAgICAgIENPTE9SOiAjMTExMTExOworICAgICAgICBGT05ULUZBTUlMWTogQXJpYWw7CisgICAgICAgIGZvbnQtc2l6ZTogbGFyZ2U7CisgICAgICAgIG1hcmdpbi10b3A6IDFweAorICAgIH0KKyAgICB0YWJsZQorICAgIHsKKyAgICAgICAgRk9OVC1GQU1JTFk6IEFyaWFsOworICAgICAgICBGT05ULVNJWkU6IG1lZGl1bQorICAgIH0gICAgCitBOmxpbmsge2NvbG9yOiMwMDMzOTk7fQorQTp2aXNpdGVkIHtjb2xvcjojMDAzMzk5O30KK0E6aG92ZXJ7Y29sb3I6I0NDNjY5OX0KKworICAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIDxmb3JtIGlkPSJmb3JtMSIgcnVuYXQ9InNlcnZlciI+CisgICAgPGgxPkVQUGx1cyBXZWIgc2FtcGxlczwvaDE+CisgICAgICAgIDxoMz5UaGUgd2ViIHNhbXBsZSBwcm9qZWN0IHNob3dzIGEgZmV3IGRpZmZlcmVudCB3YXlzIHRvIHNlbmQgYSB3b3JrYm9vayB0byB0aGUgY2xpZW50LiA8L2gzPgorICAgICAgICA8dGFibGU+CisgICAgICAgIDx0cj4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgPGFzcDpIeXBlckxpbmsgSUQ9InNhbXBsZTEiIHJ1bmF0PSJzZXJ2ZXIiIE5hdmlnYXRlVXJsPSJ+L0dldFNhbXBsZS5hc3B4P1NhbXBsZT0xIj5TYW1wbGUgMTwvYXNwOkh5cGVyTGluaz4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvdXRwdXQgYSBzcHJlYWRzaGVldCB1c2luZyB0aGUgU2F2ZUFzKFJlcG9uc2UuT3V0cHV0U3RlYW0pIG1ldGhvZC4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgIDxhc3A6SHlwZXJMaW5rIElEPSJzYW1wbGUyIiBydW5hdD0ic2VydmVyIiBOYXZpZ2F0ZVVybD0ifi9HZXRTYW1wbGUuYXNweD9TYW1wbGU9MiI+U2FtcGxlIDI8L2FzcDpIeXBlckxpbms+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gb3V0cHV0IGEgc3ByZWFkc2hlZXQgdXNpbmcgdGhlIFJlc3BvbnNlLkJpbmFyeVdyaXRlKHBjay5HZXRBc0J5dGVBcnJheSgpKS4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgIDxhc3A6SHlwZXJMaW5rIElEPSJzYW1wbGUzIiBydW5hdD0ic2VydmVyIiBOYXZpZ2F0ZVVybD0ifi9HZXRTYW1wbGUuYXNweD9TYW1wbGU9MyI+U2FtcGxlIDM8L2FzcDpIeXBlckxpbms+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgdGVtcGxhdGUgc3RvcmVkIGluIHRoZSBBcHBsaWNhdGlvbiBjYXNoZS4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgIDxhc3A6SHlwZXJMaW5rIElEPSJzYW1wbGU0IiBydW5hdD0ic2VydmVyIiBOYXZpZ2F0ZVVybD0ifi9HZXRTYW1wbGUuYXNweD9TYW1wbGU9NCI+U2FtcGxlIDQ8L2FzcDpIeXBlckxpbms+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgbWFjcm8tZW5hYmxlZCBzcHJlYWRzaGVldC4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L2Zvcm0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9FUFBsdXNXZWJTYW1wbGUvRGVmYXVsdC5hc3B4LmNzIGIvRVBQbHVzV2ViU2FtcGxlL0RlZmF1bHQuYXNweC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QxMGVjCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzV2ViU2FtcGxlL0RlZmF1bHQuYXNweC5jcwpAQCAtMCwwICsxLDE2IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5XZWI7Cit1c2luZyBTeXN0ZW0uV2ViLlVJOwordXNpbmcgU3lzdGVtLldlYi5VSS5XZWJDb250cm9sczsKKworbmFtZXNwYWNlIEVQUGx1c1dlYlNhbXBsZQoreworICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIF9EZWZhdWx0IDogU3lzdGVtLldlYi5VSS5QYWdlCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQYWdlX0xvYWQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL0RlZmF1bHQuYXNweC5kZXNpZ25lci5jcyBiL0VQUGx1c1dlYlNhbXBsZS9EZWZhdWx0LmFzcHguZGVzaWduZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzNjRmNgotLS0gL2Rldi9udWxsCisrKyBiL0VQUGx1c1dlYlNhbXBsZS9EZWZhdWx0LmFzcHguZGVzaWduZXIuY3MKQEAgLTAsMCArMSw2MCBAQAor77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDxhdXRvLWdlbmVyYXRlZD4KKy8vICAgICBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBhIHRvb2wuCisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLiAKKy8vIDwvYXV0by1nZW5lcmF0ZWQ+CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgRVBQbHVzV2ViU2FtcGxlIHsKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBfRGVmYXVsdCB7CisgICAgICAgIAorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBmb3JtMSBjb250cm9sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJlbWFya3M+CisgICAgICAgIC8vLyBBdXRvLWdlbmVyYXRlZCBmaWVsZC4KKyAgICAgICAgLy8vIFRvIG1vZGlmeSBtb3ZlIGZpZWxkIGRlY2xhcmF0aW9uIGZyb20gZGVzaWduZXIgZmlsZSB0byBjb2RlLWJlaGluZCBmaWxlLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBwcm90ZWN0ZWQgZ2xvYmFsOjpTeXN0ZW0uV2ViLlVJLkh0bWxDb250cm9scy5IdG1sRm9ybSBmb3JtMTsKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHNhbXBsZTEgY29udHJvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gQXV0by1nZW5lcmF0ZWQgZmllbGQuCisgICAgICAgIC8vLyBUbyBtb2RpZnkgbW92ZSBmaWVsZCBkZWNsYXJhdGlvbiBmcm9tIGRlc2lnbmVyIGZpbGUgdG8gY29kZS1iZWhpbmQgZmlsZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHJvdGVjdGVkIGdsb2JhbDo6U3lzdGVtLldlYi5VSS5XZWJDb250cm9scy5IeXBlckxpbmsgc2FtcGxlMTsKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHNhbXBsZTIgY29udHJvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gQXV0by1nZW5lcmF0ZWQgZmllbGQuCisgICAgICAgIC8vLyBUbyBtb2RpZnkgbW92ZSBmaWVsZCBkZWNsYXJhdGlvbiBmcm9tIGRlc2lnbmVyIGZpbGUgdG8gY29kZS1iZWhpbmQgZmlsZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHJvdGVjdGVkIGdsb2JhbDo6U3lzdGVtLldlYi5VSS5XZWJDb250cm9scy5IeXBlckxpbmsgc2FtcGxlMjsKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHNhbXBsZTMgY29udHJvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gQXV0by1nZW5lcmF0ZWQgZmllbGQuCisgICAgICAgIC8vLyBUbyBtb2RpZnkgbW92ZSBmaWVsZCBkZWNsYXJhdGlvbiBmcm9tIGRlc2lnbmVyIGZpbGUgdG8gY29kZS1iZWhpbmQgZmlsZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHJvdGVjdGVkIGdsb2JhbDo6U3lzdGVtLldlYi5VSS5XZWJDb250cm9scy5IeXBlckxpbmsgc2FtcGxlMzsKKyAgICAgICAgCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIHNhbXBsZTQgY29udHJvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gQXV0by1nZW5lcmF0ZWQgZmllbGQuCisgICAgICAgIC8vLyBUbyBtb2RpZnkgbW92ZSBmaWVsZCBkZWNsYXJhdGlvbiBmcm9tIGRlc2lnbmVyIGZpbGUgdG8gY29kZS1iZWhpbmQgZmlsZS4KKyAgICAgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAgICAgcHJvdGVjdGVkIGdsb2JhbDo6U3lzdGVtLldlYi5VSS5XZWJDb250cm9scy5IeXBlckxpbmsgc2FtcGxlNDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXNXZWJTYW1wbGUvRVBQbHVzV2ViU2FtcGxlLmNzcHJvaiBiL0VQUGx1c1dlYlNhbXBsZS9FUFBsdXNXZWJTYW1wbGUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTg4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNXZWJTYW1wbGUvRVBQbHVzV2ViU2FtcGxlLmNzcHJvagpAQCAtMCwwICsxLDEzMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57MUJGMzBBNTItNjE0OS00MzJELTgyRjYtNzI1MjUwRTVDNjYyfTwvUHJvamVjdEd1aWQ+CisgICAgPFByb2plY3RUeXBlR3VpZHM+ezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+RVBQbHVzV2ViU2FtcGxlPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+RVBQbHVzV2ViU2FtcGxlPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj40LjA8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDwvVXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlIC8+CisgICAgPFVzZUlJU0V4cHJlc3M+ZmFsc2U8L1VzZUlJU0V4cHJlc3M+CisgICAgPElJU0V4cHJlc3NTU0xQb3J0IC8+CisgICAgPElJU0V4cHJlc3NBbm9ueW1vdXNBdXRoZW50aWNhdGlvbj5kaXNhYmxlZDwvSUlTRXhwcmVzc0Fub255bW91c0F1dGhlbnRpY2F0aW9uPgorICAgIDxJSVNFeHByZXNzV2luZG93c0F1dGhlbnRpY2F0aW9uPmVuYWJsZWQ8L0lJU0V4cHJlc3NXaW5kb3dzQXV0aGVudGljYXRpb24+CisgICAgPElJU0V4cHJlc3NVc2VDbGFzc2ljUGlwZWxpbmVNb2RlPmZhbHNlPC9JSVNFeHByZXNzVXNlQ2xhc3NpY1BpcGVsaW5lTW9kZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmciIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5EeW5hbWljRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRW50aXR5IiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db25maWd1cmF0aW9uIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5FbnRlcnByaXNlU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLk1vYmlsZSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iRGVmYXVsdC5hc3B4IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IkdldFNhbXBsZS5hc3B4IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5jb25maWciIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlZmF1bHQuYXNweC5jcyI+CisgICAgICA8U3ViVHlwZT5BU1BYQ29kZUJlaGluZDwvU3ViVHlwZT4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkRlZmF1bHQuYXNweDwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVmYXVsdC5hc3B4LmRlc2lnbmVyLmNzIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkRlZmF1bHQuYXNweDwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2V0U2FtcGxlLmFzcHguY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+R2V0U2FtcGxlLmFzcHg8L0RlcGVuZGVudFVwb24+CisgICAgICA8U3ViVHlwZT5BU1BYQ29kZUJlaGluZDwvU3ViVHlwZT4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2V0U2FtcGxlLmFzcHguZGVzaWduZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+R2V0U2FtcGxlLmFzcHg8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IkFwcF9EYXRhXCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cRVBQbHVzXEVQUGx1cy5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezdCMjg4MDI2LTU1MDItNEEzOS1CRjQxLTc3RTA4NkYzRTRBM308L1Byb2plY3Q+CisgICAgICA8TmFtZT5FUFBsdXM8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFZpc3VhbFN0dWRpb1ZlcnNpb24gQ29uZGl0aW9uPSInJChWaXN1YWxTdHVkaW9WZXJzaW9uKScgPT0gJyciPjEwLjA8L1Zpc3VhbFN0dWRpb1ZlcnNpb24+CisgICAgPFZTVG9vbHNQYXRoIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyA9PSAnJyI+JChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2JChWaXN1YWxTdHVkaW9WZXJzaW9uKTwvVlNUb29sc1BhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2UgNC4wfEFueUNQVSciPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZTVG9vbHNQYXRoKVxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyAhPSAnJyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYxMC4wXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSJmYWxzZSIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxWaXN1YWxTdHVkaW8+CisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfSI+CisgICAgICAgIDxXZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgICAgICA8VXNlSUlTPkZhbHNlPC9Vc2VJSVM+CisgICAgICAgICAgPEF1dG9Bc3NpZ25Qb3J0PlRydWU8L0F1dG9Bc3NpZ25Qb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclBvcnQ+ODU0NDwvRGV2ZWxvcG1lbnRTZXJ2ZXJQb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclZQYXRoPi88L0RldmVsb3BtZW50U2VydmVyVlBhdGg+CisgICAgICAgICAgPElJU1VybD4KKyAgICAgICAgICA8L0lJU1VybD4KKyAgICAgICAgICA8TlRMTUF1dGhlbnRpY2F0aW9uPkZhbHNlPC9OVExNQXV0aGVudGljYXRpb24+CisgICAgICAgICAgPFVzZUN1c3RvbVNlcnZlcj5GYWxzZTwvVXNlQ3VzdG9tU2VydmVyPgorICAgICAgICAgIDxDdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPC9DdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPFNhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+RmFsc2U8L1NhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+CisgICAgICAgIDwvV2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+CisgICAgPC9WaXN1YWxTdHVkaW8+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL0dldFNhbXBsZS5hc3B4IGIvRVBQbHVzV2ViU2FtcGxlL0dldFNhbXBsZS5hc3B4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5M2FiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNXZWJTYW1wbGUvR2V0U2FtcGxlLmFzcHgKQEAgLTAsMCArMSBAQAor77u/PCVAIFBhZ2UgTGFuZ3VhZ2U9IkMjIiBBdXRvRXZlbnRXaXJldXA9InRydWUiIENvZGVCZWhpbmQ9IkdldFNhbXBsZS5hc3B4LmNzIiBJbmhlcml0cz0iRVBQbHVzV2ViU2FtcGxlLkdldFNhbXBsZSIgJT4KZGlmZiAtLWdpdCBhL0VQUGx1c1dlYlNhbXBsZS9HZXRTYW1wbGUuYXNweC5jcyBiL0VQUGx1c1dlYlNhbXBsZS9HZXRTYW1wbGUuYXNweC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY2ZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzV2ViU2FtcGxlL0dldFNhbXBsZS5hc3B4LmNzCkBAIC0wLDAgKzEsMTY4IEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogU2VlIGh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tLyBmb3IgZGV0YWlscworICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIzLU1BUi0yMDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLldlYjsKK3VzaW5nIFN5c3RlbS5XZWIuVUk7Cit1c2luZyBTeXN0ZW0uV2ViLlVJLldlYkNvbnRyb2xzOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5UZXh0OworbmFtZXNwYWNlIEVQUGx1c1dlYlNhbXBsZQoreworICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEdldFNhbXBsZSA6IFN5c3RlbS5XZWIuVUkuUGFnZQorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUGFnZV9Mb2FkKG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKFJlcXVlc3QuUXVlcnlTdHJpbmdbIlNhbXBsZSJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIjEiOgorICAgICAgICAgICAgICAgICAgICBTYW1wbGUxKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIjIiOgorICAgICAgICAgICAgICAgICAgICBTYW1wbGUyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIjMiOgorICAgICAgICAgICAgICAgICAgICBTYW1wbGUzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIjQiOgorICAgICAgICAgICAgICAgICAgICBTYW1wbGU0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLldyaXRlKCI8c2NyaXB0PmphdmFzY3JpcHQ6YWxlcnQoJ0ludmFsaWQgcXVlcnlzdHJpbmcnKTs8L3NjcmlwdD4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhbXBsZSAxIAorICAgICAgICAvLy8gRGVtb25zdHJhdGVzIHRoZSBTYXZlQXMgbWV0aG9kCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBTYW1wbGUxKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2FtcGxlMSIpOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJTYW1wbGUgMSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgdmFyIHNoYXBlID0gd3MuRHJhd2luZ3MuQWRkU2hhcGUoIlNoYXBlMSIsIGVTaGFwZVN0eWxlLlJlY3QpOworICAgICAgICAgICAgc2hhcGUuU2V0UG9zaXRpb24oNTAsIDIwMCk7CisgICAgICAgICAgICBzaGFwZS5TZXRTaXplKDIwMCwgMTAwKTsKKyAgICAgICAgICAgIHNoYXBlLlRleHQgPSAiU2FtcGxlIDEgc2F2ZXMgdG8gdGhlIFJlc3BvbnNlLk91dHB1dFN0cmVhbSI7CisKKyAgICAgICAgICAgIHBjay5TYXZlQXMoUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IjsKKyAgICAgICAgICAgIFJlc3BvbnNlLkFkZEhlYWRlcigiY29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyAgZmlsZW5hbWU9U2FtcGxlMS54bHN4Iik7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2FtcGxlIDIKKyAgICAgICAgLy8vIERlbW9uc3RyYXRlcyB0aGUgR2V0QXNCeXRlQXJyYXkgbWV0aG9kCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBTYW1wbGUyKCkKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2FtcGxlMiIpOworCisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJTYW1wbGUgMiI7CisgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgdmFyIHNoYXBlID0gd3MuRHJhd2luZ3MuQWRkU2hhcGUoIlNoYXBlMSIsIGVTaGFwZVN0eWxlLlJlY3QpOworICAgICAgICAgICAgc2hhcGUuU2V0UG9zaXRpb24oNTAsIDIwMCk7CisgICAgICAgICAgICBzaGFwZS5TZXRTaXplKDIwMCwgMTAwKTsKKyAgICAgICAgICAgIHNoYXBlLlRleHQgPSAiU2FtcGxlIDIgb3V0cHV0cyB0aGUgc2hlZXQgdXNpbmcgdGhlIFJlc3BvbnNlLkJpbmFyeVdyaXRlIG1ldGhvZCI7CisKKyAgICAgICAgICAgIFJlc3BvbnNlLkJpbmFyeVdyaXRlKHBjay5HZXRBc0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IjsKKyAgICAgICAgICAgIFJlc3BvbnNlLkFkZEhlYWRlcigiY29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyAgZmlsZW5hbWU9U2FtcGxlMi54bHN4Iik7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2FtcGxlIDMKKyAgICAgICAgLy8vIFVzZXMgYSBjYWNoZWQgdGVtcGxhdGUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNhbXBsZTMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQXBwbGljYXRpb25bIlNhbXBsZTNUZW1wbGF0ZSJdID09IG51bGwpIC8vQ2hlY2sgaWYgdGhlIHRlbXBsYXRlIGlzIGxvYWRlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vSGVyZSB3ZSBjcmVhdGUgdGhlIHRlbXBsYXRlLiAKKyAgICAgICAgICAgICAgICAvL0FzIGFuIGFsdGVybmF0aXZlIHRoZSB0ZW1wbGF0ZSBjb3VsZCBiZSBsb2FkZWQgZnJvbSBkaXNrIG9yIGZyb20gYSByZXNvdXJjZS4KKyAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrVGVtcGxhdGUgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisgICAgICAgICAgICAgICAgdmFyIHdzVGVtcGxhdGUgPSBwY2tUZW1wbGF0ZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2FtcGxlMyIpOworCisgICAgICAgICAgICAgICAgd3NUZW1wbGF0ZS5DZWxsc1siQTEiXS5WYWx1ZSA9ICJTYW1wbGUgMyI7CisgICAgICAgICAgICAgICAgd3NUZW1wbGF0ZS5DZWxsc1siQTEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgICAgIHZhciBzaGFwZSA9IHdzVGVtcGxhdGUuRHJhd2luZ3MuQWRkU2hhcGUoIlNoYXBlMSIsIGVTaGFwZVN0eWxlLlJlY3QpOworICAgICAgICAgICAgICAgIHNoYXBlLlNldFBvc2l0aW9uKDUwLCAyMDApOworICAgICAgICAgICAgICAgIHNoYXBlLlNldFNpemUoMjAwLCAxMDApOworICAgICAgICAgICAgICAgIHNoYXBlLlRleHQgPSAiU2FtcGxlIDMgdXNlcyBhIHRlbXBsYXRlIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBjYXNoZS4iOworICAgICAgICAgICAgICAgIHBja1RlbXBsYXRlLlNhdmUoKTsKKworICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uWyJTYW1wbGUzVGVtcGxhdGUiXSA9IHBja1RlbXBsYXRlLlN0cmVhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9PcGVuIHRoZSBuZXcgcGFja2FnZSB3aXRoIHRoZSB0ZW1wbGF0ZSBzdHJlYW0uCisgICAgICAgICAgICAvL1RoZSB0ZW1wbGF0ZSBzdHJlYW0gaXMgY29waWVkIHRvIHRoZSBuZXcgc3RyZWFtIGluIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpLCBBcHBsaWNhdGlvblsiU2FtcGxlM1RlbXBsYXRlIl0gYXMgU3RyZWFtKTsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgaW50IHJvdyA9IG5ldyBSYW5kb20oKS5OZXh0KDEwKSArIDEwOyAgIC8vUGljayBhIHJhbmRvbSByb3cgdG8gcHJpbnQgdGhlIHRleHQKKyAgICAgICAgICAgIHdzLkNlbGxzW3JvdywxXS5WYWx1ZSA9ICJXZSBtYWtlIGEgc21hbGwgY2hhbmdlIGhlcmUsIGFmdGVyIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiBsb2FkZWQuLi4iOworICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAxLCByb3csIDVdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMSwgcm93LCA1XS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdvbGRlbnJvZFllbGxvdyk7CisKKyAgICAgICAgICAgIFJlc3BvbnNlLkJpbmFyeVdyaXRlKHBjay5HZXRBc0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IjsKKyAgICAgICAgICAgIFJlc3BvbnNlLkFkZEhlYWRlcigiY29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyAgZmlsZW5hbWU9U2FtcGxlMy54bHN4Iik7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNhbXBsZTQoKQorICAgICAgICB7CisgICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKworICAgICAgICAgICAgLy9BZGQgYSB3b3Jrc2hlZXQuCisgICAgICAgICAgICB2YXIgd3M9cGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJWQkEgU2FtcGxlIik7CisgICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRTaGFwZSgiVkJBU2FtcGxlUmVjdCIsIGVTaGFwZVN0eWxlLlJvdW5kUmVjdCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQ3JlYXRlIGEgdmJhIHByb2plY3QgICAgICAgICAgICAgCisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworCisgICAgICAgICAgICAvL05vdyBhZGQgc29tZSBjb2RlIHRoYXQgY3JlYXRlcyBhIGJ1YmJsZSBjaGFydC4uLgorICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiUHJpdmF0ZSBTdWIgV29ya2Jvb2tfT3BlbigpIik7CisgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCIgICAgW1ZCQSBTYW1wbGVdLlNoYXBlcyhcIlZCQVNhbXBsZVJlY3RcIikuVGV4dEVmZmVjdC5UZXh0ID0gXCJUaGlzIHRleHQgaXMgc2V0IGZyb20gVkJBIVwiIik7CisgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJFbmQgU3ViIik7CisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ29kZU1vZHVsZS5Db2RlID0gc2IuVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgUmVzcG9uc2UuQmluYXJ5V3JpdGUocGNrLkdldEFzQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgUmVzcG9uc2UuQ29udGVudFR5cGUgPSAiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvRW5hYmxlZC4xMiI7ICAgICAgICAgICAgLy8ueGxzbSBmaWxlcyB1c2VzIGEgZGlmZmVyZW50IGNvbnRlbnR0eXBlIHRoYW4gLnhsc3gKKyAgICAgICAgICAgIFJlc3BvbnNlLkFkZEhlYWRlcigiY29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyAgZmlsZW5hbWU9U2FtcGxlNC54bHNtIik7CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL0dldFNhbXBsZS5hc3B4LmRlc2lnbmVyLmNzIGIvRVBQbHVzV2ViU2FtcGxlL0dldFNhbXBsZS5hc3B4LmRlc2lnbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Zjk4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNXZWJTYW1wbGUvR2V0U2FtcGxlLmFzcHguZGVzaWduZXIuY3MKQEAgLTAsMCArMSwxNiBAQAor77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDxhdXRvLWdlbmVyYXRlZD4KKy8vICAgICBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBhIHRvb2wuCisvLyAgICAgUnVudGltZSBWZXJzaW9uOjIuMC41MDcyNy40OTI3CisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLgorLy8gPC9hdXRvLWdlbmVyYXRlZD4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBFUFBsdXNXZWJTYW1wbGUgeworICAgIAorICAgIAorICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEdldFNhbXBsZSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvRVBQbHVzV2ViU2FtcGxlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMmM1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9FUFBsdXNXZWJTYW1wbGUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzNSBAQAor77u/dXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRVBQbHVzV2ViU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIk1pY3Jvc29mdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkVQUGx1c1dlYlNhbXBsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIEphbiBLw6RsbG1hbiAyMDEwIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCIzZDU5MDBhZS0xMTFhLTQ1YmUtOTZiMy1kOWU0NjA2Y2E3OTMiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbiAKKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL1dlYi5jb25maWcgYi9FUFBsdXNXZWJTYW1wbGUvV2ViLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQxZmRiCi0tLSAvZGV2L251bGwKKysrIGIvRVBQbHVzV2ViU2FtcGxlL1dlYi5jb25maWcKQEAgLTAsMCArMSwxMDcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGNvbmZpZ3VyYXRpb24+CisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbkdyb3VwIG5hbWU9InN5c3RlbS53ZWIuZXh0ZW5zaW9ucyIgdHlwZT0iU3lzdGVtLldlYi5Db25maWd1cmF0aW9uLlN5c3RlbVdlYkV4dGVuc2lvbnNTZWN0aW9uR3JvdXAsIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiPgorICAgICAgPHNlY3Rpb25Hcm91cCBuYW1lPSJzY3JpcHRpbmciIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TY3JpcHRpbmdTZWN0aW9uR3JvdXAsIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiPgorICAgICAgICA8c2VjdGlvbiBuYW1lPSJzY3JpcHRSZXNvdXJjZUhhbmRsZXIiIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TY3JpcHRpbmdTY3JpcHRSZXNvdXJjZUhhbmRsZXJTZWN0aW9uLCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIGFsbG93RGVmaW5pdGlvbj0iTWFjaGluZVRvQXBwbGljYXRpb24iLz4KKyAgICAgICAgPHNlY3Rpb25Hcm91cCBuYW1lPSJ3ZWJTZXJ2aWNlcyIgdHlwZT0iU3lzdGVtLldlYi5Db25maWd1cmF0aW9uLlNjcmlwdGluZ1dlYlNlcnZpY2VzU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ij4KKyAgICAgICAgICA8c2VjdGlvbiBuYW1lPSJqc29uU2VyaWFsaXphdGlvbiIgdHlwZT0iU3lzdGVtLldlYi5Db25maWd1cmF0aW9uLlNjcmlwdGluZ0pzb25TZXJpYWxpemF0aW9uU2VjdGlvbiwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiBhbGxvd0RlZmluaXRpb249IkV2ZXJ5d2hlcmUiLz4KKyAgICAgICAgICA8c2VjdGlvbiBuYW1lPSJwcm9maWxlU2VydmljZSIgdHlwZT0iU3lzdGVtLldlYi5Db25maWd1cmF0aW9uLlNjcmlwdGluZ1Byb2ZpbGVTZXJ2aWNlU2VjdGlvbiwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiBhbGxvd0RlZmluaXRpb249Ik1hY2hpbmVUb0FwcGxpY2F0aW9uIi8+CisgICAgICAgICAgPHNlY3Rpb24gbmFtZT0iYXV0aGVudGljYXRpb25TZXJ2aWNlIiB0eXBlPSJTeXN0ZW0uV2ViLkNvbmZpZ3VyYXRpb24uU2NyaXB0aW5nQXV0aGVudGljYXRpb25TZXJ2aWNlU2VjdGlvbiwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiBhbGxvd0RlZmluaXRpb249Ik1hY2hpbmVUb0FwcGxpY2F0aW9uIi8+CisgICAgICAgICAgPHNlY3Rpb24gbmFtZT0icm9sZVNlcnZpY2UiIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TY3JpcHRpbmdSb2xlU2VydmljZVNlY3Rpb24sIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgYWxsb3dEZWZpbml0aW9uPSJNYWNoaW5lVG9BcHBsaWNhdGlvbiIvPgorICAgICAgICA8L3NlY3Rpb25Hcm91cD4KKyAgICAgIDwvc2VjdGlvbkdyb3VwPgorICAgIDwvc2VjdGlvbkdyb3VwPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorICA8YXBwU2V0dGluZ3MvPgorICA8Y29ubmVjdGlvblN0cmluZ3MvPgorICA8c3lzdGVtLndlYj4KKyAgICA8IS0tIAorICAgICAgICAgICAgU2V0IGNvbXBpbGF0aW9uIGRlYnVnPSJ0cnVlIiB0byBpbnNlcnQgZGVidWdnaW5nIAorICAgICAgICAgICAgc3ltYm9scyBpbnRvIHRoZSBjb21waWxlZCBwYWdlLiBCZWNhdXNlIHRoaXMgCisgICAgICAgICAgICBhZmZlY3RzIHBlcmZvcm1hbmNlLCBzZXQgdGhpcyB2YWx1ZSB0byB0cnVlIG9ubHkgCisgICAgICAgICAgICBkdXJpbmcgZGV2ZWxvcG1lbnQuCisgICAgICAgIC0tPgorICAgIDxjb21waWxhdGlvbiBkZWJ1Zz0idHJ1ZSI+CisgICAgICA8YXNzZW1ibGllcz4KKyAgICAgICAgPGFkZCBhc3NlbWJseT0iU3lzdGVtLkNvcmUsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1CNzdBNUM1NjE5MzRFMDg5Ii8+CisgICAgICAgIDxhZGQgYXNzZW1ibHk9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KKyAgICAgICAgPGFkZCBhc3NlbWJseT0iU3lzdGVtLlhtbC5MaW5xLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Qjc3QTVDNTYxOTM0RTA4OSIvPgorICAgICAgICA8YWRkIGFzc2VtYmx5PSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPUI3N0E1QzU2MTkzNEUwODkiLz4KKyAgICAgIDwvYXNzZW1ibGllcz4KKyAgICA8L2NvbXBpbGF0aW9uPgorICAgIDwhLS0KKyAgICAgICAgICAgIFRoZSA8YXV0aGVudGljYXRpb24+IHNlY3Rpb24gZW5hYmxlcyBjb25maWd1cmF0aW9uIAorICAgICAgICAgICAgb2YgdGhlIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1vZGUgdXNlZCBieSAKKyAgICAgICAgICAgIEFTUC5ORVQgdG8gaWRlbnRpZnkgYW4gaW5jb21pbmcgdXNlci4gCisgICAgICAgIC0tPgorICAgIDxhdXRoZW50aWNhdGlvbiBtb2RlPSJXaW5kb3dzIi8+CisgICAgPCEtLQorICAgICAgICAgICAgVGhlIDxjdXN0b21FcnJvcnM+IHNlY3Rpb24gZW5hYmxlcyBjb25maWd1cmF0aW9uIAorICAgICAgICAgICAgb2Ygd2hhdCB0byBkbyBpZi93aGVuIGFuIHVuaGFuZGxlZCBlcnJvciBvY2N1cnMgCisgICAgICAgICAgICBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhIHJlcXVlc3QuIFNwZWNpZmljYWxseSwgCisgICAgICAgICAgICBpdCBlbmFibGVzIGRldmVsb3BlcnMgdG8gY29uZmlndXJlIGh0bWwgZXJyb3IgcGFnZXMgCisgICAgICAgICAgICB0byBiZSBkaXNwbGF5ZWQgaW4gcGxhY2Ugb2YgYSBlcnJvciBzdGFjayB0cmFjZS4KKworICAgICAgICA8Y3VzdG9tRXJyb3JzIG1vZGU9IlJlbW90ZU9ubHkiIGRlZmF1bHRSZWRpcmVjdD0iR2VuZXJpY0Vycm9yUGFnZS5odG0iPgorICAgICAgICAgICAgPGVycm9yIHN0YXR1c0NvZGU9IjQwMyIgcmVkaXJlY3Q9Ik5vQWNjZXNzLmh0bSIgLz4KKyAgICAgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI0MDQiIHJlZGlyZWN0PSJGaWxlTm90Rm91bmQuaHRtIiAvPgorICAgICAgICA8L2N1c3RvbUVycm9ycz4KKyAgICAgICAgLS0+CisgICAgPHBhZ2VzPgorICAgICAgPGNvbnRyb2xzPgorICAgICAgICA8YWRkIHRhZ1ByZWZpeD0iYXNwIiBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuVUkiIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+CisgICAgICAgIDxhZGQgdGFnUHJlZml4PSJhc3AiIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5VSS5XZWJDb250cm9scyIgYXNzZW1ibHk9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KKyAgICAgIDwvY29udHJvbHM+CisgICAgPC9wYWdlcz4KKyAgICA8aHR0cEhhbmRsZXJzPgorICAgICAgPHJlbW92ZSB2ZXJiPSIqIiBwYXRoPSIqLmFzbXgiLz4KKyAgICAgIDxhZGQgdmVyYj0iKiIgcGF0aD0iKi5hc214IiB2YWxpZGF0ZT0iZmFsc2UiIHR5cGU9IlN5c3RlbS5XZWIuU2NyaXB0LlNlcnZpY2VzLlNjcmlwdEhhbmRsZXJGYWN0b3J5LCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+CisgICAgICA8YWRkIHZlcmI9IioiIHBhdGg9IipfQXBwU2VydmljZS5heGQiIHZhbGlkYXRlPSJmYWxzZSIgdHlwZT0iU3lzdGVtLldlYi5TY3JpcHQuU2VydmljZXMuU2NyaXB0SGFuZGxlckZhY3RvcnksIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KKyAgICAgIDxhZGQgdmVyYj0iR0VULEhFQUQiIHBhdGg9IlNjcmlwdFJlc291cmNlLmF4ZCIgdmFsaWRhdGU9ImZhbHNlIiB0eXBlPSJTeXN0ZW0uV2ViLkhhbmRsZXJzLlNjcmlwdFJlc291cmNlSGFuZGxlciwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgorICAgIDwvaHR0cEhhbmRsZXJzPgorICAgIDxodHRwTW9kdWxlcz4KKyAgICAgIDxhZGQgbmFtZT0iU2NyaXB0TW9kdWxlIiB0eXBlPSJTeXN0ZW0uV2ViLkhhbmRsZXJzLlNjcmlwdE1vZHVsZSwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgorICAgIDwvaHR0cE1vZHVsZXM+CisgIDwvc3lzdGVtLndlYj4KKyAgPCEtLSAKKyAgICAgICAgVGhlIHN5c3RlbS53ZWJTZXJ2ZXIgc2VjdGlvbiBpcyByZXF1aXJlZCBmb3IgcnVubmluZyBBU1AuTkVUIEFKQVggdW5kZXIgSW50ZXJuZXQKKyAgICAgICAgSW5mb3JtYXRpb24gU2VydmljZXMgNy4wLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgcHJldmlvdXMgdmVyc2lvbiBvZiBJSVMuCisgICAgLS0+CisgIDxzeXN0ZW0uY29kZWRvbT4KKyAgICAgIDxjb21waWxlcnM+CisgICAgICAgIDxjb21waWxlciBsYW5ndWFnZT0iYyM7Y3M7Y3NoYXJwIiBleHRlbnNpb249Ii5jcyIgdHlwZT0iTWljcm9zb2Z0LkNTaGFycC5DU2hhcnBDb2RlUHJvdmlkZXIsIFN5c3RlbSwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkiIHdhcm5pbmdMZXZlbD0iNCI+CisgICAgICAgICAgPHByb3ZpZGVyT3B0aW9uIG5hbWU9IkNvbXBpbGVyVmVyc2lvbiIgdmFsdWU9InYzLjUiLz4KKyAgICAgICAgICA8cHJvdmlkZXJPcHRpb24gbmFtZT0iV2FybkFzRXJyb3IiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC9jb21waWxlcj4KKyAgICA8L2NvbXBpbGVycz4KKyAgPC9zeXN0ZW0uY29kZWRvbT4KKyAgPHN5c3RlbS53ZWJTZXJ2ZXI+CisgICAgICA8dmFsaWRhdGlvbiB2YWxpZGF0ZUludGVncmF0ZWRNb2RlQ29uZmlndXJhdGlvbj0iZmFsc2UiLz4KKyAgICA8bW9kdWxlcz4KKyAgICAgIDxyZW1vdmUgbmFtZT0iU2NyaXB0TW9kdWxlIi8+CisgICAgICA8YWRkIG5hbWU9IlNjcmlwdE1vZHVsZSIgcHJlQ29uZGl0aW9uPSJtYW5hZ2VkSGFuZGxlciIgdHlwZT0iU3lzdGVtLldlYi5IYW5kbGVycy5TY3JpcHRNb2R1bGUsIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KKyAgICA8L21vZHVsZXM+CisgICAgPGhhbmRsZXJzPgorICAgICAgPHJlbW92ZSBuYW1lPSJXZWJTZXJ2aWNlSGFuZGxlckZhY3RvcnktSW50ZWdyYXRlZCIvPgorICAgICAgPHJlbW92ZSBuYW1lPSJTY3JpcHRIYW5kbGVyRmFjdG9yeSIvPgorICAgICAgPHJlbW92ZSBuYW1lPSJTY3JpcHRIYW5kbGVyRmFjdG9yeUFwcFNlcnZpY2VzIi8+CisgICAgICA8cmVtb3ZlIG5hbWU9IlNjcmlwdFJlc291cmNlIi8+CisgICAgICA8YWRkIG5hbWU9IlNjcmlwdEhhbmRsZXJGYWN0b3J5IiB2ZXJiPSIqIiBwYXRoPSIqLmFzbXgiIHByZUNvbmRpdGlvbj0iaW50ZWdyYXRlZE1vZGUiIHR5cGU9IlN5c3RlbS5XZWIuU2NyaXB0LlNlcnZpY2VzLlNjcmlwdEhhbmRsZXJGYWN0b3J5LCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+CisgICAgICA8YWRkIG5hbWU9IlNjcmlwdEhhbmRsZXJGYWN0b3J5QXBwU2VydmljZXMiIHZlcmI9IioiIHBhdGg9IipfQXBwU2VydmljZS5heGQiIHByZUNvbmRpdGlvbj0iaW50ZWdyYXRlZE1vZGUiIHR5cGU9IlN5c3RlbS5XZWIuU2NyaXB0LlNlcnZpY2VzLlNjcmlwdEhhbmRsZXJGYWN0b3J5LCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+CisgICAgICA8YWRkIG5hbWU9IlNjcmlwdFJlc291cmNlIiB2ZXJiPSJHRVQsSEVBRCIgcGF0aD0iU2NyaXB0UmVzb3VyY2UuYXhkIiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLkhhbmRsZXJzLlNjcmlwdFJlc291cmNlSGFuZGxlciwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKyAgPHJ1bnRpbWU+CisgICAgPGFzc2VtYmx5QmluZGluZyBhcHBsaWVzVG89InYyLjAuNTA3MjciIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSI+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTEuMS4wLjAiIG5ld1ZlcnNpb249IjMuNS4wLjAiLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucy5EZXNpZ24iIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1Ii8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0xLjEuMC4wIiBuZXdWZXJzaW9uPSIzLjUuMC4wIi8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgIDwvYXNzZW1ibHlCaW5kaW5nPgorICA8L3J1bnRpbWU+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRXhjZWxQYWNrYWdlLnZzbWRpIGIvRXhjZWxQYWNrYWdlLnZzbWRpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZDJjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9FeGNlbFBhY2thZ2UudnNtZGkKQEAgLTAsMCArMSw2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFRlc3RMaXN0cyB4bWxucz0iaHR0cDovL21pY3Jvc29mdC5jb20vc2NoZW1hcy9WaXN1YWxTdHVkaW8vVGVhbVRlc3QvMjAxMCI+CisgIDxUZXN0TGlzdCBuYW1lPSJMaXN0cyBvZiBUZXN0cyIgaWQ9IjhjNDMxMDZiLTlkYzEtNDkwNy1hMjlmLWFhNjZhNjFiZjViNiI+CisgICAgPFJ1bkNvbmZpZ3VyYXRpb24gaWQ9ImRkZTU5ZjJjLTgwZDQtNDhlYS1iNmZmLTJjZjYwNTVmMzE2MiIgbmFtZT0iTG9jYWwgVGVzdCBSdW4iIHN0b3JhZ2U9ImxvY2FsdGVzdHJ1bi50ZXN0cnVuY29uZmlnIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Db21tb24uVGVzdFJ1bkNvbmZpZ3VyYXRpb24sIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLkNvbW1vbiwgVmVyc2lvbj0xMC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgorICA8L1Rlc3RMaXN0PgorPC9UZXN0TGlzdHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODg2OAotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSwzODkgQEAKK0dOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKK1ZlcnNpb24gMiwgSnVuZSAxOTkxCisKK0NvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKK29mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcworbnVtYmVyZWQgMiBiZWNhdXNlIGl0IGdvZXMgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIG9yZGluYXJ5IEdQTC5dCitQcmVhbWJsZQorVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlCithbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8KK2d1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlCitzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCitUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZSBzcGVjaWFsbHkKK2Rlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55IG90aGVyIGxpYnJhcmllcyB3aG9zZQorYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiBZb3UgY2FuIHVzZSBpdCBmb3IgeW91ciBsaWJyYXJpZXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20gdG8KK2Rpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksCit0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UKK3RoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UKK2NhbiBkbyB0aGVzZSB0aGluZ3MuCisKK1RvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvIGRlbnkKK3lvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UgcmVzdHJpY3Rpb25zCit0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMgb3IgZm9yIGEKK2ZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUgeW91LiBZb3UgbXVzdAorbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBJZiB5b3UgbGluayBhCitwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUgY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZQorcmVjaXBpZW50cyBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtIHdpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzCit0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcgaXQuIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleQora25vdyB0aGVpciByaWdodHMuCisKK091ciBtZXRob2Qgb2YgcHJvdGVjdGluZyB5b3VyIHJpZ2h0cyBoYXMgdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBsaWJyYXJ5LAorYW5kICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKK0Fsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCBldmVyeW9uZQordW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIGxpYnJhcnkuIElmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQKK3doYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwgdmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieQorb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiBXZSB3aXNoCit0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlIHNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5CitvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdCB0cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgc29mdHdhcmUuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudAorbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCitNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gVGhpcyBsaWNlbnNlLAordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkCitsaWJyYXJpZXMuIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgb25lOyBiZSBzdXJlIHRvCityZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcyB0aGUgc2FtZSBhcyBpbiB0aGUKK29yZGluYXJ5IGxpY2Vuc2UuCisKK1RoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0IHRoZXkKK2JsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYSBwcm9ncmFtCithbmQgc2ltcGx5IHVzaW5nIGl0LiBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dCBjaGFuZ2luZyB0aGUKK2xpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMgYW5hbG9nb3VzIHRvIHJ1bm5pbmcKK2EgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uIEhvd2V2ZXIsIGluIGEgdGV4dHVhbCBhbmQgbGVnYWwKK3NlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsCitsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdHJlYXRzIGl0IGFzIHN1Y2guCisKK0JlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUgc2hhcmluZywgYmVjYXVzZSBtb3N0CitkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuIFdlIGNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0Citwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgorCitIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZSB1c2VycyBvZgordGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlIGxpYnJhcmllcyB0aGVtc2VsdmVzLgorVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gcGVybWl0IGRldmVsb3BlcnMgb2YKK25vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUgcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYQordXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZSBsaWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluCit0aGVtLiAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZSB0aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsCitidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzIGNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlCitMaWJyYXJ5LikgVGhlIGhvcGUgaXMgdGhhdCB0aGlzIHdpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZQorbGlicmFyaWVzLgorCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24KK2ZvbGxvdy4gUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgIndvcmsgYmFzZWQgb24gdGhlCitsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiBUaGUgZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZAorZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5IHdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCisKK05vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCisKK1RFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoIGNvbnRhaW5zIGEKK25vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5CitiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28KK2NhbGxlZCAidGhpcyBMaWNlbnNlIikuIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhIHByZXBhcmVkIHNvIGFzCit0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMgKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlCitmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKK1RoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrIHdoaWNoIGhhcworYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gQSAid29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSIgbWVhbnMgZWl0aGVyCit0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsKK2NvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aAorbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBzdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuCisoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybQorIm1vZGlmaWNhdGlvbiIuKQorCisiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcKK21vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlCitjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbgorZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlCitsaWJyYXJ5LgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdCBjb3ZlcmVkIGJ5Cit0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nCit0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tIHN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seQoraWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlCitvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yIHdyaXRpbmcgaXQpLiBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQKK3RoZSBMaWJyYXJ5IGRvZXMgYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisKKzEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncyBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kCitkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UKK2FuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhlIExpYnJhcnkuCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgbWF5CithdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbiBvZiBpdCwgdGh1cworZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucworb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mCit0aGVzZSBjb25kaXRpb25zOgorCithKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCitiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0Cit5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCitjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbAordGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhIHRhYmxlIG9mCitkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBmYWNpbGl0eSwgb3RoZXIKK3RoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5IGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhCitnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseQorc3VjaCBmdW5jdGlvbiBvciB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydAorb2YgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMgYSBwdXJwb3NlCit0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUgYXBwbGljYXRpb24uIFRoZXJlZm9yZSwKK1N1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieQordGhpcyBmdW5jdGlvbiBtdXN0IGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUKK3NxdWFyZSByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gSWYgaWRlbnRpZmlhYmxlCitzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksIGFuZCBjYW4gYmUgcmVhc29uYWJseQorY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZAoraXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2Ugc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlCit3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEKK3dvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zCitvZiB0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUKK3dob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QgeW91cgorcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0byBleGVyY2lzZSB0aGUKK3JpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24KK3RoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5IHdpdGggdGhlCitMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yCitkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZSBzY29wZSBvZiB0aGlzCitMaWNlbnNlLgorCiszLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuIFRvIGRvIHRoaXMsIHlvdSBtdXN0CithbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvIHRoYXQgdGhleSByZWZlciB0byB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAoSWYKK2EgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzCithcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkgdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSBEbyBub3QgbWFrZQorYW55IG90aGVyIGNoYW5nZSBpbiB0aGVzZSBub3RpY2VzLgorCitPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yIHRoYXQgY29weSwgc28KK3RoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbCBzdWJzZXF1ZW50IGNvcGllcyBhbmQKK2Rlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mIHRoZSBMaWJyYXJ5CitpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCisKKzQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yIGRlcml2YXRpdmUgb2YgaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKzEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKK21hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCitJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weSBmcm9tIGEKK2Rlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbQordGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0byBkaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbgordGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdAorY29kZS4KKworNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUgTGlicmFyeSwgYnV0IGlzCitkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IgbGlua2VkIHdpdGggaXQsIGlzCitjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiBTdWNoIGEgd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQgdGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMKK0xpY2Vuc2UuCisKK0hvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgY3JlYXRlcyBhbgorZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdCBjb250YWlucyBwb3J0aW9ucyBvZgordGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuIFRoZSBleGVjdXRhYmxlIGlzCit0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuIFNlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZgorc3VjaCBleGVjdXRhYmxlcy4KKworV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUgdGhhdCBpcworcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYSBkZXJpdmF0aXZlIHdvcmsgb2YKK3RoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuIFdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzCitlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZSBsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlCit3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuIFRoZSB0aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5CitkZWZpbmVkIGJ5IGxhdy4KKworSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEgc3RydWN0dXJlIGxheW91dHMKK2FuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZSBmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzCitpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdCBmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZgord2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZSB3b3JrLiAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdAorY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQorCitPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heSBkaXN0cmlidXRlIHRoZQorb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuIEFueSBleGVjdXRhYmxlcworY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwgd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkCitkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKworNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IgbGluayBhICJ3b3JrCit0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhIHdvcmsgY29udGFpbmluZyBwb3J0aW9ucworb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yayB1bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQKK3RoYXQgdGhlIHRlcm1zIHBlcm1pdCBtb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kCityZXZlcnNlIGVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgorCitZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUgTGlicmFyeSBpcwordXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuIFlvdQorbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gSWYgdGhlIHdvcmsgZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cworY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nCit0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIGRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuCitBbHNvLCB5b3UgbXVzdCBkbyBvbmUgb2YgdGhlc2UgdGhpbmdzOgorCithKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZQorY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbgorZXhlY3V0YWJsZSBsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yawordGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZSB1c2VyIGNhbgorbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQgZXhlY3V0YWJsZSBjb250YWluaW5nCit0aGUgbW9kaWZpZWQgTGlicmFyeS4gKEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMKK29mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZSBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlCit0aGUgYXBwbGljYXRpb24gdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCitiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgdG8KK2dpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEKK2NoYXJnZSBubyBtb3JlIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KK2MpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5IGZyb20gYQorZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUgc3BlY2lmaWVkIG1hdGVyaWFscworZnJvbSB0aGUgc2FtZSBwbGFjZS4KK2QpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZSBtYXRlcmlhbHMgb3IgdGhhdAoreW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCitGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgbXVzdAoraW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yIHJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlCitmcm9tIGl0LiBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QKK2luY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkKK3dpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0KK29uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMgdGhlCitleGVjdXRhYmxlLgorCitJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZSByZXN0cmljdGlvbnMgb2YKK290aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseSBhY2NvbXBhbnkgdGhlIG9wZXJhdGluZworc3lzdGVtLiBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90IHVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5Cit0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91IGRpc3RyaWJ1dGUuCisKKzcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeQorc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkIGxpYnJhcnksIHByb3ZpZGVkIHRoYXQKK3RoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlcgorbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZSBwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28KK3RoaW5nczoKKworYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcy4gVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhlIFNlY3Rpb25zIGFib3ZlLgorYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QgdGhhdCBwYXJ0IG9mIGl0CitpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZwordW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCis4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LAorbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwKK2F1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcyB3aG8KK2hhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlCit0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKzkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdCBzaWduZWQgaXQuCitIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5CitvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdAorYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvcgorYW55IHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0bworZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSksCit0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29yIHRvCitjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5IHN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kCitjb25kaXRpb25zLiBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJworZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4gWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZworY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4KKworMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksIGNvbmRpdGlvbnMKK2FyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yIG90aGVyd2lzZSkgdGhhdAorY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90IGV4Y3VzZSB5b3UgZnJvbSB0aGUKK2NvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeQorc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQKK29ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuCitGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbgorb2YgdGhlIExpYnJhcnkgYnkgYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2gKK3lvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksIGFuZAordGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55IHBhdGVudHMgb3IKK290aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueSBzdWNoIGNsYWltczsgdGhpcworc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUKK2Rpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55CitwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvCitkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQKK2Nob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlIGEKK2NvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluIGNlcnRhaW4KK2NvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwKK2NvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiBleHBsaWNpdAorZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQKK2Rpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuIEluIHN1Y2gKK2Nhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZgordGhpcyBMaWNlbnNlLgorCisxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUKK3NpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzCituZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgTGlicmFyeSBzcGVjaWZpZXMKK2EgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkgbGF0ZXIgdmVyc2lvbiIsCit5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmCit0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEgbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55Cit2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKzE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUgcHJvZ3JhbXMKK3dob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMKK2ZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlCitzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kCityZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKK05PIFdBUlJBTlRZCisKKzE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IKK1RIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4gT1RIRVJXSVNFCitTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUKK0xJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsCitJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAorUEVSRk9STUFOQ0UgT0YgVEhFIExJQlJBUlkgSVMgV0lUSCBZT1UuIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVQorQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyBXSUxMCitBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUiBSRURJU1RSSUJVVEUgVEhFCitMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQorR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUgorSU5BQklMSVRZIFRPIFVTRSBUSEUgTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQQorQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYgU1VDSCBIT0xERVIKK09SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTG9jYWxUZXN0UnVuLnRlc3RydW5jb25maWcgYi9Mb2NhbFRlc3RSdW4udGVzdHJ1bmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2EwMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvTG9jYWxUZXN0UnVuLnRlc3RydW5jb25maWcKQEAgLTAsMCArMSwyOCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxUZXN0U2V0dGluZ3MgbmFtZT0iTG9jYWwgVGVzdCBSdW4iIGlkPSJkZGU1OWYyYy04MGQ0LTQ4ZWEtYjZmZi0yY2Y2MDU1ZjMxNjIiIHhtbG5zPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zY2hlbWFzL1Zpc3VhbFN0dWRpby9UZWFtVGVzdC8yMDEwIj4KKyAgPERlc2NyaXB0aW9uPlRoaXMgaXMgYSBkZWZhdWx0IHRlc3QgcnVuIGNvbmZpZ3VyYXRpb24gZm9yIGEgbG9jYWwgdGVzdCBydW4uPC9EZXNjcmlwdGlvbj4KKyAgPERlcGxveW1lbnQgZW5hYmxlZD0iZmFsc2UiIC8+CisgIDxFeGVjdXRpb24+CisgICAgPFRpbWVvdXRzIHRlc3RUaW1lb3V0PSIwIiAvPgorICAgIDxUZXN0VHlwZVNwZWNpZmljPgorICAgICAgPFVuaXRUZXN0UnVuQ29uZmlnIHRlc3RUeXBlSWQ9IjEzY2RjOWQ5LWRkYjUtNGZhNC1hOTdkLWQ5NjVjY2ZjNmQ0YiI+CisgICAgICAgIDxBc3NlbWJseVJlc29sdXRpb24+CisgICAgICAgICAgPFRlc3REaXJlY3RvcnkgdXNlTG9hZENvbnRleHQ9InRydWUiIC8+CisgICAgICAgIDwvQXNzZW1ibHlSZXNvbHV0aW9uPgorICAgICAgPC9Vbml0VGVzdFJ1bkNvbmZpZz4KKyAgICAgIDxXZWJUZXN0UnVuQ29uZmlndXJhdGlvbiB0ZXN0VHlwZUlkPSI0ZTc1OTlmYS01ZWNiLTQzZTktYTg4Ny1jZDYzY2Y3MmQyMDciPgorICAgICAgICA8QnJvd3NlciBuYW1lPSJJbnRlcm5ldCBFeHBsb3JlciAxMC4wIiBNYXhDb25uZWN0aW9ucz0iNiI+CisgICAgICAgICAgPEhlYWRlcnM+CisgICAgICAgICAgICA8SGVhZGVyIG5hbWU9IlVzZXItQWdlbnQiIHZhbHVlPSJNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIE5UIDYuMTsgVHJpZGVudC82LjApIiAvPgorICAgICAgICAgICAgPEhlYWRlciBuYW1lPSJBY2NlcHQiIHZhbHVlPSIqLyoiIC8+CisgICAgICAgICAgICA8SGVhZGVyIG5hbWU9IkFjY2VwdC1MYW5ndWFnZSIgdmFsdWU9Int7JElFQWNjZXB0TGFuZ3VhZ2V9fSIgLz4KKyAgICAgICAgICAgIDxIZWFkZXIgbmFtZT0iQWNjZXB0LUVuY29kaW5nIiB2YWx1ZT0iR1pJUCIgLz4KKyAgICAgICAgICA8L0hlYWRlcnM+CisgICAgICAgIDwvQnJvd3Nlcj4KKyAgICAgIDwvV2ViVGVzdFJ1bkNvbmZpZ3VyYXRpb24+CisgICAgPC9UZXN0VHlwZVNwZWNpZmljPgorICAgIDxBZ2VudFJ1bGUgbmFtZT0iTG9jYWxNYWNoaW5lRGVmYXVsdFJvbGUiPgorICAgIDwvQWdlbnRSdWxlPgorICA8L0V4ZWN1dGlvbj4KKyAgPFByb3BlcnRpZXMgLz4KKzwvVGVzdFNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhMGQxZgotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMTQgQEAKK25hbWU6ICJFUFBsdXMiCitkZXNjcmlwdGlvbjoKKyAgICAiRVBQbHVzIGlzIGEgLk5FVCBsaWJyYXJ5IHRoYXQgcmVhZHMgYW5kIHdyaXRlcyBFeGNlbCBmaWxlcyB1c2luZyB0aGUgIgorCSIgT2ZmaWNlIE9wZW4gWE1MIGZvcm1hdCAoeGxzeCkuIgorCit0aGlyZF9wYXJ0eSB7CisgIHVybCB7CisgICAgdHlwZTogR0lUCisgICAgdmFsdWU6ICJodHRwczovL2dpdGh1Yi5jb20vSmFuS2FsbG1hbi9FUFBsdXMiCisgIH0KKyAgdmVyc2lvbjogYmZkNGY2ZGRlMzU3YzFjNzc4YjQ5NzhlNzRkZDEzOTI4NDJkZDdhNQorICBsYXN0X3VwZ3JhZGVfZGF0ZSB7IHllYXI6IDIwMjAgbW9udGg6IDEwIGRheTogMjEgfQorICBsaWNlbnNlX3R5cGU6IFJFU1RSSUNURUQKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL0dlbmVyYXRlUGFja2FnZS5jc3Byb2ogYi9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL0dlbmVyYXRlUGFja2FnZS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0MTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvR2VuZXJhdGVQYWNrYWdlLmNzcHJvagpAQCAtMCwwICsxLDY2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+eDg2PC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjMwNzAzPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns1QjgzRjRDRi1BRjBELTRGMDQtQjk5Mi03NDBDRTRGOUMxMTZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkdlbmVyYXRlUGFja2FnZTwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkdlbmVyYXRlUGFja2FnZTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+CisgICAgPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXEVQUGx1c1xFUFBsdXMuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RVBQbHVzPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iYXBwLmNvbmZpZyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9Qcm9ncmFtLmNzIGIvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDYzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw5MiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEdlbmVyYXRlUGFja2FnZQoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBFeGNlbFBhY2thZ2UgcGFja2FnZTsKKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiUHJlc3MgZW50ZXIgdG8gU3RhcnQiKTsKKyAgICAgICAgICAgIENvbnNvbGUuSW4uUmVhZExpbmUoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgY2EgPSAwOyBjYSA8IDEwOyBjYSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYSAlIDEwID09IDApCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZShjYSk7CisgICAgICAgICAgICAgICAgQ3JlYXRlRGVsZXRlUGFja2FnZSg0LDEwMDAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoIUNvbnNvbGUuSW4uUmVhZExpbmUoKS5FcXVhbHMoImV4aXQiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmVhdGVEZWxldGVQYWNrYWdlKDEsMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENyZWF0ZURlbGV0ZVBhY2thZ2UoaW50IFNoZWV0cywgaW50IHJvd3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8b2JqZWN0PiByb3cgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CisgICAgICAgICAgICByb3cuQWRkKDEpOworICAgICAgICAgICAgcm93LkFkZCgiU29tZSB0ZXh0Iik7CisgICAgICAgICAgICByb3cuQWRkKDEyLjApOworICAgICAgICAgICAgcm93LkFkZCgiU29tZSBsYXJnZXIgdGV4dCB0aGF0IGhhcyBjb21wbGV0ZWx5IG5vIG1lYW5pbmcuICBIb3cgbXVjaCB3b29kIGNhbiBhIHdvb2QgY2h1Y2sgY2h1Y2sgaWYgYSB3b29kIGNodWNrIGNvdWxkIGNodWNrIHdvb2QuICBBIHdvb2QgY2h1Y2sgY291bGQgY2h1Y2sgYXMgbXVjaCB3b29kIGFzIGEgd29vZCBjaHVjayBjb3VsZCBjaHVjayB3b29kLiIpOworCisgICAgICAgICAgICBGaWxlSW5mbyBMb2NhbEZ1bGxGaWxlTmFtZSA9IG5ldyBGaWxlSW5mbyhQYXRoLkdldFRlbXBGaWxlTmFtZSgpKTsKKyAgICAgICAgICAgIExvY2FsRnVsbEZpbGVOYW1lLkRlbGV0ZSgpOworICAgICAgICAgICAgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoTG9jYWxGdWxsRmlsZU5hbWUpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjYSA9IDA7IGNhIDwgU2hlZXRzOyBjYSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlV29ya3NoZWV0KCJTaGVldCIgKyAoY2ErMSksIHJvdywgcm93cyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9jYWxGdWxsRmlsZU5hbWUuUmVmcmVzaCgpOworICAgICAgICAgICAgICAgIGlmIChMb2NhbEZ1bGxGaWxlTmFtZS5FeGlzdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2NhbEZ1bGxGaWxlTmFtZS5EZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYWNrYWdlLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlID0gbnVsbDsKKworICAgICAgICAgICAgICAgIEdDLkNvbGxlY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlV29ya3NoZWV0KHN0cmluZyBzaGVldE5hbWUsIExpc3Q8b2JqZWN0PiByb3csIGludCBudW1yb3dzKQorICAgICAgICB7CisgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKHNoZWV0TmFtZSk7CisgICAgICAgICAgICBmb3IgKGludCBjYSA9IDE7IGNhIDw9IG51bXJvd3M7IGNhKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkRGF0YVJvdyh3b3Jrc2hlZXQsIGNhLCByb3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFkZERhdGFSb3coRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBpbnQgcm93LCBJRW51bWVyYWJsZTxvYmplY3Q+IHZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNhID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCB2IGluIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYSsrOworICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIGNlbGwgPSB3b3Jrc2hlZXQuQ2VsbHNbcm93LCBjYV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYmplY3QgdmFsdWUgPSB2OworICAgICAgICAgICAgICAgICAgICBjZWxsLlZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3Jrc2hlZXQuUm93KHJvdykuSGVpZ2h0ID0gMTAuMjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Njc5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMzYgQEAKK++7v3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkdlbmVyYXRlUGFja2FnZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJIUCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkdlbmVyYXRlUGFja2FnZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIEhQIDIwMTMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUgCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjYzMmIzNmMwLTRiZmQtNDUyOS1hOTliLTQzZjc4ZTE1YWFhMyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycyAKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvYXBwLmNvbmZpZyBiL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvYXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTlhZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9hcHAuY29uZmlnCkBAIC0wLDAgKzEsMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8Y29uZmlndXJhdGlvbj4KKzxzdGFydHVwPjxzdXBwb3J0ZWRSdW50aW1lIHZlcnNpb249InYyLjAuNTA3MjciLz48L3N0YXJ0dXA+PC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OWFiODMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwyIEBACisjIEVQUGx1cworQXBwU2hlZXQgZm9yayBvZiBFUFBsdXMKZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9FUFBsdXNTYW1wbGVzLmNzcHJvaiBiL1NhbXBsZUFwcC9FUFBsdXNTYW1wbGVzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjUxNGRjCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL0VQUGx1c1NhbXBsZXMuY3Nwcm9qCkBAIC0wLDAgKzEsMTQ1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjEyLjAiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57MDZCRjNDNjgtRTdENC00NTc5LTkwQkUtRTM2REFDRTU2NEVGfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5FUFBsdXNTYW1wbGVzPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+RVBQbHVzU2FtcGxlczwvQXNzZW1ibHlOYW1lPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDwvVXBncmFkZUJhY2t1cExvY2F0aW9uPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPkNsaWVudDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZSA0LjB8QW55Q1BVJyI+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2UgNC4wXDwvT3V0cHV0UGF0aD4KKyAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTEwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTExLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTEyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTEzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTE0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTE1LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2FtcGxlMS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGUzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2FtcGxlNS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGU2LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2FtcGxlOS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZV9Gb3JtdWxhQ2FsYy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGVfTWFpbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGUyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEVQUGx1c1xFUFBsdXMuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+RVBQbHVzPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iYXBwLmNvbmZpZyIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJHcmFwaFRlbXBsYXRlLnhsc3giIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb250ZW50IEluY2x1ZGU9ImNzdlxTYW1wbGU5LTIudHh0IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9ImNzdlxTYW1wbGU5LTEudHh0IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZCQS1Db2RlXENvbXB1dGVyUGxheU1vZHVsZS50eHQiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVkJBLUNvZGVcQmF0dGxlc2hpcFNoZWV0LnR4dCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWQkEtQ29kZVxUaGlzV29ya2Jvb2sudHh0IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZCQS1Db2RlXENvZGVNb2R1bGUudHh0IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZCQS1Db2RlXFNoaXBDbGFzcy50eHQiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvR3JhcGhUZW1wbGF0ZS54bHN4IGIvU2FtcGxlQXBwL0dyYXBoVGVtcGxhdGUueGxzeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTZjNGJlCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL0dyYXBoVGVtcGxhdGUueGxzeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9TYW1wbGVBcHAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0NTRlMgotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDYyIEBACivvu78vKiAKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKiAKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICoKKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKiAKKyAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKKyAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCisgKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgorICogCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRVBQbHVzU2FtcGxlcyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJEZW1vbnN0cmF0ZSBFeGNlbCBmaWxlcyBiZWluZyBjcmVhdGVkIG9uIHRoZSBzZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFUFBsdXMgU2FtcGxlcyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMzc5NWIyODItNzNkZC00N2YwLWFjY2YtMjE5NzA1NGQ2Y2Y0IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjEiKV0KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGUxLmNzIGIvU2FtcGxlQXBwL1NhbXBsZTEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZjc2NAotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGUxLmNzCkBAIC0wLDAgKzEsMTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqCisgKiAKKyAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKiAKKyAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKKyAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCisgKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgorICogCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBL5GxsbWFuCQlBZGRlZAkJMjEgTWFyIDIwMTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOworbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKK3sKKwljbGFzcyBTYW1wbGUxCisJeworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBTYW1wbGUgMSAtIHNpbXBseSBjcmVhdGVzIGEgbmV3IHdvcmtib29rIGZyb20gc2NyYXRjaC4KKwkJLy8vIFRoZSB3b3JrYm9vayBjb250YWlucyBvbmUgd29ya3NoZWV0IHdpdGggYSBzaW1wbGUgaW52ZXJ0b3J5IGxpc3QKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHN0YXRpYyBzdHJpbmcgUnVuU2FtcGxlMShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKwkJeworCQkJRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKKwkJCWlmIChuZXdGaWxlLkV4aXN0cykKKwkJCXsKKwkJCQluZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKKwkJCQluZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTEueGxzeCIpOworCQkJfQorCQkJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBuZXcgd29ya3NoZWV0IHRvIHRoZSBlbXB0eSB3b3JrYm9vaworICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkludmVudG9yeSIpOworICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBoZWFkZXJzCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDFdLlZhbHVlID0gIklEIjsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUHJvZHVjdCI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDNdLlZhbHVlID0gIlF1YW50aXR5IjsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNF0uVmFsdWUgPSAiUHJpY2UiOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJWYWx1ZSI7CisKKyAgICAgICAgICAgICAgICAvL0FkZCBzb21lIGl0ZW1zLi4uCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTIwMDE7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gIk5haWxzIjsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMyIl0uVmFsdWUgPSAzNzsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAzLjk5OworCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMTIwMDI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gIkhhbW1lciI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMyJdLlZhbHVlID0gNTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQzIl0uVmFsdWUgPSAxMi4xMDsKKworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDEyMDAzOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9ICJTYXciOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzQiXS5WYWx1ZSA9IDEyOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDQiXS5WYWx1ZSA9IDE1LjM3OworCisgICAgICAgICAgICAgICAgLy9BZGQgYSBmb3JtdWxhIGZvciB0aGUgdmFsdWUtY29sdW1uCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJFMjpFNCJdLkZvcm11bGEgPSAiQzIqRDIiOworCisgICAgICAgICAgICAgICAgLy9PayBub3cgZm9ybWF0IHRoZSB2YWx1ZXM7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByYW5nZSA9IHdvcmtzaGVldC5DZWxsc1sxLCAxLCAxLCA1XSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYW5nZS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByYW5nZS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkRhcmtCbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNTpFNSJdLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNTpFNSJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbNSwgMywgNSwgNV0uRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIlNVQlRPVEFMKDksezB9KSIsIG5ldyBFeGNlbEFkZHJlc3MoMiwzLDQsMykuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMjpDNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDI6RTUiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwIjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL0NyZWF0ZSBhbiBhdXRvZmlsdGVyIGZvciB0aGUgcmFuZ2UKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkExOkU0Il0uQXV0b0ZpbHRlciA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkEyOkE0Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJAIjsgICAvL0Zvcm1hdCBhcyB0ZXh0CisKKyAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIGFjdHVhbGx5IG5vIG5lZWQgdG8gY2FsY3VsYXRlLCBFeGNlbCB3aWxsIGRvIGl0IGZvciB5b3UsIGJ1dCBpbiBzb21lIGNhc2VzIGl0IG1pZ2h0IGJlIHVzZWZ1bC4gCisgICAgICAgICAgICAgICAgLy9Gb3IgZXhhbXBsZSBpZiB5b3UgbGluayB0byB0aGlzIHdvcmtib29rIGZyb20gYW5vdGhlciB3b3JrYm9vayBvciB5b3Ugd2lsbCBvcGVuIHRoZSB3b3JrYm9vayBpbiBhIHByb2dyYW0gdGhhdCBoYXNuJ3QgYSBjYWxjdWxhdGlvbiBlbmdpbmUgb3IgCisgICAgICAgICAgICAgICAgLy95b3Ugd2FudCB0byB1c2UgdGhlIHJlc3VsdCBvZiBhIGZvcm11bGEgaW4geW91ciBwcm9ncmFtLgorICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DYWxjdWxhdGUoKTsgCisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHMuQXV0b0ZpdENvbHVtbnMoMCk7ICAvL0F1dG9maXQgY29sdW1ucyBmb3IgYWxsIGNlbGxzCisKKyAgICAgICAgICAgICAgICAvLyBsZXRzIHNldCB0aGUgaGVhZGVyIHRleHQgCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRIZWFkZXIuQ2VudGVyZWRUZXh0ID0gIiYyNCZVJlwiQXJpYWwsUmVndWxhciBCb2xkXCIgSW52ZW50b3J5IjsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHBhZ2UgbnVtYmVyIHRvIHRoZSBmb290ZXIgcGx1cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCA9CisgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIlBhZ2UgezB9IG9mIHsxfSIsIEV4Y2VsSGVhZGVyRm9vdGVyLlBhZ2VOdW1iZXIsIEV4Y2VsSGVhZGVyRm9vdGVyLk51bWJlck9mUGFnZXMpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgc2hlZXQgbmFtZSB0byB0aGUgZm9vdGVyCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuQ2VudGVyZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuU2hlZXROYW1lOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb290ZXIKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLk9kZEZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgPSBFeGNlbEhlYWRlckZvb3Rlci5GaWxlUGF0aCArIEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVOYW1lOworCisgICAgICAgICAgICAgICAgd29ya3NoZWV0LlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzID0gd29ya3NoZWV0LkNlbGxzWyIxOjIiXTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMgPSB3b3Jrc2hlZXQuQ2VsbHNbIkE6RyJdOworCisgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaGVldCB2aWV3IHRvIHNob3cgaXQgaW4gcGFnZSBsYXlvdXQgbW9kZQorICAgICAgICAgICAgICAgIHdvcmtzaGVldC5WaWV3LlBhZ2VMYXlvdXRWaWV3ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIC8vIHNldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiSW52ZXJ0b3J5IjsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBL5GxsbWFuIjsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQ29tbWVudHMgPSAiVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYW4gRXhjZWwgMjAwNyB3b3JrYm9vayB1c2luZyBFUFBsdXMiOworCisgICAgICAgICAgICAgICAgLy8gc2V0IHNvbWUgZXh0ZW5kZWQgcHJvcGVydHkgdmFsdWVzCisgICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7CisKKyAgICAgICAgICAgICAgICAvLyBzZXQgc29tZSBjdXN0b20gcHJvcGVydHkgdmFsdWVzCisgICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkNoZWNrZWQgYnkiLCAiSmFuIEvkbGxtYW4iKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkVQUGx1cyIpOworICAgICAgICAgICAgICAgIC8vIHNhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTAuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTAuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyZjNlYwotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGUxMC5jcwpAQCAtMCwwICsxLDIxMiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyOCBPY3QgMjAxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOworCituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2FtcGxlMTAKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSdW5TYW1wbGUxMChEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9DcmVhdGUgYSBTYW1wbGUxMCBkaXJlY3RvcnkuLi4KKyAgICAgICAgICAgIGlmKCFEaXJlY3RvcnkuRXhpc3RzKG91dHB1dERpci5GdWxsTmFtZSArIEAiXFNhbXBsZTEwIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGlyLkNyZWF0ZVN1YmRpcmVjdG9yeSgiU2FtcGxlMTAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dERpcj1uZXcgRGlyZWN0b3J5SW5mbyhvdXRwdXREaXIgKyBAIlxTYW1wbGUxMCIpOworCisgICAgICAgICAgICAvL2NyZWF0ZSB0aGUgdGhyZWUgRmlsZUluZm8gb2JqZWN0cy4uLgorICAgICAgICAgICAgRmlsZUluZm8gdGVtcGxhdGVGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXFRlbXBsYXRlLnhsc3giKTsKKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUZpbGUuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsZS5EZWxldGUoKTsgCisgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXFRlbXBsYXRlLnhsc3giKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVJbmZvIGFuc3dlckZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcQW5zd2Vycy54bHN4Iik7CisgICAgICAgICAgICBpZiAoYW5zd2VyRmlsZS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5zd2VyRmlsZS5EZWxldGUoKTsgIAorICAgICAgICAgICAgICAgIGFuc3dlckZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcQW5zd2Vycy54bHN4Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGVJbmZvIEpLQW5zd2VyRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxKS0Fuc3dlcnMueGxzeCIpOworICAgICAgICAgICAgaWYgKEpLQW5zd2VyRmlsZS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSktBbnN3ZXJGaWxlLkRlbGV0ZSgpOworICAgICAgICAgICAgICAgIEpLQW5zd2VyRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxKS0Fuc3dlcnMueGxzeCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgdGVtcGxhdGUuLi4KKyAgICAgICAgICAgIHVzaW5nICgKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSh0ZW1wbGF0ZUZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vTG9jayB0aGUgd29ya2Jvb2sgdG90YWxseQorICAgICAgICAgICAgICAgIHZhciB3b3JrYm9vayA9IHBhY2thZ2UuV29ya2Jvb2s7CisgICAgICAgICAgICAgICAgd29ya2Jvb2suUHJvdGVjdGlvbi5Mb2NrV2luZG93cyA9IHRydWU7CisgICAgICAgICAgICAgICAgd29ya2Jvb2suUHJvdGVjdGlvbi5Mb2NrU3RydWN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrYm9vay5WaWV3LlNldFdpbmRvd1NpemUoMTUwLCA1MjUsIDE0NTAwLCA2MDAwKTsKKyAgICAgICAgICAgICAgICB3b3JrYm9vay5WaWV3LlNob3dIb3Jpem9udGFsU2Nyb2xsQmFyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgd29ya2Jvb2suVmlldy5TaG93VmVydGljYWxTY3JvbGxCYXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3b3JrYm9vay5WaWV3LlNob3dTaGVldFRhYnMgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vU2V0IGEgcGFzc3dvcmQgZm9yIHRoZSB3b3JrYm9va3Byb3RlY3Rpb24KKyAgICAgICAgICAgICAgICB3b3JrYm9vay5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJFUFBsdXMiKTsKKworICAgICAgICAgICAgICAgIC8vRW5jcnlwdCB3aXRoIG5vIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgcGFja2FnZS5FbmNyeXB0aW9uLklzRW5jcnlwdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlF1aXoiKTsKKyAgICAgICAgICAgICAgICBzaGVldC5WaWV3LlNob3dHcmlkTGluZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzaGVldC5WaWV3LlNob3dIZWFkZXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXNpbmcodmFyIHJhbmdlPXNoZWV0LkNlbGxzWyJBOlhGRCJdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZT1FeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmF5KTsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRm9udC5OYW1lID0gIkJyb2Fkd2F5IjsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJRdWl6LVN3ZWRlbiI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uU3R5bGUuRm9udC5TaXplID0gMTg7CisKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJFbnRlciB5b3VyIG5hbWU6IjsKKworICAgICAgICAgICAgICAgIHNoZWV0LkNvbHVtbigxKS5XaWR0aCA9IDMwOworICAgICAgICAgICAgICAgIHNoZWV0LkNvbHVtbigyKS5XaWR0aCA9IDgwOworICAgICAgICAgICAgICAgIHNoZWV0LkNvbHVtbigzKS5XaWR0aCA9IDIwOworCisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE3Il0uVmFsdWUgPSAiV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGUgY2FwaXRhbCBvZiBTd2VkZW4/IjsKKyAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTkiXS5WYWx1ZSA9ICJBdCB3aGljaCBwbGFjZSBkaWQgdGhlIFN3ZWRpc2ggdGVhbSBlbmQgdXAgaW4gdGhlIFNvY2NlciBXb3JsZGN1cCAxOTk0PyI7CisgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExMSJdLlZhbHVlID0gIldoYXQgaXMgdGhlIGZpcnN0IG5hbWUgb2YgdGhlIGZhbW91cyBTd2VkaXNoIGludmVudG9yL3NjaWVudGlzdCB0aGF0IGZvdW5kZWQgdGhlIE5vYmVsLXByaXplPyI7CisKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHIgPSBzaGVldC5DZWxsc1siQjMsQzcsQzksQzExIl0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLldoaXRlU21va2UpOworICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLkRvdHRlZDsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuVG9wLkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuUmlnaHQuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLkRvdHRlZDsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuUmlnaHQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmxhY2spOworICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkJvcmRlci5Cb3R0b20uU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLkRvdHRlZDsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuQm90dG9tLkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuTGVmdC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuRG90dGVkOworICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkJvcmRlci5MZWZ0LkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Mb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5IaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hlZXQuU2VsZWN0KCJCMyIpOworICAgICAgICAgICAgICAgIHNoZWV0LlByb3RlY3Rpb24uU2V0UGFzc3dvcmQoIkVQUGx1cyIpOworICAgICAgICAgICAgICAgIHNoZWV0LlByb3RlY3Rpb24uQWxsb3dTZWxlY3RMb2NrZWRDZWxscyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy9PcHRpb25zIHF1ZXN0aW9uIDEKKyAgICAgICAgICAgICAgICB2YXIgbGlzdDEgPSBzaGVldC5DZWxsc1siQzciXS5EYXRhVmFsaWRhdGlvbi5BZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICBsaXN0MS5Gb3JtdWxhLlZhbHVlcy5BZGQoIkJlcm4iKTsKKyAgICAgICAgICAgICAgICBsaXN0MS5Gb3JtdWxhLlZhbHVlcy5BZGQoIlN0b2NraG9sbSIpOworICAgICAgICAgICAgICAgIGxpc3QxLkZvcm11bGEuVmFsdWVzLkFkZCgiT3NsbyIpOworICAgICAgICAgICAgICAgIGxpc3QxLlNob3dFcnJvck1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGxpc3QxLkVycm9yID0gIlBsZWFzZSBzZWxlY3QgYSB2YWx1ZSBmcm9tIHRoZSBsaXN0IjsKKworICAgICAgICAgICAgICAgIHZhciBsaXN0MiA9IHNoZWV0LkNlbGxzWyJDOSJdLkRhdGFWYWxpZGF0aW9uLkFkZExpc3REYXRhVmFsaWRhdGlvbigpOworICAgICAgICAgICAgICAgIGxpc3QyLkZvcm11bGEuVmFsdWVzLkFkZCgiRmlyc3QiKTsKKyAgICAgICAgICAgICAgICBsaXN0Mi5Gb3JtdWxhLlZhbHVlcy5BZGQoIlNlY29uZCIpOworICAgICAgICAgICAgICAgIGxpc3QyLkZvcm11bGEuVmFsdWVzLkFkZCgiVGhpcmQiKTsKKyAgICAgICAgICAgICAgICBsaXN0Mi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsaXN0Mi5FcnJvciA9ICJQbGVhc2Ugc2VsZWN0IGEgdmFsdWUgZnJvbSB0aGUgbGlzdCI7CisKKyAgICAgICAgICAgICAgICB2YXIgbGlzdDMgPSBzaGVldC5DZWxsc1siQzExIl0uRGF0YVZhbGlkYXRpb24uQWRkTGlzdERhdGFWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICAgICAgbGlzdDMuRm9ybXVsYS5WYWx1ZXMuQWRkKCJDYXJsIEd1c3RhZiIpOworICAgICAgICAgICAgICAgIGxpc3QzLkZvcm11bGEuVmFsdWVzLkFkZCgiSW5nbWFyIik7CisgICAgICAgICAgICAgICAgbGlzdDMuRm9ybXVsYS5WYWx1ZXMuQWRkKCJBbGZyZWQiKTsKKyAgICAgICAgICAgICAgICBsaXN0My5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsaXN0My5FcnJvciA9ICJQbGVhc2Ugc2VsZWN0IGEgdmFsdWUgZnJvbSB0aGUgbGlzdCI7CisKKworICAgICAgICAgICAgICAgIC8vU2F2ZSwgYW5kIHRoZSB0ZW1wbGF0ZSBpcyByZWFkeSBmb3IgdXNlCisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7CisKKyAgICAgICAgICAgICAgICAvL1F1aXotdGVtcGxhdGUgaXMgZG9uZSwgbm93IGNyZWF0ZSB0aGUgYW5zd2VyIHRlbXBsYXRlIGFuZCBlbmNyeXB0IGl0Li4uCisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlQW5zd2VycyA9IG5ldyBFeGNlbFBhY2thZ2UocGFja2FnZS5TdHJlYW0pKSAgICAgICAvL1dlIHVzZSB0aGUgc3RyZWFtIGZyb20gdGhlIHRlbXBsYXRlIGhlcmUgdG8gZ2V0IGEgY29weSBvZiBpdC4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGVldEFuc3dlcnMgPSBwYWNrYWdlQW5zd2Vycy5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgICAgICAgICBzaGVldEFuc3dlcnMuQ2VsbHNbIkM3Il0uVmFsdWUgPSAiU3RvY2tob2xtIjsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRBbnN3ZXJzLkNlbGxzWyJDOSJdLlZhbHVlID0gIlRoaXJkIjsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRBbnN3ZXJzLkNlbGxzWyJDMTEiXS5WYWx1ZSA9ICJBbGZyZWQiOworCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VBbnN3ZXJzLkVuY3J5cHRpb24uQWxnb3JpdGhtID0gRW5jcnlwdGlvbkFsZ29yaXRobS5BRVMxOTI7ICAgLy9Gb3IgdGhlIGFuc3dlcnMgd2Ugd2FudCBhIGxpdHRsZSBiaXQgc3Ryb25nZXIgZW5jcnlwdGlvbgorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlQW5zd2Vycy5TYXZlQXMoYW5zd2VyRmlsZSwgIkVQUGx1cyIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vU2F2ZSBhbmQgc2V0IHRoZSBwYXNzd29yZCB0byBFUFBsdXMuIFRoZSBwYXNzd29yZCBjYW4gYWxzbyBiZSBzZXQgdXNpbmcgcGFja2FnZUFuc3dlcnMuRW5jcnlwdGlvbi5QYXNzd29yZCBwcm9wZXJ0eQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vT2ssIFNpbmNlIHRoaXMgaXMgICAgIHFhbiBleGFtcGxlIHdlIGNyZWF0ZSBvbmUgdXNlciBhbnN3ZXIuLi4KKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2VBbnN3ZXJzID0gbmV3IEV4Y2VsUGFja2FnZShwYWNrYWdlLlN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgc2hlZXRVc2VyID0gcGFja2FnZUFuc3dlcnMuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRVc2VyLkNlbGxzWyJCMyJdLlZhbHVlID0gIkphbiBLw6RsbG1hbiI7CisgICAgICAgICAgICAgICAgICAgIHNoZWV0VXNlci5DZWxsc1siQzciXS5WYWx1ZSA9ICJCZXJuIjsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRVc2VyLkNlbGxzWyJDOSJdLlZhbHVlID0gIlRoaXJkIjsKKyAgICAgICAgICAgICAgICAgICAgc2hlZXRVc2VyLkNlbGxzWyJDMTEiXS5WYWx1ZSA9ICJBbGZyZWQiOworCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VBbnN3ZXJzLlNhdmVBcyhKS0Fuc3dlckZpbGUsICJKSyIpOyAgLy9XZSB1c2UgZGVmYXVsdCBlbmNyeXB0aW9uIGhlcmUgKEFFUzEyOCkgYW5kIFBhc3N3b3JkIEpLCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vTm93IGxldHMgY29ycmVjdCB0aGUgdXNlciBmb3JtLi4uCisgICAgICAgICAgICB2YXIgcGFja0Fuc3dlcnMgPSBuZXcgRXhjZWxQYWNrYWdlKGFuc3dlckZpbGUsICJFUFBsdXMiKTsgICAgLy9TdXBwbHkgdGhlIHBhc3N3b3JkLCBzbyB0aGUgZmlsZSBjYW4gYmUgZGVjcnlwdGVkCisgICAgICAgICAgICB2YXIgcGFja1VzZXIgPSAgbmV3IEV4Y2VsUGFja2FnZShKS0Fuc3dlckZpbGUsICJKSyIpOyAgICAgICAgLy9TdXBwbHkgdGhlIHBhc3N3b3JkLCBzbyB0aGUgZmlsZSBjYW4gYmUgZGVjcnlwdGVkCisKKyAgICAgICAgICAgIHZhciB3c0Fuc3dlcnMgPSBwYWNrQW5zd2Vycy5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgdmFyIHdzVXNlciA9IHBhY2tVc2VyLldvcmtib29rLldvcmtzaGVldHNbMV07CisKKyAgICAgICAgICAgIC8vRW51bWVyYXRlIHRoZSB0aHJlZSBhbnN3ZXJzCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiB3c0Fuc3dlcnMuQ2VsbHNbIkM3LEM5LEMxMSJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdzVXNlci5DZWxsc1tjZWxsLkFkZHJlc3NdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICBpZiAoY2VsbC5WYWx1ZS5Ub1N0cmluZygpLkVxdWFscyh3c1VzZXIuQ2VsbHNbY2VsbC5BZGRyZXNzXS5WYWx1ZS5Ub1N0cmluZygpLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgLy9Db3JyZWN0IEFuc3dlcj8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdzVXNlci5DZWxsc1tjZWxsLkFkZHJlc3NdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkdyZWVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3NVc2VyLkNlbGxzW2NlbGwuQWRkcmVzc10uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuUmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWNrVXNlci5TYXZlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTEuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTEuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmYjBjYgotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGUxMS5jcwpAQCAtMCwwICsxLDI4NyBAQAor77u/LyogCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICogCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKiAKKyAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKKyAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCisgKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgorICogCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7CisKK25hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdXNlIGRhdGEgdmFsaWRhdGlvbgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY2xhc3MgU2FtcGxlMTEKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTExKERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NyZWF0ZSBhIFNhbXBsZTEwIGRpcmVjdG9yeS4uLgorICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKG91dHB1dERpci5GdWxsTmFtZSArIEAiXFNhbXBsZTExIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGlyLkNyZWF0ZVN1YmRpcmVjdG9yeSgiU2FtcGxlMTEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKG91dHB1dERpciArIEAiXFNhbXBsZTExIik7CisKKyAgICAgICAgICAgIC8vY3JlYXRlIEZpbGVJbmZvIG9iamVjdC4uLgorICAgICAgICAgICAgRmlsZUluZm8gb3V0cHV0ID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXE91dHB1dC54bHN4Iik7CisgICAgICAgICAgICBpZiAob3V0cHV0LkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuRGVsZXRlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXE91dHB1dC54bHN4Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2Uob3V0cHV0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBZGRJbnRlZ2VyVmFsaWRhdGlvbihwYWNrYWdlKTsKKyAgICAgICAgICAgICAgICBBZGRMaXN0VmFsaWRhdGlvbkZvcm11bGEocGFja2FnZSk7CisgICAgICAgICAgICAgICAgQWRkTGlzdFZhbGlkYXRpb25WYWx1ZXMocGFja2FnZSk7CisgICAgICAgICAgICAgICAgQWRkVGltZVZhbGlkYXRpb24ocGFja2FnZSk7CisgICAgICAgICAgICAgICAgQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKHBhY2thZ2UpOworICAgICAgICAgICAgICAgIFJlYWRFeGlzdGluZ1ZhbGlkYXRpb25zRnJvbVBhY2thZ2UocGFja2FnZSk7CisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQuRnVsbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGludGVnZXIgdmFsaWRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGUiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkSW50ZWdlclZhbGlkYXRpb24oRXhjZWxQYWNrYWdlIHBhY2thZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImludGVnZXIiKTsKKyAgICAgICAgICAgIC8vIGFkZCBhIHZhbGlkYXRpb24gYW5kIHNldCB2YWx1ZXMKKyAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJBMTpBMiIpOworICAgICAgICAgICAgLy8gQWx0ZXJuYXRpdmVseToKKyAgICAgICAgICAgIC8vdmFyIHZhbGlkYXRpb24gPSBzaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JTdHlsZSA9IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuc3RvcDsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uUHJvbXB0VGl0bGUgPSAiRW50ZXIgYSBpbnRlZ2VyIHZhbHVlIGhlcmUiOworICAgICAgICAgICAgdmFsaWRhdGlvbi5Qcm9tcHQgPSAiVmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgNSI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dJbnB1dE1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvclRpdGxlID0gIkFuIGludmFsaWQgdmFsdWUgd2FzIGVudGVyZWQiOworICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvciA9ICJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNSI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dFcnJvck1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5iZXR3ZWVuOworICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlID0gMTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYTIuVmFsdWUgPSA1OworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQWRkZWQgc2hlZXQgZm9yIGludGVnZXIgdmFsaWRhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWRkcyBhIGxpc3QgdmFsaWRhdGlvbiB3aGVyZSB0aGUgbGlzdCBzb3VyY2UgaXMgYSBmb3JtdWxhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFja2FnZSI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRMaXN0VmFsaWRhdGlvbkZvcm11bGEoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImxpc3QgZm9ybXVsYSIpOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gIlNvdXJjZSB2YWx1ZXMiOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAyOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWUgPSAzOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBhZGQgYSB2YWxpZGF0aW9uIGFuZCBzZXQgdmFsdWVzCisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgICAgIC8vIEFsdGVybmF0aXZlbHk6CisgICAgICAgICAgICAvLyB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkNlbGxzWyJBMSJdLkRhdGFWYWxpZGF0aW9uLkFkZExpc3REYXRhVmFsaWRhdGlvbigpOworICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JTdHlsZSA9IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUud2FybmluZzsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JUaXRsZSA9ICJBbiBpbnZhbGlkIHZhbHVlIHdhcyBlbnRlcmVkIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3IgPSAiU2VsZWN0IGEgdmFsdWUgZnJvbSB0aGUgbGlzdCI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhID0gIkIyOkI0IjsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkFkZGVkIHNoZWV0IGZvciBsaXN0IHZhbGlkYXRpb24gd2l0aCBmb3JtdWxhIik7CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZHMgYSBsaXN0IHZhbGlkYXRpb24gd2hlcmUgdGhlIHNlbGVjdGFibGUgdmFsdWVzIGFyZSBzZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYWNrYWdlIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZExpc3RWYWxpZGF0aW9uVmFsdWVzKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJsaXN0IHZhbHVlcyIpOworCisgICAgICAgICAgICAvLyBhZGQgYSB2YWxpZGF0aW9uIGFuZCBzZXQgdmFsdWVzCisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbigiQTEiKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yU3R5bGUgPSBFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLndhcm5pbmc7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yVGl0bGUgPSAiQW4gaW52YWxpZCB2YWx1ZSB3YXMgZW50ZXJlZCI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yID0gIlNlbGVjdCBhIHZhbHVlIGZyb20gdGhlIGxpc3QiOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gNTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZXMuQWRkKGkuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQWRkZWQgc2hlZXQgZm9yIGxpc3QgdmFsaWRhdGlvbiB3aXRoIHZhbHVlcyIpOworCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGRzIGEgdGltZSB2YWxpZGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFja2FnZSI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRUaW1lVmFsaWRhdGlvbihFeGNlbFBhY2thZ2UgcGFja2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGltZSIpOworICAgICAgICAgICAgLy8gYWRkIGEgdmFsaWRhdGlvbiBhbmQgc2V0IHZhbHVlcworICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkVGltZVZhbGlkYXRpb24oIkExIik7CisgICAgICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5OgorICAgICAgICAgICAgLy8gdmFyIHZhbGlkYXRpb24gPSBzaGVldC5DZWxsc1siQTEiXS5EYXRhVmFsaWRhdGlvbi5BZGRUaW1lRGF0YVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7CisgICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yU3R5bGUgPSBFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLnN0b3A7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dJbnB1dE1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5Qcm9tcHRUaXRsZSA9ICJFbnRlciB0aW1lIGluIGZvcm1hdCBISDpNTTpTUyI7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdCA9ICJTaG91bGQgYmUgZ3JlYXRlciB0aGFuIDEzOjMwOjEwIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uT3BlcmF0b3IgPSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuZ3JlYXRlclRoYW47CisgICAgICAgICAgICB2YXIgdGltZSA9IHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZTsKKyAgICAgICAgICAgIHRpbWUuSG91ciA9IDEzOworICAgICAgICAgICAgdGltZS5NaW51dGUgPSAzMDsKKyAgICAgICAgICAgIHRpbWUuU2Vjb25kID0gMTA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQWRkZWQgc2hlZXQgZm9yIHRpbWUgdmFsaWRhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGREYXRlVGltZVZhbGlkYXRpb24oRXhjZWxQYWNrYWdlIHBhY2thZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImRhdGV0aW1lIik7CisgICAgICAgICAgICAvLyBhZGQgYSB2YWxpZGF0aW9uIGFuZCBzZXQgdmFsdWVzCisgICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkExIik7CisgICAgICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5OgorICAgICAgICAgICAgLy8gdmFyIHZhbGlkYXRpb24gPSBzaGVldC5DZWxsc1siQTEiXS5EYXRhVmFsaWRhdGlvbi5BZGREYXRlVGltZURhdGFWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dFcnJvck1lc3NhZ2UgPSB0cnVlOworICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvclN0eWxlID0gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS5zdG9wOworICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvciA9ICJJbnZhbGlkIGRhdGUhIjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0lucHV0TWVzc2FnZSA9IHRydWU7CisgICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdCA9ICJFbnRlciBhIGRhdGUgZ3JlYXRlciB0aGFuIHRvZGF5cyBkYXRlIGhlcmUiOworICAgICAgICAgICAgdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5ncmVhdGVyVGhhbjsKKyAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZSA9IERhdGVUaW1lLk5vdy5EYXRlOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkFkZGVkIHNoZWV0IGZvciBkYXRlIHRpbWUgdmFsaWRhdGlvbiIpOworCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBzaG93cyBkZXRhaWxzIGFib3V0IGFsbCBleGlzdGluZyB2YWxpZGF0aW9ucyBpbiB0aGUgZW50aXJlIHdvcmtib29rCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFja2FnZSI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBSZWFkRXhpc3RpbmdWYWxpZGF0aW9uc0Zyb21QYWNrYWdlKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQYWNrYWdlIHZhbGlkYXRpb25zIik7CisgICAgICAgICAgICAvLyBwcmludCBoZWFkZXJzCisgICAgICAgICAgICBzaGVldC5DZWxsc1siQTE6RTEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiVHlwZSI7CisgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJBZGRyZXNzIjsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlID0gIk9wZXJhdG9yIjsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gIkZvcm11bGExIjsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFMSJdLlZhbHVlID0gIkZvcm11bGEyIjsKKworICAgICAgICAgICAgaW50IHJvdyA9IDI7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgb3RoZXJTaGVldCBpbiBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYob3RoZXJTaGVldCA9PSBzaGVldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZGF0YVZhbGlkYXRpb24gaW4gb3RoZXJTaGVldC5EYXRhVmFsaWRhdGlvbnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQSIgKyByb3cuVG9TdHJpbmcoKV0uVmFsdWUgPSBkYXRhVmFsaWRhdGlvbi5WYWxpZGF0aW9uVHlwZS5UeXBlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCIiArIHJvdy5Ub1N0cmluZygpXS5WYWx1ZSA9IGRhdGFWYWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFWYWxpZGF0aW9uLkFsbG93c09wZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQyIgKyByb3cuVG9TdHJpbmcoKV0uVmFsdWUgPSAoKElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yKWRhdGFWYWxpZGF0aW9uKS5PcGVyYXRvci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgY2FzdGluZyBpcyBuZWVkZWQgdG8gZ2V0IHZhbGlkYXRpb250eXBlLXNwZWNpZmljIHZhbHVlcworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YVZhbGlkYXRpb24uVmFsaWRhdGlvblR5cGUuVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLldob2xlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50V2hvbGVWYWxpZGF0aW9uRGV0YWlscyhzaGVldCwgKElFeGNlbERhdGFWYWxpZGF0aW9uSW50KWRhdGFWYWxpZGF0aW9uLCByb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRMaXN0VmFsaWRhdGlvbkRldGFpbHMoc2hlZXQsIChJRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QpZGF0YVZhbGlkYXRpb24sIHJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuVGltZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFRpbWVWYWxpZGF0aW9uRGV0YWlscyhzaGVldCwgKEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lKWRhdGFWYWxpZGF0aW9uLCByb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBzYW1wbGUsIGJ1dCBJIGhvcGUgeW91IGdldCB0aGUgcGljdHVyZS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRXaG9sZVZhbGlkYXRpb25EZXRhaWxzKEV4Y2VsV29ya3NoZWV0IHNoZWV0LCBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCB3aG9sZVZhbGlkYXRpb24sIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEIiArIHJvdy5Ub1N0cmluZygpXS5WYWx1ZSA9IHdob2xlVmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlLkhhc1ZhbHVlID8gd2hvbGVWYWxpZGF0aW9uLkZvcm11bGEuVmFsdWUuVmFsdWUuVG9TdHJpbmcoKSA6IHdob2xlVmFsaWRhdGlvbi5Gb3JtdWxhLkV4Y2VsRm9ybXVsYTsKKyAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFIiArIHJvdy5Ub1N0cmluZygpXS5WYWx1ZSA9IHdob2xlVmFsaWRhdGlvbi5Gb3JtdWxhMi5WYWx1ZS5IYXNWYWx1ZSA/IHdob2xlVmFsaWRhdGlvbi5Gb3JtdWxhMi5WYWx1ZS5WYWx1ZS5Ub1N0cmluZygpIDogd2hvbGVWYWxpZGF0aW9uLkZvcm11bGEyLkV4Y2VsRm9ybXVsYTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRMaXN0VmFsaWRhdGlvbkRldGFpbHMoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCBsaXN0VmFsaWRhdGlvbiwgaW50IHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHZhbHVlID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgLy8gaWYgZm9ybXVsYSBpcyB1c2VkIC0gc2hvdyBpdC4uLgorICAgICAgICAgICAgaWYoIXN0cmluZy5Jc051bGxPckVtcHR5KGxpc3RWYWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RWYWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSAtIHNob3cgdGhlIHZhbHVlcyBmcm9tIHRoZSBsaXN0IGNvbGxlY3Rpb24KKyAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvcmVhY2godmFyIGxpc3RWYWx1ZSBpbiBsaXN0VmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHNiLkxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChsaXN0VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNiLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGVldC5DZWxsc1siRCIgKyByb3cuVG9TdHJpbmcoKV0uVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRUaW1lVmFsaWRhdGlvbkRldGFpbHMoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIHZhbGlkYXRpb24sIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZTEgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZighc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsaWRhdGlvbi5Gb3JtdWxhLkV4Y2VsRm9ybXVsYSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWUxID0gdmFsaWRhdGlvbi5Gb3JtdWxhLkV4Y2VsRm9ybXVsYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBzdHJpbmcuRm9ybWF0KCJ7MH06ezF9OnsyfSIsIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZS5Ib3VyLCB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUuTWludXRlLCB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUuU2Vjb25kID8/IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQiICsgcm93LlRvU3RyaW5nKCldLlZhbHVlID0gdmFsdWUxOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTEyLmNzIGIvU2FtcGxlQXBwL1NhbXBsZTEyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGJmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvU2FtcGxlMTIuY3MKQEAgLTAsMCArMSwyMDcgQEAKK++7vy8qIAorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqIAorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqICBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTA0LTE4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBTeXN0ZW0uRGF0YS5TcWxDbGllbnQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7CituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjbGFzcyBzaG93cyBob3cgdG8gdXNlIHBpdm90dGFibGVzIAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTYW1wbGUxMgorICAgIHsKKyAgICAgICAgcHVibGljIGNsYXNzIFNhbGVzRFRPCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVGl0bGUgeyBnZXQ7IHNldDsgfSAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHN0cmluZyBGaXJzdE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBNaWRkbGVOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTGFzdE5hbWUgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLklzTnVsbE9yRW1wdHkoTWlkZGxlTmFtZSkgPyBGaXJzdE5hbWUgKyAiICIgKyBMYXN0TmFtZSA6IEZpcnN0TmFtZSArICIgIiArIE1pZGRsZU5hbWUgKyAiICIgKyBMYXN0TmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgT3JkZXJEYXRlIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIFN1YlRvdGFsIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIFRheCB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgZGVjaW1hbCBGcmVpZ2h0IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIFRvdGFsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ViVG90YWwgKyBUYXggKyBGcmVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSdW5TYW1wbGUxMihzdHJpbmcgc3FsU2VydmVyTmFtZSwgRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IExpc3Q8U2FsZXNEVE8+KCk7CisgICAgICAgICAgICBpZiAoc3FsU2VydmVyTmFtZSA9PSAiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gR2V0UmFuZG9tRGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3QgPSBHZXREYXRhRnJvbVNRTChzcWxTZXJ2ZXJOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSBvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxMi54bHN4IjsKKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkgRmlsZS5EZWxldGUoZmlsZSk7CisgICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKGZpbGUpOworCisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBoYW5kbGUgdG8gdGhlIGV4aXN0aW5nIHdvcmtzaGVldAorICAgICAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNhbGVzRGF0YSIpOworCisgICAgICAgICAgICAgICAgdmFyIGRhdGFSYW5nZSA9IHdzRGF0YS5DZWxsc1siQTEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIGZyb20gcyBpbiBsaXN0IAorICAgICAgICAgICAgICAgICAgICBvcmRlcmJ5IHMuTGFzdE5hbWUsIHMuRmlyc3ROYW1lIAorICAgICAgICAgICAgICAgICAgICBzZWxlY3QgcywgCisgICAgICAgICAgICAgICAgICAgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW0yKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWzIsIDYsIGRhdGFSYW5nZS5FbmQuUm93LCA2XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tLWRkLXl5IjsKKyAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbMiwgNywgZGF0YVJhbmdlLkVuZC5Sb3csIDExXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwIjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkYXRhUmFuZ2UuQXV0b0ZpdENvbHVtbnMoKTsKKworICAgICAgICAgICAgICAgIHZhciB3c1Bpdm90ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdFNpbXBsZSIpOworICAgICAgICAgICAgICAgIHZhciBwaXZvdFRhYmxlMSA9IHdzUGl2b3QuUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3QuQ2VsbHNbIkExIl0sIGRhdGFSYW5nZSwgIlBlckVtcGxvZWUiKTsKKworICAgICAgICAgICAgICAgIHBpdm90VGFibGUxLlJvd0ZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWzRdKTsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YUZpZWxkID0gcGl2b3RUYWJsZTEuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWzZdKTsKKyAgICAgICAgICAgICAgICBkYXRhRmllbGQuRm9ybWF0PSIjLCMjMCI7CisgICAgICAgICAgICAgICAgcGl2b3RUYWJsZTEuRGF0YU9uUm93cyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICB2YXIgY2hhcnQgPSB3c1Bpdm90LkRyYXdpbmdzLkFkZENoYXJ0KCJQaXZvdENoYXJ0IiwgZUNoYXJ0VHlwZS5QaWUsIHBpdm90VGFibGUxKTsKKyAgICAgICAgICAgICAgICBjaGFydC5TZXRQb3NpdGlvbigxLCAwLCA0LCAwKTsKKyAgICAgICAgICAgICAgICBjaGFydC5TZXRTaXplKDYwMCwgNDAwKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIHdzUGl2b3QyID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdERhdGVHcnAiKTsKKyAgICAgICAgICAgICAgICB2YXIgcGl2b3RUYWJsZTIgPSB3c1Bpdm90Mi5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDIuQ2VsbHNbIkEzIl0sIGRhdGFSYW5nZSwgIlBlckVtcGxvZWVBbmRRdWFydGVyIik7CisKKyAgICAgICAgICAgICAgICBwaXZvdFRhYmxlMi5Sb3dGaWVsZHMuQWRkKHBpdm90VGFibGUyLkZpZWxkc1siTmFtZSJdKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL0FkZCBhIHJvd2ZpZWxkCisgICAgICAgICAgICAgICAgdmFyIHJvd0ZpZWxkID0gcGl2b3RUYWJsZTIuUm93RmllbGRzLkFkZChwaXZvdFRhYmxlMi5GaWVsZHNbIk9yZGVyRGF0ZSJdKTsKKyAgICAgICAgICAgICAgICAvL1RoaXMgaXMgYSBkYXRlIGZpZWxkIHNvIHdlIHdhbnQgdG8gZ3JvdXAgYnkgWWVhcnMgYW5kIHF1YXRlcnMuIFRoaXMgd2lsbCBjcmVhdGUgb25lIGFkZGl0aW9uYWwgZmllbGQgZm9yIHllYXJzLgorICAgICAgICAgICAgICAgIHJvd0ZpZWxkLkFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkuWWVhcnMgfCBlRGF0ZUdyb3VwQnkuUXVhcnRlcnMpOworICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBRdWF0ZXJzIGZpZWxkIGFuZCBjaGFuZ2UgdGhlIHRleHRzCisgICAgICAgICAgICAgICAgdmFyIHF1YXRlckZpZWxkID0gcGl2b3RUYWJsZTIuRmllbGRzLkdldERhdGVHcm91cEZpZWxkKGVEYXRlR3JvdXBCeS5RdWFydGVycyk7CisgICAgICAgICAgICAgICAgcXVhdGVyRmllbGQuSXRlbXNbMF0uVGV4dCA9ICI8IjsgLy9WYWx1ZXMgYmVsb3cgbWluIGRhdGUsIGJ1dCB3ZSB1c2UgYXV0byBzbyBpdHMgbm90IHVzZWQKKyAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1sxXS5UZXh0ID0gIlExIjsKKyAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1syXS5UZXh0ID0gIlEyIjsKKyAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1szXS5UZXh0ID0gIlEzIjsKKyAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1s0XS5UZXh0ID0gIlE0IjsKKyAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1s1XS5UZXh0ID0gIj4iOyAvL1ZhbHVlcyBhYm92ZSBtYXggZGF0ZSwgYnV0IHdlIHVzZSBhdXRvIHNvIGl0cyBub3QgdXNlZAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vQWRkIGEgcGFnZWZpZWxkCisgICAgICAgICAgICAgICAgdmFyIHBhZ2VGaWVsZCA9IHBpdm90VGFibGUyLlBhZ2VGaWVsZHMuQWRkKHBpdm90VGFibGUyLkZpZWxkc1siVGl0bGUiXSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9BZGQgdGhlIGRhdGEgZmllbGRzIGFuZCBmb3JtYXQgdGhlbQorICAgICAgICAgICAgICAgIGRhdGFGaWVsZCA9IHBpdm90VGFibGUyLkRhdGFGaWVsZHMuQWRkKHBpdm90VGFibGUyLkZpZWxkc1siU3ViVG90YWwiXSk7CisgICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICAgICAgZGF0YUZpZWxkID0gcGl2b3RUYWJsZTIuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTIuRmllbGRzWyJUYXgiXSk7CisgICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICAgICAgZGF0YUZpZWxkID0gcGl2b3RUYWJsZTIuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTIuRmllbGRzWyJGcmVpZ2h0Il0pOworICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5Gb3JtYXQgPSAiIywjIzAiOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vV2Ugd2FudCB0aGUgZGF0YWZpZWxkcyB0byBhcHBlYXIgaW4gY29sdW1ucworICAgICAgICAgICAgICAgIHBpdm90VGFibGUyLkRhdGFPblJvd3MgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHBjay5TYXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2FsZXNEVE8+IEdldFJhbmRvbURhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PFNhbGVzRFRPPiByZXQgPSBuZXcgTGlzdDxTYWxlc0RUTz4oKTsKKyAgICAgICAgICAgIHZhciBmaXJzdE5hbWVzID0gbmV3IHN0cmluZ1tdIHsiSm9obiIsICJHdW5uYXIiLCAiS2FybCIsICJBbGljZSJ9OworICAgICAgICAgICAgdmFyIGxhc3ROYW1lcyA9IG5ldyBzdHJpbmdbXSB7IlNtaXRoIiwgIkpvaGFuc3NvbiIsICJMaW5kZW1hbiJ9OworICAgICAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldC5BZGQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTYWxlc0RUTygpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0TmFtZSA9IGZpcnN0TmFtZXNbci5OZXh0KDQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExhc3ROYW1lID0gbGFzdE5hbWVzW3IuTmV4dCgzKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBPcmRlckRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAwMiwgMSwgMSkuQWRkRGF5cyhyLk5leHQoMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGU9IlNhbGVzIFJlcHJlc2VudGF0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1YlRvdGFsID0gci5OZXh0KDEwMCwgMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgVGF4ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyZWlnaHQgPSAwCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2FsZXNEVE8+IEdldERhdGFGcm9tU1FMKHN0cmluZyBzcWxTZXJ2ZXJOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgY29ubmVjdGlvblN0ciA9IHN0cmluZy5Gb3JtYXQoQCJzZXJ2ZXI9ezB9O2RhdGFiYXNlPUFkdmVudHVyZVdvcmtzO0ludGVncmF0ZWQgU2VjdXJpdHk9dHJ1ZTsiLCBzcWxTZXJ2ZXJOYW1lKTsKKyAgICAgICAgICAgIHZhciByZXQgPSBuZXcgTGlzdDxTYWxlc0RUTz4oKTsKKyAgICAgICAgICAgIC8vIGxldHMgY29ubmVjdCB0byB0aGUgQWR2ZW50dXJlV29ya3Mgc2FtcGxlIGRhdGFiYXNlIGZvciBzb21lIGRhdGEKKyAgICAgICAgICAgIHVzaW5nIChTcWxDb25uZWN0aW9uIHNxbENvbm4gPSBuZXcgU3FsQ29ubmVjdGlvbihjb25uZWN0aW9uU3RyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcWxDb25uLk9wZW4oKTsKKyAgICAgICAgICAgICAgICB1c2luZyAoU3FsQ29tbWFuZCBzcWxDbWQgPSBuZXcgU3FsQ29tbWFuZCgic2VsZWN0IGguVGl0bGUsIEZpcnN0TmFtZSwgTWlkZGxlTmFtZSwgTGFzdE5hbWUsIFN1YlRvdGFsLCBPcmRlckRhdGUsIFRheEFtdCwgRnJlaWdodCwgVG90YWxEdWUgIGZyb20gU2FsZXMuU2FsZXNPcmRlckhlYWRlciBzIGlubmVyIGpvaW4gSHVtYW5SZXNvdXJjZXMuRW1wbG95ZWUgaCBvbiBzLlNhbGVzUGVyc29uSUQgPSBoLkVtcGxveWVlSUQgaW5uZXIgam9pbiBQZXJzb24uQ29udGFjdCBjIG9uIGMuQ29udGFjdElEID0gaC5Db250YWN0SUQgb3JkZXIgYnkgTGFzdE5hbWUsIEZpcnN0TmFtZSwgTWlkZGxlTmFtZTsiLCBzcWxDb25uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTcWxEYXRhUmVhZGVyIHNxbFJlYWRlciA9IHNxbENtZC5FeGVjdXRlUmVhZGVyKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBkYXRhIGFuZCBmaWxsIHJvd3MgNSBvbndhcmRzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3FsUmVhZGVyLlJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuQWRkKG5ldyBTYWxlc0RUTworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPSBzcWxSZWFkZXJbIlRpdGxlIl0uVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyc3ROYW1lPXNxbFJlYWRlclsiRmlyc3ROYW1lIl0uVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlkZGxlTmFtZT1zcWxSZWFkZXJbIk1pZGRsZU5hbWUiXS5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0TmFtZT1zcWxSZWFkZXJbIkxhc3ROYW1lIl0uVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJEYXRlID0gKERhdGVUaW1lKXNxbFJlYWRlclsiT3JkZXJEYXRlIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YlRvdGFsID0gKGRlY2ltYWwpc3FsUmVhZGVyWyJTdWJUb3RhbCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXg9KGRlY2ltYWwpc3FsUmVhZGVyWyJUYXhBbXQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlaWdodD0oZGVjaW1hbClzcWxSZWFkZXJbIkZyZWlnaHQiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTMuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhYzgzNQotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGUxMy5jcwpAQCAtMCwwICsxLDE4MSBAQAor77u/LyogCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICogCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKiAKKyAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKKyAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCisgKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgorICogCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICogIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4gICAgICAgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDUtMDMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5EYXRhOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZTsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOworCituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBjbGFzcyBzaG93cyBob3cgdG8gbG9hZCBkYXRhIGluIGEgZmV3IHdheXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2FtcGxlMTMKKyAgICB7CisgICAgICAgIHB1YmxpYyBjbGFzcyBGaWxlRFRPCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgbG9uZyBTaXplIHtnZXQ7c2V0O30KKyAgICAgICAgICAgIHB1YmxpYyBEYXRlVGltZSBDcmVhdGVkIHtnZXQ7c2V0O30KKyAgICAgICAgICAgIHB1YmxpYyBEYXRlVGltZSBMYXN0TW9kaWZpZWQge2dldDtzZXQ7fQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0RpcmVjdG9yeT1mYWxzZTsgICAgICAgICAgICAgICAgICAvL1RoaXMgaXMgYSBmaWVsZCB2YXJpYWJsZQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoSXNEaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZSArICJcdDxEaXI+IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUgKyAiXHQiICsgU2l6ZS5Ub1N0cmluZygiIywjIzAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUnVuU2FtcGxlMTMoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7CisKKyAgICAgICAgICAgIC8vQ3JlYXRlIGEgZGF0YXRhYmxlIHdpdGggdGhlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyBmcm9tIHRoZSByb290IGRpcmVjdG9yeS4uLgorICAgICAgICAgICAgRGF0YVRhYmxlIGR0ID0gR2V0RGF0YVRhYmxlKG91dHB1dERpci5Sb290KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIHdzRHQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZyb21EYXRhVGFibGUiKTsKKworICAgICAgICAgICAgLy9Mb2FkIHRoZSBkYXRhdGFibGUgYW5kIHNldCB0aGUgbnVtYmVyIGZvcm1hdHMuLi4KKyAgICAgICAgICAgIHdzRHQuQ2VsbHNbIkExIl0uTG9hZEZyb21EYXRhVGFibGUoZHQsIHRydWUsIFRhYmxlU3R5bGVzLk1lZGl1bTkpOworICAgICAgICAgICAgd3NEdC5DZWxsc1syLCAyLCBkdC5Sb3dzLkNvdW50ICsgMSwgMl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICB3c0R0LkNlbGxzWzIsIDMsIGR0LlJvd3MuQ291bnQgKyAxLCA0XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tLWRkLXl5IjsKKyAgICAgICAgICAgIHdzRHQuQ2VsbHNbd3NEdC5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKKworICAgICAgICAgICAgLy9TZWxlY3QgTmFtZSBhbmQgQ3JlYXRlZC10aW1lLi4uCisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbiA9IChmcm9tIHJvdyBpbiBkdC5TZWxlY3QoKSBzZWxlY3QgbmV3IHtOYW1lPXJvd1siTmFtZSJdLCBDcmVhdGVkX3RpbWU9KERhdGVUaW1lKXJvd1siQ3JlYXRlZCJdfSk7CisKKyAgICAgICAgICAgIHZhciB3c0VudW0gPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZyb21Bbm9ueW1vdXMiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9Mb2FkIHRoZSBjb2xsZWN0aW9uIHN0YXJ0aW5nIGZyb20gY2VsbCBBMS4uLgorICAgICAgICAgICAgd3NFbnVtLkNlbGxzWyJBMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihjb2xsZWN0aW9uLCB0cnVlLCBUYWJsZVN0eWxlcy5NZWRpdW05KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9BZGQgc29tZSBmb3JtYXRpbmcuLi4KKyAgICAgICAgICAgIHdzRW51bS5DZWxsc1syLCAyLCBkdC5Sb3dzLkNvdW50LTEsIDJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAibW0tZGQteXkiOworICAgICAgICAgICAgd3NFbnVtLkNlbGxzW3dzRW51bS5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKKworICAgICAgICAgICAgLy9Mb2FkIGEgbGlzdCBvZiBGaWxlRFRPIG9iamVjdHMgZnJvbSB0aGUgZGF0YXRhYmxlLi4uCisgICAgICAgICAgICB2YXIgd3NMaXN0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGcm9tTGlzdCIpOworICAgICAgICAgICAgTGlzdDxGaWxlRFRPPiBsaXN0ID0gKGZyb20gcm93IGluIGR0LlNlbGVjdCgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXcgRmlsZURUTyB7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPSByb3dbIk5hbWUiXS5Ub1N0cmluZygpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplID0gcm93WyJTaXplIl0uR2V0VHlwZSgpID09IHR5cGVvZihsb25nKSA/IChsb25nKXJvd1siU2l6ZSJdIDogMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZCA9IChEYXRlVGltZSlyb3dbIkNyZWF0ZWQiXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdE1vZGlmaWVkID0gKERhdGVUaW1lKXJvd1siTW9kaWZpZWQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0RpcmVjdG9yeSA9IChyb3dbIlNpemUiXT09REJOdWxsLlZhbHVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5Ub0xpc3Q8RmlsZURUTz4oKTsKKworICAgICAgICAgICAgLy9Mb2FkIGZpbGVzIG9yZGVyZWQgYnkgc2l6ZS4uLgorICAgICAgICAgICAgd3NMaXN0LkNlbGxzWyJBMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihmcm9tIGZpbGUgaW4gbGlzdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJieSBmaWxlLlNpemUgZGVzY2VuZGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgZmlsZS5Jc0RpcmVjdG9yeSA9PSBmYWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGZpbGUsIHRydWUsIFRhYmxlU3R5bGVzLk1lZGl1bTkpOworCisgICAgICAgICAgICB3c0xpc3QuQ2VsbHNbMiwgMiwgZHQuUm93cy5Db3VudCArIDEsIDJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOworICAgICAgICAgICAgd3NMaXN0LkNlbGxzWzIsIDMsIGR0LlJvd3MuQ291bnQgKyAxLCA0XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tLWRkLXl5IjsKKworCisgICAgICAgICAgICAvL0xvYWQgZGlyZWN0b3JpZXMgb3JkZXJlZCBieSBOYW1lLi4uCisgICAgICAgICAgICB3c0xpc3QuQ2VsbHNbIkYxIl0uTG9hZEZyb21Db2xsZWN0aW9uKGZyb20gZmlsZSBpbiBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyYnkgZmlsZS5OYW1lIGFzY2VuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBmaWxlLklzRGlyZWN0b3J5ID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5ldyB7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZT1maWxlLk5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZCA9IGZpbGUuQ3JlYXRlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0X21vZGlmaWVkPWZpbGUuTGFzdE1vZGlmaWVkfSwgLy9Vc2UgYW4gdW5kZXJzY29yZSBpbiB0aGUgcHJvcGVydHkgbmFtZSB0byBnZXQgYSBzcGFjZSBpbiB0aGUgdGl0bGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIFRhYmxlU3R5bGVzLk1lZGl1bTExKTsKKworICAgICAgICAgICAgd3NMaXN0LkNlbGxzWzIsIDcsIGR0LlJvd3MuQ291bnQgKyAxLCA4XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tLWRkLXl5IjsKKworICAgICAgICAgICAgLy9Mb2FkIHRoZSBsaXN0IHVzaW5nIGEgc3BlY2lmaWVkIGFycmF5IG9mIE1lbWJlckluZm8gb2JqZWN0cy4gUHJvcGVydGllcywgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgICAgICB2YXIgcm5nID0gd3NMaXN0LkNlbGxzWyJKMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVN0eWxlcy5NZWRpdW0xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lbWJlckluZm9bXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YoRmlsZURUTykuR2V0UHJvcGVydHkoIk5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZihGaWxlRFRPKS5HZXRGaWVsZCgiSXNEaXJlY3RvcnkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZihGaWxlRFRPKS5HZXRNZXRob2QoIlRvU3RyaW5nIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIHdzTGlzdC5UYWJsZXMuR2V0RnJvbVJhbmdlKHJuZykuQ29sdW1uc1syXS5OYW1lID0gIkRlc2NyaXB0aW9uIjsKKworICAgICAgICAgICAgd3NMaXN0LkNlbGxzW3dzTGlzdC5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKKworICAgICAgICAgICAgLy8uLi5hbmQgc2F2ZQorICAgICAgICAgICAgdmFyIGZpID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXFNhbXBsZTEzLnhsc3giKTsKKyAgICAgICAgICAgIGlmIChmaS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmkuRGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwY2suU2F2ZUFzKGZpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIERhdGFUYWJsZSBHZXREYXRhVGFibGUoRGlyZWN0b3J5SW5mbyBkaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFUYWJsZSBkdCA9IG5ldyBEYXRhVGFibGUoIlJvb3REaXIiKTsKKyAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJOYW1lIiwgdHlwZW9mKHN0cmluZykpOworICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIlNpemUiLCB0eXBlb2YobG9uZykpOworICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkNyZWF0ZWQiLCB0eXBlb2YoRGF0ZVRpbWUpKTsKKyAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJNb2RpZmllZCIsIHR5cGVvZihEYXRlVGltZSkpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gZGlyLkdldERpcmVjdG9yaWVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHJvdz1kdC5OZXdSb3coKTsKKyAgICAgICAgICAgICAgICByb3dbIk5hbWUiXT1pdGVtLk5hbWU7CisgICAgICAgICAgICAgICAgcm93WyJDcmVhdGVkIl09aXRlbS5DcmVhdGlvblRpbWU7CisgICAgICAgICAgICAgICAgcm93WyJNb2RpZmllZCJdPWl0ZW0uTGFzdFdyaXRlVGltZTsKKworICAgICAgICAgICAgICAgIGR0LlJvd3MuQWRkKHJvdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBkaXIuR2V0RmlsZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcm93ID0gZHQuTmV3Um93KCk7CisgICAgICAgICAgICAgICAgcm93WyJOYW1lIl0gPSBpdGVtLk5hbWU7CisgICAgICAgICAgICAgICAgcm93WyJTaXplIl0gPSBpdGVtLkxlbmd0aDsKKyAgICAgICAgICAgICAgICByb3dbIkNyZWF0ZWQiXSA9IGl0ZW0uQ3JlYXRpb25UaW1lOworICAgICAgICAgICAgICAgIHJvd1siTW9kaWZpZWQiXSA9IGl0ZW0uTGFzdFdyaXRlVGltZTsKKworICAgICAgICAgICAgICAgIGR0LlJvd3MuQWRkKHJvdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTQuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiYWNlZgotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGUxNC5jcwpAQCAtMCwwICsxLDQ1MSBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeWFsIFNlYWd1bGwJCQkJQWRkZWQJCQkJCQkJMjAxMi0wNC0wMworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKK3sKKyAgY2xhc3MgU2FtcGxlMTQKKyAgeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2FtcGxlIDE0IC0gQ29uZGl0aW9uYWwgZm9ybWF0dGluZyBleGFtcGxlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSdW5TYW1wbGUxNChEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICB7CisgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTE0Lnhsc3giKTsKKworICAgICAgaWYgKG5ld0ZpbGUuRXhpc3RzKQorICAgICAgeworICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKKyAgICAgICAgbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxNC54bHN4Iik7CisgICAgICB9CisKKyAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCisgICAgICB7CisgICAgICAgIC8vIGFkZCBhIG5ldyB3b3Jrc2hlZXQgdG8gdGhlIGVtcHR5IHdvcmtib29rCisgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbmRpdGlvbmFsIEZvcm1hdHRpbmciKTsKKworICAgICAgICAvLyBDcmVhdGUgNCBjb2x1bW5zIG9mIHNhbXBsZXMgZGF0YQorICAgICAgICBmb3IgKGludCBjb2wgPSAxOyBjb2wgPCAxMDsgY29sKyspCisgICAgICAgIHsKKyAgICAgICAgICAvLyBBZGQgdGhlIGhlYWRlcnMKKyAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgY29sXS5WYWx1ZSA9ICJTYW1wbGUgIiArIGNvbDsKKworICAgICAgICAgIGZvciAoaW50IHJvdyA9IDI7IHJvdyA8IDIxOyByb3crKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAvLyBBZGQgc29tZSBpdGVtcy4uLgorICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzW3JvdywgY29sXS5WYWx1ZSA9IHJvdzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIFR3b0NvbG9yU2NhbGUgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBleGFtcGxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRXhjZWxBZGRyZXNzIGNmQWRkcmVzczEgPSBuZXcgRXhjZWxBZGRyZXNzKCJBMjpBMTAiKTsKKyAgICAgICAgdmFyIGNmUnVsZTEgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFR3b0NvbG9yU2NhbGUoY2ZBZGRyZXNzMSk7CisKKyAgICAgICAgLy8gTm93LCBsZXRzIGNoYW5nZSBzb21lIHByb3BlcnRpZXM6CisgICAgICAgIGNmUnVsZTEuTG93VmFsdWUuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07CisgICAgICAgIGNmUnVsZTEuTG93VmFsdWUuVmFsdWUgPSA0OworICAgICAgICBjZlJ1bGUxLkxvd1ZhbHVlLkNvbG9yID0gQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKCIjRkZGRkVCODQiKTsKKyAgICAgICAgY2ZSdWxlMS5IaWdoVmFsdWUuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOworICAgICAgICBjZlJ1bGUxLkhpZ2hWYWx1ZS5Gb3JtdWxhID0gIklGKCRHJDE9XCJBPC94OiYnY2ZSdWxlPlwiLDEsNSkiOworICAgICAgICBjZlJ1bGUxLlN0b3BJZlRydWUgPSB0cnVlOworICAgICAgICBjZlJ1bGUxLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisKKyAgICAgICAgLy8gQnV0IG90aGVycyB5b3UgY2FuJ3QgKHJlYWRvbmx5KQorICAgICAgICAvLyBjZlJ1bGUxLlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGU7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBUaHJlZUNvbG9yU2NhbGUgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBleGFtcGxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRXhjZWxBZGRyZXNzIGNmQWRkcmVzczIgPSBuZXcgRXhjZWxBZGRyZXNzKDIsIDIsIDEwLCAyKTsgIC8vPSJCMjpCMTAiCisgICAgICAgIHZhciBjZlJ1bGUyID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaHJlZUNvbG9yU2NhbGUoY2ZBZGRyZXNzMik7CisKKyAgICAgICAgLy8gQ2hhbmdpbmcgc29tZSBwcm9wZXJ0aWVzIGFnYWluCisgICAgICAgIGNmUnVsZTIuUHJpb3JpdHkgPSAxOworICAgICAgICBjZlJ1bGUyLk1pZGRsZVZhbHVlLlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudGlsZTsKKyAgICAgICAgY2ZSdWxlMi5NaWRkbGVWYWx1ZS5WYWx1ZSA9IDMwOworICAgICAgICBjZlJ1bGUyLlN0b3BJZlRydWUgPSB0cnVlOworCisgICAgICAgIC8vIFlvdSBjYW4gYWNjZXNzIGEgcnVsZSBieSBpdHMgUHJpb3JpdHkKKyAgICAgICAgdmFyIGNmUnVsZTJQcmlvcml0eSA9IGNmUnVsZTIuUHJpb3JpdHk7CisgICAgICAgIHZhciBjZlJ1bGUyXzEgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJ1bGVzQnlQcmlvcml0eShjZlJ1bGUyUHJpb3JpdHkpOworCisgICAgICAgIC8vIEFuZCB5b3UgY2FuIGV2ZW4gY2hhbmdlIHRoZSBydWxlJ3MgQWRkcmVzcworICAgICAgICBjZlJ1bGUyXzEuQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoIloxOlozIik7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBBZGRpbmcgYW5vdGhlciBUaHJlZUNvbG9yU2NhbGUgaW4gYSBkaWZmZXJlbnQgd2F5IChvYnNlcnZlIHRoYXQgd2UgYXJlCisgICAgICAgIC8vIHBvaW50aW5nIHRvIHRoZSBzYW1lIHJhbmdlIGFzIHRoZSBmaXJzdCBydWxlIHdlIGVudGVyZWQuIEV4Y2VsIGFsbG93cyBpdCB0bworICAgICAgICAvLyBoYXBwZW4gYW5kIGdyb3VwIHRoZSBydWxlcyBpbiBvbmUgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gbm9kZSkKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMyA9IHdvcmtzaGVldC5DZWxsc1tjZkFkZHJlc3MxLkFkZHJlc3NdLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaHJlZUNvbG9yU2NhbGUoKTsKKyAgICAgICAgY2ZSdWxlMy5Mb3dWYWx1ZS5Db2xvciA9IENvbG9yLkxlbW9uQ2hpZmZvbjsKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ2hhbmdlIHRoZSBydWxlcyBwcmlvcml0aWVzIHRvIGNoYW5nZSB0aGVpciBleGVjdXRpb24gb3JkZXIKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBjZlJ1bGUzLlByaW9yaXR5ID0gMTsKKyAgICAgICAgY2ZSdWxlMS5Qcmlvcml0eSA9IDI7CisgICAgICAgIGNmUnVsZTIuUHJpb3JpdHkgPSAzOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGFuIEFib3ZlIEF2ZXJhZ2UgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGU1ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZUF2ZXJhZ2UoCisgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKKyAgICAgICAgY2ZSdWxlNS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICBjZlJ1bGU1LlN0eWxlLkZvbnQuQ29sb3IuQ29sb3IgPSBDb2xvci5SZWQ7CisgICAgICAgIGNmUnVsZTUuU3R5bGUuRm9udC5TdHJpa2UgPSB0cnVlOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGFuIEFib3ZlIE9yIEVxdWFsIEF2ZXJhZ2UgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGU2ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZU9yRXF1YWxBdmVyYWdlKAorICAgICAgICAgIG5ldyBFeGNlbEFkZHJlc3MoIkIxMTpCMjAiKSk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBCZWxvdyBBdmVyYWdlIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlNyA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dBdmVyYWdlKAorICAgICAgICAgIG5ldyBFeGNlbEFkZHJlc3MoIkIxMTpCMjAiKSk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBCZWxvdyBPciBFcXVhbCBBdmVyYWdlIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlOCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dPckVxdWFsQXZlcmFnZSgKKyAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgQWJvdmUgU3RkRGV2IHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlOSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQWJvdmVTdGREZXYoCisgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKKyAgICAgICAgICBjZlJ1bGU5LlN0ZERldiA9IDA7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBCZWxvdyBTdGREZXYgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUxMCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dTdGREZXYoCisgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKKworICAgICAgICBjZlJ1bGUxMC5TdGREZXYgPSAyOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgQm90dG9tIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMTEgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJvdHRvbSgKKyAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOworCisgICAgICAgIGNmUnVsZTExLlJhbmsgPSA0OworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgQm90dG9tIFBlcmNlbnQgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUxMiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQm90dG9tUGVyY2VudCgKKyAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOworCisgICAgICAgIGNmUnVsZTEyLlJhbmsgPSAxNTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIFRvcCBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTEzID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb3AoCisgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIFRvcCBQZXJjZW50IHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMTQgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvcFBlcmNlbnQoCisgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKKyAgICAgICAgCisgICAgICAgIGNmUnVsZTE0LlN0eWxlLkJvcmRlci5MZWZ0LlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOworICAgICAgICBjZlJ1bGUxNC5TdHlsZS5Cb3JkZXIuTGVmdC5Db2xvci5UaGVtZSA9IDM7CisgICAgICAgIGNmUnVsZTE0LlN0eWxlLkJvcmRlci5Cb3R0b20uU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLkRhc2hEb3Q7CisgICAgICAgIGNmUnVsZTE0LlN0eWxlLkJvcmRlci5Cb3R0b20uQ29sb3IuSW5kZXg9ODsKKyAgICAgICAgY2ZSdWxlMTQuU3R5bGUuQm9yZGVyLlJpZ2h0LlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOworICAgICAgICBjZlJ1bGUxNC5TdHlsZS5Cb3JkZXIuUmlnaHQuQ29sb3IuQ29sb3I9Q29sb3IuQmx1ZTsKKyAgICAgICAgY2ZSdWxlMTQuU3R5bGUuQm9yZGVyLlRvcC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuSGFpcjsKKyAgICAgICAgY2ZSdWxlMTQuU3R5bGUuQm9yZGVyLlRvcC5Db2xvci5BdXRvPXRydWU7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBMYXN0IDcgRGF5cyBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgRXhjZWxBZGRyZXNzIHRpbWVQZXJpb2RBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygiRDIxOkczNCBDMTE6QzIwIik7CisgICAgICAgIHZhciBjZlJ1bGUxNSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGFzdDdEYXlzKAorICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKKworICAgICAgICBjZlJ1bGUxNS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuTGlnaHRUcmVsbGlzOworICAgICAgICBjZlJ1bGUxNS5TdHlsZS5GaWxsLlBhdHRlcm5Db2xvci5Db2xvciA9IENvbG9yLkJ1cmx5V29vZDsKKyAgICAgICAgY2ZSdWxlMTUuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuQ29sb3IgPSBDb2xvci5MaWdodEN5YW47CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBMYXN0IE1vbnRoIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMTYgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExhc3RNb250aCgKKyAgICAgICAgICB0aW1lUGVyaW9kQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMTYuU3R5bGUuTnVtYmVyRm9ybWF0LkZvcm1hdCA9ICJZWVlZIjsKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBMYXN0IFdlZWsgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUxNyA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGFzdFdlZWsoCisgICAgICAgICAgdGltZVBlcmlvZEFkZHJlc3MpOworICAgICAgICBjZlJ1bGUxNy5TdHlsZS5OdW1iZXJGb3JtYXQuRm9ybWF0ID0gIllZWVkiOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgTmV4dCBNb250aCBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTE4ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROZXh0TW9udGgoCisgICAgICAgICAgdGltZVBlcmlvZEFkZHJlc3MpOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgTmV4dCBXZWVrIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMTkgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5leHRXZWVrKAorICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIFRoaXMgTW9udGggcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUyMCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVGhpc01vbnRoKAorICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIFRoaXMgV2VlayBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTIxID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaGlzV2VlaygKKyAgICAgICAgICB0aW1lUGVyaW9kQWRkcmVzcyk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBUb2RheSBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTIyID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb2RheSgKKyAgICAgICAgICB0aW1lUGVyaW9kQWRkcmVzcyk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBUb21vcnJvdyBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTIzID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb21vcnJvdygKKyAgICAgICAgICB0aW1lUGVyaW9kQWRkcmVzcyk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBZZXN0ZXJkYXkgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUyNCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkWWVzdGVyZGF5KAorICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIEJlZ2luc1dpdGggcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEV4Y2VsQWRkcmVzcyBjZWxsSXNBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygiRTExOkUyMCIpOworICAgICAgICB2YXIgY2ZSdWxlMjUgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJlZ2luc1dpdGgoCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMjUuVGV4dCA9ICJTZWFyY2hNZSI7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBCZXR3ZWVuIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMjYgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJldHdlZW4oCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMjYuRm9ybXVsYSA9ICJJRihFMTE+NSwxMCwyMCkiOworICAgICAgICBjZlJ1bGUyNi5Gb3JtdWxhMiA9ICJJRihFMTE+NSwzMCw1MCkiOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgQ29udGFpbnNCbGFua3MgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUyNyA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQ29udGFpbnNCbGFua3MoCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBDb250YWluc0Vycm9ycyBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTI4ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc0Vycm9ycygKKyAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIENvbnRhaW5zVGV4dCBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTI5ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc1RleHQoCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMjkuVGV4dCA9ICJNZSI7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBEdXBsaWNhdGVWYWx1ZXMgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUzMCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRHVwbGljYXRlVmFsdWVzKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGFuIEVuZHNXaXRoIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMzEgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEVuZHNXaXRoKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTMxLlRleHQgPSAiRW5kVGV4dCI7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYW4gRXF1YWwgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUzMiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwoCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMzIuRm9ybXVsYSA9ICI2IjsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhbiBFeHByZXNzaW9uIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMzMgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEV4cHJlc3Npb24oCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMzMuRm9ybXVsYSA9ICJFMTE9RTEyIjsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIEdyZWF0ZXJUaGFuIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMzQgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEdyZWF0ZXJUaGFuKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTM0LkZvcm11bGEgPSAiU0UoRTExPDEwLDEwLDY1KSI7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBHcmVhdGVyVGhhbk9yRXF1YWwgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUzNSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkR3JlYXRlclRoYW5PckVxdWFsKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTM1LkZvcm11bGEgPSAiMzUiOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgTGVzc1RoYW4gcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUzNiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGVzc1RoYW4oCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgY2ZSdWxlMzYuRm9ybXVsYSA9ICIzNiI7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBMZXNzVGhhbk9yRXF1YWwgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGUzNyA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGVzc1RoYW5PckVxdWFsKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTM3LkZvcm11bGEgPSAiMzciOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgTm90QmV0d2VlbiBydWxlCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgdmFyIGNmUnVsZTM4ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RCZXR3ZWVuKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTM4LkZvcm11bGEgPSAiMzMzIjsKKyAgICAgICAgY2ZSdWxlMzguRm9ybXVsYTIgPSAiOTk5IjsKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENyZWF0ZSBhIE5vdENvbnRhaW5zQmxhbmtzIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlMzkgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdENvbnRhaW5zQmxhbmtzKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGEgTm90Q29udGFpbnNFcnJvcnMgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGU0MCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90Q29udGFpbnNFcnJvcnMoCisgICAgICAgICAgY2VsbElzQWRkcmVzcyk7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBDcmVhdGUgYSBOb3RDb250YWluc1RleHQgcnVsZQorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHZhciBjZlJ1bGU0MSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90Q29udGFpbnNUZXh0KAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTQxLlRleHQgPSAiTm90TWUiOworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gQ3JlYXRlIGFuIE5vdEVxdWFsIHJ1bGUKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICB2YXIgY2ZSdWxlNDIgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdEVxdWFsKAorICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOworCisgICAgICAgIGNmUnVsZTQyLkZvcm11bGEgPSAiMTQiOworCisgICAgICAgIEV4Y2VsQWRkcmVzcyBjZkFkZHJlc3M0MyA9IG5ldyBFeGNlbEFkZHJlc3MoIkcyOkcxMCIpOworICAgICAgICB2YXIgY2ZSdWxlNDMgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRocmVlSWNvblNldChjZkFkZHJlc3M0MywgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZS5UcmFmZmljTGlnaHRzMSk7CisKKyAgICAgICAgRXhjZWxBZGRyZXNzIGNmQWRkcmVzczQ0ID0gbmV3IEV4Y2VsQWRkcmVzcygiSDI6SDEwIik7CisgICAgICAgIHZhciBjZlJ1bGU0NCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRGF0YWJhcihjZkFkZHJlc3M0NCwgQ29sb3IuRGFya0JsdWUpOworICAgICAgICAKKyAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBSZW1vdmluZyBDb25kaXRpb25hbCBGb3JtYXR0aW5nIHJ1bGVzCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIFJlbW92ZSBvbmUgUnVsZSBieSBpdHMgb2JqZWN0CisgICAgICAgIC8vd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5SZW1vdmUoY2ZSdWxlMSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIG9uZSBSdWxlIGJ5IGluZGV4CisgICAgICAgIC8vd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5SZW1vdmVBdCgxKTsKKworICAgICAgICAvLyBSZW1vdmUgb25lIFJ1bGUgYnkgaXRzIFByaW9yaXR5CisgICAgICAgIC8vd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5SZW1vdmVCeVByaW9yaXR5KDIpOworCisgICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIFJ1bGVzCisgICAgICAgIC8vd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5SZW1vdmVBbGwoKTsKKworICAgICAgICAvLyBzZXQgc29tZSBkb2N1bWVudCBwcm9wZXJ0aWVzCisgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5UaXRsZSA9ICJDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkF1dGhvciA9ICJFeWFsIFNlYWd1bGwiOworICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQ29tbWVudHMgPSAiVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBhZGQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyB0byBhbiBFeGNlbCAyMDA3IHdvcmtzaGVldCB1c2luZyBFUFBsdXMiOworCisgICAgICAgIC8vIHNldCBzb21lIGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMKKyAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkNoZWNrZWQgYnkiLCAiRXlhbCBTZWFndWxsIik7CisgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJBc3NlbWJseU5hbWUiLCAiRVBQbHVzIik7CisKKyAgICAgICAgLy8gc2F2ZSBvdXIgbmV3IHdvcmtib29rIGFuZCB3ZSBhcmUgZG9uZSEKKyAgICAgICAgcGFja2FnZS5TYXZlKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXdGaWxlLkZ1bGxOYW1lOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTE1LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTE1LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjA5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvU2FtcGxlMTUuY3MKQEAgLTAsMCArMSwyODMgQEAKK++7vy8qIAorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqIAorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqICBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEyLTA1LTAxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7CituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworICAgIGNsYXNzIFNhbXBsZTE1CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVkJBU2FtcGxlKERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NyZWF0ZSBhIG1hY3JvLWVuYWJsZWQgd29ya2Jvb2sgZnJvbSBzY3JhdGNoLgorICAgICAgICAgICAgVkJBU2FtcGxlMShvdXRwdXREaXIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL09wZW4gU2FtcGxlIDEgYW5kIGFkZCBjb2RlIHRvIGNoYW5nZSB0aGUgY2hhcnQgdG8gYSBidWJibGUgY2hhcnQuCisgICAgICAgICAgICBWQkFTYW1wbGUyKG91dHB1dERpcik7CisKKyAgICAgICAgICAgIC8vU2ltcGxlIGJhdHRsZXNoaXBzIGdhbWUgZnJvbSBzY3JhdGNoLgorICAgICAgICAgICAgVkJBU2FtcGxlMyhvdXRwdXREaXIpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVkJBU2FtcGxlMShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKworICAgICAgICAgICAgLy9BZGQgYSB3b3Jrc2hlZXQuCisgICAgICAgICAgICB2YXIgd3M9cGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJWQkEgU2FtcGxlIik7CisgICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRTaGFwZSgiVkJBU2FtcGxlUmVjdCIsIGVTaGFwZVN0eWxlLlJvdW5kUmVjdCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vQ3JlYXRlIGEgdmJhIHByb2plY3QgICAgICAgICAgICAgCisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworCisgICAgICAgICAgICAvL05vdyBhZGQgc29tZSBjb2RlIHRvIHVwZGF0ZSB0aGUgdGV4dCBvZiB0aGUgc2hhcGUuLi4KKyAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIlByaXZhdGUgU3ViIFdvcmtib29rX09wZW4oKSIpOworICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiICAgIFtWQkEgU2FtcGxlXS5TaGFwZXMoXCJWQkFTYW1wbGVSZWN0XCIpLlRleHRFZmZlY3QuVGV4dCA9IFwiVGhpcyB0ZXh0IGlzIHNldCBmcm9tIFZCQSFcIiIpOworICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiRW5kIFN1YiIpOworICAgICAgICAgICAgcGNrLldvcmtib29rLkNvZGVNb2R1bGUuQ29kZSA9IHNiLlRvU3RyaW5nKCk7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8vQW5kIFNhdmUgYXMgeGxzbQorICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMTUtMS54bHNtIikpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVkJBU2FtcGxlMihEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeworICAgICAgICAgICAgLy9PcGVuIFNhbXBsZSAxIGFnYWluCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMS54bHN4IikpOworICAgICAgICAgICAgLy9DcmVhdGUgYSB2YmEgcHJvamVjdCAgICAgICAgICAgICAKKyAgICAgICAgICAgIHBjay5Xb3JrYm9vay5DcmVhdGVWQkFQcm9qZWN0KCk7CisKKyAgICAgICAgICAgIC8vTm93IGFkZCBzb21lIGNvZGUgdGhhdCBjcmVhdGVzIGEgYnViYmxlIGNoYXJ0Li4uCisgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJQdWJsaWMgU3ViIENyZWF0ZUJ1YmJsZUNoYXJ0KCkiKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIkRpbSBjbyBBcyBDaGFydE9iamVjdCIpOworICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiU2V0IGNvID0gSW52ZW50b3J5LkNoYXJ0T2JqZWN0cy5BZGQoMTAsIDEwMCwgNDAwLCAyMDApIik7CisgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJjby5DaGFydC5TZXRTb3VyY2VEYXRhIFNvdXJjZTo9UmFuZ2UoXCInSW52ZW50b3J5JyEkQiQxOiRFJDVcIikiKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoImNvLkNoYXJ0LkNoYXJ0VHlwZSA9IHhsQnViYmxlM0RFZmZlY3QgICAgICAgICAnQWRkIGEgYnViYmxlY2hhcnQiKTsKKyAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIkVuZCBTdWIiKTsKKworICAgICAgICAgICAgLy9DcmVhdGUgYSBuZXcgbW9kdWxlIGFuZCBzZXQgdGhlIGNvZGUKKyAgICAgICAgICAgIHZhciBtb2R1bGUgPSBwY2suV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzLkFkZE1vZHVsZSgiRVBQbHVzR2VuZXJhdGVkQ29kZSIpOworICAgICAgICAgICAgbW9kdWxlLkNvZGUgPSBzYi5Ub1N0cmluZygpOworCisgICAgICAgICAgICAvL0NhbGwgdGhlIG5ld2x5IGNyZWF0ZWQgc3ViIGZyb20gdGhlIHdvcmtib29rIG9wZW4gZXZlbnQKKyAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUgPSAiUHJpdmF0ZSBTdWIgV29ya2Jvb2tfT3BlbigpXHJcbkNyZWF0ZUJ1YmJsZUNoYXJ0XHJcbkVuZCBTdWIiOworCisgICAgICAgICAgICAvL09wdGlvbmFsbHksIFNpZ24gdGhlIGNvZGUgd2l0aCB5b3VyIGNvbXBhbnkgY2VydGlmaWNhdGUuCisgICAgICAgICAgICAvKiAgICAgICAgICAgIAorICAgICAgICAgICAgWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZUxvY2F0aW9uLkN1cnJlbnRVc2VyKTsKKyAgICAgICAgICAgIHN0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsKKyAgICAgICAgICAgIHBjay5Xb3JrYm9vay5WYmFQcm9qZWN0LlNpZ25hdHVyZS5DZXJ0aWZpY2F0ZSA9IHN0b3JlLkNlcnRpZmljYXRlc1swXTsKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vQW5kIFNhdmUgYXMgeGxzbQorICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMTUtMi54bHNtIikpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVkJBU2FtcGxlMyhEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeworICAgICAgICAgICAgLy9Ob3csIGxldHMgZG8gc29tZXRoaW5nIGEgbGl0dGxlIGJpdCBtb3JlIGZ1bi4KKyAgICAgICAgICAgIC8vV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIHNpbXBsZSBiYXR0bGVzaGlwcyBnYW1lIGZyb20gc2NyYXRjaC4KKworICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKKworICAgICAgICAgICAgLy9BZGQgYSB3b3Jrc2hlZXQuCisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkJhdHRsZXNoaXAiKTsKKworICAgICAgICAgICAgd3MuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7CisgICAgICAgICAgICB3cy5WaWV3LlNob3dIZWFkZXJzID0gZmFsc2U7CisKKyAgICAgICAgICAgIHdzLkRlZmF1bHRDb2xXaWR0aCA9IDM7CisgICAgICAgICAgICB3cy5EZWZhdWx0Um93SGVpZ2h0ID0gMTU7CisKKyAgICAgICAgICAgIGludCBncmlkU2l6ZT0xMDsKKworICAgICAgICAgICAgLy9DcmVhdGUgdGhlIGJvYXJkcworICAgICAgICAgICAgdmFyIGJvYXJkMSA9IHdzLkNlbGxzWzIsIDIsIDIgKyBncmlkU2l6ZSAtIDEsIDIgKyBncmlkU2l6ZSAtIDFdOworICAgICAgICAgICAgdmFyIGJvYXJkMiA9IHdzLkNlbGxzWzIsIDQrZ3JpZFNpemUtMSwgMiArIGdyaWRTaXplLTEsIDQgKyAoZ3JpZFNpemUtMSkqMl07CisgICAgICAgICAgICBDcmVhdGVCb2FyZChib2FyZDEpOworICAgICAgICAgICAgQ3JlYXRlQm9hcmQoYm9hcmQyKTsKKyAgICAgICAgICAgIHdzLlNlbGVjdCgiQjIiKTsKKyAgICAgICAgICAgIHdzLlByb3RlY3Rpb24uSXNQcm90ZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5BbGxvd1NlbGVjdExvY2tlZENlbGxzID0gdHJ1ZTsKKworICAgICAgICAgICAgLy9DcmVhdGUgdGhlIFZCQSBQcm9qZWN0CisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOworICAgICAgICAgICAgLy9QYXNzd29yZCBwcm90ZWN0IHlvdXIgY29kZQorICAgICAgICAgICAgcGNrLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiRVBQbHVzIik7CisKKyAgICAgICAgICAgIC8vQWRkIGFsbCB0aGUgY29kZSBmcm9tIHRoZSB0ZXh0ZmlsZXMgaW4gdGhlIFZiYS1Db2RlIHN1Yi1mb2xkZXIuCisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ29kZU1vZHVsZS5Db2RlID0gRmlsZS5SZWFkQWxsVGV4dCgiLi5cXC4uXFxWQkEtQ29kZVxcVGhpc1dvcmtib29rLnR4dCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL0FkZCB0aGUgc2hlZXQgY29kZQorICAgICAgICAgICAgd3MuQ29kZU1vZHVsZS5Db2RlID0gRmlsZS5SZWFkQWxsVGV4dCgiLi5cXC4uXFxWQkEtQ29kZVxcQmF0dGxlc2hpcFNoZWV0LnR4dCIpOworICAgICAgICAgICAgdmFyIG0xPXBjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJDb2RlIik7CisgICAgICAgICAgICBzdHJpbmcgY29kZSA9IEZpbGUuUmVhZEFsbFRleHQoIi4uXFwuLlxcVkJBLUNvZGVcXENvZGVNb2R1bGUudHh0Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vSW5zZXJ0IHlvdXIgc2hpcHMgb24gdGhlIHJpZ2h0IGJvYXJkLiB5b3UgY2FuIGNoYW5nZXMgdGhlc2UsIGJ1dCBkb24ndCBjaGVhdCA7KQorICAgICAgICAgICAgdmFyIHNoaXBzID0gbmV3IHN0cmluZ1tdeworICAgICAgICAgICAgICAgICJOMzpONyIsCisgICAgICAgICAgICAgICAgIlAyOlMyIiwKKyAgICAgICAgICAgICAgICAiVjk6VjExIiwKKyAgICAgICAgICAgICAgICAiTzEwOlExMCIsCisgICAgICAgICAgICAgICAgIlIxMTpTMTEifTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9Ob3RlOiBGb3Igc2VjdXJpdHkgcmVhc29ucyB5b3Ugc2hvdWxkIG5ldmVyIG1peCBleHRlcm5hbCBkYXRhIGFuZCBjb2RlKHRvIGF2b2lkIGNvZGUgaW5qZWN0aW9ucyEpLCBlc3BlY2lhbGx5IG5vdCBvbiBhIHdlYnNlcnZlci4gCisgICAgICAgICAgICAvL0lmIHlvdSBkZXNpZGUgdG8gZG8gdGhhdCBhbnl3YXksIGJlIHZlcnkgY2FyZWZ1bCB3aXRoIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkYXRhLgorICAgICAgICAgICAgLy9CZSBleHRyYSBjYXJlZnVsbCBpZiB5b3Ugc2lnbiB0aGUgY29kZS4KKyAgICAgICAgICAgIC8vUmVhZCBtb3JlIGhlcmUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db2RlX2luamVjdGlvbgorCisgICAgICAgICAgICBjb2RlID0gc3RyaW5nLkZvcm1hdChjb2RlLCBzaGlwc1swXSxzaGlwc1sxXSxzaGlwc1syXSxzaGlwc1szXSxzaGlwc1s0XSwgYm9hcmQxLkFkZHJlc3MsIGJvYXJkMi5BZGRyZXNzKTsgIC8vU2hpcHMgYXJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0YW50cyBpbiB0aGUgbW9kdWxlCisgICAgICAgICAgICBtMS5Db2RlID0gY29kZTsKKworICAgICAgICAgICAgLy9TaGlwcyBhcmUgZGlzcGxheWVkIHdpdGggYSBibGFjayBiYWNrZ3JvdW5kCisgICAgICAgICAgICBzdHJpbmcgc2hpcHNhZGRyZXNzID0gc3RyaW5nLkpvaW4oIiwiLCBzaGlwcyk7CisgICAgICAgICAgICB3cy5DZWxsc1tzaGlwc2FkZHJlc3NdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgd3MuQ2VsbHNbc2hpcHNhZGRyZXNzXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7CisKKyAgICAgICAgICAgIHZhciBtMiA9IHBjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJDb21wdXRlclBsYXkiKTsKKyAgICAgICAgICAgIG0yLkNvZGUgPSBGaWxlLlJlYWRBbGxUZXh0KCIuLlxcLi5cXFZCQS1Db2RlXFxDb21wdXRlclBsYXlNb2R1bGUudHh0Iik7CisKKyAgICAgICAgICAgIHZhciBjMSA9IHBjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkQ2xhc3MoIlNoaXAiLGZhbHNlKTsKKyAgICAgICAgICAgIGMxLkNvZGUgPSBGaWxlLlJlYWRBbGxUZXh0KCIuLlxcLi5cXFZCQS1Db2RlXFxTaGlwQ2xhc3MudHh0Iik7CisKKyAgICAgICAgICAgIC8vQWRkIHRoZSBpbmZvIHRleHQgc2hhcGUuCisgICAgICAgICAgICB2YXIgdGIgPSB3cy5EcmF3aW5ncy5BZGRTaGFwZSgidHh0SW5mbyIsIGVTaGFwZVN0eWxlLlJlY3QpOworICAgICAgICAgICAgdGIuU2V0UG9zaXRpb24oMSwgMCwgMjcsIDApOworICAgICAgICAgICAgdGIuRmlsbC5Db2xvciA9IENvbG9yLkxpZ2h0U2xhdGVHcmF5OworICAgICAgICAgICAgdmFyIHJ0MSA9IHRiLlJpY2hUZXh0LkFkZCgiQmF0dGxlc2hpcHMiKTsKKyAgICAgICAgICAgIHJ0MS5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRiLlJpY2hUZXh0LkFkZCgiXHJcbkRvdWJsZS1jbGljayBvbiB0aGUgbGVmdCBib2FyZCB0byBtYWtlIHlvdXIgbW92ZS4gRmluZCBhbmQgc2luayBhbGwgc2hpcHMgdG8gd2luISIpOworCisgICAgICAgICAgICAvL1NldCB0aGUgaGVhZGVycy4KKyAgICAgICAgICAgIHdzLlNldFZhbHVlKCJCMSIsICJDb21wdXRlciBHcmlkIik7CisgICAgICAgICAgICB3cy5TZXRWYWx1ZSgiTTEiLCAiWW91ciBHcmlkIik7CisgICAgICAgICAgICB3cy5Sb3coMSkuU3R5bGUuRm9udC5TaXplID0gMTg7CisKKyAgICAgICAgICAgIEFkZENoYXJ0KHdzLkNlbGxzWyJCMTMiXSwgImNodEhpdFBlcmNlbnQiLCAiUGxheWVyIik7CisgICAgICAgICAgICBBZGRDaGFydCh3cy5DZWxsc1siTTEzIl0sICJjaHRDb21wdXRlckhpdFBlcmNlbnQiLCAiQ29tcHV0ZXIiKTsKKworICAgICAgICAgICAgd3MuTmFtZXMuQWRkKCJMb2dTdGFydCIsIHdzLkNlbGxzWyJCMjQiXSk7CisgICAgICAgICAgICB3cy5DZWxsc1siQjI0OlgyMjQiXS5TdHlsZS5Cb3JkZXIuQm9yZGVyQXJvdW5kKEV4Y2VsQm9yZGVyU3R5bGUuVGhpbiwgQ29sb3IuQmxhY2spOworICAgICAgICAgICAgd3MuQ2VsbHNbIkIyNTpYMjI0Il0uU3R5bGUuRm9udC5OYW1lID0gIkNvbnNvbGFzIjsKKyAgICAgICAgICAgIHdzLlNldFZhbHVlKCJCMjQiLCAiTG9nIik7CisgICAgICAgICAgICB3cy5DZWxsc1siQjI0Il0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMjQ6WDI0Il0uU3R5bGUuQm9yZGVyLkJvcmRlckFyb3VuZChFeGNlbEJvcmRlclN0eWxlLlRoaW4sIENvbG9yLkJsYWNrKTsKKyAgICAgICAgICAgIHZhciBjZj13cy5DZWxsc1siQjI1OkIyMjQiXS5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQ29udGFpbnNUZXh0KCk7CisgICAgICAgICAgICBjZi5UZXh0ID0gImhpdCI7CisgICAgICAgICAgICBjZi5TdHlsZS5Gb250LkNvbG9yLkNvbG9yID0gQ29sb3IuUmVkOworCisgICAgICAgICAgICAvL0lmIHlvdSBoYXZlIGEgdmFsaWQgY2VydGlmaWNhdGUgZm9yIGNvZGUgc2lnbmluZyB5b3UgY2FuIHVzZSB0aGlzIGNvZGUgdG8gc2V0IGl0LgorICAgICAgICAgICAgLy8vKioqIFRyeSB0byBmaW5kIGEgY2VydCB2YWxpZCBmb3Igc2lnbmluZy4uLiAqKiovCisgICAgICAgICAgICAvL1g1MDlTdG9yZSBzdG9yZSA9IG5ldyBYNTA5U3RvcmUoU3RvcmVMb2NhdGlvbi5DdXJyZW50VXNlcik7CisgICAgICAgICAgICAvL3N0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsgICAKKyAgICAgICAgICAgIC8vZm9yZWFjaCAodmFyIGNlcnQgaW4gc3RvcmUuQ2VydGlmaWNhdGVzKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBpZiAoY2VydC5IYXNQcml2YXRlS2V5ICYmIGNlcnQuTm90QmVmb3JlIDw9IERhdGVUaW1lLlRvZGF5ICYmIGNlcnQuTm90QWZ0ZXIgPj0gRGF0ZVRpbWUuVG9kYXkpCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgcGNrLldvcmtib29rLlZiYVByb2plY3QuU2lnbmF0dXJlLkNlcnRpZmljYXRlID0gY2VydDsKKyAgICAgICAgICAgIC8vICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxNS0zLnhsc20iKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZENoYXJ0KEV4Y2VsUmFuZ2Ugcm5nLHN0cmluZyBuYW1lLCBzdHJpbmcgcHJlZml4KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2hydCA9IChFeGNlbFBpZUNoYXJ0KXJuZy5Xb3Jrc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQobmFtZSwgZUNoYXJ0VHlwZS5QaWUpOworICAgICAgICAgICAgY2hydC5TZXRQb3NpdGlvbihybmcuU3RhcnQuUm93LTEsIDAsIHJuZy5TdGFydC5Db2x1bW4tMSwgMCk7CisgICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IHJuZy5TdGFydC5Sb3crOTsKKyAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gcm5nLlN0YXJ0LkNvbHVtbiArIDk7CisgICAgICAgICAgICBjaHJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUxODsKKyAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLlNob3dQZXJjZW50ID0gdHJ1ZTsKKworICAgICAgICAgICAgdmFyIHNlcmllID0gY2hydC5TZXJpZXMuQWRkKHJuZy5PZmZzZXQoMiwgMiwgMSwgMiksIHJuZy5PZmZzZXQoMSwgMiwgMSwgMikpOworICAgICAgICAgICAgc2VyaWUuSGVhZGVyID0gIkhpdHMiOworICAgICAgICAgICAgCisgICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiSGl0IHJhdGlvIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIG4xID0gcm5nLldvcmtzaGVldC5OYW1lcy5BZGQocHJlZml4ICsgIk1pc3NlcyIsIHJuZy5PZmZzZXQoMiwgMikpOworICAgICAgICAgICAgbjEuVmFsdWUgPSAwOworICAgICAgICAgICAgdmFyIG4yID0gcm5nLldvcmtzaGVldC5OYW1lcy5BZGQocHJlZml4ICsgIkhpdHMiLCBybmcuT2Zmc2V0KDIsIDMpKTsKKyAgICAgICAgICAgIG4yLlZhbHVlID0gMDsKKyAgICAgICAgICAgIHJuZy5PZmZzZXQoMSwgMikuVmFsdWUgPSAiTWlzc2VzIjsKKyAgICAgICAgICAgIHJuZy5PZmZzZXQoMSwgMykuVmFsdWUgPSAiSGl0cyI7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENyZWF0ZUJvYXJkKEV4Y2VsUmFuZ2Ugcm5nKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NyZWF0ZSBhIGdyYWRpYW50IGJhY2tncm91bmQgd2l0aCBvbmUgZGFyayBhbmQgb25lIGxpZ2h0IGJsdWUgY29sb3IKKyAgICAgICAgICAgIHJuZy5TdHlsZS5GaWxsLkdyYWRpZW50LkNvbG9yMS5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigweDgwLCAweDgwLCAwWEZGKSk7CisgICAgICAgICAgICBybmcuU3R5bGUuRmlsbC5HcmFkaWVudC5Db2xvcjIuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoMHgyMCwgMHgyMCwgMFhGRikpOworICAgICAgICAgICAgcm5nLlN0eWxlLkZpbGwuR3JhZGllbnQuVHlwZSA9IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5Ob25lOworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDw9IHJuZy5FbmQuQ29sdW1uIC0gcm5nLlN0YXJ0LkNvbHVtbjsgY29sKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDw9IHJuZy5FbmQuUm93IC0gcm5nLlN0YXJ0LlJvdzsgcm93KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29sICUgNCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBybmcuT2Zmc2V0KHJvdywgY29sLCAxLCAxKS5TdHlsZS5GaWxsLkdyYWRpZW50LkRlZ3JlZSA9IDQ1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2wgJSA0ID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJuZy5PZmZzZXQocm93LCBjb2wsIDEsIDEpLlN0eWxlLkZpbGwuR3JhZGllbnQuRGVncmVlID0gNzA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCAlIDQgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcm5nLk9mZnNldChyb3csIGNvbCwgMSwgMSkuU3R5bGUuRmlsbC5HcmFkaWVudC5EZWdyZWUgPSAxMTA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBybmcuT2Zmc2V0KHJvdywgY29sLCAxLCAxKS5TdHlsZS5GaWxsLkdyYWRpZW50LkRlZ3JlZSA9IDEzNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU2V0IHRoZSBpbm5lciBjZWxsIGJvcmRlciB0byB0aGluLCBsaWdodCBncmF5CisgICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLlRvcC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKKyAgICAgICAgICAgIHJuZy5TdHlsZS5Cb3JkZXIuVG9wLkNvbG9yLlNldENvbG9yKENvbG9yLkdyYXkpOworICAgICAgICAgICAgcm5nLlN0eWxlLkJvcmRlci5SaWdodC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKKyAgICAgICAgICAgIHJuZy5TdHlsZS5Cb3JkZXIuUmlnaHQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuR3JheSk7CisgICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLkxlZnQuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47CisgICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLkxlZnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuR3JheSk7CisgICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLkJvdHRvbS5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKKyAgICAgICAgICAgIHJuZy5TdHlsZS5Cb3JkZXIuQm90dG9tLkNvbG9yLlNldENvbG9yKENvbG9yLkdyYXkpOworCisgICAgICAgICAgICAvL1NvbGlkIGJsYWNrIGJvcmRlciBhcm91bmQgdGhlIGJvYXJkLgorICAgICAgICAgICAgcm5nLlN0eWxlLkJvcmRlci5Cb3JkZXJBcm91bmQoRXhjZWxCb3JkZXJTdHlsZS5NZWRpdW0sIENvbG9yLkJsYWNrKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGUxNi5jcyBiL1NhbXBsZUFwcC9TYW1wbGUxNi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzUwZWFhCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1NhbXBsZTE2LmNzCkBAIC0wLDAgKzEsNjIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRhdGE7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7CisKK25hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCit7CisgICAgY2xhc3MgU2FtcGxlMTYKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSdW5TYW1wbGUxNihEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBkYXRhVGFibGUgPSBuZXcgRGF0YVRhYmxlKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgZGF0YVRhYmxlLkNvbHVtbnMuQWRkKCJjb2wxIik7CisgICAgICAgICAgICAgICAgZGF0YVRhYmxlLkNvbHVtbnMuQWRkKCJjb2wyIik7CisgICAgICAgICAgICAgICAgZGF0YVRhYmxlLkNvbHVtbnMuQWRkKCJjb2wzIik7CisgICAgICAgICAgICAgICAgZGF0YVRhYmxlLkNvbHVtbnMuQWRkKCJjb2w0Iik7CisgICAgICAgICAgICAgICAgZGF0YVRhYmxlLlJvd3MuQWRkKCJxd2UxMSIsICJxd2UxMiIsICJxd2UxMyIsICJxd2UxNCIpOworICAgICAgICAgICAgICAgIGRhdGFUYWJsZS5Sb3dzLkFkZCgicXdlMjEiLCAicXdlMjIiLCAicXdlMjMiLCAicXdlMjQiKTsKKyAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKGRhdGFUYWJsZS5UYWJsZU5hbWUpOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTEiXS5Mb2FkRnJvbURhdGFUYWJsZShkYXRhVGFibGUsIHRydWUsIFRhYmxlU3R5bGVzLk5vbmUpOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Qcm90ZWN0aW9uLkFsbG93U2VsZWN0TG9ja2VkQ2VsbHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJvdGVjdGlvbi5BbGxvd1NlbGVjdFVubG9ja2VkQ2VsbHMgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Qcm90ZWN0aW9uLkFsbG93U29ydCA9IHRydWU7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LlByb3RlY3Rpb24uQWxsb3dGb3JtYXRDb2x1bW5zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJvdGVjdGlvbi5BbGxvd0F1dG9GaWx0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Qcm90ZWN0aW9uLkFsbG93RWRpdE9iamVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LlByb3RlY3Rpb24uSXNQcm90ZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHZhciByMT13b3Jrc2hlZXQuUHJvdGVjdGVkUmFuZ2VzLkFkZCgiUmFuZ2UxIiwgbmV3IEV4Y2VsQWRkcmVzcygxLCAxLCB3b3Jrc2hlZXQuRGltZW5zaW9uLkVuZC5Sb3csIDQpKTsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJvdGVjdGVkUmFuZ2VzLlJlbW92ZShyMSk7CisgICAgICAgICAgICAgICAgdmFyIHIyID0gd29ya3NoZWV0LlByb3RlY3RlZFJhbmdlcy5BZGQoIlJhbmdlMiIsIG5ldyBFeGNlbEFkZHJlc3MoIkYzOlQxMixGMTU6VDMwIikpOworICAgICAgICAgICAgICAgIHIyLlNldFBhc3N3b3JkKCJFUFBsdXMiKTsKKworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMSkuV2lkdGggPSAzMDsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDIpLldpZHRoID0gMzA7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbigzKS5XaWR0aCA9IDEwMDsKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDQpLldpZHRoID0gMTAwOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA0LCB3b3Jrc2hlZXQuRGltZW5zaW9uLkVuZC5Sb3csIDRdLlN0eWxlLkxvY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAzLCB3b3Jrc2hlZXQuRGltZW5zaW9uLkVuZC5Sb3csIDRdLlN0eWxlLldyYXBUZXh0ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgZnMgPSBuZXcgRmlsZVN0cmVhbShQYXRoLkNvbWJpbmUob3V0cHV0RGlyLlRvU3RyaW5nKCksICJzYW1wbGUxNi54bHN4IiksIEZpbGVNb2RlLkNyZWF0ZSkpCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKGZzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKHZhciBmcyA9IG5ldyBGaWxlU3RyZWFtKFBhdGguQ29tYmluZShvdXRwdXREaXIuVG9TdHJpbmcoKSwgInNhbXBsZTE2Lnhsc3giKSwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKSkKKyAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoZnMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3b3Jrc2hlZXQxIGluIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwckNvbGxlY3Rpb24gPSB3b3Jrc2hlZXQxLlByb3RlY3RlZFJhbmdlczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByQ29sbGVjdGlvbi5Db3VudCAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkV4cGVjdGVkIDEgZWxlbWVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGUyLmNzIGIvU2FtcGxlQXBwL1NhbXBsZTIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhNmViNAotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGUyLmNzCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICoKKyAqIAorICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqIAorICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAorICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCisgKiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKK3sKKwkvLy8gPHN1bW1hcnk+CisJLy8vIFNpbXBseSBvcGVucyBhbiBleGlzdGluZyBmaWxlIGFuZCByZWFkcyBzb21lIHZhbHVlcyBhbmQgcHJvcGVydGllcworCS8vLyA8L3N1bW1hcnk+CisJY2xhc3MgU2FtcGxlMgorCXsKKwkJcHVibGljIHN0YXRpYyB2b2lkIFJ1blNhbXBsZTIoc3RyaW5nIEZpbGVQYXRoKQorCQl7CisJCQlDb25zb2xlLldyaXRlTGluZSgiUmVhZGluZyBjb2x1bW4gMiBvZiB7MH0iLCBGaWxlUGF0aCk7CisJCQlDb25zb2xlLldyaXRlTGluZSgpOworCisJCQlGaWxlSW5mbyBleGlzdGluZ0ZpbGUgPSBuZXcgRmlsZUluZm8oRmlsZVBhdGgpOworCQkJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShleGlzdGluZ0ZpbGUpKQorCQkJeworCQkJCS8vIGdldCB0aGUgZmlyc3Qgd29ya3NoZWV0IGluIHRoZSB3b3JrYm9vaworCQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKKyAgICAgICAgICAgICAgICBpbnQgY29sID0gMjsgLy9UaGUgaXRlbSBkZXNjcmlwdGlvbgorCQkJCS8vIG91dHB1dCB0aGUgZGF0YSBpbiBjb2x1bW4gMgorCQkJCWZvciAoaW50IHJvdyA9IDI7IHJvdyA8IDU7IHJvdysrKQorCQkJCQlDb25zb2xlLldyaXRlTGluZSgiXHRDZWxsKHswfSx7MX0pLlZhbHVlPXsyfSIsIHJvdywgY29sLCB3b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2xdLlZhbHVlKTsKKworCQkJCS8vIG91dHB1dCB0aGUgZm9ybXVsYSBpbiByb3cgNQorCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJcdENlbGwoezB9LHsxfSkuRm9ybXVsYT17Mn0iLCAzLCA1LCB3b3Jrc2hlZXQuQ2VsbHNbMywgNV0uRm9ybXVsYSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJcdENlbGwoezB9LHsxfSkuRm9ybXVsYVIxQzE9ezJ9IiwgMywgNSwgd29ya3NoZWV0LkNlbGxzWzMsIDVdLkZvcm11bGFSMUMxKTsKKworICAgICAgICAgICAgICAgIC8vIG91dHB1dCB0aGUgZm9ybXVsYSBpbiByb3cgNQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJcdENlbGwoezB9LHsxfSkuRm9ybXVsYT17Mn0iLCA1LCAzLCB3b3Jrc2hlZXQuQ2VsbHNbNSwgM10uRm9ybXVsYSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlx0Q2VsbCh7MH0sezF9KS5Gb3JtdWxhUjFDMT17Mn0iLCA1LCAzLCB3b3Jrc2hlZXQuQ2VsbHNbNSwgM10uRm9ybXVsYVIxQzEpOworCisgICAgICAgICAgICB9IC8vIHRoZSB1c2luZyBzdGF0ZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBEaXNwb3NlKCkgd2hpY2ggY2xvc2VzIHRoZSBwYWNrYWdlLgorCisJCQlDb25zb2xlLldyaXRlTGluZSgpOworCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAyIGNvbXBsZXRlIik7CisJCQlDb25zb2xlLldyaXRlTGluZSgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTMuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk3Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1NhbXBsZTMuY3MKQEAgLTAsMCArMSwyMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICoKKyAqIAorICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqIAorICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAorICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCisgKiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTYW1wbGUgY29kZSBkZW1vbnN0cmF0aW5nIGhvdyB0byBnZW5lcmF0ZSBFeGNlbCBzcHJlYWRzaGVldHMgb24gdGhlIHNlcnZlciB1c2luZyAKKyAqIE9mZmljZSBPcGVuIFhNTCBhbmQgdGhlIEV4Y2VsUGFja2FnZSB3cmFwcGVyIGNsYXNzZXMuCisgKiAKKyAqIEV4Y2VsUGFja2FnZSBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0V4Y2VsUGFja2FnZSBmb3IgZGV0YWlscy4KKyAqIAorICogU2FtcGxlIDM6IENyZWF0ZXMgYSB3b3JrYm9vayBiYXNlZCBvbiBhIHRlbXBsYXRlIGFuZCBwb3B1bGF0ZXMgdXNpbmcgdGhlIGRhdGFiYXNlIGRhdGEuCisgKiAKKyAqIENvcHlyaWdodCAyMDA3IKkgRHIgSm9obiBUdW5uaWNsaWZmZSAKKyAqIG1haWx0bzpkci5qb2huLnR1bm5pY2xpZmZlQGJ0aW50ZXJuZXQuY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKi8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLkRhdGEuU3FsQ2xpZW50OwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOworCituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworCWNsYXNzIFNhbXBsZTMKKwl7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFNhbXBsZSAzIC0gY3JlYXRlcyBhIHdvcmtib29rIGFuZCBwb3B1bGF0ZXMgdXNpbmcgZGF0YSBmcm9tIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZQorCQkvLy8gVGhpcyBzYW1wbGUgcmVxdWlyZXMgdGhlIEFkdmVudHVyZVdvcmtzIGRhdGFiYXNlLiAgCisgICAgICAgIC8vLyBUaGlzIG9uZSBpcyBmcm9tIHRoZSBvcmdpbmFsIEV4Y2VscGFja2FnZSBzYW1wbGUgcHJvamVjdCwgYnV0IHdpdGhvdXQgdGhlIHRlbXBsYXRlCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0RGlyIj5UaGUgb3V0cHV0IGRpcmVjdG9yeTwvcGFyYW0+CisJCS8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGVEaXIiPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJjb25uZWN0aW9uU3RyaW5nIj5UaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8geW91ciBjb3B5IG9mIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZTwvcGFyYW0+CisJCXB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTMoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIsIHN0cmluZyBjb25uZWN0aW9uU3RyaW5nKQorCQl7CisJCQkKKyAgICAgICAgICAgIHN0cmluZyBmaWxlID0gb3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMy54bHN4IjsKKyAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkgRmlsZS5EZWxldGUoZmlsZSk7CisgICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTMueGxzeCIpOworCisJCQkvLyBvaywgd2UgY2FuIHJ1biB0aGUgcmVhbCBjb2RlIG9mIHRoZSBzYW1wbGUgbm93CisJCQl1c2luZyAoRXhjZWxQYWNrYWdlIHhsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCisJCQl7CisJCQkJLy8gdW5jb21tZW50IHRoaXMgbGluZSBpZiB5b3Ugd2FudCB0aGUgWE1MIHdyaXR0ZW4gb3V0IHRvIHRoZSBvdXRwdXREaXIKKwkJCQkvL3hsUGFja2FnZS5EZWJ1Z01vZGUgPSB0cnVlOyAKKworCQkJCS8vIGdldCBoYW5kbGUgdG8gdGhlIGV4aXN0aW5nIHdvcmtzaGVldAorCQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHhsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2FsZXMiKTsKKyAgICAgICAgICAgICAgICB2YXIgbmFtZWRTdHlsZSA9IHhsUGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiSHlwZXJMaW5rIik7ICAgLy9UaGlzIG9uZSBpcyBsYW5ndWFnZSBkZXBlbmRlbnQKKyAgICAgICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuVW5kZXJMaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldCAhPSBudWxsKQorCQkJCXsKKwkJCQkJY29uc3QgaW50IHN0YXJ0Um93ID0gNTsKKwkJCQkJaW50IHJvdyA9IHN0YXJ0Um93OworICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSBIZWFkZXJzIGFuZCBmb3JtYXQgdGhlbSAKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gIkFkdmVudHVyZVdvcmtzIEluYy4iOworICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByID0gd29ya3NoZWV0LkNlbGxzWyJBMTpHMSJdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiQnJpdGFubmljIEJvbGQiLCAyMiwgRm9udFN0eWxlLkl0YWxpYykpOworICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlckNvbnRpbnVvdXM7CisgICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigyMyw1NSw5MykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJZZWFyLUVuZCBTYWxlcyBSZXBvcnQiOworICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByID0gd29ya3NoZWV0LkNlbGxzWyJBMjpHMiJdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiQnJpdGFubmljIEJvbGQiLCAxOCwgRm9udFN0eWxlLkl0YWxpYykpOworICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOworICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDE4NCwyMDQsMjI4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiTmFtZSI7CisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9ICJKb2IgVGl0bGUiOworICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkM0Il0uVmFsdWUgPSAiUmVnaW9uIjsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENCJdLlZhbHVlID0gIk1vbnRobHkgUXVvdGEiOworICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkU0Il0uVmFsdWUgPSAiUXVvdGEgWVREIjsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJGNCJdLlZhbHVlID0gIlNhbGVzIFlURCI7CisgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRzQiXS5WYWx1ZSA9ICJRdW90YSAlIjsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDE4NCwgMjA0LCAyMjgpKTsKKyAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisKKworICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIGNvbm5lY3QgdG8gdGhlIEFkdmVudHVyZVdvcmtzIHNhbXBsZSBkYXRhYmFzZSBmb3Igc29tZSBkYXRhCisJCQkJCXVzaW5nIChTcWxDb25uZWN0aW9uIHNxbENvbm4gPSBuZXcgU3FsQ29ubmVjdGlvbihjb25uZWN0aW9uU3RyaW5nKSkKKwkJCQkJeworCQkJCQkJc3FsQ29ubi5PcGVuKCk7CisJCQkJCQl1c2luZyAoU3FsQ29tbWFuZCBzcWxDbWQgPSBuZXcgU3FsQ29tbWFuZCgic2VsZWN0IExhc3ROYW1lICsgJywgJyArIEZpcnN0TmFtZSBBUyBbTmFtZV0sIEVtYWlsQWRkcmVzcywgSm9iVGl0bGUsIENvdW50cnlSZWdpb25OYW1lLCBJU05VTEwoU2FsZXNRdW90YSwwKSBBUyBTYWxlc1F1b3RhLCBJU05VTEwoU2FsZXNRdW90YSwwKSoxMiBBUyBZZWFybHlRdW90YSwgU2FsZXNZVEQgZnJvbSBTYWxlcy52U2FsZXNQZXJzb24gT1JERVIgQlkgU2FsZXNZVEQgZGVzYyIsIHNxbENvbm4pKQorCQkJCQkJeworCQkJCQkJCXVzaW5nIChTcWxEYXRhUmVhZGVyIHNxbFJlYWRlciA9IHNxbENtZC5FeGVjdXRlUmVhZGVyKCkpCisJCQkJCQkJeworCQkJCQkJCQkvLyBnZXQgdGhlIGRhdGEgYW5kIGZpbGwgcm93cyA1IG9ud2FyZHMKKwkJCQkJCQkJd2hpbGUgKHNxbFJlYWRlci5SZWFkKCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWludCBjb2wgPSAxOworCQkJCQkJCQkJLy8gb3VyIHF1ZXJ5IGhhcyB0aGUgY29sdW1ucyBpbiB0aGUgcmlnaHQgb3JkZXIsIHNvIHNpbXBseQorCQkJCQkJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2x1bW5zCisJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNxbFJlYWRlci5GaWVsZENvdW50OyBpKyspCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gdXNlIHRoZSBlbWFpbCBhZGRyZXNzIGFzIGEgaHlwZXJsaW5rIGZvciBjb2x1bW4gMQorCQkJCQkJCQkJCWlmIChzcWxSZWFkZXIuR2V0TmFtZShpKSA9PSAiRW1haWxBZGRyZXNzIikKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCS8vIGluc2VydCB0aGUgZW1haWwgYWRkcmVzcyBhcyBhIGh5cGVybGluayBmb3IgdGhlIG5hbWUKKwkJCQkJCQkJCQkJc3RyaW5nIGh5cGVybGluayA9ICJtYWlsdG86IiArIHNxbFJlYWRlci5HZXRWYWx1ZShpKS5Ub1N0cmluZygpOworCQkJCQkJCQkJCQl3b3Jrc2hlZXQuQ2VsbHNbcm93LCAxXS5IeXBlcmxpbmsgPSBuZXcgVXJpKGh5cGVybGluaywgVXJpS2luZC5BYnNvbHV0ZSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCS8vIGRvIG5vdCBib3RoZXIgZmlsbGluZyBjZWxsIHdpdGggYmxhbmsgZGF0YSAoYWxzbyB1c2VmdWwgaWYgd2UgaGF2ZSBhIGZvcm11bGEgaW4gYSBjZWxsKQorCQkJCQkJCQkJCQlpZiAoc3FsUmVhZGVyLkdldFZhbHVlKGkpICE9IG51bGwpCisJCQkJCQkJCQkJCQl3b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2xdLlZhbHVlID0gc3FsUmVhZGVyLkdldFZhbHVlKGkpOworCQkJCQkJCQkJCQljb2wrKzsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQlyb3crKzsKKwkJCQkJCQkJfQorCQkJCQkJCQlzcWxSZWFkZXIuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbc3RhcnRSb3csIDEsIHJvdyAtIDEsIDFdLlN0eWxlTmFtZSA9ICJIeXBlckxpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbc3RhcnRSb3csIDQsIHJvdyAtIDEsIDZdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiWyQkLTQwOV0jLCMjMCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1tzdGFydFJvdywgNywgcm93IC0gMSwgN10uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIwJSI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzW3N0YXJ0Um93LCA3LCByb3cgLSAxLCA3XS5Gb3JtdWxhUjFDMSA9ICI9SUYoUkNbLTJdPTAsMCxSQ1stMV0vUkNbLTJdKSI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgY29sdW1uIHdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMSkuV2lkdGggPSAyNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbigyKS5XaWR0aCA9IDI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDMpLldpZHRoID0gMTg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNCkuV2lkdGggPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbig1KS5XaWR0aCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDYpLldpZHRoID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNykuV2lkdGggPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQl9CisJCQkJCQlzcWxDb25uLkNsb3NlKCk7CisJCQkJCX0KKworICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIHNldCB0aGUgaGVhZGVyIHRleHQgCisJCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICJBZHZlbnR1cmVXb3JrcyBJbmMuIFNhbGVzIFJlcG9ydCI7CisJCQkJCS8vIGFkZCB0aGUgcGFnZSBudW1iZXIgdG8gdGhlIGZvb3RlciBwbHVzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMKKwkJCQkJd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCA9CisJCQkJCQlzdHJpbmcuRm9ybWF0KCJQYWdlIHswfSBvZiB7MX0iLCBFeGNlbEhlYWRlckZvb3Rlci5QYWdlTnVtYmVyLCBFeGNlbEhlYWRlckZvb3Rlci5OdW1iZXJPZlBhZ2VzKTsKKwkJCQkJLy8gYWRkIHRoZSBzaGVldCBuYW1lIHRvIHRoZSBmb290ZXIKKwkJCQkJd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuQ2VudGVyZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuU2hlZXROYW1lOworCQkJCQkvLyBhZGQgdGhlIGZpbGUgcGF0aCB0byB0aGUgZm9vdGVyCisJCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkRm9vdGVyLkxlZnRBbGlnbmVkVGV4dCA9IEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVQYXRoICsgRXhjZWxIZWFkZXJGb290ZXIuRmlsZU5hbWU7CisJCQkJfQorCQkJCS8vIHdlIGhhZCBiZXR0ZXIgYWRkIHNvbWUgZG9jdW1lbnQgcHJvcGVydGllcyB0byB0aGUgc3ByZWFkc2hlZXQgCisKKwkJCQkvLyBzZXQgc29tZSBjb3JlIHByb3BlcnR5IHZhbHVlcworCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIlNhbXBsZSAzIjsKKwkJCQl4bFBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5BdXRob3IgPSAiSm9obiBUdW5uaWNsaWZmZSI7CisJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU3ViamVjdCA9ICJFeGNlbFBhY2thZ2UgU2FtcGxlcyI7CisJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuS2V5d29yZHMgPSAiT2ZmaWNlIE9wZW4gWE1MIjsKKwkJCQl4bFBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5DYXRlZ29yeSA9ICJFeGNlbFBhY2thZ2UgU2FtcGxlcyI7CisJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQ29tbWVudHMgPSAiVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYW4gRXhjZWwgMjAwNyBmaWxlIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgUGFja2FnaW5nIEFQSSBhbmQgT2ZmaWNlIE9wZW4gWE1MIjsKKworCQkJCS8vIHNldCBzb21lIGV4dGVuZGVkIHByb3BlcnR5IHZhbHVlcworCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7CisgICAgICAgICAgICAgICAgeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuSHlwZXJsaW5rQmFzZSA9IG5ldyBVcmkoImh0dHA6Ly93d3cuY29kZXBsZXguY29tL01TRlREQlByb2RTYW1wbGVzIik7CisKKwkJCQkvLyBzZXQgc29tZSBjdXN0b20gcHJvcGVydHkgdmFsdWVzCisJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQ2hlY2tlZCBieSIsICJKb2huIFR1bm5pY2xpZmZlIik7CisJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiRW1wbG95ZWVJRCIsICIxMTQ3Iik7CisJCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkV4Y2VsUGFja2FnZSIpOworCQkJCQorCQkJCS8vIHNhdmUgdGhlIG5ldyBzcHJlYWRzaGVldAorCQkJCXhsUGFja2FnZS5TYXZlKCk7CisJCQl9CisKKwkJCS8vIGlmIHlvdSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBYTUwgY3JlYXRlZCBpbiB0aGUgcGFja2FnZSwgc2ltcGx5IHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzCisJCQkvLyBUaGVzZSBjb3B5IHRoZSBvdXRwdXQgZmlsZSBhbmQgZ2l2ZSBpdCBhIHppcCBleHRlbnNpb24gc28geW91IGNhbiBvcGVuIGl0IGFuZCB0YWtlIGEgbG9vayEKKwkJCS8vRmlsZUluZm8gemlwRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUzLnppcCIpOworCQkJLy9pZiAoemlwRmlsZS5FeGlzdHMpIHppcEZpbGUuRGVsZXRlKCk7CisJCQkvL25ld0ZpbGUuQ29weVRvKHppcEZpbGUuRnVsbE5hbWUpOworCisJCQlyZXR1cm4gbmV3RmlsZS5GdWxsTmFtZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU0LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllZGQwYgotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGU0LmNzCkBAIC0wLDAgKzEsMTQxIEBACivvu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqIAorICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqIAorICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAorICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCisgKiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMTAtU0VQLTIwMDkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5EYXRhLlNxbENsaWVudDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKKworbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKK3sKKyAgICBjbGFzcyBTYW1wbGU0CisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHNhbXBsZSBjcmVhdGVzIGEgbmV3IHdvcmtib29rIGZyb20gYSB0ZW1wbGF0ZSBmaWxlIGNvbnRhaW5pbmcgYSBjaGFydCBhbmQgcG9wdWxhdGVzIGl0IHdpdGggRXhjaGFuZ3JhdGVzIGZyb20gCisgICAgICAgIC8vLyB0aGUgQWR2ZW50dXJld29ya3MgZGF0YWJhc2UgYW5kIHNldCB0aGUgdGhyZWUgc2VyaWVzIG9uIHRoZSBjaGFydC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb25uZWN0aW9uU3RyaW5nIj5Db25uZWN0aW9uc3RyaW5nIHRvIHRoZSBBZHZlbnR1cmV3b3JrcyBkYjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGUiPnRoZSB0ZW1wbGF0ZTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0ZGlyIj5vdXRwdXQgZGlyPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUnVuU2FtcGxlNChzdHJpbmcgY29ubmVjdGlvblN0cmluZywgRmlsZUluZm8gdGVtcGxhdGUsIERpcmVjdG9yeUluZm8gb3V0cHV0ZGlyKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHAgPSBuZXcgRXhjZWxQYWNrYWdlKHRlbXBsYXRlLCB0cnVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1NldCB1cCB0aGUgaGVhZGVycworICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMjAiXS5WYWx1ZSA9ICJEYXRlIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIwIl0uVmFsdWUgPSAiRU9EIFJhdGUiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMjA6RDIwIl0uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJFMjAiXS5WYWx1ZSA9ICJDaGFuZ2UiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJFMjA6RzIwIl0uTWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMjA6RTIwIl0uU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOworICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHJvdyA9IHdzLkNlbGxzWyJBMjA6RzIwIl0pIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm93LlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICAgICAgcm93LlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDIzLDU1LDkzKSk7CisgICAgICAgICAgICAgICAgICAgIHJvdy5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcm93LlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMjEiXS5WYWx1ZSA9ICJVU0QvSlBZIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQzIxIl0uVmFsdWUgPSAiVVNEL0VVUiI7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkQyMSJdLlZhbHVlID0gIlVTRC9HQlAiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJFMjEiXS5WYWx1ZSA9ICJVU0QvSlBZIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siRjIxIl0uVmFsdWUgPSAiVVNEL0VVUiI7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkcyMSJdLlZhbHVlID0gIlVTRC9HQlAiOworICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHJvdyA9IHdzLkNlbGxzWyJBMjE6RzIxIl0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb3cuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgICAgICAgICByb3cuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoMTg0LCAyMDQsIDIyOCkpOworICAgICAgICAgICAgICAgICAgICByb3cuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7CisgICAgICAgICAgICAgICAgICAgIHJvdy5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBzdGFydFJvdyA9IDIyOworICAgICAgICAgICAgICAgIC8vQ29ubmVjdCB0byB0aGUgZGF0YWJhc2UgYW5kIGZpbGwgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICB1c2luZyAoU3FsQ29ubmVjdGlvbiBzcWxDb25uID0gbmV3IFNxbENvbm5lY3Rpb24oY29ubmVjdGlvblN0cmluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcm93ID0gc3RhcnRSb3c7CisgICAgICAgICAgICAgICAgICAgIHNxbENvbm4uT3BlbigpOworICAgICAgICAgICAgICAgICAgICB1c2luZyAoU3FsQ29tbWFuZCBzcWxDbWQgPSBuZXcgU3FsQ29tbWFuZCgiU0VMRUNUIEN1cnJlbmN5UmF0ZURhdGUsIFNVTShDYXNlIHdoZW4gVG9DdXJyZW5jeUNvZGUgPSAnSlBZJyBUaGVuIEVuZE9mRGF5UmF0ZSBFbHNlIDAgRU5EKSBBUyBbSlBZXSwgU1VNKENhc2Ugd2hlbiBUb0N1cnJlbmN5Q29kZSA9ICdFVVInIFRoZW4gRW5kT2ZEYXlSYXRlIEVsc2UgMCBFTkQpIEFTIFtFVVJdLCBTVU0oQ2FzZSB3aGVuIFRvQ3VycmVuY3lDb2RlID0gJ0dCUCcgVGhlbiBFbmRPZkRheVJhdGUgRWxzZSAwIEVORCkgQVMgW0dCUF0gRlJPTSBbQWR2ZW50dXJlV29ya3NdLltTYWxlc10uW0N1cnJlbmN5UmF0ZV0gIHdoZXJlIFtGcm9tQ3VycmVuY3lDb2RlXT0nVVNEJyBBTkQgVG9DdXJyZW5jeUNvZGUgaW4gKCdKUFknLCAnRVVSJywgJ0dCUCcpIEdST1VQIEJZIEN1cnJlbmN5UmF0ZURhdGUgIE9SREVSIEJZIEN1cnJlbmN5UmF0ZURhdGUiLCBzcWxDb25uKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFNxbERhdGFSZWFkZXIgc3FsUmVhZGVyID0gc3FsQ21kLkV4ZWN1dGVSZWFkZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBkYXRhIGFuZCBmaWxsIHJvd3MgMjIgb253YXJkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzcWxSZWFkZXIuUmVhZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAxXS5WYWx1ZSA9IHNxbFJlYWRlclswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IHNxbFJlYWRlclsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAzXS5WYWx1ZSA9IHNxbFJlYWRlclsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCA0XS5WYWx1ZSA9IHNxbFJlYWRlclszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIG51bWJlcmZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbc3RhcnRSb3csIDEsIHJvdyAtIDEsIDFdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAieXl5eS1tbS1kZCI7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5DZWxsc1tzdGFydFJvdywgMiwgcm93IC0gMSwgNF0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMC4wMDAwIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBGb3JtdWxhcyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3N0YXJ0Um93ICsgMSwgNSwgcm93IC0gMSwgN10uRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIkIkezB9L0J7MX0tMSIsIHN0YXJ0Um93LCBzdGFydFJvdyArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbc3RhcnRSb3csIDUsIHJvdyAtIDEsIDddLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiMC4wMCUiOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIHNlcmllcyBmb3IgdGhlIGNoYXJ0LiBUaGUgc2VyaWVzIG11c3QgZXhpc3QgaW4gdGhlIHRlbXBsYXRlIG9yIHRoZSBwcm9ncmFtIHdpbGwgY3Jhc2guCisgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSAoKEV4Y2VsQ2hhcnQpd3MuRHJhd2luZ3NbIlNhbXBsZUNoYXJ0Il0pOyAKKyAgICAgICAgICAgICAgICAgICAgY2hhcnQuVGl0bGUuVGV4dCA9ICJFeGNoYW5nZSByYXRlICUiOworICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMF0uSGVhZGVyID0gIlVTRC9KUFkiOworICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMF0uWFNlcmllcyA9ICInIiArIHdzLk5hbWUgKyAiJyEiICsgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKHN0YXJ0Um93KzEsIDEsIHJvdyAtIDEsIDEpOworICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMF0uU2VyaWVzID0gIiciICsgd3MuTmFtZSArICInISIgKyBFeGNlbFJhbmdlLkdldEFkZHJlc3Moc3RhcnRSb3cgKyAxLCA1LCByb3cgLSAxLCA1KTsKKworICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMV0uSGVhZGVyID0gIlVTRC9FVVIiOworICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMV0uWFNlcmllcyA9ICInIiArIHdzLk5hbWUgKyAiJyEiICsgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKHN0YXJ0Um93ICsgMSwgMSwgcm93IC0gMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJ0LlNlcmllc1sxXS5TZXJpZXMgPSAiJyIgKyB3cy5OYW1lICsgIichIiArIEV4Y2VsUmFuZ2UuR2V0QWRkcmVzcyhzdGFydFJvdyArIDEsIDYsIHJvdyAtIDEsIDYpOworCisgICAgICAgICAgICAgICAgICAgIGNoYXJ0LlNlcmllc1syXS5IZWFkZXIgPSAiVVNEL0dCUCI7CisgICAgICAgICAgICAgICAgICAgIGNoYXJ0LlNlcmllc1syXS5YU2VyaWVzID0gIiciICsgd3MuTmFtZSArICInISIgKyBFeGNlbFJhbmdlLkdldEFkZHJlc3Moc3RhcnRSb3cgKyAxLCAxLCByb3cgLSAxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcnQuU2VyaWVzWzJdLlNlcmllcyA9ICInIiArIHdzLk5hbWUgKyAiJyEiICsgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKHN0YXJ0Um93ICsgMSwgNywgcm93IC0gMSwgNyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBkb2N1bWV0IGFzIGEgYnl0ZSBhcnJheSBmcm9tIHRoZSBzdHJlYW0gYW5kIHNhdmUgaXQgdG8gZGlzay4gIChUaGlzIGlzIHVzZWZ1bGwgaW4gYSB3ZWJhcHBsaWNhdGlvbikgLi4uIAorICAgICAgICAgICAgICAgIEJ5dGVbXSBiaW4gPSBwLkdldEFzQnl0ZUFycmF5KCk7CisKKyAgICAgICAgICAgICAgICBzdHJpbmcgZmlsZSA9IG91dHB1dGRpciArICJcXHNhbXBsZTQueGxzeCI7CisgICAgICAgICAgICAgICAgRmlsZS5Xcml0ZUFsbEJ5dGVzKGZpbGUsIGJpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTUuY3MgYi9TYW1wbGVBcHAvU2FtcGxlNS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZjMmYxCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1NhbXBsZTUuY3MKQEAgLTAsMCArMSwxMDggQEAKK++7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KKyAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCisgKgorICoKKyAqIAorICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKKyAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyAqIAorICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAorICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKKyAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCisgKiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyAqCisgKgorICogQ29kZSBjaGFuZ2Ugbm90ZXM6CisgKiAKKyAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMDctSkFOLTIwMTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIE9mZmljZU9wZW5YbWw7ICAgIAordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKK25hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCit7CisgICAgY2xhc3MgU2FtcGxlNQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU2FtcGxlIDUgLSBvcGVuIFNhbXBsZSAxIGFuZCBhZGQgMiBuZXcgcm93cyBhbmQgYSBQaWVjaGFydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSdW5TYW1wbGU1KERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyB0ZW1wbGF0ZUZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMS54bHN4Iik7CisgICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTUueGxzeCIpOworICAgICAgICAgICAgaWYgKG5ld0ZpbGUuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0ZpbGUuRGVsZXRlKCk7ICAvLyBlbnN1cmVzIHdlIGNyZWF0ZSBhIG5ldyB3b3JrYm9vaworICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlNS54bHN4Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUsIHRlbXBsYXRlRmlsZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9PcGVuIHdvcmtzaGVldCAxCisgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5JbnNlcnRSb3coNSwgMik7CisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAiMTIwMTAiOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjUiXS5WYWx1ZSA9ICJEcmlsbCI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDNSJdLlZhbHVlID0gMjA7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENSJdLlZhbHVlID0gODsKKworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSA9ICIxMjAxMSI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCNiJdLlZhbHVlID0gIkNyb3diYXIiOworICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzYiXS5WYWx1ZSA9IDc7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENiJdLlZhbHVlID0gMjMuNDg7CisKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkUyOkU2Il0uRm9ybXVsYVIxQzEgPSAiUkNbLTJdKlJDWy0xXSI7ICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSB3b3Jrc2hlZXQuTmFtZXMuQWRkKCJTdWJUb3RhbE5hbWUiLCB3b3Jrc2hlZXQuQ2VsbHNbIkM3OkU3Il0pOworICAgICAgICAgICAgICAgIG5hbWUuU3R5bGUuRm9udC5JdGFsaWMgPSB0cnVlOworICAgICAgICAgICAgICAgIG5hbWUuRm9ybXVsYSA9ICJTVUJUT1RBTCg5LEMyOkM2KSI7CisKKyAgICAgICAgICAgICAgICAvL0Zvcm1hdCB0aGUgbmV3IHJvd3MKKyAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkM1OkM2Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENTpFNiJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAiOworCisgICAgICAgICAgICAgICAgdmFyIGNoYXJ0ID0gKHdvcmtzaGVldC5EcmF3aW5ncy5BZGRDaGFydCgiUGllQ2hhcnQiLCBlQ2hhcnRUeXBlLlBpZTNEKSBhcyBFeGNlbFBpZUNoYXJ0KTsKKworICAgICAgICAgICAgICAgIGNoYXJ0LlRpdGxlLlRleHQgPSAiVG90YWwiOworICAgICAgICAgICAgICAgIC8vRnJvbSByb3cgMSBjb2x1bSA1IHdpdGggZml2ZSBwaXhlbHMgb2Zmc2V0CisgICAgICAgICAgICAgICAgY2hhcnQuU2V0UG9zaXRpb24oMCwgMCwgNSwgNSk7CisgICAgICAgICAgICAgICAgY2hhcnQuU2V0U2l6ZSg2MDAsIDMwMCk7CisKKyAgICAgICAgICAgICAgICBFeGNlbEFkZHJlc3MgdmFsdWVBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygyLCA1LCA2LCA1KTsKKyAgICAgICAgICAgICAgICB2YXIgc2VyID0gKGNoYXJ0LlNlcmllcy5BZGQodmFsdWVBZGRyZXNzLkFkZHJlc3MsICJCMjpCNiIpIGFzIEV4Y2VsUGllQ2hhcnRTZXJpZSk7CisgICAgICAgICAgICAgICAgY2hhcnQuRGF0YUxhYmVsLlNob3dDYXRlZ29yeSA9IHRydWU7CisgICAgICAgICAgICAgICAgY2hhcnQuRGF0YUxhYmVsLlNob3dQZXJjZW50ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNoYXJ0LkxlZ2VuZC5Cb3JkZXIuTGluZVN0eWxlID0gZUxpbmVTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICBjaGFydC5MZWdlbmQuQm9yZGVyLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKKyAgICAgICAgICAgICAgICBjaGFydC5MZWdlbmQuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5EYXJrQmx1ZTsKKworICAgICAgICAgICAgICAgIC8vU3dpdGNoIHRoZSBQYWdlTGF5b3V0VmlldyBiYWNrIHRvIG5vcm1hbAorICAgICAgICAgICAgICAgIHdvcmtzaGVldC5WaWV3LlBhZ2VMYXlvdXRWaWV3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSBvdXIgbmV3IHdvcmtib29rIGFuZCB3ZSBhcmUgZG9uZSEKKyAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlNi5jcyBiL1NhbXBsZUFwcC9TYW1wbGU2LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDEwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvU2FtcGxlNi5jcwpAQCAtMCwwICsxLDU5NCBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNS1KQU4tMjAxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwordXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7CituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2FtcGxlIDYgLSBSZWFkcyB0aGUgZmlsZXN5c3RlbSBhbmQgbWFrZXMgYSByZXBvcnQuCisgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAKKyAgICBjbGFzcyBTYW1wbGU2CisgICAgeworICAgICAgICAjcmVnaW9uICJJY29uIEFQSSBmdW5jdGlvbiIKKyAgICAgICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwpXQorICAgICAgICBwdWJsaWMgc3RydWN0IFNIRklMRUlORk8KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEludFB0ciBoSWNvbjsKKyAgICAgICAgICAgIHB1YmxpYyBJbnRQdHIgaUljb247CisgICAgICAgICAgICBwdWJsaWMgdWludCBkd0F0dHJpYnV0ZXM7CisgICAgICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQnlWYWxUU3RyLCBTaXplQ29uc3QgPSAyNjApXQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBzekRpc3BsYXlOYW1lOworICAgICAgICAgICAgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJ5VmFsVFN0ciwgU2l6ZUNvbnN0ID0gODApXQorICAgICAgICAgICAgcHVibGljIHN0cmluZyBzelR5cGVOYW1lOworICAgICAgICB9OworICAgICAgICBwdWJsaWMgY29uc3QgdWludCBTSEdGSV9JQ09OID0gMHgxMDA7CisgICAgICAgIHB1YmxpYyBjb25zdCB1aW50IFNIR0ZJX0xBUkdFSUNPTiA9IDB4MDsgICAgLy8gJ0xhcmdlIGljb24KKyAgICAgICAgcHVibGljIGNvbnN0IHVpbnQgU0hHRklfU01BTExJQ09OID0gMHgxOyAgICAvLyAnU21hbGwgaWNvbgorICAgICAgICBbRGxsSW1wb3J0KCJzaGVsbDMyLmRsbCIpXQorICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgU0hHZXRGaWxlSW5mbyhzdHJpbmcgcHN6UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZHdGaWxlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiBTSEZJTEVJTkZPIHBzZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IGNiU2l6ZUZpbGVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCB1RmxhZ3MpOworICAgICAgICBbU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkRsbEltcG9ydCgidXNlcjMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LkF1dG8pXQorICAgICAgICBleHRlcm4gc3RhdGljIGJvb2wgRGVzdHJveUljb24oSW50UHRyIGhhbmRsZSk7CisgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgcHVibGljIGNsYXNzIFN0YXRJdGVtIDogSUNvbXBhcmFibGU8U3RhdEl0ZW0+CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHB1YmxpYyBsb25nIFNpemUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICAjcmVnaW9uIElDb21wYXJhYmxlPFN0YXRJdGVtPiBNZW1iZXJzCisKKyAgICAgICAgICAgIC8vRGVmYXVsdCBjb21wYXJlIFNpemUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKFN0YXRJdGVtIG90aGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBTaXplIDwgb3RoZXIuU2l6ZSA/IC0xIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2l6ZSA+IG90aGVyLlNpemUgPyAxIDogMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgaW50IF9tYXhMZXZlbHM7CisKKyAgICAgICAgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBTdGF0SXRlbT4gX2V4dFN0YXQgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFN0YXRJdGVtPigpOworICAgICAgICBzdGF0aWMgTGlzdDxTdGF0SXRlbT4gX2ZpbGVTaXplID0gbmV3IExpc3Q8U3RhdEl0ZW0+KCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNhbXBsZSA2IC0gUmVhZHMgdGhlIGZpbGVzeXN0ZW0gYW5kIG1ha2VzIGEgcmVwb3J0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dERpciI+T3V0cHV0IGRpcmVjdG9yeTwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyIj5EaXJlY3RvcnkgdG8gc2NhbjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVwdGgiPkhvdyBtYW55IGxldmVscz88L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNraXBJY29ucyI+U2tpcCB0aGUgaWNvbnMgaW4gY29sdW1uIEEuIEEgbG90IGZhc3RlcjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTYoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIsIERpcmVjdG9yeUluZm8gZGlyLCBpbnQgZGVwdGgsIGJvb2wgc2tpcEljb25zKQorICAgICAgICB7CisgICAgICAgICAgICBfbWF4TGV2ZWxzID0gZGVwdGg7CisKKyAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlNi54bHN4Iik7CisgICAgICAgICAgICBpZiAobmV3RmlsZS5FeGlzdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3RmlsZS5EZWxldGUoKTsgIC8vIGVuc3VyZXMgd2UgY3JlYXRlIGEgbmV3IHdvcmtib29rCisgICAgICAgICAgICAgICAgbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGU2Lnhsc3giKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHdvcmtib29rCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKTsKKyAgICAgICAgICAgIC8vQWRkIHRoZSBDb250ZW50IHNoZWV0CisgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbnRlbnQiKTsKKworICAgICAgICAgICAgd3MuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7CisKKyAgICAgICAgICAgIHdzLkNvbHVtbigxKS5XaWR0aCA9IDIuNTsKKyAgICAgICAgICAgIHdzLkNvbHVtbigyKS5XaWR0aCA9IDYwOworICAgICAgICAgICAgd3MuQ29sdW1uKDMpLldpZHRoID0gMTY7CisgICAgICAgICAgICB3cy5Db2x1bW4oNCkuV2lkdGggPSAyMDsKKyAgICAgICAgICAgIHdzLkNvbHVtbig1KS5XaWR0aCA9MjA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vVGhpcyBzZXQgdGhlIG91dGxpbmUgZm9yIGNvbHVtbiA0IGFuZCA1IGFuZCBoaWRlIHRoZW0KKyAgICAgICAgICAgIHdzLkNvbHVtbig0KS5PdXRsaW5lTGV2ZWwgPSAxOworICAgICAgICAgICAgd3MuQ29sdW1uKDQpLkNvbGxhcHNlZCA9IHRydWU7CisgICAgICAgICAgICB3cy5Db2x1bW4oNSkuT3V0bGluZUxldmVsID0gMTsKKyAgICAgICAgICAgIHdzLkNvbHVtbig1KS5Db2xsYXBzZWQgPSB0cnVlOworICAgICAgICAgICAgd3MuT3V0TGluZVN1bW1hcnlSaWdodCA9IHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vSGVhZGVycworICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiTmFtZSI7CisgICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5WYWx1ZSA9ICJTaXplIjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJEMSJdLlZhbHVlID0gIkNyZWF0ZWQiOworICAgICAgICAgICAgd3MuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiTGFzdCBtb2RpZmllZCI7CisgICAgICAgICAgICB3cy5DZWxsc1siQjE6RTEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOworCisgICAgICAgICAgICB3cy5WaWV3LkZyZWV6ZVBhbmVzKDIsMSk7CisgICAgICAgICAgICB3cy5TZWxlY3QoIkEyIik7CisgICAgICAgICAgICAvL2hlaWdodCBpcyAyMCBwaXhlbHMgCisgICAgICAgICAgICBkb3VibGUgaGVpZ2h0ID0gMjAgKiAwLjc1OworICAgICAgICAgICAgLy9TdGFydCBhdCByb3cgMjsKKyAgICAgICAgICAgIGludCByb3cgPSAyOworCisgICAgICAgICAgICAvL0xvYWQgdGhlIGRpcmVjdG9yeSBjb250ZW50IHRvIHNoZWV0IDEKKyAgICAgICAgICAgIHJvdyA9IEFkZERpcmVjdG9yeSh3cywgZGlyLCByb3csIGhlaWdodCwgMCwgc2tpcEljb25zKTsKKyAgICAgICAgICAgIHdzLk91dExpbmVTdW1tYXJ5QmVsb3cgPSBmYWxzZTsKKworICAgICAgICAgICAgLy9Gb3JtYXQgY29sdW1ucworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMywgcm93IC0gMSwgM10uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICB3cy5DZWxsc1sxLCA0LCByb3cgLSAxLCA0XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktTU0tZGQgaGg6bW0iOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgNSwgcm93IC0gMSwgNV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJ5eXl5LU1NLWRkIGhoOm1tIjsKKworICAgICAgICAgICAgLy9BZGQgdGhlIHRleHRib3gKKyAgICAgICAgICAgIHZhciBzaGFwZSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJ0eHREZXNjIiwgZVNoYXBlU3R5bGUuUmVjdCk7CisgICAgICAgICAgICBzaGFwZS5TZXRQb3NpdGlvbigxLCA1LCA2LCA1KTsKKyAgICAgICAgICAgIHNoYXBlLlNldFNpemUoNDAwLCAyMDApOworCisgICAgICAgICAgICBzaGFwZS5UZXh0ID0gIlRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSB2YXJpb3VzIGRyYXdpbmcgb2JqZWN0cyBsaWtlIHBpY3R1cmVzLCBzaGFwZXMgYW5kIGNoYXJ0cy5cblxyXG5cclRoZSBmaXJzdCBzaGVldCBjb250YWlucyBhbGwgc3ViZGlyZWN0b3JpZXMgYW5kIGZpbGVzIHdpdGggYW4gaWNvbiwgbmFtZSwgc2l6ZSBhbmQgZGF0ZXMuXG5cclxuXHJUaGUgc2Vjb25kIHNoZWV0IGNvbnRhaW5zIHN0YXRpc3RpY3MgYWJvdXQgZXh0ZW5zaW9ucyBhbmQgdGhlIHRvcC0xMCBsYXJnZXN0IGZpbGVzLiI7CisgICAgICAgICAgICBzaGFwZS5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7CisgICAgICAgICAgICBzaGFwZS5GaWxsLkNvbG9yID0gQ29sb3IuRGFya1NsYXRlR3JheTsKKyAgICAgICAgICAgIHNoYXBlLkZpbGwuVHJhbnNwYXJhbmN5ID0gMjA7CisgICAgICAgICAgICBzaGFwZS5Cb3JkZXIuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOworICAgICAgICAgICAgc2hhcGUuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuTG9uZ0Rhc2g7CisgICAgICAgICAgICBzaGFwZS5Cb3JkZXIuV2lkdGggPSAxOworICAgICAgICAgICAgc2hhcGUuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5CbGFjazsKKyAgICAgICAgICAgIHNoYXBlLkJvcmRlci5MaW5lQ2FwID0gZUxpbmVDYXAuUm91bmQ7CisgICAgICAgICAgICBzaGFwZS5UZXh0QW5jaG9yaW5nID0gZVRleHRBbmNob3JpbmdUeXBlLlRvcDsKKyAgICAgICAgICAgIHNoYXBlLlRleHRWZXJ0aWNhbCA9IGVUZXh0VmVydGljYWxUeXBlLkhvcml6b250YWw7CisgICAgICAgICAgICBzaGFwZS5UZXh0QW5jaG9yaW5nQ29udHJvbD1mYWxzZTsKKyAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwyLHJvdyw1XS5BdXRvRml0Q29sdW1ucygpOworCisgICAgICAgICAgICAvL0FkZCB0aGUgZ3JhcGggc2hlZXQKKyAgICAgICAgICAgIEFkZEdyYXBocyhwY2ssIHJvdywgZGlyLkZ1bGxOYW1lKTsKKworICAgICAgICAgICAgLy9BZGQgYSBIeXBlckxpbmsgdG8gdGhlIHN0YXRpc3RpY3Mgc2hlZXQuIAorICAgICAgICAgICAgdmFyIG5hbWVkU3R5bGUgPSBwY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoIkh5cGVyTGluayIpOyAgIC8vVGhpcyBvbmUgaXMgbGFuZ3VhZ2UgZGVwZW5kZW50CisgICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuVW5kZXJMaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIG5hbWVkU3R5bGUuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5CbHVlKTsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJLMTMiXS5IeXBlcmxpbmsgPSBuZXcgRXhjZWxIeXBlckxpbmsoIlN0YXRpc3RpY3MhQTEiLCAiU3RhdGlzdGljcyIpOworICAgICAgICAgICAgd3MuQ2VsbHNbIksxMyJdLlN0eWxlTmFtZSA9ICJIeXBlckxpbmsiOworCisgICAgICAgICAgICAvL1ByaW50ZXIgc2V0dGluZ3MKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5GaXRUb1BhZ2UgPSB0cnVlOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkZpdFRvV2lkdGggPSAxOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkZpdFRvSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzID0gbmV3IEV4Y2VsQWRkcmVzcygiMToxIik7IC8vUHJpbnQgdGl0bGVzCisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gd3MuQ2VsbHNbMSwgMSwgcm93IC0gMSwgNV07CisgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgIC8vRG9uZSEgc2F2ZSB0aGUgc2hlZXQKKyAgICAgICAgICAgIHBjay5TYXZlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXdGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFkZHMgdGhlIGNvbW1lbnQgdG8gdGhlIGhlYWRlciByb3cKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3cyI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRDb21tZW50cyhFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgICAgeworICAgICAgICAgICAgLy9BZGQgQ29tbWVudHMgdXNpbmcgdGhlIHJhbmdlIGNsYXNzCisgICAgICAgICAgICB2YXIgY29tbWVudCA9IHdzLkNlbGxzWyJBMyJdLkFkZENvbW1lbnQoIkphbiBLw6RsbG1hbjpcclxuIiwgIkpLIik7CisgICAgICAgICAgICBjb21tZW50LkZvbnQuQm9sZCA9IHRydWU7CisgICAgICAgICAgICB2YXIgcnQgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiVGhpcyBjb2x1bW4gY29udGFpbnMgdGhlIGV4dGVuc2lvbnMuIik7CisgICAgICAgICAgICBydC5Cb2xkID0gZmFsc2U7CisgICAgICAgICAgICBjb21tZW50LkF1dG9GaXQgPSB0cnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICAvL0FkZCBhIGNvbW1lbnQgdXNpbmcgdGhlIENvbW1lbnQgY29sbGVjdGlvbgorICAgICAgICAgICAgY29tbWVudCA9IHdzLkNvbW1lbnRzLkFkZCh3cy5DZWxsc1siQjMiXSwiVGhpcyBjb2x1bW4gY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGZpbGVzLiIsICJKSyIpOworICAgICAgICAgICAgLy9UaGlzIHNldHMgdGhlIHNpemUgYW5kIHBvc2l0aW9uLiAoVGhlIHBvc2l0aW9uIGlzIG9ubHkgd2hlbiB0aGUgY29tbWVudCBpcyB2aXNpYmxlKQorICAgICAgICAgICAgY29tbWVudC5Gcm9tLkNvbHVtbiA9IDc7CisgICAgICAgICAgICBjb21tZW50LkZyb20uUm93ID0gMzsKKyAgICAgICAgICAgIGNvbW1lbnQuVG8uQ29sdW1uID0gMTY7CisgICAgICAgICAgICBjb21tZW50LlRvLlJvdyA9IDg7CisgICAgICAgICAgICBjb21tZW50LkJhY2tncm91bmRDb2xvciA9IENvbG9yLldoaXRlOworICAgICAgICAgICAgY29tbWVudC5SaWNoVGV4dC5BZGQoIlxyXG5UbyBmb3JtYXQgdGhlIG51bWJlcnMgdXNlIHRoZSBOdW1iZXJmb3JtYXQtcHJvcGVydHkgbGlrZTpcclxuIik7CisKKyAgICAgICAgICAgIHdzLkNlbGxzWyJCMzpCNDIiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwIjsKKworICAgICAgICAgICAgLy9Gb3JtYXQgdGhlIGNvZGUgdXNpbmcgdGhlIFJpY2hUZXh0IENvbGxlY3Rpb24KKyAgICAgICAgICAgIHZhciByYyA9IGNvbW1lbnQuUmljaFRleHQuQWRkKCIvL0Zvcm1hdCB0aGUgU2l6ZSBhbmQgQ291bnQgY29sdW1uXHJcbiIpOworICAgICAgICAgICAgcmMuRm9udE5hbWUgPSAiQ291cmllciBOZXciOworICAgICAgICAgICAgcmMuQ29sb3IgPSBDb2xvci5Gcm9tQXJnYigwLCAxMjgsIDApOworICAgICAgICAgICAgcmMgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgid3MuQ2VsbHNbIik7CisgICAgICAgICAgICByYy5Db2xvciA9IENvbG9yLkJsYWNrOworICAgICAgICAgICAgcmMgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiXCJCMzpCNDJcIiIpOworICAgICAgICAgICAgcmMuQ29sb3IgPSBDb2xvci5Gcm9tQXJnYigxMjMsIDIxLCAyMSk7CisgICAgICAgICAgICByYyA9IGNvbW1lbnQuUmljaFRleHQuQWRkKCJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiKTsKKyAgICAgICAgICAgIHJjLkNvbG9yID0gQ29sb3IuQmxhY2s7CisgICAgICAgICAgICByYyA9IGNvbW1lbnQuUmljaFRleHQuQWRkKCJcIiMsIyMwXCIiKTsKKyAgICAgICAgICAgIHJjLkNvbG9yID0gQ29sb3IuRnJvbUFyZ2IoMTIzLCAyMSwgMjEpOworICAgICAgICAgICAgcmMgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiOyIpOworICAgICAgICAgICAgcmMuQ29sb3IgPSBDb2xvci5CbGFjazsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgdGhlIHNlY29uZCBzaGVldCBjb250YWluZyB0aGUgZ3JhcGhzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGNrIj5QYWNrYWdlPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dzIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlYWRlciI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRHcmFwaHMoRXhjZWxQYWNrYWdlIHBjaywgaW50IHJvd3MsIHN0cmluZyBkaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU3RhdGlzdGljcyIpOworICAgICAgICAgICAgd3MuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vU2V0IGZpcnN0IHRoZSBoZWFkZXIgYW5kIGZvcm1hdCBpdAorICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiU3RhdGlzdGljcyBmb3IgIjsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHIgPSB3cy5DZWxsc1siQTE6TzEiXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoIkFyaWFsIiwgMjIsIEZvbnRTdHlsZS5SZWd1bGFyKSk7CisgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOworICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigyMywgNTUsIDkzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vVXNlIHRoZSBSaWNoVGV4dCBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGZvbnQgZm9yIHRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgY2VsbAorICAgICAgICAgICAgdmFyIHJ0RGlyID0gd3MuQ2VsbHNbIkExIl0uUmljaFRleHQuQWRkKGRpcik7CisgICAgICAgICAgICBydERpci5Gb250TmFtZSA9ICJDb25zb2xhcyI7CisgICAgICAgICAgICBydERpci5TaXplPTE4OworCisgICAgICAgICAgICAvL1N0YXJ0IHdpdGggdGhlIEV4dGVudGlvbiBTaXplIAorICAgICAgICAgICAgTGlzdDxTdGF0SXRlbT4gbHN0ID0gbmV3IExpc3Q8U3RhdEl0ZW0+KF9leHRTdGF0LlZhbHVlcyk7ICAgICAgICAgICAKKyAgICAgICAgICAgIGxzdC5Tb3J0KCk7CisKKyAgICAgICAgICAgIC8vQWRkIHJvd3MKKyAgICAgICAgICAgIGludCByb3c9QWRkU3RhdFJvd3Mod3MsIGxzdCwgMiwgIkV4dGVuc2lvbnMiLCAiU2l6ZSIpOworCisgICAgICAgICAgICAvL0FkZCBjb21tZXRzIHRvIHRoZSBFeHRlbnNpb25zIGhlYWRlcgorICAgICAgICAgICAgQWRkQ29tbWVudHMod3MpOworCisgICAgICAgICAgICAvL0FkZCB0aGUgcGllY2hhcnQKKyAgICAgICAgICAgIHZhciBwaWVDaGFydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJjcnRFeHRlbnNpb25zU2l6ZSIsIGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRCkgYXMgRXhjZWxQaWVDaGFydDsKKyAgICAgICAgICAgIC8vU2V0IHRvcCBsZWZ0IGNvcm5lciB0byByb3cgMSBjb2x1bW4gMgorICAgICAgICAgICAgcGllQ2hhcnQuU2V0UG9zaXRpb24oMSwgMCwgMiwgMCk7CisgICAgICAgICAgICBwaWVDaGFydC5TZXRTaXplKDQwMCwgNDAwKTsKKyAgICAgICAgICAgIHBpZUNoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMsIDIsIHJvdy0xLCAyKSwgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMsIDEsIHJvdy0xLCAxKSk7CisKKyAgICAgICAgICAgIHBpZUNoYXJ0LlRpdGxlLlRleHQgPSAiRXh0ZW5zaW9uIFNpemUiOworICAgICAgICAgICAgLy9TZXQgZGF0YWxhYmVscyBhbmQgcmVtb3ZlIHRoZSBsZWdlbmQKKyAgICAgICAgICAgIHBpZUNoYXJ0LkRhdGFMYWJlbC5TaG93Q2F0ZWdvcnkgPSB0cnVlOworICAgICAgICAgICAgcGllQ2hhcnQuRGF0YUxhYmVsLlNob3dQZXJjZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHBpZUNoYXJ0LkRhdGFMYWJlbC5TaG93TGVhZGVyTGluZXMgPSB0cnVlOworICAgICAgICAgICAgcGllQ2hhcnQuTGVnZW5kLlJlbW92ZSgpOworCisgICAgICAgICAgICAvL1Jlc29ydCBvbiBDb3VudCBhbmQgYWRkIHRoZSByb3dzCisgICAgICAgICAgICBsc3QuU29ydCgoZmlyc3Qsc2Vjb25kKSA9PiBmaXJzdC5Db3VudCA8IHNlY29uZC5Db3VudCA/IC0xIDogZmlyc3QuQ291bnQgPiBzZWNvbmQuQ291bnQgPyAxIDogMCk7CisgICAgICAgICAgICByb3c9QWRkU3RhdFJvd3Mod3MsIGxzdCwgMTYsICIiLCAiQ291bnQiKTsKKworICAgICAgICAgICAgLy9BZGQgdGhlIERvdWdobnV0IGNoYXJ0CisgICAgICAgICAgICB2YXIgZG91Z2h0bnV0Q2hhcnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiY3J0RXh0ZW5zaW9uQ291bnQiLCBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQpIGFzIEV4Y2VsRG91Z2hudXRDaGFydDsKKyAgICAgICAgICAgIC8vU2V0IHBvc2l0aW9uIHRvIHJvdyAxIGNvbHVtbiA3IGFuZCAxNiBwaXhlbHMgb2Zmc2V0CisgICAgICAgICAgICBkb3VnaHRudXRDaGFydC5TZXRQb3NpdGlvbigxLCAwLCA4LCAxNik7CisgICAgICAgICAgICBkb3VnaHRudXRDaGFydC5TZXRTaXplKDQwMCwgNDAwKTsKKyAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDE2LCAyLCByb3cgLSAxLCAyKSwgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDE2LCAxLCByb3cgLSAxLCAxKSk7CisKKyAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LlRpdGxlLlRleHQgPSAiRXh0ZW5zaW9uIENvdW50IjsKKyAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LkRhdGFMYWJlbC5TaG93UGVyY2VudCA9IHRydWU7CisgICAgICAgICAgICBkb3VnaHRudXRDaGFydC5EYXRhTGFiZWwuU2hvd0xlYWRlckxpbmVzID0gdHJ1ZTsKKyAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUyNjsgLy8zRCBsb29rCisgICAgICAgICAgICAvL1RvcC0xMCBmaWxlc2l6ZQorICAgICAgICAgICAgX2ZpbGVTaXplLlNvcnQoKTsKKyAgICAgICAgICAgIHJvdz1BZGRTdGF0Um93cyh3cywgX2ZpbGVTaXplLCAyOSwgIkZpbGVzIiwgIlNpemUiKTsKKyAgICAgICAgICAgIHZhciBiYXJDaGFydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJjcnRGaWxlcyIsIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QpIGFzIEV4Y2VsQmFyQ2hhcnQ7CisgICAgICAgICAgICAvLzNkIFNldHRpbmdzCisgICAgICAgICAgICBiYXJDaGFydC5WaWV3M0QuUm90WCA9IDA7CisgICAgICAgICAgICBiYXJDaGFydC5WaWV3M0QuUGVyc3BlY3RpdmUgPSAwOworCisgICAgICAgICAgICBiYXJDaGFydC5TZXRQb3NpdGlvbigyMiwgMCwgMiwgMCk7CisgICAgICAgICAgICBiYXJDaGFydC5TZXRTaXplKDgwMCwgMzk4KTsKKyAgICAgICAgICAgIGJhckNoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMwLCAyLCByb3cgLSAxLCAyKSwgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMwLCAxLCByb3cgLSAxLCAxKSk7CisgICAgICAgICAgICAvL2JhckNoYXJ0LlNlcmllc1swXS5IZWFkZXIgPSAiU2l6ZSI7CisgICAgICAgICAgICBiYXJDaGFydC5UaXRsZS5UZXh0ID0gIlRvcCBGaWxlIHNpemUiOworCisgICAgICAgICAgICAvL0Zvcm1hdCB0aGUgU2l6ZSBhbmQgQ291bnQgY29sdW1uCisgICAgICAgICAgICB3cy5DZWxsc1siQjM6QjQyIl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICAvL1NldCBhIGJvcmRlciBhcm91bmQKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNDMiXS5TdHlsZS5Cb3JkZXIuTGVmdC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKKyAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpPMSJdLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47CisgICAgICAgICAgICB3cy5DZWxsc1siTzE6TzQzIl0uU3R5bGUuQm9yZGVyLlJpZ2h0LlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOworICAgICAgICAgICAgd3MuQ2VsbHNbIkE0MzpPNDMiXS5TdHlsZS5Cb3JkZXIuQm90dG9tLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOworICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMSwgcm93LCAyXS5BdXRvRml0Q29sdW1ucygxKTsKKworICAgICAgICAgICAgLy9BbmQgbGFzdCB0aGUgcHJpbnRlcnNldHRpbmdzCisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuT3JpZW50YXRpb24gPSBlT3JpZW50YXRpb24uTGFuZHNjYXBlOworICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkZpdFRvUGFnZSA9IHRydWU7CisgICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuU2NhbGUgPSA2NzsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBZGQgc3RhdGlzdGljLXJvd3MgdG8gdGhlIHN0YXRpc3RpY3Mgc2hlZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3MiPldvcmtzaGVldDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibHN0Ij5MaXN0IHdpdGggc3RhdGlzdGljczwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhcnRSb3ciPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVhZGVyIj5IZWFkZXIgdGV4dDwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5TaXplIG9yIENvdW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEFkZFN0YXRSb3dzKEV4Y2VsV29ya3NoZWV0IHdzLCBMaXN0PFN0YXRJdGVtPiBsc3QsIGludCBzdGFydFJvdywgc3RyaW5nIGhlYWRlciwgc3RyaW5nIHByb3BlcnR5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9BZGQgSGVhZGVycworICAgICAgICAgICAgaW50IHJvdyA9IHN0YXJ0Um93OworICAgICAgICAgICAgaWYgKGhlYWRlciAhPSAiIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDFdLlZhbHVlID0gaGVhZGVyOworICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHIgPSB3cy5DZWxsc1tyb3csIDEsIHJvdywgMl0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LlNldEZyb21Gb250KG5ldyBGb250KCJBcmlhbCIsIDE2LCBGb250U3R5bGUuSXRhbGljKSk7CisgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7CisgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlckNvbnRpbnVvdXM7CisgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoNzkgLCAxMjksIDE4OSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHRibFN0YXJ0PXJvdzsKKyAgICAgICAgICAgIC8vSGVhZGVyIDIKKyAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMV0uVmFsdWUgPSAiTmFtZSI7CisgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDJdLlZhbHVlID0gcHJvcGVydHlOYW1lOworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUmFuZ2UgciA9IHdzLkNlbGxzW3JvdywgMSwgcm93LCAyXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoIkFyaWFsIiwgMTIsIEZvbnRTdHlsZS5Cb2xkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgLy9BZGQgdG9wIDEwIHJvd3MKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobHN0LkNvdW50IC0gaSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDFdLlZhbHVlID0gbHN0W2xzdC5Db3VudCAtIGkgLSAxXS5OYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09ICJTaXplIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IGxzdFtsc3QuQ291bnQgLSBpIC0gMV0uU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMl0uVmFsdWUgPSBsc3RbbHN0LkNvdW50IC0gaSAtIDFdLkNvdW50OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvL0lmIHdlIGhhdmUgbW9yZSB0aGFuIDEwIGl0ZW1zLCBzdW0uLi4KKyAgICAgICAgICAgIGxvbmcgcmVzdCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzdC5Db3VudCAtIDEwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSAiU2l6ZSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN0ICs9IGxzdFtpXS5TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN0ICs9IGxzdFtpXS5Db3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLy4uLiBhbmQgYWRkIGFub3RoZXJzIHJvdworICAgICAgICAgICAgaWYgKHJlc3QgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMV0uVmFsdWUgPSAiT3RoZXJzIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDJdLlZhbHVlID0gcmVzdDsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDEsIHJvdywgMl0uU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMSwgcm93LCAyXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdyYXkpOworICAgICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1t0YmxTdGFydCwgMSwgcm93IC0gMSwgMl0sIG51bGwpOworICAgICAgICAgICAgdGJsLlRhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5NZWRpdW0xNjsKKyAgICAgICAgICAgIHRibC5TaG93VG90YWwgPSB0cnVlOworICAgICAgICAgICAgdGJsLkNvbHVtbnNbMV0uVG90YWxzUm93RnVuY3Rpb24gPSBSb3dGdW5jdGlvbnMuU3VtOworICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBKdXN0IGFsdGVycyB0aGUgY29sb3JzIGluIHRoZSBsaXN0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3MiPlRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+U3RhcnRyb3c8L3BhcmFtPgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFsdGVyQ29sb3IoRXhjZWxXb3Jrc2hlZXQgd3MsIGludCByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHJvd1JhbmdlID0gd3MuQ2VsbHNbcm93LCAxLCByb3csIDJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvd1JhbmdlLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKKyAgICAgICAgICAgICAgICBpZihyb3cgJSAyPT0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm93UmFuZ2UuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmF5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm93UmFuZ2UuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRZZWxsb3cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBBZGREaXJlY3RvcnkoRXhjZWxXb3Jrc2hlZXQgd3MsIERpcmVjdG9yeUluZm8gZGlyLCBpbnQgcm93LCBkb3VibGUgaGVpZ2h0LCBpbnQgbGV2ZWwsIGJvb2wgc2tpcEljb25zKQorICAgICAgICB7CisgICAgICAgICAgICAvL0dldCB0aGUgaWNvbiBhcyBhIGJpdG1hcAorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkRpcmVjdG9yeSAiICsgZGlyLk5hbWUpOworICAgICAgICAgICAgaWYgKCFza2lwSWNvbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQml0bWFwIGljb24gPSBHZXRJY29uKGRpci5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgICAgICB3cy5Sb3cocm93KS5IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAgICAgLy9BZGQgdGhlIGljb24gYXMgYSBwaWN0dXJlCisgICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGljdHVyZSBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJwaWMiICsgKHJvdykuVG9TdHJpbmcoKSwgaWNvbik7CisgICAgICAgICAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbigoaW50KTIwICogKHJvdyAtIDEpICsgMiwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IGRpci5OYW1lOworICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCA0XS5WYWx1ZSA9IGRpci5DcmVhdGlvblRpbWU7CisgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDVdLlZhbHVlID0gZGlyLkxhc3RBY2Nlc3NUaW1lOworCisgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDIsIHJvdywgNV0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vU2V0cyB0aGUgb3V0bGluZSBkZXB0aAorICAgICAgICAgICAgd3MuUm93KHJvdykuT3V0bGluZUxldmVsID0gbGV2ZWw7CisKKyAgICAgICAgICAgIGludCBwcmV2Um93ID0gcm93OworICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgICAvL0FkZCBzdWJkaXJlY3RvcmllcworICAgICAgICAgICAgZm9yZWFjaCAoRGlyZWN0b3J5SW5mbyBzdWJEaXIgaW4gZGlyLkdldERpcmVjdG9yaWVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgX21heExldmVscykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvdyA9IEFkZERpcmVjdG9yeSh3cywgc3ViRGlyLCByb3csIGhlaWdodCwgbGV2ZWwgKyAxLCBza2lwSWNvbnMpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9BZGQgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgZm9yZWFjaCAoRmlsZUluZm8gZmlsZSBpbiBkaXIuR2V0RmlsZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNraXBJY29ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBmaWxlSWNvbiA9IEdldEljb24oZmlsZS5GdWxsTmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgd3MuUm93KHJvdykuSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUljb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQaWN0dXJlIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoInBpYyIgKyAocm93KS5Ub1N0cmluZygpLCBmaWxlSWNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oKGludCkyMCAqIChyb3cgLSAxKSArIDIsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IGZpbGUuTmFtZTsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDNdLlZhbHVlID0gZmlsZS5MZW5ndGg7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCA0XS5WYWx1ZSA9IGZpbGUuQ3JlYXRpb25UaW1lOworICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgNV0uVmFsdWUgPSBmaWxlLkxhc3RBY2Nlc3NUaW1lOworCisgICAgICAgICAgICAgICAgd3MuUm93KHJvdykuT3V0bGluZUxldmVsID0gbGV2ZWwrMTsKKworICAgICAgICAgICAgICAgIEFkZFN0YXRpc3RpY3MoZmlsZSk7CisKKyAgICAgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9BZGQgYSBzdWJ0b3RhbCBmb3IgdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgaWYgKHJvdyAtMSA+IHByZXZSb3cpCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIHdzLkNlbGxzW3ByZXZSb3csIDNdLkZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVUJUT1RBTCg5LCB7MH0pIiwgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHByZXZSb3cgKyAxLCAzLCByb3cgLSAxLCAzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcHJldlJvdywgM10uVmFsdWUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFkZCBzdGF0aXN0aWNzIHRvIHRoZSBjb2xsZWN0aW9ucyAKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlIj48L3BhcmFtPgorICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZFN0YXRpc3RpY3MoRmlsZUluZm8gZmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9FeHRlbnNpb24KKyAgICAgICAgICAgIGlmIChfZXh0U3RhdC5Db250YWluc0tleShmaWxlLkV4dGVuc2lvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2V4dFN0YXRbZmlsZS5FeHRlbnNpb25dLkNvdW50Kys7CisgICAgICAgICAgICAgICAgX2V4dFN0YXRbZmlsZS5FeHRlbnNpb25dLlNpemUrPWZpbGUuTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBleHQgPSBmaWxlLkV4dGVuc2lvbi5MZW5ndGggPiAwID8gZmlsZS5FeHRlbnNpb24uUmVtb3ZlKDAsIDEpIDogIiI7CisgICAgICAgICAgICAgICAgX2V4dFN0YXQuQWRkKGZpbGUuRXh0ZW5zaW9uLCBuZXcgU3RhdEl0ZW0oKSB7IE5hbWUgPSBleHQsIENvdW50ID0gMSwgU2l6ZSA9IGZpbGUuTGVuZ3RoIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvL0ZpbGUgdG9wIDEwOworICAgICAgICAgICAgaWYgKF9maWxlU2l6ZS5Db3VudCA8IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9maWxlU2l6ZS5BZGQobmV3IFN0YXRJdGVtIHsgTmFtZSA9IGZpbGUuTmFtZSwgU2l6ZSA9IGZpbGUuTGVuZ3RoIH0pOworICAgICAgICAgICAgICAgIGlmIChfZmlsZVNpemUuQ291bnQgPT0gMTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlsZVNpemUuU29ydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoX2ZpbGVTaXplWzBdLlNpemUgPCBmaWxlLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZmlsZVNpemUuUmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgX2ZpbGVTaXplLkFkZChuZXcgU3RhdEl0ZW0geyBOYW1lID0gZmlsZS5OYW1lLCBTaXplID0gZmlsZS5MZW5ndGggfSk7CisgICAgICAgICAgICAgICAgX2ZpbGVTaXplLlNvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBpY29uIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRmlsZU5hbWUiPjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcCBHZXRJY29uKHN0cmluZyBGaWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0hGSUxFSU5GTyBzaGluZm8gPSBuZXcgU0hGSUxFSU5GTygpOyAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIHZhciByZXQgPSBTSEdldEZpbGVJbmZvKEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiBzaGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludClNYXJzaGFsLlNpemVPZihzaGluZm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hHRklfSUNPTiB8IFNIR0ZJX1NNQUxMSUNPTik7CisKKyAgICAgICAgICAgICAgICBpZiAoc2hpbmZvLmhJY29uID09IEludFB0ci5aZXJvKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIEJpdG1hcCBibXAgPSBJY29uLkZyb21IYW5kbGUoc2hpbmZvLmhJY29uKS5Ub0JpdG1hcCgpOworICAgICAgICAgICAgICAgIERlc3Ryb3lJY29uKHNoaW5mby5oSWNvbik7CisKKyAgICAgICAgICAgICAgICAvL0ZpeCB0cmFuc3BhcmFudCBjb2xvciAKKyAgICAgICAgICAgICAgICBDb2xvciBJbnZhbGlkQ29sb3IgPSBDb2xvci5Gcm9tQXJnYigwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB3ID0gMDsgdyA8IGJtcC5QaHlzaWNhbERpbWVuc2lvbi5XaWR0aDsgdysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaCA9IDA7IGggPCBibXAuUGh5c2ljYWxEaW1lbnNpb24uSGVpZ2h0OyBoKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibXAuR2V0UGl4ZWwodywgaCkgPT0gSW52YWxpZENvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcC5TZXRQaXhlbCh3LCBoLCBDb2xvci5UcmFuc3BhcmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYm1wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU3LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyZmZhZAotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9TYW1wbGU3LmNzCkBAIC0wLDAgKzEsMTEzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK25hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCit7CisgICAgY2xhc3MgU2FtcGxlNworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBzYW1wbGUgbG9hZCBhIG51bWJlciBvZiByb3dzLCBzdHlsZSB0aGVtIGFuZCBpbnNlcnQgYSByb3cgYXQgdGhlIHRvcC4KKyAgICAgICAgLy8vIEEgcGFzc3dvcmQgaXMgc2V0IHRvIHByb3RlY3QgbG9ja2VkIGNlbGxzLiBDb2x1bW4gMyAmIDQgd2lsbCBiZSBlZGl0YWJsZSwgdGhlIHJlc3Qgd2lsbCBiZSBsb2NrZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0RGlyIj48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvd3MiPjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTcoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIsIGludCBSb3dzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTcueGxzeCIpOworICAgICAgICAgICAgaWYgKG5ld0ZpbGUuRXhpc3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0ZpbGUuRGVsZXRlKCk7ICAvLyBlbnN1cmVzIHdlIGNyZWF0ZSBhIG5ldyB3b3JrYm9vaworICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlNy54bHN4Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezA6SEgubW0uc3N9XHRTdGFydGluZy4uLiIsIERhdGVUaW1lLk5vdyk7CisKKyAgICAgICAgICAgICAgICAvL0xvYWQgdGhlIHNoZWV0IHdpdGggb25lIHN0cmluZyBjb2x1bW4sIG9uZSBkYXRlIGNvbHVtbiBhbmQgYSBmZXcgcmFuZG9tIG51bWJlcnMuCisgICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGVyZm9ybWFuY2UgVGVzdCIpOworCisgICAgICAgICAgICAgICAgLy9Gb3JtYXQgYWxsIGNlbGxzCisgICAgICAgICAgICAgICAgRXhjZWxSYW5nZSBjb2xzID0gd3MuQ2VsbHNbIkE6WEZEIl07CisgICAgICAgICAgICAgICAgY29scy5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgY29scy5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdyYXkpOworCisgICAgICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDw9IFJvd3M7IHJvdysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3MuU2V0VmFsdWUocm93LCAxLCByb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBTZXRWYWx1ZSBtZXRob2QgaXMgYSBsaXR0bGUgYml0IGZhc3RlciB0aGFuIHVzaW5nIHRoZSBWYWx1ZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICB3cy5TZXRWYWx1ZShyb3csIDIsIHN0cmluZy5Gb3JtYXQoIlJvdyB7MH0iLCByb3cpKTsKKyAgICAgICAgICAgICAgICAgICAgd3MuU2V0VmFsdWUocm93LCAzLCBEYXRlVGltZS5Ub2RheS5BZGREYXlzKHJvdykpOworICAgICAgICAgICAgICAgICAgICB3cy5TZXRWYWx1ZShyb3csIDQsIHJuZC5OZXh0RG91YmxlKCkgKiAxMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgJSAxMDAwMCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezA6SEgubW0uc3N9XHRXcml0aW5nIHJvdyB7MX0uLi4iLCBEYXRlVGltZS5Ob3csIHJvdyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbMSwgNSwgUm93cywgNV0uRm9ybXVsYVIxQzEgPSAiUkNbLTRdK1JDWy0xXSI7CisKKyAgICAgICAgICAgICAgICAvL0FkZCBhIHN1bSBhdCB0aGUgZW5kCisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbUm93cyArIDEsIDVdLkZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTdW0oezB9KSIsIG5ldyBFeGNlbEFkZHJlc3MoMSwgNSwgUm93cywgNSkuQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbUm93cyArIDEsIDVdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbUm93cyArIDEsIDVdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAiOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0V3JpdGluZyByb3cgezF9Li4uIiwgRGF0ZVRpbWUuTm93LCBSb3dzKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezA6SEgubW0uc3N9XHRGb3JtYXR0aW5nLi4uIiwgRGF0ZVRpbWUuTm93KTsKKyAgICAgICAgICAgICAgICAvL0Zvcm1hdCB0aGUgZGF0ZSBhbmQgbnVtZXJpYyBjb2x1bW5zCisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMSwgUm93cywgMV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMywgUm93cywgM10uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJZWVlZLU1NLUREIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1sxLCA0LCBSb3dzLCA1XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwIjsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MDpISC5tbS5zc31cdEluc2VydCBhIHJvdyBhdCB0aGUgdG9wLi4uIiwgRGF0ZVRpbWUuTm93KTsKKyAgICAgICAgICAgICAgICAvL0luc2VydCBhIHJvdyBhdCB0aGUgdG9wLiBOb3RlIHRoYXQgdGhlIGZvcm11bGEtYWRkcmVzc2VzIGFyZSBzaGlmdGVkIGRvd24KKyAgICAgICAgICAgICAgICB3cy5JbnNlcnRSb3coMSwgMSk7CisKKyAgICAgICAgICAgICAgICAvL1dyaXRlIHRoZSBoZWFkZXJzIGFuZCBzdHlsZSB0aGVtCisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiSW5kZXgiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gIlRleHQiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJDMSJdLlZhbHVlID0gIkRhdGUiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJEMSJdLlZhbHVlID0gIk51bWJlciI7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiRm9ybXVsYSI7CisgICAgICAgICAgICAgICAgd3MuVmlldy5GcmVlemVQYW5lcygyLCAxKTsKKworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcm5nID0gd3MuQ2VsbHNbIkExOkUxIl0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBybmcuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuV2hpdGUpOworICAgICAgICAgICAgICAgICAgICBybmcuU3R5bGUuV3JhcFRleHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBybmcuU3R5bGUuVmVydGljYWxBbGlnbm1lbnQgPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50LkNlbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyOworICAgICAgICAgICAgICAgICAgICBybmcuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworICAgICAgICAgICAgICAgICAgICBybmcuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRGFya0JsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vQ2FsY3VsYXRlIChDb21tZW50ZWQgYXdheSB0aGlzaywgaXQgd2FzIGEgYml0IHRpbWUgY29uc3VtaW5nLi4uIC9NQSkKKyAgICAgICAgICAgICAgICAvLyBDb25zb2xlLldyaXRlTGluZSgiezA6SEgubW0uc3N9XHRDYWxjdWxhdGUgZm9ybXVsYXMuLi4iLCBEYXRlVGltZS5Ob3cpOworICAgICAgICAgICAgICAgIC8vIHdzLkNhbGN1bGF0ZSgpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0QXV0b2ZpdCBjb2x1bW5zIGFuZCBsb2NrIGFuZCBmb3JtYXQgY2VsbHMuLi4iLCBEYXRlVGltZS5Ob3cpOworICAgICAgICAgICAgICAgIHdzLkNlbGxzW1Jvd3MgLSAxMDAsIDEsIFJvd3MsIDVdLkF1dG9GaXRDb2x1bW5zKDUpOyAgIC8vQXV0byBmaXQgdXNpbmcgdGhlIGxhc3QgMTAwIHJvd3Mgd2l0aCBtaW5pbXVtIHdpZHRoIDUKKyAgICAgICAgICAgICAgICB3cy5Db2x1bW4oNSkuV2lkdGggPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIHNldCB0aGUgd2lkdGggZm9yIGNvbHVtbiBGIG1hbnVhbGx5IHNpbmNlIHRoZSBlbmQgc3VtIGZvcm11bGEgaXMgdGhlIHdpZGVzdCBjZWxsIGluIHRoZSBjb2x1bW4gKEVQUGx1cyBkb24ndCBjYWxjdWxhdGUgYW55IGZvcnVtbGFzLCBzbyBubyBvdXRwdXQgdGV4dCBpcyBhdmFsaWJsZSkuIAorCisgICAgICAgICAgICAgICAgLy9Ob3cgd2Ugc2V0IHRoZSBzaGVldHByb3RlY3Rpb24gYW5kIGEgcGFzc3dvcmQuCisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMywgUm93cyArIDEsIDRdLlN0eWxlLkxvY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWzIsIDMsIFJvd3MgKyAxLCA0XS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMywgUm93cyArIDEsIDRdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1sxLCA1LCBSb3dzICsgMiwgNV0uU3R5bGUuSGlkZGVuID0gdHJ1ZTsgICAgLy9IaWRlIHRoZSBmb3JtdWxhCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiRVBQbHVzIik7CisKKyAgICAgICAgICAgICAgICB3cy5TZWxlY3QoIkMyIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0U2F2aW5nLi4uIiwgRGF0ZVRpbWUuTm93KTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlLkNvbXByZXNzaW9uID0gQ29tcHJlc3Npb25MZXZlbC5CZXN0U3BlZWQ7CisgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezA6SEgubW0uc3N9XHREb25lISEiLCBEYXRlVGltZS5Ob3cpOworICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlOC5jcyBiL1NhbXBsZUFwcC9TYW1wbGU4LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTg5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvU2FtcGxlOC5jcwpAQCAtMCwwICsxLDExMyBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMSBNYXIgMjAxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBTeXN0ZW0uTGlucTsKK25hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5xU2FtcGxlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gdXNlIExpbnEgd2l0aCB0aGUgQ2VsbHMgY29sbGVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dERpciI+VGhlIHBhdGggd2hlcmUgc2FtcGxlNy54bHN4IGlzPC9wYXJhbT4KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJ1bkxpbnFTYW1wbGUoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCisgICAgICAgIHsKKwkgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJOb3cgb3BlbiBzYW1wbGUgNyBhZ2FpbiBhbmQgcGVyZm9ybSBzb21lIExpbnEgcXVlcmllcy4uLiIpOworCQkgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworCQkJRmlsZUluZm8gZXhpc3RpbmdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTcueGxzeCIpOworICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShleGlzdGluZ0ZpbGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vU2VsZWN0IGFsbCBjZWxscyBpbiBjb2x1bW4gZCBiZXR3ZWVuIDk5OTAgYW5kIDEwMDAwCisgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5MT0gKGZyb20gY2VsbCBpbiBzaGVldC5DZWxsc1siZDpkIl0gd2hlcmUgY2VsbC5WYWx1ZSBpcyBkb3VibGUgJiYgKGRvdWJsZSljZWxsLlZhbHVlID49IDk5OTAgJiYgKGRvdWJsZSljZWxsLlZhbHVlIDw9IDEwMDAwIHNlbGVjdCBjZWxsKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQcmludCBhbGwgY2VsbHMgd2l0aCB2YWx1ZSBiZXR3ZWVuIDk5OTAgYW5kIDEwMDAwIGluIGNvbHVtbiBEIC4uLiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHF1ZXJ5MSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDZWxsIHswfSBoYXMgdmFsdWUgezE6TjB9IiwgY2VsbC5BZGRyZXNzLCBjZWxsLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9IGNlbGxzIGZvdW5kIC4uLiIsY291bnQpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAvL1NlbGVjdCBhbGwgYm9sZCBjZWxscworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJOb3cgZ2V0IGFsbCBib2xkIGNlbGxzIGZyb20gdGhlIGVudGlyZSBzaGVldC4uLiIpOworICAgICAgICAgICAgICAgIHZhciBxdWVyeTIgPSAoZnJvbSBjZWxsIGluIHNoZWV0LkNlbGxzW3NoZWV0LkRpbWVuc2lvbi5BZGRyZXNzXSB3aGVyZSBjZWxsLlN0eWxlLkZvbnQuQm9sZCBzZWxlY3QgY2VsbCk7CisgICAgICAgICAgICAgICAgLy9JZiB5b3UgaGF2ZSBhIGNsdWUgd2hlcmUgdGhlIGRhdGEgaXMsIHNwZWNpZnkgYSBzbWFsbGVyIHJhbmdlIGluIHRoZSBjZWxscyBpbmRleGVyIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UgKGZvciBleGFtcGxlICIxOjEsNjU1MzY6NjU1MzYiIGhlcmUpCisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHF1ZXJ5MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoY2VsbC5Gb3JtdWxhKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNlbGwgezB9IGlzIGJvbGQgYW5kIGhhcyBhIGZvcm11bGEgb2YgezE6TjB9IiwgY2VsbC5BZGRyZXNzLCBjZWxsLkZvcm11bGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNlbGwgezB9IGlzIGJvbGQgYW5kIGhhcyBhIHZhbHVlIG9mIHsxOk4wfSIsIGNlbGwuQWRkcmVzcywgY2VsbC5WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0hlcmUgd2UgdXNlIG1vcmUgdGhhbiBvbmUgY29sdW1uIGluIHRoZSB3aGVyZSBjbGF1c2UuIFdlIHN0YXJ0IGJ5IHNlYXJjaGluZyBjb2x1bW4gRCwgdGhlbiB1c2UgdGhlIE9mZnNldCBtZXRob2QgdG8gY2hlY2sgdGhlIHZhbHVlIG9mIGNvbHVtbiBDLgorICAgICAgICAgICAgICAgIHZhciBxdWVyeTMgPSAoZnJvbSBjZWxsIGluIHNoZWV0LkNlbGxzWyJkOmQiXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgY2VsbC5WYWx1ZSBpcyBkb3VibGUgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWNlbGwuVmFsdWUgPj0gOTUwMCAmJiAoZG91YmxlKWNlbGwuVmFsdWUgPD0gMTAwMDAgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLk9mZnNldCgwLCAtMSkuR2V0VmFsdWU8RGF0ZVRpbWU+KCkuWWVhciA9PSBEYXRlVGltZS5Ub2RheS5ZZWFyKzEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgY2VsbCk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQcmludCBhbGwgY2VsbHMgd2l0aCBhIHZhbHVlIGJldHdlZW4gOTUwMCBhbmQgMTAwMDAgaW4gY29sdW1uIEQgYW5kIHRoZSB5ZWFyIG9mIENvbHVtbiBDIGlzIHswfSAuLi4iLCBEYXRlVGltZS5Ub2RheS5ZZWFyICsgMSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsgICAgCisKKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcXVlcnkzKSAgICAvL1RoZSBjZWxscyByZXR1cm5lZCBoZXJlIHdpbGwgYWxsIGJlIGluIGNvbHVtbiBELCBzaW5jZSB0aGF0IGlzIHRoZSBhZGRyZXNzIGluIHRoZSBpbmRleGVyLiBVc2UgdGhlIE9mZnNldCBtZXRob2QgdG8gcHJpbnQgYW55IG90aGVyIGNlbGxzIGZyb20gdGhlIHNhbWUgcm93LgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNlbGwgezB9IGhhcyB2YWx1ZSB7MTpOMH0gRGF0ZSBpcyB7MjpkfSIsIGNlbGwuQWRkcmVzcywgY2VsbC5WYWx1ZSwgY2VsbC5PZmZzZXQoMCwgLTEpLkdldFZhbHVlPERhdGVUaW1lPigpKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlOS5jcyBiL1NhbXBsZUFwcC9TYW1wbGU5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2M1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvU2FtcGxlOS5jcwpAQCAtMCwwICsxLDE5NiBAQAor77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKiAKKyAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgorICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogCisgKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAorICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorICogCisgKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCisgKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAorICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKyAqIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorICoKKyAqCisgKiBDb2RlIGNoYW5nZSBub3RlczoKKyAqIAorICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyOCBPY3QgMjAxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byBsb2FkIENTViBmaWxlcyB1c2luZyB0aGUgTG9hZEZyb21UZXh0IG1ldGhvZCwgaG93IHRvIHVzZSB0YWJsZXMgYW5kCisgICAgLy8vIGhvdyB0byB1c2UgY2hhcnRzIHdpdGggbW9yZSB0aGFuIG9uZSBjaGFydHR5cGUgYW5kIHNlY29uZGFyeSBheGlzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhbXBsZTkKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvYWRzIHR3byBDU1YgZmlsZXMgaW50byB0YWJsZXMgYW5kIGFkZHMgYSBjaGFydCB0byBlYWNoIHNoZWV0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dERpciI+PC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUnVuU2FtcGxlOShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGU5Lnhsc3giKTsKKyAgICAgICAgICAgIGlmIChuZXdGaWxlLkV4aXN0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKKyAgICAgICAgICAgICAgICBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTkueGxzeCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9hZEZpbGUxKHBhY2thZ2UpOworICAgICAgICAgICAgICAgIExvYWRGaWxlMihwYWNrYWdlKTsKKworICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ld0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBMb2FkRmlsZTEoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBXb3Jrc2hlZXQKKyAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNzdjEiKTsKKworICAgICAgICAgICAgLy9DcmVhdGUgdGhlIGZvcm1hdCBvYmplY3QgdG8gZGVzY3JpYmUgdGhlIHRleHQgZmlsZQorICAgICAgICAgICAgdmFyIGZvcm1hdCA9IG5ldyBFeGNlbFRleHRGb3JtYXQoKTsKKyAgICAgICAgICAgIGZvcm1hdC5UZXh0UXVhbGlmaWVyID0gJyInOworICAgICAgICAgICAgZm9ybWF0LlNraXBMaW5lc0JlZ2lubmluZyA9IDI7CisgICAgICAgICAgICBmb3JtYXQuU2tpcExpbmVzRW5kID0gMTsKKworICAgICAgICAgICAgLy9Ob3cgcmVhZCB0aGUgZmlsZSBpbnRvIHRoZSBzaGVldC4gU3RhcnQgZnJvbSBjZWxsIEExLiBDcmVhdGUgYSB0YWJsZSB3aXRoIHN0eWxlIDI3LiBGaXJzdCByb3cgY29udGFpbnMgdGhlIGhlYWRlci4KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMb2FkIHRoZSB0ZXh0IGZpbGUuLi4iKTsKKyAgICAgICAgICAgIHZhciByYW5nZSA9IHNoZWV0LkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dChuZXcgRmlsZUluZm8oIi4uXFwuLlxcY3N2XFxTYW1wbGU5LTEudHh0IiksIGZvcm1hdCwgVGFibGVTdHlsZXMuTWVkaXVtMjcsIHRydWUpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRm9ybWF0IHRoZSB0YWJsZS4uLiIpOworICAgICAgICAgICAgLy9UYWJsZXMgZG9uJ3Qgc3VwcG9ydCBjdXN0b20gc3R5bGluZyBhdCB0aGlzIHN0YWdlKHlvdSBjYW4gb2YgY291cnNlIGZvcm1hdCB0aGUgY2VsbHMpLCBidXQgd2UgY2FuIGNyZWF0ZSBhIE5hbWVkc3R5bGUgZm9yIGEgY29sdW1uLi4uCisgICAgICAgICAgICB2YXIgZGF0ZVN0eWxlID0gcGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiVGFibGVEYXRlIik7CisgICAgICAgICAgICBkYXRlU3R5bGUuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJZWVlZLU1NIjsKKworICAgICAgICAgICAgdmFyIG51bVN0eWxlID0gcGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiVGFibGVOdW1iZXIiKTsKKyAgICAgICAgICAgIG51bVN0eWxlLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMCI7CisKKyAgICAgICAgICAgIC8vTm93IGZvcm1hdCB0aGUgdGFibGUuLi4KKyAgICAgICAgICAgIHZhciB0YmwgPSBzaGVldC5UYWJsZXNbMF07CisgICAgICAgICAgICB0YmwuU2hvd1RvdGFsID0gdHJ1ZTsKKyAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLlRvdGFsc1Jvd0xhYmVsID0gIlRvdGFsIjsKKyAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLkRhdGFDZWxsU3R5bGVOYW1lID0gIlRhYmxlRGF0ZSI7CisgICAgICAgICAgICB0YmwuQ29sdW1uc1sxXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1sxXS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7CisgICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7CisgICAgICAgICAgICB0YmwuQ29sdW1uc1szXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1szXS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s0XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s0XS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s2XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s2XS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDcmVhdGUgdGhlIGNoYXJ0Li4uIik7CisgICAgICAgICAgICAvL05vdyBhZGQgYSBzdGFja2VkIGFyZWFjaGFydC4uLgorICAgICAgICAgICAgdmFyIGNoYXJ0ID0gc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQoImNoYXJ0MSIsIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQpOworICAgICAgICAgICAgY2hhcnQuU2V0UG9zaXRpb24oMCwgNjMwKTsKKyAgICAgICAgICAgIGNoYXJ0LlNldFNpemUoODAwLCA2MDApOworCisgICAgICAgICAgICAvL0NyZWF0ZSBvbmUgc2VyaWVzIGZvciBlYWNoIGNvbHVtbi4uLgorICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMTsgY29sIDwgNzsgY29sKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNlciA9IGNoYXJ0LlNlcmllcy5BZGQocmFuZ2UuT2Zmc2V0KDEsIGNvbCwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpLCByYW5nZS5PZmZzZXQoMSwgMCwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpKTsKKyAgICAgICAgICAgICAgICBzZXIuSGVhZGVyQWRkcmVzcyA9IHJhbmdlLk9mZnNldCgwLCBjb2wsIDEsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvL1NldCB0aGUgc3R5bGUgdG8gMjcuCisgICAgICAgICAgICBjaGFydC5TdHlsZSA9IGVDaGFydFN0eWxlLlN0eWxlMjc7CisKKyAgICAgICAgICAgIHNoZWV0LlZpZXcuU2hvd0dyaWRMaW5lcyA9IGZhbHNlOworICAgICAgICAgICAgc2hlZXQuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICBzaGVldC5DZWxsc1tzaGVldC5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTG9hZEZpbGUyKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgV29ya3NoZWV0CisgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDc3YyIik7CisKKyAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBmb3JtYXQgb2JqZWN0IHRvIGRlc2NyaWJlIHRoZSB0ZXh0IGZpbGUKKyAgICAgICAgICAgIHZhciBmb3JtYXQgPSBuZXcgRXhjZWxUZXh0Rm9ybWF0KCk7CisgICAgICAgICAgICBmb3JtYXQuRGVsaW1pdGVyPSdcdCc7IC8vVGFiCisgICAgICAgICAgICBmb3JtYXQuU2tpcExpbmVzQmVnaW5uaW5nID0gMTsKKyAgICAgICAgICAgIEN1bHR1cmVJbmZvIGNpID0gbmV3IEN1bHR1cmVJbmZvKCJzdi1TRSIpOyAgICAgICAgICAvL1VzZSB5b3VyIGNob2ljZSBvZiBDdWx0dXJlCisgICAgICAgICAgICBjaS5OdW1iZXJGb3JtYXQuTnVtYmVyRGVjaW1hbFNlcGFyYXRvciA9ICIsIjsgICAgICAgLy9EZWNpbWFsIGlzIGNvbW1hCisgICAgICAgICAgICBmb3JtYXQuQ3VsdHVyZSA9IGNpOworCisgICAgICAgICAgICAvL05vdyByZWFkIHRoZSBmaWxlIGludG8gdGhlIHNoZWV0LgorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxvYWQgdGhlIHRleHQgZmlsZS4uLiIpOworICAgICAgICAgICAgdmFyIHJhbmdlID0gc2hlZXQuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KG5ldyBGaWxlSW5mbygiLi5cXC4uXFxjc3ZcXFNhbXBsZTktMi50eHQiKSwgZm9ybWF0KTsKKworICAgICAgICAgICAgLy9BZGQgYSBmb3JtdWxhCisgICAgICAgICAgICByYW5nZS5PZmZzZXQoMSwgcmFuZ2UuRW5kLkNvbHVtbiwgcmFuZ2UuRW5kLlJvdyAtIHJhbmdlLlN0YXJ0LlJvdywgMSkuRm9ybXVsYVIxQzEgPSAiUkNbLTFdLVJDWy0yXSI7CisKKyAgICAgICAgICAgIC8vQWRkIGEgdGFibGUuLi4KKyAgICAgICAgICAgIHZhciB0YmwgPSBzaGVldC5UYWJsZXMuQWRkKHJhbmdlLk9mZnNldCgwLDAscmFuZ2UuRW5kLlJvdy1yYW5nZS5TdGFydC5Sb3crMSwgcmFuZ2UuRW5kLkNvbHVtbi1yYW5nZS5TdGFydC5Db2x1bW4rMiksIlRhYmxlIik7CisgICAgICAgICAgICB0YmwuU2hvd1RvdGFsID0gdHJ1ZTsKKyAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLlRvdGFsc1Jvd0xhYmVsID0gIlRvdGFsIjsKKyAgICAgICAgICAgIHRibC5Db2x1bW5zWzFdLlRvdGFsc1Jvd0Zvcm11bGEgPSAiQ09VTlQoMyxUYWJsZVtQcm9kdWN0XSkiOyAgICAvL0FkZCBhIGN1c3RvbSBmb3JtdWxhCisgICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1szXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s0XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07CisgICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5OYW1lID0gIlByb2ZpdCI7CisgICAgICAgICAgICB0YmwuVGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk1lZGl1bTEwOworCisgICAgICAgICAgICBzaGVldC5DZWxsc1tzaGVldC5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKKworICAgICAgICAgICAgLy9BZGQgYSBjaGFydCB3aXRoIHR3byBjaGFydHR5cGVzIChDb2x1bW4gYW5kIExpbmUpIGFuZCBhIHNlY29uZGFyeSBheGlzLi4uCisgICAgICAgICAgICB2YXIgY2hhcnQgPSBzaGVldC5EcmF3aW5ncy5BZGRDaGFydCgiY2hhcnQyIiwgZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkKTsKKyAgICAgICAgICAgIGNoYXJ0LlNldFBvc2l0aW9uKDAsIDU0MCk7CisgICAgICAgICAgICBjaGFydC5TZXRTaXplKDgwMCwgNjAwKTsKKyAgICAgICAgCisgICAgICAgICAgICB2YXIgc2VyaWUxPSBjaGFydC5TZXJpZXMuQWRkKHJhbmdlLk9mZnNldCgxLCAzLCByYW5nZS5FbmQuUm93IC0gMSwgMSksIHJhbmdlLk9mZnNldCgxLCAxLCByYW5nZS5FbmQuUm93IC0gMSwgMSkpOworICAgICAgICAgICAgc2VyaWUxLkhlYWRlciA9ICJQdXJjaGFzZSBQcmljZSI7CisgICAgICAgICAgICB2YXIgc2VyaWUyID0gY2hhcnQuU2VyaWVzLkFkZChyYW5nZS5PZmZzZXQoMSwgNSwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpLCByYW5nZS5PZmZzZXQoMSwgMSwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpKTsKKyAgICAgICAgICAgIHNlcmllMi5IZWFkZXIgPSAiUHJvZml0IjsKKworICAgICAgICAgICAgLy9BZGQgYSBMaW5lIHNlcmllcworICAgICAgICAgICAgdmFyIGNoYXJ0VHlwZTIgPSBjaGFydC5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLkxpbmVTdGFja2VkKTsKKyAgICAgICAgICAgIGNoYXJ0VHlwZTIuVXNlU2Vjb25kYXJ5QXhpcyA9IHRydWU7CisgICAgICAgICAgICB2YXIgc2VyaWUzID0gY2hhcnRUeXBlMi5TZXJpZXMuQWRkKHJhbmdlLk9mZnNldCgxLCAyLCByYW5nZS5FbmQuUm93IC0gMSwgMSksIHJhbmdlLk9mZnNldCgxLCAwLCByYW5nZS5FbmQuUm93IC0gMSwgMSkpOworICAgICAgICAgICAgc2VyaWUzLkhlYWRlciA9ICJJdGVtcyBpbiBzdG9jayI7CisKKyAgICAgICAgICAgIC8vQnkgZGVmYXVsdCB0aGUgc2Vjb25kYXJ5IFhBeGlzIGlzIG5vdCB2aXNpYmxlLCBidXQgd2Ugd2FudCB0byBzaG93IGl0Li4uCisgICAgICAgICAgICBjaGFydFR5cGUyLlhBeGlzLkRlbGV0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNoYXJ0VHlwZTIuWEF4aXMuVGlja0xhYmVsUG9zaXRpb24gPSBlVGlja0xhYmVsUG9zaXRpb24uSGlnaDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9TZXQgdGhlIG1heCB2YWx1ZSBmb3IgdGhlIFkgYXhpcy4uLgorICAgICAgICAgICAgY2hhcnRUeXBlMi5ZQXhpcy5NYXhWYWx1ZSA9IDUwOworCisgICAgICAgICAgICBjaGFydC5TdHlsZSA9IGVDaGFydFN0eWxlLlN0eWxlMjY7CisgICAgICAgICAgICBzaGVldC5WaWV3LlNob3dHcmlkTGluZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZV9BZGRGb3JtdWxhRnVuY3Rpb24uY3MgYi9TYW1wbGVBcHAvU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTJlMzBlCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1NhbXBsZV9BZGRGb3JtdWxhRnVuY3Rpb24uY3MKQEAgLTAsMCArMSwxMzIgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7CisKK25hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gYWRkIGZ1bmN0aW9ucyB0byB0aGUgRm9ybXVsYVBhcnNlciBvZiBFUFBsdXMuCisgICAgLy8vIAorICAgIC8vLyBGb3IgZnVydGhlciBkZXRhaWxzIG9uIGhvdyB0byBidWlsZCBmdW5jdGlvbnMsIGhhdmUgYSBsb29rIGluIHRoZSBFUFBsdXMuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zIG5hbWVzcGFjZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY2xhc3MgU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJ1blNhbXBsZV9BZGRGb3JtdWxhRnVuY3Rpb24oKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYWRkIHlvdXIgZnVuY3Rpb24gbW9kdWxlIHRvIHRoZSBwYXJzZXIKKyAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkxvYWRGdW5jdGlvbk1vZHVsZShuZXcgTXlGdW5jdGlvbk1vZHVsZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpZiB5b3UgZG9udCB3YW50IHRvIHdyaXRlIGEgbW9kdWxlLCB5b3UgY2FuIGFsc28KKyAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGZ1bmN0aW9ucyB0byB0aGUgcGFyc2VyIHRoaXMgd2F5OgorICAgICAgICAgICAgICAgIC8vIHBhY2thZ2UuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuQWRkT3JSZXBsYWNlRnVuY3Rpb24oInN1bS5hZGR0d28iLCBuZXcgU3VtQWRkVHdvKCkpOy0KKyAgICAgICAgICAgICAgICAvLyBwYWNrYWdlLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkFkZE9yUmVwbGFjZUZ1bmN0aW9uKCJzZWFuY29ubmVyeWZ5IiwgbmV3IFNlYW5Db25uZXJ5ZnkoKSk7CisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAvL092ZXJyaWRlIHRoZSBidWlsZGluIFRleHQgZnVuY3Rpb24gdG8gaGFuZGxlIHN3ZWRpc2ggZGF0ZSBmb3JtYXR0aW5nIHN0cmluZ3MuIEV4Y2VsIGhhcyBsb2NhbGl6ZWQgZGF0ZSBmb3JtYXQgc3RyaW5ncyB3aXRoIGlzIG5vdyBzdXBwb3J0ZWQgYnkgRVBQbHVzLgorICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuQWRkT3JSZXBsYWNlRnVuY3Rpb24oInRleHQiLCBuZXcgVGV4dFN3ZWRpc2goKSk7CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB3b3Jrc2hlZXQgd2l0aCBzb21lIGR1bW15IGRhdGEKKyAgICAgICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7CisgICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siUDMiXS5Gb3JtdWxhID0gIlNVTShBMTpBMikiOworICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gIkhlbGxvIjsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEzLDEyLDMxKTsKKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQzIiXS5Gb3JtdWxhPSJUZXh0KEMxLFwiw6XDpcOlw6UtTU0tZGRcIikiOyAgIC8vU3dlZGlzaCBmb3JtYXR0aW5nCisgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBhZGRlZCAic3VtLmFkZHR3byIgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIlNVTS5BRERUV08oQTE6QTIsUDMpIjsKKyAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIG90aGVyIGZ1bmN0aW9uICJzZWFuY29ubmVyeWZ5IgorICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMiJdLkZvcm11bGEgPSAic2VhbmNvbm5lcnlmeShCMSkiOworCisgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlCisgICAgICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHNob3cgcmVzdWx0CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInN1bS5hZGR0d28oQTE6QTIsUDMpIGV2YWx1YXRlZCB0byB7MH0iLCB3cy5DZWxsc1siQTQiXS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInNlYW5jb25uZXJ5ZnkoQjEpIGV2YWx1YXRlZCB0byB7MH0iLCB3cy5DZWxsc1siQjIiXS5WYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBNeUZ1bmN0aW9uTW9kdWxlIDogSUZ1bmN0aW9uTW9kdWxlCisgICAgeworICAgICAgICBwdWJsaWMgTXlGdW5jdGlvbk1vZHVsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZ1bmN0aW9ucyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeyJzdW0uYWRkdHdvIiwgbmV3IFN1bUFkZFR3bygpfSwKKyAgICAgICAgICAgICAgICAgICAgeyJzZWFuY29ubmVyeWZ5IiwgbmV3IFNlYW5Db25uZXJ5ZnkoKX0KKyAgICAgICAgICAgICAgICB9OyAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+IEZ1bmN0aW9ucyB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgcmVhbGx5IHVubmVjZXNzYXJ5IGZ1bmN0aW9uLiBBZGRzIHR3byB0byBhbGwgbnVtYmVycyBpbiB0aGUgc3VwcGxpZWQgcmFuZ2UgYW5kIGNhbGN1bGF0ZXMgdGhlIHN1bS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGNsYXNzIFN1bUFkZFR3byA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2ssIHdpbGwgc2V0IGV4Y2VsIFZBTFVFIGVycm9yIGlmIG1pbiBsZW5ndGggaXMgbm90IG1ldAorICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSGVscGVyIG1ldGhvZCB0aGF0IGNvbnZlcnRzIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byBhbiBlbnVtZXJhYmxlIG9mIGRvdWJsZXMKKyAgICAgICAgICAgIHZhciBudW1iZXJzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmd1bWVudHMsIGNvbnRleHQpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEbyB0aGUgd29yaworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IDBkOworICAgICAgICAgICAgbnVtYmVycy5Ub0xpc3QoKS5Gb3JFYWNoKHggPT4gcmVzdWx0ICs9ICh4ICsgMikpOworCisgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICB9CisgICAgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFN3ZWRpc2ggZm9ybWF0dGluZyBzdHJpbmdzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY2xhc3MgVGV4dFN3ZWRpc2ggOiBFeGNlbEZ1bmN0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLCB3aWxsIHNldCBleGNlbCBWQUxVRSBlcnJvciBpZiBtaW4gbGVuZ3RoIGlzIG5vdCBtZXQKKyAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisKKyAgICAgICAgICAgIC8vUmVwbGFjZSBzd2VkaXNoIHllYXIgZm9ybWF0IHdpdGggaW52YXJpYW50IGZvciBwYXJhbWV0ZXIgMi4KKyAgICAgICAgICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlLlRvU3RyaW5nKCkuUmVwbGFjZSgiw6XDpcOlw6UiLCAieXl5eSIpOyAgIAorICAgICAgICAgICAgdmFyIG5ld0FyZ3MgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkgfTsKKyAgICAgICAgICAgIG5ld0FyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KGZvcm1hdCkpOworCisgICAgICAgICAgICAvL1VzZSB0aGUgYnVpbGQtaW4gVGV4dCBmdW5jdGlvbi4KKyAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBmdW5jLkV4ZWN1dGUobmV3QXJncywgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGV2ZW4gbW9yZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbiwgaW5zcGlyZWQgYnkgdGhlIFNlYW4gQ29ubmVyeSBrZXlib2FyZDspIFdpbGwgYWRkICdzaCcgYXQgdGhlIGVuZCBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY2xhc3MgU2VhbkNvbm5lcnlmeSA6IEV4Y2VsRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2ssIHdpbGwgc2V0IGV4Y2VsIFZBTFVFIGVycm9yIGlmIG1pbiBsZW5ndGggaXMgbm90IG1ldAorICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgZmlyc3QgYXJnCisgICAgICAgICAgICB2YXIgaW5wdXQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworCisgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChpbnB1dCArICJzaCIsIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlX0Zvcm11bGFDYWxjLmNzIGIvU2FtcGxlQXBwL1NhbXBsZV9Gb3JtdWxhQ2FsYy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2FkMzNjCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1NhbXBsZV9Gb3JtdWxhQ2FsYy5jcwpAQCAtMCwwICsxLDYzIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBPZmZpY2VPcGVuWG1sOworCituYW1lc3BhY2UgRVBQbHVzU2FtcGxlcworeworICAgIGNsYXNzIFNhbXBsZV9Gb3JtdWxhQ2FsYworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJ1blNhbXBsZUZvcm11bGFDYWxjKCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB3czEgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ3czEiKTsKKyAgICAgICAgICAgICAgICAvLyBBZGQgc29tZSB2YWx1ZXMgdG8gc3VtCisgICAgICAgICAgICAgICAgd3MxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiKDIqMikvMiI7CisgICAgICAgICAgICAgICAgd3MxLkNlbGxzWyJBMiJdLlZhbHVlID0gNDsKKyAgICAgICAgICAgICAgICB3czEuQ2VsbHNbIkEzIl0uVmFsdWUgPSA2OworICAgICAgICAgICAgICAgIHdzMS5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIlNVTShBMTpBMykiOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhbGwgZm9ybXVsYXMgb24gIHRoZSB3b3Jrc2hlZXQKKyAgICAgICAgICAgICAgICB3czEuQ2FsY3VsYXRlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBQcmludCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTVU0oQTE6QTMpIGV2YWx1YXRlZCB0byB7MH0iLCB3czEuQ2VsbHNbIkE0Il0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgLy8gQWRkIGFub3RoZXIgd29ya3NoZWV0CisgICAgICAgICAgICAgICAgdmFyIHdzMiA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIndzMiIpOworICAgICAgICAgICAgICAgIHdzMi5DZWxsc1siQTEiXS5WYWx1ZSA9IDM7CisgICAgICAgICAgICAgICAgd3MyLkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VNKEExLHdzMSFBNCkiOworCisgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGFsbCBmb3JtdWxhcyBpbiB0aGUgZW50aXJlIHdvcmtib29rCisgICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKKworICAgICAgICAgICAgICAgIC8vIFByaW50IHRoZSBjYWxjdWxhdGVkIHZhbHVlCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNVTShBMSx3czEhQTQpIGV2YWx1YXRlZCB0byB7MH0iLCB3czIuQ2VsbHNbIkEyIl0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGEgcmFuZ2UKKyAgICAgICAgICAgICAgICB3czEuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJJRihUT0RBWSgpPERBVEUoMjAxNCw2LDEpLFwiQkVGT1JFXCIgJlwiIEZJUlNUXCIsQ09OQ0FURU5BVEUoXCJGSVJTVFwiLFwiIE9GXCIsXCIgSlVORSAyMDE0IE9SIExBVEVSXCIpKSI7CisgICAgICAgICAgICAgICAgd3MxLkNlbGxzWyJCMSJdLkNhbGN1bGF0ZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFByaW50IHRoZSBjYWxjdWxhdGVkIHZhbHVlCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIklGKFRPREFZKCk8REFURSgyMDE0LDYsMSksXCJCRUZPUkVcIiAmXCIgRklSU1RcIixDT05DQVRFTkFURShcIkZJUlNUXCIsXCIgT0ZcIixcIiBKVU5FIDIwMTQgT1IgTEFURVJcIikpIGV2YWx1YXRlZCB0byB7MH0iLCB3czEuQ2VsbHNbIkIxIl0uVmFsdWUpOworCisgICAgICAgICAgICAgICAgLy8gRXZhbHVhdGUgYSBmb3JtdWxhIHN0cmluZyAod2l0aG91dCBjYWxjdWxhdGUgZGVwZW5kaW5nIGNlbGxzKS4KKyAgICAgICAgICAgICAgICAvLyBUaGF0IG1lYW5zIHRoYXQgaWYgQTEgY29udGFpbnMgYSBmb3JtdWxhIHRoYXQgaGFzbid0IGJlZW4gY2FsY3VsYXRlZCBpdCB0YWtlIHRoZSB2YWx1ZSBmcm9tIGExLCBibGFuayBvciB6ZXJvIGlmIGl0J3MgYSBuZXcgZm9ybXVsYS4KKyAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgQTEgaGFzIGJlZW4gY2FsY3VsYXRlZCAoMiksIHNvIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIG9rIQorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyBmb3JtdWxhID0gIigyKzQpKndzMSFBMSI7CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhY2thZ2UuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuUGFyc2UoZm9ybXVsYSk7CisKKyAgICAgICAgICAgICAgICAvLyBQcmludCB0aGUgY2FsY3VsYXRlZCB2YWx1ZQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIoMis0KSp3czEhQTIgZXZhbHVhdGVkIHRvIHswfSIsIHJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAvLyBFdmFsdWF0ZSBhIGZvcm11bGEgc3RyaW5nIChDYWxjdWxhdGUgZGVwZW5kaW5nIGNlbGxzKQorICAgICAgICAgICAgICAgIC8vIEExIHdpbGwgYmUgcmVjYWxjdWxhdGVkLgorICAgICAgICAgICAgICAgIHZhciByZXN1bHQyID0gd3MxLkNhbGN1bGF0ZSgiKDIrNCkqQTEiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGVfTWFpbi5jcyBiL1NhbXBsZUFwcC9TYW1wbGVfTWFpbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzNlYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1NhbXBsZV9NYWluLmNzCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCisgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorICoKKyAqCisgKiAKKyAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCisgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisgKiAKKyAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKKyAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCisgKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgorICogCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCisgKgorICoKKyAqIENvZGUgY2hhbmdlIG5vdGVzOgorICogCisgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEphbiBL5GxsbWFuCQlBZGRlZAkJMTAtU0VQLTIwMDkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgT2ZmaWNlT3BlblhtbDsKKworbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKK3sKKwljbGFzcyBTYW1wbGVfTWFpbgorCXsKKwkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorCQl7CisJCQl0cnkKKwkJCXsKKyAgICAgICAgICAgICAgICAvL1NhbXBsZSAzLCA0IGFuZCAxMiB1c2VzIHRoZSBBZHZlbnR1cmV3b3JrcyBkYXRhYmFzZS4gRW50ZXIgdGhlbiBuYW1lIG9mIHlvdXIgU1FMIHNlcnZlciBpbnRvIHRoZSB2YXJpYWJsZSBiZWxvdy4uLgorICAgICAgICAgICAgICAgIC8vTGVhdmUgdGhpcyBibGFuayBpZiB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIEFkdmVudHVyZXdvcmtzIGRhdGFiYXNlIAorICAgICAgICAgICAgICAgIHN0cmluZyBTcWxTZXJ2ZXJOYW1lID0gIiI7CisKKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhpcyBsaW5lIHRvIGNvbnRhaW4gdGhlIHBhdGggdG8gdGhlIG91dHB1dCBmb2xkZXIKKyAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIG91dHB1dERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKEAiYzpcdGVtcFxTYW1wbGVBcHAiKTsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERpci5FeGlzdHMpIHRocm93IG5ldyBFeGNlcHRpb24oIm91dHB1dERpciBkb2VzIG5vdCBleGlzdCEiKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbXBsZSAxIC0gc2ltcGx5IGNyZWF0ZXMgYSBuZXcgd29ya2Jvb2sgZnJvbSBzY3JhdGNoCisgICAgICAgICAgICAgICAgLy8gY29udGFpbmluZyBhIHdvcmtzaGVldCB0aGF0IGFkZHMgYSBmZXcgbnVtYmVycyB0b2dldGhlciAKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMSIpOworICAgICAgICAgICAgICAgIHN0cmluZyBvdXRwdXQgPSBTYW1wbGUxLlJ1blNhbXBsZTEob3V0cHV0RGlyKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDEgY3JlYXRlZDogezB9Iiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy8gU2FtcGxlIDIgLSBzaW1wbHkgcmVhZHMgc29tZSB2YWx1ZXMgZnJvbSB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgc2FtcGxlIDEKKyAgICAgICAgICAgICAgICAvLyBhbmQgb3V0cHV0cyB0aGVtIHRvIHRoZSBjb25zb2xlCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDIiKTsKKyAgICAgICAgICAgICAgICBTYW1wbGUyLlJ1blNhbXBsZTIob3V0cHV0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIG91dHB1dCA9ICIiOworCisgICAgICAgICAgICAgICAgaWYgKFNxbFNlcnZlck5hbWUgIT0gIiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29ubmVjdGlvblN0ciA9IHN0cmluZy5Gb3JtYXQoQCJzZXJ2ZXI9ezB9O2RhdGFiYXNlPUFkdmVudHVyZVdvcmtzO0ludGVncmF0ZWQgU2VjdXJpdHk9dHJ1ZTsiLCBTcWxTZXJ2ZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlIDMgLSBjcmVhdGVzIGEgd29ya2Jvb2sgZnJvbSBzY3JhdGNoIAorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIHNhbXBsZSBhcyB0aGUgb3JpZ2luYWwgRXhjZWxwYWNrYWdlLCBzYW1wbGUgNCwgYnV0IHdpdGhvdXQgdGhlIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2FtcGxlIHJlcXVpcmVzIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZS4gIAorICAgICAgICAgICAgICAgICAgICAvL1Nob3dzIGhvdyB0byB1c2UgUmFuZ2VzLCBTdHlsaW5nLCBOYW1lZHN0eWxlcyBhbmQgSHlwZXJsaW5rcworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMyIpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGUzLlJ1blNhbXBsZTMob3V0cHV0RGlyLCBjb25uZWN0aW9uU3RyKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAzIGNyZWF0ZWQ6IHswfSIsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlIDQgLSBjcmVhdGVzIGEgd29ya2Jvb2sgYmFzZWQgb24gYSB0ZW1wbGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGVzIGEgcmFuZ2Ugd2l0aCBkYXRhIGFuZCBzZXQgdGhlIHNlcmllcyBvZiBhIGxpbmVjaGFydC4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzYW1wbGUgcmVxdWlyZXMgdGhlIEFkdmVudHVyZVdvcmtzIGRhdGFiYXNlLiAgCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA0Iik7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTQuUnVuU2FtcGxlNChjb25uZWN0aW9uU3RyLCBuZXcgRmlsZUluZm8oIi4uXFwuLlxcR3JhcGhUZW1wbGF0ZS54bHN4IiksIG91dHB1dERpcik7ICAgICAgLy9UZW1wbGF0ZSBwYXRoIGZyb20gL2Jpbi9kZWJ1ZyBvciAvYmluL3JlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA0IGNyZWF0ZWQ6IHswfSIsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgNQorICAgICAgICAgICAgICAgIC8vT3BlbiBzYW1wbGUgMSBhbmQgYWRkIGEgcGllIGNoYXJ0LgorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA1Iik7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlNS5SdW5TYW1wbGU1KG91dHB1dERpcik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA1IGNyZWF0ZWQ6Iiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgNgorICAgICAgICAgICAgICAgIC8vQ3JlYXRlcyBhbiBhZHZhbmNlZCByZXBvcnQgb24gYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0uCisgICAgICAgICAgICAgICAgLy9QYXJhbWV0ZXIgMiBpcyB0aGUgZGlyZWN0b3J5IHRvIHJlcG9ydC4gUGFyYW10ZXIgMyBpcyBob3cgZGVlcCB0aGUgc2NhbiB3aWxsIGdvLiBQYXJhbWV0ZXIgNCBTa2lwcyBJY29ucyBpZiBzZXQgdG8gdHJ1ZSAoVGhlIGljb24gaGFuZGxpbmcgaXMgc2xvdykKKyAgICAgICAgICAgICAgICAvL1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBvdXRsaW5lcywgdGFibGVzLGNvbW1lbnRzLCBzaGFwZXMsIHBpY3R1cmVzIGFuZCBjaGFydHMuICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA2Iik7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlNi5SdW5TYW1wbGU2KG91dHB1dERpciwgbmV3IERpcmVjdG9yeUluZm8oIi4uXFwuLiIpLCA1LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA2IGNyZWF0ZWQ6Iiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgNworICAgICAgICAgICAgICAgIC8vVGhpcyBzYW1wbGUgc2hvd3MgdGhlIHBlcmZvcm1hbmNlIGNhcGFiaWxpdGllcyBvZiB0aGUgY29tcG9uZW50IGFuZCBzaG93cyBzaGVldCBwcm90ZWN0aW9uLgorICAgICAgICAgICAgICAgIC8vTG9hZCBYKHBhcmFtIDIpIHJvd3Mgd2l0aCBmaXZlIGNvbHVtbnMKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgNyIpOworICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTcuUnVuU2FtcGxlNyhvdXRwdXREaXIsIDY1NTM0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDcgY3JlYXRlZDoiLCBvdXRwdXQpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAvL1NhbXBsZSA4IC0gTGlucQorICAgICAgICAgICAgICAgIC8vT3BlbnMgU2FtcGxlIDcgYW5kIHBlcmZvcm0gc29tZSBMaW5xIHF1ZXJpZXMKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgOC1MaW5xIik7CisgICAgICAgICAgICAgICAgTGlucVNhbXBsZS5SdW5MaW5xU2FtcGxlKG91dHB1dERpcik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworICAgICAgICAgICAgICAgIC8vU2FtcGxlIDkgTG9hZHMgdHdvIGNzdiBmaWxlcyBpbnRvIHRhYmxlcyBhbmQgY3JlYXRlcyBhbiBhcmVhIGNoYXJ0IGFuZCBhIENvbHVtbi9MaW5lIGNoYXJ0IG9uIHRoZSBkYXRhLgorICAgICAgICAgICAgICAgIC8vVGhpcyBzYW1wbGUgYWxzbyBzaG93cyBob3cgdG8gdXNlIGEgc2Vjb25kYXJ5IGF4aXMuCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDkiKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGU5LlJ1blNhbXBsZTkob3V0cHV0RGlyKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDkgY3JlYXRlZDogezB9Iiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgMTAgU3dlZGlzaCBRdWl6IDogU2hvd3MgRW5jcnlwdGlvbiBhbmQgd29ya2Jvb2sgYW5kIHNoZWV0IHByb3RlY3Rpb24uCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDEwIik7CisgICAgICAgICAgICAgICAgU2FtcGxlMTAuUnVuU2FtcGxlMTAob3V0cHV0RGlyKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDEwIGNyZWF0ZWQ6IHswfSIsIG91dHB1dERpci5GdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworICAgICAgICAgICAgICAgIC8vU2FtcGxlIDExIC0gRGF0YSB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDExIik7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlMTEuUnVuU2FtcGxlMTEob3V0cHV0RGlyKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDExIGNyZWF0ZWQgezB9Iiwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgMTIgLSBQaXZvdHRhYmxlcworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxMiIpOworICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTEyLlJ1blNhbXBsZTEyKFNxbFNlcnZlck5hbWUsIG91dHB1dERpcik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxMiBjcmVhdGVkIHswfSIsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKworICAgICAgICAgICAgICAgIC8vU2FtcGxlIDEzIC0gU2hvd3MgYSBmZXcgd2F5cyB0byBsb2FkIGRhdGEgKERhdGF0YWJsZSwgSUVudW1lcmFibGUgYW5kIG1vcmUpLgorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxMyIpOworICAgICAgICAgICAgICAgIFNhbXBsZTEzLlJ1blNhbXBsZTEzKG91dHB1dERpcik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxMyBjcmVhdGVkIHswfSIsIG91dHB1dERpci5OYW1lKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgMTQgLSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDE0Iik7CisgICAgICAgICAgICAgICAgU2FtcGxlMTQuUnVuU2FtcGxlMTQob3V0cHV0RGlyKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDE0IGNyZWF0ZWQgezB9Iiwgb3V0cHV0RGlyLk5hbWUpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAvL1NhbXBsZSAxNSAtIFNob3dzIGhvdyB0byB3b3JrIHdpdGggbWFjcm8tZW5hYmxlZCB3b3JrYm9va3MoVkJBKS4KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMTUtVkJBIik7CisgICAgICAgICAgICAgICAgU2FtcGxlMTUuVkJBU2FtcGxlKG91dHB1dERpcik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxNSBjcmVhdGVkIHswfSIsIG91dHB1dERpci5OYW1lKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgRm9ybXVsYUNhbGMgLSBTaG93cyBob3cgdG8gY2FsY3VsYXRlIGZvcm11bGFzIGluIHRoZSB3b3JrYm9vay4KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBTYW1wbGVfRm9ybXVsYUNhbGMiKTsKKyAgICAgICAgICAgICAgICBTYW1wbGVfRm9ybXVsYUNhbGMuUnVuU2FtcGxlRm9ybXVsYUNhbGMoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworCisgICAgICAgICAgICAgICAgLy9TYW1wbGUgQWRkRm9ybXVsYUZ1bmN0aW9uIC0gU2hvd3MgaG93IHRvIGFkZCB5b3VyIG93biBpbXBsZW1lbnRhdGlvbnMgb2YgZXhjZWwgZnVuY3Rpb25zIHRvIEVQUGx1cy4KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBTYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uIik7CisgICAgICAgICAgICAgICAgU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbi5SdW5TYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgIH0KKwkJCWNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yOiB7MH0iLCBleC5NZXNzYWdlKTsKKwkJCX0KKwkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CisJCQlDb25zb2xlLldyaXRlTGluZSgiUHJlc3MgdGhlIHJldHVybiBrZXkgdG8gZXhpdC4uLiIpOworCQkJQ29uc29sZS5SZWFkKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvVkJBLUNvZGUvQmF0dGxlc2hpcFNoZWV0LnR4dCBiL1NhbXBsZUFwcC9WQkEtQ29kZS9CYXR0bGVzaGlwU2hlZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWFjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvVkJBLUNvZGUvQmF0dGxlc2hpcFNoZWV0LnR4dApAQCAtMCwwICsxLDQyIEBACivvu79Qcml2YXRlIFN1YiBXb3Jrc2hlZXRfQmVmb3JlRG91YmxlQ2xpY2soQnlWYWwgVGFyZ2V0IEFzIFJhbmdlLCBDYW5jZWwgQXMgQm9vbGVhbikKKyAgIERpbSBzaGVldCBBcyBXb3Jrc2hlZXQKKyAgIElmIGdfZ2FtZUVuZGVkID0gVHJ1ZSBUaGVuCisgICAgRXhpdCBTdWIKKyAgIEVuZCBJZgorICAgCisgICBTZXQgc2hlZXQgPSBUaGlzV29ya2Jvb2suQWN0aXZlU2hlZXQKKyAgIElmIGdfU2hpcHMgSXMgTm90aGluZyBUaGVuIENvZGUuQWRkU2hpcHMgQmF0dGxlc2hpcC5SYW5nZShib2FyZDEpCisgICBJZiBDb2xsaWRlKFRhcmdldCwgQmF0dGxlc2hpcC5SYW5nZShib2FyZDEpKSBUaGVuCisgICAgSWYgVGFyZ2V0LkJvcmRlcnMoeGxEaWFnb25hbFVwKS5XZWlnaHQgPD4geGxNZWRpdW0gVGhlbgorICAgICAgICAgU2V0SGl0IFRhcmdldAorICAgICAgICAgRGltIFNoaXAKKyAgICAgICAgIERpbSBpc0hpdCBBcyBCb29sZWFuCisgICAgICAgICBpc0hpdCA9IEZhbHNlCisgICAgICAgICBGb3IgRWFjaCBTaGlwIEluIGdfU2hpcHMKKyAgICAgICAgICAgIElmIFNoaXAuaXNIaXQoVGFyZ2V0LkNlbGxzKDEsIDEpLCBUcnVlKSBUaGVuCisgICAgICAgICAgICAgICAgSWYgQ2hlY2tXaW5uZXIoZ19TaGlwcykgVGhlbgorICAgICAgICAgICAgICAgICAgICBNc2dCb3ggIllvdSB3aW4hIiwgdmJPS09ubHkgKyB2YkV4Y2xhbWF0aW9uLCAiQmF0dGxlc2hpcHMiCisgICAgICAgICAgICAgICAgICAgIGdfZ2FtZUVuZGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBDYW5jZWwgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIEV4aXQgU3ViCisgICAgICAgICAgICAgICAgRW5kIElmCisgICAgICAgICAgICAgICAgaXNIaXQgPSBUcnVlCisgICAgICAgICAgICAgICAgRXhpdCBGb3IKKyAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAgTmV4dAorICAgICAgICAgSWYgaXNIaXQgPSBGYWxzZSBUaGVuCisgICAgICAgICAgICBVbnByb3RlY3QKKyAgICAgICAgICAgIEJhdHRsZXNoaXAuQ2VsbHMoZ19sb2dSb3csIDIpLnZhbHVlID0gIllvdSBnZXQgYSBtaXNzIG9uICIgJiBUYXJnZXQuQWRkcmVzcworICAgICAgICAgICAgQmF0dGxlc2hpcC5OYW1lcygiUGxheWVyTWlzc2VzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSA9IEJhdHRsZXNoaXAuTmFtZXMoIlBsYXllck1pc3NlcyIpLlJlZmVyc1RvUmFuZ2UudmFsdWUgKyAxCisJCQlnX2xvZ1JvdyA9IGdfbG9nUm93ICsgMQorICAgICAgICAgICAgUHJvdGVjdCAiIgorICAgICAgICAgRW5kIElmCisgICAgICAgICBDb21wdXRlclBsYXkuTW92ZQorICAgICAgICAgCisgICAgRW5kIElmCisgICBFbmQgSWYKKyAgIENhbmNlbCA9IFRydWUKK0VuZCBTdWIKK1ByaXZhdGUgU3ViIFdvcmtzaGVldF9TZWxlY3Rpb25DaGFuZ2UoQnlWYWwgVGFyZ2V0IEFzIFJhbmdlKQorICAgIFRhcmdldC5DZWxscygxLCAxKS5TZWxlY3QKK0VuZCBTdWIKZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9WQkEtQ29kZS9Db2RlTW9kdWxlLnR4dCBiL1NhbXBsZUFwcC9WQkEtQ29kZS9Db2RlTW9kdWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRkZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1ZCQS1Db2RlL0NvZGVNb2R1bGUudHh0CkBAIC0wLDAgKzEsMTU0IEBACivvu79QdWJsaWMgQ29uc3QgYm9hcmQxID0gIns1fSIKK1B1YmxpYyBDb25zdCBib2FyZDIgPSAiezZ9IgorCitQdWJsaWMgQ29uc3QgdXNlclNoaXAxID0gInswfSIKK1B1YmxpYyBDb25zdCB1c2VyU2hpcDIgPSAiezF9IgorUHVibGljIENvbnN0IHVzZXJTaGlwMyA9ICJ7Mn0iCitQdWJsaWMgQ29uc3QgdXNlclNoaXA0ID0gInszfSIKK1B1YmxpYyBDb25zdCB1c2VyU2hpcDUgPSAiezR9IgorCitHbG9iYWwgZ19sb2dSb3cgQXMgSW50ZWdlcgorR2xvYmFsIGdfZ2FtZUVuZGVkIEFzIEJvb2xlYW4KK0dsb2JhbCBnX1NoaXBzIEFzIENvbGxlY3Rpb24KK0dsb2JhbCBnX3VzZXJTaGlwcyBBcyBDb2xsZWN0aW9uCitQdWJsaWMgRnVuY3Rpb24gQ29sbGlkZShyMSBBcyBSYW5nZSwgcjIgQXMgUmFuZ2UpIEFzIEJvb2xlYW4KK0lmIHIxLnJvdyArIHIxLlJvd3MuQ291bnQgPiByMi5yb3cgQW5kIHIxLnJvdyA8IHIyLnJvdyArIHIyLlJvd3MuQ291bnQgQW5kIF8KKyAgICAgIHIxLmNvbHVtbiArIHIxLkNvbHVtbnMuQ291bnQgPiByMi5jb2x1bW4gQW5kIHIxLmNvbHVtbiA8IHIyLmNvbHVtbiArIHIyLkNvbHVtbnMuQ291bnQgVGhlbgorICAgICAgQ29sbGlkZSA9IFRydWUKK0Vsc2UKKyAgICBDb2xsaWRlID0gRmFsc2UKK0VuZCBJZgorRW5kIEZ1bmN0aW9uCitQdWJsaWMgU3ViIEFkZFNoaXBzKGJvYXJkIEFzIFJhbmdlKQorICAgIFNldCBnX1NoaXBzID0gTmV3IENvbGxlY3Rpb24KKyAgICAKKyAgICBEaW0gczEgQXMgTmV3IFNoaXAKKyAgICAKKyAgICBzMS5TaXplID0gNQorICAgIFNldCBzMS5Qb3NpdGlvbiA9IEdldFNoaXBQb3MoYm9hcmQsIHMxLlNpemUpCisgICAgZ19TaGlwcy5BZGQgczEsICJjYXJyaWVyIgorICAgIAorICAgIERpbSBzMiBBcyBOZXcgU2hpcAorICAgIHMyLlNpemUgPSA0CisgICAgU2V0IHMyLlBvc2l0aW9uID0gR2V0U2hpcFBvcyhib2FyZCwgczIuU2l6ZSkKKyAgICBnX1NoaXBzLkFkZCBzMiwgImJhdHRsZXNoaXAiCisKKyAgICBEaW0gczMgQXMgTmV3IFNoaXAKKyAgICBzMy5TaXplID0gMworICAgIFNldCBzMy5Qb3NpdGlvbiA9IEdldFNoaXBQb3MoYm9hcmQsIHMzLlNpemUpCisgICAgZ19TaGlwcy5BZGQgczMsICJzdWIiCisKKyAgICBEaW0gczQgQXMgTmV3IFNoaXAKKyAgICBzNC5TaXplID0gMworICAgIFNldCBzNC5Qb3NpdGlvbiA9IEdldFNoaXBQb3MoYm9hcmQsIHM0LlNpemUpCisgICAgZ19TaGlwcy5BZGQgczQsICJjcnVpc2VyIgorCisgICAgRGltIHM1IEFzIE5ldyBTaGlwCisgICAgczUuU2l6ZSA9IDIKKyAgICBTZXQgczUuUG9zaXRpb24gPSBHZXRTaGlwUG9zKGJvYXJkLCBzNS5TaXplKQorICAgIGdfU2hpcHMuQWRkIHM1LCAiZGVzdHJveWVyIgorRW5kIFN1YgorUHVibGljIFN1YiBBZGRVc2VyU2hpcHMoYm9hcmQgQXMgUmFuZ2UpCisgICAgU2V0IGdfdXNlclNoaXBzID0gTmV3IENvbGxlY3Rpb24KKyAgICAKKyAgICBEaW0gczEgQXMgTmV3IFNoaXAKKyAgICAKKyAgICBzMS5TaXplID0gNQorICAgIFNldCBzMS5Qb3NpdGlvbiA9IEJhdHRsZXNoaXAuUmFuZ2UodXNlclNoaXAxKQorICAgIGdfdXNlclNoaXBzLkFkZCBzMSwgImNhcnJpZXIiCisgICAgCisgICAgRGltIHMyIEFzIE5ldyBTaGlwCisgICAgczIuU2l6ZSA9IDQKKyAgICBTZXQgczIuUG9zaXRpb24gPSBCYXR0bGVzaGlwLlJhbmdlKHVzZXJTaGlwMikKKyAgICBnX3VzZXJTaGlwcy5BZGQgczIsICJiYXR0bGVzaGlwIgorCisgICAgRGltIHMzIEFzIE5ldyBTaGlwCisgICAgczMuU2l6ZSA9IDMKKyAgICBTZXQgczMuUG9zaXRpb24gPSBCYXR0bGVzaGlwLlJhbmdlKHVzZXJTaGlwMykKKyAgICBnX3VzZXJTaGlwcy5BZGQgczMsICJzdWIiCisKKyAgICBEaW0gczQgQXMgTmV3IFNoaXAKKyAgICBzNC5TaXplID0gMworICAgIFNldCBzNC5Qb3NpdGlvbiA9IEJhdHRsZXNoaXAuUmFuZ2UodXNlclNoaXA0KQorICAgIGdfdXNlclNoaXBzLkFkZCBzNCwgImNydWlzZXIiCisKKyAgICBEaW0gczUgQXMgTmV3IFNoaXAKKyAgICBzNS5TaXplID0gMgorICAgIFNldCBzNS5Qb3NpdGlvbiA9IEJhdHRsZXNoaXAuUmFuZ2UodXNlclNoaXA1KQorICAgIGdfdXNlclNoaXBzLkFkZCBzNSwgImRlc3Ryb3llciIKK0VuZCBTdWIKK1B1YmxpYyBGdW5jdGlvbiBHZXRTaGlwUG9zKGJvYXJkIEFzIFJhbmdlLCBCeVZhbCBTaXplIEFzIEludGVnZXIpIEFzIFJhbmdlCisgICAgRGltIHJvdyBBcyBJbnRlZ2VyLCBjb2x1bW4gQXMgSW50ZWdlcgorICAgIERpbSBIb3Jpem9udGFsIEFzIEludGVnZXIKKyAgICAKKyAgICBEbworICAgICAgICBSYW5kb21pemUKKyAgICAgICAgcm93ID0gKFJuZCAqIChib2FyZC5Sb3dzLkNvdW50IC0gMSkpICsgMQorICAgICAgICBjb2x1bW4gPSAoUm5kICogKGJvYXJkLlJvd3MuQ291bnQgLSAxKSkgKyAxCisgICAgICAgIEhvcml6b250YWwgPSBSbmQKKyAgICAKKyAgICAgICAgSWYgSG9yaXpvbnRhbCA9IDEgVGhlbgorICAgICAgICAgICAgSWYgY29sdW1uIC0gU2l6ZSA+IDAgQW5kIGNvbHVtbiArIFNpemUgPCAxMCBUaGVuCisgICAgICAgICAgICAgICAgSWYgUm5kID0gMCBUaGVuCisgICAgICAgICAgICAgICAgICAgICAgICBTZXQgR2V0U2hpcFBvcyA9IGJvYXJkLlJhbmdlKENlbGxzKHJvdywgY29sdW1uKSwgQ2VsbHMocm93LCBjb2x1bW4gKyBTaXplIC0gMSkpCisgICAgICAgICAgICAgICAgRWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU2V0IEdldFNoaXBQb3MgPSBib2FyZC5SYW5nZShDZWxscyhyb3csIGNvbHVtbiAtIFNpemUgKyAxKSwgQ2VsbHMocm93LCBjb2x1bW4pKQorICAgICAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAgICAgRWxzZUlmIGNvbHVtbiAtIFNpemUgPiAwIFRoZW4KKyAgICAgICAgICAgICAgICBTZXQgR2V0U2hpcFBvcyA9IGJvYXJkLlJhbmdlKENlbGxzKHJvdywgY29sdW1uIC0gU2l6ZSArIDEpLCBDZWxscyhyb3csIGNvbHVtbikpCisgICAgICAgICAgICBFbHNlCisgICAgICAgICAgICAgICAgU2V0IEdldFNoaXBQb3MgPSBib2FyZC5SYW5nZShDZWxscyhyb3csIGNvbHVtbiksIENlbGxzKHJvdywgY29sdW1uICsgU2l6ZSAtIDEpKQorICAgICAgICAgICAgRW5kIElmCisgICAgICAgIEVsc2UKKyAgICAgICAgICAgIElmIHJvdyAtIFNpemUgPiAwIEFuZCByb3cgKyBTaXplIDwgMTAgVGhlbgorICAgICAgICAgICAgICAgIElmIFJuZCA9IDAgVGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgU2V0IEdldFNoaXBQb3MgPSBib2FyZC5SYW5nZShDZWxscyhyb3csIGNvbHVtbiksIENlbGxzKHJvdyArIFNpemUgLSAxLCBjb2x1bW4pKQorICAgICAgICAgICAgICAgIEVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldCBHZXRTaGlwUG9zID0gYm9hcmQuUmFuZ2UoQ2VsbHMocm93IC0gU2l6ZSArIDEsIGNvbHVtbiksIENlbGxzKHJvdywgY29sdW1uKSkKKyAgICAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgICAgIEVsc2VJZiByb3cgLSBTaXplID4gMCBUaGVuCisgICAgICAgICAgICAgICAgU2V0IEdldFNoaXBQb3MgPSBib2FyZC5SYW5nZShDZWxscyhyb3cgLSBTaXplICsgMSwgY29sdW1uKSwgQ2VsbHMocm93LCBjb2x1bW4pKQorICAgICAgICAgICAgRWxzZQorICAgICAgICAgICAgICAgIFNldCBHZXRTaGlwUG9zID0gYm9hcmQuUmFuZ2UoQ2VsbHMocm93LCBjb2x1bW4pLCBDZWxscyhyb3cgKyBTaXplIC0gMSwgY29sdW1uKSkKKyAgICAgICAgICAgIEVuZCBJZgorICAgICAgICBFbmQgSWYKKyAgICBMb29wIFVudGlsIFZhbGlkU3BvdChHZXRTaGlwUG9zKQorRW5kIEZ1bmN0aW9uCisnTWFrZSBzdXJlIHRoZSBzcG90IGlzbid0IG9jY3VwaWVkCitQcml2YXRlIEZ1bmN0aW9uIFZhbGlkU3BvdChyIEFzIFJhbmdlKSBBcyBCb29sZWFuCisgICAgRGltIG9TaGlwIEFzIFNoaXAKKyAgICBGb3IgRWFjaCBvU2hpcCBJbiBnX1NoaXBzCisgICAgICAgIElmIENvZGUuQ29sbGlkZShyLCBvU2hpcC5Qb3NpdGlvbikgVGhlbgorICAgICAgICAgICAgVmFsaWRTcG90ID0gRmFsc2UKKyAgICAgICAgICAgIEV4aXQgRnVuY3Rpb24KKyAgICAgICAgRW5kIElmCisgICAgTmV4dAorICAgIFZhbGlkU3BvdCA9IFRydWUKK0VuZCBGdW5jdGlvbgorCitQdWJsaWMgU3ViIFNldEhpdChUYXJnZXQgQXMgUmFuZ2UpCisgICAgVGFyZ2V0LldvcmtzaGVldC5VbnByb3RlY3QKKyAgICBXaXRoIFRhcmdldC5Cb3JkZXJzKHhsRGlhZ29uYWxEb3duKQorICAgICAuTGluZVN0eWxlID0geGxDb250aW51b3VzCisgICAgIC5Db2xvciA9IENvbG9yQ29uc3RhbnRzLnZiQmxhY2sKKyAgICAgLlRpbnRBbmRTaGFkZSA9IDAKKyAgICAgLldlaWdodCA9IHhsTWVkaXVtCisgICAgRW5kIFdpdGgKKyAgICBXaXRoIFRhcmdldC5Cb3JkZXJzKHhsRGlhZ29uYWxVcCkKKyAgICAgLkxpbmVTdHlsZSA9IHhsQ29udGludW91cworICAgICAuQ29sb3IgPSBDb2xvckNvbnN0YW50cy52YkJsYWNrCisgICAgIC5UaW50QW5kU2hhZGUgPSAwCisgICAgIC5XZWlnaHQgPSB4bE1lZGl1bQorICAgIEVuZCBXaXRoCisgICAgVGFyZ2V0LldvcmtzaGVldC5Qcm90ZWN0ICIiCitFbmQgU3ViCitQdWJsaWMgRnVuY3Rpb24gQ2hlY2tXaW5uZXIoc2hpcHMgQXMgQ29sbGVjdGlvbikgQXMgQm9vbGVhbgorICAgIERpbSBvU2hpcCBBcyBTaGlwCisgICAgRm9yIEVhY2ggb1NoaXAgSW4gc2hpcHMKKyAgICAgICAgSWYgb1NoaXAuSGl0cy5Db3VudCA8IG9TaGlwLlBvc2l0aW9uLkNlbGxzLkNvdW50IFRoZW4KKyAgICAgICAgICAgIENoZWNrV2lubmVyID0gRmFsc2UKKyAgICAgICAgICAgIEV4aXQgRnVuY3Rpb24KKyAgICAgICAgRW5kIElmCisgICAgTmV4dAorICAgIENoZWNrV2lubmVyID0gVHJ1ZQorRW5kIEZ1bmN0aW9uCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvVkJBLUNvZGUvQ29tcHV0ZXJQbGF5TW9kdWxlLnR4dCBiL1NhbXBsZUFwcC9WQkEtQ29kZS9Db21wdXRlclBsYXlNb2R1bGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWZlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvVkJBLUNvZGUvQ29tcHV0ZXJQbGF5TW9kdWxlLnR4dApAQCAtMCwwICsxLDEyOCBAQAor77u/RGltIHBvc3NpYmxlQ2VsbHMgQXMgQ29sbGVjdGlvbgorRGltIEhpdHMgQXMgUmFuZ2UKK1B1YmxpYyBTdWIgSW5pdCgpCisgICAgRGltIGIgQXMgUmFuZ2UKKyAgICBEaW0gY29sIEFzIEludGVnZXIsIHJvdyBBcyBJbnRlZ2VyCisgICAgICAgIAorICAgIFNldCBwb3NzaWJsZUNlbGxzID0gTmV3IENvbGxlY3Rpb24KKyAgICBTZXQgYiA9IEJhdHRsZXNoaXAuUmFuZ2UoYm9hcmQyKQorICAgIEZvciBjb2wgPSAxIFRvIGIuQ29sdW1ucy5Db3VudAorICAgICAgICBGb3Igcm93ID0gMSBUbyBiLlJvd3MuQ291bnQKKyAgICAgICAgICAgIHBvc3NpYmxlQ2VsbHMuQWRkIChiLkNlbGxzKHJvdywgY29sKS5BZGRyZXNzKQorICAgICAgICBOZXh0CisgICAgTmV4dAorRW5kIFN1YgorUHVibGljIFN1YiBNb3ZlKCkKKyAgICBEaW0gaW5kZXggQXMgSW50ZWdlcgorICAgIGluZGV4ID0gLTEKKyAgICBEaW0gb1NoaXAgQXMgU2hpcAorICAgIERpbSBpc0hpdCBBcyBCb29sZWFuCisgICAgRm9yIEVhY2ggb1NoaXAgSW4gZ191c2VyU2hpcHMKKyAgICAgICAgSWYgb1NoaXAuSGl0cy5Db3VudCA+IDAgQW5kIG9TaGlwLkhpdHMuQ291bnQgPCBvU2hpcC5Qb3NpdGlvbi5DZWxscy5Db3VudCBUaGVuCisgICAgICAgICAgICBpbmRleCA9IEdldEhpdChvU2hpcCkKKyAgICAgICAgICAgIEV4aXQgRm9yCisgICAgICAgIEVuZCBJZgorICAgIE5leHQKKyAgICAKKyAgICBJZiBpbmRleCA8IDAgVGhlbgorICAgICAgICBpbmRleCA9IChSbmQgKiAocG9zc2libGVDZWxscy5Db3VudCAtIDEpKSArIDEKKyAgICBFbmQgSWYKKyAgICBEaW0gY2VsbCBBcyBSYW5nZQorICAgIFNldCBjZWxsID0gQmF0dGxlc2hpcC5SYW5nZShwb3NzaWJsZUNlbGxzKGluZGV4KSkKKyAgICBpc0hpdCA9IEZhbHNlCisgICAgU2V0SGl0IGNlbGwKKyAgICBGb3IgRWFjaCBvU2hpcCBJbiBnX3VzZXJTaGlwcworICAgICAgICBJZiBvU2hpcC5pc0hpdChjZWxsLCBGYWxzZSkgVGhlbgorICAgICAgICAgICAgSWYgQ2hlY2tXaW5uZXIoZ191c2VyU2hpcHMpIFRoZW4KKyAgICAgICAgICAgICAgICBTZXRTaGlwc1Zpc2libGUKKyAgICAgICAgICAgICAgICBNc2dCb3ggIkNvbXB1dGVyIHdpbnMhIgorICAgICAgICAgICAgICAgIEV4aXQgU3ViCisgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgICAgIGlzSGl0ID0gVHJ1ZQorICAgICAgICAgICAgRXhpdCBGb3IKKyAgICAgICAgRW5kIElmCisgICAgTmV4dAorCisgICAgSWYgSXNIaXQgPSBGYWxzZSBUaGVuCisgICAgICAgIEJhdHRsZXNoaXAuVW5wcm90ZWN0CisgICAgICAgIEJhdHRsZXNoaXAuQ2VsbHMoZ19sb2dSb3csIDIpLnZhbHVlID0gIlRoZSBDb21wdXRlciBnZXRzIGEgbWlzcyBvbiAiICYgY2VsbC5BZGRyZXNzCisgICAgICAgIEJhdHRsZXNoaXAuTmFtZXMoIkNvbXB1dGVyTWlzc2VzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSA9IEJhdHRsZXNoaXAuTmFtZXMoIkNvbXB1dGVyTWlzc2VzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSArIDEKKyAgICAgICAgZ19sb2dSb3cgPSBnX2xvZ1JvdyArIDEKKwkJQmF0dGxlc2hpcC5Qcm90ZWN0ICIiCisgICAgRW5kIElmCisgICAgcG9zc2libGVDZWxscy5SZW1vdmUgaW5kZXgKK0VuZCBTdWIKKworUHJpdmF0ZSBTdWIgU2V0U2hpcHNWaXNpYmxlKCkKKyAgICBCYXR0bGVzaGlwLlVucHJvdGVjdAorICAgIERpbSBvU2hpcCBBcyBTaGlwCisgICAgRm9yIEVhY2ggb1NoaXAgSW4gZ19TaGlwcworICAgICAgICBEaW0gY2VsbCBBcyBSYW5nZQorICAgICAgICBGb3IgRWFjaCBjZWxsIEluIG9TaGlwLlBvc2l0aW9uLkNlbGxzCisgICAgICAgICAgICBJZiBjZWxsLkludGVyaW9yLkNvbG9yIDw+IENvbG9yQ29uc3RhbnRzLnZiUmVkIFRoZW4KKyAgICAgICAgICAgICAgICBjZWxsLkludGVyaW9yLkNvbG9yID0gQ29sb3JDb25zdGFudHMudmJCbGFjaworICAgICAgICAgICAgRW5kIElmCisgICAgICAgIE5leHQKKyAgICBOZXh0CisgICAgQmF0dGxlc2hpcC5Qcm90ZWN0ICIiCitFbmQgU3ViCitQcml2YXRlIEZ1bmN0aW9uIEdldEhpdChvU2hpcCBBcyBTaGlwKSBBcyBJbnRlZ2VyCisgICAgRGltIGlzSG9yaXpvbnRhbCBBcyBCb29sZWFuCisgICAgSWYgb1NoaXAuSGl0cy5Db3VudCA9IDEgVGhlbgorICAgICAgICBpc0hvcml6b250YWwgPSBJbnQoKFJuZCAqIDIpKSA9IDEKKyAgICBFbHNlCisgICAgICAgIElmIG9TaGlwLkhpdHMoMSkucm93ID0gb1NoaXAuSGl0cygyKS5yb3cgVGhlbgorICAgICAgICAgICAgaXNIb3Jpem9udGFsID0gVHJ1ZQorICAgICAgICBFbHNlCisgICAgICAgICAgICBpc0hvcml6b250YWwgPSBGYWxzZQorICAgICAgICBFbmQgSWYKKyAgICBFbmQgSWYKKyAgICAKKyAgICBEaW0gaW5kZXggQXMgSW50ZWdlcgorICAgIGluZGV4ID0gLTEKKyAgICBXaGlsZSBpbmRleCA9IC0xCisgICAgICAgIElmIGlzSG9yaXpvbnRhbCBUaGVuCisgICAgICAgICAgICBGb3IgRWFjaCBIaXQgSW4gb1NoaXAuSGl0cworICAgICAgICAgICAgICAgIGluZGV4ID0gRmluZFBvc3NpYmxlKEhpdC5PZmZzZXQoMCwgLTEpKQorICAgICAgICAgICAgICAgIElmIGluZGV4ID0gLTEgVGhlbgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEZpbmRQb3NzaWJsZShIaXQuT2Zmc2V0KDAsIDEpKQorICAgICAgICAgICAgICAgICAgICBJZiBpbmRleCA8PiAtMSBUaGVuCisgICAgICAgICAgICAgICAgICAgICAgICBFeGl0IEZvcgorICAgICAgICAgICAgICAgICAgICBFbmQgSWYKKyAgICAgICAgICAgICAgICBFbHNlCisgICAgICAgICAgICAgICAgICAgIEV4aXQgRm9yCisgICAgICAgICAgICAgICAgRW5kIElmCisgICAgICAgICAgICBOZXh0CisgICAgICAgICAgICBJZiBpbmRleCA9IC0xIFRoZW4KKyAgICAgICAgICAgICAgICBpc0hvcml6b250YWwgPSBGYWxzZQorICAgICAgICAgICAgRW5kIElmCisgICAgICAgIEVsc2UKKyAgICAgICAgICAgIEZvciBFYWNoIEhpdCBJbiBvU2hpcC5IaXRzCisgICAgICAgICAgICAgICAgaW5kZXggPSBGaW5kUG9zc2libGUoSGl0Lk9mZnNldCgtMSwgMCkpCisgICAgICAgICAgICAgICAgSWYgaW5kZXggPSAtMSBUaGVuCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gRmluZFBvc3NpYmxlKEhpdC5PZmZzZXQoMSwgMCkpCisgICAgICAgICAgICAgICAgICAgIElmIGluZGV4ID4gLTEgVGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgRXhpdCBGb3IKKyAgICAgICAgICAgICAgICAgICAgRW5kIElmCisgICAgICAgICAgICAgICAgRWxzZQorICAgICAgICAgICAgICAgICAgICBFeGl0IEZvcgorICAgICAgICAgICAgICAgIEVuZCBJZgorICAgICAgICAgICAgTmV4dAorICAgICAgICAgICAgSWYgaW5kZXggPSAtMSBUaGVuCisgICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsID0gVHJ1ZQorICAgICAgICAgICAgRW5kIElmCisgICAgICAgIEVuZCBJZgorICAgIFdlbmQKKyAgICBHZXRIaXQgPSBpbmRleAorRW5kIEZ1bmN0aW9uCitQcml2YXRlIEZ1bmN0aW9uIEZpbmRQb3NzaWJsZShyIEFzIFJhbmdlKQorRGltIGluZGV4IEFzIEludGVnZXIKK0RpbSBjZWxsIEFzIFJhbmdlCitGb3IgaW5kZXggPSAxIFRvIHBvc3NpYmxlQ2VsbHMuQ291bnQKKyAgICBJZiBwb3NzaWJsZUNlbGxzKGluZGV4KSA9IHIuQWRkcmVzcyBUaGVuCisgICAgICAgIEZpbmRQb3NzaWJsZSA9IGluZGV4CisgICAgICAgIEV4aXQgRnVuY3Rpb24KKyAgICBFbmQgSWYKK05leHQKK0ZpbmRQb3NzaWJsZSA9IC0xCitFbmQgRnVuY3Rpb24KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9WQkEtQ29kZS9TaGlwQ2xhc3MudHh0IGIvU2FtcGxlQXBwL1ZCQS1Db2RlL1NoaXBDbGFzcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxMTQ0NgotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9WQkEtQ29kZS9TaGlwQ2xhc3MudHh0CkBAIC0wLDAgKzEsNTUgQEAKK++7v0RpbSByUG9zaXRpb24gQXMgUmFuZ2UKK1B1YmxpYyBIaXRDb3VudCBBcyBJbnRlZ2VyCitEaW0gb1NpemUgQXMgSW50ZWdlcgorRGltIG1faGl0cyBBcyBDb2xsZWN0aW9uCisKK1B1YmxpYyBQcm9wZXJ0eSBHZXQgUG9zaXRpb24oKSBBcyBSYW5nZQorICAgIFNldCBQb3NpdGlvbiA9IHJQb3NpdGlvbgorRW5kIFByb3BlcnR5CitQdWJsaWMgUHJvcGVydHkgU2V0IFBvc2l0aW9uKEJ5VmFsIHZhbHVlIEFzIFJhbmdlKQorICAgIFNldCByUG9zaXRpb24gPSB2YWx1ZQorRW5kIFByb3BlcnR5CisKK1B1YmxpYyBGdW5jdGlvbiBJc0hpdChjZWxsIEFzIFJhbmdlLCBpc1BsYXllciBBcyBCb29sZWFuKSBBcyBCb29sZWFuCitBdHRyaWJ1dGUgSXNIaXQuVkJfRGVzY3JpcHRpb24gPSAiQ2hlY2tzIGlmIHRoZSBjdXJyZW50IG1vdmUgaXMgYSBoaXQiCitBdHRyaWJ1dGUgSXNIaXQuVkJfSGVscElEID0gMQorJ1NhbXBsZSBvZiBhdHRyaWJ1dGUgdXNlIG9uIGZ1bmN0aW9uIGxldmVsIChzaG93IHVwIGluIHRoZSBvYmplY3Ricm93c2VyKEYyKSAtLT4gTWV0aG9kIC0tPiBQcm9wZXJ0aWVzCisgICBJZiBDb2RlLkNvbGxpZGUoY2VsbCwgUG9zaXRpb24pIFRoZW4KKyAgICAgICAgY2VsbC5Xb3Jrc2hlZXQuVW5wcm90ZWN0CisgICAgICAgIGNlbGwuSW50ZXJpb3IuQ29sb3IgPSB2YlJlZAorICAgICAgICBpc0hpdCA9IFRydWUKKyAgICAgICAgSGl0cy5BZGQgY2VsbAorICAgICAgICBJZiBIaXRzLkNvdW50ID0gU2l6ZSBUaGVuCisgICAgICAgICAgICBQb3NpdGlvbi5Cb3JkZXJBcm91bmQgV2VpZ2h0Oj14bE1lZGl1bQorICAgICAgICBFbmQgSWYKKyAgICAgICAgCisgICAgICAgIElmIGlzUGxheWVyIFRoZW4KKyAgICAgICAgICAgIEJhdHRsZXNoaXAuQ2VsbHMoZ19sb2dSb3csIDIpLnZhbHVlID0gIllvdSBnZXQgYSBoaXQgb24gIiAmIGNlbGwuQWRkcmVzcyAmICIhIgorICAgICAgICAgICAgQmF0dGxlc2hpcC5OYW1lcygiUGxheWVySGl0cyIpLlJlZmVyc1RvUmFuZ2UudmFsdWUgPSBCYXR0bGVzaGlwLk5hbWVzKCJQbGF5ZXJIaXRzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSArIDEKKyAgICAgICAgRWxzZQorICAgICAgICAgICAgQmF0dGxlc2hpcC5DZWxscyhnX2xvZ1JvdywgMikudmFsdWUgPSAiVGhlIENvbXB1dGVyIGdldHMgYSBoaXQgb24gIiAmIGNlbGwuQWRkcmVzcworICAgICAgICAgICAgQmF0dGxlc2hpcC5OYW1lcygiQ29tcHV0ZXJIaXRzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSA9IEJhdHRsZXNoaXAuTmFtZXMoIkNvbXB1dGVySGl0cyIpLlJlZmVyc1RvUmFuZ2UudmFsdWUgKyAxCisgICAgICAgIEVuZCBJZgorICAgICAgICBnX2xvZ1JvdyA9IGdfbG9nUm93ICsgMQorICAgICAgICBjZWxsLldvcmtzaGVldC5Qcm90ZWN0ICIiCisgICAgICAgIGlzSGl0ID0gVHJ1ZQorICAgRWxzZQorICAgICAgICBpc0hpdCA9IEZhbHNlCisgICBFbmQgSWYKK0VuZCBGdW5jdGlvbgorUHVibGljIFByb3BlcnR5IEdldCBIaXRzKCkgQXMgQ29sbGVjdGlvbgorICAgIFNldCBIaXRzID0gbV9oaXRzCitFbmQgUHJvcGVydHkKK1B1YmxpYyBQcm9wZXJ0eSBTZXQgSGl0cyhCeVZhbCB2YWx1ZSBBcyBDb2xsZWN0aW9uKQorICAgIFNldCBtX2hpdHMgPSB2YWx1ZQorRW5kIFByb3BlcnR5CitQcml2YXRlIFN1YiBDbGFzc19Jbml0aWFsaXplKCkKKyAgICBIaXRDb3VudCA9IDAKKyAgICBTZXQgSGl0cyA9IE5ldyBDb2xsZWN0aW9uCitFbmQgU3ViCitQdWJsaWMgUHJvcGVydHkgR2V0IFNpemUoKSBBcyBJbnRlZ2VyCitTaXplID0gb1NpemUKK0VuZCBQcm9wZXJ0eQorUHVibGljIFByb3BlcnR5IExldCBTaXplKEJ5VmFsIHZOZXdWYWx1ZSBBcyBJbnRlZ2VyKQorb1NpemUgPSB2TmV3VmFsdWUKK0VuZCBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1ZCQS1Db2RlL1RoaXNXb3JrYm9vay50eHQgYi9TYW1wbGVBcHAvVkJBLUNvZGUvVGhpc1dvcmtib29rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FjOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL1ZCQS1Db2RlL1RoaXNXb3JrYm9vay50eHQKQEAgLTAsMCArMSw3IEBACivvu79Qcml2YXRlIFN1YiBXb3JrYm9va19PcGVuKCkKKyAgICBDb2RlLkFkZFNoaXBzIEJhdHRsZXNoaXAuUmFuZ2UoYm9hcmQxKQorICAgIENvZGUuQWRkVXNlclNoaXBzIEJhdHRsZXNoaXAuUmFuZ2UoYm9hcmQyKQorICAgIENvbXB1dGVyUGxheS5Jbml0CisJZ19nYW1lRW5kZWQ9ZmFsc2UKKwlnX2xvZ1JvdyA9IEJhdHRsZXNoaXAuTmFtZXMoIkxvZ1N0YXJ0IikuUmVmZXJzVG9SYW5nZS5yb3crMQorRW5kIFN1YgpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL2FwcC5jb25maWcgYi9TYW1wbGVBcHAvYXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFkYmUwCi0tLSAvZGV2L251bGwKKysrIGIvU2FtcGxlQXBwL2FwcC5jb25maWcKQEAgLTAsMCArMSwzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxjb25maWd1cmF0aW9uPgorPHN0YXJ0dXA+PHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjIuMC41MDcyNyIgc2t1PSJDbGllbnQiLz48L3N0YXJ0dXA+PC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL2Nzdi9TYW1wbGU5LTEudHh0IGIvU2FtcGxlQXBwL2Nzdi9TYW1wbGU5LTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjEzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9TYW1wbGVBcHAvY3N2L1NhbXBsZTktMS50eHQKQEAgLTAsMCArMSwxNiBAQAor77u/VGhpcyBmaWxlIGlzIHVzZWQgaW4gc2FtcGxlIDkKK1NhbGVzIHBlciByZWdpb24KKyJQZXJpb2QiLCJFdXJvcGUiLCJBZnJpY2EiLCJBc2lhIiwiTm9ydGggQW1lcmljYSIsIlNvdXRoIEFtZXJpY2EiLCJBdXN0cmFpbGEiCisyMDEwLTAxLDEyLjMsOCw1NS4xLDM1LDE0LjEsMTIuMQorMjAxMC0wMiwxMy45LDkuMSw1MS4xLDM1LjMsMTQuNCwxMS4xCisyMDEwLTAzLDExLjQsOC43LDU0LjcsMzIuMSwxMy4xLDEyLjMKKzIwMTAtMDQsMTIuMSw5LjIsNTMuMywzNSwxMS4yLDEwLjQKKzIwMTAtMDUsOS40LDEwLDQ1LjMsMjUuOCwxMi40LDEzLjEKKzIwMTAtMDYsMTQuMyw5LjgsNDkuNCwyOS4yLDE0LjEsMTQuMgorMjAxMC0wNyw3LjMsMTEsNTAuMCwzMS4yLDE0LjksMTIuMworMjAxMC0wOCwxOS4zLDEwLjEsNDkuNiwzNSwxMy4zLDEwLjEKKzIwMTAtMDksMjEuMCw4LjUsNDEuMSwzNSwxNC41LDkuMworMjAxMC0xMCwyMy44LDkuMSw0NSwzMiwxNi4xLDExLjEKKzIwMTAtMTEsMjUuNiwxMC44LDQ5LDMzLjYsMTQuNCwxMy40CisyMDEwLTEyLDE3LjIsMTIuMSw0My4yLDM1LjEsMTUuMSwxNS4xCitFT0YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvY3N2L1NhbXBsZTktMi50eHQgYi9TYW1wbGVBcHAvY3N2L1NhbXBsZTktMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NTY2MAotLS0gL2Rldi9udWxsCisrKyBiL1NhbXBsZUFwcC9jc3YvU2FtcGxlOS0yLnR4dApAQCAtMCwwICsxLDcgQEAKK++7v1RoaXMgZmlsZSBpcyB1c2VkIGluIHNhbXBsZSA5CitJRAlQcm9kdWN0CUl0ZW1zIEluIFN0b2NrCVB1cmNoYXNlIFByaWNlCVByaWNlCisxMjAwMQlOYWlscwkzNwkxLDMJMyw5OQorMTIwMDIJSGFtbWVyCTUJNSwzMwkxMiwxMAorMTIwMDMJU2F3CTEyCTgsOTkJMTUsMzcKKzEyMDEwCURyaWxsCTIwCTQsMwk4LDAwCisxMjAxMQlDcm93YmFyCTcJMTMsNzcJMjMsNDgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==